26d173fee7
Illustrations calling SkTextUtils::DrawString must pass font as well as paint. TBR=reed@google.com,jcgregorio@google.com Docs-Preview: https://skia.org/?cl=181562 Bug: skia: Change-Id: I907c1c69026d3dc40282545b492a790b2349a8a0 Reviewed-on: https://skia-review.googlesource.com/c/181562 Commit-Queue: Cary Clark <caryclark@skia.org> Reviewed-by: Cary Clark <caryclark@skia.org> Reviewed-by: Joe Gregorio <jcgregorio@google.com> Reviewed-by: Mike Reed <reed@google.com>
1054 lines
24 KiB
Plaintext
1054 lines
24 KiB
Plaintext
#Topic Font
|
|
#Alias Font_Reference ##
|
|
|
|
#Code
|
|
#Populate
|
|
##
|
|
|
|
#PhraseDef font_metrics
|
|
Typeface, Font_Size, Font_Scale_X,
|
|
Font_Skew_X, Font_Hinting, Paint_Anti_Alias, Font_Embolden, Font_Force_Hinting,
|
|
Font_Embedded_Bitmaps, Font_Hinting_Spacing, Font_Anti_Alias, Font_Linear,
|
|
and Font_Subpixel
|
|
##
|
|
|
|
#Subtopic Advance
|
|
# incomplete, should probably be in overview, not reference
|
|
##
|
|
#Subtopic Engine
|
|
# incomplete, should probably be in overview, not reference
|
|
##
|
|
|
|
#Subtopic Size
|
|
#Line # overall height in points ##
|
|
Font_Size adjusts the overall text size in points.
|
|
Font_Size can be set to any positive value or zero.
|
|
Font_Size defaults to 12.
|
|
Font_Size
|
|
##
|
|
|
|
#Subtopic Scale_X
|
|
#Line # text horizontal scale ##
|
|
Font_Scale_X adjusts the text horizontal scale.
|
|
Text scaling approximates condensed and expanded type faces when the actual face
|
|
is not available.
|
|
Font_Scale_X can be set to any value.
|
|
Font_Scale_X defaults to 1.
|
|
##
|
|
|
|
#Subtopic Skew_X
|
|
#Line # text horizontal slant ##
|
|
Font_Skew_X adjusts the text horizontal slant.
|
|
Text skewing approximates italic and oblique type faces when the actual face
|
|
is not available.
|
|
Font_Skew_X can be set to any value.
|
|
Font_Skew_X defaults to 0.
|
|
##
|
|
|
|
#Subtopic Embolden
|
|
#Line # approximate font styles ##
|
|
|
|
Font_Embolden approximates the bold font style accompanying a normal font when a bold font face
|
|
is not available. Skia does not provide font substitution; it is up to the client to find the
|
|
bold font face using the platform Font_Manager.
|
|
|
|
Use Font_Skew_X to approximate an italic font style when the italic font face
|
|
is not available.
|
|
|
|
A FreeType based port may define SK_USE_FREETYPE_EMBOLDEN at compile time to direct
|
|
the font engine to create the bold Glyphs. Otherwise, the extra bold is computed
|
|
by increasing the stroke width and setting the SkPaint::Style to
|
|
SkPaint::kStrokeAndFill_Style as needed.
|
|
|
|
Font_Embolden is disabled by default.
|
|
#Subtopic Embolden ##
|
|
|
|
#Subtopic Hinting_Spacing
|
|
#Line # glyph spacing affected by hinting ##
|
|
|
|
If Hinting is set to SkFontHinting::kFull, Hinting_Spacing adjusts the character
|
|
spacing by the difference of the hinted and unhinted Left_Side_Bearing and
|
|
Right_Side_Bearing. Hinting_Spacing only applies to platforms that use
|
|
FreeType as their Font_Engine.
|
|
|
|
Hinting_Spacing is not related to text kerning, where the space between
|
|
a specific pair of characters is adjusted using data in the font kerning tables.
|
|
#Subtopic Hinting_Spacing ##
|
|
|
|
#Subtopic Linear
|
|
#Line # selects text rendering as Glyph or Path ##
|
|
Font_Linear selects whether text is rendered as a Glyph or as a Path.
|
|
If Font_Linear is set, it has the same effect as setting Hinting to SkFontHinting::kNormal.
|
|
If Font_Linear is clear, it is the same as setting Hinting to SkFontHinting::kNone.
|
|
#Subtopic Linear ##
|
|
|
|
#Subtopic Subpixel
|
|
#Line # uses pixel transparency to represent fractional offset ##
|
|
#Substitute sub-pixel
|
|
Font_Subpixel uses the pixel transparency to represent a fractional offset.
|
|
As the opaqueness of the color increases, the edge of the glyph appears to move
|
|
towards the outside of the pixel.
|
|
#Subtopic Subpixel ##
|
|
|
|
#Subtopic Anti_Alias
|
|
#Line # text relying on the order of RGB stripes ##
|
|
When set, Anti_Alias positions glyphs within a pixel, using alpha and
|
|
possibly RGB striping. It can take advantage of the organization of RGB stripes
|
|
that create a color, and relies on the small size of the stripe and visual perception
|
|
to make the color fringing imperceptible.
|
|
|
|
Anti_Alias can be enabled on devices that orient stripes horizontally
|
|
or vertically, and that order the color components as RGB or BGR. Internally, the
|
|
glyph cache may store multiple copies of the same glyph with different sub-pixel
|
|
positions, requiring more memory.
|
|
#Subtopic Anti_Alias ##
|
|
|
|
#Subtopic Force_Hinting
|
|
#Line # always adjust glyph paths ##
|
|
|
|
If Hinting is set to SkFontHinting::kNormal or SkFontHinting::kFull, Force_Hinting
|
|
instructs the Font_Manager to always hint Glyphs.
|
|
Force_Hinting has no effect if Hinting is set to SkFontHinting::kNone or
|
|
SkFontHinting::kSlight.
|
|
|
|
Force_Hinting only affects platforms that use FreeType as the Font_Manager.
|
|
#Subtopic Force_Hinting ##
|
|
|
|
#Subtopic Embedded_Bitmaps
|
|
#Line # custom sized bitmap Glyphs ##
|
|
Embedded_Bitmaps allows selecting custom sized bitmap Glyphs.
|
|
Embedded_Bitmaps when set chooses an embedded bitmap glyph over an outline contained
|
|
in a font if the platform supports this option.
|
|
|
|
FreeType selects the bitmap glyph if available when Embedded_Bitmaps is set, and selects
|
|
the outline glyph if Embedded_Bitmaps is clear.
|
|
Windows may select the bitmap glyph but is not required to do so.
|
|
OS_X and iOS do not support this option.
|
|
##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Class SkFont
|
|
|
|
SkFont controls options applied when drawing and measuring text.
|
|
|
|
#Code
|
|
#Populate
|
|
##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#EnumClass Edging
|
|
|
|
#Code
|
|
#Populate
|
|
##
|
|
|
|
Whether edge pixels draw opaque or with partial transparency.
|
|
|
|
#Const kAlias 0 # incomplete; replace '0' with member value
|
|
#Line # no transparent pixels on glyph edges ##
|
|
# incomplete; add description or delete
|
|
##
|
|
#Const kAntiAlias 0 # incomplete; replace '0' with member value
|
|
#Line # may have transparent pixels on glyph edges ##
|
|
# incomplete; add description or delete
|
|
##
|
|
#Const kSubpixelAntiAlias 0 # incomplete; replace '0' with member value
|
|
#Line # glyph positioned in pixel using transparency ##
|
|
# incomplete; add description or delete
|
|
##
|
|
|
|
# incomplete; add description or delete
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#EnumClass ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkFont()
|
|
#In Constructor
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkFont(sk_sp<SkTypeface> typeface, SkScalar size)
|
|
#In Constructor
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method explicit SkFont(sk_sp<SkTypeface> typeface)
|
|
#In Constructor
|
|
#Line # incomplete ##
|
|
#Populate
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkFont(sk_sp<SkTypeface> typeface, SkScalar size, SkScalar scaleX, SkScalar skewX)
|
|
#In Constructor
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool operator==(const SkFont& font) const
|
|
#In Operator
|
|
#Line # compares fonts for equality ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool operator!=(const SkFont& font) const
|
|
#In Operator
|
|
#Line # compares fonts for inequality ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool isForceAutoHinting() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool isEmbeddedBitmaps() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool isSubpixel() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool isLinearMetrics() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool isEmbolden() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setForceAutoHinting(bool forceAutoHinting)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setEmbeddedBitmaps(bool embeddedBitmaps)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setSubpixel(bool subpixel)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setLinearMetrics(bool linearMetrics)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setEmbolden(bool embolden)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method Edging getEdging() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setEdging(Edging edging)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setHinting(SkFontHinting hintingLevel)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkFontHinting getHinting() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkFont makeWithSize(SkScalar size) const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkTypeface* getTypeface() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar getSize() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar getScaleX() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar getSkewX() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method sk_sp<SkTypeface> refTypeface() const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setTypeface(sk_sp<SkTypeface> tf)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setSize(SkScalar textSize)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setScaleX(SkScalar scaleX)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setSkewX(SkScalar skewX)
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method int textToGlyphs(const void* text, size_t byteLength, SkTextEncoding encoding,
|
|
SkGlyphID glyphs[], int maxGlyphCount) const
|
|
#In Utility
|
|
#Line # converts text into glyph indices ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 64
|
|
void draw(SkCanvas* canvas) {
|
|
SkFont font;
|
|
const uint8_t utf8[] = { 0x24, 0xC2, 0xA2, 0xE2, 0x82, 0xAC, 0xC2, 0xA5, 0xC2, 0xA3 };
|
|
std::vector<SkGlyphID> glyphs;
|
|
int count = font.textToGlyphs(utf8, sizeof(utf8), SkTextEncoding::kUTF8, nullptr, 0);
|
|
glyphs.resize(count);
|
|
(void) font.textToGlyphs(utf8, sizeof(utf8), SkTextEncoding::kUTF8, &glyphs.front(),
|
|
count);
|
|
font.setSize(32);
|
|
canvas->drawSimpleText(&glyphs.front(), glyphs.size() * sizeof(SkGlyphID),
|
|
SkTextEncoding::kGlyphID, 10, 40, font, SkPaint());
|
|
}
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method uint16_t unicharToGlyph(SkUnichar uni) const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method int countText(const void* text, size_t byteLength, SkTextEncoding encoding) const
|
|
#In Utility
|
|
#Line # returns number of Glyphs in text ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkFont font;
|
|
const uint8_t utf8[] = { 0x24, 0xC2, 0xA2, 0xE2, 0x82, 0xAC, 0xC2, 0xA5, 0xC2, 0xA3 };
|
|
SkDebugf("count = %d\n", font.countText(utf8, sizeof(utf8), SkTextEncoding::kUTF8));
|
|
|
|
#StdOut
|
|
count = 5
|
|
##
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool containsText(const void* text, size_t byteLength, SkTextEncoding encoding) const
|
|
#In Utility
|
|
#Line # returns if all text corresponds to Glyphs ##
|
|
#Populate
|
|
|
|
#NoExample
|
|
#Description
|
|
containsText succeeds for degree symbol, but cannot find a glyph index
|
|
corresponding to the Unicode surrogate code point.
|
|
##
|
|
SkFont font;
|
|
const uint16_t goodChar = 0x00B0; // degree symbol
|
|
const uint16_t badChar = 0xD800; // Unicode surrogate
|
|
SkDebugf("0x%04x %c= has char\n", goodChar,
|
|
font.containsText(&goodChar, 2, SkTextEncoding::kUTF16) ? '=' : '!');
|
|
SkDebugf("0x%04x %c= has char\n", badChar,
|
|
font.containsText(&badChar, 2, SkTextEncoding::kUTF16) ? '=' : '!');
|
|
|
|
#StdOut
|
|
0x00b0 == has char
|
|
0xd800 != has char
|
|
##
|
|
##
|
|
|
|
#Example
|
|
#Description
|
|
containsText returns true that glyph index is greater than zero, not
|
|
that it corresponds to an entry in Typeface.
|
|
##
|
|
SkFont font;
|
|
const uint16_t goodGlyph = 511;
|
|
const uint16_t zeroGlyph = 0;
|
|
const uint16_t badGlyph = 65535; // larger than glyph count in font
|
|
SkDebugf("0x%04x %c= has glyph\n", goodGlyph,
|
|
font.containsText(&goodGlyph, 2, SkTextEncoding::kGlyphID) ? '=' : '!');
|
|
SkDebugf("0x%04x %c= has glyph\n", zeroGlyph,
|
|
font.containsText(&zeroGlyph, 2, SkTextEncoding::kGlyphID) ? '=' : '!');
|
|
SkDebugf("0x%04x %c= has glyph\n", badGlyph,
|
|
font.containsText(&badGlyph, 2, SkTextEncoding::kGlyphID) ? '=' : '!');
|
|
|
|
#StdOut
|
|
0x01ff == has glyph
|
|
0x0000 != has glyph
|
|
0xffff == has glyph
|
|
##
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method size_t breakText(const void* text, size_t length, SkTextEncoding encoding, SkScalar maxWidth,
|
|
SkScalar* measuredWidth = nullptr) const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Description
|
|
Line under "Breakfast" shows desired width, shorter than available characters.
|
|
Line under "Bre" shows measured width after breaking text.
|
|
##
|
|
#Height 128
|
|
#Width 280
|
|
void draw(SkCanvas* canvas) {
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
paint.setTextSize(50);
|
|
const char str[] = "Breakfast";
|
|
const int count = sizeof(str) - 1;
|
|
canvas->drawText(str, count, 25, 50, paint);
|
|
SkScalar measuredWidth;
|
|
SkFont font;
|
|
font.setSize(50);
|
|
int partialBytes = font.breakText(str, count, kUTF8_SkTextEncoding,
|
|
100, &measuredWidth);
|
|
canvas->drawText(str, partialBytes, 25, 100, paint);
|
|
canvas->drawLine(25, 60, 25 + 100, 60, paint);
|
|
canvas->drawLine(25, 110, 25 + measuredWidth, 110, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar measureText(const void* text, size_t byteLength, SkTextEncoding encoding,
|
|
SkRect* bounds = nullptr) const
|
|
#In incomplete
|
|
#Line # returns advance width and bounds of text ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkFont font;
|
|
SkDebugf("default width = %g\n", font.measureText("!", 1, SkTextEncoding::kUTF8));
|
|
font.setSize(font.getSize() * 2);
|
|
SkDebugf("double width = %g\n", font.measureText("!", 1, SkTextEncoding::kUTF8));
|
|
|
|
#StdOut
|
|
default width = 5
|
|
double width = 10
|
|
##
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
|
|
#Method SkScalar measureText(const void* text, size_t byteLength, SkTextEncoding encoding,
|
|
SkRect* bounds, const SkPaint* paint) const
|
|
#In incomplete
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 64
|
|
void draw(SkCanvas* canvas) {
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkFont font(nullptr, 50);
|
|
const char str[] = "ay^jZ";
|
|
const int count = sizeof(str) - 1;
|
|
canvas->drawSimpleText(str, count, SkTextEncoding::kUTF8, 25, 50, font, paint);
|
|
SkRect bounds;
|
|
font.measureText(str, count, SkTextEncoding::kUTF8, &bounds, nullptr);
|
|
canvas->translate(25, 50);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawRect(bounds, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
#Method void getWidths(const uint16_t glyphs[], int count, SkScalar widths[]) const
|
|
#In incomplete
|
|
#Line # returns advance and bounds for each glyph in text ##
|
|
#Populate
|
|
#Example
|
|
// incomplete
|
|
##
|
|
#SeeAlso incomplete
|
|
#Method ##
|
|
|
|
#Method void getWidthsBounds(const uint16_t glyphs[], int count, SkScalar widths[], SkRect bounds[],
|
|
const SkPaint* paint) const
|
|
#In incomplete
|
|
#Populate
|
|
#Example
|
|
#Height 160
|
|
#Description
|
|
Bounds of Glyphs increase for stroked text, but text advance remains the same.
|
|
The underlines show the text advance, spaced to keep them distinct.
|
|
##
|
|
void draw(SkCanvas* canvas) {
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkFont font(nullptr, 50);
|
|
const char str[] = "abc";
|
|
const int bytes = sizeof(str) - 1;
|
|
int count = font.textToGlyphs(str, bytes, SkTextEncoding::kUTF8, nullptr, 0);
|
|
std::vector<SkGlyphID> glyphs;
|
|
std::vector<SkScalar> widths;
|
|
std::vector<SkRect> bounds;
|
|
glyphs.resize(count);
|
|
(void) font.textToGlyphs(str, bytes, SkTextEncoding::kUTF8, &glyphs.front(), count);
|
|
widths.resize(count);
|
|
bounds.resize(count);
|
|
for (int loop = 0; loop < 2; ++loop) {
|
|
(void) font.getWidthsBounds(&glyphs.front(), count, &widths.front(), &bounds.front(),
|
|
&paint);
|
|
SkPoint loc = { 25, 50 };
|
|
canvas->drawSimpleText(str, bytes, SkTextEncoding::kUTF8, loc.fX, loc.fY, font, paint);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
paint.setStrokeWidth(0);
|
|
SkScalar advanceY = loc.fY + 10;
|
|
for (int index = 0; index < count; ++index) {
|
|
bounds[index].offset(loc.fX, loc.fY);
|
|
canvas->drawRect(bounds[index], paint);
|
|
canvas->drawLine(loc.fX, advanceY, loc.fX + widths[index], advanceY, paint);
|
|
loc.fX += widths[index];
|
|
advanceY += 5;
|
|
}
|
|
canvas->translate(0, 80);
|
|
paint.setStrokeWidth(3);
|
|
}
|
|
}
|
|
##
|
|
#SeeAlso incomplete
|
|
#Method ##
|
|
|
|
#Method void getBounds(const uint16_t glyphs[], int count, SkRect bounds[],
|
|
const SkPaint* paint) const
|
|
#In incomplete
|
|
#Populate
|
|
#Example
|
|
// incomplete
|
|
##
|
|
#SeeAlso incomplete
|
|
#Method ##
|
|
|
|
#Method void getPos(const uint16_t glyphs[], int count, SkPoint pos[], SkPoint origin = {0, 0}) const
|
|
#In incomplete
|
|
#Populate
|
|
#Example
|
|
// incomplete
|
|
##
|
|
#SeeAlso incomplete
|
|
#Method ##
|
|
|
|
#Method void getXPos(const uint16_t glyphs[], int count, SkScalar xpos[], SkScalar origin = 0) const
|
|
#In incomplete
|
|
#Populate
|
|
#Example
|
|
// incomplete
|
|
##
|
|
#SeeAlso incomplete
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool getPath(uint16_t glyphID, SkPath* path) const
|
|
#In incomplete
|
|
#Line # returns Path equivalent to text ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Description
|
|
Text is added to Path, offset, and subtracted from Path, then added at
|
|
the offset location. The result is rendered with one draw call.
|
|
##
|
|
#Height 128
|
|
void draw(SkCanvas* canvas) {
|
|
SkPaint paint;
|
|
SkFont font(nullptr, 80);
|
|
SkPath onePath, path, path2;
|
|
const char str[] = "ABC";
|
|
const int bytes = sizeof(str) - 1;
|
|
int count = font.textToGlyphs(str, bytes, SkTextEncoding::kUTF8, nullptr, 0);
|
|
std::vector<SkGlyphID> glyphs;
|
|
glyphs.resize(count);
|
|
(void) font.textToGlyphs(str, bytes, SkTextEncoding::kUTF8, &glyphs.front(), count);
|
|
int xPos = 20;
|
|
for (auto oneGlyph : glyphs) {
|
|
font.getPath(oneGlyph, &onePath);
|
|
path.addPath(onePath, xPos, 60);
|
|
xPos += 60;
|
|
}
|
|
path.offset(20, 20, &path2);
|
|
Op(path, path2, SkPathOp::kDifference_SkPathOp, &path);
|
|
path.addPath(path2);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPath(path, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void getPaths(const uint16_t glyphIDs[], int count,
|
|
void (*glyphPathProc)(const SkPath* pathOrNull, const SkMatrix& mx, void* ctx),
|
|
void* ctx) const
|
|
#In incomplete
|
|
#Line # incomplete ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
// incomplete
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar getMetrics(SkFontMetrics* metrics) const
|
|
#In incomplete
|
|
#Line # returns Typeface metrics scaled by text size ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 128
|
|
void draw(SkCanvas* canvas) {
|
|
SkFont font(nullptr, 32);
|
|
SkScalar lineHeight = font.getMetrics(nullptr);
|
|
SkPaint paint;
|
|
canvas->drawSimpleText("line 1", 6, SkTextEncoding::kUTF8, 10, 40, font, paint);
|
|
canvas->drawSimpleText("line 2", 6, SkTextEncoding::kUTF8, 10, 40 + lineHeight, font, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar getSpacing() const
|
|
#In incomplete
|
|
#Line # returns recommended spacing between lines ##
|
|
|
|
#Populate
|
|
|
|
#Example
|
|
SkFont font;
|
|
for (SkScalar textSize : { 12, 18, 24, 32 } ) {
|
|
font.setSize(textSize);
|
|
SkDebugf("textSize: %g spacing: %g\n", textSize, font.getSpacing());
|
|
}
|
|
|
|
#StdOut
|
|
textSize: 12 spacing: 13.9688
|
|
textSize: 18 spacing: 20.9531
|
|
textSize: 24 spacing: 27.9375
|
|
textSize: 32 spacing: 37.25
|
|
##
|
|
##
|
|
|
|
#SeeAlso incomplete
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Class SkFont ##
|
|
|
|
#Topic Font ##
|