| epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +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 |  */ | 
| Ben Wagner | b2c4ea6 | 2018-08-08 11:36:17 -0400 | [diff] [blame^] | 7 | #include "Sample.h" | 
| robertphillips@google.com | b706117 | 2013-09-06 14:16:12 +0000 | [diff] [blame] | 8 | #include "SkBlurMask.h" | 
 | 9 | #include "SkBlurMaskFilter.h" | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 10 | #include "SkCanvas.h" | 
| commit-bot@chromium.org | 8b0e8ac | 2014-01-30 18:58:24 +0000 | [diff] [blame] | 11 | #include "SkReadBuffer.h" | 
 | 12 | #include "SkWriteBuffer.h" | 
| robertphillips@google.com | b706117 | 2013-09-06 14:16:12 +0000 | [diff] [blame] | 13 | #include "SkGradientShader.h" | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 14 | #include "SkPaint.h" | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 15 | #include "SkVertices.h" | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 16 |  | 
| Hal Canary | db68301 | 2016-11-23 08:55:18 -0700 | [diff] [blame] | 17 | #include "sk_tool_utils.h" | 
 | 18 |  | 
| reed@android.com | 8af9602 | 2009-10-12 17:02:22 +0000 | [diff] [blame] | 19 | #define BG_COLOR    0xFFDDDDDD | 
 | 20 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 21 | typedef void (*SlideProc)(SkCanvas*); | 
 | 22 |  | 
 | 23 | /////////////////////////////////////////////////////////////////////////////// | 
 | 24 |  | 
 | 25 | #include "Sk1DPathEffect.h" | 
 | 26 | #include "Sk2DPathEffect.h" | 
 | 27 | #include "SkCornerPathEffect.h" | 
 | 28 | #include "SkDashPathEffect.h" | 
 | 29 | #include "SkDiscretePathEffect.h" | 
 | 30 |  | 
 | 31 | static void compose_pe(SkPaint* paint) { | 
 | 32 |     SkPathEffect* pe = paint->getPathEffect(); | 
| reed | a439334 | 2016-03-18 11:22:57 -0700 | [diff] [blame] | 33 |     sk_sp<SkPathEffect> corner = SkCornerPathEffect::Make(25); | 
 | 34 |     sk_sp<SkPathEffect> compose; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 35 |     if (pe) { | 
| Mike Reed | a07741a | 2017-02-25 22:34:32 -0500 | [diff] [blame] | 36 |         compose = SkPathEffect::MakeCompose(sk_ref_sp(pe), corner); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 37 |     } else { | 
 | 38 |         compose = corner; | 
 | 39 |     } | 
| reed | a439334 | 2016-03-18 11:22:57 -0700 | [diff] [blame] | 40 |     paint->setPathEffect(compose); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 41 | } | 
 | 42 |  | 
 | 43 | static void hair_pe(SkPaint* paint) { | 
 | 44 |     paint->setStrokeWidth(0); | 
 | 45 | } | 
 | 46 |  | 
 | 47 | static void hair2_pe(SkPaint* paint) { | 
 | 48 |     paint->setStrokeWidth(0); | 
 | 49 |     compose_pe(paint); | 
 | 50 | } | 
 | 51 |  | 
 | 52 | static void stroke_pe(SkPaint* paint) { | 
 | 53 |     paint->setStrokeWidth(12); | 
 | 54 |     compose_pe(paint); | 
 | 55 | } | 
 | 56 |  | 
 | 57 | static void dash_pe(SkPaint* paint) { | 
 | 58 |     SkScalar inter[] = { 20, 10, 10, 10 }; | 
 | 59 |     paint->setStrokeWidth(12); | 
| reed | a439334 | 2016-03-18 11:22:57 -0700 | [diff] [blame] | 60 |     paint->setPathEffect(SkDashPathEffect::Make(inter, SK_ARRAY_COUNT(inter), 0)); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 61 |     compose_pe(paint); | 
 | 62 | } | 
 | 63 |  | 
 | 64 | static const int gXY[] = { | 
 | 65 | 4, 0, 0, -4, 8, -4, 12, 0, 8, 4, 0, 4 | 
 | 66 | }; | 
 | 67 |  | 
 | 68 | static void scale(SkPath* path, SkScalar scale) { | 
 | 69 |     SkMatrix m; | 
 | 70 |     m.setScale(scale, scale); | 
 | 71 |     path->transform(m); | 
 | 72 | } | 
 | 73 |  | 
 | 74 | static void one_d_pe(SkPaint* paint) { | 
 | 75 |     SkPath  path; | 
 | 76 |     path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1])); | 
 | 77 |     for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2) | 
 | 78 |         path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1])); | 
 | 79 |     path.close(); | 
 | 80 |     path.offset(SkIntToScalar(-6), 0); | 
