Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 | |
| 2 /* | |
|
robertphillips
2014/11/26 14:21:35
2014 ?
reed1
2014/11/26 14:25:53
Done.
| |
| 3 * Copyright 2011 Google Inc. | |
|
tfarina
2014/11/26 14:10:09
s/2011/2014?
reed1
2014/11/26 14:12:58
Done.
| |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 */ | |
| 8 #include "SampleCode.h" | |
| 9 #include "SkView.h" | |
| 10 #include "SkCanvas.h" | |
|
robertphillips
2014/11/26 14:21:35
not needed ?
reed1
2014/11/26 14:25:53
Done.
| |
| 11 #include "SkGradientShader.h" | |
| 12 #include "SkPath.h" | |
|
robertphillips
2014/11/26 14:21:35
same ?
reed1
2014/11/26 14:25:53
Done.
| |
| 13 #include "SkRegion.h" | |
| 14 #include "SkShader.h" | |
| 15 #include "SkUtils.h" | |
|
robertphillips
2014/11/26 14:21:35
same ?
reed1
2014/11/26 14:25:53
Done.
| |
| 16 #include "SkComposeShader.h" | |
| 17 #include "Sk1DPathEffect.h" | |
| 18 #include "SkCornerPathEffect.h" | |
| 19 #include "SkPathMeasure.h" | |
| 20 #include "SkPictureRecorder.h" | |
| 21 #include "SkRandom.h" | |
| 22 #include "SkColorPriv.h" | |
| 23 #include "SkColorFilter.h" | |
| 24 #include "SkLayerRasterizer.h" | |
| 25 | |
| 26 #include "SkCanvasDrawable.h" | |
| 27 #include "SkInterpolator.h" | |
| 28 | |
| 29 const SkRect gUnitSquare = { -1, -1, 1, 1 }; | |
| 30 | |
| 31 static void color_to_floats(SkColor c, SkScalar f[4]) { | |
| 32 f[0] = SkIntToScalar(SkColorGetA(c)); | |
| 33 f[1] = SkIntToScalar(SkColorGetR(c)); | |
| 34 f[2] = SkIntToScalar(SkColorGetG(c)); | |
| 35 f[3] = SkIntToScalar(SkColorGetB(c)); | |
| 36 } | |
| 37 | |
| 38 static SkColor floats_to_color(const SkScalar f[4]) { | |
| 39 return SkColorSetARGB(SkScalarRoundToInt(f[0]), | |
| 40 SkScalarRoundToInt(f[1]), | |
| 41 SkScalarRoundToInt(f[2]), | |
| 42 SkScalarRoundToInt(f[3])); | |
| 43 } | |
| 44 | |
| 45 static bool oval_contains(const SkRect& r, SkScalar x, SkScalar y) { | |
| 46 SkMatrix m; | |
| 47 m.setRectToRect(r, gUnitSquare, SkMatrix::kFill_ScaleToFit); | |
| 48 SkPoint pt; | |
| 49 m.mapXY(x, y, &pt); | |
| 50 return pt.lengthSqd() <= 1; | |
| 51 } | |
| 52 | |
| 53 static SkColor rand_opaque_color(uint32_t seed) { | |
| 54 SkRandom rand(seed); | |
| 55 return rand.nextU() | (0xFF << 24); | |
| 56 } | |
| 57 | |
| 58 class HTDrawable : public SkCanvasDrawable { | |
| 59 SkRect fR; | |
| 60 SkColor fColor; | |
| 61 SkInterpolator* fInterp; | |
| 62 | |
| 63 public: | |
| 64 HTDrawable(SkRandom& rand) { | |
| 65 fR = SkRect::MakeXYWH(rand.nextRangeF(0, 640), rand.nextRangeF(0, 480), | |
| 66 rand.nextRangeF(20, 200), rand.nextRangeF(20, 200) ); | |
| 67 fColor = rand_opaque_color(rand.nextU()); | |
| 68 fInterp = NULL; | |
| 69 } | |
| 70 | |
| 71 void spawnAnimation() { | |
| 72 SkDELETE(fInterp); | |
| 73 fInterp = SkNEW_ARGS(SkInterpolator, (5, 3)); | |
| 74 SkScalar values[5]; | |
| 75 color_to_floats(fColor, values); values[4] = 0; | |
| 76 fInterp->setKeyFrame(0, SampleCode::GetAnimTime(), values); | |
| 77 values[0] = 0; values[4] = 180; | |
| 78 fInterp->setKeyFrame(1, SampleCode::GetAnimTime() + 1000, values); | |
| 79 color_to_floats(rand_opaque_color(fColor), values); values[4] = 360; | |
| 80 fInterp->setKeyFrame(2, SampleCode::GetAnimTime() + 2000, values); | |
| 81 | |
| 82 fInterp->setMirror(true); | |
| 83 fInterp->setRepeatCount(3); | |
| 84 | |
| 85 this->notifyDrawingChanged(); | |
| 86 } | |
| 87 | |
| 88 bool hitTest(SkScalar x, SkScalar y) { | |
| 89 return oval_contains(fR, x, y); | |
| 90 } | |
| 91 | |
| 92 void onDraw(SkCanvas* canvas) SK_OVERRIDE { | |
| 93 SkAutoCanvasRestore acr(canvas, false); | |
| 94 | |
| 95 SkPaint paint; | |
| 96 paint.setAntiAlias(true); | |
| 97 | |
| 98 if (fInterp) { | |
| 99 SkScalar values[5]; | |
| 100 SkInterpolator::Result res = fInterp->timeToValues(SampleCode::GetAn imTime(), values); | |
| 101 fColor = floats_to_color(values); | |
| 102 | |
| 103 canvas->save(); | |
| 104 canvas->translate(fR.centerX(), fR.centerY()); | |
| 105 canvas->rotate(values[4]); | |
| 106 canvas->translate(-fR.centerX(), -fR.centerY()); | |
| 107 | |
| 108 switch (res) { | |
| 109 case SkInterpolator::kFreezeEnd_Result: | |
| 110 SkDELETE(fInterp); | |
| 111 fInterp = NULL; | |
| 112 break; | |
| 113 default: | |
| 114 break; | |
| 115 } | |
| 116 } | |
| 117 paint.setColor(fColor); | |
| 118 canvas->drawRect(fR, paint); | |
| 119 } | |
| 120 | |
| 121 SkRect onGetBounds() SK_OVERRIDE { return fR; } | |
| 122 }; | |
| 123 | |
| 124 class HTView : public SampleView { | |
| 125 public: | |
| 126 enum { | |
| 127 N = 50, | |
| 128 W = 640, | |
| 129 H = 480, | |
| 130 }; | |
| 131 | |
| 132 struct Rec { | |
| 133 HTDrawable* fDrawable; | |
| 134 }; | |
| 135 Rec fArray[N]; | |
| 136 SkAutoTUnref<SkCanvasDrawable> fRoot; | |
| 137 | |
| 138 HTView() { | |
| 139 SkRandom rand; | |
| 140 | |
| 141 SkPictureRecorder recorder; | |
| 142 SkCanvas* canvas = recorder.beginRecording(SkRect::MakeWH(W, H)); | |
| 143 for (int i = 0; i < N; ++i) { | |
| 144 fArray[i].fDrawable = new HTDrawable(rand); | |
| 145 canvas->EXPERIMENTAL_drawDrawable(fArray[i].fDrawable); | |
| 146 fArray[i].fDrawable->unref(); | |
| 147 } | |
| 148 fRoot.reset(recorder.EXPERIMENTAL_endRecordingAsDrawable()); | |
| 149 } | |
| 150 | |
| 151 protected: | |
| 152 // overrides from SkEventSink | |
| 153 bool onQuery(SkEvent* evt) SK_OVERRIDE { | |
| 154 if (SampleCode::TitleQ(*evt)) { | |
| 155 SampleCode::TitleR(evt, "HT"); | |
| 156 return true; | |
| 157 } | |
| 158 return this->INHERITED::onQuery(evt); | |
| 159 } | |
| 160 | |
| 161 void onDrawContent(SkCanvas* canvas) SK_OVERRIDE { | |
| 162 canvas->EXPERIMENTAL_drawDrawable(fRoot); | |
| 163 this->inval(NULL); | |
| 164 } | |
| 165 | |
| 166 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) SK_ OVERRIDE { | |
| 167 // search backwards to find the top-most | |
| 168 for (int i = N - 1; i >= 0; --i) { | |
| 169 if (fArray[i].fDrawable->hitTest(x, y)) { | |
| 170 fArray[i].fDrawable->spawnAnimation(); | |
| 171 break; | |
| 172 } | |
| 173 } | |
| 174 this->inval(NULL); | |
| 175 return NULL; | |
| 176 } | |
| 177 | |
| 178 private: | |
| 179 typedef SampleView INHERITED; | |
| 180 }; | |
| 181 | |
| 182 ////////////////////////////////////////////////////////////////////////////// | |
| 183 | |
| 184 static SkView* MyFactory() { return new HTView; } | |
| 185 static SkViewRegister reg(MyFactory); | |
| OLD | NEW |