| |
| /* |
| * Copyright 2012 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 "SkBlurMask.h" |
| #include "SkBlurMaskFilter.h" |
| #include "SkCanvas.h" |
| #include "SkColor.h" |
| #include "SkMatrix.h" |
| #include "SkPath.h" |
| #include "SkRect.h" |
| #include "SkSize.h" |
| #include "SkString.h" |
| |
| namespace skiagm { |
| |
| class DrawBitmapMatrixGM : public GM { |
| public: |
| DrawBitmapMatrixGM() {} |
| |
| protected: |
| virtual SkString onShortName() SK_OVERRIDE { |
| return SkString("drawbitmapmatrix"); |
| } |
| |
| virtual SkISize onISize() SK_OVERRIDE { return make_isize(1024, 256); } |
| |
| virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
| SkBitmap bm; |
| this->setupBitmap(&bm); |
| |
| // Draw normally. |
| SkMatrix matrix; |
| matrix.reset(); |
| SkPaint paint; |
| paint.setAntiAlias(true); |
| paint.setDither(true); |
| canvas->drawBitmapMatrix(bm, matrix, &paint); |
| |
| // Draw stretched horizontally and squished vertically. |
| canvas->translate(SkIntToScalar(bm.width() + 5), 0); |
| matrix.setScale(SkIntToScalar(2), SK_ScalarHalf); |
| canvas->drawBitmapMatrix(bm, matrix, &paint); |
| |
| // Draw rotated |
| canvas->translate(SkIntToScalar(bm.width()*2 + 5), 0); |
| matrix.reset(); |
| matrix.setRotate(SkIntToScalar(45), SkIntToScalar(bm.width() / 2), |
| SkIntToScalar(bm.height() / 2)); |
| canvas->save(); |
| canvas->translate(0, SkIntToScalar(10)); |
| canvas->drawBitmapMatrix(bm, matrix, &paint); |
| canvas->restore(); |
| |
| // Draw with perspective |
| canvas->translate(SkIntToScalar(bm.width() + 15), 0); |
| matrix.reset(); |
| matrix.setPerspX(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); |
| matrix.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); |
| canvas->drawBitmapMatrix(bm, matrix, &paint); |
| |
| // Draw with skew |
| canvas->translate(SkIntToScalar(bm.width() + 5), 0); |
| matrix.reset(); |
| matrix.setSkew(SkIntToScalar(2), SkIntToScalar(2)); |
| canvas->drawBitmapMatrix(bm, matrix, &paint); |
| |
| // Draw with sin/cos |
| canvas->translate(SkIntToScalar(bm.width() * 4), 0); |
| matrix.reset(); |
| matrix.setSinCos(SK_ScalarHalf, SkIntToScalar(2)); |
| canvas->drawBitmapMatrix(bm, matrix, &paint); |
| |
| { |
| // test the following code path: |
| // SkGpuDevice::drawPath() -> SkGpuDevice::drawWithMaskFilter() |
| SkPaint paint; |
| |
| paint.setFilterLevel(SkPaint::kLow_FilterLevel); |
| |
| SkMaskFilter* mf = SkBlurMaskFilter::Create( |
| SkBlurMaskFilter::kNormal_BlurStyle, |
| SkBlurMask::ConvertRadiusToSigma(5), |
| SkBlurMaskFilter::kHighQuality_BlurFlag | |
| SkBlurMaskFilter::kIgnoreTransform_BlurFlag); |
| paint.setMaskFilter(mf)->unref(); |
| |
| canvas->translate(SkIntToScalar(bm.width()*2 + 20), 0); |
| |
| matrix.reset(); |
| matrix.setRotate(SkIntToScalar(45), SkIntToScalar(bm.width() / 2), |
| SkIntToScalar(bm.height() / 2)); |
| |
| canvas->save(); |
| canvas->translate(0, SkIntToScalar(20)); |
| canvas->drawBitmapMatrix(bm, matrix, &paint); |
| canvas->restore(); |
| } |
| |
| } |
| private: |
| void setupBitmap(SkBitmap* bm) { |
| SkASSERT(bm); |
| static const int SIZE = 64; |
| bm->allocN32Pixels(SIZE, SIZE); |
| SkCanvas canvas(*bm); |
| |
| SkPaint paint; |
| paint.setColor(SK_ColorGREEN); |
| canvas.drawPaint(paint); |
| |
| paint.setColor(SK_ColorBLUE); |
| paint.setAntiAlias(true); |
| SkRect rect = SkRect::MakeWH(SkIntToScalar(SIZE), SkIntToScalar(SIZE)); |
| SkPath path; |
| path.addOval(rect); |
| canvas.drawPath(path, paint); |
| } |
| }; |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| static GM* MyFactory(void*) { return new DrawBitmapMatrixGM; } |
| static GMRegistry reg(MyFactory); |
| |
| } |