123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /*
- * Copyright 2014 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #include "gm/gm.h"
- #include "include/core/SkBitmap.h"
- #include "include/core/SkBlendMode.h"
- #include "include/core/SkCanvas.h"
- #include "include/core/SkColor.h"
- #include "include/core/SkFont.h"
- #include "include/core/SkFontStyle.h"
- #include "include/core/SkFontTypes.h"
- #include "include/core/SkImageInfo.h"
- #include "include/core/SkMatrix.h"
- #include "include/core/SkPaint.h"
- #include "include/core/SkRect.h"
- #include "include/core/SkRefCnt.h"
- #include "include/core/SkScalar.h"
- #include "include/core/SkShader.h"
- #include "include/core/SkSize.h"
- #include "include/core/SkString.h"
- #include "include/core/SkTileMode.h"
- #include "include/core/SkTypeface.h"
- #include "include/core/SkTypes.h"
- #include "include/effects/SkGradientShader.h"
- #include "include/utils/SkTextUtils.h"
- #include "src/utils/SkUTF.h"
- #include "tools/ToolUtils.h"
- #include <string.h>
- namespace {
- static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
- class ColorEmojiBlendModesGM : public skiagm::GM {
- public:
- const static int W = 64;
- const static int H = 64;
- ColorEmojiBlendModesGM() {}
- protected:
- void onOnceBeforeDraw() override {
- const SkColor colors[] = {
- SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
- SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW
- };
- SkMatrix local;
- local.setRotate(180);
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setShader(SkGradientShader::MakeSweep(0, 0, colors, nullptr, SK_ARRAY_COUNT(colors),
- 0, &local));
- sk_sp<SkTypeface> orig(ToolUtils::create_portable_typeface("serif", SkFontStyle::Bold()));
- if (nullptr == orig) {
- orig = SkTypeface::MakeDefault();
- }
- fColorType = ToolUtils::emoji_typeface();
- fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType,
- kOpaque_SkAlphaType), gData, 4);
- }
- SkString onShortName() override {
- return SkString("coloremoji_blendmodes");
- }
- SkISize onISize() override {
- return {400, 640};
- }
- void onDraw(SkCanvas* canvas) override {
- canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
- const SkBlendMode gModes[] = {
- SkBlendMode::kClear,
- SkBlendMode::kSrc,
- SkBlendMode::kDst,
- SkBlendMode::kSrcOver,
- SkBlendMode::kDstOver,
- SkBlendMode::kSrcIn,
- SkBlendMode::kDstIn,
- SkBlendMode::kSrcOut,
- SkBlendMode::kDstOut,
- SkBlendMode::kSrcATop,
- SkBlendMode::kDstATop,
- SkBlendMode::kXor,
- SkBlendMode::kPlus,
- SkBlendMode::kModulate,
- SkBlendMode::kScreen,
- SkBlendMode::kOverlay,
- SkBlendMode::kDarken,
- SkBlendMode::kLighten,
- SkBlendMode::kColorDodge,
- SkBlendMode::kColorBurn,
- SkBlendMode::kHardLight,
- SkBlendMode::kSoftLight,
- SkBlendMode::kDifference,
- SkBlendMode::kExclusion,
- SkBlendMode::kMultiply,
- SkBlendMode::kHue,
- SkBlendMode::kSaturation,
- SkBlendMode::kColor,
- SkBlendMode::kLuminosity,
- };
- const SkScalar w = SkIntToScalar(W);
- const SkScalar h = SkIntToScalar(H);
- SkMatrix m;
- m.setScale(SkIntToScalar(6), SkIntToScalar(6));
- auto s = fBG.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, &m);
- SkFont labelFont(ToolUtils::create_portable_typeface());
- SkPaint textP;
- textP.setAntiAlias(true);
- SkFont textFont(fColorType, 70);
- const int W = 5;
- SkScalar x0 = 0;
- SkScalar y0 = 0;
- SkScalar x = x0, y = y0;
- for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
- SkRect r;
- r.set(x, y, x+w, y+h);
- SkPaint p;
- p.setStyle(SkPaint::kFill_Style);
- p.setShader(s);
- canvas->drawRect(r, p);
- r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
- p.setStyle(SkPaint::kStroke_Style);
- p.setShader(nullptr);
- canvas->drawRect(r, p);
- {
- SkAutoCanvasRestore arc(canvas, true);
- canvas->clipRect(r);
- textP.setBlendMode(gModes[i]);
- const char* text = ToolUtils::emoji_sample_text();
- SkUnichar unichar = SkUTF::NextUTF8(&text, text + strlen(text));
- SkASSERT(unichar >= 0);
- canvas->drawSimpleText(&unichar, 4, SkTextEncoding::kUTF32,
- x+ w/10.f, y + 7.f*h/8.f, textFont, textP);
- }
- #if 1
- const char* label = SkBlendMode_Name(gModes[i]);
- SkTextUtils::DrawString(canvas, label, x + w/2, y - labelFont.getSize()/2,
- labelFont, SkPaint(), SkTextUtils::kCenter_Align);
- #endif
- x += w + SkIntToScalar(10);
- if ((i % W) == W - 1) {
- x = x0;
- y += h + SkIntToScalar(30);
- }
- }
- }
- private:
- SkBitmap fBG;
- sk_sp<SkTypeface> fColorType;
- typedef GM INHERITED;
- };
- } // namespace
- DEF_GM( return new ColorEmojiBlendModesGM; )
|