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
SetImageRef(SkBitmap * bitmap,SkStream * stream,SkBitmap::Config pref,const char name[]=NULL)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
ImageView()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
~ImageView()95 virtual ~ImageView() {
96 delete[] fBitmaps;
97 delete fShader;
98
99 SkImageRef_GlobalPool::DumpPool();
100 }
101
102 protected:
103 // overrides from SkEventSink
onQuery(SkEvent * evt)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
drawBG(SkCanvas * canvas)112 void drawBG(SkCanvas* canvas) {
113 canvas->drawColor(0xFFDDDDDD);
114 // canvas->drawColor(SK_ColorWHITE);
115 }
116
onDraw(SkCanvas * canvas)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
onFindClickHandler(SkScalar x,SkScalar y)139 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
140 this->inval(NULL);
141 return this->INHERITED::onFindClickHandler(x, y);
142 }
143
onClick(Click * click)144 virtual bool onClick(Click* click) {
145 return this->INHERITED::onClick(click);
146 }
147
148 private:
149 typedef SkView INHERITED;
150 };
151
152 //////////////////////////////////////////////////////////////////////////////
153
MyFactory()154 static SkView* MyFactory() { return new ImageView; }
155 static SkViewRegister reg(MyFactory);
156
157