#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 SkTypeface* getTypefaceOrDefault() 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 sk_sp<SkTypeface> refTypefaceOrDefault() 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 SkGlyphID 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 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 ##
