diff options
author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-07-07 14:38:03 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-07-07 14:38:03 +0000 |
commit | 22c5deaf755223111cb055462ac5bbce623f3a08 (patch) | |
tree | 8dbe1b908876b666ac20823637051e786c70e92f /samplecode | |
parent | 2b75f4279a237ceea929ff8ac019f7fbd3ad08b5 (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')
-rw-r--r-- | samplecode/SampleDegenerateTwoPtRadials.cpp | 85 | ||||
-rw-r--r-- | samplecode/SampleXfermodesBlur.cpp | 50 |
2 files changed, 86 insertions, 49 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); diff --git a/samplecode/SampleXfermodesBlur.cpp b/samplecode/SampleXfermodesBlur.cpp index 0167a6d4a0..03b29683a3 100644 --- a/samplecode/SampleXfermodesBlur.cpp +++ b/samplecode/SampleXfermodesBlur.cpp @@ -24,50 +24,6 @@ #include "SkImageDecoder.h" #include "SkBlurMaskFilter.h" -static void test_gradient2(SkCanvas* canvas) { -#if 1 - SkBitmap bm; - bm.setConfig(SkBitmap::kARGB_8888_Config, 1, 1); - bm.allocPixels(); - *bm.getAddr32(0, 0) = SkPackARGB32(0xFF, 0, 0xFF, 0); - - SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode, - SkShader::kRepeat_TileMode); -#else -/* - ctx.fillStyle = '#f00'; - ctx.fillRect(0, 0, 100, 50); - - var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150); - g.addColorStop(0, '#f00'); - g.addColorStop(0.01, '#0f0'); - g.addColorStop(0.99, '#0f0'); - g.addColorStop(1, '#f00'); - ctx.fillStyle = g; - ctx.fillRect(0, 0, 100, 50); -*/ - SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorRED }; - SkScalar pos[] = { 0, SkFloatToScalar(0.01f), SkFloatToScalar(0.99f), SK_Scalar1 }; - SkPoint c0 = { -80, 25 }; - SkScalar r0 = 70; - SkPoint c1 = { 0, 25 }; - SkScalar r1 = 150; - SkShader* s = SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, colors, - pos, SK_ARRAY_COUNT(pos), - SkShader::kClamp_TileMode); -#endif - - SkPaint paint; - paint.setShader(s)->unref(); - - canvas->drawPaint(paint); - - paint.setShader(NULL); - paint.setStyle(SkPaint::kStroke_Style); - SkRect r = { 0, 0, 100, 50 }; - canvas->drawRect(r, paint); -} - static void setNamedTypeface(SkPaint* paint, const char name[]) { SkTypeface* face = SkTypeface::CreateFromName(name, SkTypeface::kNormal); paint->setTypeface(face); @@ -110,7 +66,7 @@ class XfermodesBlurView : public SampleView { public: const static int W = 64; const static int H = 64; - XfermodesBlurView() { + XfermodesBlurView() { const int W = 64; const int H = 64; @@ -130,10 +86,6 @@ protected: } virtual void onDrawContent(SkCanvas* canvas) { - if (false) { - test_gradient2(canvas); - return; - } canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); const struct { |