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"
922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com#include "SkView.h"
1022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com#include "SkCanvas.h"
1122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com#include "SkGradientShader.h"
12fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com#include "SkString.h"
1322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
1422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comstatic void draw_gradient2(SkCanvas* canvas, const SkRect& rect, SkScalar delta) {
1522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA };
164b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    SkScalar pos[] = { 0, 0.25f, 0.75f, SK_Scalar1 };
1722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
1822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar l = rect.fLeft;
1922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar t = rect.fTop;
2022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar w = rect.width();
2122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar h = rect.height();
2222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
2322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkASSERT(0 == SkScalarMod(w, SK_Scalar1 * 5));
2422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
2522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkPoint c0 = { l + 2 * w / 5 + delta, t + h / 2 };
2622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkPoint c1 = { l + 3 * w / 5, t + h / 2 };
2722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar r0 = w / 5;
2822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkScalar r1 = 2 * w / 5;
293e33258cd15faae4a2906ddcc586e4008ee20e68rileya@google.com    SkShader* s = SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, colors,
3022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com                                                         pos, SK_ARRAY_COUNT(pos),
3122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com                                                         SkShader::kClamp_TileMode);
3222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    SkPaint paint;
3322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    paint.setShader(s)->unref();
3422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
3522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    canvas->drawRect(rect, paint);
3622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com}
3722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
3822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
3922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comclass DegenerateTwoPtRadialsView : public SampleView {
4022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
4122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.compublic:
4222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    DegenerateTwoPtRadialsView() {
4322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        fTime = 0;
4422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        this->setBGColor(0xFFDDDDDD);
4522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    }
4622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
4722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.comprotected:
4822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    // overrides from SkEventSink
4922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    virtual bool onQuery(SkEvent* evt) {
5022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        if (SampleCode::TitleQ(*evt)) {
5122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com            SampleCode::TitleR(evt, "DegenerateTwoPtRadials");
5222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com            return true;
5322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        }
5422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        return this->INHERITED::onQuery(evt);
5522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    }
5622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
5722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    virtual void onDrawContent(SkCanvas* canvas) {
5822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        fTime += SampleCode::GetAnimSecondsDelta();
5922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar delta = fTime / 15.f;
60e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        int intPart = SkScalarFloorToInt(delta);
6122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        delta = delta - SK_Scalar1 * intPart;
6222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        if (intPart % 2) {
6322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com            delta = SK_Scalar1 - delta;
6422c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        }
6522c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        delta -= SK_ScalarHalf;
6622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        static const int DELTA_SCALE = 500;
6722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        delta /= DELTA_SCALE;
6822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com
6922c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar w = SK_Scalar1 * 500;
7022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar h = SK_Scalar1 * 500;
7122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar l = SK_Scalar1 * 100;
7222c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkScalar t = SK_Scalar1 * 100;
7322c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        draw_gradient2(canvas, SkRect::MakeXYWH(l, t, w, h), delta);
74fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com        SkString txt;
75fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com        txt.appendf("gap at \"tangent\" pt = %f", SkScalarToFloat(delta));
7622c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        SkPaint paint;
7722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        paint.setAntiAlias(true);
7822c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        paint.setColor(SK_ColorBLACK);
79fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com        canvas->drawText(txt.c_str(), txt.size(), l + w/2 + w*DELTA_SCALE*delta, t + h + SK_Scalar1 * 10, paint);
8022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com        this->inval(NULL);
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