Chromium Code Reviews| Index: gm/lcdoverlap.cpp |
| diff --git a/gm/lcdoverlap.cpp b/gm/lcdoverlap.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..21c17b13cfff2ecea8afeee00e41bc8191556929 |
| --- /dev/null |
| +++ b/gm/lcdoverlap.cpp |
| @@ -0,0 +1,100 @@ |
| +/* |
| + * Copyright 2015 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| + |
| +/* |
| + * Tests text rendering with LCD and the various blend modes. |
|
egdaniel
2015/09/18 18:54:36
update comment here
|
| + */ |
| + |
| +#include "gm.h" |
| +#include "SkCanvas.h" |
| +#include "SkSurface.h" |
| +#include "SkTextBlob.h" |
| + |
| +namespace skiagm { |
| + |
| +static const int kWidth = 750; |
| +static const int kHeight = 750; |
| + |
| +class LcdOverlapGM : public skiagm::GM { |
| +public: |
| + LcdOverlapGM() { |
| + const int kPointSize = 25; |
| + fTextHeight = SkIntToScalar(kPointSize); |
| + } |
| + |
| +protected: |
| + SkString onShortName() override { |
| + return SkString("lcdoverlap"); |
| + } |
| + |
| + void onOnceBeforeDraw() override { |
| + // build text blob |
| + SkTextBlobBuilder builder; |
| + |
| + SkPaint paint; |
| + sk_tool_utils::set_portable_typeface(&paint); |
| + paint.setTextSize(32); |
| + const char* text = "able was I ere I saw elba"; |
| + paint.setAntiAlias(true); |
| + paint.setSubpixelText(true); |
| + paint.setLCDRenderText(true); |
| + sk_tool_utils::add_to_text_blob(&builder, text, paint, 0, 0); |
| + fBlob.reset(builder.build()); |
| + } |
| + |
| + SkISize onISize() override { return SkISize::Make(kWidth, kHeight); } |
| + |
| + void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkXfermode::Mode mode, |
| + SkXfermode::Mode mode2) { |
| + const SkColor colors[] { |
| + SK_ColorRED, |
| + SK_ColorGREEN, |
| + SK_ColorBLUE, |
| + SK_ColorYELLOW, |
| + SK_ColorCYAN, |
| + SK_ColorMAGENTA, |
| + }; |
| + |
| + SkAutoTUnref<SkXfermode> xfermode(SkXfermode::Create(mode)); |
| + SkAutoTUnref<SkXfermode> xfermode2(SkXfermode::Create(mode2)); |
| + for (size_t i = 0; i < SK_ARRAY_COUNT(colors); i++) { |
| + canvas->save(); |
| + canvas->translate(x, y); |
| + canvas->rotate(360.0 / SK_ARRAY_COUNT(colors) * i); |
| + canvas->translate(-fBlob->bounds().width() / 2.0 + 0.5, 0); |
| + |
| + SkPaint textPaint; |
| + textPaint.setColor(colors[i]); |
| + textPaint.setXfermode(i % 2 == 0 ? xfermode : xfermode2); |
| + canvas->drawTextBlob(fBlob, 0, 0, textPaint); |
| + canvas->restore(); |
| + } |
| + } |
| + |
| + void onDraw(SkCanvas* canvas) override { |
| + SkScalar offsetX = kWidth / 4.0; |
| + SkScalar offsetY = kHeight / 4.0; |
| + drawTestCase(canvas, offsetX, offsetY, SkXfermode::kSrc_Mode, SkXfermode::kSrc_Mode); |
| + drawTestCase(canvas, 3 * offsetX, offsetY, SkXfermode::kSrcOver_Mode, |
| + SkXfermode::kSrcOver_Mode); |
| + drawTestCase(canvas, offsetX, 3 * offsetY, SkXfermode::kHardLight_Mode, |
| + SkXfermode::kLuminosity_Mode); |
| + drawTestCase(canvas, 3 * offsetX, 3 * offsetY, SkXfermode::kSrcOver_Mode, |
| + SkXfermode::kSrc_Mode); |
| + } |
| + |
| +private: |
| + SkScalar fTextHeight; |
| + SkAutoTUnref<const SkTextBlob> fBlob; |
| + typedef skiagm::GM INHERITED; |
| +}; |
| + |
| +////////////////////////////////////////////////////////////////////////////// |
| + |
| +DEF_GM( return new LcdOverlapGM; ) |
| +} |