| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright 2011 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 |  */ | 
| commit-bot@chromium.org | 83f23d8 | 2014-05-22 12:27:41 +0000 | [diff] [blame] | 7 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 8 | #include "gm.h" | 
 | 9 | #include "SkCanvas.h" | 
 | 10 | #include "SkGradientShader.h" | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 11 |  | 
 | 12 | namespace skiagm { | 
 | 13 |  | 
| commit-bot@chromium.org | dac5225 | 2014-02-17 21:21:46 +0000 | [diff] [blame] | 14 | static void makebm(SkBitmap* bm, int w, int h) { | 
 | 15 |     bm->allocN32Pixels(w, h); | 
| junov@google.com | dbfac8a | 2012-12-06 21:47:40 +0000 | [diff] [blame] | 16 |     bm->eraseColor(SK_ColorTRANSPARENT); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 17 |  | 
 | 18 |     SkCanvas    canvas(*bm); | 
 | 19 |     SkScalar    s = SkIntToScalar(SkMin32(w, h)); | 
 | 20 |     static const SkPoint     kPts0[] = { { 0, 0 }, { s, s } }; | 
 | 21 |     static const SkPoint     kPts1[] = { { s/2, 0 }, { s/2, s } }; | 
 | 22 |     static const SkScalar    kPos[] = { 0, SK_Scalar1/2, SK_Scalar1 }; | 
 | 23 |     static const SkColor kColors0[] = {0x80F00080, 0xF0F08000, 0x800080F0 }; | 
 | 24 |     static const SkColor kColors1[] = {0xF08000F0, 0x8080F000, 0xF000F080 }; | 
| skia.committer@gmail.com | f57c01b | 2012-10-13 02:01:56 +0000 | [diff] [blame] | 25 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 26 |  | 
 | 27 |     SkPaint     paint; | 
 | 28 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 29 |     paint.setShader(SkGradientShader::CreateLinear(kPts0, kColors0, kPos, | 
| commit-bot@chromium.org | 83f23d8 | 2014-05-22 12:27:41 +0000 | [diff] [blame] | 30 |                     SK_ARRAY_COUNT(kColors0), SkShader::kClamp_TileMode))->unref(); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 31 |     canvas.drawPaint(paint); | 
 | 32 |     paint.setShader(SkGradientShader::CreateLinear(kPts1, kColors1, kPos, | 
 | 33 |                     SK_ARRAY_COUNT(kColors1), SkShader::kClamp_TileMode))->unref(); | 
 | 34 |     canvas.drawPaint(paint); | 
 | 35 | } | 
 | 36 |  | 
 | 37 | /////////////////////////////////////////////////////////////////////////////// | 
 | 38 |  | 
 | 39 | struct LabeledMatrix { | 
 | 40 |     SkMatrix    fMatrix; | 
 | 41 |     const char* fLabel; | 
 | 42 | }; | 
 | 43 |  | 
| commit-bot@chromium.org | a54abdc | 2014-03-26 21:21:40 +0000 | [diff] [blame] | 44 | static const char kText[] = "B"; | 
 | 45 | static const int kTextLen = SK_ARRAY_COUNT(kText) - 1; | 
 | 46 | static const int kPointSize = 300; | 
 | 47 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 48 | class ShaderText3GM : public GM { | 
 | 49 | public: | 
 | 50 |     ShaderText3GM() { | 
| caryclark | 65cdba6 | 2015-06-15 06:51:08 -0700 | [diff] [blame] | 51 |         this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 52 |     } | 
 | 53 |  | 
 | 54 | protected: | 
 | 55 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 56 |     SkString onShortName() override { | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 57 |         return SkString("shadertext3"); | 
 | 58 |     } | 
 | 59 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 60 |     SkISize onISize() override{ return SkISize::Make(800, 1000); } | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 61 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 62 |     void onOnceBeforeDraw() override { | 
| commit-bot@chromium.org | a54abdc | 2014-03-26 21:21:40 +0000 | [diff] [blame] | 63 |         makebm(&fBmp, kPointSize / 4, kPointSize / 4); | 
 | 64 |     } | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 65 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 66 |     void onDraw(SkCanvas* canvas) override { | 
| skia.committer@gmail.com | f57c01b | 2012-10-13 02:01:56 +0000 | [diff] [blame] | 67 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 68 |         SkPaint bmpPaint; | 
 | 69 |         bmpPaint.setAntiAlias(true); | 
| reed | 93a1215 | 2015-03-16 10:08:34 -0700 | [diff] [blame] | 70 |         bmpPaint.setFilterQuality(kLow_SkFilterQuality); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 71 |         bmpPaint.setAlpha(0x80); | 
| commit-bot@chromium.org | a54abdc | 2014-03-26 21:21:40 +0000 | [diff] [blame] | 72 |         canvas->drawBitmap(fBmp, 5.f, 5.f, &bmpPaint); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 73 |  | 
 | 74 |         SkPaint outlinePaint; | 
 | 75 |         outlinePaint.setAntiAlias(true); | 
| caryclark | 1818acb | 2015-07-24 12:09:25 -0700 | [diff] [blame] | 76 |         sk_tool_utils::set_portable_typeface(&outlinePaint); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 77 |         outlinePaint.setTextSize(SkIntToScalar(kPointSize)); | 
 | 78 |         outlinePaint.setStyle(SkPaint::kStroke_Style); | 
 | 79 |         outlinePaint.setStrokeWidth(0.f); | 
| skia.committer@gmail.com | f57c01b | 2012-10-13 02:01:56 +0000 | [diff] [blame] | 80 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 81 |         canvas->translate(15.f, 15.f); | 
| skia.committer@gmail.com | f57c01b | 2012-10-13 02:01:56 +0000 | [diff] [blame] | 82 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 83 |         // draw glyphs scaled up | 
 | 84 |         canvas->scale(2.f, 2.f); | 
 | 85 |  | 
 | 86 |         static const SkShader::TileMode kTileModes[] = { | 
 | 87 |             SkShader::kRepeat_TileMode, | 
 | 88 |             SkShader::kMirror_TileMode, | 
 | 89 |         }; | 
| skia.committer@gmail.com | f57c01b | 2012-10-13 02:01:56 +0000 | [diff] [blame] | 90 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 91 |         // position the baseline of the first run | 
 | 92 |         canvas->translate(0.f, 0.75f * kPointSize); | 
| skia.committer@gmail.com | f57c01b | 2012-10-13 02:01:56 +0000 | [diff] [blame] | 93 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 94 |         canvas->save(); | 
 | 95 |         int i = 0; | 
| skia.committer@gmail.com | f57c01b | 2012-10-13 02:01:56 +0000 | [diff] [blame] | 96 |         for (size_t tm0 = 0; tm0 < SK_ARRAY_COUNT(kTileModes); ++tm0) { | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 97 |             for (size_t tm1 = 0; tm1 < SK_ARRAY_COUNT(kTileModes); ++tm1) { | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 98 |                 SkMatrix localM; | 
 | 99 |                 localM.setTranslate(5.f, 5.f); | 
 | 100 |                 localM.postRotate(20); | 
 | 101 |                 localM.postScale(1.15f, .85f); | 
| commit-bot@chromium.org | 9c9005a | 2014-04-28 14:55:39 +0000 | [diff] [blame] | 102 |  | 
 | 103 |                 SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(fBmp, | 
 | 104 |                                                                            kTileModes[tm0], | 
 | 105 |                                                                            kTileModes[tm1], | 
 | 106 |                                                                            &localM)); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 107 |  | 
 | 108 |                 SkPaint fillPaint; | 
 | 109 |                 fillPaint.setAntiAlias(true); | 
| caryclark | 1818acb | 2015-07-24 12:09:25 -0700 | [diff] [blame] | 110 |                 sk_tool_utils::set_portable_typeface(&fillPaint); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 111 |                 fillPaint.setTextSize(SkIntToScalar(kPointSize)); | 
| reed | 93a1215 | 2015-03-16 10:08:34 -0700 | [diff] [blame] | 112 |                 fillPaint.setFilterQuality(kLow_SkFilterQuality); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 113 |                 fillPaint.setShader(shader); | 
 | 114 |  | 
 | 115 |                 canvas->drawText(kText, kTextLen, 0, 0, fillPaint); | 
 | 116 |                 canvas->drawText(kText, kTextLen, 0, 0, outlinePaint); | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 117 |                 SkScalar w = fillPaint.measureText(kText, kTextLen); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 118 |                 canvas->translate(w + 10.f, 0.f); | 
 | 119 |                 ++i; | 
 | 120 |                 if (!(i % 2)) { | 
 | 121 |                     canvas->restore(); | 
 | 122 |                     canvas->translate(0, 0.75f * kPointSize); | 
 | 123 |                     canvas->save(); | 
 | 124 |                 } | 
 | 125 |             } | 
 | 126 |         } | 
 | 127 |         canvas->restore(); | 
 | 128 |     } | 
 | 129 |  | 
 | 130 | private: | 
| commit-bot@chromium.org | a54abdc | 2014-03-26 21:21:40 +0000 | [diff] [blame] | 131 |     SkBitmap fBmp; | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 132 |     typedef GM INHERITED; | 
 | 133 | }; | 
 | 134 |  | 
 | 135 | /////////////////////////////////////////////////////////////////////////////// | 
 | 136 |  | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 137 | static GM* MyFactory(void*) { return new ShaderText3GM; } | 
 | 138 | static GMRegistry reg(MyFactory); | 
| bsalomon@google.com | 4231609 | 2012-10-12 19:26:15 +0000 | [diff] [blame] | 139 | } |