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); 752a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString(txt, 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