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 "SkColor.h"
     10 #include "SkBicubicImageFilter.h"
     11 
     12 namespace skiagm {
     13 
     14 class BicubicGM : public GM {
     15 public:
     16     BicubicGM() : fInitialized(false) {
     17         this->setBGColor(0x00000000);
     18     }
     19 
     20 protected:
     21     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     22         return kSkipTiled_Flag;
     23     }
     24 
     25     virtual SkString onShortName() {
     26         return SkString("bicubicfilter");
     27     }
     28 
     29     void make_checkerboard(int width, int height) {
     30         SkASSERT(width % 2 == 0);
     31         SkASSERT(height % 2 == 0);
     32         fCheckerboard.allocN32Pixels(width, height);
     33         for (int y = 0; y < height; y += 2) {
     34             SkPMColor* s = fCheckerboard.getAddr32(0, y);
     35             for (int x = 0; x < width; x += 2) {
     36                 *s++ = 0xFFFFFFFF;
     37                 *s++ = 0xFF000000;
     38             }
     39             s = fCheckerboard.getAddr32(0, y + 1);
     40             for (int x = 0; x < width; x += 2) {
     41                 *s++ = 0xFF000000;
     42                 *s++ = 0xFFFFFFFF;
     43             }
     44         }
     45     }
     46 
     47     virtual SkISize onISize() {
     48         return SkISize::Make(400, 300);
     49     }
     50 
     51     virtual void onDraw(SkCanvas* canvas) {
     52         if (!fInitialized) {
     53             make_checkerboard(4, 4);
     54             fInitialized = true;
     55         }
     56         SkScalar sk32 = SkIntToScalar(32);
     57         canvas->clear(0x00000000);
     58         SkPaint bilinearPaint, bicubicPaint;
     59         SkSize scale = SkSize::Make(sk32, sk32);
     60         canvas->save();
     61         canvas->scale(sk32, sk32);
     62         bilinearPaint.setFilterLevel(SkPaint::kLow_FilterLevel);
     63         canvas->drawBitmap(fCheckerboard, 0, 0, &bilinearPaint);
     64         canvas->restore();
     65         SkAutoTUnref<SkImageFilter> bicubic(SkBicubicImageFilter::CreateMitchell(scale));
     66         bicubicPaint.setImageFilter(bicubic);
     67         SkRect srcBounds;
     68         fCheckerboard.getBounds(&srcBounds);
     69         canvas->translate(SkIntToScalar(140), 0);
     70         canvas->saveLayer(&srcBounds, &bicubicPaint);
     71         canvas->drawBitmap(fCheckerboard, 0, 0);
     72         canvas->restore();
     73     }
     74 
     75 private:
     76     typedef GM INHERITED;
     77     SkBitmap fCheckerboard;
     78     bool fInitialized;
     79 };
     80 
     81 //////////////////////////////////////////////////////////////////////////////
     82 
     83 static GM* MyFactory(void*) { return new BicubicGM; }
     84 static GMRegistry reg(MyFactory);
     85 
     86 }
     87