4428f2c39f
This differed from the separate versions in that it snapped to zero. It was also strictly worse than calling the two separate versions. Most clients don't need the snapping, so just call the two existing functions. For clients that need the snapping, call new variants of each that do snap. Change-Id: Ia4e09fd9651932fe15caeab1399df7f6281bdc17 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/205303 Commit-Queue: Brian Osman <brianosman@google.com> Reviewed-by: Mike Reed <reed@google.com>
117 lines
3.3 KiB
C++
117 lines
3.3 KiB
C++
/*
|
|
* Copyright 2011 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "Sample.h"
|
|
#include "SkCanvas.h"
|
|
#include "SkPaint.h"
|
|
#include "SkPath.h"
|
|
|
|
// ensure that we don't accidentally screw up the bounds when the oval is
|
|
// fractional, and the impl computes the center and radii, and uses them to
|
|
// reconstruct the edges of the circle.
|
|
// see bug# 1504910
|
|
static void test_circlebounds(SkCanvas*) {
|
|
SkRect r = { 1.39999998f, 1, 21.3999996f, 21 };
|
|
SkPath p;
|
|
p.addOval(r);
|
|
SkASSERT(r == p.getBounds());
|
|
}
|
|
|
|
class CircleView : public Sample {
|
|
public:
|
|
static const SkScalar ANIM_DX;
|
|
static const SkScalar ANIM_DY;
|
|
static const SkScalar ANIM_RAD;
|
|
SkScalar fDX, fDY, fRAD;
|
|
|
|
CircleView() {
|
|
fDX = fDY = fRAD = 0;
|
|
fN = 3;
|
|
}
|
|
|
|
protected:
|
|
virtual bool onQuery(Sample::Event* evt) {
|
|
if (Sample::TitleQ(*evt)) {
|
|
Sample::TitleR(evt, "Circles");
|
|
return true;
|
|
}
|
|
return this->INHERITED::onQuery(evt);
|
|
}
|
|
|
|
void circle(SkCanvas* canvas, int width, bool aa) {
|
|
SkPaint paint;
|
|
|
|
paint.setAntiAlias(aa);
|
|
if (width < 0) {
|
|
paint.setStyle(SkPaint::kFill_Style);
|
|
} else {
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
paint.setStrokeWidth(SkIntToScalar(width));
|
|
}
|
|
canvas->drawCircle(0, 0, SkIntToScalar(9) + fRAD, paint);
|
|
if (false) { // avoid bit rot, suppress warning
|
|
test_circlebounds(canvas);
|
|
}
|
|
}
|
|
|
|
void drawSix(SkCanvas* canvas, SkScalar dx, SkScalar dy) {
|
|
for (int width = -1; width <= 1; width++) {
|
|
canvas->save();
|
|
circle(canvas, width, false);
|
|
canvas->translate(0, dy);
|
|
circle(canvas, width, true);
|
|
canvas->restore();
|
|
canvas->translate(dx, 0);
|
|
}
|
|
}
|
|
|
|
static void make_poly(SkPath* path, int n) {
|
|
if (n <= 0) {
|
|
return;
|
|
}
|
|
path->incReserve(n + 1);
|
|
path->moveTo(SK_Scalar1, 0);
|
|
SkScalar step = SK_ScalarPI * 2 / n;
|
|
SkScalar angle = 0;
|
|
for (int i = 1; i < n; i++) {
|
|
angle += step;
|
|
path->lineTo(SkScalarCos(angle), SkScalarSin(angle));
|
|
}
|
|
path->close();
|
|
}
|
|
|
|
virtual void onDrawContent(SkCanvas* canvas) {
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
SkMatrix matrix;
|
|
matrix.setScale(SkIntToScalar(100), SkIntToScalar(100));
|
|
matrix.postTranslate(SkIntToScalar(200), SkIntToScalar(200));
|
|
canvas->concat(matrix);
|
|
for (int n = 3; n < 20; n++) {
|
|
SkPath path;
|
|
make_poly(&path, n);
|
|
SkAutoCanvasRestore acr(canvas, true);
|
|
canvas->rotate(SkIntToScalar(10) * (n - 3));
|
|
canvas->translate(-SK_Scalar1, 0);
|
|
canvas->drawPath(path, paint);
|
|
}
|
|
}
|
|
|
|
private:
|
|
int fN;
|
|
typedef Sample INHERITED;
|
|
};
|
|
|
|
const SkScalar CircleView::ANIM_DX(SK_Scalar1 / 67);
|
|
const SkScalar CircleView::ANIM_DY(SK_Scalar1 / 29);
|
|
const SkScalar CircleView::ANIM_RAD(SK_Scalar1 / 19);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DEF_SAMPLE( return new CircleView(); )
|