OLD | NEW |
(Empty) | |
| 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 |
| 9 /* |
| 10 * Tests text rendering with LCD and the various blend modes. |
| 11 */ |
| 12 |
| 13 #include "gm.h" |
| 14 #include "SkCanvas.h" |
| 15 #include "SkGradientShader.h" |
| 16 |
| 17 namespace skiagm { |
| 18 |
| 19 static const int kColWidth = 180; |
| 20 static const int kNumCols = 4; |
| 21 static const int kWidth = kColWidth * kNumCols; |
| 22 static const int kHeight = 750; |
| 23 |
| 24 static SkShader* make_shader(const SkRect& bounds) { |
| 25 const SkPoint pts[] = { |
| 26 { bounds.left(), bounds.top() }, |
| 27 { bounds.right(), bounds.bottom() }, |
| 28 }; |
| 29 const SkColor colors[] = { |
| 30 SK_ColorRED, SK_ColorGREEN, |
| 31 }; |
| 32 return SkGradientShader::CreateLinear(pts, |
| 33 colors, nullptr, SK_ARRAY_COUNT(colors
), |
| 34 SkShader::kRepeat_TileMode); |
| 35 } |
| 36 |
| 37 class LcdBlendGM : public skiagm::GM { |
| 38 public: |
| 39 LcdBlendGM() { |
| 40 const int kPointSize = 25; |
| 41 fTextHeight = SkIntToScalar(kPointSize); |
| 42 } |
| 43 |
| 44 protected: |
| 45 SkString onShortName() override { |
| 46 SkString name("lcdblendmodes"); |
| 47 name.append(sk_tool_utils::major_platform_os_name()); |
| 48 return name; |
| 49 } |
| 50 |
| 51 SkISize onISize() override { return SkISize::Make(kWidth, kHeight); } |
| 52 |
| 53 void onDraw(SkCanvas* canvas) override { |
| 54 this->drawColumn(canvas, SK_ColorBLACK, SK_ColorWHITE, false); |
| 55 canvas->translate(SkIntToScalar(kColWidth), 0); |
| 56 this->drawColumn(canvas, SK_ColorWHITE, SK_ColorBLACK, false); |
| 57 canvas->translate(SkIntToScalar(kColWidth), 0); |
| 58 this->drawColumn(canvas, SK_ColorGREEN, SK_ColorMAGENTA, false); |
| 59 canvas->translate(SkIntToScalar(kColWidth), 0); |
| 60 this->drawColumn(canvas, SK_ColorCYAN, SK_ColorMAGENTA, true); |
| 61 } |
| 62 |
| 63 void drawColumn(SkCanvas* canvas, SkColor backgroundColor, SkColor textColor
, bool useGrad) { |
| 64 const struct { |
| 65 SkXfermode::Mode fMode; |
| 66 const char* fLabel; |
| 67 } gModes[] = { |
| 68 { SkXfermode::kClear_Mode, "Clear" }, |
| 69 { SkXfermode::kSrc_Mode, "Src" }, |
| 70 { SkXfermode::kDst_Mode, "Dst" }, |
| 71 { SkXfermode::kSrcOver_Mode, "SrcOver" }, |
| 72 { SkXfermode::kDstOver_Mode, "DstOver" }, |
| 73 { SkXfermode::kSrcIn_Mode, "SrcIn" }, |
| 74 { SkXfermode::kDstIn_Mode, "DstIn" }, |
| 75 { SkXfermode::kSrcOut_Mode, "SrcOut" }, |
| 76 { SkXfermode::kDstOut_Mode, "DstOut" }, |
| 77 { SkXfermode::kSrcATop_Mode, "SrcATop" }, |
| 78 { SkXfermode::kDstATop_Mode, "DstATop" }, |
| 79 { SkXfermode::kXor_Mode, "Xor" }, |
| 80 { SkXfermode::kPlus_Mode, "Plus" }, |
| 81 { SkXfermode::kModulate_Mode, "Modulate" }, |
| 82 { SkXfermode::kScreen_Mode, "Screen" }, |
| 83 { SkXfermode::kOverlay_Mode, "Overlay" }, |
| 84 { SkXfermode::kDarken_Mode, "Darken" }, |
| 85 { SkXfermode::kLighten_Mode, "Lighten" }, |
| 86 { SkXfermode::kColorDodge_Mode, "ColorDodge" }, |
| 87 { SkXfermode::kColorBurn_Mode, "ColorBurn" }, |
| 88 { SkXfermode::kHardLight_Mode, "HardLight" }, |
| 89 { SkXfermode::kSoftLight_Mode, "SoftLight" }, |
| 90 { SkXfermode::kDifference_Mode, "Difference" }, |
| 91 { SkXfermode::kExclusion_Mode, "Exclusion" }, |
| 92 { SkXfermode::kMultiply_Mode, "Multiply" }, |
| 93 { SkXfermode::kHue_Mode, "Hue" }, |
| 94 { SkXfermode::kSaturation_Mode, "Saturation" }, |
| 95 { SkXfermode::kColor_Mode, "Color" }, |
| 96 { SkXfermode::kLuminosity_Mode, "Luminosity" }, |
| 97 }; |
| 98 // Draw background rect |
| 99 SkPaint backgroundPaint; |
| 100 backgroundPaint.setColor(backgroundColor); |
| 101 canvas->drawRectCoords(0, 0, SkIntToScalar(kColWidth), SkIntToScalar(kHe
ight), |
| 102 backgroundPaint); |
| 103 SkScalar y = fTextHeight; |
| 104 for (size_t m = 0; m < SK_ARRAY_COUNT(gModes); m++) { |
| 105 SkAutoTUnref<SkXfermode> xfermode(SkXfermode::Create(gModes[m].fMode
)); |
| 106 SkPaint paint; |
| 107 paint.setColor(textColor); |
| 108 paint.setAntiAlias(true); |
| 109 paint.setSubpixelText(true); |
| 110 paint.setLCDRenderText(true); |
| 111 paint.setTextSize(fTextHeight); |
| 112 paint.setXfermode(xfermode); |
| 113 sk_tool_utils::set_portable_typeface(&paint); |
| 114 if (useGrad) { |
| 115 SkRect r; |
| 116 r.setXYWH(0, y - fTextHeight, SkIntToScalar(kColWidth), fTextHei
ght); |
| 117 paint.setShader(make_shader(r))->unref(); |
| 118 } |
| 119 SkString string(gModes[m].fLabel); |
| 120 canvas->drawText(gModes[m].fLabel, string.size(), 0, y, paint); |
| 121 y+=fTextHeight; |
| 122 } |
| 123 } |
| 124 |
| 125 private: |
| 126 SkScalar fTextHeight; |
| 127 typedef skiagm::GM INHERITED; |
| 128 }; |
| 129 |
| 130 ////////////////////////////////////////////////////////////////////////////// |
| 131 |
| 132 DEF_GM( return new LcdBlendGM; ) |
| 133 } |
OLD | NEW |