diff options
Diffstat (limited to 'samplecode/SampleDegenerateTwoPtRadials.cpp')
-rw-r--r-- | samplecode/SampleDegenerateTwoPtRadials.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/samplecode/SampleDegenerateTwoPtRadials.cpp b/samplecode/SampleDegenerateTwoPtRadials.cpp new file mode 100644 index 0000000..5b8f46d --- /dev/null +++ b/samplecode/SampleDegenerateTwoPtRadials.cpp @@ -0,0 +1,92 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#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); |