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