gfx/skia/trunk/src/animator/SkDrawBitmap.cpp

changeset 0
6474c204b198
     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 +}

mercurial