* Copyright (C) 2000 Lars Knoll (knoll@kde.org)
* (C) 2000 Antti Koivisto (koivisto@kde.org)
* (C) 2000 Dirk Mueller (mueller@kde.org)
* Copyright (C) 2003, 2006, 2007, 2010, 2011 Apple Inc. All rights reserved.
* Copyright (C) 2008 Holger Hans Peter Freyther
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_FONT_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_FONT_H_
#include "cc/paint/node_id.h"
#include "third_party/blink/renderer/platform/fonts/font_description.h"
#include "third_party/blink/renderer/platform/fonts/font_fallback_iterator.h"
#include "third_party/blink/renderer/platform/fonts/font_fallback_list.h"
#include "third_party/blink/renderer/platform/fonts/font_fallback_priority.h"
#include "third_party/blink/renderer/platform/fonts/simple_font_data.h"
#include "third_party/blink/renderer/platform/geometry/layout_unit.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/text/tab_size.h"
#include "third_party/blink/renderer/platform/text/text_direction.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h"
#include "third_party/blink/renderer/platform/wtf/text/character_names.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_uchar.h"
#undef DrawText
namespace gfx {
class PointF;
class RectF;
}
namespace cc {
class PaintCanvas;
class PaintFlags;
}
namespace blink {
class FontSelector;
class ShapeCache;
struct TextFragmentPaintInfo;
class PLATFORM_EXPORT Font : public GarbageCollected<Font> {
public:
Font();
explicit Font(const FontDescription&);
Font(const FontDescription&, FontSelector*);
Font(const Font&) = default;
Font(Font&&) = default;
Font& operator=(const Font&) = default;
Font& operator=(Font&&) = default;
void Trace(Visitor* visitor) const { visitor->Trace(font_fallback_list_); }
bool operator==(const Font& other) const;
const FontDescription& GetFontDescription() const {
return font_description_;
}
enum class DrawType { kGlyphsOnly, kGlyphsAndClusters };
enum CustomFontNotReadyAction {
kDoNotPaintIfFontNotReady,
kUseFallbackIfFontNotReady
};
void DrawText(cc::PaintCanvas*,
const TextFragmentPaintInfo&,
const gfx::PointF&,
cc::NodeId node_id,
const cc::PaintFlags&,
DrawType = DrawType::kGlyphsOnly) const;
void DrawEmphasisMarks(cc::PaintCanvas*,
const TextFragmentPaintInfo&,
const AtomicString& mark,
const gfx::PointF&,
const cc::PaintFlags&) const;
gfx::RectF TextInkBounds(const TextFragmentPaintInfo&) const;
struct TextIntercept {
float begin_, end_;
};
void GetTextIntercepts(const TextFragmentPaintInfo&,
const cc::PaintFlags&,
const std::tuple<float, float>& bounds,
Vector<TextIntercept>&) const;
float SpaceWidth() const {
DCHECK(PrimaryFont());
return (PrimaryFont() ? PrimaryFont()->SpaceWidth() : 0) +
GetFontDescription().LetterSpacing();
}
float TabWidth(const SimpleFontData*, const TabSize&) const;
float TabWidth(const SimpleFontData*, const TabSize&, float position) const;
float TabWidth(const TabSize& tab_size, float position) const {
return TabWidth(PrimaryFont(), tab_size, position);
}
LayoutUnit TabWidth(const TabSize&, LayoutUnit position) const;
int EmphasisMarkAscent(const AtomicString&) const;
int EmphasisMarkDescent(const AtomicString&) const;
int EmphasisMarkHeight(const AtomicString&) const;
float TextAutoSpaceInlineSize() const;
const SimpleFontData* PrimaryFont() const;
const SimpleFontData* PrimaryFontWithDigitZero() const;
const SimpleFontData* PrimaryFontWithCjkWater() const;
const SimpleFontData* PrimaryFontForTabSize() const;
base::span<const FontFeatureRange> GetFontFeatures() const;
bool HasNonInitialFontFeatures() const;
NGShapeCache& GetNGShapeCache() const;
ShapeCache* GetShapeCache() const;
bool CanShapeWordByWord() const;
void SetCanShapeWordByWordForTesting(bool b) {
EnsureFontFallbackList()->SetCanShapeWordByWordForTesting(b);
}
void NullifyPrimaryFontForTesting() {
EnsureFontFallbackList()->NullifyPrimarySimpleFontDataForTesting();
}
void NullifyForTesting() { font_fallback_list_ = nullptr; }
void ReportNotDefGlyph() const;
private:
enum ForTextEmphasisOrNot { kNotForTextEmphasis, kForTextEmphasis };
GlyphData GetEmphasisMarkGlyphData(const AtomicString&) const;
std::pair<float, bool> TabWidthInternal(const SimpleFontData* font_data,
const TabSize& tab_size) const;
public:
FontSelector* GetFontSelector() const;
FontFallbackIterator CreateFontFallbackIterator(
FontFallbackPriority fallback_priority) const {
EnsureFontFallbackList();
return FontFallbackIterator(font_description_, font_fallback_list_,
fallback_priority);
}
void WillUseFontData(const String& text) const;
bool IsFallbackValid() const;
bool ShouldSkipDrawing() const {
if (!font_fallback_list_)
return false;
return EnsureFontFallbackList()->ShouldSkipDrawing();
}
bool HasCustomFont() const {
if (!font_fallback_list_)
return false;
return EnsureFontFallbackList()->HasCustomFont();
}
FontFallbackList* EnsureFontFallbackList() const;
private:
FontDescription font_description_;
mutable Member<FontFallbackList> font_fallback_list_;
};
inline const SimpleFontData* Font::PrimaryFont() const {
return EnsureFontFallbackList()->PrimarySimpleFontDataWithSpace(
font_description_);
}
inline const SimpleFontData* Font::PrimaryFontWithDigitZero() const {
return EnsureFontFallbackList()->PrimarySimpleFontDataWithDigitZero(
font_description_);
}
inline const SimpleFontData* Font::PrimaryFontWithCjkWater() const {
return EnsureFontFallbackList()->PrimarySimpleFontDataWithCjkWater(
font_description_);
}
inline const SimpleFontData* Font::PrimaryFontForTabSize() const {
return EnsureFontFallbackList()->PrimarySimpleFontDataForTabSize(
font_description_);
}
inline FontSelector* Font::GetFontSelector() const {
return font_fallback_list_ ? font_fallback_list_->GetFontSelector() : nullptr;
}
inline float Font::TabWidth(const SimpleFontData* font_data,
const TabSize& tab_size) const {
auto [base_tab_width, is_successed] = TabWidthInternal(font_data, tab_size);
return base_tab_width;
}
}
#endif