11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawBitmap.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateMaker.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkImageDecoder.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkStream.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkBaseBitmap::fInfo[] = {
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(x, Float),
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(y, Float)
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkBaseBitmap);
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBaseBitmap::SkBaseBitmap() : x(0), y(0) {
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBaseBitmap::~SkBaseBitmap() {
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkBaseBitmap::draw(SkAnimateMaker& maker) {
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBoundableAuto boundable(this, maker);
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    maker.fCanvas->drawBitmap(fBitmap, x, y, maker.fPaint);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectenum SkDrawBitmap_Properties {
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(erase)
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDrawBitmap::fInfo[] = {
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_INHERITED,
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(erase, ARGB),
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(format, BitmapFormat),
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(height, Int),
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(rowBytes, Int),
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(width, Int),
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDrawBitmap);
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawBitmap::SkDrawBitmap() : format((SkBitmap::Config) -1), height(-1),
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    rowBytes(0),    width(-1), fColor(0), fColorSet(false) {
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawBitmap::~SkDrawBitmap() {
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawBitmap::dump(SkAnimateMaker* maker) {
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dumpBase(maker);
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dumpAttrs(maker);
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fColorSet)
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("erase=\"argb(%d,%d,%d,%d)\" ", SkColorGetA(fColor)/255, SkColorGetR(fColor),
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkColorGetG(fColor), SkColorGetB(fColor));
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (rowBytes > 0)
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("rowBytes=\"%d\" ", rowBytes);
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* formatName;
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (format) {
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case 0: formatName = "none"; break;
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case 1: formatName = "A1"; break;
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case 2: formatName = "A8"; break;
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case 3: formatName = "Index8"; break;
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case 4: formatName = "RGB16"; break;
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case 5: formatName = "RGB32"; break;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("format=\"%s\" />\n", formatName);
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawBitmap::onEndElement(SkAnimateMaker& maker) {
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(format != (SkBitmap::Config) -1);
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(width != -1);
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(height != -1);
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(rowBytes >= 0);
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fBitmap.setConfig((SkBitmap::Config) format, width, height, rowBytes);
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fBitmap.allocPixels();
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fColorSet)
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fBitmap.eraseColor(fColor);
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawBitmap::setProperty(int index, SkScriptValue& value)
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (index) {
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(erase):
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(value.fType == SkType_ARGB);
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fColor = value.fOperand.fS32;
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fColorSet = true;
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(0);
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectenum SkImage_Properties {
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(height),
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(width)
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkImage::fInfo[] = {
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_INHERITED,
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(base64, Base64),
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(height, Int),
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(src, String),
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(width, Int)
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkImage);
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkImage::SkImage() : fDirty(true), fUriBase(NULL) {
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    base64.fData = NULL;
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    base64.fLength = 0;
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkImage::~SkImage() {
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    delete[] base64.fData;
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable* SkImage::deepCopy(SkAnimateMaker* maker) {
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayable* copy = INHERITED::deepCopy(maker);
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ((SkImage*) copy)->fUriBase = ((SkImage*) this)->fUriBase;
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return copy;
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkImage::dirty() {
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty = true;
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkImage::draw(SkAnimateMaker& maker) {
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fDirty)
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        resolve();
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return INHERITED::draw(maker);
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkImage::getProperty(int index, SkScriptValue* value) const {
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fDirty)
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        resolve();
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (index) {
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(height):
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fS32 = fBitmap.height();
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(width):
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fS32 = fBitmap.width();
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    default:
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    value->fType = SkType_Int;
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkImage::onEndElement(SkAnimateMaker& maker) {
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fUriBase = maker.fPrefix.c_str();
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkImage::resolve() {
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty = false;
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (base64.fData) {
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fBitmap.reset();
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkImageDecoder::DecodeMemory(base64.fData, base64.fLength, &fBitmap);
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else if (src.size()) {
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fLast.equals(src))
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return;
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fLast.set(src);
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fBitmap.reset();
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //SkStream* stream = SkStream::GetURIStream(fUriBase, src.c_str());
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkStream* stream = new SkFILEStream(src.c_str());
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkAutoTDelete<SkStream> autoDel(stream);
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkImageDecoder::DecodeStream(stream, &fBitmap);
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
199