fix bookmaker
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>
diff --git a/docs/SkFont_Reference.bmh b/docs/SkFont_Reference.bmh
index 516da21..ef89b63 100644
--- a/docs/SkFont_Reference.bmh
+++ b/docs/SkFont_Reference.bmh
@@ -203,6 +203,20 @@
# ------------------------------------------------------------------------------
+#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 ##
@@ -235,6 +249,22 @@
# ------------------------------------------------------------------------------
+#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 ##
@@ -621,13 +651,24 @@
#Method int textToGlyphs(const void* text, size_t byteLength, SkTextEncoding encoding,
SkGlyphID glyphs[], int maxGlyphCount) const
-#In incomplete
-#Line # incomplete ##
-
+#In Utility
+#Line # converts text into glyph indices ##
#Populate
#Example
-// incomplete
+ #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
@@ -653,13 +694,18 @@
# ------------------------------------------------------------------------------
#Method int countText(const void* text, size_t byteLength, SkTextEncoding encoding) const
-#In incomplete
-#Line # incomplete ##
-
+#In Utility
+#Line # returns number of Glyphs in text ##
#Populate
#Example
-// incomplete
+ 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
@@ -669,13 +715,50 @@
# ------------------------------------------------------------------------------
#Method bool containsText(const void* text, size_t byteLength, SkTextEncoding encoding) const
-#In incomplete
-#Line # incomplete ##
-
+#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
-// incomplete
+ #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
@@ -724,28 +807,172 @@
#Method SkScalar measureText(const void* text, size_t byteLength, SkTextEncoding encoding,
SkRect* bounds = nullptr) const
#In incomplete
-#Line # incomplete ##
-
+#Line # returns advance width and bounds of text ##
#Populate
#Example
-// incomplete
+ 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 # incomplete ##
-
+#Line # returns Path equivalent to text ##
#Populate
#Example
-// incomplete
+ #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
@@ -774,12 +1001,18 @@
#Method SkScalar getMetrics(SkFontMetrics* metrics) const
#In incomplete
-#Line # incomplete ##
-
+#Line # returns Typeface metrics scaled by text size ##
#Populate
#Example
-// incomplete
+ #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
@@ -790,12 +1023,23 @@
#Method SkScalar getSpacing() const
#In incomplete
-#Line # incomplete ##
+#Line # returns recommended spacing between lines ##
#Populate
#Example
-// incomplete
+ 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