1/* 2 * Copyright 2014 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "gm.h" 9#include "SkColor.h" 10#include "SkBitmapSource.h" 11#include "SkBlurImageFilter.h" 12#include "SkDisplacementMapEffect.h" 13#include "SkDropShadowImageFilter.h" 14#include "SkGradientShader.h" 15#include "SkLightingImageFilter.h" 16#include "SkMorphologyImageFilter.h" 17#include "SkOffsetImageFilter.h" 18#include "SkPerlinNoiseShader.h" 19#include "SkRectShaderImageFilter.h" 20#include "SkMatrixImageFilter.h" 21#include "SkScalar.h" 22 23#define RESIZE_FACTOR SkIntToScalar(4) 24 25namespace skiagm { 26 27class ImageFiltersScaledGM : public GM { 28public: 29 ImageFiltersScaledGM() : fInitialized(false) { 30 this->setBGColor(0x00000000); 31 } 32 33protected: 34 virtual uint32_t onGetFlags() const SK_OVERRIDE { 35 return kSkipTiled_Flag; 36 } 37 38 virtual SkString onShortName() { 39 return SkString("imagefiltersscaled"); 40 } 41 42 virtual SkISize onISize() { 43 return SkISize::Make(1428, 500); 44 } 45 46 void make_checkerboard() { 47 fCheckerboard.allocN32Pixels(64, 64); 48 SkCanvas canvas(fCheckerboard); 49 canvas.clear(0x00000000); 50 SkPaint darkPaint; 51 darkPaint.setColor(0xFF404040); 52 SkPaint lightPaint; 53 lightPaint.setColor(0xFFA0A0A0); 54 for (int y = 0; y < 64; y += 16) { 55 for (int x = 0; x < 64; x += 16) { 56 canvas.save(); 57 canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 58 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 59 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 60 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 61 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 62 canvas.restore(); 63 } 64 } 65 } 66 67 void make_gradient_circle(int width, int height) { 68 SkScalar x = SkIntToScalar(width / 2); 69 SkScalar y = SkIntToScalar(height / 2); 70 SkScalar radius = SkScalarMul(SkMinScalar(x, y), SkIntToScalar(4) / SkIntToScalar(5)); 71 fGradientCircle.allocN32Pixels(width, height); 72 SkCanvas canvas(fGradientCircle); 73 canvas.clear(0x00000000); 74 SkColor colors[2]; 75 colors[0] = SK_ColorWHITE; 76 colors[1] = SK_ColorBLACK; 77 SkAutoTUnref<SkShader> shader( 78 SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2, 79 SkShader::kClamp_TileMode) 80 ); 81 SkPaint paint; 82 paint.setShader(shader); 83 canvas.drawCircle(x, y, radius, paint); 84 } 85 86 virtual void onDraw(SkCanvas* canvas) { 87 if (!fInitialized) { 88 this->make_checkerboard(); 89 this->make_gradient_circle(64, 64); 90 fInitialized = true; 91 } 92 canvas->clear(0x00000000); 93 94 SkAutoTUnref<SkImageFilter> gradient(SkBitmapSource::Create(fGradientCircle)); 95 SkAutoTUnref<SkImageFilter> checkerboard(SkBitmapSource::Create(fCheckerboard)); 96 SkAutoTUnref<SkShader> noise(SkPerlinNoiseShader::CreateFractalNoise( 97 SkDoubleToScalar(0.1), SkDoubleToScalar(0.05), 1, 0)); 98 99 SkPoint3 pointLocation(0, 0, SkIntToScalar(10)); 100 SkPoint3 spotLocation(SkIntToScalar(-10), SkIntToScalar(-10), SkIntToScalar(20)); 101 SkPoint3 spotTarget(SkIntToScalar(40), SkIntToScalar(40), 0); 102 SkScalar spotExponent = SK_Scalar1; 103 SkScalar cutoffAngle = SkIntToScalar(15); 104 SkScalar kd = SkIntToScalar(2); 105 SkScalar surfaceScale = SkIntToScalar(1); 106 SkColor white(0xFFFFFFFF); 107 SkMatrix resizeMatrix; 108 resizeMatrix.setScale(RESIZE_FACTOR, RESIZE_FACTOR); 109 110 SkImageFilter* filters[] = { 111 SkBlurImageFilter::Create(SkIntToScalar(4), SkIntToScalar(4)), 112 SkDropShadowImageFilter::Create(SkIntToScalar(5), SkIntToScalar(10), 113 SkIntToScalar(3), SkIntToScalar(3), 114 SK_ColorYELLOW), 115 SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType, 116 SkDisplacementMapEffect::kR_ChannelSelectorType, 117 SkIntToScalar(12), 118 gradient.get(), 119 checkerboard.get()), 120 SkDilateImageFilter::Create(1, 1, checkerboard.get()), 121 SkErodeImageFilter::Create(1, 1, checkerboard.get()), 122 SkOffsetImageFilter::Create(SkIntToScalar(32), 0), 123 SkMatrixImageFilter::Create(resizeMatrix, SkPaint::kNone_FilterLevel), 124 SkRectShaderImageFilter::Create(noise), 125 SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, white, surfaceScale, kd), 126 SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, spotTarget, spotExponent, 127 cutoffAngle, white, surfaceScale, kd), 128 }; 129 130 SkVector scales[] = { 131 SkVector::Make(SkScalarInvert(2), SkScalarInvert(2)), 132 SkVector::Make(SkIntToScalar(1), SkIntToScalar(1)), 133 SkVector::Make(SkIntToScalar(1), SkIntToScalar(2)), 134 SkVector::Make(SkIntToScalar(2), SkIntToScalar(1)), 135 SkVector::Make(SkIntToScalar(2), SkIntToScalar(2)), 136 }; 137 138 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 139 SkScalar margin = SkIntToScalar(16); 140 SkRect bounds = r; 141 bounds.outset(margin, margin); 142 143 for (size_t j = 0; j < SK_ARRAY_COUNT(scales); ++j) { 144 canvas->save(); 145 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 146 SkPaint paint; 147 paint.setColor(SK_ColorBLUE); 148 paint.setImageFilter(filters[i]); 149 paint.setAntiAlias(true); 150 canvas->save(); 151 canvas->scale(scales[j].fX, scales[j].fY); 152 if (5 == i) { 153 canvas->translate(SkIntToScalar(-32), 0); 154 } else if (6 == i) { 155 canvas->scale(SkScalarInvert(RESIZE_FACTOR), 156 SkScalarInvert(RESIZE_FACTOR)); 157 } 158 canvas->drawCircle(r.centerX(), r.centerY(), 159 SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint); 160 canvas->restore(); 161 canvas->translate(r.width() * scales[j].fX + margin, 0); 162 } 163 canvas->restore(); 164 canvas->translate(0, r.height() * scales[j].fY + margin); 165 } 166 167 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 168 filters[i]->unref(); 169 } 170 } 171 172private: 173 bool fInitialized; 174 SkBitmap fCheckerboard; 175 SkBitmap fGradientCircle; 176 typedef GM INHERITED; 177}; 178 179////////////////////////////////////////////////////////////////////////////// 180 181static GM* MyFactory(void*) { return new ImageFiltersScaledGM; } 182static GMRegistry reg(MyFactory); 183 184} 185