1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkDrawBitmap.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,196 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkDrawBitmap.h" 1.14 +#include "SkAnimateMaker.h" 1.15 +#include "SkCanvas.h" 1.16 +#include "SkImageDecoder.h" 1.17 +#include "SkPaint.h" 1.18 +#include "SkStream.h" 1.19 + 1.20 +#if SK_USE_CONDENSED_INFO == 0 1.21 + 1.22 +const SkMemberInfo SkBaseBitmap::fInfo[] = { 1.23 + SK_MEMBER(x, Float), 1.24 + SK_MEMBER(y, Float) 1.25 +}; 1.26 + 1.27 +#endif 1.28 + 1.29 +DEFINE_GET_MEMBER(SkBaseBitmap); 1.30 + 1.31 +SkBaseBitmap::SkBaseBitmap() : x(0), y(0) { 1.32 +} 1.33 + 1.34 +SkBaseBitmap::~SkBaseBitmap() { 1.35 +} 1.36 + 1.37 +bool SkBaseBitmap::draw(SkAnimateMaker& maker) { 1.38 + SkBoundableAuto boundable(this, maker); 1.39 + maker.fCanvas->drawBitmap(fBitmap, x, y, maker.fPaint); 1.40 + return false; 1.41 +} 1.42 + 1.43 +enum SkDrawBitmap_Properties { 1.44 + SK_PROPERTY(erase) 1.45 +}; 1.46 + 1.47 +#if SK_USE_CONDENSED_INFO == 0 1.48 + 1.49 +const SkMemberInfo SkDrawBitmap::fInfo[] = { 1.50 + SK_MEMBER_INHERITED, 1.51 + SK_MEMBER_PROPERTY(erase, ARGB), 1.52 + SK_MEMBER(format, BitmapFormat), 1.53 + SK_MEMBER(height, Int), 1.54 + SK_MEMBER(rowBytes, Int), 1.55 + SK_MEMBER(width, Int), 1.56 +}; 1.57 + 1.58 +#endif 1.59 + 1.60 +DEFINE_GET_MEMBER(SkDrawBitmap); 1.61 + 1.62 +SkDrawBitmap::SkDrawBitmap() : format((SkBitmap::Config) -1), height(-1), 1.63 + rowBytes(0), width(-1), fColor(0), fColorSet(false) { 1.64 +} 1.65 + 1.66 +SkDrawBitmap::~SkDrawBitmap() { 1.67 +} 1.68 + 1.69 +#ifdef SK_DUMP_ENABLED 1.70 +void SkDrawBitmap::dump(SkAnimateMaker* maker) { 1.71 + dumpBase(maker); 1.72 + dumpAttrs(maker); 1.73 + if (fColorSet) 1.74 + SkDebugf("erase=\"argb(%d,%d,%d,%d)\" ", SkColorGetA(fColor)/255, SkColorGetR(fColor), 1.75 + SkColorGetG(fColor), SkColorGetB(fColor)); 1.76 + if (rowBytes > 0) 1.77 + SkDebugf("rowBytes=\"%d\" ", rowBytes); 1.78 + const char* formatName; 1.79 + switch (format) { 1.80 + case 0: formatName = "none"; break; 1.81 + case 1: formatName = "A8"; break; 1.82 + case 2: formatName = "Index8"; break; 1.83 + case 3: formatName = "RGB16"; break; 1.84 + case 4: formatName = "RGB32"; break; 1.85 + } 1.86 + SkDebugf("format=\"%s\" />\n", formatName); 1.87 +} 1.88 +#endif 1.89 + 1.90 +void SkDrawBitmap::onEndElement(SkAnimateMaker&) { 1.91 + SkASSERT(width != -1); 1.92 + SkASSERT(height != -1); 1.93 + SkASSERT(rowBytes >= 0); 1.94 + fBitmap.setConfig((SkBitmap::Config) format, width, height, rowBytes); 1.95 + fBitmap.allocPixels(); 1.96 + if (fColorSet) 1.97 + fBitmap.eraseColor(fColor); 1.98 +} 1.99 + 1.100 +bool SkDrawBitmap::setProperty(int index, SkScriptValue& value) 1.101 +{ 1.102 + switch (index) { 1.103 + case SK_PROPERTY(erase): 1.104 + SkASSERT(value.fType == SkType_ARGB); 1.105 + fColor = value.fOperand.fS32; 1.106 + fColorSet = true; 1.107 + break; 1.108 + default: 1.109 + SkASSERT(0); 1.110 + return false; 1.111 + } 1.112 + return true; 1.113 +} 1.114 + 1.115 + 1.116 +enum SkImageBaseBitmap_Properties { 1.117 + SK_PROPERTY(height), 1.118 + SK_PROPERTY(width) 1.119 +}; 1.120 + 1.121 +#if SK_USE_CONDENSED_INFO == 0 1.122 + 1.123 +const SkMemberInfo SkImageBaseBitmap::fInfo[] = { 1.124 + SK_MEMBER_INHERITED, 1.125 + SK_MEMBER(base64, Base64), 1.126 + SK_MEMBER_PROPERTY(height, Int), 1.127 + SK_MEMBER(src, String), 1.128 + SK_MEMBER_PROPERTY(width, Int) 1.129 +}; 1.130 + 1.131 +#endif 1.132 + 1.133 +DEFINE_GET_MEMBER(SkImageBaseBitmap); 1.134 + 1.135 +SkImageBaseBitmap::SkImageBaseBitmap() : fDirty(true), fUriBase(NULL) { 1.136 + base64.fData = NULL; 1.137 + base64.fLength = 0; 1.138 +} 1.139 + 1.140 +SkImageBaseBitmap::~SkImageBaseBitmap() { 1.141 + delete[] base64.fData; 1.142 +} 1.143 + 1.144 +SkDisplayable* SkImageBaseBitmap::deepCopy(SkAnimateMaker* maker) { 1.145 + SkDisplayable* copy = INHERITED::deepCopy(maker); 1.146 + ((SkImageBaseBitmap*) copy)->fUriBase = ((SkImageBaseBitmap*) this)->fUriBase; 1.147 + return copy; 1.148 +} 1.149 + 1.150 +void SkImageBaseBitmap::dirty() { 1.151 + fDirty = true; 1.152 +} 1.153 + 1.154 +bool SkImageBaseBitmap::draw(SkAnimateMaker& maker) { 1.155 + if (fDirty) 1.156 + resolve(); 1.157 + return INHERITED::draw(maker); 1.158 +} 1.159 + 1.160 +bool SkImageBaseBitmap::getProperty(int index, SkScriptValue* value) const { 1.161 + if (fDirty) 1.162 + resolve(); 1.163 + switch (index) { 1.164 + case SK_PROPERTY(height): 1.165 + value->fOperand.fS32 = fBitmap.height(); 1.166 + break; 1.167 + case SK_PROPERTY(width): 1.168 + value->fOperand.fS32 = fBitmap.width(); 1.169 + break; 1.170 + default: 1.171 + SkASSERT(0); 1.172 + return false; 1.173 + } 1.174 + value->fType = SkType_Int; 1.175 + return true; 1.176 +} 1.177 + 1.178 +void SkImageBaseBitmap::onEndElement(SkAnimateMaker& maker) { 1.179 + fUriBase = maker.fPrefix.c_str(); 1.180 +} 1.181 + 1.182 +void SkImageBaseBitmap::resolve() { 1.183 + fDirty = false; 1.184 + if (base64.fData) { 1.185 + fBitmap.reset(); 1.186 + SkImageDecoder::DecodeMemory(base64.fData, base64.fLength, &fBitmap); 1.187 + } else if (src.size()) { 1.188 + if (fLast.equals(src)) 1.189 + return; 1.190 + fLast.set(src); 1.191 + fBitmap.reset(); 1.192 + 1.193 + //SkStream* stream = SkStream::GetURIStream(fUriBase, src.c_str()); 1.194 + SkAutoTUnref<SkStreamAsset> stream(SkStream::NewFromFile(src.c_str())); 1.195 + if (stream.get()) { 1.196 + SkImageDecoder::DecodeStream(stream, &fBitmap); 1.197 + } 1.198 + } 1.199 +}