aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Reed <reed@google.com>2018-12-25 17:35:49 -0500
committerSkia Commit-Bot <skia-commit-bot@chromium.org>2018-12-25 23:07:35 +0000
commit212e9060ed298e8aa89e52080f8e80b033c95714 (patch)
tree85465358dfb5ea8a9e5d3efa8ad282e97afac151
parent5d77c200a8d9ef988829a55dfe1d9516611c734f (diff)
downloadskqp-212e9060ed298e8aa89e52080f8e80b033c95714.tar.gz
don't use drawPosText
Skia can now build if we mark drawPosText as private, Will hide/remove next (after Chrome CL) Bug: skia: Change-Id: I156560b025c119af302545bb5bd60678f7b8e8f7 Reviewed-on: https://skia-review.googlesource.com/c/179985 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com> Auto-Submit: Mike Reed <reed@google.com>
-rw-r--r--bench/TextBench.cpp181
-rw-r--r--fuzz/FuzzCanvas.cpp70
-rw-r--r--fuzz/FuzzDrawFunctions.cpp32
-rw-r--r--gn/bench.gni1
-rw-r--r--gn/samples.gni2
-rw-r--r--samplecode/SampleAll.cpp312
-rw-r--r--samplecode/SampleText.cpp164
-rw-r--r--src/core/SkPicturePlayback.cpp20
-rw-r--r--tests/DrawTextTest.cpp49
-rw-r--r--tests/FontHostStreamTest.cpp8
-rw-r--r--tests/SVGDeviceTest.cpp11
-rw-r--r--tests/SurfaceTest.cpp18
12 files changed, 46 insertions, 822 deletions
diff --git a/bench/TextBench.cpp b/bench/TextBench.cpp
deleted file mode 100644
index 881e78a0a7..0000000000
--- a/bench/TextBench.cpp
+++ /dev/null
@@ -1,181 +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 "Benchmark.h"
-#include "Resources.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkStream.h"
-#include "SkString.h"
-#include "SkTemplates.h"
-#include "SkTypeface.h"
-
-#ifdef SK_SUPPORT_LEGACY_PAINT_TEXTMEASURE
-
-enum FontQuality {
- kBW,
- kAA,
- kLCD,
-};
-
-static const char* fontQualityName(const SkPaint& paint) {
- if (!paint.isAntiAlias()) {
- return "BW";
- }
- if (paint.isLCDRenderText()) {
- return "LCD";
- }
- return "AA";
-}
-
-/* Some considerations for performance:
- short -vs- long strings (measuring overhead)
- tiny -vs- large pointsize (measure blit -vs- overhead)
- 1 -vs- many point sizes (measure cache lookup)
- normal -vs- subpixel -vs- lineartext (minor)
- force purge after each draw to measure scaler
- textencoding?
- text -vs- postext - pathtext
- */
-class TextBench : public Benchmark {
- SkPaint fPaint;
- SkString fText;
- SkString fName;
- FontQuality fFQ;
- bool fDoPos;
- bool fDoColorEmoji;
- sk_sp<SkTypeface> fColorEmojiTypeface;
- SkPoint* fPos;
-public:
- TextBench(const char text[], int ps,
- SkColor color, FontQuality fq, bool doColorEmoji = false, bool doPos = false)
- : fText(text)
- , fFQ(fq)
- , fDoPos(doPos)
- , fDoColorEmoji(doColorEmoji)
- , fPos(nullptr) {
- fPaint.setAntiAlias(kBW != fq);
- fPaint.setLCDRenderText(kLCD == fq);
- fPaint.setTextSize(SkIntToScalar(ps));
- fPaint.setColor(color);
- }
-
- ~TextBench() override {
- delete[] fPos;
- }
-
-protected:
- void onDelayedSetup() override {
- if (fDoColorEmoji) {
- SkASSERT(kBW == fFQ);
- fColorEmojiTypeface = MakeResourceAsTypeface("fonts/Funkster.ttf");
- }
-
- if (fDoPos) {
- size_t len = fText.size();
- SkScalar* adv = new SkScalar[len];
- fPaint.getTextWidths(fText.c_str(), len, adv);
- fPos = new SkPoint[len];
- SkScalar x = 0;
- for (size_t i = 0; i < len; ++i) {
- fPos[i].set(x, SkIntToScalar(50));
- x += adv[i];
- }
- delete[] adv;
- }
- }
-
-
- const char* onGetName() override {
- fName.printf("text_%g", SkScalarToFloat(fPaint.getTextSize()));
- if (fDoPos) {
- fName.append("_pos");
- }
- fName.appendf("_%s", fontQualityName(fPaint));
- if (SK_ColorBLACK == fPaint.getColor()) {
- fName.append("_BK");
- } else if (SK_ColorWHITE == fPaint.getColor()) {
- fName.append("_WT");
- } else {
- fName.appendf("_%02X", fPaint.getAlpha());
- }
-
- if (fDoColorEmoji) {
- fName.append("_ColorEmoji");
- }
-
- return fName.c_str();
- }
-
- void onDraw(int loops, SkCanvas* canvas) override {
- const SkIPoint dim = this->getSize();
- SkRandom rand;
-
- SkPaint paint(fPaint);
- this->setupPaint(&paint);
- // explicitly need these
- paint.setColor(fPaint.getColor());
- paint.setAntiAlias(kBW != fFQ);
- paint.setLCDRenderText(kLCD == fFQ);
-
- if (fDoColorEmoji && fColorEmojiTypeface) {
- paint.setTypeface(fColorEmojiTypeface);
- }
-
- const SkScalar x0 = SkIntToScalar(-10);
- const SkScalar y0 = SkIntToScalar(-10);
-
- if (fDoPos) {
- // realistically, the matrix is often at least translated, so we
- // do that since it exercises different code in drawPosText.
- canvas->translate(SK_Scalar1, SK_Scalar1);
- }
-
- for (int i = 0; i < loops; i++) {
- if (fDoPos) {
- canvas->drawPosText(fText.c_str(), fText.size(), fPos, paint);
- } else {
- SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
- SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
- canvas->drawString(fText, x, y, paint);
- }
- }
- }
-
-private:
- typedef Benchmark INHERITED;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-#define STR "Hamburgefons"
-
-DEF_BENCH( return new TextBench(STR, 16, 0xFFFFFFFF, kBW); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFF000000, kBW); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFFFF0000, kBW); )
-DEF_BENCH( return new TextBench(STR, 16, 0x88FF0000, kBW); )
-
-DEF_BENCH( return new TextBench(STR, 16, 0xFFFFFFFF, kAA); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFF000000, kAA); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFFFF0000, kAA); )
-DEF_BENCH( return new TextBench(STR, 16, 0x88FF0000, kAA); )
-
-DEF_BENCH( return new TextBench(STR, 16, 0xFFFFFFFF, kLCD); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFF000000, kLCD); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFFFF0000, kLCD); )
-DEF_BENCH( return new TextBench(STR, 16, 0x88FF0000, kLCD); )
-
-DEF_BENCH( return new TextBench(STR, 16, 0xFFFFFFFF, kBW, true); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFF000000, kBW, true); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFFFF0000, kBW, true); )
-DEF_BENCH( return new TextBench(STR, 16, 0x88FF0000, kBW, true); )
-
-DEF_BENCH( return new TextBench(STR, 16, 0xFF000000, kBW, true, true); )
-DEF_BENCH( return new TextBench(STR, 16, 0xFF000000, kAA, false, true); )
-
-#endif
diff --git a/fuzz/FuzzCanvas.cpp b/fuzz/FuzzCanvas.cpp
index 8ac43e87ff..7d6e7e5c93 100644
--- a/fuzz/FuzzCanvas.cpp
+++ b/fuzz/FuzzCanvas.cpp
@@ -1478,59 +1478,14 @@ static void fuzz_canvas(Fuzz* fuzz, SkCanvas* canvas, int depth = 9) {
font, paint);
break;
}
-#ifdef SK_SUPPORT_LEGACY_FONTMETRICS_IN_PAINT
case 46: {
- fuzz_paint(fuzz, &paint, depth - 1);
- font = fuzz_font(fuzz);
- SkTextEncoding encoding = fuzz_paint_text_encoding(fuzz);
- SkTDArray<uint8_t> text = make_fuzz_text(fuzz, font, encoding);
- int glyphCount = font.countText(text.begin(), SkToSizeT(text.count()), encoding);
- if (glyphCount < 1) {
- break;
- }
- SkAutoTMalloc<SkPoint> pos(glyphCount);
- SkAutoTMalloc<SkScalar> widths(glyphCount);
- font.LEGACY_applyToPaint(&paint);
- paint.setTextEncoding(encoding);
- paint.getTextWidths(text.begin(), SkToSizeT(text.count()), widths.get());
- pos[0] = {0, 0};
- for (int i = 1; i < glyphCount; ++i) {
- float y;
- fuzz->nextRange(&y, -0.5f * paint.getTextSize(), 0.5f * paint.getTextSize());
- pos[i] = {pos[i - 1].x() + widths[i - 1], y};
- }
- canvas->drawPosText(text.begin(), SkToSizeT(text.count()), pos.get(), paint);
+ // was drawPosText
break;
}
case 47: {
- fuzz_paint(fuzz, &paint, depth - 1);
- font = fuzz_font(fuzz);
- SkTextEncoding encoding = fuzz_paint_text_encoding(fuzz);
- SkTDArray<uint8_t> text = make_fuzz_text(fuzz, font, encoding);
- int glyphCount = font.countText(text.begin(), SkToSizeT(text.count()), encoding);
- SkAutoTMalloc<SkScalar> widths(glyphCount);
- if (glyphCount < 1) {
- break;
- }
- font.LEGACY_applyToPaint(&paint);
- paint.setTextEncoding(encoding);
- paint.getTextWidths(text.begin(), SkToSizeT(text.count()), widths.get());
- SkScalar x = widths[0];
- for (int i = 0; i < glyphCount; ++i) {
- using std::swap;
- swap(x, widths[i]);
- x += widths[i];
- SkScalar offset;
- fuzz->nextRange(&offset, -0.125f * paint.getTextSize(),
- 0.125f * paint.getTextSize());
- widths[i] += offset;
- }
- SkScalar y;
- fuzz->next(&y);
- canvas->drawPosTextH(text.begin(), SkToSizeT(text.count()), widths.get(), y, paint);
+ // was drawPosTextH
break;
}
-#endif
case 48: {
// was drawtextonpath
break;
@@ -1539,29 +1494,10 @@ static void fuzz_canvas(Fuzz* fuzz, SkCanvas* canvas, int depth = 9) {
// was drawtextonpath
break;
}
-#ifdef SK_SUPPORT_LEGACY_FONTMETRICS_IN_PAINT
case 50: {
- fuzz_paint(fuzz, &paint, depth - 1);
- font = fuzz_font(fuzz);
- SkTextEncoding encoding = fuzz_paint_text_encoding(fuzz);
- SkTDArray<uint8_t> text = make_fuzz_text(fuzz, paint);
- SkRSXform rSXform[kMaxGlyphCount];
- int glyphCount = font.countText(text.begin(), SkToSizeT(text.count()), encoding);
- SkASSERT(glyphCount <= kMaxGlyphCount);
- fuzz->nextN(rSXform, glyphCount);
- SkRect cullRect;
- bool useCullRect;
- fuzz->next(&useCullRect);
- if (useCullRect) {
- fuzz->next(&cullRect);
- }
- font.LEGACY_applyToPaint(&paint);
- paint.setTextEncoding(encoding);
- canvas->drawTextRSXform(text.begin(), SkToSizeT(text.count()), rSXform,
- useCullRect ? &cullRect : nullptr, paint);
+ // was drawTextRSXform
break;
}
-#endif
case 51: {
sk_sp<SkTextBlob> blob = make_fuzz_textblob(fuzz);
fuzz_paint(fuzz, &paint, depth - 1);
diff --git a/fuzz/FuzzDrawFunctions.cpp b/fuzz/FuzzDrawFunctions.cpp
index f9a2f2e9fb..8ad60c14b7 100644
--- a/fuzz/FuzzDrawFunctions.cpp
+++ b/fuzz/FuzzDrawFunctions.cpp
@@ -8,9 +8,11 @@
#include "Fuzz.h"
#include "SkBitmap.h"
#include "SkCanvas.h"
+#include "SkFont.h"
#include "SkImage.h"
#include "SkPath.h"
#include "SkSurface.h"
+#include "SkTextBlob.h"
#include "SkTypeface.h"
#include "SkClipOpPriv.h"
@@ -47,9 +49,6 @@ static void init_paint(Fuzz* fuzz, SkPaint* p) {
fuzz->nextRange(&tmp_u8, 0, (int)kHigh_SkFilterQuality);
p->setFilterQuality(static_cast<SkFilterQuality>(tmp_u8));
- fuzz->nextRange(&tmp_u8, 0, (int)SkFontHinting::kFull);
- p->setHinting(static_cast<SkFontHinting>(tmp_u8));
-
fuzz->nextRange(&tmp_u8, 0, (int)SkPaint::kLast_Cap);
p->setStrokeCap(static_cast<SkPaint::Cap>(tmp_u8));
@@ -111,7 +110,7 @@ static void init_surface(Fuzz* fuzz, sk_sp<SkSurface>* s) {
}
-static void fuzz_drawText(Fuzz* fuzz, sk_sp<SkTypeface> font) {
+static void fuzz_drawText(Fuzz* fuzz, sk_sp<SkTypeface> typeface) {
SkPaint p;
init_paint(fuzz, &p);
sk_sp<SkSurface> surface;
@@ -129,34 +128,31 @@ static void fuzz_drawText(Fuzz* fuzz, sk_sp<SkTypeface> font) {
x += p.getTextSize();
}
- p.setTypeface(font);
- // set text related attributes
+ SkFont font(typeface);
bool b;
fuzz->next(&b);
- p.setAutohinted(b);
+ font.setForceAutoHinting(b);
fuzz->next(&b);
- p.setEmbeddedBitmapText(b);
+ font.setEmbeddedBitmaps(b);
fuzz->next(&b);
- p.setFakeBoldText(b);
+ font.setEmbolden(b);
fuzz->next(&b);
- p.setLCDRenderText(b);
+ font.setEdging(b ? SkFont::Edging::kAntiAlias : SkFont::Edging::kSubpixelAntiAlias);
fuzz->next(&b);
- p.setLinearText(b);
+ font.setLinearMetrics(b);
fuzz->next(&b);
- p.setSubpixelText(b);
+ font.setSubpixel(b);
fuzz->next(&x);
- p.setTextScaleX(x);
+ font.setScaleX(x);
fuzz->next(&x);
- p.setTextSkewX(x);
+ font.setSkewX(x);
fuzz->next(&x);
- p.setTextSize(x);
+ font.setSize(x);
SkCanvas* cnv = surface->getCanvas();
- cnv->drawPosText(text, (kTxtLen-1), pts, p);
-
fuzz->next(&x);
fuzz->next(&y);
- cnv->drawText(text, (kTxtLen-1), x, y, p);
+ cnv->drawTextBlob(SkTextBlob::MakeFromPosText(text, kTxtLen-1, pts, font), x, y, p);
}
static void fuzz_drawCircle(Fuzz* fuzz) {
diff --git a/gn/bench.gni b/gn/bench.gni
index 40abf9be64..206ad77e04 100644
--- a/gn/bench.gni
+++ b/gn/bench.gni
@@ -118,7 +118,6 @@ bench_sources = [
"$_bench/StrokeBench.cpp",
"$_bench/SwizzleBench.cpp",
"$_bench/TableBench.cpp",
- "$_bench/TextBench.cpp",
"$_bench/TextBlobBench.cpp",
"$_bench/TileBench.cpp",
"$_bench/TileImageFilterBench.cpp",
diff --git a/gn/samples.gni b/gn/samples.gni
index 3e43886647..ef3fd0f13c 100644
--- a/gn/samples.gni
+++ b/gn/samples.gni
@@ -15,7 +15,6 @@ samples_sources = [
"$_samplecode/SampleAAGeometry.cpp",
"$_samplecode/SampleAARectModes.cpp",
"$_samplecode/SampleAARects.cpp",
- "$_samplecode/SampleAll.cpp",
"$_samplecode/SampleAndroidShadows.cpp",
"$_samplecode/SampleAnimatedImage.cpp",
"$_samplecode/SampleAnimatedText.cpp",
@@ -91,7 +90,6 @@ samples_sources = [
"$_samplecode/SampleStrokeRect.cpp",
"$_samplecode/SampleSubpixelTranslate.cpp",
"$_samplecode/SampleSVGFile.cpp",
- "$_samplecode/SampleText.cpp",
"$_samplecode/SampleTextAlpha.cpp",
"$_samplecode/SampleTextBox.cpp",
"$_samplecode/SampleTextEffects.cpp",
diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp
deleted file mode 100644
index 50239d60a2..0000000000
--- a/samplecode/SampleAll.cpp
+++ /dev/null
@@ -1,312 +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 "DecodeFile.h"
-#include "Sk1DPathEffect.h"
-#include "Sk2DPathEffect.h"
-#include "SkBlurMask.h"
-#include "SkBlurMaskFilter.h"
-#include "SkCanvas.h"
-#include "SkColorMatrixFilter.h"
-#include "SkColorPriv.h"
-#include "SkCornerPathEffect.h"
-#include "SkDashPathEffect.h"
-#include "SkDiscretePathEffect.h"
-#include "SkEmbossMaskFilter.h"
-#include "SkGradientShader.h"
-#include "SkMath.h"
-#include "SkPath.h"
-#include "SkPathMeasure.h"
-#include "SkPicture.h"
-#include "SkPictureRecorder.h"
-#include "SkRandom.h"
-#include "SkReadBuffer.h"
-#include "SkRegion.h"
-#include "SkShader.h"
-#include "SkTypeface.h"
-#include "SkUTF.h"
-#include "SkWriteBuffer.h"
-
-#include <math.h>
-
-class Dot2DPathEffect : public Sk2DPathEffect {
-public:
- Dot2DPathEffect(SkScalar radius, const SkMatrix& matrix)
- : Sk2DPathEffect(matrix), fRadius(radius) {}
-
-protected:
- void next(const SkPoint& loc, int u, int v, SkPath* dst) const override {
- dst->addCircle(loc.fX, loc.fY, fRadius);
- }
-
- void flatten(SkWriteBuffer& buffer) const override {
- this->INHERITED::flatten(buffer);
- buffer.writeScalar(fRadius);
- }
-
-private:
- SK_FLATTENABLE_HOOKS(Dot2DPathEffect)
-
- SkScalar fRadius;
-
- typedef Sk2DPathEffect INHERITED;
-};
-
-class DemoView : public Sample {
-public:
- DemoView() {}
-
-protected:
- virtual bool onQuery(Sample::Event* evt) {
- if (Sample::TitleQ(*evt)) {
- Sample::TitleR(evt, "Demo");
- return true;
- }
- return this->INHERITED::onQuery(evt);
- }
-
- virtual bool onClick(Click* click) {
- return this->INHERITED::onClick(click);
- }
-
- void makePath(SkPath& path) {
- path.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(20),
- SkPath::kCCW_Direction);
- for (int index = 0; index < 10; index++) {
- SkScalar x = (float) cos(index / 10.0f * 2 * 3.1415925358f);
- SkScalar y = (float) sin(index / 10.0f * 2 * 3.1415925358f);
- x *= index & 1 ? 7 : 14;
- y *= index & 1 ? 7 : 14;
- x += SkIntToScalar(20);
- y += SkIntToScalar(20);
- if (index == 0)
- path.moveTo(x, y);
- else
- path.lineTo(x, y);
- }
- path.close();
- }
-
- virtual void onDrawContent(SkCanvas* canvas) {
- canvas->save();
- this->drawPicture(canvas, 0);
- canvas->restore();
-
- {
- SkPictureRecorder recorder;
- {
- SkCanvas* record = recorder.beginRecording(320, 480, nullptr, 0);
- this->drawPicture(record, 120);
- }
- sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
-
- canvas->translate(0, SkIntToScalar(120));
-
- SkRect clip;
- clip.set(0, 0, SkIntToScalar(160), SkIntToScalar(160));
- do {
- canvas->save();
- canvas->clipRect(clip);
- picture->playback(canvas);
- canvas->restore();
- if (clip.fRight < SkIntToScalar(320))
- clip.offset(SkIntToScalar(160), 0);
- else if (clip.fBottom < SkIntToScalar(480))
- clip.offset(-SkIntToScalar(320), SkIntToScalar(160));
- else
- break;
- } while (true);
- }
- }
-
- void drawPicture(SkCanvas* canvas, int spriteOffset) {
- SkMatrix matrix; matrix.reset();
- SkPaint paint;
- SkPath path;
- SkPoint start = {0, 0};
- SkPoint stop = { SkIntToScalar(40), SkIntToScalar(40) };
- SkRect rect = {0, 0, SkIntToScalar(40), SkIntToScalar(40) };
- SkRect rect2 = {0, 0, SkIntToScalar(65), SkIntToScalar(20) };
- SkScalar left = 0, top = 0, x = 0, y = 0;
- int index;
-
- char ascii[] = "ascii...";
- int asciiLength = sizeof(ascii) - 1;
- char utf8[] = "utf8" "\xe2\x80\xa6";
-
- makePath(path);
- SkTDArray<SkPoint> pos;
- pos.setCount(asciiLength);
- for (index = 0; index < asciiLength; index++)
- pos[index].set(SkIntToScalar((unsigned int)index * 10),
- SkIntToScalar((unsigned int)index * 2));
- SkTDArray<SkPoint> pos2;
- pos2.setCount(asciiLength);
- for (index = 0; index < asciiLength; index++)
- pos2[index].set(SkIntToScalar((unsigned int)index * 10),
- SkIntToScalar(20));
-
- // shaders
- SkPoint linearPoints[] = { { 0, 0, }, { SkIntToScalar(40), SkIntToScalar(40) } };
- SkColor linearColors[] = { SK_ColorRED, SK_ColorBLUE };
- SkScalar* linearPos = nullptr;
- int linearCount = 2;
- SkShader::TileMode linearMode = SkShader::kMirror_TileMode;
- auto linear = SkGradientShader::MakeLinear(linearPoints,
- linearColors, linearPos, linearCount, linearMode);
-
- SkPoint radialCenter = { SkIntToScalar(25), SkIntToScalar(25) };
- SkScalar radialRadius = SkIntToScalar(25);
- SkColor radialColors[] = { SK_ColorGREEN, SK_ColorGRAY, SK_ColorRED };
- SkScalar radialPos[] = { 0, SkIntToScalar(3) / 5, SkIntToScalar(1)};
- int radialCount = 3;
- SkShader::TileMode radialMode = SkShader::kRepeat_TileMode;
- auto radial = SkGradientShader::MakeRadial(radialCenter,
- radialRadius, radialColors, radialPos, radialCount,
- radialMode);
-
- SkEmbossMaskFilter::Light light;
- light.fDirection[0] = SK_Scalar1/2;
- light.fDirection[1] = SK_Scalar1/2;
- light.fDirection[2] = SK_Scalar1/3;
- light.fAmbient = 0x48;
- light.fSpecular = 0x80;
-
- auto lightingFilter = SkColorMatrixFilter::MakeLightingFilter(
- 0xff89bc45, 0xff112233);
-
- canvas->save();
- canvas->translate(SkIntToScalar(0), SkIntToScalar(5));
- paint.setAntiAlias(true);
- paint.setFilterQuality(kLow_SkFilterQuality);
- // !!! draw through a clip
- paint.setColor(SK_ColorLTGRAY);
- paint.setStyle(SkPaint::kFill_Style);
- SkRect clip = {0, 0, SkIntToScalar(320), SkIntToScalar(120)};
- canvas->clipRect(clip);
- paint.setShader(SkShader::MakeBitmapShader(fTx,
- SkShader::kMirror_TileMode, SkShader::kRepeat_TileMode));
- canvas->drawPaint(paint);
- canvas->save();
-
- // line (exercises xfermode, colorShader, colorFilter, filterShader)
- paint.setColor(SK_ColorGREEN);
- paint.setStrokeWidth(SkIntToScalar(10));
- paint.setStyle(SkPaint::kStroke_Style);
- paint.setBlendMode(SkBlendMode::kXor);
- paint.setColorFilter(lightingFilter);
- canvas->drawLine(start, stop, paint); // should not be green
- paint.setBlendMode(SkBlendMode::kSrcOver);
- paint.setColorFilter(nullptr);
-
- // rectangle
- paint.setStyle(SkPaint::kFill_Style);
- canvas->translate(SkIntToScalar(50), 0);
- paint.setColor(SK_ColorYELLOW);
- paint.setShader(linear);
- paint.setPathEffect(pathEffectTest());
- canvas->drawRect(rect, paint);
- paint.setPathEffect(nullptr);
-
- // circle w/ emboss & transparent (exercises 3dshader)
- canvas->translate(SkIntToScalar(50), 0);
- paint.setMaskFilter(SkEmbossMaskFilter::Make(
- SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(12)/5), light));
- canvas->drawOval(rect, paint);
- canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
-// paint.setShader(transparentShader)->unref();
- canvas->drawOval(rect, paint);
- canvas->translate(0, SkIntToScalar(-10));
-
- // path
- canvas->translate(SkIntToScalar(50), 0);
- paint.setColor(SK_ColorRED);
- paint.setStyle(SkPaint::kStroke_Style);
- paint.setStrokeWidth(SkIntToScalar(5));
- paint.setShader(radial);
- paint.setMaskFilter(nullptr);
- canvas->drawPath(path, paint);
-
- paint.setShader(nullptr);
- // bitmap
- canvas->translate(SkIntToScalar(50), 0);
- paint.setStyle(SkPaint::kFill_Style);
- canvas->drawBitmap(fBug, left, top, &paint);
-
- canvas->translate(-SkIntToScalar(30), SkIntToScalar(30));
- paint.setShader(shaderTest()); // test compose shader
- canvas->drawRect(rect2, paint);
- paint.setShader(nullptr);
-
- canvas->restore();
- // text
- canvas->translate(0, SkIntToScalar(60));
- canvas->save();
- paint.setColor(SK_ColorGRAY);
- canvas->drawPosText(ascii, asciiLength, pos.begin(), paint);
- canvas->drawPosText(ascii, asciiLength, pos2.begin(), paint);
-
- canvas->translate(SkIntToScalar(50), 0);
- paint.setColor(SK_ColorCYAN);
- canvas->drawText(utf8, sizeof(utf8) - 1, x, y, paint);
-
- canvas->translate(0, SkIntToScalar(60));
- paint.setTextEncoding(kUTF8_SkTextEncoding);
- canvas->restore();
- }
-
- virtual Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) {
- fClickPt.set(x, y);
- return this->INHERITED::onFindClickHandler(x, y, modi);
- }
-
- sk_sp<SkPathEffect> pathEffectTest() {
- static const int gXY[] = { 1, 0, 0, -1, 2, -1, 3, 0, 2, 1, 0, 1 };
- SkScalar gPhase = 0;
- SkPath path;
- path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
- for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
- path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
- path.close();
- path.offset(SkIntToScalar(-6), 0);
- auto outer = SkPath1DPathEffect::Make(path, SkIntToScalar(12),
- gPhase, SkPath1DPathEffect::kRotate_Style);
- auto inner = SkDiscretePathEffect::Make(SkIntToScalar(2),
- SkIntToScalar(1)/10); // SkCornerPathEffect(SkIntToScalar(2));
- return SkPathEffect::MakeCompose(outer, inner);
- }
-
- sk_sp<SkShader> shaderTest() {
- SkPoint pts[] = { { 0, 0, }, { SkIntToScalar(100), 0 } };
- SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
- auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr,
- 2, SkShader::kClamp_TileMode);
- pts[1].set(0, SkIntToScalar(100));
- SkColor colors2[] = {SK_ColorBLACK, SkColorSetARGB(0x80, 0, 0, 0)};
- auto shaderB = SkGradientShader::MakeLinear(pts, colors2, nullptr,
- 2, SkShader::kClamp_TileMode);
- return SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB),
- SkBlendMode::kDstIn);
- }
-
- virtual void startTest() {
- decode_file("/Users/caryclark/Desktop/bugcirc.gif", &fBug);
- decode_file("/Users/caryclark/Desktop/tbcirc.gif", &fTb);
- decode_file("/Users/caryclark/Desktop/05psp04.gif", &fTx);
- }
-
-private:
- SkPoint fClickPt;
- SkBitmap fBug, fTb, fTx;
- typedef Sample INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-DEF_SAMPLE( return new DemoView(); )
diff --git a/samplecode/SampleText.cpp b/samplecode/SampleText.cpp
deleted file mode 100644
index 8720c179c3..0000000000
--- a/samplecode/SampleText.cpp
+++ /dev/null
@@ -1,164 +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 "SkReadBuffer.h"
-#include "SkWriteBuffer.h"
-#include "SkGradientShader.h"
-#include "SkGraphics.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 "SkStream.h"
-
-static const struct {
- const char* fName;
- uint32_t fFlags;
- bool fFlushCache;
-} gHints[] = {
- { "Linear", SkPaint::kLinearText_Flag, false },
- { "Normal", 0, true },
- { "Subpixel", SkPaint::kSubpixelText_Flag, true }
-};
-
-static void DrawTheText(SkCanvas* canvas, const char text[], size_t length, SkScalar x, SkScalar y,
- const SkPaint& paint, SkScalar clickX) {
- SkPaint p(paint);
-
-#if 0
- canvas->drawText(text, length, x, y, paint);
-#else
- {
- SkPoint pts[1000];
- SkScalar xpos = x;
- SkASSERT(length <= SK_ARRAY_COUNT(pts));
- for (size_t i = 0; i < length; i++) {
- pts[i].set(xpos, y);
- xpos += paint.getTextSize();
- }
- canvas->drawPosText(text, length, pts, paint);
- }
-#endif
-
- p.setSubpixelText(true);
- x += SkIntToScalar(180);
- canvas->drawText(text, length, x, y, p);
-
-#ifdef SK_DEBUG
- if (true) {
- p.setSubpixelText(false);
- p.setLinearText(true);
- x += SkIntToScalar(180);
- canvas->drawText(text, length, x, y, p);
- }
-#endif
-}
-
-class TextSpeedView : public Sample {
-public:
- TextSpeedView() {
- fHints = 0;
- fClickX = 0;
- }
-
-protected:
- bool onQuery(Sample::Event* evt) override {
- if (Sample::TitleQ(*evt)) {
- Sample::TitleR(evt, "Text");
- return true;
- }
- return this->INHERITED::onQuery(evt);
- }
-
- static void make_textstrip(SkBitmap* bm) {
- bm->allocPixels(SkImageInfo::Make(200, 18, kRGB_565_SkColorType,
- kOpaque_SkAlphaType));
- bm->eraseColor(SK_ColorWHITE);
-
- SkCanvas canvas(*bm);
- SkPaint paint;
- const char* s = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit";
-
- paint.setFlags(paint.getFlags() | SkPaint::kAntiAlias_Flag);
- paint.setTextSize(SkIntToScalar(14));
- canvas.drawString(s, SkIntToScalar(8), SkIntToScalar(14), paint);
- }
-
- static void fill_pts(SkPoint pts[], size_t n, SkRandom* rand) {
- for (size_t i = 0; i < n; i++)
- pts[i].set(rand->nextUScalar1() * 640, rand->nextUScalar1() * 480);
- }
-
- void onDrawContent(SkCanvas* canvas) override {
- SkAutoCanvasRestore restore(canvas, false);
- {
- SkRect r;
- r.set(0, 0, SkIntToScalar(1000), SkIntToScalar(20));
- // canvas->saveLayer(&r, nullptr, SkCanvas::kHasAlphaLayer_SaveFlag);
- }
-
- SkPaint paint;
-// const uint16_t glyphs[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 };
- int index = fHints % SK_ARRAY_COUNT(gHints);
- index = 1;
-// const char* style = gHints[index].fName;
-
-// canvas->translate(0, SkIntToScalar(50));
-
- // canvas->drawString(style, SkIntToScalar(20), SkIntToScalar(20), paint);
-
- paint.setTypeface(SkTypeface::MakeFromFile("/skimages/samplefont.ttf"));
- paint.setAntiAlias(true);
- paint.setFlags(paint.getFlags() | gHints[index].fFlags);
-
- SkRect clip;
- clip.set(SkIntToScalar(25), SkIntToScalar(34), SkIntToScalar(88), SkIntToScalar(155));
-
- const char* text = "Hamburgefons";
- size_t length = strlen(text);
-
- SkScalar y = SkIntToScalar(0);
- for (int i = 9; i <= 24; i++) {
- paint.setTextSize(SkIntToScalar(i) /*+ (gRand.nextU() & 0xFFFF)*/);
- for (SkScalar dx = 0; dx <= SkIntToScalar(3)/4;
- dx += SkIntToScalar(1) /* /4 */) {
- y += paint.getFontSpacing();
- DrawTheText(canvas, text, length, SkIntToScalar(20) + dx, y, paint, fClickX);
- }
- }
- if (gHints[index].fFlushCache) {
-// SkGraphics::SetFontCacheUsed(0);
- }
- }
-
- virtual Sample::Click* onFindClickHandler(SkScalar x, SkScalar y,
- unsigned modi) override {
- fClickX = x;
- return this->INHERITED::onFindClickHandler(x, y, modi);
- }
-
- bool onClick(Click* click) override {
- return this->INHERITED::onClick(click);
- }
-
-private:
- int fHints;
- SkScalar fClickX;
-
- typedef Sample INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-DEF_SAMPLE( return new TextSpeedView(); )
diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp
index c54bc5dc85..9a3841e20c 100644
--- a/src/core/SkPicturePlayback.cpp
+++ b/src/core/SkPicturePlayback.cpp
@@ -459,7 +459,10 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
BREAK_ON_READ_ERROR(reader);
if (paint && text.text()) {
- canvas->drawPosText(text.text(), text.length(), pos, *paint);
+ SkFont font = SkFont::LEGACY_ExtractFromPaint(*paint);
+ auto blob = SkTextBlob::MakeFromPosText(text.text(), text.length(), pos, font,
+ paint->getTextEncoding());
+ canvas->drawTextBlob(blob, 0, 0, *paint);
}
} break;
case DRAW_POS_TEXT_TOP_BOTTOM: {
@@ -474,7 +477,10 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
SkRect clip = canvas->getLocalClipBounds();
if (top < clip.fBottom && bottom > clip.fTop && paint && text.text()) {
- canvas->drawPosText(text.text(), text.length(), pos, *paint);
+ SkFont font = SkFont::LEGACY_ExtractFromPaint(*paint);
+ auto blob = SkTextBlob::MakeFromPosText(text.text(), text.length(), pos, font,
+ paint->getTextEncoding());
+ canvas->drawTextBlob(blob, 0, 0, *paint);
}
} break;
case DRAW_POS_TEXT_H: {
@@ -487,7 +493,10 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
BREAK_ON_READ_ERROR(reader);
if (paint && text.text()) {
- canvas->drawPosTextH(text.text(), text.length(), xpos, constY, *paint);
+ SkFont font = SkFont::LEGACY_ExtractFromPaint(*paint);
+ auto blob = SkTextBlob::MakeFromPosTextH(text.text(), text.length(), xpos, constY,
+ font, paint->getTextEncoding());
+ canvas->drawTextBlob(blob, 0, 0, *paint);
}
} break;
case DRAW_POS_TEXT_H_TOP_BOTTOM: {
@@ -504,7 +513,10 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
const SkScalar constY = *xpos++;
SkRect clip = canvas->getLocalClipBounds();
if (top < clip.fBottom && bottom > clip.fTop && paint && text.text()) {
- canvas->drawPosTextH(text.text(), text.length(), xpos, constY, *paint);
+ SkFont font = SkFont::LEGACY_ExtractFromPaint(*paint);
+ auto blob = SkTextBlob::MakeFromPosTextH(text.text(), text.length(), xpos, constY,
+ font, paint->getTextEncoding());
+ canvas->drawTextBlob(blob, 0, 0, *paint);
}
} break;
case DRAW_RECT: {
diff --git a/tests/DrawTextTest.cpp b/tests/DrawTextTest.cpp
index ac13140507..d64a87b65b 100644
--- a/tests/DrawTextTest.cpp
+++ b/tests/DrawTextTest.cpp
@@ -64,55 +64,6 @@ static bool compare(const SkBitmap& ref, const SkIRect& iref,
return true;
}
-DEF_TEST(DrawText, reporter) {
- SkPaint paint;
- paint.setColor(SK_ColorGRAY);
- paint.setTextSize(SkIntToScalar(20));
-
- SkIRect drawTextRect = SkIRect::MakeWH(64, 64);
- SkBitmap drawTextBitmap;
- create(&drawTextBitmap, drawTextRect);
- SkCanvas drawTextCanvas(drawTextBitmap);
-
- SkIRect drawPosTextRect = SkIRect::MakeWH(64, 64);
- SkBitmap drawPosTextBitmap;
- create(&drawPosTextBitmap, drawPosTextRect);
- SkCanvas drawPosTextCanvas(drawPosTextBitmap);
-
- // Two test cases "A" for the normal path through the code, and " " to check the
- // early return path.
- const char* cases[] = {"A", " "};
- for (auto c : cases) {
- for (float offsetY = 0.0f; offsetY < 1.0f; offsetY += (1.0f / 16.0f)) {
- for (float offsetX = 0.0f; offsetX < 1.0f; offsetX += (1.0f / 16.0f)) {
- SkPoint point = SkPoint::Make(25.0f + offsetX,
- 25.0f + offsetY);
-
- for (unsigned int flags = 0; flags < (1 << 3); ++flags) {
- static const unsigned int antiAliasFlag = 1;
- static const unsigned int subpixelFlag = 1 << 1;
- static const unsigned int lcdFlag = 1 << 2;
-
- paint.setAntiAlias(SkToBool(flags & antiAliasFlag));
- paint.setSubpixelText(SkToBool(flags & subpixelFlag));
- paint.setLCDRenderText(SkToBool(flags & lcdFlag));
-
- // Test: drawText and drawPosText draw the same.
- drawBG(&drawTextCanvas);
- drawTextCanvas.drawText(c, 1, point.fX, point.fY, paint);
-
- drawBG(&drawPosTextCanvas);
- drawPosTextCanvas.drawPosText(c, 1, &point, paint);
-
- REPORTER_ASSERT(reporter,
- compare(drawTextBitmap, drawTextRect,
- drawPosTextBitmap, drawPosTextRect));
- }
- }
- }
- }
-}
-
/** Test that drawing glyphs with empty paths is different from drawing glyphs without paths. */
DEF_TEST(DrawText_dashout, reporter) {
SkIRect size = SkIRect::MakeWH(64, 64);
diff --git a/tests/FontHostStreamTest.cpp b/tests/FontHostStreamTest.cpp
index df54f3610a..343a68c70f 100644
--- a/tests/FontHostStreamTest.cpp
+++ b/tests/FontHostStreamTest.cpp
@@ -8,6 +8,7 @@
#include "SkBitmap.h"
#include "SkCanvas.h"
#include "SkColor.h"
+#include "SkFont.h"
#include "SkFontDescriptor.h"
#include "SkGraphics.h"
#include "SkPaint.h"
@@ -65,9 +66,8 @@ DEF_TEST(FontHostStream, reporter) {
{
SkPaint paint;
paint.setColor(SK_ColorGRAY);
- paint.setTextSize(SkIntToScalar(30));
- paint.setTypeface(SkTypeface::MakeFromName("Georgia", SkFontStyle()));
+ SkFont font(SkTypeface::MakeFromName("Georgia", SkFontStyle()), 30);
SkIRect origRect = SkIRect::MakeWH(64, 64);
SkBitmap origBitmap;
@@ -83,7 +83,7 @@ DEF_TEST(FontHostStream, reporter) {
// Test: origTypeface and streamTypeface from orig data draw the same
drawBG(&origCanvas);
- origCanvas.drawString("A", point.fX, point.fY, paint);
+ origCanvas.drawSimpleText("A", 1, kUTF8_SkTextEncoding, point.fX, point.fY, font, paint);
sk_sp<SkTypeface> typeface = SkPaintPriv::RefTypefaceOrDefault(paint);
int ttcIndex;
@@ -103,7 +103,7 @@ DEF_TEST(FontHostStream, reporter) {
paint.setTypeface(streamTypeface);
drawBG(&streamCanvas);
- streamCanvas.drawPosText("A", 1, &point, paint);
+ streamCanvas.drawSimpleText("A", 1, kUTF8_SkTextEncoding, point.fX, point.fY, font, paint);
REPORTER_ASSERT(reporter,
compare(origBitmap, origRect, streamBitmap, streamRect));
diff --git a/tests/SVGDeviceTest.cpp b/tests/SVGDeviceTest.cpp
index 92070abce8..0a02f7c3fd 100644
--- a/tests/SVGDeviceTest.cpp
+++ b/tests/SVGDeviceTest.cpp
@@ -114,12 +114,14 @@ void test_whitespace_pos(skiatest::Reporter* reporter,
SkDOM dom;
SkPaint paint;
+ SkFont font;
SkPoint offset = SkPoint::Make(10, 20);
{
SkXMLParserWriter writer(dom.beginParsing());
std::unique_ptr<SkCanvas> svgCanvas = SkSVGCanvas::Make(SkRect::MakeWH(100, 100), &writer);
- svgCanvas->drawText(txt, len, offset.x(), offset.y(), paint);
+ svgCanvas->drawSimpleText(txt, len, kUTF8_SkTextEncoding, offset.x(), offset.y(),
+ font, paint);
}
check_text_node(reporter, dom, dom.finishParsing(), offset, 2, expected);
@@ -131,7 +133,8 @@ void test_whitespace_pos(skiatest::Reporter* reporter,
SkXMLParserWriter writer(dom.beginParsing());
std::unique_ptr<SkCanvas> svgCanvas = SkSVGCanvas::Make(SkRect::MakeWH(100, 100), &writer);
- svgCanvas->drawPosTextH(txt, len, xpos, offset.y(), paint);
+ auto blob = SkTextBlob::MakeFromPosTextH(txt, len, &xpos[0], offset.y(), font);
+ svgCanvas->drawTextBlob(blob, 0, 0, paint);
}
check_text_node(reporter, dom, dom.finishParsing(), offset, 2, expected);
@@ -142,8 +145,8 @@ void test_whitespace_pos(skiatest::Reporter* reporter,
}
SkXMLParserWriter writer(dom.beginParsing());
- std::unique_ptr<SkCanvas> svgCanvas = SkSVGCanvas::Make(SkRect::MakeWH(100, 100), &writer);
- svgCanvas->drawPosText(txt, len, pos, paint);
+ auto blob = SkTextBlob::MakeFromPosTextH(txt, len, &pos[0], font);
+ svgCanvas->drawTextBlob(blob, 0, 0, paint);
}
check_text_node(reporter, dom, dom.finishParsing(), offset, 2, expected);
}
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
index 3f8f48b3e7..d142cee4b0 100644
--- a/tests/SurfaceTest.cpp
+++ b/tests/SurfaceTest.cpp
@@ -409,19 +409,6 @@ static void test_copy_on_write(skiatest::Reporter* reporter, SkSurface* surface)
testRRect.setRectXY(testRect, SK_Scalar1, SK_Scalar1);
SkString testText("Hello World");
- const SkPoint testPoints2[] = {
- { SkIntToScalar(0), SkIntToScalar(1) },
- { SkIntToScalar(1), SkIntToScalar(1) },
- { SkIntToScalar(2), SkIntToScalar(1) },
- { SkIntToScalar(3), SkIntToScalar(1) },
- { SkIntToScalar(4), SkIntToScalar(1) },
- { SkIntToScalar(5), SkIntToScalar(1) },
- { SkIntToScalar(6), SkIntToScalar(1) },
- { SkIntToScalar(7), SkIntToScalar(1) },
- { SkIntToScalar(8), SkIntToScalar(1) },
- { SkIntToScalar(9), SkIntToScalar(1) },
- { SkIntToScalar(10), SkIntToScalar(1) },
- };
#define EXPECT_COPY_ON_WRITE(command) \
{ \
@@ -444,9 +431,8 @@ static void test_copy_on_write(skiatest::Reporter* reporter, SkSurface* surface)
EXPECT_COPY_ON_WRITE(drawBitmap(testBitmap, 0, 0))
EXPECT_COPY_ON_WRITE(drawBitmapRect(testBitmap, testRect, nullptr))
EXPECT_COPY_ON_WRITE(drawBitmapNine(testBitmap, testIRect, testRect, nullptr))
- EXPECT_COPY_ON_WRITE(drawString(testText, 0, 1, testPaint))
- EXPECT_COPY_ON_WRITE(drawPosText(testText.c_str(), testText.size(), testPoints2, \
- testPaint))
+ EXPECT_COPY_ON_WRITE(drawSimpleText(testText.c_str(), testText.size(), kUTF8_SkTextEncoding, \
+ 0, 1, SkFont(), testPaint))
}
DEF_TEST(SurfaceCopyOnWrite, reporter) {
test_copy_on_write(reporter, create_surface().get());