/* * Copyright 2006 The Android Open Source Project * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkTypedArray.h" SkTypedArray::SkTypedArray() : fType(SkType_Unknown) { } SkTypedArray::SkTypedArray(SkDisplayTypes type) : fType(type) { } bool SkTypedArray::getIndex(int index, SkOperand* operand) { if (index >= count()) { SkASSERT(0); return false; } *operand = begin()[index]; return true; } #if SK_SMALLER_ARRAY_TEMPLATE_EXPERIMENT == 1 SkDS32Array::SkDS32Array() { fReserve = fCount = 0; fArray = NULL; #ifdef SK_DEBUG fData = NULL; #endif } SkDS32Array::SkDS32Array(const SkDS32Array& src) { fReserve = fCount = 0; fArray = NULL; #ifdef SK_DEBUG fData = NULL; #endif SkDS32Array tmp(src.fArray, src.fCount); this->swap(tmp); } SkDS32Array::SkDS32Array(const int32_t src[], U16CPU count) { SkASSERT(src || count == 0); fReserve = fCount = 0; fArray = NULL; #ifdef SK_DEBUG fData = NULL; #endif if (count) { fArray = (int32_t*)sk_malloc_throw(count * sizeof(int32_t)); #ifdef SK_DEBUG fData = (int32_t (*)[kDebugArraySize]) fArray; #endif memcpy(fArray, src, sizeof(int32_t) * count); fReserve = fCount = SkToU16(count); } } SkDS32Array& SkDS32Array::operator=(const SkDS32Array& src) { if (this != &src) { if (src.fCount > fReserve) { SkDS32Array tmp(src.fArray, src.fCount); this->swap(tmp); } else { memcpy(fArray, src.fArray, sizeof(int32_t) * src.fCount); fCount = src.fCount; } } return *this; } int operator==(const SkDS32Array& a, const SkDS32Array& b) { return a.fCount == b.fCount && (a.fCount == 0 || !memcmp(a.fArray, b.fArray, a.fCount * sizeof(int32_t))); } void SkDS32Array::swap(SkDS32Array& other) { SkTSwap(fArray, other.fArray); #ifdef SK_DEBUG SkTSwap(fData, other.fData); #endif SkTSwap(fReserve, other.fReserve); SkTSwap(fCount, other.fCount); } int32_t* SkDS32Array::append(U16CPU count, const int32_t* src) { unsigned oldCount = fCount; if (count) { SkASSERT(src == NULL || fArray == NULL || src + count <= fArray || fArray + count <= src); this->growBy(count); if (src) memcpy(fArray + oldCount, src, sizeof(int32_t) * count); } return fArray + oldCount; } int SkDS32Array::find(const int32_t& elem) const { const int32_t* iter = fArray; const int32_t* stop = fArray + fCount; for (; iter < stop; iter++) { if (*iter == elem) return (int) (iter - fArray); } return -1; } void SkDS32Array::growBy(U16CPU extra) { SkASSERT(extra); SkASSERT(fCount + extra <= 0xFFFF); if (fCount + extra > fReserve) { size_t size = fCount + extra + 4; size += size >> 2; int32_t* array = (int32_t*)sk_malloc_throw(size * sizeof(int32_t)); memcpy(array, fArray, fCount * sizeof(int32_t)); sk_free(fArray); fArray = array; #ifdef SK_DEBUG fData = (int32_t (*)[kDebugArraySize]) fArray; #endif fReserve = SkToU16((U16CPU)size); } fCount = SkToU16(fCount + extra); } int32_t* SkDS32Array::insert(U16CPU index, U16CPU count, const int32_t* src) { SkASSERT(count); int oldCount = fCount; this->growBy(count); int32_t* dst = fArray + index; memmove(dst + count, dst, sizeof(int32_t) * (oldCount - index)); if (src) memcpy(dst, src, sizeof(int32_t) * count); return dst; } int SkDS32Array::rfind(const int32_t& elem) const { const int32_t* iter = fArray + fCount; const int32_t* stop = fArray; while (iter > stop) { if (*--iter == elem) return (int) (iter - stop); } return -1; } #endif