| OLD | NEW |
| (Empty) |
| 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 | |
| 36 SkBaseBitmap::SkBaseBitmap() : x(0), y(0) { | |
| 37 } | |
| 38 | |
| 39 SkBaseBitmap::~SkBaseBitmap() { | |
| 40 } | |
| 41 | |
| 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 | |
| 67 SkDrawBitmap::SkDrawBitmap() : format((SkBitmap::Config) -1), height(-1), | |
| 68 rowBytes(0), width(-1), fColor(0), fColorSet(false) { | |
| 69 } | |
| 70 | |
| 71 SkDrawBitmap::~SkDrawBitmap() { | |
| 72 } | |
| 73 | |
| 74 #ifdef SK_DUMP_ENABLED | |
| 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, SkColo
rGetR(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 | |
| 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 | |
| 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 | |
| 142 SkImage::SkImage() : fDirty(true), fUriBase(NULL) { | |
| 143 base64.fData = NULL; | |
| 144 base64.fLength = 0; | |
| 145 } | |
| 146 | |
| 147 SkImage::~SkImage() { | |
| 148 delete[] base64.fData; | |
| 149 } | |
| 150 | |
| 151 SkDisplayable* SkImage::deepCopy(SkAnimateMaker* maker) { | |
| 152 SkDisplayable* copy = INHERITED::deepCopy(maker); | |
| 153 ((SkImage*) copy)->fUriBase = ((SkImage*) this)->fUriBase; | |
| 154 return copy; | |
| 155 } | |
| 156 | |
| 157 void SkImage::dirty() { | |
| 158 fDirty = true; | |
| 159 } | |
| 160 | |
| 161 bool SkImage::draw(SkAnimateMaker& maker) { | |
| 162 if (fDirty) | |
| 163 resolve(); | |
| 164 return INHERITED::draw(maker); | |
| 165 } | |
| 166 | |
| 167 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 | |
| 185 void SkImage::onEndElement(SkAnimateMaker& maker) { | |
| 186 fUriBase = maker.fPrefix.c_str(); | |
| 187 } | |
| 188 | |
| 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 } | |
| OLD | NEW |