Index: gm/convexpolyclip.cpp |
diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..db357bbfd7e6ab607a692af05c9f76fd12bad547 |
--- /dev/null |
+++ b/gm/convexpolyclip.cpp |
@@ -0,0 +1,194 @@ |
+ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "gm.h" |
+ |
+#include "SkBitmap.h" |
+#include "SkGradientShader.h" |
+#include "SkTLList.h" |
+ |
+static SkBitmap make_bmp(int w, int h) { |
+ SkBitmap bmp; |
+ bmp.allocN32Pixels(w, h, true); |
+ |
+ SkCanvas canvas(bmp); |
+ SkScalar wScalar = SkIntToScalar(w); |
+ SkScalar hScalar = SkIntToScalar(h); |
+ |
+ SkPoint pt = { wScalar / 2, hScalar / 2 }; |
+ |
+ SkScalar radius = 3 * SkMaxScalar(wScalar, hScalar); |
+ |
+ SkColor colors[] = { SK_ColorDKGRAY, 0xFF222255, |
+ 0xFF331133, 0xFF884422, |
+ 0xFF000022, SK_ColorWHITE, |
+ 0xFFAABBCC}; |
+ |
+ SkScalar pos[] = {0, |
+ SK_Scalar1 / 6, |
+ 2 * SK_Scalar1 / 6, |
+ 3 * SK_Scalar1 / 6, |
+ 4 * SK_Scalar1 / 6, |
+ 5 * SK_Scalar1 / 6, |
+ SK_Scalar1}; |
+ |
+ SkPaint paint; |
+ paint.setShader(SkGradientShader::CreateRadial( |
+ pt, radius, |
+ colors, pos, |
+ SK_ARRAY_COUNT(colors), |
+ SkShader::kRepeat_TileMode))->unref(); |
+ SkRect rect = SkRect::MakeWH(wScalar, hScalar); |
+ SkMatrix mat = SkMatrix::I(); |
+ for (int i = 0; i < 4; ++i) { |
+ paint.getShader()->setLocalMatrix(mat); |
+ canvas.drawRect(rect, paint); |
+ rect.inset(wScalar / 8, hScalar / 8); |
+ mat.preTranslate(6 * wScalar, 6 * hScalar); |
+ mat.postScale(SK_Scalar1 / 3, SK_Scalar1 / 3); |
+ } |
+ |
+ paint.setAntiAlias(true); |
+ paint.setTextSize(wScalar / 2.2f); |
+ paint.setShader(0); |
+ paint.setColor(SK_ColorLTGRAY); |
+ static const char kTxt[] = "Skia"; |
+ SkPoint texPos = { wScalar / 17, hScalar / 2 + paint.getTextSize() / 2.5f }; |
+ canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint); |
+ paint.setColor(SK_ColorBLACK); |
+ paint.setStyle(SkPaint::kStroke_Style); |
+ paint.setStrokeWidth(SK_Scalar1); |
+ canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint); |
+ return bmp; |
+} |
+ |
+namespace skiagm { |
+/** |
+ * This GM tests convex polygon clips. |
+ */ |
+class ConvexPolyClip : public GM { |
+public: |
+ ConvexPolyClip() { |
+ this->setBGColor(0xFFFFFFFF); |
+ } |
+ |
+protected: |
+ virtual SkString onShortName() SK_OVERRIDE { |
+ return SkString("convex_poly_clip"); |
+ } |
+ |
+ virtual SkISize onISize() SK_OVERRIDE { |
+ return make_isize(435, 440); |
+ } |
+ |
+ virtual void onOnceBeforeDraw() SK_OVERRIDE { |
+ SkPath tri; |
+ tri.moveTo(5.f, 5.f); |
+ tri.lineTo(100.f, 20.f); |
+ tri.lineTo(15.f, 100.f); |
+ |
+ fPaths.addToTail(tri); |
+ |
+ SkPath hexagon; |
+ static const SkScalar kRadius = 45.f; |
+ const SkPoint center = { kRadius, kRadius }; |
+ for (int i = 0; i < 6; ++i) { |
+ SkScalar angle = 2 * SK_ScalarPI * i / 6; |
+ SkPoint point; |
+ point.fY = SkScalarSinCos(angle, &point.fX); |
+ point.scale(kRadius); |
+ point = center + point; |
+ if (0 == i) { |
+ hexagon.moveTo(point); |
+ } else { |
+ hexagon.lineTo(point); |
+ } |
+ } |
+ fPaths.addToTail(hexagon); |
+ |
+ SkMatrix scaleM; |
+ scaleM.setScale(1.1f, 0.4f, kRadius, kRadius); |
+ hexagon.transform(scaleM); |
+ fPaths.addToTail(hexagon); |
+ |
+ SkPath rotRect; |
+ SkRect rect = SkRect::MakeLTRB(10.f, 12.f, 80.f, 86.f); |
+ rotRect.addRect(rect); |
+ SkMatrix rotM; |
+ rotM.setRotate(23.f, rect.centerX(), rect.centerY()); |
+ rotRect.transform(rotM); |
+ fPaths.addToTail(rotRect); |
+ |
+ fBmp = make_bmp(100, 100); |
+ } |
+ |
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
+ const SkPath* path; |
+ SkScalar y = 0; |
+ static const SkScalar kMargin = 10.f; |
+ |
+ SkPaint bgPaint; |
+ bgPaint.setAlpha(0x15); |
+ SkISize size = canvas->getDeviceSize(); |
+ SkRect dstRect = SkRect::MakeWH(SkIntToScalar(size.fWidth), |
+ SkIntToScalar(size.fHeight)); |
+ canvas->drawBitmapRectToRect(fBmp, NULL, dstRect, &bgPaint); |
+ |
+ for (SkTLList<SkPath>::Iter iter(fPaths, SkTLList<SkPath>::Iter::kHead_IterStart); |
+ NULL != (path = iter.get()); |
+ iter.next()) { |
+ SkScalar x = 0; |
+ for (int aa = 0; aa < 2; ++aa) { |
+ canvas->save(); |
+ canvas->translate(x, y); |
+ canvas->clipPath(*path, SkRegion::kIntersect_Op, SkToBool(aa)); |
+ canvas->drawBitmap(fBmp, 0, 0); |
+ canvas->restore(); |
+ x += fBmp.width() + kMargin; |
+ } |
+ for (int aa = 0; aa < 2; ++aa) { |
+ static const char kTxt[] = "Clip Me!"; |
+ SkPaint txtPaint; |
+ txtPaint.setTextSize(23.f); |
+ txtPaint.setAntiAlias(true); |
+ txtPaint.setColor(SK_ColorDKGRAY); |
+ |
+ SkPaint clipOutlinePaint; |
+ clipOutlinePaint.setAntiAlias(true); |
+ clipOutlinePaint.setColor(0x50505050); |
+ clipOutlinePaint.setStyle(SkPaint::kStroke_Style); |
+ clipOutlinePaint.setStrokeWidth(0); |
+ |
+ canvas->save(); |
+ canvas->translate(x, y); |
+ SkPath closedClipPath = *path; |
+ closedClipPath.close(); |
+ canvas->drawPath(closedClipPath, clipOutlinePaint); |
+ canvas->clipPath(*path, SkRegion::kIntersect_Op, SkToBool(aa)); |
+ canvas->scale(1.f, 1.8f); |
+ canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, |
+ 0, 1.5f * txtPaint.getTextSize(), |
+ txtPaint); |
+ canvas->restore(); |
+ x += fBmp.width() + kMargin; |
+ } |
+ |
+ y += fBmp.height() + kMargin; |
+ } |
+ } |
+ |
+private: |
+ SkTLList<SkPath> fPaths; |
+ SkBitmap fBmp; |
+ |
+ typedef GM INHERITED; |
+}; |
+ |
+DEF_GM( return SkNEW(ConvexPolyClip); ) |
+ |
+} |