coloremoji_blendmodes.cpp revision 2ad1aa67c6894696cdd65ec56057f81031d1c24a
1ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel/*
2ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel * Copyright 2014 Google Inc.
3ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel *
4ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel * Use of this source code is governed by a BSD-style license that can be
5ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel * found in the LICENSE file.
6ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel */
7ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "gm.h"
8ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkBitmap.h"
9ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkGradientShader.h"
10ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkShader.h"
11ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkXfermode.h"
12ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "../src/fonts/SkGScalerContext.h"
13ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
14ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielnamespace skiagm {
15ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
16ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielstatic uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
17ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
18ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielclass ColorTypeXfermodeGM : public GM {
19ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielpublic:
20ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    const static int W = 64;
21ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    const static int H = 64;
22b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen    ColorTypeXfermodeGM()
2396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        : fColorType(nullptr) {
24b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen    }
25b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen
26b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen    virtual ~ColorTypeXfermodeGM() {
27b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen        SkSafeUnref(fColorType);
28b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen    }
29b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen
30b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunenprotected:
31b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen    void onOnceBeforeDraw() override {
32ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const SkColor colors[] = {
33ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
34ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW
35ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        };
36ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkMatrix local;
37ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        local.setRotate(180);
38ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkPaint paint;
39ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        paint.setAntiAlias(true);
402ad1aa67c6894696cdd65ec56057f81031d1c24areed        paint.setShader(SkGradientShader::MakeSweep(0, 0, colors, nullptr, SK_ARRAY_COUNT(colors),
412ad1aa67c6894696cdd65ec56057f81031d1c24areed                                                    0, &local));
42ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
432ad1aa67c6894696cdd65ec56057f81031d1c24areed        SkTypeface* orig = sk_tool_utils::create_portable_typeface("serif", SkTypeface::kBold);
4496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == orig) {
45ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            orig = SkTypeface::RefDefault();
46ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        }
47385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary        fColorType = new SkGTypeface(orig, paint);
48ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        orig->unref();
49ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
50b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen        fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType,
51b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen                                            kOpaque_SkAlphaType), gData, 4);
52ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    }
53ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
5436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    virtual SkString onShortName() override {
55ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        return SkString("colortype_xfermodes");
56ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    }
57ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
5836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    virtual SkISize onISize() override {
59ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        return SkISize::Make(400, 640);
60ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    }
61ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
6236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    virtual void onDraw(SkCanvas* canvas) override {
63ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
64ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
65ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const struct {
66ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SkXfermode::Mode  fMode;
67ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            const char*       fLabel;
68ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        } gModes[] = {
69ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kClear_Mode,        "Clear"       },
70ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kSrc_Mode,          "Src"         },
71ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kDst_Mode,          "Dst"         },
72ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kSrcOver_Mode,      "SrcOver"     },
73ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kDstOver_Mode,      "DstOver"     },
74ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kSrcIn_Mode,        "SrcIn"       },
75ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kDstIn_Mode,        "DstIn"       },
76ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kSrcOut_Mode,       "SrcOut"      },
77ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kDstOut_Mode,       "DstOut"      },
78ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kSrcATop_Mode,      "SrcATop"     },
79ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kDstATop_Mode,      "DstATop"     },
80ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
81ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kXor_Mode,          "Xor"         },
82ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kPlus_Mode,         "Plus"        },
83ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kModulate_Mode,     "Modulate"    },
84ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kScreen_Mode,       "Screen"      },
85ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kOverlay_Mode,      "Overlay"     },
86ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kDarken_Mode,       "Darken"      },
87ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kLighten_Mode,      "Lighten"     },
88ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kColorDodge_Mode,   "ColorDodge"  },
89ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kColorBurn_Mode,    "ColorBurn"   },
90ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kHardLight_Mode,    "HardLight"   },
91ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kSoftLight_Mode,    "SoftLight"   },
92ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kDifference_Mode,   "Difference"  },
93ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kExclusion_Mode,    "Exclusion"   },
94ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kMultiply_Mode,     "Multiply"    },
95ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kHue_Mode,          "Hue"         },
96ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kSaturation_Mode,   "Saturation"  },
97ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kColor_Mode,        "Color"       },
98ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            { SkXfermode::kLuminosity_Mode,   "Luminosity"  },
99ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        };
100ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
101ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const SkScalar w = SkIntToScalar(W);
102ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const SkScalar h = SkIntToScalar(H);
103ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkMatrix m;
104ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
1052ad1aa67c6894696cdd65ec56057f81031d1c24areed        auto s = SkShader::MakeBitmapShader(fBG, SkShader::kRepeat_TileMode,
1062ad1aa67c6894696cdd65ec56057f81031d1c24areed                                            SkShader::kRepeat_TileMode, &m);
107ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
108ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkPaint labelP;
109ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        labelP.setAntiAlias(true);
1101818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&labelP);
111ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        labelP.setTextAlign(SkPaint::kCenter_Align);
112ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
113ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkPaint textP;
114ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        textP.setAntiAlias(true);
115ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        textP.setTypeface(fColorType);
116ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        textP.setTextSize(SkIntToScalar(70));
117ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
118ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const int W = 5;
119ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
120ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkScalar x0 = 0;
121ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkScalar y0 = 0;
122ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkScalar x = x0, y = y0;
123ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
124ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
125ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SkAutoUnref aur(mode);
126ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SkRect r;
127ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            r.set(x, y, x+w, y+h);
128ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
129ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SkPaint p;
130ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            p.setStyle(SkPaint::kFill_Style);
131ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            p.setShader(s);
132ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            canvas->drawRect(r, p);
133ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
134ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
135ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            p.setStyle(SkPaint::kStroke_Style);
13696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            p.setShader(nullptr);
137ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            canvas->drawRect(r, p);
138ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
139ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            textP.setXfermode(mode);
140ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            canvas->drawText("H", 1, x+ w/10.f, y + 7.f*h/8.f, textP);
141ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#if 1
142ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel),
143ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel                             x + w/2, y - labelP.getTextSize()/2, labelP);
144ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#endif
145ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            x += w + SkIntToScalar(10);
146ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            if ((i % W) == W - 1) {
147ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel                x = x0;
148ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel                y += h + SkIntToScalar(30);
149ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            }
150ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        }
151ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    }
152ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
153ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielprivate:
154b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen    SkBitmap    fBG;
155ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    SkTypeface* fColorType;
156ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
157ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    typedef GM INHERITED;
158ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel};
159ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
160ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel//////////////////////////////////////////////////////////////////////////////
161ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
162ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielstatic GM* MyFactory(void*) { return new ColorTypeXfermodeGM; }
163ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielstatic GMRegistry reg(MyFactory);
164ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
165ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel}
166