11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SampleCode.h"
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkView.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "Sk64.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGradientShader.h"
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void draw_gradient2(SkCanvas* canvas, const SkRect& rect, SkScalar delta) {
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA };
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar pos[] = { 0, SkFloatToScalar(0.25f), SkFloatToScalar(0.75f), SK_Scalar1 };
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar l = rect.fLeft;
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar t = rect.fTop;
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar w = rect.width();
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar h = rect.height();
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(0 == SkScalarMod(w, SK_Scalar1 * 5));
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPoint c0 = { l + 2 * w / 5 + delta, t + h / 2 };
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPoint c1 = { l + 3 * w / 5, t + h / 2 };
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar r0 = w / 5;
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar r1 = 2 * w / 5;
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkShader* s = SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, colors,
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                         pos, SK_ARRAY_COUNT(pos),
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                         SkShader::kClamp_TileMode);
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPaint paint;
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint.setShader(s)->unref();
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    canvas->drawRect(rect, paint);
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass DegenerateTwoPtRadialsView : public SampleView {
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    DegenerateTwoPtRadialsView() {
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fTime = 0;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->setBGColor(0xFFDDDDDD);
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // overrides from SkEventSink
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onQuery(SkEvent* evt) {
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (SampleCode::TitleQ(*evt)) {
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SampleCode::TitleR(evt, "DegenerateTwoPtRadials");
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return true;
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->INHERITED::onQuery(evt);
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fTime += SampleCode::GetAnimSecondsDelta();
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar delta = fTime / 15.f;
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int intPart = SkScalarFloor(delta);
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        delta = delta - SK_Scalar1 * intPart;
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (intPart % 2) {
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            delta = SK_Scalar1 - delta;
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        delta -= SK_ScalarHalf;
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const int DELTA_SCALE = 500;
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        delta /= DELTA_SCALE;
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRect rect;
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar w = SK_Scalar1 * 500;
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar h = SK_Scalar1 * 500;
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar l = SK_Scalar1 * 100;
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar t = SK_Scalar1 * 100;
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        draw_gradient2(canvas, SkRect::MakeXYWH(l, t, w, h), delta);
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        char txt[512];
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        sprintf(txt, "gap at \"tangent\" pt = %f", SkScalarToFloat(delta));
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setAntiAlias(true);
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setColor(SK_ColorBLACK);
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawText(txt, strlen(txt), l + w/2 + w*DELTA_SCALE*delta, t + h + SK_Scalar1 * 10, paint);
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->inval(NULL);
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar           fTime;
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SampleView INHERITED;
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkView* MyFactory() { return new DegenerateTwoPtRadialsView; }
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkViewRegister reg(MyFactory);
93