1 2 /* 3 * Copyright 2012 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "gm.h" 9 #include "SkBitmap.h" 10 #include "SkBlurMask.h" 11 #include "SkBlurMaskFilter.h" 12 #include "SkCanvas.h" 13 #include "SkColor.h" 14 #include "SkMatrix.h" 15 #include "SkPath.h" 16 #include "SkRect.h" 17 #include "SkSize.h" 18 #include "SkString.h" 19 20 namespace skiagm { 21 22 class DrawBitmapMatrixGM : public GM { 23 public: 24 DrawBitmapMatrixGM() {} 25 26 protected: 27 virtual uint32_t onGetFlags() const SK_OVERRIDE { 28 return kSkipTiled_Flag; 29 } 30 31 virtual SkString onShortName() SK_OVERRIDE { 32 return SkString("drawbitmapmatrix"); 33 } 34 35 virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(1024, 256); } 36 37 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 38 SkBitmap bm; 39 this->setupBitmap(&bm); 40 41 // Draw normally. 42 SkMatrix matrix; 43 matrix.reset(); 44 SkPaint paint; 45 paint.setAntiAlias(true); 46 paint.setDither(true); 47 canvas->drawBitmapMatrix(bm, matrix, &paint); 48 49 // Draw stretched horizontally and squished vertically. 50 canvas->translate(SkIntToScalar(bm.width() + 5), 0); 51 matrix.setScale(SkIntToScalar(2), SK_ScalarHalf); 52 canvas->drawBitmapMatrix(bm, matrix, &paint); 53 54 // Draw rotated 55 canvas->translate(SkIntToScalar(bm.width()*2 + 5), 0); 56 matrix.reset(); 57 matrix.setRotate(SkIntToScalar(45), SkIntToScalar(bm.width() / 2), 58 SkIntToScalar(bm.height() / 2)); 59 canvas->save(); 60 canvas->translate(0, SkIntToScalar(10)); 61 canvas->drawBitmapMatrix(bm, matrix, &paint); 62 canvas->restore(); 63 64 // Draw with perspective 65 canvas->translate(SkIntToScalar(bm.width() + 15), 0); 66 matrix.reset(); 67 matrix.setPerspX(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); 68 matrix.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); 69 canvas->drawBitmapMatrix(bm, matrix, &paint); 70 71 // Draw with skew 72 canvas->translate(SkIntToScalar(bm.width() + 5), 0); 73 matrix.reset(); 74 matrix.setSkew(SkIntToScalar(2), SkIntToScalar(2)); 75 canvas->drawBitmapMatrix(bm, matrix, &paint); 76 77 // Draw with sin/cos 78 canvas->translate(SkIntToScalar(bm.width() * 4), 0); 79 matrix.reset(); 80 matrix.setSinCos(SK_ScalarHalf, SkIntToScalar(2)); 81 canvas->drawBitmapMatrix(bm, matrix, &paint); 82 83 { 84 // test the following code path: 85 // SkGpuDevice::drawPath() -> SkGpuDevice::drawWithMaskFilter() 86 SkPaint paint; 87 88 paint.setFilterLevel(SkPaint::kLow_FilterLevel); 89 90 SkMaskFilter* mf = SkBlurMaskFilter::Create( 91 kNormal_SkBlurStyle, 92 SkBlurMask::ConvertRadiusToSigma(5), 93 SkBlurMaskFilter::kHighQuality_BlurFlag | 94 SkBlurMaskFilter::kIgnoreTransform_BlurFlag); 95 paint.setMaskFilter(mf)->unref(); 96 97 canvas->translate(SkIntToScalar(bm.width()*2 + 20), 0); 98 99 matrix.reset(); 100 matrix.setRotate(SkIntToScalar(45), SkIntToScalar(bm.width() / 2), 101 SkIntToScalar(bm.height() / 2)); 102 103 canvas->save(); 104 canvas->translate(0, SkIntToScalar(20)); 105 canvas->drawBitmapMatrix(bm, matrix, &paint); 106 canvas->restore(); 107 } 108 109 } 110 private: 111 void setupBitmap(SkBitmap* bm) { 112 SkASSERT(bm); 113 static const int SIZE = 64; 114 bm->allocN32Pixels(SIZE, SIZE); 115 SkCanvas canvas(*bm); 116 117 SkPaint paint; 118 paint.setColor(SK_ColorGREEN); 119 canvas.drawPaint(paint); 120 121 paint.setColor(SK_ColorBLUE); 122 paint.setAntiAlias(true); 123 SkRect rect = SkRect::MakeWH(SkIntToScalar(SIZE), SkIntToScalar(SIZE)); 124 SkPath path; 125 path.addOval(rect); 126 canvas.drawPath(path, paint); 127 } 128 }; 129 130 //////////////////////////////////////////////////////////////////////////////// 131 132 static GM* MyFactory(void*) { return new DrawBitmapMatrixGM; } 133 static GMRegistry reg(MyFactory); 134 135 } 136