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 
     10 #include "SkImageDecoder.h"
     11 #include "SkStream.h"
     12 
     13 class ScaleBitmapGM : public skiagm::GM {
     14 
     15 public:
     16 
     17     ScaleBitmapGM(const char filename[], float scale)
     18         : fFilename(filename), fScale(scale)
     19     {
     20         this->setBGColor(0xFFDDDDDD);
     21         fName.printf("scalebitmap_%s_%f", filename, scale);
     22 
     23         SkString path(skiagm::GM::gResourcePath);
     24         path.append("/");
     25         path.append(fFilename);
     26 
     27         SkImageDecoder *codec = NULL;
     28         SkFILEStream stream(path.c_str());
     29         if (stream.isValid()) {
     30             codec = SkImageDecoder::Factory(&stream);
     31         }
     32         if (codec) {
     33             stream.rewind();
     34             codec->decode(&stream, &fBM, SkBitmap::kARGB_8888_Config,
     35                 SkImageDecoder::kDecodePixels_Mode);
     36             SkDELETE(codec);
     37         } else {
     38             fBM.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
     39             fBM.allocPixels();
     40             *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad
     41         }
     42         fSize = fBM.height();
     43     }
     44 
     45 protected:
     46 
     47 
     48     SkBitmap    fBM;
     49     SkString    fName;
     50     SkString    fFilename;
     51     int         fSize;
     52     float       fScale;
     53 
     54 
     55     virtual SkString onShortName() SK_OVERRIDE {
     56         return fName;
     57     }
     58 
     59     virtual SkISize onISize() SK_OVERRIDE {
     60         return SkISize::Make(fBM.width() * fScale, fBM.height() * fScale);
     61     }
     62 
     63     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
     64         SkBitmap dst;
     65         dst.setConfig(SkBitmap::kARGB_8888_Config, fBM.width() * fScale, fBM.height() * fScale);
     66         dst.allocPixels();
     67         fBM.scale(&dst);
     68 
     69         canvas->drawBitmap(dst, 0, 0);
     70     }
     71 
     72 private:
     73     typedef skiagm::GM INHERITED;
     74 };
     75 
     76 class ScaleBitmapMipmapGM: public ScaleBitmapGM {
     77     SkMatrix fMatrix;
     78 
     79 public:
     80     ScaleBitmapMipmapGM(const char filename[], float scale)
     81         : INHERITED(filename, scale)
     82     {
     83         fName.printf("scalebitmap_mipmap_%s_%f", filename, scale);
     84         fBM.buildMipMap();
     85         fMatrix.setScale(scale, scale);
     86     }
     87 protected:
     88     virtual void onDraw(SkCanvas *canvas) SK_OVERRIDE {
     89         SkPaint paint;
     90 
     91         paint.setFilterBitmap(true);
     92         canvas->drawBitmapMatrix(fBM, fMatrix, &paint);
     93     }
     94 private:
     95      typedef ScaleBitmapGM INHERITED;
     96 };
     97 
     98 //////////////////////////////////////////////////////////////////////////////
     99 
    100 DEF_GM( return new ScaleBitmapGM("mandrill_128.png", 2); )
    101 DEF_GM( return new ScaleBitmapGM("mandrill_64.png", 4); )
    102 DEF_GM( return new ScaleBitmapGM("mandrill_32.png", 8); )
    103 DEF_GM( return new ScaleBitmapGM("mandrill_16.png", 16); )
    104 
    105 DEF_GM( return new ScaleBitmapGM("nature.jpg", 0.5f); )
    106 DEF_GM( return new ScaleBitmapGM("nature.jpg", 0.25f); )
    107 DEF_GM( return new ScaleBitmapGM("nature.jpg", 0.125f); )
    108 DEF_GM( return new ScaleBitmapGM("nature.jpg", 0.0625f); )
    109 
    110 DEF_GM( return new ScaleBitmapMipmapGM("nature.jpg", 0.5f); )
    111 DEF_GM( return new ScaleBitmapMipmapGM("nature.jpg", 0.25f); )
    112 DEF_GM( return new ScaleBitmapMipmapGM("nature.jpg", 0.125f); )
    113 DEF_GM( return new ScaleBitmapMipmapGM("nature.jpg", 0.0625f); )
    114