Index: gm/mixedxfermodes.cpp |
diff --git a/gm/mixedxfermodes.cpp b/gm/mixedxfermodes.cpp |
index c0045f84ae8f44eb2df010d96cb9b1658359d75b..f4e9768b3ae2930dc2b15b1184388411ce6e3831 100644 |
--- a/gm/mixedxfermodes.cpp |
+++ b/gm/mixedxfermodes.cpp |
@@ -14,7 +14,7 @@ |
namespace skiagm { |
/** |
- * Renders overlapping circles with random SkXfermode::Modes against a checkerboard. |
+ * Renders overlapping shapes with random SkXfermode::Modes against a checkerboard. |
*/ |
class MixedXfermodesGM : public GM { |
public: |
@@ -44,51 +44,87 @@ protected: |
return make_isize(790, 640); |
} |
+ virtual void drawShape(SkCanvas* canvas, |
+ const SkPaint& paint, |
+ SkMWCRandom* random) { |
+ static const SkRect kRect = SkRect::MakeXYWH(SkIntToScalar(-50), SkIntToScalar(-50), |
+ SkIntToScalar(75), SkIntToScalar(105)); |
robertphillips
2013/05/14 21:49:37
x -> drawOption? geometry?
bsalomon
2013/05/15 13:10:20
shape
|
+ int x = random->nextULessThan(5); |
+ switch (x) { |
+ case 0: |
+ canvas->drawCircle(0, 0, 50, paint); |
+ break; |
+ case 1: |
+ canvas->drawRoundRect(kRect, SkIntToScalar(10), SkIntToScalar(20), paint); |
+ break; |
+ case 2: |
+ canvas->drawRect(kRect, paint); |
+ break; |
+ case 3: |
+ if (fConvexPath.isEmpty()) { |
+ SkPoint points[4]; |
+ kRect.toQuad(points); |
+ fConvexPath.moveTo(points[0]); |
+ fConvexPath.quadTo(points[1], points[2]); |
+ fConvexPath.quadTo(points[3], points[0]); |
robertphillips
2013/05/14 21:49:37
assert that 'fConvexPath' is indeed convex?
bsalomon
2013/05/15 13:10:20
Done.
|
+ } |
+ canvas->drawPath(fConvexPath, paint); |
+ break; |
+ case 4: |
+ if (fConcavePath.isEmpty()) { |
+ SkPoint points[5] = {{0, SkIntToScalar(-50)} }; |
+ SkMatrix rot; |
+ rot.setRotate(SkIntToScalar(360) / 5); |
+ for (int i = 1; i < 5; ++i) { |
+ rot.mapPoints(points + i, points + i - 1, 1); |
+ } |
+ fConcavePath.moveTo(points[0]); |
+ for (int i = 0; i < 5; ++i) { |
+ fConcavePath.lineTo(points[(2 * i) % 5]); |
+ } |
+ fConcavePath.setFillType(SkPath::kEvenOdd_FillType); |
robertphillips
2013/05/14 21:49:37
assert that 'fConcavePath' is non-convex?
bsalomon
2013/05/15 13:10:20
Done.
|
+ } |
+ canvas->drawPath(fConcavePath, paint); |
+ break; |
+ } |
+ } |
+ |
virtual void onDraw(SkCanvas* canvas) { |
SkPaint bgPaint; |
bgPaint.setShader(fBG.get()); |
canvas->drawPaint(bgPaint); |
SkISize size = canvas->getDeviceSize(); |
- SkScalar areaSqrt = SkScalarSqrt((SkIntToScalar(size.fWidth * size.fHeight))); |
- SkScalar minR = areaSqrt / 10; |
- SkScalar maxR = areaSqrt / 4; |
+ SkScalar maxScale = SkScalarSqrt((SkIntToScalar(size.fWidth * size.fHeight))) / 300; |
SkMWCRandom random; |
- for (int i = 0; i < kNumCircles; ++i) { |
- SkScalar cx = random.nextRangeScalar(0, SkIntToScalar(size.fWidth)); |
- SkScalar cy = random.nextRangeScalar(0, SkIntToScalar(size.fHeight)); |
- SkScalar r = random.nextRangeScalar(minR, maxR); |
+ for (int i = 0; i < kNumShapes; ++i) { |
+ SkScalar s = random.nextRangeScalar(SK_Scalar1 / 8, SK_Scalar1) * maxScale; |
+ SkScalar r = random.nextRangeScalar(0, SkIntToScalar(360)); |
+ SkScalar dx = random.nextRangeScalar(0, SkIntToScalar(size.fWidth)); |
+ SkScalar dy = random.nextRangeScalar(0, SkIntToScalar(size.fHeight)); |
SkColor color = random.nextU(); |
- |
SkXfermode::Mode mode = |
static_cast<SkXfermode::Mode>(random.nextULessThan(SkXfermode::kLastMode + 1)); |
- // FIXME: Currently testing kDarken on GPU. |
- mode = SkXfermode::kDarken_Mode; |
SkPaint p; |
p.setAntiAlias(true); |
p.setColor(color); |
p.setXfermodeMode(mode); |
- canvas->drawCircle(cx, cy, r, p); |
+ canvas->save(); |
+ canvas->translate(dx, dy); |
+ canvas->scale(s, s); |
+ canvas->rotate(r); |
+ this->drawShape(canvas, p, &random); |
+ canvas->restore(); |
} |
- |
- // FIXME: Remove text draw once this GM is finished. |
- SkPaint txtPaint; |
- txtPaint.setTextSize(areaSqrt / 20); |
- txtPaint.setAntiAlias(true); |
- static const char kTxt[] = "Work in progres... Do not baseline."; |
- canvas->drawText(kTxt, strlen(kTxt), |
- areaSqrt/50, |
- SkIntToScalar(size.fHeight / 2), |
- txtPaint); |
} |
private: |
enum { |
- kMinR = 10, |
- kMaxR = 50, |
- kNumCircles = 50, |
+ kNumShapes = 100, |
}; |
SkAutoTUnref<SkShader> fBG; |
+ SkPath fConcavePath; |
+ SkPath fConvexPath; |
typedef GM INHERITED; |
}; |