| commit-bot@chromium.org | 4b413c8 | 2013-11-25 19:44:07 +0000 | [diff] [blame] | 81 |     scale(&path, 1.5f); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 82 |  | 
| reed | a439334 | 2016-03-18 11:22:57 -0700 | [diff] [blame] | 83 |     paint->setPathEffect(SkPath1DPathEffect::Make(path, SkIntToScalar(21), 0, | 
 | 84 |                                                   SkPath1DPathEffect::kRotate_Style)); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 85 |     compose_pe(paint); | 
 | 86 | } | 
 | 87 |  | 
 | 88 | typedef void (*PE_Proc)(SkPaint*); | 
 | 89 | static const PE_Proc gPE[] = { hair_pe, hair2_pe, stroke_pe, dash_pe, one_d_pe }; | 
 | 90 |  | 
 | 91 | static void fill_pe(SkPaint* paint) { | 
 | 92 |     paint->setStyle(SkPaint::kFill_Style); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 93 |     paint->setPathEffect(nullptr); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 94 | } | 
 | 95 |  | 
 | 96 | static void discrete_pe(SkPaint* paint) { | 
| reed | a439334 | 2016-03-18 11:22:57 -0700 | [diff] [blame] | 97 |     paint->setPathEffect(SkDiscretePathEffect::Make(10, 4)); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 98 | } | 
 | 99 |  | 
