| reed@android.com | a3c0588 | 2009-04-02 20:49:39 +0000 | [diff] [blame] | 1 | #include "SampleCode.h" | 
|  | 2 | #include "SkView.h" | 
|  | 3 | #include "SkCanvas.h" | 
|  | 4 | #include "SkGradientShader.h" | 
|  | 5 |  | 
| reed@android.com | 1c12abe | 2009-07-02 15:01:02 +0000 | [diff] [blame^] | 6 | static SkShader* setgrad(const SkRect& r, SkColor c0, SkColor c1) { | 
|  | 7 | SkColor colors[] = { c0, c1 }; | 
|  | 8 | SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } }; | 
|  | 9 | return SkGradientShader::CreateLinear(pts, colors, NULL, 2, | 
|  | 10 | SkShader::kClamp_TileMode, NULL); | 
|  | 11 | } | 
|  | 12 |  | 
|  | 13 | static void test_alphagradients(SkCanvas* canvas) { | 
|  | 14 | SkRect r; | 
|  | 15 | r.set(SkIntToScalar(10), SkIntToScalar(10), | 
|  | 16 | SkIntToScalar(410), SkIntToScalar(30)); | 
|  | 17 | SkPaint p, p2; | 
|  | 18 | p2.setStyle(SkPaint::kStroke_Style); | 
|  | 19 |  | 
|  | 20 | p.setShader(setgrad(r, 0xFF00FF00, 0x0000FF00))->unref(); | 
|  | 21 | canvas->drawRect(r, p); | 
|  | 22 | canvas->drawRect(r, p2); | 
|  | 23 |  | 
|  | 24 | r.offset(0, r.height() + SkIntToScalar(4)); | 
|  | 25 | p.setShader(setgrad(r, 0xFF00FF00, 0x00000000))->unref(); | 
|  | 26 | canvas->drawRect(r, p); | 
|  | 27 | canvas->drawRect(r, p2); | 
|  | 28 |  | 
|  | 29 | r.offset(0, r.height() + SkIntToScalar(4)); | 
|  | 30 | p.setShader(setgrad(r, 0xFF00FF00, 0x00FF0000))->unref(); | 
|  | 31 | canvas->drawRect(r, p); | 
|  | 32 | canvas->drawRect(r, p2); | 
|  | 33 | } | 
|  | 34 |  | 
|  | 35 | /////////////////////////////////////////////////////////////////////////////// | 
|  | 36 |  | 
| reed@android.com | a3c0588 | 2009-04-02 20:49:39 +0000 | [diff] [blame] | 37 | struct GradData { | 
|  | 38 | int             fCount; | 
|  | 39 | const SkColor*  fColors; | 
|  | 40 | const SkScalar* fPos; | 
|  | 41 | }; | 
|  | 42 |  | 
|  | 43 | static const SkColor gColors[] = { | 
|  | 44 | SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK | 
|  | 45 | }; | 
|  | 46 | static const SkScalar gPos0[] = { 0, SK_Scalar1 }; | 
|  | 47 | static const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 }; | 
|  | 48 | static const SkScalar gPos2[] = { | 
|  | 49 | 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1 | 
|  | 50 | }; | 
|  | 51 |  | 
|  | 52 | static const GradData gGradData[] = { | 
|  | 53 | { 2, gColors, NULL }, | 
|  | 54 | { 2, gColors, gPos0 }, | 
|  | 55 | { 2, gColors, gPos1 }, | 
|  | 56 | { 5, gColors, NULL }, | 
|  | 57 | { 5, gColors, gPos2 } | 
|  | 58 | }; | 
|  | 59 |  | 
|  | 60 | static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, | 
|  | 61 | SkShader::TileMode tm, SkUnitMapper* mapper) { | 
|  | 62 | return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, | 
|  | 63 | data.fCount, tm, mapper); | 
|  | 64 | } | 
|  | 65 |  | 
|  | 66 | static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, | 
|  | 67 | SkShader::TileMode tm, SkUnitMapper* mapper) { | 
|  | 68 | SkPoint center; | 
|  | 69 | center.set(SkScalarAve(pts[0].fX, pts[1].fX), | 
|  | 70 | SkScalarAve(pts[0].fY, pts[1].fY)); | 
|  | 71 | return SkGradientShader::CreateRadial(center, center.fX, data.fColors, | 
|  | 72 | data.fPos, data.fCount, tm, mapper); | 
|  | 73 | } | 
|  | 74 |  | 
|  | 75 | static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, | 
|  | 76 | SkShader::TileMode tm, SkUnitMapper* mapper) { | 
|  | 77 | SkPoint center; | 
|  | 78 | center.set(SkScalarAve(pts[0].fX, pts[1].fX), | 
|  | 79 | SkScalarAve(pts[0].fY, pts[1].fY)); | 
|  | 80 | return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, | 
|  | 81 | data.fPos, data.fCount, mapper); | 
|  | 82 | } | 
|  | 83 |  | 
|  | 84 | typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, | 
|  | 85 | SkShader::TileMode tm, SkUnitMapper* mapper); | 
|  | 86 | static const GradMaker gGradMakers[] = { | 
|  | 87 | MakeLinear, MakeRadial, MakeSweep | 
|  | 88 | }; | 
|  | 89 |  | 
|  | 90 | /////////////////////////////////////////////////////////////////////////////// | 
|  | 91 |  | 
|  | 92 | class GradientsView : public SkView { | 
|  | 93 | public: | 
|  | 94 | GradientsView() {} | 
|  | 95 |  | 
|  | 96 | protected: | 
|  | 97 | // overrides from SkEventSink | 
|  | 98 | virtual bool onQuery(SkEvent* evt) { | 
|  | 99 | if (SampleCode::TitleQ(*evt)) { | 
|  | 100 | SampleCode::TitleR(evt, "Gradients"); | 
|  | 101 | return true; | 
|  | 102 | } | 
|  | 103 | return this->INHERITED::onQuery(evt); | 
|  | 104 | } | 
|  | 105 |  | 
|  | 106 | void drawBG(SkCanvas* canvas) { | 
|  | 107 | canvas->drawColor(0xFFDDDDDD); | 
|  | 108 | } | 
|  | 109 |  | 
|  | 110 | virtual void onDraw(SkCanvas* canvas) { | 
|  | 111 | this->drawBG(canvas); | 
|  | 112 |  | 
|  | 113 | SkPoint pts[2] = { | 
|  | 114 | { 0, 0 }, | 
|  | 115 | { SkIntToScalar(100), SkIntToScalar(100) } | 
|  | 116 | }; | 
|  | 117 | SkShader::TileMode tm = SkShader::kClamp_TileMode; | 
|  | 118 | SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; | 
|  | 119 | SkPaint paint; | 
|  | 120 | paint.setAntiAlias(true); | 
| reed@android.com | 1c12abe | 2009-07-02 15:01:02 +0000 | [diff] [blame^] | 121 |  | 
|  | 122 | canvas->save(); | 
| reed@android.com | a3c0588 | 2009-04-02 20:49:39 +0000 | [diff] [blame] | 123 | canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); | 
|  | 124 | for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { | 
|  | 125 | canvas->save(); | 
|  | 126 | for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { | 
|  | 127 | SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, NULL); | 
|  | 128 | paint.setShader(shader); | 
|  | 129 | canvas->drawRect(r, paint); | 
|  | 130 | shader->unref(); | 
|  | 131 | canvas->translate(0, SkIntToScalar(120)); | 
|  | 132 | } | 
|  | 133 | canvas->restore(); | 
|  | 134 | canvas->translate(SkIntToScalar(120), 0); | 
|  | 135 | } | 
| reed@android.com | 1c12abe | 2009-07-02 15:01:02 +0000 | [diff] [blame^] | 136 | canvas->restore(); | 
|  | 137 |  | 
|  | 138 | canvas->translate(0, SkIntToScalar(370)); | 
|  | 139 | test_alphagradients(canvas); | 
| reed@android.com | a3c0588 | 2009-04-02 20:49:39 +0000 | [diff] [blame] | 140 | } | 
|  | 141 |  | 
|  | 142 | private: | 
|  | 143 | typedef SkView INHERITED; | 
|  | 144 | }; | 
|  | 145 |  | 
|  | 146 | /////////////////////////////////////////////////////////////////////////////// | 
|  | 147 |  | 
|  | 148 | static SkView* MyFactory() { return new GradientsView; } | 
|  | 149 | static SkViewRegister reg(MyFactory); | 
|  | 150 |  |