Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2011 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 "SkCanvas.h"
     10 #include "SkColorPriv.h"
     11 #include "SkShader.h"
     12 
     13 /*
     14  *  Want to ensure that our bitmap sampler (in bitmap shader) keeps plenty of
     15  *  precision when scaling very large images (where the dx might get very small.
     16  */
     17 
     18 #define W   257
     19 #define H   161
     20 
     21 class GiantBitmapGM : public skiagm::GM {
     22     SkBitmap* fBM;
     23     SkShader::TileMode fMode;
     24     bool fDoFilter;
     25     bool fDoRotate;
     26 
     27     const SkBitmap& getBitmap() {
     28         if (NULL == fBM) {
     29             fBM = new SkBitmap;
     30             fBM->setConfig(SkBitmap::kARGB_8888_Config, W, H);
     31             fBM->allocPixels();
     32             fBM->eraseColor(SK_ColorWHITE);
     33 
     34             const SkColor colors[] = {
     35                 SK_ColorBLUE, SK_ColorRED, SK_ColorBLACK, SK_ColorGREEN
     36             };
     37 
     38             SkCanvas canvas(*fBM);
     39             SkPaint paint;
     40             paint.setAntiAlias(true);
     41             paint.setStrokeWidth(SkIntToScalar(20));
     42 
     43 #if 0
     44             for (int y = -H*2; y < H; y += 50) {
     45                 SkScalar yy = SkIntToScalar(y);
     46                 paint.setColor(colors[y/50 & 0x3]);
     47                 canvas.drawLine(0, yy, SkIntToScalar(W), yy + SkIntToScalar(W),
     48                                 paint);
     49             }
     50 #else
     51             for (int x = -W; x < W; x += 60) {
     52                 paint.setColor(colors[x/60 & 0x3]);
     53 
     54                 SkScalar xx = SkIntToScalar(x);
     55                 canvas.drawLine(xx, 0, xx, SkIntToScalar(H),
     56                                 paint);
     57             }
     58 #endif
     59         }
     60         return *fBM;
     61     }
     62 
     63 public:
     64     GiantBitmapGM(SkShader::TileMode mode, bool doFilter, bool doRotate) : fBM(NULL) {
     65         fMode = mode;
     66         fDoFilter = doFilter;
     67         fDoRotate = doRotate;
     68     }
     69 
     70     virtual ~GiantBitmapGM() {
     71         SkDELETE(fBM);
     72     }
     73 
     74 protected:
     75     virtual SkString onShortName() {
     76         SkString str("giantbitmap_");
     77         switch (fMode) {
     78             case SkShader::kClamp_TileMode:
     79                 str.append("clamp");
     80                 break;
     81             case SkShader::kRepeat_TileMode:
     82                 str.append("repeat");
     83                 break;
     84             case SkShader::kMirror_TileMode:
     85                 str.append("mirror");
     86                 break;
     87             default:
     88                 break;
     89         }
     90         str.append(fDoFilter ? "_bilerp" : "_point");
     91         str.append(fDoRotate ? "_rotate" : "_scale");
     92         return str;
     93     }
     94 
     95     virtual SkISize onISize() { return SkISize::Make(640, 480); }
     96 
     97     virtual void onDraw(SkCanvas* canvas) {
     98         SkPaint paint;
     99         SkShader* s = SkShader::CreateBitmapShader(getBitmap(), fMode, fMode);
    100 
    101         SkMatrix m;
    102         if (fDoRotate) {
    103 //            m.setRotate(SkIntToScalar(30), 0, 0);
    104             m.setSkew(SK_Scalar1, 0, 0, 0);
    105 //            m.postScale(2*SK_Scalar1/3, 2*SK_Scalar1/3);
    106         } else {
    107             SkScalar scale = 11*SK_Scalar1/12;
    108             m.setScale(scale, scale);
    109         }
    110         s->setLocalMatrix(m);
    111 
    112         paint.setShader(s)->unref();
    113         paint.setFilterBitmap(fDoFilter);
    114 
    115         canvas->translate(SkIntToScalar(50), SkIntToScalar(50));
    116 
    117 //        SkRect r = SkRect::MakeXYWH(-50, -50, 32, 16);
    118 //        canvas->drawRect(r, paint); return;
    119         canvas->drawPaint(paint);
    120     }
    121 
    122 private:
    123     typedef GM INHERITED;
    124 };
    125 
    126 ///////////////////////////////////////////////////////////////////////////////
    127 
    128 static skiagm::GM* G000(void*) { return new GiantBitmapGM(SkShader::kClamp_TileMode, false, false); }
    129 static skiagm::GM* G100(void*) { return new GiantBitmapGM(SkShader::kRepeat_TileMode, false, false); }
    130 static skiagm::GM* G200(void*) { return new GiantBitmapGM(SkShader::kMirror_TileMode, false, false); }
    131 static skiagm::GM* G010(void*) { return new GiantBitmapGM(SkShader::kClamp_TileMode, true, false); }
    132 static skiagm::GM* G110(void*) { return new GiantBitmapGM(SkShader::kRepeat_TileMode, true, false); }
    133 static skiagm::GM* G210(void*) { return new GiantBitmapGM(SkShader::kMirror_TileMode, true, false); }
    134 
    135 static skiagm::GM* G001(void*) { return new GiantBitmapGM(SkShader::kClamp_TileMode, false, true); }
    136 static skiagm::GM* G101(void*) { return new GiantBitmapGM(SkShader::kRepeat_TileMode, false, true); }
    137 static skiagm::GM* G201(void*) { return new GiantBitmapGM(SkShader::kMirror_TileMode, false, true); }
    138 static skiagm::GM* G011(void*) { return new GiantBitmapGM(SkShader::kClamp_TileMode, true, true); }
    139 static skiagm::GM* G111(void*) { return new GiantBitmapGM(SkShader::kRepeat_TileMode, true, true); }
    140 static skiagm::GM* G211(void*) { return new GiantBitmapGM(SkShader::kMirror_TileMode, true, true); }
    141 
    142 static skiagm::GMRegistry reg000(G000);
    143 static skiagm::GMRegistry reg100(G100);
    144 static skiagm::GMRegistry reg200(G200);
    145 static skiagm::GMRegistry reg010(G010);
    146 static skiagm::GMRegistry reg110(G110);
    147 static skiagm::GMRegistry reg210(G210);
    148 
    149 static skiagm::GMRegistry reg001(G001);
    150 static skiagm::GMRegistry reg101(G101);
    151 static skiagm::GMRegistry reg201(G201);
    152 static skiagm::GMRegistry reg011(G011);
    153 static skiagm::GMRegistry reg111(G111);
    154 static skiagm::GMRegistry reg211(G211);
    155