| reed | a439334 | 2016-03-18 11:22:57 -0700 | [diff] [blame] | 100 | static sk_sp<SkPathEffect> MakeTileEffect() { | 
| reed@google.com | 43e9f20 | 2011-08-09 19:01:50 +0000 | [diff] [blame] | 101 |     SkMatrix m; | 
 | 102 |     m.setScale(SkIntToScalar(12), SkIntToScalar(12)); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 103 |  | 
| reed@google.com | 43e9f20 | 2011-08-09 19:01:50 +0000 | [diff] [blame] | 104 |     SkPath path; | 
 | 105 |     path.addCircle(0, 0, SkIntToScalar(5)); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 106 |  | 
| reed | a439334 | 2016-03-18 11:22:57 -0700 | [diff] [blame] | 107 |     return SkPath2DPathEffect::Make(m, path); | 
| reed@google.com | 43e9f20 | 2011-08-09 19:01:50 +0000 | [diff] [blame] | 108 | } | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 109 |  | 
 | 110 | static void tile_pe(SkPaint* paint) { | 
| reed | a439334 | 2016-03-18 11:22:57 -0700 | [diff] [blame] | 111 |     paint->setPathEffect(MakeTileEffect()); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 112 | } | 
 | 113 |  | 
 | 114 | static const PE_Proc gPE2[] = { fill_pe, discrete_pe, tile_pe }; | 
 | 115 |  | 
 | 116 | static void patheffect_slide(SkCanvas* canvas) { | 
 | 117 |     SkPaint paint; | 
 | 118 |     paint.setAntiAlias(true); | 
 | 119 |     paint.setStyle(SkPaint::kStroke_Style); | 
 | 120 |  | 
 | 121 |     SkPath path; | 
 | 122 |     path.moveTo(20, 20); | 
 | 123 |     path.lineTo(70, 120); | 
 | 124 |     path.lineTo(120, 30); | 
 | 125 |     path.lineTo(170, 80); | 
 | 126 |     path.lineTo(240, 50); | 
 | 127 |  | 
 | 128 |     size_t i; | 
 | 129 |     canvas->save(); | 
 | 130 |     for (i = 0; i < SK_ARRAY_COUNT(gPE); i++) { | 
 | 131 |         gPE[i](&paint); | 
 | 132 |         canvas->drawPath(path, paint); | 
 | 133 |         canvas->translate(0, 75); | 
 | 134 |     } | 
 | 135 |     canvas->restore(); | 
 | 136 |  | 
 | 137 |     path.reset(); | 
 | 138 |     SkRect r = { 0, 0, 250, 120 }; | 
 | 139 |     path.addOval(r, SkPath::kCW_Direction); | 
 | 140 |     r.inset(50, 50); | 
 | 141 |     path.addRect(r, SkPath::kCCW_Direction); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 142 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 143 |     canvas->translate(320, 20); | 
 | 144 |     for (i = 0; i < SK_ARRAY_COUNT(gPE2); i++) { | 
 | 145 |         gPE2[i](&paint); | 
 | 146 |         canvas->drawPath(path, paint); | 
 | 147 |         canvas->translate(0, 160); | 
 | 148 |     } | 
 | 149 | } | 
 | 150 |  | 
 | 151 | /////////////////////////////////////////////////////////////////////////////// | 
 | 152 |  | 
 | 153 | #include "SkGradientShader.h" | 
 | 154 |  | 
 | 155 | struct GradData { | 
 | 156 |     int             fCount; | 
 | 157 |     const SkColor*  fColors; | 
 | 158 |     const SkScalar* fPos; | 
 | 159 | }; | 
 | 160 |  | 
 | 161 | static const SkColor gColors[] = { | 
 | 162 | SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK | 
 | 163 | }; | 
 | 164 | static const SkScalar gPos0[] = { 0, SK_Scalar1 }; | 
 | 165 | static const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 }; | 
 | 166 | static const SkScalar gPos2[] = { | 
 | 167 | 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1 | 
 | 168 | }; | 
 | 169 |  | 
 | 170 | static const GradData gGradData[] = { | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 171 | { 2, gColors, nullptr }, | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 172 | { 2, gColors, gPos0 }, | 
 | 173 | { 2, gColors, gPos1 }, | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 174 | { 5, gColors, nullptr }, | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 175 | { 5, gColors, gPos2 } | 
 | 176 | }; | 
 | 177 |  | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 178 | static sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { | 
 | 179 |     return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos, data.fCount, tm); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 180 | } | 
 | 181 |  | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 182 | static sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 183 |     SkPoint center; | 
 | 184 |     center.set(SkScalarAve(pts[0].fX, pts[1].fX), | 
 | 185 |                SkScalarAve(pts[0].fY, pts[1].fY)); | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 186 |     return SkGradientShader::MakeRadial(center, center.fX, data.fColors, | 
| commit-bot@chromium.org | 83f23d8 | 2014-05-22 12:27:41 +0000 | [diff] [blame] | 187 |                                           data.fPos, data.fCount, tm); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 188 | } | 
 | 189 |  | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 190 | static sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 191 |     SkPoint center; | 
 | 192 |     center.set(SkScalarAve(pts[0].fX, pts[1].fX), | 
 | 193 |                SkScalarAve(pts[0].fY, pts[1].fY)); | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 194 |     return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 195 | } | 
 | 196 |  | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 197 | static sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 198 |     SkPoint center0, center1; | 
 | 199 |     center0.set(SkScalarAve(pts[0].fX, pts[1].fX), | 
 | 200 |                 SkScalarAve(pts[0].fY, pts[1].fY)); | 
 | 201 |     center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), | 
 | 202 |                 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 203 |     return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7, | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 204 |                                                   center0, (pts[1].fX - pts[0].fX) / 2, | 
