aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gm/text_scale_skew.cpp11
-rw-r--r--gm/typeface.cpp65
-rw-r--r--gm/variedtext.cpp16
-rw-r--r--gm/wacky_yuv_formats.cpp24
-rw-r--r--gn/samples.gni2
-rw-r--r--samplecode/SampleAnimatedImage.cpp11
-rw-r--r--samplecode/SampleBitmapRect.cpp10
-rw-r--r--samplecode/SampleComplexClip.cpp16
-rw-r--r--samplecode/SampleGlyphTransform.cpp8
-rw-r--r--samplecode/SampleLCD.cpp15
-rw-r--r--samplecode/SampleMeasure.cpp104
-rw-r--r--samplecode/SamplePolyToPoly.cpp18
-rw-r--r--samplecode/SampleRegion.cpp21
-rw-r--r--samplecode/SampleTextAlpha.cpp89
-rw-r--r--samplecode/SampleUnpremul.cpp14
-rw-r--r--src/utils/SkLua.cpp231
-rw-r--r--tools/sk_app/CommandSet.cpp31
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;
}
}