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 "SkGradientShader.h" 11 #include "SkPath.h" 12 13 static void make_bm(SkBitmap* bm, int width, int height, SkColor colors[2]) { 14 bm->allocN32Pixels(width, height); 15 SkCanvas canvas(*bm); 16 SkPoint center = {SkIntToScalar(width)/2, SkIntToScalar(height)/2}; 17 SkScalar radius = 40; 18 SkShader* shader = SkGradientShader::CreateRadial(center, radius, colors, NULL, 2, 19 SkShader::kMirror_TileMode); 20 SkPaint paint; 21 paint.setShader(shader)->unref(); 22 paint.setXfermodeMode(SkXfermode::kSrc_Mode); 23 canvas.drawPaint(paint); 24 bm->setImmutable(); 25 } 26 27 static void show_bm(SkCanvas* canvas, int width, int height, SkColor colors[2]) { 28 SkBitmap bm; 29 make_bm(&bm, width, height, colors); 30 31 SkPaint paint; 32 SkRect r; 33 SkIRect ir; 34 35 paint.setStyle(SkPaint::kStroke_Style); 36 37 ir.set(0, 0, 128, 128); 38 r.set(ir); 39 40 canvas->save(); 41 canvas->clipRect(r); 42 canvas->drawBitmap(bm, 0, 0, NULL); 43 canvas->restore(); 44 canvas->drawRect(r, paint); 45 46 r.offset(SkIntToScalar(150), 0); 47 // exercises extract bitmap, but not shader 48 canvas->drawBitmapRect(bm, &ir, r, NULL); 49 canvas->drawRect(r, paint); 50 51 r.offset(SkIntToScalar(150), 0); 52 // exercises bitmapshader 53 canvas->drawBitmapRect(bm, NULL, r, NULL); 54 canvas->drawRect(r, paint); 55 } 56 57 class VeryLargeBitmapGM : public skiagm::GM { 58 public: 59 VeryLargeBitmapGM() {} 60 61 protected: 62 virtual SkString onShortName() SK_OVERRIDE { 63 return SkString("verylargebitmap"); 64 } 65 66 virtual SkISize onISize() SK_OVERRIDE { 67 return SkISize::Make(500, 600); 68 } 69 70 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 71 int veryBig = 65*1024; // 64K < size 72 int big = 33*1024; // 32K < size < 64K 73 // smaller than many max texture sizes, but large enough to gpu-tile for memory reasons. 74 int medium = 5*1024; 75 int small = 150; 76 77 SkColor colors[2]; 78 79 canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); 80 colors[0] = SK_ColorRED; 81 colors[1] = SK_ColorGREEN; 82 show_bm(canvas, small, small, colors); 83 canvas->translate(0, SkIntToScalar(150)); 84 85 colors[0] = SK_ColorBLUE; 86 colors[1] = SK_ColorMAGENTA; 87 show_bm(canvas, big, small, colors); 88 canvas->translate(0, SkIntToScalar(150)); 89 90 colors[0] = SK_ColorMAGENTA; 91 colors[1] = SK_ColorYELLOW; 92 show_bm(canvas, medium, medium, colors); 93 canvas->translate(0, SkIntToScalar(150)); 94 95 colors[0] = SK_ColorGREEN; 96 colors[1] = SK_ColorYELLOW; 97 // as of this writing, the raster code will fail to draw the scaled version 98 // since it has a 64K limit on x,y coordinates... (but gpu should succeed) 99 show_bm(canvas, veryBig, small, colors); 100 } 101 102 #ifdef SK_BUILD_FOR_WIN32 103 virtual uint32_t onGetFlags() const { 104 // The Windows bot runs out of memory in replay modes on this test in 32bit builds: 105 // http://skbug.com/1756 106 return kSkipPicture_Flag | 107 kSkipPipe_Flag | 108 kSkipPipeCrossProcess_Flag | 109 kSkipTiled_Flag | 110 kSkipScaledReplay_Flag; 111 } 112 #endif 113 114 private: 115 typedef skiagm::GM INHERITED; 116 }; 117 118 ////////////////////////////////////////////////////////////////////////////// 119 120 static skiagm::GM* MyFactory(void*) { return new VeryLargeBitmapGM; } 121 static skiagm::GMRegistry reg(MyFactory); 122