Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2012 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 "SkPath.h"
     11 
     12 static void make_bm(SkBitmap* bm, int width, int height, SkColor color) {
     13     bm->setConfig(SkBitmap::kARGB_8888_Config, width, height);
     14     bm->allocPixels();
     15     bm->eraseColor(color);
     16     bm->setImmutable();
     17 }
     18 
     19 static void show_bm(SkCanvas* canvas, int width, int height, SkColor color) {
     20     SkBitmap bm;
     21     make_bm(&bm, width, height, color);
     22 
     23     SkPaint paint;
     24     SkRect r;
     25     SkIRect ir;
     26 
     27     paint.setStyle(SkPaint::kStroke_Style);
     28 
     29     ir.set(0, 0, 128, 128);
     30     r.set(ir);
     31 
     32     canvas->save();
     33     canvas->clipRect(r);
     34     canvas->drawBitmap(bm, 0, 0, NULL);
     35     canvas->restore();
     36     canvas->drawRect(r, paint);
     37 
     38     r.offset(SkIntToScalar(150), 0);
     39     // exercises extract bitmap, but not shader
     40     canvas->drawBitmapRect(bm, &ir, r, NULL);
     41     canvas->drawRect(r, paint);
     42 
     43     r.offset(SkIntToScalar(150), 0);
     44     // exercises bitmapshader
     45     canvas->drawBitmapRect(bm, NULL, r, NULL);
     46     canvas->drawRect(r, paint);
     47 }
     48 
     49 class VeryLargeBitmapGM : public skiagm::GM {
     50 public:
     51     VeryLargeBitmapGM() {}
     52 
     53 protected:
     54     virtual SkString onShortName() SK_OVERRIDE {
     55         return SkString("verylargebitmap");
     56     }
     57 
     58     virtual SkISize onISize() SK_OVERRIDE {
     59         return SkISize::Make(640, 480);
     60     }
     61 
     62     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
     63         int veryBig = 70*1024; // 64K < size
     64         int big = 60*1024;      // 32K < size < 64K
     65         int small = 150;
     66 
     67         canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
     68         show_bm(canvas, small, small, SK_ColorRED);
     69         canvas->translate(0, SkIntToScalar(150));
     70 
     71         show_bm(canvas, big, small, SK_ColorBLUE);
     72         canvas->translate(0, SkIntToScalar(150));
     73 
     74         // as of this writing, the raster code will fail to draw the scaled version
     75         // since it has a 64K limit on x,y coordinates... (but gpu should succeed)
     76         show_bm(canvas, veryBig, small, SK_ColorGREEN);
     77     }
     78 
     79 private:
     80     typedef skiagm::GM INHERITED;
     81 };
     82 
     83 //////////////////////////////////////////////////////////////////////////////
     84 
     85 // This GM allocates more memory than Android devices are capable of fulfilling.
     86 #ifndef SK_BUILD_FOR_ANDROID
     87 static skiagm::GM* MyFactory(void*) { return new VeryLargeBitmapGM; }
     88 static skiagm::GMRegistry reg(MyFactory);
     89 #endif
     90