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