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