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 "gm.h"
      9 #include "SkDisplacementMapEffect.h"
     10 #include "SkBitmapSource.h"
     11 
     12 namespace skiagm {
     13 
     14 class DisplacementMapGM : public GM {
     15 public:
     16     DisplacementMapGM() : fInitialized(false) {
     17         this->setBGColor(0xFF000000);
     18     }
     19 
     20 protected:
     21     virtual SkString onShortName() {
     22         return SkString("displacement");
     23     }
     24 
     25     void make_bitmaps() {
     26         make_bitmap();
     27         make_checkerboard(&fCheckerboard, 80, 80);
     28         make_checkerboard(&fSmall,        64, 64);
     29         make_checkerboard(&fLarge,        96, 96);
     30         make_checkerboard(&fLargeW,       96, 64);
     31         make_checkerboard(&fLargeH,       64, 96);
     32     }
     33 
     34     void make_bitmap() {
     35         fBitmap.allocN32Pixels(80, 80);
     36         SkCanvas canvas(fBitmap);
     37         canvas.clear(0x00000000);
     38         SkPaint paint;
     39         paint.setAntiAlias(true);
     40         sk_tool_utils::set_portable_typeface(&paint);
     41         paint.setColor(0xFF884422);
     42         paint.setTextSize(SkIntToScalar(96));
     43         const char* str = "g";
     44         canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(55), paint);
     45     }
     46 
     47     void make_checkerboard(SkBitmap* bitmap, int w, int h) {
     48         bitmap->allocN32Pixels(w, h);
     49         SkCanvas canvas(*bitmap);
     50         canvas.clear(0x00000000);
     51         SkPaint darkPaint;
     52         darkPaint.setColor(0xFF804020);
     53         SkPaint lightPaint;
     54         lightPaint.setColor(0xFF244484);
     55         for (int y = 0; y < h; y += 16) {
     56           for (int x = 0; x < w; x += 16) {
     57             canvas.save();
     58             canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
     59             canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
     60             canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
     61             canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
     62             canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
     63             canvas.restore();
     64           }
     65         }
     66     }
     67 
     68     virtual SkISize onISize() {
     69         return SkISize::Make(500, 500);
     70     }
     71 
     72     void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) {
     73         canvas->save();
     74         canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
     75         canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
     76         canvas->drawBitmap(fBitmap, 0, 0, &paint);
     77         canvas->restore();
     78     }
     79 
     80     virtual void onDraw(SkCanvas* canvas) {
     81         if (!fInitialized) {
     82             make_bitmaps();
     83             fInitialized = true;
     84         }
     85         canvas->clear(0x00000000);
     86         SkPaint paint;
     87         SkAutoTUnref<SkImageFilter> displ(SkBitmapSource::Create(fCheckerboard));
     88         paint.setImageFilter(SkDisplacementMapEffect::Create(
     89             SkDisplacementMapEffect::kR_ChannelSelectorType,
     90             SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ))->unref();
     91         drawClippedBitmap(canvas, 0, 0, paint);
     92         paint.setImageFilter(SkDisplacementMapEffect::Create(
     93             SkDisplacementMapEffect::kB_ChannelSelectorType,
     94             SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ))->unref();
     95         drawClippedBitmap(canvas, 100, 0, paint);
     96         paint.setImageFilter(SkDisplacementMapEffect::Create(
     97             SkDisplacementMapEffect::kR_ChannelSelectorType,
     98             SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ))->unref();
     99         drawClippedBitmap(canvas, 200, 0, paint);
    100         paint.setImageFilter(SkDisplacementMapEffect::Create(
    101             SkDisplacementMapEffect::kG_ChannelSelectorType,
    102             SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ))->unref();
    103         drawClippedBitmap(canvas, 300, 0, paint);
    104         paint.setImageFilter(SkDisplacementMapEffect::Create(
    105             SkDisplacementMapEffect::kR_ChannelSelectorType,
    106             SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ))->unref();
    107         drawClippedBitmap(canvas, 400, 0, paint);
    108 
    109         paint.setImageFilter(SkDisplacementMapEffect::Create(
    110             SkDisplacementMapEffect::kR_ChannelSelectorType,
    111             SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ))->unref();
    112         drawClippedBitmap(canvas, 0, 100, paint);
    113         paint.setImageFilter(SkDisplacementMapEffect::Create(
    114             SkDisplacementMapEffect::kB_ChannelSelectorType,
    115             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
    116         drawClippedBitmap(canvas, 100, 100, paint);
    117         paint.setImageFilter(SkDisplacementMapEffect::Create(
    118             SkDisplacementMapEffect::kR_ChannelSelectorType,
    119             SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ))->unref();
    120         drawClippedBitmap(canvas, 200, 100, paint);
    121         paint.setImageFilter(SkDisplacementMapEffect::Create(
    122             SkDisplacementMapEffect::kG_ChannelSelectorType,
    123             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
    124         drawClippedBitmap(canvas, 300, 100, paint);
    125         paint.setImageFilter(SkDisplacementMapEffect::Create(
    126             SkDisplacementMapEffect::kR_ChannelSelectorType,
    127             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
    128         drawClippedBitmap(canvas, 400, 100, paint);
    129 
    130         SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40));
    131         paint.setImageFilter(SkDisplacementMapEffect::Create(
    132             SkDisplacementMapEffect::kR_ChannelSelectorType,
    133             SkDisplacementMapEffect::kG_ChannelSelectorType,
    134             0.0f, displ, NULL, &cropRect))->unref();
    135         drawClippedBitmap(canvas, 0, 200, paint);
    136         paint.setImageFilter(SkDisplacementMapEffect::Create(
    137             SkDisplacementMapEffect::kB_ChannelSelectorType,
    138             SkDisplacementMapEffect::kA_ChannelSelectorType,
    139             16.0f, displ, NULL, &cropRect))->unref();
    140         drawClippedBitmap(canvas, 100, 200, paint);
    141         paint.setImageFilter(SkDisplacementMapEffect::Create(
    142             SkDisplacementMapEffect::kR_ChannelSelectorType,
    143             SkDisplacementMapEffect::kB_ChannelSelectorType,
    144             32.0f, displ, NULL, &cropRect))->unref();
    145         drawClippedBitmap(canvas, 200, 200, paint);
    146         paint.setImageFilter(SkDisplacementMapEffect::Create(
    147             SkDisplacementMapEffect::kG_ChannelSelectorType,
    148             SkDisplacementMapEffect::kA_ChannelSelectorType,
    149             48.0f, displ, NULL, &cropRect))->unref();
    150         drawClippedBitmap(canvas, 300, 200, paint);
    151         paint.setImageFilter(SkDisplacementMapEffect::Create(
    152             SkDisplacementMapEffect::kR_ChannelSelectorType,
    153             SkDisplacementMapEffect::kA_ChannelSelectorType,
    154             64.0f, displ, NULL, &cropRect))->unref();
    155         drawClippedBitmap(canvas, 400, 200, paint);
    156 
    157         paint.setImageFilter(SkDisplacementMapEffect::Create(
    158             SkDisplacementMapEffect::kR_ChannelSelectorType,
    159             SkDisplacementMapEffect::kG_ChannelSelectorType,
    160             40.0f, displ, NULL, &cropRect))->unref();
    161         drawClippedBitmap(canvas, 0, 300, paint);
    162         paint.setImageFilter(SkDisplacementMapEffect::Create(
    163             SkDisplacementMapEffect::kB_ChannelSelectorType,
    164             SkDisplacementMapEffect::kA_ChannelSelectorType,
    165             40.0f, displ, NULL, &cropRect))->unref();
    166         drawClippedBitmap(canvas, 100, 300, paint);
    167         paint.setImageFilter(SkDisplacementMapEffect::Create(
    168             SkDisplacementMapEffect::kR_ChannelSelectorType,
    169             SkDisplacementMapEffect::kB_ChannelSelectorType,
    170             40.0f, displ, NULL, &cropRect))->unref();
    171         drawClippedBitmap(canvas, 200, 300, paint);
    172         paint.setImageFilter(SkDisplacementMapEffect::Create(
    173             SkDisplacementMapEffect::kG_ChannelSelectorType,
    174             SkDisplacementMapEffect::kA_ChannelSelectorType,
    175             40.0f, displ, NULL, &cropRect))->unref();
    176         drawClippedBitmap(canvas, 300, 300, paint);
    177         paint.setImageFilter(SkDisplacementMapEffect::Create(
    178             SkDisplacementMapEffect::kR_ChannelSelectorType,
    179             SkDisplacementMapEffect::kA_ChannelSelectorType,
    180             40.0f, displ, NULL, &cropRect))->unref();
    181         drawClippedBitmap(canvas, 400, 300, paint);
    182 
    183         // Tests for images of different sizes
    184         displ.reset(SkBitmapSource::Create(fSmall));
    185         paint.setImageFilter(SkDisplacementMapEffect::Create(
    186             SkDisplacementMapEffect::kR_ChannelSelectorType,
    187             SkDisplacementMapEffect::kG_ChannelSelectorType,
    188             40.0f, displ))->unref();
    189         drawClippedBitmap(canvas, 0, 400, paint);
    190         displ.reset(SkBitmapSource::Create(fLarge));
    191         paint.setImageFilter(SkDisplacementMapEffect::Create(
    192             SkDisplacementMapEffect::kB_ChannelSelectorType,
    193             SkDisplacementMapEffect::kA_ChannelSelectorType,
    194             40.0f, displ))->unref();
    195         drawClippedBitmap(canvas, 100, 400, paint);
    196         displ.reset(SkBitmapSource::Create(fLargeW));
    197         paint.setImageFilter(SkDisplacementMapEffect::Create(
    198             SkDisplacementMapEffect::kR_ChannelSelectorType,
    199             SkDisplacementMapEffect::kB_ChannelSelectorType,
    200             40.0f, displ))->unref();
    201         drawClippedBitmap(canvas, 200, 400, paint);
    202         displ.reset(SkBitmapSource::Create(fLargeH));
    203         paint.setImageFilter(SkDisplacementMapEffect::Create(
    204             SkDisplacementMapEffect::kG_ChannelSelectorType,
    205             SkDisplacementMapEffect::kA_ChannelSelectorType,
    206             40.0f, displ))->unref();
    207         drawClippedBitmap(canvas, 300, 400, paint);
    208 
    209         // Test for no given displacement input. In this case, both displacement
    210         // and color should use the same bitmap, given to SkCanvas::drawBitmap()
    211         // as an input argument.
    212         paint.setImageFilter(SkDisplacementMapEffect::Create(
    213             SkDisplacementMapEffect::kG_ChannelSelectorType,
    214             SkDisplacementMapEffect::kA_ChannelSelectorType,
    215             40.0f, NULL))->unref();
    216         drawClippedBitmap(canvas, 400, 400, paint);
    217     }
    218 
    219 private:
    220     typedef GM INHERITED;
    221     SkBitmap fBitmap, fCheckerboard, fSmall, fLarge, fLargeW, fLargeH;
    222     bool fInitialized;
    223 };
    224 
    225 //////////////////////////////////////////////////////////////////////////////
    226 
    227 static GM* MyFactory(void*) { return new DisplacementMapGM; }
    228 static GMRegistry reg(MyFactory);
    229 
    230 }
    231