/* * 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);