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), SkIntToScalar(3),
    104                                             SK_ColorGREEN),
    105             SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType,
    106                                             SkDisplacementMapEffect::kR_ChannelSelectorType,
    107                                             SkIntToScalar(12),
    108                                             gradient.get(),
    109                                             checkerboard.get()),
    110             SkDilateImageFilter::Create(2, 2, checkerboard.get()),
    111             SkErodeImageFilter::Create(2, 2, checkerboard.get()),
    112             SkOffsetImageFilter::Create(SkIntToScalar(-16), SkIntToScalar(32)),
    113             SkMatrixImageFilter::Create(resizeMatrix, SkPaint::kNone_FilterLevel),
    114             SkRectShaderImageFilter::Create(noise),
    115         };
    116 
    117         SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
    118         SkScalar margin = SkIntToScalar(16);
    119         SkRect bounds = r;
    120         bounds.outset(margin, margin);
    121 
    122         for (int xOffset = 0; xOffset < 80; xOffset += 16) {
    123             canvas->save();
    124             bounds.fLeft = SkIntToScalar(xOffset);
    125             for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
    126                 SkPaint paint;
    127                 paint.setColor(SK_ColorWHITE);
    128                 paint.setImageFilter(filters[i]);
    129                 paint.setAntiAlias(true);
    130                 canvas->save();
    131                 canvas->clipRect(bounds);
    132                 if (5 == i) {
    133                     canvas->translate(SkIntToScalar(16), SkIntToScalar(-32));
    134                 } else if (6 == i) {
    135                     canvas->scale(SkScalarInvert(RESIZE_FACTOR_X),
    136                                   SkScalarInvert(RESIZE_FACTOR_Y));
    137                 }
    138                 canvas->drawCircle(r.centerX(), r.centerY(),
    139                                    SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint);
    140                 canvas->restore();
    141                 canvas->translate(r.width() + margin, 0);
    142             }
    143             canvas->restore();
    144             canvas->translate(0, r.height() + margin);
    145         }
    146 
    147         for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
    148             SkSafeUnref(filters[i]);
    149         }
    150     }
    151 
    152 private:
    153     bool fInitialized;
    154     SkBitmap fCheckerboard;
    155     SkBitmap fGradientCircle;
    156     typedef GM INHERITED;
    157 };
    158 
    159 //////////////////////////////////////////////////////////////////////////////
    160 
    161 static GM* MyFactory(void*) { return new ImageFiltersClippedGM; }
    162 static GMRegistry reg(MyFactory);
    163 
    164 }
    165