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 
     10 #include "Resources.h"
     11 #include "SkBitmapProcState.h"
     12 #include "SkBitmapScaler.h"
     13 #include "SkGradientShader.h"
     14 #include "SkImageDecoder.h"
     15 #include "SkImageEncoder.h"
     16 #include "SkStream.h"
     17 #include "SkTypeface.h"
     18 
     19 static SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) {
     20     SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()),
     21                                    SkIntToScalar(bm.height()));
     22     mat.mapRect(&bounds);
     23     return SkSize::Make(bounds.width(), bounds.height());
     24 }
     25 
     26 static void draw_cell(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx,
     27                       SkFilterQuality lvl) {
     28     SkPaint paint;
     29     paint.setFilterQuality(lvl);
     30 
     31     SkAutoCanvasRestore acr(canvas, true);
     32 
     33     canvas->translate(dx, 0);
     34     canvas->concat(mat);
     35     canvas->drawBitmap(bm, 0, 0, &paint);
     36 }
     37 
     38 static void draw_row(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx) {
     39     draw_cell(canvas, bm, mat, 0 * dx, kNone_SkFilterQuality);
     40     draw_cell(canvas, bm, mat, 1 * dx, kLow_SkFilterQuality);
     41     draw_cell(canvas, bm, mat, 2 * dx, kMedium_SkFilterQuality);
     42     draw_cell(canvas, bm, mat, 3 * dx, kHigh_SkFilterQuality);
     43 }
     44 
     45 class FilterIndiaBoxGM : public skiagm::GM {
     46     void onOnceBeforeDraw() override {
     47         this->makeBitmap();
     48 
     49         SkScalar cx = SkScalarHalf(fBM.width());
     50         SkScalar cy = SkScalarHalf(fBM.height());
     51 
     52         float vertScale = 30.0f/55.0f;
     53         float horizScale = 150.0f/200.0f;
     54 
     55         fMatrix[0].setScale(horizScale, vertScale);
     56         fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(horizScale, vertScale);
     57     }
     58 
     59 public:
     60     SkBitmap    fBM;
     61     SkMatrix    fMatrix[2];
     62     SkString    fName;
     63 
     64     FilterIndiaBoxGM() {
     65         this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
     66     }
     67 
     68     FilterIndiaBoxGM(const char filename[]) : fFilename(filename) {
     69         fName.printf("filterindiabox");
     70     }
     71 
     72 protected:
     73     SkString onShortName() override {
     74         return fName;
     75     }
     76 
     77     SkISize onISize() override {
     78         return SkISize::Make(1024, 768);
     79     }
     80 
     81     void onDraw(SkCanvas* canvas) override {
     82         canvas->translate(10, 10);
     83         for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrix); ++i) {
     84             SkSize size = computeSize(fBM, fMatrix[i]);
     85             size.fWidth += 20;
     86             size.fHeight += 20;
     87 
     88             draw_row(canvas, fBM, fMatrix[i], size.fWidth);
     89             canvas->translate(0, size.fHeight);
     90         }
     91     }
     92 
     93   protected:
     94       SkString fFilename;
     95       int fSize;
     96 
     97       SkScalar getScale() {
     98           return 192.f/fSize;
     99       }
    100 
    101       void makeBitmap() {
    102           SkImageDecoder* codec = nullptr;
    103           SkString resourcePath = GetResourcePath(fFilename.c_str());
    104           SkFILEStream stream(resourcePath.c_str());
    105           if (stream.isValid()) {
    106               codec = SkImageDecoder::Factory(&stream);
    107           }
    108           if (codec) {
    109               stream.rewind();
    110               codec->decode(&stream, &fBM, kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode);
    111               delete codec;
    112           } else {
    113               fBM.allocN32Pixels(1, 1);
    114               *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad
    115           }
    116           fSize = fBM.height();
    117       }
    118   private:
    119     typedef skiagm::GM INHERITED;
    120 };
    121 
    122 //////////////////////////////////////////////////////////////////////////////
    123 
    124 
    125 DEF_GM( return new FilterIndiaBoxGM("box.gif"); )
    126