1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 10cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 11cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci// ensure that we don't accidentally screw up the bounds when the oval is 14cb93a386Sopenharmony_ci// fractional, and the impl computes the center and radii, and uses them to 15cb93a386Sopenharmony_ci// reconstruct the edges of the circle. 16cb93a386Sopenharmony_ci// see bug# 1504910 17cb93a386Sopenharmony_cistatic void test_circlebounds(SkCanvas*) { 18cb93a386Sopenharmony_ci SkRect r = { 1.39999998f, 1, 21.3999996f, 21 }; 19cb93a386Sopenharmony_ci SkPath p; 20cb93a386Sopenharmony_ci p.addOval(r); 21cb93a386Sopenharmony_ci SkASSERT(r == p.getBounds()); 22cb93a386Sopenharmony_ci} 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ciclass CircleView : public Sample { 25cb93a386Sopenharmony_ci SkString name() override { return SkString("Circles"); } 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci void circle(SkCanvas* canvas, int width, bool aa) { 28cb93a386Sopenharmony_ci SkPaint paint; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci paint.setAntiAlias(aa); 31cb93a386Sopenharmony_ci if (width < 0) { 32cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kFill_Style); 33cb93a386Sopenharmony_ci } else { 34cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kStroke_Style); 35cb93a386Sopenharmony_ci paint.setStrokeWidth(SkIntToScalar(width)); 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci canvas->drawCircle(0, 0, 9.0f, paint); 38cb93a386Sopenharmony_ci if (false) { // avoid bit rot, suppress warning 39cb93a386Sopenharmony_ci test_circlebounds(canvas); 40cb93a386Sopenharmony_ci } 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci void drawSix(SkCanvas* canvas, SkScalar dx, SkScalar dy) { 44cb93a386Sopenharmony_ci for (int width = -1; width <= 1; width++) { 45cb93a386Sopenharmony_ci canvas->save(); 46cb93a386Sopenharmony_ci circle(canvas, width, false); 47cb93a386Sopenharmony_ci canvas->translate(0, dy); 48cb93a386Sopenharmony_ci circle(canvas, width, true); 49cb93a386Sopenharmony_ci canvas->restore(); 50cb93a386Sopenharmony_ci canvas->translate(dx, 0); 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci static void make_poly(SkPath* path, int n) { 55cb93a386Sopenharmony_ci if (n <= 0) { 56cb93a386Sopenharmony_ci return; 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci path->incReserve(n + 1); 59cb93a386Sopenharmony_ci path->moveTo(SK_Scalar1, 0); 60cb93a386Sopenharmony_ci SkScalar step = SK_ScalarPI * 2 / n; 61cb93a386Sopenharmony_ci SkScalar angle = 0; 62cb93a386Sopenharmony_ci for (int i = 1; i < n; i++) { 63cb93a386Sopenharmony_ci angle += step; 64cb93a386Sopenharmony_ci path->lineTo(SkScalarCos(angle), SkScalarSin(angle)); 65cb93a386Sopenharmony_ci } 66cb93a386Sopenharmony_ci path->close(); 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 70cb93a386Sopenharmony_ci SkPaint paint; 71cb93a386Sopenharmony_ci paint.setAntiAlias(true); 72cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kStroke_Style); 73cb93a386Sopenharmony_ci SkMatrix matrix; 74cb93a386Sopenharmony_ci matrix.setScale(SkIntToScalar(100), SkIntToScalar(100)); 75cb93a386Sopenharmony_ci matrix.postTranslate(SkIntToScalar(200), SkIntToScalar(200)); 76cb93a386Sopenharmony_ci canvas->concat(matrix); 77cb93a386Sopenharmony_ci for (int n = 3; n < 20; n++) { 78cb93a386Sopenharmony_ci SkPath path; 79cb93a386Sopenharmony_ci make_poly(&path, n); 80cb93a386Sopenharmony_ci SkAutoCanvasRestore acr(canvas, true); 81cb93a386Sopenharmony_ci canvas->rotate(SkIntToScalar(10) * (n - 3)); 82cb93a386Sopenharmony_ci canvas->translate(-SK_Scalar1, 0); 83cb93a386Sopenharmony_ci canvas->drawPath(path, paint); 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci } 86cb93a386Sopenharmony_ci}; 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ciDEF_SAMPLE( return new CircleView(); ) 89