mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This CL merges the following CLs from Blink to implement SkTextBlobs: https://codereview.chromium.org/554613004 https://codereview.chromium.org/645363003 https://codereview.chromium.org/667573008 https://codereview.chromium.org/672713002 https://codereview.chromium.org/778233002 https://codereview.chromium.org/820093005 https://codereview.chromium.org/856613002 R=esprehn@chromium.org Review URL: https://codereview.chromium.org/859203002
224 lines
8.1 KiB
C++
224 lines
8.1 KiB
C++
/*
|
|
* 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 SKY_ENGINE_PLATFORM_FONTS_FONT_H_
|
|
#define SKY_ENGINE_PLATFORM_FONTS_FONT_H_
|
|
|
|
#include "sky/engine/platform/PlatformExport.h"
|
|
#include "sky/engine/platform/fonts/FontDescription.h"
|
|
#include "sky/engine/platform/fonts/FontFallbackList.h"
|
|
#include "sky/engine/platform/fonts/SimpleFontData.h"
|
|
#include "sky/engine/platform/fonts/TextBlob.h"
|
|
#include "sky/engine/platform/text/TextDirection.h"
|
|
#include "sky/engine/platform/text/TextPath.h"
|
|
#include "sky/engine/wtf/HashMap.h"
|
|
#include "sky/engine/wtf/HashSet.h"
|
|
#include "sky/engine/wtf/MathExtras.h"
|
|
#include "sky/engine/wtf/unicode/CharacterNames.h"
|
|
|
|
// "X11/X.h" defines Complex to 0 and conflicts
|
|
// with Complex value in CodePath enum.
|
|
#ifdef Complex
|
|
#undef Complex
|
|
#endif
|
|
|
|
class SkTextBlob;
|
|
struct SkPoint;
|
|
|
|
namespace blink {
|
|
|
|
class FloatPoint;
|
|
class FloatRect;
|
|
class FontData;
|
|
class FontMetrics;
|
|
class FontSelector;
|
|
class GlyphBuffer;
|
|
class GraphicsContext;
|
|
class TextRun;
|
|
struct TextRunPaintInfo;
|
|
|
|
struct GlyphData;
|
|
|
|
struct GlyphOverflow {
|
|
GlyphOverflow()
|
|
: left(0)
|
|
, right(0)
|
|
, top(0)
|
|
, bottom(0)
|
|
, computeBounds(false)
|
|
{
|
|
}
|
|
|
|
bool isZero() const
|
|
{
|
|
return !left && !right && !top && !bottom;
|
|
}
|
|
|
|
int left;
|
|
int right;
|
|
int top;
|
|
int bottom;
|
|
bool computeBounds;
|
|
};
|
|
|
|
|
|
class PLATFORM_EXPORT Font {
|
|
public:
|
|
Font();
|
|
Font(const FontDescription&);
|
|
~Font();
|
|
|
|
Font(const Font&);
|
|
Font& operator=(const Font&);
|
|
|
|
bool operator==(const Font& other) const;
|
|
bool operator!=(const Font& other) const { return !(*this == other); }
|
|
|
|
const FontDescription& fontDescription() const { return m_fontDescription; }
|
|
|
|
void update(PassRefPtr<FontSelector>) const;
|
|
|
|
enum CustomFontNotReadyAction { DoNotPaintIfFontNotReady, UseFallbackIfFontNotReady };
|
|
void drawText(GraphicsContext*, const TextRunPaintInfo&, const FloatPoint&) const;
|
|
float drawUncachedText(GraphicsContext*, const TextRunPaintInfo&, const FloatPoint&, CustomFontNotReadyAction) const;
|
|
void drawEmphasisMarks(GraphicsContext*, const TextRunPaintInfo&, const AtomicString& mark, const FloatPoint&) const;
|
|
|
|
float width(const TextRun&, HashSet<const SimpleFontData*>* fallbackFonts = 0, GlyphOverflow* = 0) const;
|
|
float width(const TextRun&, int& charsConsumed, Glyph& glyphId) const;
|
|
|
|
int offsetForPosition(const TextRun&, float position, bool includePartialGlyphs) const;
|
|
FloatRect selectionRectForText(const TextRun&, const FloatPoint&, int h, int from = 0, int to = -1, bool accountForGlyphBounds = false) const;
|
|
|
|
bool isFixedPitch() const;
|
|
|
|
// Metrics that we query the FontFallbackList for.
|
|
const FontMetrics& fontMetrics() const { return primaryFont()->fontMetrics(); }
|
|
float spaceWidth() const { return primaryFont()->spaceWidth() + fontDescription().letterSpacing(); }
|
|
float tabWidth(const SimpleFontData&, unsigned tabSize, float position) const;
|
|
float tabWidth(unsigned tabSize, float position) const { return tabWidth(*primaryFont(), tabSize, position); }
|
|
|
|
int emphasisMarkAscent(const AtomicString&) const;
|
|
int emphasisMarkDescent(const AtomicString&) const;
|
|
int emphasisMarkHeight(const AtomicString&) const;
|
|
|
|
const SimpleFontData* primaryFont() const;
|
|
const FontData* fontDataAt(unsigned) const;
|
|
inline GlyphData glyphDataForCharacter(UChar32 c, bool mirror, FontDataVariant variant = AutoVariant) const
|
|
{
|
|
return glyphDataAndPageForCharacter(c, mirror, variant).first;
|
|
}
|
|
std::pair<GlyphData, GlyphPage*> glyphDataAndPageForCharacter(UChar32, bool mirror, FontDataVariant = AutoVariant) const;
|
|
bool primaryFontHasGlyphForCharacter(UChar32) const;
|
|
|
|
CodePath codePath(const TextRun&) const;
|
|
|
|
private:
|
|
enum ForTextEmphasisOrNot { NotForTextEmphasis, ForTextEmphasis };
|
|
|
|
// Returns the initial in-stream advance.
|
|
float buildGlyphBuffer(const TextRunPaintInfo&, GlyphBuffer&, ForTextEmphasisOrNot = NotForTextEmphasis) const;
|
|
PassTextBlobPtr buildTextBlob(const GlyphBuffer&, float initialAdvance, const FloatRect& bounds) const;
|
|
void drawGlyphs(GraphicsContext*, const SimpleFontData*, const GlyphBuffer&, unsigned from, unsigned numGlyphs, const FloatPoint&, const FloatRect& textRect) const;
|
|
void drawTextBlob(GraphicsContext*, const SkTextBlob*, const SkPoint& origin) const;
|
|
float drawGlyphBuffer(GraphicsContext*, const TextRunPaintInfo&, const GlyphBuffer&, const FloatPoint&) const;
|
|
void drawEmphasisMarks(GraphicsContext*, const TextRunPaintInfo&, const GlyphBuffer&, const AtomicString&, const FloatPoint&) const;
|
|
float floatWidthForSimpleText(const TextRun&, HashSet<const SimpleFontData*>* fallbackFonts = 0, IntRectExtent* glyphBounds = 0) const;
|
|
int offsetForPositionForSimpleText(const TextRun&, float position, bool includePartialGlyphs) const;
|
|
FloatRect selectionRectForSimpleText(const TextRun&, const FloatPoint&, int h, int from, int to, bool accountForGlyphBounds) const;
|
|
|
|
bool getEmphasisMarkGlyphData(const AtomicString&, GlyphData&) const;
|
|
|
|
float floatWidthForComplexText(const TextRun&, HashSet<const SimpleFontData*>* fallbackFonts, IntRectExtent* glyphBounds) const;
|
|
int offsetForPositionForComplexText(const TextRun&, float position, bool includePartialGlyphs) const;
|
|
FloatRect selectionRectForComplexText(const TextRun&, const FloatPoint&, int h, int from, int to) const;
|
|
|
|
friend struct WidthIterator;
|
|
|
|
public:
|
|
// Useful for debugging the different font rendering code paths.
|
|
static void setCodePath(CodePath);
|
|
static CodePath codePath();
|
|
static CodePath s_codePath;
|
|
|
|
FontSelector* fontSelector() const;
|
|
|
|
FontFallbackList* fontList() const { return m_fontFallbackList.get(); }
|
|
|
|
void willUseFontData(UChar32) const;
|
|
|
|
static FloatRect pixelSnappedSelectionRect(float fromX, float toX, float y, float height);
|
|
private:
|
|
bool loadingCustomFonts() const
|
|
{
|
|
return m_fontFallbackList && m_fontFallbackList->loadingCustomFonts();
|
|
}
|
|
|
|
bool shouldSkipDrawing() const
|
|
{
|
|
return m_fontFallbackList && m_fontFallbackList->shouldSkipDrawing();
|
|
}
|
|
|
|
FontDescription m_fontDescription;
|
|
mutable RefPtr<FontFallbackList> m_fontFallbackList;
|
|
};
|
|
|
|
inline Font::~Font()
|
|
{
|
|
}
|
|
|
|
inline const SimpleFontData* Font::primaryFont() const
|
|
{
|
|
ASSERT(m_fontFallbackList);
|
|
return m_fontFallbackList->primarySimpleFontData(m_fontDescription);
|
|
}
|
|
|
|
inline const FontData* Font::fontDataAt(unsigned index) const
|
|
{
|
|
ASSERT(m_fontFallbackList);
|
|
return m_fontFallbackList->fontDataAt(m_fontDescription, index);
|
|
}
|
|
|
|
inline bool Font::isFixedPitch() const
|
|
{
|
|
ASSERT(m_fontFallbackList);
|
|
return m_fontFallbackList->isFixedPitch(m_fontDescription);
|
|
}
|
|
|
|
inline FontSelector* Font::fontSelector() const
|
|
{
|
|
return m_fontFallbackList ? m_fontFallbackList->fontSelector() : 0;
|
|
}
|
|
|
|
inline float Font::tabWidth(const SimpleFontData& fontData, unsigned tabSize, float position) const
|
|
{
|
|
if (!tabSize)
|
|
return fontDescription().letterSpacing();
|
|
float tabWidth = tabSize * fontData.spaceWidth() + fontDescription().letterSpacing();
|
|
return tabWidth - fmodf(position, tabWidth);
|
|
}
|
|
|
|
} // namespace blink
|
|
|
|
#endif // SKY_ENGINE_PLATFORM_FONTS_FONT_H_
|