Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2013 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 "SkDisplacementMapEffect.h"
      9 #include "SkImage.h"
     10 #include "SkImageSource.h"
     11 #include "gm.h"
     12 #include "sk_tool_utils.h"
     13 
     14 namespace skiagm {
     15 
     16 class DisplacementMapGM : public GM {
     17 public:
     18     DisplacementMapGM() {
     19         this->setBGColor(0xFF000000);
     20     }
     21 
     22 protected:
     23     SkString onShortName() override {
     24         return SkString("displacement");
     25     }
     26 
     27     void onOnceBeforeDraw() override {
     28         fBitmap = sk_tool_utils::create_string_bitmap(80, 80, 0xFF884422, 15, 55, 96, "g");
     29 
     30         SkColor c1 = sk_tool_utils::color_to_565(0xFF244484);
     31         SkColor c2 = sk_tool_utils::color_to_565(0xFF804020);
     32 
     33         fCheckerboard = SkImage::MakeFromBitmap(
     34             sk_tool_utils::create_checkerboard_bitmap(80, 80, c1, c2, 8));
     35         fSmall = SkImage::MakeFromBitmap(
     36             sk_tool_utils::create_checkerboard_bitmap(64, 64, c1, c2, 8));
     37         fLarge = SkImage::MakeFromBitmap(
     38             sk_tool_utils::create_checkerboard_bitmap(96, 96, c1, c2, 8));
     39         fLargeW =
     40             SkImage::MakeFromBitmap(sk_tool_utils::create_checkerboard_bitmap(96, 64, c1, c2, 8));
     41         fLargeH = SkImage::MakeFromBitmap(
     42             sk_tool_utils::create_checkerboard_bitmap(64, 96, c1, c2, 8));
     43     }
     44 
     45     SkISize onISize() override {
     46         return SkISize::Make(600, 500);
     47     }
     48 
     49     void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) const {
     50         canvas->save();
     51         canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
     52         canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
     53         canvas->drawBitmap(fBitmap, 0, 0, &paint);
     54         canvas->restore();
     55     }
     56 
     57     void onDraw(SkCanvas* canvas) override {
     58         canvas->clear(SK_ColorBLACK);
     59         SkPaint paint;
     60         sk_sp<SkImageFilter> displ(SkImageSource::Make(fCheckerboard));
     61         paint.setImageFilter(SkDisplacementMapEffect::Make(
     62             SkDisplacementMapEffect::kR_ChannelSelectorType,
     63             SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ, nullptr));
     64         this->drawClippedBitmap(canvas, 0, 0, paint);
     65         paint.setImageFilter(SkDisplacementMapEffect::Make(
     66             SkDisplacementMapEffect::kB_ChannelSelectorType,
     67             SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ, nullptr));
     68         this->drawClippedBitmap(canvas, 100, 0, paint);
     69         paint.setImageFilter(SkDisplacementMapEffect::Make(
     70             SkDisplacementMapEffect::kR_ChannelSelectorType,
     71             SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ, nullptr));
     72         this->drawClippedBitmap(canvas, 200, 0, paint);
     73         paint.setImageFilter(SkDisplacementMapEffect::Make(
     74             SkDisplacementMapEffect::kG_ChannelSelectorType,
     75             SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ, nullptr));
     76         this->drawClippedBitmap(canvas, 300, 0, paint);
     77         paint.setImageFilter(SkDisplacementMapEffect::Make(
     78             SkDisplacementMapEffect::kR_ChannelSelectorType,
     79             SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ, nullptr));
     80         this->drawClippedBitmap(canvas, 400, 0, paint);
     81 
     82         paint.setImageFilter(SkDisplacementMapEffect::Make(
     83             SkDisplacementMapEffect::kR_ChannelSelectorType,
     84             SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ, nullptr));
     85         this->drawClippedBitmap(canvas, 0, 100, paint);
     86         paint.setImageFilter(SkDisplacementMapEffect::Make(
     87             SkDisplacementMapEffect::kB_ChannelSelectorType,
     88             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
     89         this->drawClippedBitmap(canvas, 100, 100, paint);
     90         paint.setImageFilter(SkDisplacementMapEffect::Make(
     91             SkDisplacementMapEffect::kR_ChannelSelectorType,
     92             SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ, nullptr));
     93         this->drawClippedBitmap(canvas, 200, 100, paint);
     94         paint.setImageFilter(SkDisplacementMapEffect::Make(
     95             SkDisplacementMapEffect::kG_ChannelSelectorType,
     96             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
     97         this->drawClippedBitmap(canvas, 300, 100, paint);
     98         paint.setImageFilter(SkDisplacementMapEffect::Make(
     99             SkDisplacementMapEffect::kR_ChannelSelectorType,
    100             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
    101         this->drawClippedBitmap(canvas, 400, 100, paint);
    102 
    103         SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40));
    104         paint.setImageFilter(SkDisplacementMapEffect::Make(
    105             SkDisplacementMapEffect::kR_ChannelSelectorType,
    106             SkDisplacementMapEffect::kG_ChannelSelectorType,
    107             0.0f, displ, nullptr, &cropRect));
    108         this->drawClippedBitmap(canvas, 0, 200, paint);
    109         paint.setImageFilter(SkDisplacementMapEffect::Make(
    110             SkDisplacementMapEffect::kB_ChannelSelectorType,
    111             SkDisplacementMapEffect::kA_ChannelSelectorType,
    112             16.0f, displ, nullptr, &cropRect));
    113         this->drawClippedBitmap(canvas, 100, 200, paint);
    114         paint.setImageFilter(SkDisplacementMapEffect::Make(
    115             SkDisplacementMapEffect::kR_ChannelSelectorType,
    116             SkDisplacementMapEffect::kB_ChannelSelectorType,
    117             32.0f, displ, nullptr, &cropRect));
    118         this->drawClippedBitmap(canvas, 200, 200, paint);
    119         paint.setImageFilter(SkDisplacementMapEffect::Make(
    120             SkDisplacementMapEffect::kG_ChannelSelectorType,
    121             SkDisplacementMapEffect::kA_ChannelSelectorType,
    122             48.0f, displ, nullptr, &cropRect));
    123         this->drawClippedBitmap(canvas, 300, 200, paint);
    124         paint.setImageFilter(SkDisplacementMapEffect::Make(
    125             SkDisplacementMapEffect::kR_ChannelSelectorType,
    126             SkDisplacementMapEffect::kA_ChannelSelectorType,
    127             64.0f, displ, nullptr, &cropRect));
    128         this->drawClippedBitmap(canvas, 400, 200, paint);
    129 
    130         paint.setImageFilter(SkDisplacementMapEffect::Make(
    131             SkDisplacementMapEffect::kR_ChannelSelectorType,
    132             SkDisplacementMapEffect::kG_ChannelSelectorType,
    133             40.0f, displ, nullptr, &cropRect));
    134         this->drawClippedBitmap(canvas, 0, 300, paint);
    135         paint.setImageFilter(SkDisplacementMapEffect::Make(
    136             SkDisplacementMapEffect::kB_ChannelSelectorType,
    137             SkDisplacementMapEffect::kA_ChannelSelectorType,
    138             40.0f, displ, nullptr, &cropRect));
    139         this->drawClippedBitmap(canvas, 100, 300, paint);
    140         paint.setImageFilter(SkDisplacementMapEffect::Make(
    141             SkDisplacementMapEffect::kR_ChannelSelectorType,
    142             SkDisplacementMapEffect::kB_ChannelSelectorType,
    143             40.0f, displ, nullptr, &cropRect));
    144         this->drawClippedBitmap(canvas, 200, 300, paint);
    145         paint.setImageFilter(SkDisplacementMapEffect::Make(
    146             SkDisplacementMapEffect::kG_ChannelSelectorType,
    147             SkDisplacementMapEffect::kA_ChannelSelectorType,
    148             40.0f, displ, nullptr, &cropRect));
    149         this->drawClippedBitmap(canvas, 300, 300, paint);
    150         paint.setImageFilter(SkDisplacementMapEffect::Make(
    151             SkDisplacementMapEffect::kR_ChannelSelectorType,
    152             SkDisplacementMapEffect::kA_ChannelSelectorType,
    153             40.0f, displ, nullptr, &cropRect));
    154         this->drawClippedBitmap(canvas, 400, 300, paint);
    155 
    156         // Test for negative scale.
    157         paint.setImageFilter(SkDisplacementMapEffect::Make(
    158             SkDisplacementMapEffect::kG_ChannelSelectorType,
    159             SkDisplacementMapEffect::kA_ChannelSelectorType,
    160             -40.0f, displ, nullptr));
    161         this->drawClippedBitmap(canvas, 500, 0, paint);
    162 
    163         // Tests for images of different sizes
    164         displ = SkImageSource::Make(fSmall);
    165         paint.setImageFilter(SkDisplacementMapEffect::Make(
    166             SkDisplacementMapEffect::kR_ChannelSelectorType,
    167             SkDisplacementMapEffect::kG_ChannelSelectorType,
    168             40.0f, std::move(displ), nullptr));
    169         this->drawClippedBitmap(canvas, 0, 400, paint);
    170         displ = SkImageSource::Make(fLarge);
    171         paint.setImageFilter(SkDisplacementMapEffect::Make(
    172             SkDisplacementMapEffect::kB_ChannelSelectorType,
    173             SkDisplacementMapEffect::kA_ChannelSelectorType,
    174             40.0f, std::move(displ), nullptr));
    175         this->drawClippedBitmap(canvas, 100, 400, paint);
    176         displ = SkImageSource::Make(fLargeW);
    177         paint.setImageFilter(SkDisplacementMapEffect::Make(
    178             SkDisplacementMapEffect::kR_ChannelSelectorType,
    179             SkDisplacementMapEffect::kB_ChannelSelectorType,
    180             40.0f, std::move(displ), nullptr));
    181         this->drawClippedBitmap(canvas, 200, 400, paint);
    182         displ = SkImageSource::Make(fLargeH);
    183         paint.setImageFilter(SkDisplacementMapEffect::Make(
    184             SkDisplacementMapEffect::kG_ChannelSelectorType,
    185             SkDisplacementMapEffect::kA_ChannelSelectorType,
    186             40.0f, std::move(displ), nullptr));
    187         this->drawClippedBitmap(canvas, 300, 400, paint);
    188 
    189         // Test for no given displacement input. In this case, both displacement
    190         // and color should use the same bitmap, given to SkCanvas::drawBitmap()
    191         // as an input argument.
    192         paint.setImageFilter(SkDisplacementMapEffect::Make(
    193             SkDisplacementMapEffect::kG_ChannelSelectorType,
    194             SkDisplacementMapEffect::kA_ChannelSelectorType,
    195             40.0f, nullptr, nullptr));
    196         this->drawClippedBitmap(canvas, 400, 400, paint);
    197     }
    198 
    199 private:
    200     SkBitmap fBitmap;
    201     sk_sp<SkImage> fCheckerboard, fSmall, fLarge, fLargeW, fLargeH;
    202 
    203     typedef GM INHERITED;
    204 };
    205 
    206 //////////////////////////////////////////////////////////////////////////////
    207 
    208 DEF_GM(return new DisplacementMapGM;)
    209 }
    210