1 #include "SampleCode.h" 2 #include "SkView.h" 3 #include "SkCanvas.h" 4 #include "SkGradientShader.h" 5 #include "SkGraphics.h" 6 #include "SkImageDecoder.h" 7 #include "SkPath.h" 8 #include "SkRegion.h" 9 #include "SkShader.h" 10 #include "SkUtils.h" 11 #include "SkXfermode.h" 12 #include "SkColorPriv.h" 13 #include "SkColorFilter.h" 14 #include "SkTime.h" 15 #include "SkTypeface.h" 16 17 #include "SkImageRef_GlobalPool.h" 18 #include "SkStream.h" 19 20 static const char* gNames[] = { 21 "1.bmp", "1.gif", "1.jpg", "1.png", 22 "2.bmp", "2.gif", "2.jpg", "2.png" 23 }; 24 25 static bool SetImageRef(SkBitmap* bitmap, SkStream* stream, 26 SkBitmap::Config pref, const char name[] = NULL) 27 { 28 if (SkImageDecoder::DecodeStream(stream, bitmap, pref, 29 SkImageDecoder::kDecodeBounds_Mode, NULL)) { 30 SkASSERT(bitmap->config() != SkBitmap::kNo_Config); 31 32 SkImageRef* ref = new SkImageRef_GlobalPool(stream, bitmap->config()); 33 ref->setURI(name); 34 bitmap->setPixelRef(ref)->unref(); 35 return true; 36 } else { 37 return false; 38 } 39 } 40 41 class ImageView : public SkView { 42 public: 43 SkBitmap* fBitmaps; 44 SkShader* fShader; 45 46 ImageView() { 47 SkImageRef_GlobalPool::SetRAMBudget(32 * 1024); 48 49 int i, N = SK_ARRAY_COUNT(gNames); 50 fBitmaps = new SkBitmap[N]; 51 52 for (i = 0; i < N; i++) { 53 SkString str("/skimages/"); 54 str.append(gNames[i]); 55 SkFILEStream* stream = new SkFILEStream(str.c_str()); 56 57 SetImageRef(&fBitmaps[i], stream, SkBitmap::kNo_Config, gNames[i]); 58 if (i & 1) 59 fBitmaps[i].buildMipMap(); 60 stream->unref(); 61 } 62 63 fShader = SkShader::CreateBitmapShader(fBitmaps[5], 64 SkShader::kRepeat_TileMode, 65 SkShader::kRepeat_TileMode); 66 67 if (true) { 68 SkMatrix m; 69 70 m.setRotate(SkIntToScalar(30)); 71 fShader->setLocalMatrix(m); 72 } 73 74 #if 0 75 SkImageRef::DumpPool(); 76 for (i = 0; i < N; i++) { 77 SkBitmap& bm = fBitmaps[i]; 78 79 SkDebugf("<%s> addr=%p", gNames[i], bm.getPixels()); 80 bool success = bm.lockPixels(); 81 SkDebugf(" addr=%d", bm.getPixels()); 82 if (success) 83 bm.unlockPixels(); 84 SkDebugf(" addr=%p", bm.getPixels()); 85 success = bm.lockPixels(); 86 SkDebugf(" addr=%d", bm.getPixels()); 87 if (success) 88 bm.unlockPixels(); 89 SkDebugf("\n"); 90 } 91 SkImageRef::DumpPool(); 92 #endif 93 } 94 95 virtual ~ImageView() { 96 delete[] fBitmaps; 97 delete fShader; 98 99 SkImageRef_GlobalPool::DumpPool(); 100 } 101 102 protected: 103 // overrides from SkEventSink 104 virtual bool onQuery(SkEvent* evt) { 105 if (SampleCode::TitleQ(*evt)) { 106 SampleCode::TitleR(evt, "Image"); 107 return true; 108 } 109 return this->INHERITED::onQuery(evt); 110 } 111 112 void drawBG(SkCanvas* canvas) { 113 canvas->drawColor(0xFFDDDDDD); 114 // canvas->drawColor(SK_ColorWHITE); 115 } 116 117 virtual void onDraw(SkCanvas* canvas) { 118 this->drawBG(canvas); 119 120 canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); 121 122 SkScalar x = 0, y = 0; 123 124 for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); i++) { 125 canvas->drawBitmap(fBitmaps[i], x, y); 126 x += SkIntToScalar(fBitmaps[i].width() + 10); 127 } 128 129 canvas->translate(0, SkIntToScalar(120)); 130 131 SkPaint paint; 132 paint.setShader(fShader); 133 paint.setFilterBitmap(true); 134 SkRect r = { 0, 0, SkIntToScalar(300), SkIntToScalar(100) }; 135 136 canvas->drawRect(r, paint); 137 } 138 139 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { 140 this->inval(NULL); 141 return this->INHERITED::onFindClickHandler(x, y); 142 } 143 144 virtual bool onClick(Click* click) { 145 return this->INHERITED::onClick(click); 146 } 147 148 private: 149 typedef SkView INHERITED; 150 }; 151 152 ////////////////////////////////////////////////////////////////////////////// 153 154 static SkView* MyFactory() { return new ImageView; } 155 static SkViewRegister reg(MyFactory); 156 157