1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "gm/gm.h" 9 #include "include/core/SkBlendMode.h" 10 #include "include/core/SkCanvas.h" 11 #include "include/core/SkColor.h" 12 #include "include/core/SkFont.h" 13 #include "include/core/SkPaint.h" 14 #include "include/core/SkRect.h" 15 #include "include/core/SkRefCnt.h" 16 #include "include/core/SkScalar.h" 17 #include "include/core/SkSize.h" 18 #include "include/core/SkString.h" 19 #include "include/core/SkTextBlob.h" 20 #include "include/core/SkTypeface.h" 21 #include "include/core/SkTypes.h" 22 #include "tools/ToolUtils.h" 23 24 namespace skiagm { 25 26 constexpr int kWidth = 750; 27 constexpr int kHeight = 750; 28 29 class LcdOverlapGM : public skiagm::GM { 30 public: LcdOverlapGM()31 LcdOverlapGM() { 32 const int kPointSize = 25; 33 fTextHeight = SkIntToScalar(kPointSize); 34 } 35 36 protected: onShortName()37 SkString onShortName() override { 38 return SkString("lcdoverlap"); 39 } 40 onOnceBeforeDraw()41 void onOnceBeforeDraw() override { 42 // build text blob 43 SkTextBlobBuilder builder; 44 45 SkFont font(ToolUtils::create_portable_typeface(), 32); 46 const char* text = "able was I ere I saw elba"; 47 font.setSubpixel(true); 48 font.setEdging(SkFont::Edging::kSubpixelAntiAlias); 49 ToolUtils::add_to_text_blob(&builder, text, font, 0, 0); 50 fBlob = builder.make(); 51 } 52 onISize()53 SkISize onISize() override { return SkISize::Make(kWidth, kHeight); } 54 drawTestCase(SkCanvas * canvas,SkScalar x,SkScalar y,SkBlendMode mode,SkBlendMode mode2)55 void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkBlendMode mode, 56 SkBlendMode mode2) { 57 const SkColor colors[] { 58 SK_ColorRED, 59 SK_ColorGREEN, 60 SK_ColorBLUE, 61 SK_ColorYELLOW, 62 SK_ColorCYAN, 63 SK_ColorMAGENTA, 64 }; 65 66 for (size_t i = 0; i < std::size(colors); i++) { 67 canvas->save(); 68 canvas->translate(x, y); 69 canvas->rotate(360.0f / std::size(colors) * i); 70 canvas->translate(-fBlob->bounds().width() / 2.0f - fBlob->bounds().left() + 0.5f, 0); 71 72 SkPaint textPaint; 73 textPaint.setColor(colors[i]); 74 textPaint.setBlendMode(i % 2 == 0 ? mode : mode2); 75 canvas->drawTextBlob(fBlob, 0, 0, textPaint); 76 canvas->restore(); 77 } 78 } 79 onDraw(SkCanvas * canvas)80 void onDraw(SkCanvas* canvas) override { 81 SkScalar offsetX = kWidth / 4.0f; 82 SkScalar offsetY = kHeight / 4.0f; 83 drawTestCase(canvas, offsetX, offsetY, SkBlendMode::kSrc, SkBlendMode::kSrc); 84 drawTestCase(canvas, 3 * offsetX, offsetY, SkBlendMode::kSrcOver, SkBlendMode::kSrcOver); 85 drawTestCase(canvas, offsetX, 3 * offsetY, SkBlendMode::kHardLight, 86 SkBlendMode::kLuminosity); 87 drawTestCase(canvas, 3 * offsetX, 3 * offsetY, SkBlendMode::kSrcOver, SkBlendMode::kSrc); 88 } 89 90 private: 91 SkScalar fTextHeight; 92 sk_sp<SkTextBlob> fBlob; 93 using INHERITED = skiagm::GM; 94 }; 95 96 ////////////////////////////////////////////////////////////////////////////// 97 98 DEF_GM( return new LcdOverlapGM; ) 99 } // namespace skiagm 100