1496d29f6b273340efa59f1077d9338688c685f1bjoshualitt/*
2496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * Copyright 2015 Google Inc.
3496d29f6b273340efa59f1077d9338688c685f1bjoshualitt *
4496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * Use of this source code is governed by a BSD-style license that can be
5496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * found in the LICENSE file.
6496d29f6b273340efa59f1077d9338688c685f1bjoshualitt */
7496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
8496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
9496d29f6b273340efa59f1077d9338688c685f1bjoshualitt/*
10496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * Tests overlapping LCD text
11496d29f6b273340efa59f1077d9338688c685f1bjoshualitt */
12496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
13496d29f6b273340efa59f1077d9338688c685f1bjoshualitt#include "gm.h"
1433d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
15496d29f6b273340efa59f1077d9338688c685f1bjoshualitt#include "SkCanvas.h"
16496d29f6b273340efa59f1077d9338688c685f1bjoshualitt#include "SkSurface.h"
17496d29f6b273340efa59f1077d9338688c685f1bjoshualitt#include "SkTextBlob.h"
18496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
19496d29f6b273340efa59f1077d9338688c685f1bjoshualittnamespace skiagm {
20496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
21dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr int kWidth = 750;
22dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr int kHeight = 750;
23496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
24496d29f6b273340efa59f1077d9338688c685f1bjoshualittclass LcdOverlapGM : public skiagm::GM {
25496d29f6b273340efa59f1077d9338688c685f1bjoshualittpublic:
26496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    LcdOverlapGM() {
27496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        const int kPointSize = 25;
28496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        fTextHeight = SkIntToScalar(kPointSize);
29496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    }
30496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
31496d29f6b273340efa59f1077d9338688c685f1bjoshualittprotected:
32496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    SkString onShortName() override {
33496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        return SkString("lcdoverlap");
34496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    }
35496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
36496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    void onOnceBeforeDraw() override {
37496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        // build text blob
38496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        SkTextBlobBuilder builder;
39496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
40496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        SkPaint paint;
41496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        sk_tool_utils::set_portable_typeface(&paint);
42496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        paint.setTextSize(32);
43496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        const char* text = "able was I ere I saw elba";
44496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        paint.setAntiAlias(true);
45496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        paint.setSubpixelText(true);
46496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        paint.setLCDRenderText(true);
47496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        sk_tool_utils::add_to_text_blob(&builder, text, paint, 0, 0);
4837283c28aa5bea2204c18956e74f83b238d7a891fmalita        fBlob = builder.make();
49496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    }
50496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
51496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    SkISize onISize() override { return SkISize::Make(kWidth, kHeight); }
52496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
53374772bd61951f01bf84fe17bf53d8867681c9aereed    void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkBlendMode mode,
54374772bd61951f01bf84fe17bf53d8867681c9aereed                      SkBlendMode mode2) {
55496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        const SkColor colors[] {
56496d29f6b273340efa59f1077d9338688c685f1bjoshualitt                SK_ColorRED,
57496d29f6b273340efa59f1077d9338688c685f1bjoshualitt                SK_ColorGREEN,
58496d29f6b273340efa59f1077d9338688c685f1bjoshualitt                SK_ColorBLUE,
59496d29f6b273340efa59f1077d9338688c685f1bjoshualitt                SK_ColorYELLOW,
60496d29f6b273340efa59f1077d9338688c685f1bjoshualitt                SK_ColorCYAN,
61496d29f6b273340efa59f1077d9338688c685f1bjoshualitt                SK_ColorMAGENTA,
62496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        };
63496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
64496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        for (size_t i = 0; i < SK_ARRAY_COUNT(colors); i++) {
65496d29f6b273340efa59f1077d9338688c685f1bjoshualitt            canvas->save();
66496d29f6b273340efa59f1077d9338688c685f1bjoshualitt            canvas->translate(x, y);
67496d29f6b273340efa59f1077d9338688c685f1bjoshualitt            canvas->rotate(360.0f / SK_ARRAY_COUNT(colors) * i);
68496d29f6b273340efa59f1077d9338688c685f1bjoshualitt            canvas->translate(-fBlob->bounds().width() / 2.0f + 0.5f, 0);
69496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
70496d29f6b273340efa59f1077d9338688c685f1bjoshualitt            SkPaint textPaint;
71496d29f6b273340efa59f1077d9338688c685f1bjoshualitt            textPaint.setColor(colors[i]);
72374772bd61951f01bf84fe17bf53d8867681c9aereed            textPaint.setBlendMode(i % 2 == 0 ? mode : mode2);
73496d29f6b273340efa59f1077d9338688c685f1bjoshualitt            canvas->drawTextBlob(fBlob, 0, 0, textPaint);
74496d29f6b273340efa59f1077d9338688c685f1bjoshualitt            canvas->restore();
75496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        }
76496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    }
77496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
78496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    void onDraw(SkCanvas* canvas) override {
79496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        SkScalar offsetX = kWidth / 4.0f;
80496d29f6b273340efa59f1077d9338688c685f1bjoshualitt        SkScalar offsetY = kHeight / 4.0f;
81374772bd61951f01bf84fe17bf53d8867681c9aereed        drawTestCase(canvas, offsetX, offsetY,  SkBlendMode::kSrc, SkBlendMode::kSrc);
82374772bd61951f01bf84fe17bf53d8867681c9aereed        drawTestCase(canvas, 3 * offsetX, offsetY,  SkBlendMode::kSrcOver, SkBlendMode::kSrcOver);
83374772bd61951f01bf84fe17bf53d8867681c9aereed        drawTestCase(canvas, offsetX, 3 * offsetY,  SkBlendMode::kHardLight,
84374772bd61951f01bf84fe17bf53d8867681c9aereed                     SkBlendMode::kLuminosity);
85374772bd61951f01bf84fe17bf53d8867681c9aereed        drawTestCase(canvas, 3 * offsetX, 3 * offsetY,  SkBlendMode::kSrcOver, SkBlendMode::kSrc);
86496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    }
87496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
88496d29f6b273340efa59f1077d9338688c685f1bjoshualittprivate:
89496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    SkScalar fTextHeight;
9037283c28aa5bea2204c18956e74f83b238d7a891fmalita    sk_sp<SkTextBlob> fBlob;
91496d29f6b273340efa59f1077d9338688c685f1bjoshualitt    typedef skiagm::GM INHERITED;
92496d29f6b273340efa59f1077d9338688c685f1bjoshualitt};
93496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
94496d29f6b273340efa59f1077d9338688c685f1bjoshualitt//////////////////////////////////////////////////////////////////////////////
95496d29f6b273340efa59f1077d9338688c685f1bjoshualitt
96496d29f6b273340efa59f1077d9338688c685f1bjoshualittDEF_GM( return new LcdOverlapGM; )
97496d29f6b273340efa59f1077d9338688c685f1bjoshualitt}
98