| commit-bot@chromium.org | 83f23d8 | 2014-05-22 12:27:41 +0000 | [diff] [blame] | 205 |                                                   data.fColors, data.fPos, data.fCount, tm); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 206 | } | 
 | 207 |  | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 208 | typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData&, SkShader::TileMode); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 209 | static const GradMaker gGradMakers[] = { | 
| reed | 71a6cbf | 2015-05-04 08:32:51 -0700 | [diff] [blame] | 210 |     MakeLinear, MakeRadial, MakeSweep, Make2Conical | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 211 | }; | 
 | 212 |  | 
 | 213 | static void gradient_slide(SkCanvas* canvas) { | 
 | 214 |     SkPoint pts[2] = { | 
 | 215 |         { 0, 0 }, | 
 | 216 |         { SkIntToScalar(100), SkIntToScalar(100) } | 
 | 217 |     }; | 
 | 218 |     SkShader::TileMode tm = SkShader::kClamp_TileMode; | 
 | 219 |     SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; | 
 | 220 |     SkPaint paint; | 
 | 221 |     paint.setAntiAlias(true); | 
 | 222 |     paint.setDither(true); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 223 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 224 |     canvas->translate(SkIntToScalar(20), SkIntToScalar(10)); | 
 | 225 |     for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { | 
 | 226 |         canvas->save(); | 
 | 227 |         for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 228 |             paint.setShader(gGradMakers[j](pts, gGradData[i], tm)); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 229 |             canvas->drawRect(r, paint); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 230 |             canvas->translate(0, SkIntToScalar(120)); | 
 | 231 |         } | 
 | 232 |         canvas->restore(); | 
 | 233 |         canvas->translate(SkIntToScalar(120), 0); | 
 | 234 |     } | 
 | 235 | } | 
 | 236 |  | 
 | 237 | /////////////////////////////////////////////////////////////////////////////// | 
 | 238 |  | 
 | 239 | #include "SkPathMeasure.h" | 
 | 240 |  | 
 | 241 | static SkScalar getpathlen(const SkPath& path) { | 
 | 242 |     SkPathMeasure   meas(path, false); | 
 | 243 |     return meas.getLength(); | 
 | 244 | } | 
 | 245 |  | 
 | 246 | static void textonpath_slide(SkCanvas* canvas) { | 
 | 247 |     const char* text = "Displacement"; | 
 | 248 |     size_t len =strlen(text); | 
 | 249 |     SkPath path; | 
 | 250 |     path.moveTo(100, 300); | 
 | 251 |     path.quadTo(300, 100, 500, 300); | 
 | 252 |     path.offset(0, -100); | 
 | 253 |  | 
 | 254 |     SkPaint paint; | 
 | 255 |     paint.setAntiAlias(true); | 
 | 256 |     paint.setTextSize(40); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 257 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 258 |     paint.setStyle(SkPaint::kStroke_Style); | 
 | 259 |     canvas->drawPath(path, paint); | 
 | 260 |     paint.setStyle(SkPaint::kFill_Style); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 261 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 262 |     SkScalar x = 50; | 
 | 263 |     paint.setColor(0xFF008800); | 
 | 264 |     canvas->drawTextOnPathHV(text, len, path, | 
 | 265 |                              x, paint.getTextSize()*2/3, paint); | 
 | 266 |     paint.setColor(SK_ColorRED); | 
 | 267 |     canvas->drawTextOnPathHV(text, len, path, | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 268 |                              x + 60, 0, paint); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 269 |     paint.setColor(SK_ColorBLUE); | 
 | 270 |     canvas->drawTextOnPathHV(text, len, path, | 
 | 271 |                              x + 120, -paint.getTextSize()*2/3, paint); | 
 | 272 |  | 
 | 273 |     path.offset(0, 200); | 
 | 274 |     paint.setTextAlign(SkPaint::kRight_Align); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 275 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 276 |     text = "Matrices"; | 
 | 277 |     len = strlen(text); | 
 | 278 |     SkScalar pathLen = getpathlen(path); | 
 | 279 |     SkMatrix matrix; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 280 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 281 |     paint.setColor(SK_ColorBLACK); | 
 | 282 |     paint.setStyle(SkPaint::kStroke_Style); | 
 | 283 |     canvas->drawPath(path, paint); | 
 | 284 |     paint.setStyle(SkPaint::kFill_Style); | 
 | 285 |  | 
 | 286 |     paint.setTextSize(50); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 287 |     canvas->drawTextOnPath(text, len, path, nullptr, paint); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 288 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 289 |     paint.setColor(SK_ColorRED); | 
 | 290 |     matrix.setScale(-SK_Scalar1, SK_Scalar1); | 
 | 291 |     matrix.postTranslate(pathLen, 0); | 
 | 292 |     canvas->drawTextOnPath(text, len, path, &matrix, paint); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 293 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 294 |     paint.setColor(SK_ColorBLUE); | 
 | 295 |     matrix.setScale(SK_Scalar1, -SK_Scalar1); | 
 | 296 |     canvas->drawTextOnPath(text, len, path, &matrix, paint); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 297 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 298 |     paint.setColor(0xFF008800); | 
 | 299 |     matrix.setScale(-SK_Scalar1, -SK_Scalar1); | 
 | 300 |     matrix.postTranslate(pathLen, 0); | 
 | 301 |     canvas->drawTextOnPath(text, len, path, &matrix, paint); | 
 | 302 | } | 
 | 303 |  | 
 | 304 | /////////////////////////////////////////////////////////////////////////////// | 
 | 305 |  | 
