Add GPU support for axis-aligned ovals:
- Add drawOval base function to SkDevice, and override in SkGpuDevice
- Move isSimilarityMatrix to SkMatrix (renamed to isSimilarity) and fixed up unit test
- Since both SkGpuDevice::drawOval() and GrContext::drawPath() can try to draw ovals, added GrContext::canDrawOval() and GrContext::internalDrawOval() to avoid duplicate code
- Hooked in axis-aligned oval fill shader
- Enabled GPU stroked circles
- Added stroked circle bench test
Review URL: https://codereview.appspot.com/7137050
git-svn-id: http://skia.googlecode.com/svn/trunk@7304 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index 390c532..ad9ca1d 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -122,7 +122,7 @@
name->append("oval");
}
virtual void makePath(SkPath* path) SK_OVERRIDE {
- SkRect r = { 10, 10, 20, 20 };
+ SkRect r = { 10, 10, 30, 20 };
path->addOval(r);
}
private:
@@ -624,13 +624,14 @@
class CirclesBench : public SkBenchmark {
protected:
SkString fName;
+ Flags fFlags;
enum {
N = SkBENCHLOOP(100)
};
public:
- CirclesBench(void* param) : INHERITED(param) {
- fName.printf("circles");
+ CirclesBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) {
+ fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill");
}
protected:
@@ -643,6 +644,9 @@
paint.setColor(SK_ColorBLACK);
paint.setAntiAlias(true);
+ if (fFlags & kStroke_Flag) {
+ paint.setStyle(SkPaint::kStroke_Style);
+ }
SkRandom rand;
@@ -655,6 +659,10 @@
r.fRight = r.fLeft + 2 * radius;
r.fBottom = r.fTop + 2 * radius;
+ if (fFlags & kStroke_Flag) {
+ paint.setStrokeWidth(rand.nextUScalar1() * 5.0f);
+ }
+
SkPath temp;
// mimic how Chrome does circles
@@ -671,6 +679,7 @@
typedef SkBenchmark INHERITED;
};
+
// Chrome creates its own round rects with each corner possibly being different.
// In its "zero radius" incarnation it creates degenerate round rects.
// Note: PathTest::test_arb_round_rect_is_convex and
@@ -959,9 +968,12 @@
static BenchRegistry gRegReverseAdd(FactReverseAdd);
static BenchRegistry gRegReverseTo(FactReverseTo);
-static SkBenchmark* CirclesTest(void* p) { return new CirclesBench(p); }
+static SkBenchmark* CirclesTest(void* p) { return new CirclesBench(p, FLAGS00); }
static BenchRegistry gRegCirclesTest(CirclesTest);
+static SkBenchmark* CirclesStrokeTest(void* p) { return new CirclesBench(p, FLAGS01); }
+static BenchRegistry gRegCirclesStrokeTest(CirclesStrokeTest);
+
static SkBenchmark* ArbRoundRectTest(void* p) { return new ArbRoundRectBench(p, false); }
static BenchRegistry gRegArbRoundRectTest(ArbRoundRectTest);