• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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