diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-09-05 21:54:04 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-09-05 21:54:04 +0000 |
commit | 4ec4cf93b7822e0000102b165852ad623afcb84e (patch) | |
tree | 868a31e7e8697776ecd0861ed16b495d49f49d86 /gm | |
parent | 818f73e9cf50c0796900f0fe8c55aa2b4ed80516 (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.cpp | 144 |
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(); ) |