SkTypedArray.cpp revision 0910916c0f7b951ee55c4b7c6358295b9bca0565
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* libs/graphics/animator/SkTypedArray.cpp 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Copyright 2006, The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** you may not use this file except in compliance with the License. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** You may obtain a copy of the License at 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** See the License for the specific language governing permissions and 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** limitations under the License. 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypedArray.h" 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkTypedArray::SkTypedArray() : fType(SkType_Unknown) { 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkTypedArray::SkTypedArray(SkDisplayTypes type) : fType(type) { 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkTypedArray::getIndex(int index, SkOperand* operand) { 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (index >= count()) { 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *operand = begin()[index]; 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_SMALLER_ARRAY_TEMPLATE_EXPERIMENT == 1 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDS32Array::SkDS32Array() 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = fCount = 0; 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = NULL; 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = NULL; 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDS32Array::SkDS32Array(const SkDS32Array& src) 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = fCount = 0; 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = NULL; 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = NULL; 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDS32Array tmp(src.fArray, src.fCount); 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->swap(tmp); 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDS32Array::SkDS32Array(const int32_t src[], U16CPU count) 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(src || count == 0); 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = fCount = 0; 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = NULL; 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = NULL; 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (count) 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = (int32_t*)sk_malloc_throw(count * sizeof(int32_t)); 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = (int32_t (*)[kDebugArraySize]) fArray; 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(fArray, src, sizeof(int32_t) * count); 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = fCount = SkToU16(count); 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDS32Array& SkDS32Array::operator=(const SkDS32Array& src) 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this != &src) 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (src.fCount > fReserve) 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDS32Array tmp(src.fArray, src.fCount); 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->swap(tmp); 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(fArray, src.fArray, sizeof(int32_t) * src.fCount); 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCount = src.fCount; 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return *this; 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint operator==(const SkDS32Array& a, const SkDS32Array& b) 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fCount == b.fCount && 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (a.fCount == 0 || !memcmp(a.fArray, b.fArray, a.fCount * sizeof(int32_t))); 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDS32Array::swap(SkDS32Array& other) 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTSwap(fArray, other.fArray); 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTSwap(fData, other.fData); 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTSwap(fReserve, other.fReserve); 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTSwap(fCount, other.fCount); 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t* SkDS32Array::append(U16CPU count, const int32_t* src) 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned oldCount = fCount; 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (count) 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(src == NULL || fArray == NULL || 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project src + count <= fArray || fArray + count <= src); 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->growBy(count); 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (src) 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(fArray + oldCount, src, sizeof(int32_t) * count); 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fArray + oldCount; 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkDS32Array::find(const int32_t& elem) const 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const int32_t* iter = fArray; 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const int32_t* stop = fArray + fCount; 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (; iter < stop; iter++) 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (*iter == elem) 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (int) (iter - fArray); 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return -1; 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDS32Array::growBy(U16CPU extra) 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(extra); 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(fCount + extra <= 0xFFFF); 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fCount + extra > fReserve) 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t size = fCount + extra + 4; 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size += size >> 2; 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t* array = (int32_t*)sk_malloc_throw(size * sizeof(int32_t)); 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(array, fArray, fCount * sizeof(int32_t)); 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_free(fArray); 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = array; 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = (int32_t (*)[kDebugArraySize]) fArray; 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = SkToU16((U16CPU)size); 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCount = SkToU16(fCount + extra); 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t* SkDS32Array::insert(U16CPU index, U16CPU count, const int32_t* src) 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(count); 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int oldCount = fCount; 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->growBy(count); 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t* dst = fArray + index; 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memmove(dst + count, dst, sizeof(int32_t) * (oldCount - index)); 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (src) 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(dst, src, sizeof(int32_t) * count); 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return dst; 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int SkDS32Array::rfind(const int32_t& elem) const 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const int32_t* iter = fArray + fCount; 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const int32_t* stop = fArray; 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (iter > stop) 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (*--iter == elem) 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (int) (iter - stop); 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return -1; 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 188