aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-09-05 21:54:04 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-09-05 21:54:04 +0000
commit4ec4cf93b7822e0000102b165852ad623afcb84e (patch)
tree868a31e7e8697776ecd0861ed16b495d49f49d86 /gm
parent818f73e9cf50c0796900f0fe8c55aa2b4ed80516 (diff)
alpha threshold bitmap shader
R=reed@google.com Author: bsalomon@google.com Review URL: https://chromiumcodereview.appspot.com/23707019 git-svn-id: http://skia.googlecode.com/svn/trunk@11122 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm')
-rw-r--r--gm/bitmapalphathreshold.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/gm/bitmapalphathreshold.cpp b/gm/bitmapalphathreshold.cpp
new file mode 100644
index 0000000000..8af49fe351
--- /dev/null
+++ b/gm/bitmapalphathreshold.cpp
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2013 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 "SkGradientShader.h"
+#include "SkBitmapAlphaThresholdShader.h"
+#include "SkTArray.h"
+#include "SkParsePath.h"
+
+class BitmapAlphaThresholdGM : public skiagm::GM {
+public:
+ BitmapAlphaThresholdGM() {
+ this->setBGColor(0xFF000000);
+ }
+
+private:
+ virtual uint32_t onGetFlags() const SK_OVERRIDE {
+ // narrow this flags when the shader has a CPU implementation and
+ // when it serializes.
+ return
+ kSkipPDF_Flag |
+ kSkipPicture_Flag |
+ kSkipPipe_Flag |
+ kSkipPipeCrossProcess_Flag |
+ kSkipTiled_Flag |
+ kSkip565_Flag |
+ kSkipScaledReplay_Flag |
+ kSkipPDFRasterization_Flag |
+
+ kGPUOnly_Flag;
+ }
+
+ virtual void onOnceBeforeDraw() SK_OVERRIDE {
+ fBM.setConfig(SkBitmap::kARGB_8888_Config, 100, 100);
+ if (!fBM.allocPixels()) {
+ return;
+ }
+ SkCanvas canvas(fBM);
+ SkPoint pts[] = { {0, 0}, {SkIntToScalar(fBM.width()), SkIntToScalar(fBM.height())} };
+ SkColor colors[] = {0x00000000, 0xffffffff};
+ SkShader* grad = SkGradientShader::CreateLinear(pts, colors, NULL, 2,
+ SkShader::kClamp_TileMode);
+ SkPaint gradPaint;
+ gradPaint.setShader(grad)->unref();
+ gradPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+ canvas.drawPaint(gradPaint);
+
+ // Construct the region used as a mask.
+ SkRegion bmpBoundsClip;
+ bmpBoundsClip.setRect(0, 0, fBM.width(), fBM.height());
+ SkPath circlePath;
+ SkScalar radius = SkScalarSqrt(SkIntToScalar(fBM.width() * fBM.height())) / 2;
+ circlePath.addCircle(SkIntToScalar(fBM.width() / 2),
+ SkIntToScalar(fBM.height() / 2),
+ radius);
+ fMask.setPath(circlePath, bmpBoundsClip);
+
+ SkPath batPath;
+ SkParsePath::FromSVGString(
+ "M305.214,374.779c2.463,0,3.45,0.493,3.45,0.493l1.478-6.241c0,0,1.15,4.763,1.643,9.034"
+ "c0.493,4.271,8.048,1.479,14.454,0.164c6.405-1.314,7.72-11.662,7.72-11.662h59.294c0,0-35.807,10.841-26.772,34.656"
+ "c0,0-52.889-8.048-61.101,24.967h-0.001c-8.212-33.015-61.101-24.967-61.101-24.967c9.034-23.815-26.772-34.656-26.772-34.656"
+ "h59.294c0,0,1.314,10.348,7.719,11.662c6.406,1.314,13.962,4.106,14.454-0.164c0.493-4.271,1.643-9.034,1.643-9.034l1.479,6.241"
+ "c0,0,0.985-0.493,3.449-0.493H305.214L305.214,374.779z",
+ &batPath);
+
+ SkMatrix matrix;
+ matrix.setTranslate(-208, -280);
+ matrix.postScale(radius / 100, radius / 100);
+ batPath.transform(matrix, &batPath);
+ SkRegion batRegion;
+ batRegion.setPath(batPath, bmpBoundsClip);
+
+ fMask.op(batRegion, SkRegion::kDifference_Op);
+ }
+
+ virtual SkString onShortName() SK_OVERRIDE {
+ return SkString("bat");
+ }
+
+ virtual SkISize onISize() SK_OVERRIDE {
+ return SkISize::Make(518, 735);
+ }
+
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+
+ SkTArray<SkMatrix> lms;
+ lms.push_back().reset();
+ lms.push_back().setScale(SK_Scalar1 / 2, SK_Scalar1);
+ lms.push_back().setScale(SK_Scalar1, 2 * SK_Scalar1);
+ lms.push_back().setRotate(-SK_Scalar1 * 30);
+ lms.push_back().setSkew(0, SK_Scalar1 / 5);
+
+ static const SkScalar kMargin = 5 * SK_Scalar1;
+ canvas->translate(kMargin, kMargin);
+ canvas->save();
+
+ static const U8CPU kThresholds[] = { 0x0, 0x08, 0x40, 0x80, 0xC0, 0xF0, 0xFF };
+
+ for (size_t i = 0; i < SK_ARRAY_COUNT(kThresholds); ++i) {
+ for (int j = 0; j < lms.count(); ++j) {
+ SkRect rect;
+ rect.fLeft = 0;
+ rect.fTop = 0;
+ rect.fRight = SkIntToScalar(fBM.width());
+ rect.fBottom = SkIntToScalar(fBM.height());
+
+ SkShader* thresh;
+ // This SkShader currently only has a GPU implementation.
+ if (canvas->getDevice()->accessRenderTarget()) {
+ thresh = SkBitmapAlphaThresholdShader::Create(fBM, fMask, kThresholds[i]);
+ } else {
+ thresh = SkShader::CreateBitmapShader(fBM, SkShader::kClamp_TileMode,
+ SkShader::kClamp_TileMode);
+ }
+
+ thresh->setLocalMatrix(lms[j]);
+
+ SkPaint paint;
+ paint.setShader(thresh)->unref();
+
+ canvas->drawRect(rect, paint);
+ canvas->translate(SkIntToScalar(fBM.width() + kMargin), 0);
+ }
+ canvas->restore();
+ canvas->translate(0, SkIntToScalar(fBM.height() + kMargin));
+ canvas->save();
+ }
+
+ }
+
+ SkBitmap fBM;
+ SkRegion fMask;
+
+ typedef skiagm::GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+DEF_GM( return new BitmapAlphaThresholdGM(); )