| msarett | d15750c | 2016-03-18 15:48:49 -0700 | [diff] [blame] | 306 | #include "DecodeFile.h" | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 307 | #include "SkOSFile.h" | 
 | 308 | #include "SkRandom.h" | 
 | 309 | #include "SkStream.h" | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 310 |  | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 311 | static sk_sp<SkShader> make_shader0(SkIPoint* size) { | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 312 |     SkBitmap    bm; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 313 |  | 
| msarett | d15750c | 2016-03-18 15:48:49 -0700 | [diff] [blame] | 314 |     decode_file("/skimages/logo.gif", &bm); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 315 |     size->set(bm.width(), bm.height()); | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 316 |     return SkShader::MakeBitmapShader(bm, SkShader::kClamp_TileMode, | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 317 |                                         SkShader::kClamp_TileMode); | 
 | 318 | } | 
 | 319 |  | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 320 | static sk_sp<SkShader> make_shader1(const SkIPoint& size) { | 
| senorblanco@chromium.org | 64cc579 | 2011-05-19 19:58:58 +0000 | [diff] [blame] | 321 |     SkPoint pts[] = { { 0, 0 }, | 
 | 322 |                       { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } }; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 323 |     SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED }; | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 324 |     return SkGradientShader::MakeLinear(pts, colors, nullptr, | 
| commit-bot@chromium.org | 83f23d8 | 2014-05-22 12:27:41 +0000 | [diff] [blame] | 325 |                                           SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 326 | } | 
 | 327 |  | 
| reed@android.com | f2b98d6 | 2010-12-20 18:26:13 +0000 | [diff] [blame] | 328 | class Rec { | 
 | 329 | public: | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 330 |     SkVertices::VertexMode  fMode; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 331 |     int                     fCount; | 
 | 332 |     SkPoint*                fVerts; | 
 | 333 |     SkPoint*                fTexs; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 334 |  | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 335 |     Rec() : fCount(0), fVerts(nullptr), fTexs(nullptr) {} | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 336 |     ~Rec() { delete[] fVerts; delete[] fTexs; } | 
 | 337 | }; | 
 | 338 |  | 
