1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7bf0001d0472d727266762c5967ec0d919a6df083reed@google.com
822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com#include "SampleCode.h"
976113a9b7716748c70ea0ecf7aacbabe4cce5009reed#include "SkAnimTimer.h"
1022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com#include "SkView.h"
1122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com#include "SkCanvas.h"
1222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com#include "SkGradientShader.h"
13fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com#include "SkString.h"
1422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
1522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comstatic void draw_gradient2(SkCanvas* canvas, const SkRect& rect, SkScalar delta) {
1622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA };
174b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    SkScalar pos[] = { 0, 0.25f, 0.75f, SK_Scalar1 };
1822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
1922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar l = rect.fLeft;
2022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar t = rect.fTop;
2122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar w = rect.width();
2222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar h = rect.height();
2322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
2422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkASSERT(0 == SkScalarMod(w, SK_Scalar1 * 5));
2522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
2622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkPoint c0 = { l + 2 * w / 5 + delta, t + h / 2 };
2722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkPoint c1 = { l + 3 * w / 5, t + h / 2 };
2822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar r0 = w / 5;
2922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar r1 = 2 * w / 5;
3022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkPaint paint;
318a21c9fe7f5fef9e87115defef27bd7218419f28reed    paint.setShader(SkGradientShader::MakeTwoPointConical(c0, r0, c1, r1, colors,
328a21c9fe7f5fef9e87115defef27bd7218419f28reed                                                          pos, SK_ARRAY_COUNT(pos),
338a21c9fe7f5fef9e87115defef27bd7218419f28reed                                                          SkShader::kClamp_TileMode));
3422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    canvas->drawRect(rect, paint);
3522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com}
3622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
3722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
3822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comclass DegenerateTwoPtRadialsView : public SampleView {
3922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.compublic:
4022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    DegenerateTwoPtRadialsView() {
4122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        fTime = 0;
4222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        this->setBGColor(0xFFDDDDDD);
4322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    }
4422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
4522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comprotected:
4636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onQuery(SkEvent* evt) override {
4722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        if (SampleCode::TitleQ(*evt)) {
4822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com            SampleCode::TitleR(evt, "DegenerateTwoPtRadials");
4922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com            return true;
5022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        }
5122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        return this->INHERITED::onQuery(evt);
5222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    }
5322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
5436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawContent(SkCanvas* canvas) override {
5522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar delta = fTime / 15.f;
56e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        int intPart = SkScalarFloorToInt(delta);
5722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        delta = delta - SK_Scalar1 * intPart;
5822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        if (intPart % 2) {
5922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com            delta = SK_Scalar1 - delta;
6022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        }
6122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        delta -= SK_ScalarHalf;
6222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        static const int DELTA_SCALE = 500;
6322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        delta /= DELTA_SCALE;
6422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
6522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar w = SK_Scalar1 * 500;
6622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar h = SK_Scalar1 * 500;
6722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar l = SK_Scalar1 * 100;
6822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar t = SK_Scalar1 * 100;
6922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        draw_gradient2(canvas, SkRect::MakeXYWH(l, t, w, h), delta);
70fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com        SkString txt;
71fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com        txt.appendf("gap at \"tangent\" pt = %f", SkScalarToFloat(delta));
7222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkPaint paint;
7322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        paint.setAntiAlias(true);
7422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        paint.setColor(SK_ColorBLACK);
75fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com        canvas->drawText(txt.c_str(), txt.size(), l + w/2 + w*DELTA_SCALE*delta, t + h + SK_Scalar1 * 10, paint);
76d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    }
77d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed
7836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onAnimate(const SkAnimTimer& timer) override {
7976113a9b7716748c70ea0ecf7aacbabe4cce5009reed        fTime = SkDoubleToScalar(timer.secs() / 15);
80d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed        return true;
8122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    }
8222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
8322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comprivate:
8422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar           fTime;
8522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    typedef SampleView INHERITED;
8622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com};
8722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
8822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
8922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
9022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comstatic SkView* MyFactory() { return new DegenerateTwoPtRadialsView; }
9122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comstatic SkViewRegister reg(MyFactory);
92