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 */ 7 8 #include "SampleCode.h" 9 #include "SkView.h" 10 #include "SkBitmap.h" 11 #include "SkCanvas.h" 12 #include "SkColorPriv.h" 13 #include "SkShader.h" 14 15 static const SkBlendMode gModes[] = { 16 SkBlendMode::kClear, 17 SkBlendMode::kSrc, 18 SkBlendMode::kDst, 19 SkBlendMode::kSrcOver, 20 SkBlendMode::kDstOver, 21 SkBlendMode::kSrcIn, 22 SkBlendMode::kDstIn, 23 SkBlendMode::kSrcOut, 24 SkBlendMode::kDstOut, 25 SkBlendMode::kSrcATop, 26 SkBlendMode::kDstATop, 27 SkBlendMode::kXor, 28 }; 29 30 const int gWidth = 64; 31 const int gHeight = 64; 32 const SkScalar W = SkIntToScalar(gWidth); 33 const SkScalar H = SkIntToScalar(gHeight); 34 drawCell(SkCanvas * canvas,SkBlendMode mode,SkAlpha a0,SkAlpha a1)35 static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) { 36 SkPaint paint; 37 paint.setAntiAlias(true); 38 39 SkRect r = SkRect::MakeWH(W, H); 40 r.inset(W/10, H/10); 41 42 paint.setColor(SK_ColorBLUE); 43 paint.setAlpha(a0); 44 canvas->drawOval(r, paint); 45 46 paint.setColor(SK_ColorRED); 47 paint.setAlpha(a1); 48 paint.setBlendMode(mode); 49 for (int angle = 0; angle < 24; ++angle) { 50 SkScalar x = SkScalarCos(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gWidth; 51 SkScalar y = SkScalarSin(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gHeight; 52 paint.setStrokeWidth(SK_Scalar1 * angle * 2 / 24); 53 canvas->drawLine(W/2, H/2, W/2 + x, H/2 + y, paint); 54 } 55 56 return H; 57 } 58 make_bg_shader()59 static sk_sp<SkShader> make_bg_shader() { 60 SkBitmap bm; 61 bm.allocN32Pixels(2, 2); 62 *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF; 63 *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC, 0xCC, 0xCC); 64 65 SkMatrix m; 66 m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 67 68 return SkShader::MakeBitmapShader(bm, SkShader::kRepeat_TileMode, 69 SkShader::kRepeat_TileMode, &m); 70 } 71 72 class HairModesView : public SampleView { 73 SkPaint fBGPaint; 74 public: HairModesView()75 HairModesView() { 76 fBGPaint.setShader(make_bg_shader()); 77 } 78 79 protected: 80 // overrides from SkEventSink onQuery(SkEvent * evt)81 virtual bool onQuery(SkEvent* evt) { 82 if (SampleCode::TitleQ(*evt)) { 83 SampleCode::TitleR(evt, "HairlineModes"); 84 return true; 85 } 86 return this->INHERITED::onQuery(evt); 87 } 88 onDrawContent(SkCanvas * canvas)89 virtual void onDrawContent(SkCanvas* canvas) { 90 const SkRect bounds = SkRect::MakeWH(W, H); 91 static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 }; 92 93 canvas->translate(SkIntToScalar(4), SkIntToScalar(4)); 94 95 for (int alpha = 0; alpha < 4; ++alpha) { 96 canvas->save(); 97 canvas->save(); 98 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) { 99 if (6 == i) { 100 canvas->restore(); 101 canvas->translate(W * 5, 0); 102 canvas->save(); 103 } 104 canvas->drawRect(bounds, fBGPaint); 105 canvas->saveLayer(&bounds, nullptr); 106 SkScalar dy = drawCell(canvas, gModes[i], 107 gAlphaValue[alpha & 1], 108 gAlphaValue[alpha & 2]); 109 canvas->restore(); 110 111 canvas->translate(0, dy * 5 / 4); 112 } 113 canvas->restore(); 114 canvas->restore(); 115 canvas->translate(W * 5 / 4, 0); 116 } 117 } 118 119 private: 120 typedef SampleView INHERITED; 121 }; 122 123 /////////////////////////////////////////////////////////////////////////////// 124 MyFactory()125 static SkView* MyFactory() { return new HairModesView; } 126 static SkViewRegister reg(MyFactory); 127