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