1
2 /*
3 * Copyright 2006 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10 #include "SkDrawBitmap.h"
11 #include "SkAnimateMaker.h"
12 #include "SkCanvas.h"
13 #include "SkImageDecoder.h"
14 #include "SkPaint.h"
15 #include "SkStream.h"
16
17 #if SK_USE_CONDENSED_INFO == 0
18
19 const SkMemberInfo SkBaseBitmap::fInfo[] = {
20 SK_MEMBER(x, Float),
21 SK_MEMBER(y, Float)
22 };
23
24 #endif
25
26 DEFINE_GET_MEMBER(SkBaseBitmap);
27
SkBaseBitmap()28 SkBaseBitmap::SkBaseBitmap() : x(0), y(0) {
29 }
30
~SkBaseBitmap()31 SkBaseBitmap::~SkBaseBitmap() {
32 }
33
draw(SkAnimateMaker & maker)34 bool SkBaseBitmap::draw(SkAnimateMaker& maker) {
35 SkBoundableAuto boundable(this, maker);
36 maker.fCanvas->drawBitmap(fBitmap, x, y, maker.fPaint);
37 return false;
38 }
39
40 enum SkDrawBitmap_Properties {
41 SK_PROPERTY(erase)
42 };
43
44 #if SK_USE_CONDENSED_INFO == 0
45
46 const SkMemberInfo SkDrawBitmap::fInfo[] = {
47 SK_MEMBER_INHERITED,
48 SK_MEMBER_PROPERTY(erase, ARGB),
49 SK_MEMBER(format, BitmapFormat),
50 SK_MEMBER(height, Int),
51 SK_MEMBER(rowBytes, Int),
52 SK_MEMBER(width, Int),
53 };
54
55 #endif
56
57 DEFINE_GET_MEMBER(SkDrawBitmap);
58
SkDrawBitmap()59 SkDrawBitmap::SkDrawBitmap() : format((SkBitmap::Config) -1), height(-1),
60 rowBytes(0), width(-1), fColor(0), fColorSet(false) {
61 }
62
~SkDrawBitmap()63 SkDrawBitmap::~SkDrawBitmap() {
64 }
65
66 #ifdef SK_DUMP_ENABLED
dump(SkAnimateMaker * maker)67 void SkDrawBitmap::dump(SkAnimateMaker* maker) {
68 dumpBase(maker);
69 dumpAttrs(maker);
70 if (fColorSet)
71 SkDebugf("erase=\"argb(%d,%d,%d,%d)\" ", SkColorGetA(fColor)/255, SkColorGetR(fColor),
72 SkColorGetG(fColor), SkColorGetB(fColor));
73 if (rowBytes > 0)
74 SkDebugf("rowBytes=\"%d\" ", rowBytes);
75 const char* formatName;
76 switch (format) {
77 case 0: formatName = "none"; break;
78 case 1: formatName = "A1"; break;
79 case 2: formatName = "A8"; break;
80 case 3: formatName = "Index8"; break;
81 case 4: formatName = "RGB16"; break;
82 case 5: formatName = "RGB32"; break;
83 }
84 SkDebugf("format=\"%s\" />\n", formatName);
85 }
86 #endif
87
onEndElement(SkAnimateMaker & maker)88 void SkDrawBitmap::onEndElement(SkAnimateMaker& maker) {
89 SkASSERT(format != (SkBitmap::Config) -1);
90 SkASSERT(width != -1);
91 SkASSERT(height != -1);
92 SkASSERT(rowBytes >= 0);
93 fBitmap.setConfig((SkBitmap::Config) format, width, height, rowBytes);
94 fBitmap.allocPixels();
95 if (fColorSet)
96 fBitmap.eraseColor(fColor);
97 }
98
setProperty(int index,SkScriptValue & value)99 bool SkDrawBitmap::setProperty(int index, SkScriptValue& value)
100 {
101 switch (index) {
102 case SK_PROPERTY(erase):
103 SkASSERT(value.fType == SkType_ARGB);
104 fColor = value.fOperand.fS32;
105 fColorSet = true;
106 break;
107 default:
108 SkASSERT(0);
109 return false;
110 }
111 return true;
112 }
113
114
115 enum SkImage_Properties {
116 SK_PROPERTY(height),
117 SK_PROPERTY(width)
118 };
119
120 #if SK_USE_CONDENSED_INFO == 0
121
122 const SkMemberInfo SkImage::fInfo[] = {
123 SK_MEMBER_INHERITED,
124 SK_MEMBER(base64, Base64),
125 SK_MEMBER_PROPERTY(height, Int),
126 SK_MEMBER(src, String),
127 SK_MEMBER_PROPERTY(width, Int)
128 };
129
130 #endif
131
132 DEFINE_GET_MEMBER(SkImage);
133
SkImage()134 SkImage::SkImage() : fDirty(true), fUriBase(NULL) {
135 base64.fData = NULL;
136 base64.fLength = 0;
137 }
138
~SkImage()139 SkImage::~SkImage() {
140 delete[] base64.fData;
141 }
142
deepCopy(SkAnimateMaker * maker)143 SkDisplayable* SkImage::deepCopy(SkAnimateMaker* maker) {
144 SkDisplayable* copy = INHERITED::deepCopy(maker);
145 ((SkImage*) copy)->fUriBase = ((SkImage*) this)->fUriBase;
146 return copy;
147 }
148
dirty()149 void SkImage::dirty() {
150 fDirty = true;
151 }
152
draw(SkAnimateMaker & maker)153 bool SkImage::draw(SkAnimateMaker& maker) {
154 if (fDirty)
155 resolve();
156 return INHERITED::draw(maker);
157 }
158
getProperty(int index,SkScriptValue * value) const159 bool SkImage::getProperty(int index, SkScriptValue* value) const {
160 if (fDirty)
161 resolve();
162 switch (index) {
163 case SK_PROPERTY(height):
164 value->fOperand.fS32 = fBitmap.height();
165 break;
166 case SK_PROPERTY(width):
167 value->fOperand.fS32 = fBitmap.width();
168 break;
169 default:
170 SkASSERT(0);
171 return false;
172 }
173 value->fType = SkType_Int;
174 return true;
175 }
176
onEndElement(SkAnimateMaker & maker)177 void SkImage::onEndElement(SkAnimateMaker& maker) {
178 fUriBase = maker.fPrefix.c_str();
179 }
180
resolve()181 void SkImage::resolve() {
182 fDirty = false;
183 if (base64.fData) {
184 fBitmap.reset();
185 SkImageDecoder::DecodeMemory(base64.fData, base64.fLength, &fBitmap);
186 } else if (src.size()) {
187 if (fLast.equals(src))
188 return;
189 fLast.set(src);
190 fBitmap.reset();
191
192 //SkStream* stream = SkStream::GetURIStream(fUriBase, src.c_str());
193 SkStream* stream = new SkFILEStream(src.c_str());
194
195 SkAutoTDelete<SkStream> autoDel(stream);
196 SkImageDecoder::DecodeStream(stream, &fBitmap);
197 }
198 }
199