| caryclark@google.com | 02939ce | 2012-06-06 12:09:51 +0000 | [diff] [blame] | 339 | static void make_tris(Rec* rec) { | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 340 |     int n = 10; | 
| commit-bot@chromium.org | e0e7cfe | 2013-09-09 20:09:12 +0000 | [diff] [blame] | 341 |     SkRandom    rand; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 342 |  | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 343 |     rec->fMode = SkVertices::kTriangles_VertexMode; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 344 |     rec->fCount = n * 3; | 
 | 345 |     rec->fVerts = new SkPoint[rec->fCount]; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 346 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 347 |     for (int i = 0; i < n; i++) { | 
 | 348 |         SkPoint* v = &rec->fVerts[i*3]; | 
 | 349 |         for (int j = 0; j < 3; j++) { | 
 | 350 |             v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250); | 
 | 351 |         } | 
 | 352 |     } | 
 | 353 | } | 
 | 354 |  | 
| caryclark@google.com | 02939ce | 2012-06-06 12:09:51 +0000 | [diff] [blame] | 355 | static void make_fan(Rec* rec, int texWidth, int texHeight) { | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 356 |     const SkScalar tx = SkIntToScalar(texWidth); | 
 | 357 |     const SkScalar ty = SkIntToScalar(texHeight); | 
 | 358 |     const int n = 24; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 359 |  | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 360 |     rec->fMode = SkVertices::kTriangleFan_VertexMode; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 361 |     rec->fCount = n + 2; | 
 | 362 |     rec->fVerts = new SkPoint[rec->fCount]; | 
 | 363 |     rec->fTexs  = new SkPoint[rec->fCount]; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 364 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 365 |     SkPoint* v = rec->fVerts; | 
 | 366 |     SkPoint* t = rec->fTexs; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 367 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 368 |     v[0].set(0, 0); | 
 | 369 |     t[0].set(0, 0); | 
 | 370 |     for (int i = 0; i < n; i++) { | 
 | 371 |         SkScalar cos; | 
 | 372 |         SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos); | 
 | 373 |         v[i+1].set(cos, sin); | 
 | 374 |         t[i+1].set(i*tx/n, ty); | 
 | 375 |     } | 
 | 376 |     v[n+1] = v[1]; | 
 | 377 |     t[n+1].set(tx, ty); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 378 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 379 |     SkMatrix m; | 
 | 380 |     m.setScale(SkIntToScalar(100), SkIntToScalar(100)); | 
 | 381 |     m.postTranslate(SkIntToScalar(110), SkIntToScalar(110)); | 
 | 382 |     m.mapPoints(v, rec->fCount); | 
 | 383 | } | 
 | 384 |  | 
