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 "SkTypedArray.h" 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkTypedArray::SkTypedArray() : fType(SkType_Unknown) { 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkTypedArray::SkTypedArray(SkDisplayTypes type) : fType(type) { 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkTypedArray::getIndex(int index, SkOperand* operand) { 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (index >= count()) { 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *operand = begin()[index]; 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_SMALLER_ARRAY_TEMPLATE_EXPERIMENT == 1 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDS32Array::SkDS32Array() 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = fCount = 0; 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = NULL; 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = NULL; 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDS32Array::SkDS32Array(const SkDS32Array& src) 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = fCount = 0; 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = NULL; 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = NULL; 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDS32Array tmp(src.fArray, src.fCount); 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->swap(tmp); 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDS32Array::SkDS32Array(const int32_t src[], U16CPU count) 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(src || count == 0); 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = fCount = 0; 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = NULL; 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = NULL; 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (count) 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = (int32_t*)sk_malloc_throw(count * sizeof(int32_t)); 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = (int32_t (*)[kDebugArraySize]) fArray; 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(fArray, src, sizeof(int32_t) * count); 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = fCount = SkToU16(count); 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDS32Array& SkDS32Array::operator=(const SkDS32Array& src) 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this != &src) 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (src.fCount > fReserve) 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDS32Array tmp(src.fArray, src.fCount); 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->swap(tmp); 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(fArray, src.fArray, sizeof(int32_t) * src.fCount); 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCount = src.fCount; 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return *this; 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint operator==(const SkDS32Array& a, const SkDS32Array& b) 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return a.fCount == b.fCount && 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (a.fCount == 0 || !memcmp(a.fArray, b.fArray, a.fCount * sizeof(int32_t))); 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDS32Array::swap(SkDS32Array& other) 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTSwap(fArray, other.fArray); 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTSwap(fData, other.fData); 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTSwap(fReserve, other.fReserve); 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTSwap(fCount, other.fCount); 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t* SkDS32Array::append(U16CPU count, const int32_t* src) 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned oldCount = fCount; 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (count) 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(src == NULL || fArray == NULL || 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project src + count <= fArray || fArray + count <= src); 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->growBy(count); 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (src) 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(fArray + oldCount, src, sizeof(int32_t) * count); 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fArray + oldCount; 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkDS32Array::find(const int32_t& elem) const 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const int32_t* iter = fArray; 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const int32_t* stop = fArray + fCount; 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (; iter < stop; iter++) 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (*iter == elem) 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (int) (iter - fArray); 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return -1; 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDS32Array::growBy(U16CPU extra) 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(extra); 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(fCount + extra <= 0xFFFF); 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fCount + extra > fReserve) 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t size = fCount + extra + 4; 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size += size >> 2; 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t* array = (int32_t*)sk_malloc_throw(size * sizeof(int32_t)); 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(array, fArray, fCount * sizeof(int32_t)); 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_free(fArray); 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fArray = array; 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fData = (int32_t (*)[kDebugArraySize]) fArray; 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fReserve = SkToU16((U16CPU)size); 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCount = SkToU16(fCount + extra); 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t* SkDS32Array::insert(U16CPU index, U16CPU count, const int32_t* src) 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(count); 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int oldCount = fCount; 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->growBy(count); 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t* dst = fArray + index; 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memmove(dst + count, dst, sizeof(int32_t) * (oldCount - index)); 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (src) 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(dst, src, sizeof(int32_t) * count); 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return dst; 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int SkDS32Array::rfind(const int32_t& elem) const 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const int32_t* iter = fArray + fCount; 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const int32_t* stop = fArray; 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (iter > stop) 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (*--iter == elem) 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (int) (iter - stop); 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return -1; 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 180