aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SampleDegenerateTwoPtRadials.cpp
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-07-07 14:38:03 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-07-07 14:38:03 +0000
commit22c5deaf755223111cb055462ac5bbce623f3a08 (patch)
tree8dbe1b908876b666ac20823637051e786c70e92f /samplecode/SampleDegenerateTwoPtRadials.cpp
parent2b75f4279a237ceea929ff8ac019f7fbd3ad08b5 (diff)
Fix div by zero in GPU degenerate radials (and add sample and gm baselines)
Review URL: http://codereview.appspot.com/4675062/ git-svn-id: http://skia.googlecode.com/svn/trunk@1817 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SampleDegenerateTwoPtRadials.cpp')
-rw-r--r--samplecode/SampleDegenerateTwoPtRadials.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/samplecode/SampleDegenerateTwoPtRadials.cpp b/samplecode/SampleDegenerateTwoPtRadials.cpp
new file mode 100644
index 0000000000..ed10ce2304
--- /dev/null
+++ b/samplecode/SampleDegenerateTwoPtRadials.cpp
@@ -0,0 +1,85 @@
+#include "SampleCode.h"
+#include "SkView.h"
+#include "SkCanvas.h"
+#include "Sk64.h"
+#include "SkGradientShader.h"
+
+static void draw_gradient2(SkCanvas* canvas, const SkRect& rect, SkScalar delta) {
+ SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA };
+ SkScalar pos[] = { 0, SkFloatToScalar(0.25f), SkFloatToScalar(0.75f), SK_Scalar1 };
+
+ SkScalar l = rect.fLeft;
+ SkScalar t = rect.fTop;
+ SkScalar w = rect.width();
+ SkScalar h = rect.height();
+
+ SkASSERT(0 == SkScalarMod(w, SK_Scalar1 * 5));
+
+ SkPoint c0 = { l + 2 * w / 5 + delta, t + h / 2 };
+ SkPoint c1 = { l + 3 * w / 5, t + h / 2 };
+ SkScalar r0 = w / 5;
+ SkScalar r1 = 2 * w / 5;
+ SkShader* s = SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, colors,
+ pos, SK_ARRAY_COUNT(pos),
+ SkShader::kClamp_TileMode);
+ SkPaint paint;
+ paint.setShader(s)->unref();
+
+ canvas->drawRect(rect, paint);
+}
+
+
+class DegenerateTwoPtRadialsView : public SampleView {
+
+public:
+ DegenerateTwoPtRadialsView() {
+ fTime = 0;
+ this->setBGColor(0xFFDDDDDD);
+ }
+
+protected:
+ // overrides from SkEventSink
+ virtual bool onQuery(SkEvent* evt) {
+ if (SampleCode::TitleQ(*evt)) {
+ SampleCode::TitleR(evt, "DegenerateTwoPtRadials");
+ return true;
+ }
+ return this->INHERITED::onQuery(evt);
+ }
+
+ virtual void onDrawContent(SkCanvas* canvas) {
+ fTime += SampleCode::GetAnimSecondsDelta();
+ SkScalar delta = fTime / 15.f;
+ int intPart = SkScalarFloor(delta);
+ delta = delta - SK_Scalar1 * intPart;
+ if (intPart % 2) {
+ delta = SK_Scalar1 - delta;
+ }
+ delta -= SK_ScalarHalf;
+ static const int DELTA_SCALE = 500;
+ delta /= DELTA_SCALE;
+
+ SkRect rect;
+ SkScalar w = SK_Scalar1 * 500;
+ SkScalar h = SK_Scalar1 * 500;
+ SkScalar l = SK_Scalar1 * 100;
+ SkScalar t = SK_Scalar1 * 100;
+ draw_gradient2(canvas, SkRect::MakeXYWH(l, t, w, h), delta);
+ char txt[512];
+ sprintf(txt, "gap at \"tangent\" pt = %f", SkScalarToFloat(delta));
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ paint.setColor(SK_ColorBLACK);
+ canvas->drawText(txt, strlen(txt), l + w/2 + w*DELTA_SCALE*delta, t + h + SK_Scalar1 * 10, paint);
+ this->inval(NULL);
+ }
+
+private:
+ SkScalar fTime;
+ typedef SampleView INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static SkView* MyFactory() { return new DegenerateTwoPtRadialsView; }
+static SkViewRegister reg(MyFactory);