| caryclark@google.com | 02939ce | 2012-06-06 12:09:51 +0000 | [diff] [blame] | 385 | static void make_strip(Rec* rec, int texWidth, int texHeight) { | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 386 |     const SkScalar tx = SkIntToScalar(texWidth); | 
 | 387 |     const SkScalar ty = SkIntToScalar(texHeight); | 
 | 388 |     const int n = 24; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 389 |  | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 390 |     rec->fMode = SkVertices::kTriangleStrip_VertexMode; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 391 |     rec->fCount = 2 * (n + 1); | 
 | 392 |     rec->fVerts = new SkPoint[rec->fCount]; | 
 | 393 |     rec->fTexs  = new SkPoint[rec->fCount]; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 394 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 395 |     SkPoint* v = rec->fVerts; | 
 | 396 |     SkPoint* t = rec->fTexs; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 397 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 398 |     for (int i = 0; i < n; i++) { | 
 | 399 |         SkScalar cos; | 
 | 400 |         SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos); | 
 | 401 |         v[i*2 + 0].set(cos/2, sin/2); | 
 | 402 |         v[i*2 + 1].set(cos, sin); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 403 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 404 |         t[i*2 + 0].set(tx * i / n, ty); | 
 | 405 |         t[i*2 + 1].set(tx * i / n, 0); | 
 | 406 |     } | 
 | 407 |     v[2*n + 0] = v[0]; | 
 | 408 |     v[2*n + 1] = v[1]; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 409 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 410 |     t[2*n + 0].set(tx, ty); | 
 | 411 |     t[2*n + 1].set(tx, 0); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 412 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 413 |     SkMatrix m; | 
 | 414 |     m.setScale(SkIntToScalar(100), SkIntToScalar(100)); | 
 | 415 |     m.postTranslate(SkIntToScalar(110), SkIntToScalar(110)); | 
 | 416 |     m.mapPoints(v, rec->fCount); | 
 | 417 | } | 
 | 418 |  | 
 | 419 | static void mesh_slide(SkCanvas* canvas) { | 
 | 420 |     Rec fRecs[3]; | 
 | 421 |     SkIPoint    size; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 422 |  | 
| reed | 8a21c9f | 2016-03-08 18:50:00 -0800 | [diff] [blame] | 423 |     auto fShader0 = make_shader0(&size); | 
 | 424 |     auto fShader1 = make_shader1(size); | 
| reed@android.com | f2b98d6 | 2010-12-20 18:26:13 +0000 | [diff] [blame] | 425 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 426 |     make_strip(&fRecs[0], size.fX, size.fY); | 
 | 427 |     make_fan(&fRecs[1], size.fX, size.fY); | 
 | 428 |     make_tris(&fRecs[2]); | 
 | 429 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 430 |     SkPaint paint; | 
 | 431 |     paint.setDither(true); | 
| reed | 93a1215 | 2015-03-16 10:08:34 -0700 | [diff] [blame] | 432 |     paint.setFilterQuality(kLow_SkFilterQuality); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 433 |  | 
| senorblanco@chromium.org | 64cc579 | 2011-05-19 19:58:58 +0000 | [diff] [blame] | 434 |     for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) { | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 435 |         auto verts = SkVertices::MakeCopy(fRecs[i].fMode, fRecs[i].fCount, | 
 | 436 |                                           fRecs[i].fVerts, fRecs[i].fTexs, nullptr); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 437 |         canvas->save(); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 438 |  | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 439 |         paint.setShader(nullptr); | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 440 |         canvas->drawVertices(verts, SkBlendMode::kModulate, paint); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 441 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 442 |         canvas->translate(SkIntToScalar(210), 0); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 443 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 444 |         paint.setShader(fShader0); | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 445 |         canvas->drawVertices(verts, SkBlendMode::kModulate, paint); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 446 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 447 |         canvas->translate(SkIntToScalar(210), 0); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 448 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 449 |         paint.setShader(fShader1); | 
| Mike Reed | 887cdf1 | 2017-04-03 11:11:09 -0400 | [diff] [blame] | 450 |         canvas->drawVertices(verts, SkBlendMode::kModulate, paint); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 451 |         canvas->restore(); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 452 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 453 |         canvas->translate(0, SkIntToScalar(250)); | 
 | 454 |     } | 
 | 455 | } | 
 | 456 |  | 
 | 457 | /////////////////////////////////////////////////////////////////////////////// | 
 | 458 |  | 
| reed@android.com | 8af9602 | 2009-10-12 17:02:22 +0000 | [diff] [blame] | 459 | #include "SkTypeface.h" | 
 | 460 |  | 
| reed@android.com | 8af9602 | 2009-10-12 17:02:22 +0000 | [diff] [blame] | 461 | /////////////////////////////////////////////////////////////////////////////// | 
 | 462 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 463 | #include "SkImageEncoder.h" | 
 | 464 |  | 
 | 465 | static const SlideProc gProc[] = { | 
 | 466 |     patheffect_slide, | 
 | 467 |     gradient_slide, | 
 | 468 |     textonpath_slide, | 
| reed@android.com | 8af9602 | 2009-10-12 17:02:22 +0000 | [diff] [blame] | 469 |     mesh_slide, | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 470 | }; | 
 | 471 |  | 
