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 (int align = 0; align < SkPaint::kAlignCount; ++align) { paint.setTextAlign(static_cast<SkPaint::Align>(align)); 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)); } } } } } }
static void test_drawText(skiatest::Reporter* reporter) { SkPaint paint; paint.setColor(SK_ColorGRAY); paint.setTextSize(SkIntToScalar(20)); SkIRect drawTextRect = SkIRect::MakeWH(64, 64); SkBitmap drawTextBitmap; create(&drawTextBitmap, drawTextRect, SkBitmap::kARGB_8888_Config); SkCanvas drawTextCanvas(drawTextBitmap); SkIRect drawPosTextRect = SkIRect::MakeWH(64, 64); SkBitmap drawPosTextBitmap; create(&drawPosTextBitmap, drawPosTextRect, SkBitmap::kARGB_8888_Config); SkCanvas drawPosTextCanvas(drawPosTextBitmap); 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(SkFloatToScalar(25.0f + offsetX), SkFloatToScalar(25.0f + offsetY)); for (int align = 0; align < SkPaint::kAlignCount; ++align) { paint.setTextAlign(static_cast<SkPaint::Align>(align)); 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("A", 1, point.fX, point.fY, paint); drawBG(&drawPosTextCanvas); drawPosTextCanvas.drawPosText("A", 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); SkBitmap drawTextBitmap; create(&drawTextBitmap, size); SkCanvas drawTextCanvas(drawTextBitmap); SkBitmap drawDashedTextBitmap; create(&drawDashedTextBitmap, size); SkCanvas drawDashedTextCanvas(drawDashedTextBitmap); SkBitmap emptyBitmap; create(&emptyBitmap, size); SkCanvas emptyCanvas(emptyBitmap); SkPoint point = SkPoint::Make(25.0f, 25.0f); SkPaint paint; paint.setColor(SK_ColorGRAY); paint.setTextSize(SkIntToScalar(20)); paint.setAntiAlias(true); paint.setSubpixelText(true); paint.setLCDRenderText(true); paint.setStyle(SkPaint::kStroke_Style); // Draw a stroked "A" without a dash which will draw something. drawBG(&drawTextCanvas); drawTextCanvas.drawText("A", 1, point.fX, point.fY, paint); // Draw an "A" but with a dash which will never draw anything. paint.setStrokeWidth(2); constexpr SkScalar bigInterval = 10000; static constexpr SkScalar intervals[] = { 1, bigInterval }; paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 2)); drawBG(&drawDashedTextCanvas); drawDashedTextCanvas.drawText("A", 1, point.fX, point.fY, paint); // Draw nothing. drawBG(&emptyCanvas); REPORTER_ASSERT(reporter, !compare(drawTextBitmap, size, emptyBitmap, size)); REPORTER_ASSERT(reporter, compare(drawDashedTextBitmap, size, emptyBitmap, size)); }