diff options
-rw-r--r-- | gm/text_scale_skew.cpp | 11 | ||||
-rw-r--r-- | gm/typeface.cpp | 65 | ||||
-rw-r--r-- | gm/variedtext.cpp | 16 | ||||
-rw-r--r-- | gm/wacky_yuv_formats.cpp | 24 | ||||
-rw-r--r-- | gn/samples.gni | 2 | ||||
-rw-r--r-- | samplecode/SampleAnimatedImage.cpp | 11 | ||||
-rw-r--r-- | samplecode/SampleBitmapRect.cpp | 10 | ||||
-rw-r--r-- | samplecode/SampleComplexClip.cpp | 16 | ||||
-rw-r--r-- | samplecode/SampleGlyphTransform.cpp | 8 | ||||
-rw-r--r-- | samplecode/SampleLCD.cpp | 15 | ||||
-rw-r--r-- | samplecode/SampleMeasure.cpp | 104 | ||||
-rw-r--r-- | samplecode/SamplePolyToPoly.cpp | 18 | ||||
-rw-r--r-- | samplecode/SampleRegion.cpp | 21 | ||||
-rw-r--r-- | samplecode/SampleTextAlpha.cpp | 89 | ||||
-rw-r--r-- | samplecode/SampleUnpremul.cpp | 14 | ||||
-rw-r--r-- | src/utils/SkLua.cpp | 231 | ||||
-rw-r--r-- | tools/sk_app/CommandSet.cpp | 31 |
17 files changed, 238 insertions, 448 deletions
diff --git a/gm/text_scale_skew.cpp b/gm/text_scale_skew.cpp index 992bc6e98b..977f9e310e 100644 --- a/gm/text_scale_skew.cpp +++ b/gm/text_scale_skew.cpp @@ -11,16 +11,17 @@ // http://bug.skia.org/7315 DEF_SIMPLE_GM(text_scale_skew, canvas, 256, 128) { SkPaint p; - p.setTextSize(18.0f); p.setAntiAlias(true); + SkFont font; + font.setSize(18.0f); float y = 10.0f; for (float scale : { 0.5f, 0.71f, 1.0f, 1.41f, 2.0f }) { - p.setTextScaleX(scale); - y += p.getFontSpacing(); + font.setScaleX(scale); + y += font.getSpacing(); float x = 50.0f; for (float skew : { -0.5f, 0.0f, 0.5f }) { - p.setTextSkewX(skew); - SkTextUtils::DrawString(canvas, "Skia", x, y, p, SkTextUtils::kCenter_Align); + font.setSkewX(skew); + SkTextUtils::DrawString(canvas, "Skia", x, y, font, p, SkTextUtils::kCenter_Align); x += 78.0f; } } diff --git a/gm/typeface.cpp b/gm/typeface.cpp index ef0020ad11..bfe9371ae9 100644 --- a/gm/typeface.cpp +++ b/gm/typeface.cpp @@ -172,6 +172,18 @@ static void draw_typeface_rendering_gm(SkCanvas* canvas, sk_sp<SkTypeface> face, { true, true , true }, // subpixel anti-aliased in layer (flat pixel geometry) }; + auto compute_edging = [](AliasType at) { + if (at.antiAlias) { + if (at.subpixelAntitalias) { + return SkFont::Edging::kSubpixelAntiAlias; + } else { + return SkFont::Edging::kAntiAlias; + } + } else { + return SkFont::Edging::kAlias; + } + }; + // The hintgasp.ttf is designed for the following sizes to be different. // GASP_DOGRAY 0x0002 0<=ppem<=10 // GASP_SYMMETRIC_SMOOTHING 0x0008 0<=ppem<=10 @@ -205,19 +217,19 @@ static void draw_typeface_rendering_gm(SkCanvas* canvas, sk_sp<SkTypeface> face, SkScalar y = 0; // The baseline of the previous output { SkPaint paint; - paint.setTypeface(face); - paint.setEmbeddedBitmapText(true); + + SkFont font(face); + font.setEmbeddedBitmaps(true); SkScalar x = 0; SkScalar xMax = x; SkScalar xBase = 0; for (const SubpixelType subpixel : subpixelTypes) { y = 0; - paint.setSubpixelText(subpixel.requested); + font.setSubpixel(subpixel.requested); for (const AliasType& alias : aliasTypes) { - paint.setAntiAlias(alias.antiAlias); - paint.setLCDRenderText(alias.subpixelAntitalias); + font.setEdging(compute_edging(alias)); SkAutoCanvasRestore acr(canvas, false); if (alias.inLayer) { canvas->saveLayer(nullptr, &paint); @@ -225,12 +237,12 @@ static void draw_typeface_rendering_gm(SkCanvas* canvas, sk_sp<SkTypeface> face, for (const SkScalar& textSize : textSizes) { x = xBase + 5; - paint.setTextSize(textSize); + font.setSize(textSize); - SkScalar dy = SkScalarCeilToScalar(paint.getFontMetrics(nullptr)); + SkScalar dy = SkScalarCeilToScalar(font.getMetrics(nullptr)); y += dy; for (const SkFontHinting& hinting : hintingTypes) { - paint.setHinting(hinting); + font.setHinting(hinting); for (const bool& rotateABit : rotateABitTypes) { SkAutoCanvasRestore acr(canvas, true); @@ -238,11 +250,12 @@ static void draw_typeface_rendering_gm(SkCanvas* canvas, sk_sp<SkTypeface> face, canvas->rotate(2, x + subpixel.offset.x(), y + subpixel.offset.y()); } - canvas->drawText(&character, 1, x + subpixel.offset.x(), - y + subpixel.offset.y(), paint); + canvas->drawSimpleText(&character, 1, kUTF8_SkTextEncoding, + x + subpixel.offset.x(), + y + subpixel.offset.y(), font, paint); SkScalar dx = SkScalarCeilToScalar( - paint.measureText(&character, 1)) + 5; + font.measureText(&character, 1, kUTF8_SkTextEncoding)) + 5; x += dx; xMax = SkTMax(x, xMax); } @@ -268,19 +281,18 @@ static void draw_typeface_rendering_gm(SkCanvas* canvas, sk_sp<SkTypeface> face, { SkPaint paint; - paint.setTypeface(face); - paint.setTextSize(16); + + SkFont font(face, 16); SkScalar x = 0; for (const bool& fakeBold : fakeBoldTypes) { - SkScalar dy = SkScalarCeilToScalar(paint.getFontMetrics(nullptr)); + SkScalar dy = SkScalarCeilToScalar(font.getMetrics(nullptr)); y += dy; x = 5; - paint.setFakeBoldText(fakeBold); + font.setEmbolden(fakeBold); for (const AliasType& alias : aliasTypes) { - paint.setAntiAlias(alias.antiAlias); - paint.setLCDRenderText(alias.subpixelAntitalias); + font.setEdging(compute_edging(alias)); SkAutoCanvasRestore acr(canvas, false); if (alias.inLayer) { canvas->saveLayer(nullptr, &paint); @@ -288,9 +300,10 @@ static void draw_typeface_rendering_gm(SkCanvas* canvas, sk_sp<SkTypeface> face, for (const StyleTests& style : styleTypes) { paint.setStyle(style.style); paint.setStrokeWidth(style.strokeWidth); - canvas->drawText(&character, 1, x, y, paint); + canvas->drawSimpleText(&character, 1, kUTF8_SkTextEncoding, x, y, font, paint); - SkScalar dx = SkScalarCeilToScalar(paint.measureText(&character, 1)) + 5; + SkScalar dx = SkScalarCeilToScalar(font.measureText(&character, 1, + kUTF8_SkTextEncoding)) + 5; x += dx; } } @@ -320,27 +333,27 @@ static void draw_typeface_rendering_gm(SkCanvas* canvas, sk_sp<SkTypeface> face, { SkPaint paint; - paint.setTypeface(face); - paint.setTextSize(16); + + SkFont font(face, 16); SkScalar x = 0; { for (const AliasType& alias : aliasTypes) { - SkScalar dy = SkScalarCeilToScalar(paint.getFontMetrics(nullptr)); + SkScalar dy = SkScalarCeilToScalar(font.getMetrics(nullptr)); y += dy; x = 5; - paint.setAntiAlias(alias.antiAlias); - paint.setLCDRenderText(alias.subpixelAntitalias); + font.setEdging(compute_edging(alias)); SkAutoCanvasRestore acr(canvas, false); if (alias.inLayer) { canvas->saveLayer(nullptr, &paint); } for (const MaskTests& mask : maskTypes) { paint.setMaskFilter(SkMaskFilter::MakeBlur(mask.style, mask.sigma)); - canvas->drawText(&character, 1, x, y, paint); + canvas->drawSimpleText(&character, 1, kUTF8_SkTextEncoding, x, y, font, paint); - SkScalar dx = SkScalarCeilToScalar(paint.measureText(&character, 1)) + 5; + SkScalar dx = SkScalarCeilToScalar(font.measureText(&character, 1, + kUTF8_SkTextEncoding)) + 5; x += dx; } paint.setMaskFilter(nullptr); diff --git a/gm/variedtext.cpp b/gm/variedtext.cpp index e8e1c29632..c11d00ef12 100644 --- a/gm/variedtext.cpp +++ b/gm/variedtext.cpp @@ -46,7 +46,7 @@ protected: void onOnceBeforeDraw() override { fPaint.setAntiAlias(true); - fPaint.setLCDRenderText(fLCD); + fFont.setEdging(fLCD ? SkFont::Edging::kSubpixelAntiAlias : SkFont::Edging::kAntiAlias); SkISize size = this->getISize(); SkScalar w = SkIntToScalar(size.fWidth); @@ -80,10 +80,10 @@ protected: SkRect r; fPaint.setColor(fColors[i]); - fPaint.setTypeface(fTypefaces[fTypefaceIndices[i]]); - fPaint.setTextSize(fPtSizes[i]); + fFont.setTypeface(fTypefaces[fTypefaceIndices[i]]); + fFont.setSize(fPtSizes[i]); - fPaint.measureText(fStrings[i].c_str(), fStrings[i].size(), &r); + fFont.measureText(fStrings[i].c_str(), fStrings[i].size(), kUTF8_SkTextEncoding, &r); // safeRect is set of x,y positions where we can draw the string without hitting // the GM's border. SkRect safeRect = SkRect::MakeLTRB(-r.fLeft, -r.fTop, w - r.fRight, h - r.fBottom); @@ -108,13 +108,14 @@ protected: void onDraw(SkCanvas* canvas) override { for (int i = 0; i < kCnt; ++i) { fPaint.setColor(fColors[i]); - fPaint.setTextSize(fPtSizes[i]); - fPaint.setTypeface(fTypefaces[fTypefaceIndices[i]]); + fFont.setSize(fPtSizes[i]); + fFont.setTypeface(fTypefaces[fTypefaceIndices[i]]); canvas->save(); canvas->clipRect(fClipRects[i]); canvas->translate(fPositions[i].fX, fPositions[i].fY); - canvas->drawString(fStrings[i], 0, 0, fPaint); + canvas->drawSimpleText(fStrings[i].c_str(), fStrings[i].size(), kUTF8_SkTextEncoding, + 0, 0, fFont, fPaint); canvas->restore(); } @@ -141,6 +142,7 @@ private: bool fLCD; sk_sp<SkTypeface> fTypefaces[4]; SkPaint fPaint; + SkFont fFont; // precomputed for each text draw SkString fStrings[kCnt]; diff --git a/gm/wacky_yuv_formats.cpp b/gm/wacky_yuv_formats.cpp index 0a0559641f..bd1a611338 100644 --- a/gm/wacky_yuv_formats.cpp +++ b/gm/wacky_yuv_formats.cpp @@ -622,43 +622,43 @@ static void draw_col_label(SkCanvas* canvas, int x, int yuvColorSpace, bool opaq static const char* kYUVColorSpaceNames[] = { "JPEG", "601", "709" }; GR_STATIC_ASSERT(SK_ARRAY_COUNT(kYUVColorSpaceNames) == kLastEnum_SkYUVColorSpace+1); - SkPaint textPaint; - sk_tool_utils::set_portable_typeface(&textPaint, nullptr, SkFontStyle::Bold()); - textPaint.setTextSize(16); + SkPaint paint; + SkFont font(sk_tool_utils::create_portable_typeface(nullptr, SkFontStyle::Bold()), 16); + font.setEdging(SkFont::Edging::kAlias); SkRect textRect; SkString colLabel; colLabel.printf("%s", kYUVColorSpaceNames[yuvColorSpace]); - textPaint.measureText(colLabel.c_str(), colLabel.size(), &textRect); + font.measureText(colLabel.c_str(), colLabel.size(), kUTF8_SkTextEncoding, &textRect); int y = textRect.height(); - SkTextUtils::DrawString(canvas, colLabel, x, y, textPaint, SkTextUtils::kCenter_Align); + SkTextUtils::DrawString(canvas, colLabel.c_str(), x, y, font, paint, SkTextUtils::kCenter_Align); colLabel.printf("%s", opaque ? "Opaque" : "Transparent"); - textPaint.measureText(colLabel.c_str(), colLabel.size(), &textRect); + font.measureText(colLabel.c_str(), colLabel.size(), kUTF8_SkTextEncoding, &textRect); y += textRect.height(); - SkTextUtils::DrawString(canvas, colLabel, x, y, textPaint, SkTextUtils::kCenter_Align); + SkTextUtils::DrawString(canvas, colLabel.c_str(), x, y, font, paint, SkTextUtils::kCenter_Align); } static void draw_row_label(SkCanvas* canvas, int y, int yuvFormat) { static const char* kYUVFormatNames[] = { "AYUV", "NV12", "NV21", "I420", "YV12" }; GR_STATIC_ASSERT(SK_ARRAY_COUNT(kYUVFormatNames) == kLast_YUVFormat+1); - SkPaint textPaint; - sk_tool_utils::set_portable_typeface(&textPaint, nullptr, SkFontStyle::Bold()); - textPaint.setTextSize(16); + SkPaint paint; + SkFont font(sk_tool_utils::create_portable_typeface(nullptr, SkFontStyle::Bold()), 16); + font.setEdging(SkFont::Edging::kAlias); SkRect textRect; SkString rowLabel; rowLabel.printf("%s", kYUVFormatNames[yuvFormat]); - textPaint.measureText(rowLabel.c_str(), rowLabel.size(), &textRect); + font.measureText(rowLabel.c_str(), rowLabel.size(), kUTF8_SkTextEncoding, &textRect); y += kTileWidthHeight/2 + textRect.height()/2; - canvas->drawText(rowLabel.c_str(), rowLabel.size(), 0, y, textPaint); + canvas->drawSimpleText(rowLabel.c_str(), rowLabel.size(), kUTF8_SkTextEncoding, 0, y, font, paint); } static GrBackendTexture create_yuva_texture(GrGpu* gpu, const SkBitmap& bm, diff --git a/gn/samples.gni b/gn/samples.gni index ef3fd0f13c..b7435e0be9 100644 --- a/gn/samples.gni +++ b/gn/samples.gni @@ -62,7 +62,6 @@ samples_sources = [ "$_samplecode/SampleLines.cpp", "$_samplecode/SampleLitAtlas.cpp", "$_samplecode/SampleManyRects.cpp", - "$_samplecode/SampleMeasure.cpp", "$_samplecode/SampleMegaStroke.cpp", "$_samplecode/SampleNima.cpp", "$_samplecode/SamplePatch.cpp", @@ -90,7 +89,6 @@ samples_sources = [ "$_samplecode/SampleStrokeRect.cpp", "$_samplecode/SampleSubpixelTranslate.cpp", "$_samplecode/SampleSVGFile.cpp", - "$_samplecode/SampleTextAlpha.cpp", "$_samplecode/SampleTextBox.cpp", "$_samplecode/SampleTextEffects.cpp", "$_samplecode/SampleTextureDomain.cpp", diff --git a/samplecode/SampleAnimatedImage.cpp b/samplecode/SampleAnimatedImage.cpp index 0d9adad81e..8f739351d4 100644 --- a/samplecode/SampleAnimatedImage.cpp +++ b/samplecode/SampleAnimatedImage.cpp @@ -9,6 +9,7 @@ #include "SkAnimatedImage.h" #include "SkAnimTimer.h" #include "SkCanvas.h" +#include "SkFont.h" #include "SkPaint.h" #include "SkPictureRecorder.h" #include "SkRect.h" @@ -30,19 +31,17 @@ public: protected: void onDrawBackground(SkCanvas* canvas) override { - SkPaint paint; - paint.setAntiAlias(true); - constexpr SkScalar kTextSize = 20; - paint.setTextSize(kTextSize); + SkFont font; + font.setSize(20); SkString str = SkStringPrintf("Press '%c' to start/pause; '%c' to reset.", kPauseKey, kResetKey); const char* text = str.c_str(); SkRect bounds; - paint.measureText(text, strlen(text), &bounds); + font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds); fYOffset = bounds.height(); - canvas->drawText(text, strlen(text), 5, fYOffset, paint); + canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 5, fYOffset, font, SkPaint()); fYOffset *= 2; } diff --git a/samplecode/SampleBitmapRect.cpp b/samplecode/SampleBitmapRect.cpp index 61f33618a3..9dcf98c3cb 100644 --- a/samplecode/SampleBitmapRect.cpp +++ b/samplecode/SampleBitmapRect.cpp @@ -9,6 +9,7 @@ #include "SkAnimTimer.h" #include "SkBitmap.h" #include "SkCanvas.h" +#include "SkFont.h" #include "SkGradientShader.h" #include "SkGraphics.h" #include "SkPath.h" @@ -160,18 +161,17 @@ static void make_big_bitmap(SkBitmap* bm) { const int BIG_H = 120; - SkPaint paint; - paint.setAntiAlias(true); - paint.setTextSize(SkIntToScalar(BIG_H)); + SkFont font; + font.setSize(SkIntToScalar(BIG_H)); - const int BIG_W = SkScalarRoundToInt(paint.measureText(gText, strlen(gText))); + const int BIG_W = SkScalarRoundToInt(font.measureText(gText, strlen(gText), kUTF8_SkTextEncoding)); bm->allocN32Pixels(BIG_W, BIG_H); bm->eraseColor(SK_ColorWHITE); SkCanvas canvas(*bm); - canvas.drawString(gText, 0, paint.getTextSize()*4/5, paint); + canvas.drawSimpleText(gText, strlen(gText), kUTF8_SkTextEncoding, 0, font.getSize()*4/5, font, SkPaint()); } class BitmapRectView2 : public Sample { diff --git a/samplecode/SampleComplexClip.cpp b/samplecode/SampleComplexClip.cpp index fea5dd1da0..897b0455ec 100644 --- a/samplecode/SampleComplexClip.cpp +++ b/samplecode/SampleComplexClip.cpp @@ -7,6 +7,7 @@ #include "Sample.h" #include "SkCanvas.h" +#include "SkFont.h" #include "SkPath.h" #include "SkClipOpPriv.h" @@ -65,6 +66,9 @@ protected: clipB.close(); SkColor colorB = SK_ColorRED; + SkFont font; + font.setSize(20); + SkPaint paint; paint.setAntiAlias(true); @@ -122,19 +126,17 @@ protected: paint.setColor(colorB); canvas->drawPath(clipB, paint); - paint.setTextSize(SkIntToScalar(20)); - SkScalar txtX = SkIntToScalar(55); paint.setColor(colorA); const char* aTxt = invA ? "InverseA " : "A "; canvas->drawString(aTxt, txtX, SkIntToScalar(220), paint); - txtX += paint.measureText(aTxt, strlen(aTxt)); + txtX += font.measureText(aTxt, strlen(aTxt), kUTF8_SkTextEncoding); paint.setColor(SK_ColorBLACK); - canvas->drawString(gOps[op].fName, - txtX, SkIntToScalar(220), paint); - txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName)); + canvas->drawSimpleText(gOps[op].fName, strlen(gOps[op].fName), kUTF8_SkTextEncoding, + txtX, 220, font, paint); + txtX += font.measureText(gOps[op].fName, strlen(gOps[op].fName), kUTF8_SkTextEncoding); paint.setColor(colorB); - canvas->drawString("B", txtX, SkIntToScalar(220), paint); + canvas->drawSimpleText("B", 1, kUTF8_SkTextEncoding, txtX, 220, font, paint); canvas->translate(SkIntToScalar(250),0); } diff --git a/samplecode/SampleGlyphTransform.cpp b/samplecode/SampleGlyphTransform.cpp index e8567d1ec9..ff42251723 100644 --- a/samplecode/SampleGlyphTransform.cpp +++ b/samplecode/SampleGlyphTransform.cpp @@ -40,7 +40,8 @@ protected: void onDrawContent(SkCanvas* canvas) override { SkPaint paint; - paint.setTypeface(fEmojiFont.fTypeface); + + SkFont font(fEmojiFont.fTypeface); const char* text = fEmojiFont.fText; double baseline = this->height() / 2; @@ -54,8 +55,9 @@ protected: // d3 by default anchors text around the middle SkRect bounds; - paint.measureText(text, strlen(text), &bounds); - canvas->drawString(text, -bounds.centerX(), -bounds.centerY(), paint); + font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds); + canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, -bounds.centerX(), -bounds.centerY(), + font, paint); } bool onAnimate(const SkAnimTimer& timer) override { diff --git a/samplecode/SampleLCD.cpp b/samplecode/SampleLCD.cpp index 22aaba6262..f209e97089 100644 --- a/samplecode/SampleLCD.cpp +++ b/samplecode/SampleLCD.cpp @@ -4,6 +4,7 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ +#include <SkFont.h> #include "Sample.h" #include "SkCanvas.h" #include "SkPaint.h" @@ -30,7 +31,6 @@ protected: this->drawBG(canvas); SkPaint paint; - paint.setAntiAlias(true); SkScalar textSize = SkIntToScalar(6); SkScalar delta = SK_Scalar1; @@ -40,16 +40,17 @@ protected: SkScalar x1 = SkIntToScalar(310); SkScalar y = SkIntToScalar(20); + SkFont font; for (int i = 0; i < 20; i++) { - paint.setTextSize(textSize); + font.setSize(textSize); textSize += delta; - paint.setLCDRenderText(false); - canvas->drawText(text, len, x0, y, paint); - paint.setLCDRenderText(true); - canvas->drawText(text, len, x1, y, paint); + font.setEdging(SkFont::Edging::kAntiAlias); + canvas->drawSimpleText(text, len, kUTF8_SkTextEncoding, x0, y, font, paint); + font.setEdging(SkFont::Edging::kSubpixelAntiAlias); + canvas->drawSimpleText(text, len, kUTF8_SkTextEncoding, x1, y, font, paint); - y += paint.getFontSpacing(); + y += font.getSpacing(); } } diff --git a/samplecode/SampleMeasure.cpp b/samplecode/SampleMeasure.cpp deleted file mode 100644 index 2a4817e418..0000000000 --- a/samplecode/SampleMeasure.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#include "Sample.h" -#include "SkCanvas.h" -#include "SkGradientShader.h" -#include "SkPath.h" -#include "SkRegion.h" -#include "SkShader.h" -#include "SkUTF.h" -#include "Sk1DPathEffect.h" -#include "SkCornerPathEffect.h" -#include "SkPathMeasure.h" -#include "SkRandom.h" -#include "SkColorPriv.h" -#include "SkColorFilter.h" - -// exercise scale/linear -struct Setting { - bool fLinearText; -}; - -static const Setting gSettings[] = { - { false }, - { true }, -}; - -static void doMeasure(SkCanvas* canvas, const SkPaint& paint, const char text[]) { - SkScalar dy = paint.getFontMetrics(nullptr); - - size_t len = strlen(text); - SkAutoTMalloc<SkScalar> autoWidths(len); - SkScalar* widths = autoWidths.get(); - SkAutoTMalloc<SkRect> autoRects(len); - SkRect* rects = autoRects.get(); - SkRect bounds; - - SkPaint p(paint); - for (size_t i = 0; i < SK_ARRAY_COUNT(gSettings); i++) { - p.setLinearText(gSettings[i].fLinearText); - - int n = p.getTextWidths(text, len, widths, rects); - SkScalar w = p.measureText(text, len, &bounds); - - p.setStyle(SkPaint::kFill_Style); - p.setColor(0x8888FF88); - canvas->drawRect(bounds, p); - p.setColor(0xFF000000); - canvas->drawText(text, len, 0, 0, p); - - p.setStyle(SkPaint::kStroke_Style); - p.setStrokeWidth(0); - p.setColor(0xFFFF0000); - SkScalar x = 0; - for (int j = 0; j < n; j++) { - SkRect r = rects[j]; - r.offset(x, 0); - canvas->drawRect(r, p); - x += widths[j]; - } - - p.setColor(0xFF0000FF); - canvas->drawLine(0, 0, w, 0, p); - p.setStrokeWidth(SkIntToScalar(4)); - canvas->drawPoint(x, 0, p); - - canvas->translate(0, dy); - } -} - -class MeasureView : public Sample { -public: - SkPaint fPaint; - - MeasureView() { - fPaint.setAntiAlias(true); - fPaint.setTextSize(SkIntToScalar(64)); - this->setBGColor(0xFFDDDDDD); - } - -protected: - virtual bool onQuery(Sample::Event* evt) { - if (Sample::TitleQ(*evt)) { - Sample::TitleR(evt, "Measure"); - return true; - } - return this->INHERITED::onQuery(evt); - } - - virtual void onDrawContent(SkCanvas* canvas) { - canvas->translate(fPaint.getTextSize(), fPaint.getTextSize()); - doMeasure(canvas, fPaint, "Hamburgefons"); - } - -private: - typedef Sample INHERITED; -}; - -////////////////////////////////////////////////////////////////////////////// - -DEF_SAMPLE( return new MeasureView(); ) diff --git a/samplecode/SamplePolyToPoly.cpp b/samplecode/SamplePolyToPoly.cpp index 24c8b80032..0e25e3c53b 100644 --- a/samplecode/SamplePolyToPoly.cpp +++ b/samplecode/SamplePolyToPoly.cpp @@ -75,7 +75,7 @@ protected: return this->INHERITED::onQuery(evt); } - static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[], + static void doDraw(SkCanvas* canvas, SkPaint* paint, const SkFont& font, const int isrc[], const int idst[], int count) { SkMatrix matrix; SkPoint src[4], dst[4]; @@ -97,14 +97,14 @@ protected: canvas->drawLine(0, D, D, 0, *paint); SkFontMetrics fm; - paint->getFontMetrics(&fm); + font.getMetrics(&fm); paint->setColor(SK_ColorRED); paint->setStyle(SkPaint::kFill_Style); SkScalar x = D/2; float y = D/2 - (fm.fAscent + fm.fDescent)/2; SkString str; str.appendS32(count); - SkTextUtils::DrawString(canvas, str, x, y, *paint, SkTextUtils::kCenter_Align); + SkTextUtils::DrawString(canvas, str.c_str(), x, y, font, *paint, SkTextUtils::kCenter_Align); canvas->restore(); } @@ -113,14 +113,16 @@ protected: SkPaint paint; paint.setAntiAlias(true); paint.setStrokeWidth(SkIntToScalar(4)); - paint.setTextSize(SkIntToScalar(40)); + + SkFont font; + font.setSize(40); canvas->save(); canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); // translate (1 point) const int src1[] = { 0, 0 }; const int dst1[] = { 5, 5 }; - doDraw(canvas, &paint, src1, dst1, 1); + doDraw(canvas, &paint, font, src1, dst1, 1); canvas->restore(); canvas->save(); @@ -128,7 +130,7 @@ protected: // rotate/uniform-scale (2 points) const int src2[] = { 32, 32, 64, 32 }; const int dst2[] = { 32, 32, 64, 48 }; - doDraw(canvas, &paint, src2, dst2, 2); + doDraw(canvas, &paint, font, src2, dst2, 2); canvas->restore(); canvas->save(); @@ -136,7 +138,7 @@ protected: // rotate/skew (3 points) const int src3[] = { 0, 0, 64, 0, 0, 64 }; const int dst3[] = { 0, 0, 96, 0, 24, 64 }; - doDraw(canvas, &paint, src3, dst3, 3); + doDraw(canvas, &paint, font, src3, dst3, 3); canvas->restore(); canvas->save(); @@ -144,7 +146,7 @@ protected: // perspective (4 points) const int src4[] = { 0, 0, 64, 0, 64, 64, 0, 64 }; const int dst4[] = { 0, 0, 96, 0, 64, 96, 0, 64 }; - doDraw(canvas, &paint, src4, dst4, 4); + doDraw(canvas, &paint, font, src4, dst4, 4); canvas->restore(); } diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp index a9526face8..409222e730 100644 --- a/samplecode/SampleRegion.cpp +++ b/samplecode/SampleRegion.cpp @@ -8,6 +8,7 @@ #include "Sample.h" #include "SkBitmap.h" #include "SkCanvas.h" +#include "SkFont.h" #include "SkGradientShader.h" #include "SkPath.h" #include "SkRegion.h" @@ -53,20 +54,20 @@ static void test_strokerect(SkCanvas* canvas) { static void drawFadingText(SkCanvas* canvas, const char* text, size_t len, SkScalar x, SkScalar y, - const SkPaint& paint) { + const SkFont& font, const SkPaint& paint) { // Need a bounds for the text SkRect bounds; SkFontMetrics fm; - paint.getFontMetrics(&fm); - bounds.set(x, y + fm.fTop, x + paint.measureText(text, len), y + fm.fBottom); + font.getMetrics(&fm); + bounds.set(x, y + fm.fTop, x + font.measureText(text, len, kUTF8_SkTextEncoding), y + fm.fBottom); // may need to outset bounds a little, to account for hinting and/or // antialiasing bounds.inset(-SkIntToScalar(2), -SkIntToScalar(2)); canvas->saveLayer(&bounds, nullptr); - canvas->drawText(text, len, x, y, paint); + canvas->drawSimpleText(text, len, kUTF8_SkTextEncoding, x, y, font, paint); const SkPoint pts[] = { { bounds.fLeft, y }, @@ -89,28 +90,30 @@ static void drawFadingText(SkCanvas* canvas, static void test_text(SkCanvas* canvas) { SkPaint paint; paint.setAntiAlias(true); - paint.setTextSize(20); + + SkFont font; + font.setSize(20); const char* str = "Hamburgefons"; size_t len = strlen(str); SkScalar x = 20; SkScalar y = 20; - canvas->drawText(str, len, x, y, paint); + canvas->drawSimpleText(str, len, kUTF8_SkTextEncoding, x, y, font, paint); y += 20; - const SkPoint pts[] = { { x, y }, { x + paint.measureText(str, len), y } }; + const SkPoint pts[] = { { x, y }, { x + font.measureText(str, len, kUTF8_SkTextEncoding), y } }; const SkColor colors[] = { SK_ColorBLACK, SK_ColorBLACK, 0 }; const SkScalar pos[] = { 0, 0.9f, 1 }; paint.setShader(SkGradientShader::MakeLinear(pts, colors, pos, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode)); - canvas->drawText(str, len, x, y, paint); + canvas->drawSimpleText(str, len, kUTF8_SkTextEncoding, x, y, font, paint); y += 20; paint.setShader(nullptr); - drawFadingText(canvas, str, len, x, y, paint); + drawFadingText(canvas, str, len, x, y, font, paint); } static void scale_rect(SkIRect* dst, const SkIRect& src, float scale) { diff --git a/samplecode/SampleTextAlpha.cpp b/samplecode/SampleTextAlpha.cpp deleted file mode 100644 index 14885e8b85..0000000000 --- a/samplecode/SampleTextAlpha.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "Sample.h" -#include "SkBlurMask.h" -#include "SkCanvas.h" -#include "SkGradientShader.h" -#include "SkGraphics.h" -#include "SkMaskFilter.h" -#include "SkPath.h" -#include "SkRandom.h" -#include "SkRegion.h" -#include "SkShader.h" -#include "SkUTF.h" -#include "SkColorPriv.h" -#include "SkColorFilter.h" -#include "SkTime.h" -#include "SkTypeface.h" - -#include "SkOSFile.h" -#include "SkStream.h" - -class TextAlphaView : public Sample { -public: - TextAlphaView() { - fByte = 0xFF; - } - -protected: - bool onQuery(Sample::Event* evt) override { - if (Sample::TitleQ(*evt)) { - Sample::TitleR(evt, "TextAlpha"); - return true; - } - return this->INHERITED::onQuery(evt); - } - - void onDrawContent(SkCanvas* canvas) override { - const char* str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - SkPaint paint; - SkScalar x = SkIntToScalar(10); - SkScalar y = SkIntToScalar(20); - - paint.setFlags(0x105); - - paint.setARGB(fByte, 0xFF, 0xFF, 0xFF); - - paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, - SkBlurMask::ConvertRadiusToSigma(3))); - - SkRandom rand; - - for (int ps = 6; ps <= 35; ps++) { - paint.setColor(rand.nextU() | (0xFF << 24)); - paint.setTextSize(SkIntToScalar(ps)); - paint.setTextSize(SkIntToScalar(24)); - canvas->drawString(str, x, y, paint); - y += paint.getFontMetrics(nullptr); - } - } - - Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override { - return new Click(this); - } - - bool onClick(Click* click) override { - int y = click->fICurr.fY; - if (y < 0) { - y = 0; - } else if (y > 255) { - y = 255; - } - fByte = y; - return true; - } - -private: - int fByte; - - typedef Sample INHERITED; -}; - -////////////////////////////////////////////////////////////////////////////// - -DEF_SAMPLE( return new TextAlphaView(); ) diff --git a/samplecode/SampleUnpremul.cpp b/samplecode/SampleUnpremul.cpp index 3e670be05c..981ec9da3e 100644 --- a/samplecode/SampleUnpremul.cpp +++ b/samplecode/SampleUnpremul.cpp @@ -75,12 +75,14 @@ protected: void onDrawContent(SkCanvas* canvas) override { SkPaint paint; paint.setAntiAlias(true); - paint.setTextSize(SkIntToScalar(24)); + + SkFont font; + font.setSize(24); auto looper( SkBlurDrawLooper::Make(SK_ColorBLUE, SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(2)), 0, 0)); paint.setLooper(looper); - SkScalar height = paint.getFontMetrics(nullptr); + SkScalar height = font.getMetrics(nullptr); if (!fDecodeSucceeded) { SkString failure; if (fResPath.size() == 0) { @@ -88,7 +90,7 @@ protected: } else { failure.printf("Failed to decode %s", fCurrFile.c_str()); } - canvas->drawString(failure, 0, height, paint); + canvas->drawSimpleText(failure.c_str(), failure.size(), kUTF8_SkTextEncoding, 0, height, font, paint); return; } @@ -96,16 +98,16 @@ protected: SkString header(SkOSPath::Basename(fCurrFile.c_str())); header.appendf(" [%dx%d] %s", fBitmap.width(), fBitmap.height(), (fPremul ? "premultiplied" : "unpremultiplied")); - canvas->drawString(header, 0, height, paint); + canvas->drawSimpleText(header.c_str(), header.size(), kUTF8_SkTextEncoding, 0, height, font, paint); canvas->translate(0, height); // Help messages header.printf("Press '%c' to move to the next image.'", fNextImageChar); - canvas->drawString(header, 0, height, paint); + canvas->drawSimpleText(header.c_str(), header.size(), kUTF8_SkTextEncoding, 0, height, font, paint); canvas->translate(0, height); header.printf("Press '%c' to toggle premultiplied decode.", fTogglePremulChar); - canvas->drawString(header, 0, height, paint); + canvas->drawSimpleText(header.c_str(), header.size(), kUTF8_SkTextEncoding, 0, height, font, paint); // Now draw the image itself. canvas->translate(height * 2, height * 2); diff --git a/src/utils/SkLua.cpp b/src/utils/SkLua.cpp index 12b5279171..3852626893 100644 --- a/src/utils/SkLua.cpp +++ b/src/utils/SkLua.cpp @@ -15,6 +15,7 @@ #include "SkCanvas.h" #include "SkColorFilter.h" #include "SkData.h" +#include "SkFont.h" #include "SkFontStyle.h" #include "SkGradientShader.h" #include "SkImage.h" @@ -54,6 +55,7 @@ template <typename T> const char* get_mtname(); DEF_MTNAME(SkCanvas) DEF_MTNAME(SkColorFilter) DEF_MTNAME(DocHolder) +DEF_MTNAME(SkFont) DEF_MTNAME(SkImage) DEF_MTNAME(SkImageFilter) DEF_MTNAME(SkMatrix) @@ -727,46 +729,6 @@ static int lpaint_setDither(lua_State* L) { return 0; } -static int lpaint_isFakeBoldText(lua_State* L) { - lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isFakeBoldText()); - return 1; -} - -static int lpaint_isLinearText(lua_State* L) { - lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isLinearText()); - return 1; -} - -static int lpaint_isSubpixelText(lua_State* L) { - lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isSubpixelText()); - return 1; -} - -static int lpaint_setSubpixelText(lua_State* L) { - get_obj<SkPaint>(L, 1)->setSubpixelText(lua2bool(L, 2)); - return 1; -} - -static int lpaint_isLCDRenderText(lua_State* L) { - lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isLCDRenderText()); - return 1; -} - -static int lpaint_setLCDRenderText(lua_State* L) { - get_obj<SkPaint>(L, 1)->setLCDRenderText(lua2bool(L, 2)); - return 1; -} - -static int lpaint_isEmbeddedBitmapText(lua_State* L) { - lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isEmbeddedBitmapText()); - return 1; -} - -static int lpaint_isAutohinted(lua_State* L) { - lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isAutohinted()); - return 1; -} - static int lpaint_getAlpha(lua_State* L) { SkLua(L).pushScalar(byte2unit(get_obj<SkPaint>(L, 1)->getAlpha())); return 1; @@ -787,41 +749,6 @@ static int lpaint_setColor(lua_State* L) { return 0; } -static int lpaint_getTextSize(lua_State* L) { - SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextSize()); - return 1; -} - -static int lpaint_getTextScaleX(lua_State* L) { - SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextScaleX()); - return 1; -} - -static int lpaint_getTextSkewX(lua_State* L) { - SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextSkewX()); - return 1; -} - -static int lpaint_setTextSize(lua_State* L) { - get_obj<SkPaint>(L, 1)->setTextSize(lua2scalar(L, 2)); - return 0; -} - -static int lpaint_getTypeface(lua_State* L) { - push_ref(L, get_obj<SkPaint>(L, 1)->getTypeface()); - return 1; -} - -static int lpaint_setTypeface(lua_State* L) { - get_obj<SkPaint>(L, 1)->setTypeface(sk_ref_sp(get_ref<SkTypeface>(L, 2))); - return 0; -} - -static int lpaint_getHinting(lua_State* L) { - SkLua(L).pushU32((unsigned)get_obj<SkPaint>(L, 1)->getHinting()); - return 1; -} - static int lpaint_getFilterQuality(lua_State* L) { SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getFilterQuality()); return 1; @@ -835,12 +762,6 @@ static int lpaint_setFilterQuality(lua_State* L) { return 0; } -static int lpaint_getFontID(lua_State* L) { - SkTypeface* face = get_obj<SkPaint>(L, 1)->getTypeface(); - SkLua(L).pushU32(SkTypeface::UniqueID(face)); - return 1; -} - static int lpaint_getStroke(lua_State* L) { lua_pushboolean(L, SkPaint::kStroke_Style == get_obj<SkPaint>(L, 1)->getStyle()); return 1; @@ -868,11 +789,6 @@ static int lpaint_getStrokeJoin(lua_State* L) { return 1; } -static int lpaint_getTextEncoding(lua_State* L) { - SkLua(L).pushU32((unsigned)get_obj<SkPaint>(L, 1)->getTextEncoding()); - return 1; -} - static int lpaint_getStrokeWidth(lua_State* L) { SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getStrokeWidth()); return 1; @@ -888,42 +804,6 @@ static int lpaint_getStrokeMiter(lua_State* L) { return 1; } -static int lpaint_measureText(lua_State* L) { - if (lua_isstring(L, 2)) { - size_t len; - const char* text = lua_tolstring(L, 2, &len); - SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->measureText(text, len)); - return 1; - } - return 0; -} - -struct FontMetrics { - SkScalar fTop; //!< The greatest distance above the baseline for any glyph (will be <= 0) - SkScalar fAscent; //!< The recommended distance above the baseline (will be <= 0) - SkScalar fDescent; //!< The recommended distance below the baseline (will be >= 0) - SkScalar fBottom; //!< The greatest distance below the baseline for any glyph (will be >= 0) - SkScalar fLeading; //!< The recommended distance to add between lines of text (will be >= 0) - SkScalar fAvgCharWidth; //!< the average charactor width (>= 0) - SkScalar fXMin; //!< The minimum bounding box x value for all glyphs - SkScalar fXMax; //!< The maximum bounding box x value for all glyphs - SkScalar fXHeight; //!< the height of an 'x' in px, or 0 if no 'x' in face -}; - -static int lpaint_getFontMetrics(lua_State* L) { - SkFontMetrics fm; - SkScalar height = get_obj<SkPaint>(L, 1)->getFontMetrics(&fm); - - lua_newtable(L); - setfield_scalar(L, "top", fm.fTop); - setfield_scalar(L, "ascent", fm.fAscent); - setfield_scalar(L, "descent", fm.fDescent); - setfield_scalar(L, "bottom", fm.fBottom); - setfield_scalar(L, "leading", fm.fLeading); - SkLua(L).pushScalar(height); - return 2; -} - static int lpaint_getEffects(lua_State* L) { const SkPaint* paint = get_obj<SkPaint>(L, 1); @@ -1020,36 +900,17 @@ static const struct luaL_Reg gSkPaint_Methods[] = { { "setDither", lpaint_setDither }, { "getFilterQuality", lpaint_getFilterQuality }, { "setFilterQuality", lpaint_setFilterQuality }, - { "isFakeBoldText", lpaint_isFakeBoldText }, - { "isLinearText", lpaint_isLinearText }, - { "isSubpixelText", lpaint_isSubpixelText }, - { "setSubpixelText", lpaint_setSubpixelText }, - { "isLCDRenderText", lpaint_isLCDRenderText }, - { "setLCDRenderText", lpaint_setLCDRenderText }, - { "isEmbeddedBitmapText", lpaint_isEmbeddedBitmapText }, - { "isAutohinted", lpaint_isAutohinted }, { "getAlpha", lpaint_getAlpha }, { "setAlpha", lpaint_setAlpha }, { "getColor", lpaint_getColor }, { "setColor", lpaint_setColor }, - { "getTextSize", lpaint_getTextSize }, - { "setTextSize", lpaint_setTextSize }, - { "getTextScaleX", lpaint_getTextScaleX }, - { "getTextSkewX", lpaint_getTextSkewX }, - { "getTypeface", lpaint_getTypeface }, - { "setTypeface", lpaint_setTypeface }, - { "getHinting", lpaint_getHinting }, - { "getFontID", lpaint_getFontID }, { "getStroke", lpaint_getStroke }, { "setStroke", lpaint_setStroke }, { "getStrokeCap", lpaint_getStrokeCap }, { "getStrokeJoin", lpaint_getStrokeJoin }, - { "getTextEncoding", lpaint_getTextEncoding }, { "getStrokeWidth", lpaint_getStrokeWidth }, { "setStrokeWidth", lpaint_setStrokeWidth }, { "getStrokeMiter", lpaint_getStrokeMiter }, - { "measureText", lpaint_measureText }, - { "getFontMetrics", lpaint_getFontMetrics }, { "getEffects", lpaint_getEffects }, { "getColorFilter", lpaint_getColorFilter }, { "setColorFilter", lpaint_setColorFilter }, @@ -1065,6 +926,93 @@ static const struct luaL_Reg gSkPaint_Methods[] = { /////////////////////////////////////////////////////////////////////////////// +static int lfont_getSize(lua_State* L) { + SkLua(L).pushScalar(get_obj<SkFont>(L, 1)->getSize()); + return 1; +} + +static int lfont_getScaleX(lua_State* L) { + SkLua(L).pushScalar(get_obj<SkFont>(L, 1)->getScaleX()); + return 1; +} + +static int lfont_getSkewX(lua_State* L) { + SkLua(L).pushScalar(get_obj<SkFont>(L, 1)->getSkewX()); + return 1; +} + +static int lfont_setSize(lua_State* L) { + get_obj<SkFont>(L, 1)->setSize(lua2scalar(L, 2)); + return 0; +} + +static int lfont_getTypeface(lua_State* L) { + push_ref(L, get_obj<SkFont>(L, 1)->getTypeface()); + return 1; +} + +static int lfont_setTypeface(lua_State* L) { + get_obj<SkFont>(L, 1)->setTypeface(sk_ref_sp(get_ref<SkTypeface>(L, 2))); + return 0; +} + +static int lfont_getHinting(lua_State* L) { + SkLua(L).pushU32((unsigned)get_obj<SkFont>(L, 1)->getHinting()); + return 1; +} + +static int lfont_getFontID(lua_State* L) { + SkTypeface* face = get_obj<SkFont>(L, 1)->getTypeface(); + SkLua(L).pushU32(SkTypeface::UniqueID(face)); + return 1; +} + +static int lfont_measureText(lua_State* L) { + if (lua_isstring(L, 2)) { + size_t len; + const char* text = lua_tolstring(L, 2, &len); + SkLua(L).pushScalar(get_obj<SkFont>(L, 1)->measureText(text, len, kUTF8_SkTextEncoding)); + return 1; + } + return 0; +} + +static int lfont_getMetrics(lua_State* L) { + SkFontMetrics fm; + SkScalar height = get_obj<SkFont>(L, 1)->getMetrics(&fm); + + lua_newtable(L); + setfield_scalar(L, "top", fm.fTop); + setfield_scalar(L, "ascent", fm.fAscent); + setfield_scalar(L, "descent", fm.fDescent); + setfield_scalar(L, "bottom", fm.fBottom); + setfield_scalar(L, "leading", fm.fLeading); + SkLua(L).pushScalar(height); + return 2; +} + +static int lfont_gc(lua_State* L) { + get_obj<SkFont>(L, 1)->~SkFont(); + return 0; +} + +static const struct luaL_Reg gSkFont_Methods[] = { + { "getSize", lfont_getSize }, + { "setSize", lfont_setSize }, + { "getScaleX", lfont_getScaleX }, + { "getSkewX", lfont_getSkewX }, + { "getTypeface", lfont_getTypeface }, + { "setTypeface", lfont_setTypeface }, + { "getHinting", lfont_getHinting }, + { "getFontID", lfont_getFontID }, + { "measureText", lfont_measureText }, + { "getMetrics", lfont_getMetrics }, + { "__gc", lfont_gc }, + { nullptr, nullptr } +}; + +/////////////////////////////////////////////////////////////////////////////// + static const char* mode2string(SkShader::TileMode mode) { static const char* gNames[] = { "clamp", "repeat", "mirror" }; SkASSERT((unsigned)mode < SK_ARRAY_COUNT(gNames)); @@ -2039,6 +1987,7 @@ void SkLua::Load(lua_State* L) { REG_CLASS(L, SkCanvas); REG_CLASS(L, SkColorFilter); REG_CLASS(L, DocHolder); + REG_CLASS(L, SkFont); REG_CLASS(L, SkImage); REG_CLASS(L, SkImageFilter); REG_CLASS(L, SkMatrix); diff --git a/tools/sk_app/CommandSet.cpp b/tools/sk_app/CommandSet.cpp index 9684ef2624..c021a833a3 100644 --- a/tools/sk_app/CommandSet.cpp +++ b/tools/sk_app/CommandSet.cpp @@ -8,6 +8,7 @@ #include "CommandSet.h" #include "SkCanvas.h" +#include "SkFont.h" #include "SkTSort.h" namespace sk_app { @@ -101,17 +102,21 @@ void CommandSet::drawHelp(SkCanvas* canvas) { SkTQSort(fCommands.begin(), fCommands.end() - 1, kAlphabetical_HelpMode == fHelpMode ? compareCommandKey : compareCommandGroup); + SkFont font; + font.setSize(16); + + SkFont groupFont; + groupFont.setSize(18); + SkPaint bgPaint; bgPaint.setColor(0xC0000000); canvas->drawPaint(bgPaint); SkPaint paint; - paint.setTextSize(16); paint.setAntiAlias(true); paint.setColor(0xFFFFFFFF); SkPaint groupPaint; - groupPaint.setTextSize(18); groupPaint.setAntiAlias(true); groupPaint.setColor(0xFFFFFFFF); @@ -122,14 +127,15 @@ void CommandSet::drawHelp(SkCanvas* canvas) { SkScalar keyWidth = 0; for (Command& cmd : fCommands) { keyWidth = SkMaxScalar(keyWidth, - paint.measureText(cmd.fKeyName.c_str(), cmd.fKeyName.size())); + font.measureText(cmd.fKeyName.c_str(), cmd.fKeyName.size(), + kUTF8_SkTextEncoding)); } - keyWidth += paint.measureText(" ", 1); + keyWidth += font.measureText(" ", 1, kUTF8_SkTextEncoding); // If we're grouping by category, we'll be adding text height on every new group (including the // first), so no need to do that here. Otherwise, skip down so the first line is where we want. if (kGrouped_HelpMode != fHelpMode) { - y += paint.getTextSize(); + y += font.getSize(); } // Print everything: @@ -137,16 +143,19 @@ void CommandSet::drawHelp(SkCanvas* canvas) { for (Command& cmd : fCommands) { if (kGrouped_HelpMode == fHelpMode && lastGroup != cmd.fGroup) { // Group change. Advance and print header: - y += paint.getTextSize(); - canvas->drawString(cmd.fGroup, x, y, groupPaint); - y += groupPaint.getTextSize() + 2; + y += font.getSize(); + canvas->drawSimpleText(cmd.fGroup.c_str(), cmd.fGroup.size(), kUTF8_SkTextEncoding, + x, y, groupFont, groupPaint); + y += groupFont.getSize() + 2; lastGroup = cmd.fGroup; } - canvas->drawString(cmd.fKeyName, x, y, paint); + canvas->drawSimpleText(cmd.fKeyName.c_str(), cmd.fKeyName.size(), kUTF8_SkTextEncoding, + x, y, font, paint); SkString text = SkStringPrintf(": %s", cmd.fDescription.c_str()); - canvas->drawString(text, x + keyWidth, y, paint); - y += paint.getTextSize() + 2; + canvas->drawSimpleText(text.c_str(), text.size(), kUTF8_SkTextEncoding, + x + keyWidth, y, font, paint); + y += font.getSize() + 2; } } |