add new gm to test overlapping lcd text
BUG=skia:
Review URL: https://codereview.chromium.org/1358563002
diff --git a/gm/lcdoverlap.cpp b/gm/lcdoverlap.cpp
new file mode 100644
index 0000000..1777564
--- /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 overlapping LCD text
+ */
+
+#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.0f / SK_ARRAY_COUNT(colors) * i);
+ canvas->translate(-fBlob->bounds().width() / 2.0f + 0.5f, 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.0f;
+ SkScalar offsetY = kHeight / 4.0f;
+ 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; )
+}