conicpaths.cpp revision 40c85e41b8be96f47f03a34bb2938696037afad4
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 12d1bd1d75a3b5902193b430a611f2eb46edf38435reedclass ConicPathsGM : public skiagm::GM { 13def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comprotected: 14def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 15d1bd1d75a3b5902193b430a611f2eb46edf38435reed SkString onShortName() SK_OVERRIDE { 16def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com return SkString("conicpaths"); 17def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 18def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 19d1bd1d75a3b5902193b430a611f2eb46edf38435reed SkISize onISize() SK_OVERRIDE { 2040c85e41b8be96f47f03a34bb2938696037afad4reed return SkISize::Make(920, 960); 21def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 22def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 23d1bd1d75a3b5902193b430a611f2eb46edf38435reed void onOnceBeforeDraw() SK_OVERRIDE { 24def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 25d1bd1d75a3b5902193b430a611f2eb46edf38435reed const SkScalar w = SkScalarSqrt(2)/2; 26def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* conicCirlce = &fPaths.push_back(); 2740c85e41b8be96f47f03a34bb2938696037afad4reed conicCirlce->moveTo(0, 0); 28d1bd1d75a3b5902193b430a611f2eb46edf38435reed conicCirlce->conicTo(0, 50, 50, 50, w); 29d1bd1d75a3b5902193b430a611f2eb46edf38435reed conicCirlce->rConicTo(50, 0, 50, -50, w); 30d1bd1d75a3b5902193b430a611f2eb46edf38435reed conicCirlce->rConicTo(0, -50, -50, -50, w); 31d1bd1d75a3b5902193b430a611f2eb46edf38435reed conicCirlce->rConicTo(-50, 0, -50, 50, w); 32def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 33def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 34def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 35def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* hyperbola = &fPaths.push_back(); 3640c85e41b8be96f47f03a34bb2938696037afad4reed hyperbola->moveTo(0, 0); 37d1bd1d75a3b5902193b430a611f2eb46edf38435reed hyperbola->conicTo(0, 100, 100, 100, 2); 38def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 39def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 40def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* thinHyperbola = &fPaths.push_back(); 4140c85e41b8be96f47f03a34bb2938696037afad4reed thinHyperbola->moveTo(0, 0); 42d1bd1d75a3b5902193b430a611f2eb46edf38435reed thinHyperbola->conicTo(100, 100, 5, 0, 2); 43def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 44def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 45def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* veryThinHyperbola = &fPaths.push_back(); 4640c85e41b8be96f47f03a34bb2938696037afad4reed veryThinHyperbola->moveTo(0, 0); 47d1bd1d75a3b5902193b430a611f2eb46edf38435reed veryThinHyperbola->conicTo(100, 100, 1, 0, 2); 48def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 49def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 50def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* closedHyperbola = &fPaths.push_back(); 5140c85e41b8be96f47f03a34bb2938696037afad4reed closedHyperbola->moveTo(0, 0); 52d1bd1d75a3b5902193b430a611f2eb46edf38435reed closedHyperbola->conicTo(100, 100, 0, 0, 2); 53def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 54def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 55def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com // using 1 as weight defaults to using quadTo 56def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* nearParabola = &fPaths.push_back(); 5740c85e41b8be96f47f03a34bb2938696037afad4reed nearParabola->moveTo(0, 0); 58d1bd1d75a3b5902193b430a611f2eb46edf38435reed nearParabola->conicTo(0, 100, 100, 100, 0.999f); 59def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 60def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 61def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* thinEllipse = &fPaths.push_back(); 6240c85e41b8be96f47f03a34bb2938696037afad4reed thinEllipse->moveTo(0, 0); 63d1bd1d75a3b5902193b430a611f2eb46edf38435reed thinEllipse->conicTo(100, 100, 5, 0, SK_ScalarHalf); 64def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 65def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 66def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* veryThinEllipse = &fPaths.push_back(); 6740c85e41b8be96f47f03a34bb2938696037afad4reed veryThinEllipse->moveTo(0, 0); 68d1bd1d75a3b5902193b430a611f2eb46edf38435reed veryThinEllipse->conicTo(100, 100, 1, 0, SK_ScalarHalf); 69def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 70def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com { 71def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkPath* closedEllipse = &fPaths.push_back(); 7240c85e41b8be96f47f03a34bb2938696037afad4reed closedEllipse->moveTo(0, 0); 73d1bd1d75a3b5902193b430a611f2eb46edf38435reed closedEllipse->conicTo(100, 100, 0, 0, SK_ScalarHalf); 74def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 75def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 76def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 77d1bd1d75a3b5902193b430a611f2eb46edf38435reed void onDraw(SkCanvas* canvas) SK_OVERRIDE { 78d1bd1d75a3b5902193b430a611f2eb46edf38435reed const SkAlpha kAlphaValue[] = { 0xFF, 0x40 }; 79def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 80d1bd1d75a3b5902193b430a611f2eb46edf38435reed const SkScalar margin = 15; 81d1bd1d75a3b5902193b430a611f2eb46edf38435reed canvas->translate(margin, margin); 82def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 8340c85e41b8be96f47f03a34bb2938696037afad4reed SkPaint paint; 84def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com for (int p = 0; p < fPaths.count(); ++p) { 8540c85e41b8be96f47f03a34bb2938696037afad4reed canvas->save(); 86def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphaValue); ++a) { 8740c85e41b8be96f47f03a34bb2938696037afad4reed paint.setARGB(kAlphaValue[a], 0, 0, 0); 88def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com for (int aa = 0; aa < 2; ++aa) { 8940c85e41b8be96f47f03a34bb2938696037afad4reed paint.setAntiAlias(SkToBool(aa)); 90def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com for (int fh = 0; fh < 2; ++fh) { 9140c85e41b8be96f47f03a34bb2938696037afad4reed paint.setStyle(fh ? SkPaint::kStroke_Style : SkPaint::kFill_Style); 92def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 93def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com const SkRect& bounds = fPaths[p].getBounds(); 94def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->save(); 95def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->translate(-bounds.fLeft, -bounds.fTop); 96def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->drawPath(fPaths[p], paint); 97def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->restore(); 98def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 9940c85e41b8be96f47f03a34bb2938696037afad4reed canvas->translate(110, 0); 100def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 101def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 102def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 10340c85e41b8be96f47f03a34bb2938696037afad4reed canvas->restore(); 10440c85e41b8be96f47f03a34bb2938696037afad4reed canvas->translate(0, 110); 105def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 106def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com canvas->restore(); 107def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com } 108def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 109d1bd1d75a3b5902193b430a611f2eb46edf38435reed uint32_t onGetFlags() const SK_OVERRIDE { 11040c85e41b8be96f47f03a34bb2938696037afad4reed // tiling w/ non-antialias paths can cause off-by-1-pixels differences which are 11140c85e41b8be96f47f03a34bb2938696037afad4reed // unavoidable (chopping in floats -vs- stepping in scan-converter). 11240c85e41b8be96f47f03a34bb2938696037afad4reed return kSkipTiled_Flag; 113c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com } 114c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com 115def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comprivate: 116def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com SkTArray<SkPath> fPaths; 117d1bd1d75a3b5902193b430a611f2eb46edf38435reed typedef skiagm::GM INHERITED; 118def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com}; 119d1bd1d75a3b5902193b430a611f2eb46edf38435reedDEF_GM( return SkNEW(ConicPathsGM); ) 120def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 121def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com////////////////////////////////////////////////////////////////////////////// 122def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com 123