SkDrawBitmap.cpp revision 1cab2921ab279367f8206cdadc9259d12e603548
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
19const SkMemberInfo SkBaseBitmap::fInfo[] = {
20    SK_MEMBER(x, Float),
21    SK_MEMBER(y, Float)
22};
23
24#endif
25
26DEFINE_GET_MEMBER(SkBaseBitmap);
27
28SkBaseBitmap::SkBaseBitmap() : x(0), y(0) {
29}
30
31SkBaseBitmap::~SkBaseBitmap() {
32}
33
34bool SkBaseBitmap::draw(SkAnimateMaker& maker) {
35    SkBoundableAuto boundable(this, maker);
36    maker.fCanvas->drawBitmap(fBitmap, x, y, maker.fPaint);
37    return false;
38}
39
40enum SkDrawBitmap_Properties {
41    SK_PROPERTY(erase)
42};
43
44#if SK_USE_CONDENSED_INFO == 0
45
46const 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
57DEFINE_GET_MEMBER(SkDrawBitmap);
58
59SkDrawBitmap::SkDrawBitmap() : format((SkBitmap::Config) -1), height(-1),
60    rowBytes(0),    width(-1), fColor(0), fColorSet(false) {
61}
62
63SkDrawBitmap::~SkDrawBitmap() {
64}
65
66#ifdef SK_DUMP_ENABLED
67void 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
88void 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
99bool 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
115enum SkImage_Properties {
116    SK_PROPERTY(height),
117    SK_PROPERTY(width)
118};
119
120#if SK_USE_CONDENSED_INFO == 0
121
122const 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
132DEFINE_GET_MEMBER(SkImage);
133
134SkImage::SkImage() : fDirty(true), fUriBase(NULL) {
135    base64.fData = NULL;
136    base64.fLength = 0;
137}
138
139SkImage::~SkImage() {
140    delete[] base64.fData;
141}
142
143SkDisplayable* SkImage::deepCopy(SkAnimateMaker* maker) {
144    SkDisplayable* copy = INHERITED::deepCopy(maker);
145    ((SkImage*) copy)->fUriBase = ((SkImage*) this)->fUriBase;
146    return copy;
147}
148
149void SkImage::dirty() {
150    fDirty = true;
151}
152
153bool SkImage::draw(SkAnimateMaker& maker) {
154    if (fDirty)
155        resolve();
156    return INHERITED::draw(maker);
157}
158
159bool 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
177void SkImage::onEndElement(SkAnimateMaker& maker) {
178    fUriBase = maker.fPrefix.c_str();
179}
180
181void 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