aboutsummaryrefslogtreecommitdiffstats
path: root/samplecode/SampleCircle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'samplecode/SampleCircle.cpp')
-rw-r--r--samplecode/SampleCircle.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/samplecode/SampleCircle.cpp b/samplecode/SampleCircle.cpp
new file mode 100644
index 0000000..bfb92d4
--- /dev/null
+++ b/samplecode/SampleCircle.cpp
@@ -0,0 +1,137 @@
+#include "SampleCode.h"
+#include "SkView.h"
+#include "SkCanvas.h"
+#include "SkDevice.h"
+#include "SkPaint.h"
+
+// ensure that we don't accidentally screw up the bounds when the oval is
+// fractional, and the impl computes the center and radii, and uses them to
+// reconstruct the edges of the circle.
+// see bug# 1504910
+static void test_circlebounds(SkCanvas* canvas) {
+#ifdef SK_SCALAR_IS_FLOAT
+ SkRect r = { 1.39999998, 1, 21.3999996, 21 };
+ SkPath p;
+ p.addOval(r);
+ SkRect r2;
+ p.computeBounds(&r2, SkPath::kFast_BoundsType);
+ SkASSERT(r == r2);
+#endif
+}
+
+class CircleView : public SkView {
+public:
+ static const SkScalar ANIM_DX = SK_Scalar1 / 67;
+ static const SkScalar ANIM_DY = SK_Scalar1 / 29;
+ static const SkScalar ANIM_RAD = SK_Scalar1 / 19;
+ SkScalar fDX, fDY, fRAD;
+
+ CircleView() {
+ fDX = fDY = fRAD = 0;
+ }
+
+protected:
+ // overrides from SkEventSink
+ virtual bool onQuery(SkEvent* evt) {
+ if (SampleCode::TitleQ(*evt)) {
+ SampleCode::TitleR(evt, "Circles");
+ return true;
+ }
+ return this->INHERITED::onQuery(evt);
+ }
+
+ void drawBG(SkCanvas* canvas) {
+ canvas->drawColor(SK_ColorWHITE);
+ }
+
+ void circle(SkCanvas* canvas, int width, bool aa) {
+ SkPaint paint;
+
+ paint.setAntiAlias(aa);
+ if (width < 0) {
+ paint.setStyle(SkPaint::kFill_Style);
+ } else {
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setStrokeWidth(SkIntToScalar(width));
+ }
+ canvas->drawCircle(0, 0, SkIntToScalar(9) + fRAD, paint);
+ }
+
+ void drawSix(SkCanvas* canvas, SkScalar dx, SkScalar dy) {
+ for (int width = -1; width <= 1; width++) {
+ canvas->save();
+ circle(canvas, width, false);
+ canvas->translate(0, dy);
+ circle(canvas, width, true);
+ canvas->restore();
+ canvas->translate(dx, 0);
+ }
+ }
+
+ static void blowup(SkCanvas* canvas, const SkIRect& src, const SkRect& dst) {
+ SkDevice* device = canvas->getDevice();
+ const SkBitmap& bm = device->accessBitmap(false);
+ canvas->drawBitmapRect(bm, &src, dst, NULL);
+ }
+
+ virtual void onDraw(SkCanvas* canvas) {
+ this->drawBG(canvas);
+
+ test_circlebounds(canvas);
+
+ if (false) {
+ // canvas->translate(SK_ScalarHalf, SK_ScalarHalf);
+
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ paint.setStyle(SkPaint::kStroke_Style);
+ canvas->drawCircle(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(2), paint);
+
+ SkIRect r;
+ r.set(7, 7, 13, 13);
+ SkRect dst;
+ dst.set(SkIntToScalar(100), SkIntToScalar(10), SkIntToScalar(200), SkIntToScalar(110));
+ blowup(canvas, r, dst);
+ return;
+ }
+
+ // test that degenerate rects do nothing
+ if (true) {
+ SkScalar x = SkIntToScalar(30);
+ SkRect r;
+ r.set(x, x, x, x);
+ SkPaint p;
+ canvas->drawRect(r, p);
+ p.setAntiAlias(true);
+ canvas->drawRect(r, p);
+ }
+
+ SkScalar dx = SkIntToScalar(32);
+ SkScalar dy = SkIntToScalar(32);
+
+ canvas->translate(dx + fDX, dy + fDY);
+ drawSix(canvas, dx, dy);
+
+ canvas->translate(dx, 0);
+ canvas->translate(SK_ScalarHalf, SK_ScalarHalf);
+ drawSix(canvas, dx, dy);
+
+ fDX += ANIM_DX;
+ fDY += ANIM_DY;
+ fRAD += ANIM_RAD;
+ this->inval(NULL);
+ }
+
+private:
+ typedef SkView INHERITED;
+};
+
+const SkScalar CircleView::ANIM_DX;
+const SkScalar CircleView::ANIM_DY;
+const SkScalar CircleView::ANIM_RAD;
+
+//////////////////////////////////////////////////////////////////////////////
+
+static SkView* MyFactory() { return new CircleView; }
+static SkViewRegister reg(MyFactory);
+