Home | History | Annotate | Download | only in gm
      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 "SkMorphologyImageFilter.h"
     16 #include "SkOffsetImageFilter.h"
     17 #include "SkPerlinNoiseShader.h"
     18 #include "SkRectShaderImageFilter.h"
     19 #include "SkMatrixImageFilter.h"
     20 #include "SkScalar.h"
     21 
     22 #define RESIZE_FACTOR_X SkIntToScalar(2)
     23 #define RESIZE_FACTOR_Y SkIntToScalar(5)
     24 
     25 namespace skiagm {
     26 
     27 class ImageFiltersClippedGM : public GM {
     28 public:
     29     ImageFiltersClippedGM() : fInitialized(false) {
     30         this->setBGColor(0x00000000);
     31     }
     32 
     33 protected:
     34     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     35         return kSkipTiled_Flag;
     36     }
     37 
     38     virtual SkString onShortName() {
     39         return SkString("imagefiltersclipped");
     40     }
     41 
     42     virtual SkISize onISize() {
     43         return SkISize::Make(860, 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 = SkMinScalar(x, y) * 0.8f;
     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         SkMatrix resizeMatrix;
     99         resizeMatrix.setScale(RESIZE_FACTOR_X, RESIZE_FACTOR_Y);
    100 
    101         SkImageFilter* filters[] = {
    102             SkBlurImageFilter::Create(SkIntToScalar(12), SkIntToScalar(12)),
    103             SkDropShadowImageFilter::Create(SkIntToScalar(10), SkIntToScalar(10),
    104                                             SkIntToScalar(3), SkIntToScalar(3),
    105                                             SK_ColorGREEN),
    106             SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType,
    107                                             SkDisplacementMapEffect::kR_ChannelSelectorType,
    108                                             SkIntToScalar(12),
    109                                             gradient.get(),
    110                                             checkerboard.get()),
    111             SkDilateImageFilter::Create(2, 2, checkerboard.get()),
    112             SkErodeImageFilter::Create(2, 2, checkerboard.get()),
    113             SkOffsetImageFilter::Create(SkIntToScalar(-16), SkIntToScalar(32)),
    114             SkMatrixImageFilter::Create(resizeMatrix, SkPaint::kNone_FilterLevel),
    115             SkRectShaderImageFilter::Create(noise),
    116         };
    117 
    118         SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
    119         SkScalar margin = SkIntToScalar(16);
    120         SkRect bounds = r;
    121         bounds.outset(margin, margin);
    122 
    123         for (int xOffset = 0; xOffset < 80; xOffset += 16) {
    124             canvas->save();
    125             bounds.fLeft = SkIntToScalar(xOffset);
    126             for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
    127                 SkPaint paint;
    128                 paint.setColor(SK_ColorWHITE);
    129                 paint.setImageFilter(filters[i]);
    130                 paint.setAntiAlias(true);
    131                 canvas->save();
    132                 canvas->clipRect(bounds);
    133                 if (5 == i) {
    134                     canvas->translate(SkIntToScalar(16), SkIntToScalar(-32));
    135                 } else if (6 == i) {
    136                     canvas->scale(SkScalarInvert(RESIZE_FACTOR_X),
    137                                   SkScalarInvert(RESIZE_FACTOR_Y));
    138                 }
    139                 canvas->drawCircle(r.centerX(), r.centerY(),
    140                                    SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint);
    141                 canvas->restore();
    142                 canvas->translate(r.width() + margin, 0);
    143             }
    144             canvas->restore();
    145             canvas->translate(0, r.height() + margin);
    146         }
    147 
    148         for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
    149             SkSafeUnref(filters[i]);
    150         }
    151     }
    152 
    153 private:
    154     bool fInitialized;
    155     SkBitmap fCheckerboard;
    156     SkBitmap fGradientCircle;
    157     typedef GM INHERITED;
    158 };
    159 
    160 //////////////////////////////////////////////////////////////////////////////
    161 
    162 static GM* MyFactory(void*) { return new ImageFiltersClippedGM; }
    163 static GMRegistry reg(MyFactory);
    164 
    165 }
    166