| Ben Wagner | b2c4ea6 | 2018-08-08 11:36:17 -0400 | [diff] [blame^] | 472 | class SlideView : public Sample { | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 473 |     int fIndex; | 
| reed@google.com | 7b18590 | 2012-03-12 21:13:48 +0000 | [diff] [blame] | 474 |     bool fOnce; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 475 | public: | 
 | 476 |     SlideView() { | 
| reed@google.com | 7b18590 | 2012-03-12 21:13:48 +0000 | [diff] [blame] | 477 |         fOnce = false; | 
 | 478 |     } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 479 |  | 
| reed@google.com | 7b18590 | 2012-03-12 21:13:48 +0000 | [diff] [blame] | 480 |     void init() { | 
 | 481 |         if (fOnce) { | 
 | 482 |             return; | 
 | 483 |         } | 
 | 484 |         fOnce = true; | 
 | 485 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 486 |         fIndex = 0; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 487 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 488 |         SkBitmap bm; | 
| commit-bot@chromium.org | a8c1831 | 2014-02-17 02:55:57 +0000 | [diff] [blame] | 489 |         bm.allocN32Pixels(1024, 768); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 490 |         SkCanvas canvas(bm); | 
 | 491 |         SkScalar s = SkIntToScalar(1024) / 640; | 
 | 492 |         canvas.scale(s, s); | 
 | 493 |         for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); i++) { | 
 | 494 |             canvas.save(); | 
| reed@android.com | 8af9602 | 2009-10-12 17:02:22 +0000 | [diff] [blame] | 495 |             canvas.drawColor(BG_COLOR); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 496 |             gProc[i](&canvas); | 
 | 497 |             canvas.restore(); | 
 | 498 |             SkString str; | 
| senorblanco@chromium.org | 3a67a66 | 2012-07-09 18:22:08 +0000 | [diff] [blame] | 499 |             str.printf("/skimages/slide_" SK_SIZE_T_SPECIFIER ".png", i); | 
| Hal Canary | db68301 | 2016-11-23 08:55:18 -0700 | [diff] [blame] | 500 |             sk_tool_utils::EncodeImageToFile(str.c_str(), bm, SkEncodedImageFormat::kPNG, 100); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 501 |         } | 
| reed@google.com | 81e3d7f | 2011-06-01 12:42:36 +0000 | [diff] [blame] | 502 |         this->setBGColor(BG_COLOR); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 503 |     } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 504 |  | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 505 | protected: | 
| Ben Wagner | b2c4ea6 | 2018-08-08 11:36:17 -0400 | [diff] [blame^] | 506 |     bool onQuery(Sample::Event* evt) override { | 
 | 507 |         if (Sample::TitleQ(*evt)) { | 
 | 508 |             Sample::TitleR(evt, "Slides"); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 509 |             return true; | 
 | 510 |         } | 
 | 511 |         return this->INHERITED::onQuery(evt); | 
 | 512 |     } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 513 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 514 |     void onDrawContent(SkCanvas* canvas) override { | 
| reed@google.com | 7b18590 | 2012-03-12 21:13:48 +0000 | [diff] [blame] | 515 |         this->init(); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 516 |         gProc[fIndex](canvas); | 
 | 517 |     } | 
 | 518 |  | 
| Ben Wagner | b2c4ea6 | 2018-08-08 11:36:17 -0400 | [diff] [blame^] | 519 |     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override { | 
| reed@google.com | 7b18590 | 2012-03-12 21:13:48 +0000 | [diff] [blame] | 520 |         this->init(); | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 521 |         fIndex = (fIndex + 1) % SK_ARRAY_COUNT(gProc); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 522 |         return nullptr; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 523 |     } | 
 | 524 |  | 
 | 525 | private: | 
| Ben Wagner | b2c4ea6 | 2018-08-08 11:36:17 -0400 | [diff] [blame^] | 526 |     typedef Sample INHERITED; | 
| reed@android.com | 63e34c6 | 2009-10-06 21:19:18 +0000 | [diff] [blame] | 527 | }; | 
 | 528 |  | 
 | 529 | ////////////////////////////////////////////////////////////////////////////// | 
 | 530 |  | 
| Ben Wagner | b2c4ea6 | 2018-08-08 11:36:17 -0400 | [diff] [blame^] | 531 | DEF_SAMPLE( return new SlideView(); ) |