drawText Cleanup, part 3

Change-Id: I17bdc317b2f22bb3d4c33785aa2163e8beb3b280
Reviewed-on: https://skia-review.googlesource.com/c/182201
Auto-Submit: Hal Canary <halcanary@google.com>
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Mike Reed <reed@google.com>
This commit is contained in:
Hal Canary 2019-01-08 13:01:58 -05:00 committed by Skia Commit-Bot
parent 4484b8f1e3
commit 3560ea702f
7 changed files with 111 additions and 149 deletions

View File

@ -29,10 +29,6 @@ static void create(SkBitmap* bm, SkIRect bound) {
bm->allocN32Pixels(bound.width(), bound.height()); bm->allocN32Pixels(bound.width(), bound.height());
} }
static void drawBG(SkCanvas* canvas) {
canvas->drawColor(bgColor);
}
/** Assumes that the ref draw was completely inside ref canvas -- /** Assumes that the ref draw was completely inside ref canvas --
implies that everything outside is "bgColor". implies that everything outside is "bgColor".
Checks that all overlap is the same and that all non-overlap on the Checks that all overlap is the same and that all non-overlap on the
@ -82,17 +78,17 @@ DEF_TEST(DrawText_dashout, reporter) {
SkCanvas emptyCanvas(emptyBitmap); SkCanvas emptyCanvas(emptyBitmap);
SkPoint point = SkPoint::Make(25.0f, 25.0f); SkPoint point = SkPoint::Make(25.0f, 25.0f);
SkFont font(nullptr, 20);
font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
font.setSubpixel(true);
SkPaint paint; SkPaint paint;
paint.setColor(SK_ColorGRAY); paint.setColor(SK_ColorGRAY);
paint.setTextSize(SkIntToScalar(20));
paint.setAntiAlias(true);
paint.setSubpixelText(true);
paint.setLCDRenderText(true);
paint.setStyle(SkPaint::kStroke_Style); paint.setStyle(SkPaint::kStroke_Style);
// Draw a stroked "A" without a dash which will draw something. // Draw a stroked "A" without a dash which will draw something.
drawBG(&drawTextCanvas); drawTextCanvas.drawColor(SK_ColorWHITE);
drawTextCanvas.drawText("A", 1, point.fX, point.fY, paint); drawTextCanvas.drawString("A", point.fX, point.fY, font, paint);
// Draw an "A" but with a dash which will never draw anything. // Draw an "A" but with a dash which will never draw anything.
paint.setStrokeWidth(2); paint.setStrokeWidth(2);
@ -100,11 +96,11 @@ DEF_TEST(DrawText_dashout, reporter) {
static constexpr SkScalar intervals[] = { 1, bigInterval }; static constexpr SkScalar intervals[] = { 1, bigInterval };
paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 2)); paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 2));
drawBG(&drawDashedTextCanvas); drawDashedTextCanvas.drawColor(SK_ColorWHITE);
drawDashedTextCanvas.drawText("A", 1, point.fX, point.fY, paint); drawDashedTextCanvas.drawString("A", point.fX, point.fY, font, paint);
// Draw nothing. // Draw nothing.
drawBG(&emptyCanvas); emptyCanvas.drawColor(SK_ColorWHITE);
REPORTER_ASSERT(reporter, !compare(drawTextBitmap, size, emptyBitmap, size)); REPORTER_ASSERT(reporter, !compare(drawTextBitmap, size, emptyBitmap, size));
REPORTER_ASSERT(reporter, compare(drawDashedTextBitmap, size, emptyBitmap, size)); REPORTER_ASSERT(reporter, compare(drawDashedTextBitmap, size, emptyBitmap, size));

View File

@ -20,41 +20,14 @@
#include "SkTypes.h" #include "SkTypes.h"
#include "Test.h" #include "Test.h"
static const SkColor bgColor = SK_ColorWHITE; /** Checks that all is the same. */
static bool compare(const SkBitmap& ref, const SkBitmap& test) {
static void create(SkBitmap* bm, SkIRect bound) { if (ref.dimensions() != test.dimensions()) {
bm->allocN32Pixels(bound.width(), bound.height()); return false;
} }
static void drawBG(SkCanvas* canvas) {
canvas->drawColor(bgColor);
}
/** Assumes that the ref draw was completely inside ref canvas --
implies that everything outside is "bgColor".
Checks that all overlap is the same and that all non-overlap on the
ref is "bgColor".
*/
static bool compare(const SkBitmap& ref, const SkIRect& iref,
const SkBitmap& test, const SkIRect& itest)
{
const int xOff = itest.fLeft - iref.fLeft;
const int yOff = itest.fTop - iref.fTop;
for (int y = 0; y < test.height(); ++y) { for (int y = 0; y < test.height(); ++y) {
for (int x = 0; x < test.width(); ++x) { for (int x = 0; x < test.width(); ++x) {
SkColor testColor = test.getColor(x, y); if (test.getColor(x, y) != ref.getColor(x, y)) {
int refX = x + xOff;
int refY = y + yOff;
SkColor refColor;
if (refX >= 0 && refX < ref.width() &&
refY >= 0 && refY < ref.height())
{
refColor = ref.getColor(refX, refY);
} else {
refColor = bgColor;
}
if (refColor != testColor) {
return false; return false;
} }
} }
@ -62,52 +35,47 @@ static bool compare(const SkBitmap& ref, const SkIRect& iref,
return true; return true;
} }
static void draw(SkBitmap* bitmap, const SkFont& font) {
SkPaint paint;
paint.setColor(SK_ColorGRAY);
SkASSERT(bitmap);
bitmap->allocN32Pixels(64, 64);
SkCanvas canvas(*bitmap);
canvas.drawColor(SK_ColorWHITE);
canvas.drawString("A", 24, 32, font, paint);
}
DEF_TEST(FontHostStream, reporter) { DEF_TEST(FontHostStream, reporter) {
{ sk_sp<SkTypeface> typeface = SkTypeface::MakeFromName("Georgia", SkFontStyle());
SkPaint paint; if (!typeface) {
paint.setColor(SK_ColorGRAY); typeface = SkTypeface::MakeDefault();
SkFont font(SkTypeface::MakeFromName("Georgia", SkFontStyle()), 30);
SkIRect origRect = SkIRect::MakeWH(64, 64);
SkBitmap origBitmap;
create(&origBitmap, origRect);
SkCanvas origCanvas(origBitmap);
SkIRect streamRect = SkIRect::MakeWH(64, 64);
SkBitmap streamBitmap;
create(&streamBitmap, streamRect);
SkCanvas streamCanvas(streamBitmap);
SkPoint point = SkPoint::Make(24, 32);
// Test: origTypeface and streamTypeface from orig data draw the same
drawBG(&origCanvas);
origCanvas.drawSimpleText("A", 1, kUTF8_SkTextEncoding, point.fX, point.fY, font, paint);
sk_sp<SkTypeface> typeface = SkPaintPriv::RefTypefaceOrDefault(paint);
int ttcIndex;
std::unique_ptr<SkStreamAsset> fontData(typeface->openStream(&ttcIndex));
if (!fontData) {
// We're using a SkTypeface that can't give us a stream.
// This happens with portable or system fonts. End the test now.
return;
}
sk_sp<SkTypeface> streamTypeface(SkTypeface::MakeFromStream(std::move(fontData)));
SkFontDescriptor desc;
bool isLocalStream = false;
streamTypeface->getFontDescriptor(&desc, &isLocalStream);
REPORTER_ASSERT(reporter, isLocalStream);
paint.setTypeface(streamTypeface);
drawBG(&streamCanvas);
streamCanvas.drawSimpleText("A", 1, kUTF8_SkTextEncoding, point.fX, point.fY, font, paint);
REPORTER_ASSERT(reporter,
compare(origBitmap, origRect, streamBitmap, streamRect));
} }
SkFont font(typeface, 30);
SkBitmap origBitmap, streamBitmap;
// Test: origTypeface and streamTypeface from orig data draw the same
draw(&origBitmap, font);
int ttcIndex;
std::unique_ptr<SkStreamAsset> fontData(typeface->openStream(&ttcIndex));
if (!fontData) {
// We're using a SkTypeface that can't give us a stream.
// This happens with portable or system fonts. End the test now.
return;
}
sk_sp<SkTypeface> streamTypeface(SkTypeface::MakeFromStream(std::move(fontData)));
SkFontDescriptor desc;
bool isLocalStream = false;
streamTypeface->getFontDescriptor(&desc, &isLocalStream);
REPORTER_ASSERT(reporter, isLocalStream);
SkFont streamFont(streamTypeface);
draw(&streamBitmap, streamFont);
REPORTER_ASSERT(reporter, compare(origBitmap, streamBitmap));
//Make sure the typeface is deleted and removed. //Make sure the typeface is deleted and removed.
SkGraphics::PurgeFontCache(); SkGraphics::PurgeFontCache();
} }

View File

@ -5,15 +5,17 @@
* found in the LICENSE file. * found in the LICENSE file.
*/ */
#include "Test.h"
#include "Resources.h" #include "Resources.h"
#include "SkCanvas.h" #include "SkCanvas.h"
#include "SkCommandLineFlags.h" #include "SkCommandLineFlags.h"
#include "SkFixed.h" #include "SkFixed.h"
#include "SkFont.h"
#include "SkFontMgr_android.h" #include "SkFontMgr_android.h"
#include "SkFontMgr_android_parser.h" #include "SkFontMgr_android_parser.h"
#include "SkOSFile.h" #include "SkOSFile.h"
#include "SkTypeface.h" #include "SkTypeface.h"
#include "Test.h"
#include <cmath> #include <cmath>
#include <cstdio> #include <cstdio>
@ -301,17 +303,10 @@ DEF_TEST(FontMgrAndroidSystemVariableTypeface, reporter) {
SkCanvas canvasClone(bitmapClone); SkCanvas canvasClone(bitmapClone);
canvasStream.drawColor(SK_ColorWHITE); canvasStream.drawColor(SK_ColorWHITE);
SkPaint paintStream; SkPaint paint;
paintStream.setColor(SK_ColorGRAY); paint.setColor(SK_ColorGRAY);
paintStream.setTextSize(SkIntToScalar(20)); paint.setAntiAlias(true);
paintStream.setAntiAlias(true); constexpr float kTextSize = 20;
paintStream.setLCDRenderText(true);
SkPaint paintClone;
paintClone.setColor(SK_ColorGRAY);
paintClone.setTextSize(SkIntToScalar(20));
paintClone.setAntiAlias(true);
paintClone.setLCDRenderText(true);
std::unique_ptr<SkStreamAsset> distortableStream( std::unique_ptr<SkStreamAsset> distortableStream(
GetResourceAsStream("fonts/Distortable.ttf")); GetResourceAsStream("fonts/Distortable.ttf"));
@ -319,8 +314,6 @@ DEF_TEST(FontMgrAndroidSystemVariableTypeface, reporter) {
return; return;
} }
const char* text = "abc";
const size_t textLen = strlen(text);
SkPoint point = SkPoint::Make(20.0f, 20.0f); SkPoint point = SkPoint::Make(20.0f, 20.0f);
SkFourByteTag tag = SkSetFourByteTag('w', 'g', 'h', 't'); SkFourByteTag tag = SkSetFourByteTag('w', 'g', 'h', 't');
@ -332,18 +325,24 @@ DEF_TEST(FontMgrAndroidSystemVariableTypeface, reporter) {
SkFontArguments::VariationPosition SkFontArguments::VariationPosition
position = {coordinates, SK_ARRAY_COUNT(coordinates)}; position = {coordinates, SK_ARRAY_COUNT(coordinates)};
paintStream.setTypeface(sk_sp<SkTypeface>( SkFont fontStream(
fontMgr->makeFromStream(distortableStream->duplicate(), fontMgr->makeFromStream(distortableStream->duplicate(),
SkFontArguments().setVariationDesignPosition(position)))); SkFontArguments().setVariationDesignPosition(position)),
kTextSize);
fontStream.setEdging(SkFont::Edging::kSubpixelAntiAlias);
paintClone.setTypeface(sk_sp<SkTypeface>(
typeface->makeClone(SkFontArguments().setVariationDesignPosition(position)))); SkFont fontClone(
typeface->makeClone(SkFontArguments().setVariationDesignPosition(position)), kTextSize);
fontClone.setEdging(SkFont::Edging::kSubpixelAntiAlias);
constexpr char text[] = "abc";
canvasStream.drawColor(SK_ColorWHITE); canvasStream.drawColor(SK_ColorWHITE);
canvasStream.drawText(text, textLen, point.fX, point.fY, paintStream); canvasStream.drawString(text, point.fX, point.fY, fontStream, paint);
canvasClone.drawColor(SK_ColorWHITE); canvasClone.drawColor(SK_ColorWHITE);
canvasClone.drawText(text, textLen, point.fX, point.fY, paintClone); canvasClone.drawString(text, point.fX, point.fY, fontClone, paint);
bool success = bitmap_compare(bitmapStream, bitmapClone); bool success = bitmap_compare(bitmapStream, bitmapClone);
REPORTER_ASSERT(reporter, success); REPORTER_ASSERT(reporter, success);

View File

@ -7,6 +7,7 @@
#include "Resources.h" #include "Resources.h"
#include "SkCanvas.h" #include "SkCanvas.h"
#include "SkFont.h"
#include "SkFontMgr.h" #include "SkFontMgr.h"
#include "SkFontMgr_fontconfig.h" #include "SkFontMgr_fontconfig.h"
#include "SkTypeface.h" #include "SkTypeface.h"
@ -47,17 +48,10 @@ DEF_TEST(FontMgrFontConfig, reporter) {
SkCanvas canvasClone(bitmapClone); SkCanvas canvasClone(bitmapClone);
canvasStream.drawColor(SK_ColorWHITE); canvasStream.drawColor(SK_ColorWHITE);
SkPaint paintStream; SkPaint paint;
paintStream.setColor(SK_ColorGRAY); paint.setColor(SK_ColorGRAY);
paintStream.setTextSize(SkIntToScalar(20));
paintStream.setAntiAlias(true);
paintStream.setLCDRenderText(true);
SkPaint paintClone; constexpr float kTextSize = 20;
paintClone.setColor(SK_ColorGRAY);
paintClone.setTextSize(SkIntToScalar(20));
paintClone.setAntiAlias(true);
paintClone.setLCDRenderText(true);
std::unique_ptr<SkStreamAsset> distortableStream( std::unique_ptr<SkStreamAsset> distortableStream(
GetResourceAsStream("fonts/Distortable.ttf")); GetResourceAsStream("fonts/Distortable.ttf"));
@ -65,8 +59,6 @@ DEF_TEST(FontMgrFontConfig, reporter) {
return; return;
} }
const char* text = "abc";
const size_t textLen = strlen(text);
SkPoint point = SkPoint::Make(20.0f, 20.0f); SkPoint point = SkPoint::Make(20.0f, 20.0f);
SkFourByteTag tag = SkSetFourByteTag('w', 'g', 'h', 't'); SkFourByteTag tag = SkSetFourByteTag('w', 'g', 'h', 't');
@ -78,17 +70,23 @@ DEF_TEST(FontMgrFontConfig, reporter) {
SkFontArguments::VariationPosition SkFontArguments::VariationPosition
position = {coordinates, SK_ARRAY_COUNT(coordinates)}; position = {coordinates, SK_ARRAY_COUNT(coordinates)};
paintStream.setTypeface(sk_sp<SkTypeface>( SkFont fontStream(
fontMgr->makeFromStream(distortableStream->duplicate(), fontMgr->makeFromStream(distortableStream->duplicate(),
SkFontArguments().setVariationDesignPosition(position)))); SkFontArguments().setVariationDesignPosition(position)),
paintClone.setTypeface(sk_sp<SkTypeface>( kTextSize);
typeface->makeClone(SkFontArguments().setVariationDesignPosition(position)))); fontStream.setEdging(SkFont::Edging::kSubpixelAntiAlias);
SkFont fontClone(
typeface->makeClone(SkFontArguments().setVariationDesignPosition(position)), kTextSize);
fontClone.setEdging(SkFont::Edging::kSubpixelAntiAlias);
constexpr char text[] = "abc";
canvasStream.drawColor(SK_ColorWHITE); canvasStream.drawColor(SK_ColorWHITE);
canvasStream.drawText(text, textLen, point.fX, point.fY, paintStream); canvasStream.drawString(text, point.fX, point.fY, fontStream, paint);
canvasClone.drawColor(SK_ColorWHITE); canvasClone.drawColor(SK_ColorWHITE);
canvasClone.drawText(text, textLen, point.fX, point.fY, paintClone); canvasClone.drawString(text, point.fX, point.fY, fontClone, paint);
bool success = bitmap_compare(bitmapStream, bitmapClone); bool success = bitmap_compare(bitmapStream, bitmapClone);
REPORTER_ASSERT(reporter, success); REPORTER_ASSERT(reporter, success);

View File

@ -9,6 +9,7 @@
#include "SkCanvas.h" #include "SkCanvas.h"
#include "SkPDFDocument.h" #include "SkPDFDocument.h"
#include "SkStream.h" #include "SkStream.h"
#include "SkFont.h"
using PDFTag = SkPDF::StructureElementNode; using PDFTag = SkPDF::StructureElementNode;
@ -106,42 +107,42 @@ DEF_TEST(SkPDF_tagged, r) {
document->beginPage(pageSize.width(), document->beginPage(pageSize.width(),
pageSize.height()); pageSize.height());
SkPDF::SetNodeId(canvas, 2); SkPDF::SetNodeId(canvas, 2);
paint.setTextSize(36); SkFont font(nullptr, 36);
const char* message = "This is the title"; const char* message = "This is the title";
canvas->translate(72, 72); canvas->translate(72, 72);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
SkPDF::SetNodeId(canvas, 3); SkPDF::SetNodeId(canvas, 3);
paint.setTextSize(14); font.setSize(14);
message = "This is a simple paragraph."; message = "This is a simple paragraph.";
canvas->translate(0, 72); canvas->translate(0, 72);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
SkPDF::SetNodeId(canvas, 6); SkPDF::SetNodeId(canvas, 6);
paint.setTextSize(14); font.setSize(14);
message = "*"; message = "*";
canvas->translate(0, 72); canvas->translate(0, 72);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
SkPDF::SetNodeId(canvas, 7); SkPDF::SetNodeId(canvas, 7);
message = "List item 1"; message = "List item 1";
canvas->translate(36, 0); canvas->translate(36, 0);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
SkPDF::SetNodeId(canvas, 8); SkPDF::SetNodeId(canvas, 8);
message = "*"; message = "*";
canvas->translate(-36, 36); canvas->translate(-36, 36);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
SkPDF::SetNodeId(canvas, 9); SkPDF::SetNodeId(canvas, 9);
message = "List item 2"; message = "List item 2";
canvas->translate(36, 0); canvas->translate(36, 0);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
SkPDF::SetNodeId(canvas, 10); SkPDF::SetNodeId(canvas, 10);
message = "This is a paragraph that starts on one page"; message = "This is a paragraph that starts on one page";
canvas->translate(-36, 6 * 72); canvas->translate(-36, 6 * 72);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
document->endPage(); document->endPage();
@ -151,14 +152,14 @@ DEF_TEST(SkPDF_tagged, r) {
SkPDF::SetNodeId(canvas, 10); SkPDF::SetNodeId(canvas, 10);
message = "and finishes on the second page."; message = "and finishes on the second page.";
canvas->translate(72, 72); canvas->translate(72, 72);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
// This has a node ID but never shows up in the tag tree so it // This has a node ID but never shows up in the tag tree so it
// won't be tagged. // won't be tagged.
SkPDF::SetNodeId(canvas, 999); SkPDF::SetNodeId(canvas, 999);
message = "Page 2"; message = "Page 2";
canvas->translate(468, -36); canvas->translate(468, -36);
canvas->drawText(message, strlen(message), 0, 0, paint); canvas->drawString(message, 0, 0, font, paint);
document->endPage(); document->endPage();

View File

@ -182,10 +182,11 @@ static sk_sp<SkPicture> make_picture(sk_sp<SkTypeface> tf0, sk_sp<SkTypeface> tf
SkPictureRecorder rec; SkPictureRecorder rec;
SkCanvas* canvas = rec.beginRecording(100, 100); SkCanvas* canvas = rec.beginRecording(100, 100);
SkPaint paint; SkPaint paint;
paint.setTypeface(tf0); canvas->drawText("hello", 5, 0, 0, paint); SkFont font;
paint.setTypeface(tf1); canvas->drawText("hello", 5, 0, 0, paint); font.setTypeface(tf0); canvas->drawString("hello", 0, 0, font, paint);
paint.setTypeface(tf0); canvas->drawText("hello", 5, 0, 0, paint); font.setTypeface(tf1); canvas->drawString("hello", 0, 0, font, paint);
paint.setTypeface(tf1); canvas->drawText("hello", 5, 0, 0, paint); font.setTypeface(tf0); canvas->drawString("hello", 0, 0, font, paint);
font.setTypeface(tf1); canvas->drawString("hello", 0, 0, font, paint);
return rec.finishRecordingAsPicture(); return rec.finishRecordingAsPicture();
} }

View File

@ -341,11 +341,10 @@ static void compare_bitmaps(skiatest::Reporter* reporter,
static void serialize_and_compare_typeface(sk_sp<SkTypeface> typeface, const char* text, static void serialize_and_compare_typeface(sk_sp<SkTypeface> typeface, const char* text,
skiatest::Reporter* reporter) skiatest::Reporter* reporter)
{ {
// Create a paint with the typeface. // Create a font with the typeface.
SkPaint paint; SkPaint paint;
paint.setColor(SK_ColorGRAY); paint.setColor(SK_ColorGRAY);
paint.setTextSize(SkIntToScalar(30)); SkFont font(std::move(typeface), 30);
paint.setTypeface(std::move(typeface));
// Paint some text. // Paint some text.
SkPictureRecorder recorder; SkPictureRecorder recorder;
@ -354,7 +353,7 @@ static void serialize_and_compare_typeface(sk_sp<SkTypeface> typeface, const cha
SkIntToScalar(canvasRect.height()), SkIntToScalar(canvasRect.height()),
nullptr, 0); nullptr, 0);
canvas->drawColor(SK_ColorWHITE); canvas->drawColor(SK_ColorWHITE);
canvas->drawText(text, 2, 24, 32, paint); canvas->drawString(text, 24, 32, font, paint);
sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
// Serlialize picture and create its clone from stream. // Serlialize picture and create its clone from stream.
@ -392,7 +391,7 @@ static void TestPictureTypefaceSerialization(skiatest::Reporter* reporter) {
if (!typeface) { if (!typeface) {
INFOF(reporter, "Could not run fontstream test because Distortable.ttf not created."); INFOF(reporter, "Could not run fontstream test because Distortable.ttf not created.");
} else { } else {
serialize_and_compare_typeface(std::move(typeface), "abc", reporter); serialize_and_compare_typeface(std::move(typeface), "ab", reporter);
} }
} }
} }