1def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com/* 2def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com * Copyright 2013 Google Inc. 3def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com * 4def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com * Use of this source code is governed by a BSD-style license that can be 5def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com * found in the LICENSE file. 6def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com */ 7def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 8def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com#include "gm.h" 9def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com#include "SkCanvas.h" 10def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com#include "SkTArray.h" 11def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 12def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comnamespace skiagm { 13def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 14def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comclass ConicPathsGM : public GM { 15def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comprotected: 16def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 17def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com virtual SkString onShortName() SK_OVERRIDE { 18def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com return SkString("conicpaths"); 19def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 20def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 2109ebe0be2696f43bb9ad169f09dfdfa8cc9b7521skia.committer@gmail.com virtual SkISize onISize() SK_OVERRIDE { 2245a30714982e8b5b18539b2ad71f3aceab8ed075egdaniel@google.com return SkISize::Make(1000, 1000); 23def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 24def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 25def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com virtual void onOnceBeforeDraw() SK_OVERRIDE { 26def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 27def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* conicCirlce = &fPaths.push_back(); 28def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com conicCirlce->moveTo(0, -0); 29def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com conicCirlce->conicTo(SkIntToScalar(0), SkIntToScalar(50), 30def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(50), SkIntToScalar(50), 31def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkScalarHalf(SkScalarSqrt(2))); 32def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com conicCirlce->rConicTo(SkIntToScalar(50), SkIntToScalar(0), 33def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(50), SkIntToScalar(-50), 34def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkScalarHalf(SkScalarSqrt(2))); 35def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com conicCirlce->rConicTo(SkIntToScalar(0), SkIntToScalar(-50), 36def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(-50), SkIntToScalar(-50), 37def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkScalarHalf(SkScalarSqrt(2))); 38def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com conicCirlce->rConicTo(SkIntToScalar(-50), SkIntToScalar(0), 39def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(-50), SkIntToScalar(50), 40def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkScalarHalf(SkScalarSqrt(2))); 41def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 42def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 43def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 44def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* hyperbola = &fPaths.push_back(); 45def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com hyperbola->moveTo(0, -0); 46def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com hyperbola->conicTo(SkIntToScalar(0), SkIntToScalar(100), 47def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(100), SkIntToScalar(100), 48def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(2)); 49def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 50def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 51def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* thinHyperbola = &fPaths.push_back(); 52def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com thinHyperbola->moveTo(0, -0); 53def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com thinHyperbola->conicTo(SkIntToScalar(100), SkIntToScalar(100), 54def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(5), SkIntToScalar(0), 55def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(2)); 56def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 57def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 58def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* veryThinHyperbola = &fPaths.push_back(); 59def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com veryThinHyperbola->moveTo(0, -0); 60def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com veryThinHyperbola->conicTo(SkIntToScalar(100), SkIntToScalar(100), 61def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(1), SkIntToScalar(0), 62def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(2)); 63def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 64def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 65def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* closedHyperbola = &fPaths.push_back(); 66def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com closedHyperbola->moveTo(0, -0); 67def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com closedHyperbola->conicTo(SkIntToScalar(100), SkIntToScalar(100), 68def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(0), SkIntToScalar(0), 69def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(2)); 70def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 71def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 72def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com // using 1 as weight defaults to using quadTo 73def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* nearParabola = &fPaths.push_back(); 74def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com nearParabola->moveTo(0, -0); 75def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com nearParabola->conicTo(SkIntToScalar(0), SkIntToScalar(100), 76def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(100), SkIntToScalar(100), 77c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com 0.999f); 78def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 79def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 80def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* thinEllipse = &fPaths.push_back(); 81def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com thinEllipse->moveTo(0, -0); 82def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com thinEllipse->conicTo(SkIntToScalar(100), SkIntToScalar(100), 83def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(5), SkIntToScalar(0), 84def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SK_ScalarHalf); 85def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 86def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 87def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* veryThinEllipse = &fPaths.push_back(); 88def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com veryThinEllipse->moveTo(0, -0); 89def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com veryThinEllipse->conicTo(SkIntToScalar(100), SkIntToScalar(100), 90def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(1), SkIntToScalar(0), 91def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SK_ScalarHalf); 92def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 93def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 94def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* closedEllipse = &fPaths.push_back(); 95def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com closedEllipse->moveTo(0, -0); 96def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com closedEllipse->conicTo(SkIntToScalar(100), SkIntToScalar(100), 97def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkIntToScalar(0), SkIntToScalar(0), 98def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SK_ScalarHalf); 99def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 100def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 101def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 102def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 103def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com static const SkAlpha kAlphaValue[] = { 0xFF, 0x40 }; 104def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 105def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com enum { 106def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com kMargin = 15, 107def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com }; 108def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com int wrapX = canvas->getDeviceSize().fWidth - kMargin; 109def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 110def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkScalar maxH = 0; 111def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->translate(SkIntToScalar(kMargin), SkIntToScalar(kMargin)); 112def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->save(); 113def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 114def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkScalar x = SkIntToScalar(kMargin); 115def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com for (int p = 0; p < fPaths.count(); ++p) { 116def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphaValue); ++a) { 117def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com for (int aa = 0; aa < 2; ++aa) { 118def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com for (int fh = 0; fh < 2; ++fh) { 119def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 120def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com const SkRect& bounds = fPaths[p].getBounds(); 121def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 122def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com if (x + bounds.width() > wrapX) { 123def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->restore(); 124def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->translate(0, maxH + SkIntToScalar(kMargin)); 125def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->save(); 126def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com maxH = 0; 127def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com x = SkIntToScalar(kMargin); 128def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 129def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 130def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPaint paint; 131def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com paint.setARGB(kAlphaValue[a], 0, 0, 0); 132def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com paint.setAntiAlias(SkToBool(aa)); 133def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com if (fh == 1) { 134def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com paint.setStyle(SkPaint::kStroke_Style); 135def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com paint.setStrokeWidth(0); 136def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } else if (fh == 0) { 137def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com paint.setStyle(SkPaint::kFill_Style); 138def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 139def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->save(); 140def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->translate(-bounds.fLeft, -bounds.fTop); 141def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->drawPath(fPaths[p], paint); 142def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->restore(); 143def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 144def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com maxH = SkMaxScalar(maxH, bounds.height()); 145def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 146def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkScalar dx = bounds.width() + SkIntToScalar(kMargin); 147def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com x += dx; 148def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->translate(dx, 0); 149def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 150def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 151def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 152def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 153def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->restore(); 154def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 155def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 156c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com virtual uint32_t onGetFlags() const SK_OVERRIDE { 157c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com return kSkipPDF_Flag; 158c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com } 159c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com 160def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comprivate: 161def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkTArray<SkPath> fPaths; 162def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com typedef GM INHERITED; 163def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com}; 164def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 165def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com////////////////////////////////////////////////////////////////////////////// 166def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 167def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comDEF_GM( return SkNEW(ConicPathsGM); ) 168def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com} 169