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