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 "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 
     25 namespace skiagm {
     26 
     27 class ImageFiltersScaledGM : public GM {
     28 public:
     29     ImageFiltersScaledGM() : 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("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 
    172 private:
    173     bool fInitialized;
    174     SkBitmap fCheckerboard;
    175     SkBitmap fGradientCircle;
    176     typedef GM INHERITED;
    177 };
    178 
    179 //////////////////////////////////////////////////////////////////////////////
    180 
    181 static GM* MyFactory(void*) { return new ImageFiltersScaledGM; }
    182 static GMRegistry reg(MyFactory);
    183 
    184 }
    185