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