1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/* 3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2006 The Android Open Source Project 4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file. 7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkTypedArray.h" 11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 12f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkTypedArray::SkTypedArray() : fType(SkType_Unknown) { 13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 15f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkTypedArray::SkTypedArray(SkDisplayTypes type) : fType(type) { 16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkTypedArray::getIndex(int index, SkOperand* operand) { 19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (index >= count()) { 20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(0); 21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return false; 22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *operand = begin()[index]; 24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return true; 25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if SK_SMALLER_ARRAY_TEMPLATE_EXPERIMENT == 1 29f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkDS32Array::SkDS32Array() 30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = 0; 32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = NULL; 33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = NULL; 35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 38f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkDS32Array::SkDS32Array(const SkDS32Array& src) 39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = 0; 41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = NULL; 42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = NULL; 44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkDS32Array tmp(src.fArray, src.fCount); 46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->swap(tmp); 47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 49f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkDS32Array::SkDS32Array(const int32_t src[], U16CPU count) 50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(src || count == 0); 52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = 0; 54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = NULL; 55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = NULL; 57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (count) 59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = (int32_t*)sk_malloc_throw(count * sizeof(int32_t)); 61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = (int32_t (*)[kDebugArraySize]) fArray; 63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(fArray, src, sizeof(int32_t) * count); 65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = SkToU16(count); 66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 69f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkDS32Array& SkDS32Array::operator=(const SkDS32Array& src) 70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (this != &src) 72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (src.fCount > fReserve) 74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkDS32Array tmp(src.fArray, src.fCount); 76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->swap(tmp); 77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger else 79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(fArray, src.fArray, sizeof(int32_t) * src.fCount); 81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount = src.fCount; 82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return *this; 85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerint operator==(const SkDS32Array& a, const SkDS32Array& b) 88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return a.fCount == b.fCount && 90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger (a.fCount == 0 || !memcmp(a.fArray, b.fArray, a.fCount * sizeof(int32_t))); 91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkDS32Array::swap(SkDS32Array& other) 94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTSwap(fArray, other.fArray); 96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTSwap(fData, other.fData); 98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTSwap(fReserve, other.fReserve); 100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTSwap(fCount, other.fCount); 101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerint32_t* SkDS32Array::append(U16CPU count, const int32_t* src) 104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger unsigned oldCount = fCount; 106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (count) 107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(src == NULL || fArray == NULL || 109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger src + count <= fArray || fArray + count <= src); 110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->growBy(count); 112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (src) 113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(fArray + oldCount, src, sizeof(int32_t) * count); 114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return fArray + oldCount; 116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerint SkDS32Array::find(const int32_t& elem) const 119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const int32_t* iter = fArray; 121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const int32_t* stop = fArray + fCount; 122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger for (; iter < stop; iter++) 124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (*iter == elem) 126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return (int) (iter - fArray); 127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return -1; 129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkDS32Array::growBy(U16CPU extra) 132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 133f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(extra); 134f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(fCount + extra <= 0xFFFF); 135f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 136f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fCount + extra > fReserve) 137f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 138f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t size = fCount + extra + 4; 139f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size += size >> 2; 140f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int32_t* array = (int32_t*)sk_malloc_throw(size * sizeof(int32_t)); 141f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(array, fArray, fCount * sizeof(int32_t)); 142f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 143f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger sk_free(fArray); 144f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = array; 145f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 146f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = (int32_t (*)[kDebugArraySize]) fArray; 147f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 148f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = SkToU16((U16CPU)size); 149f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 150f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount = SkToU16(fCount + extra); 151f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 152f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 153f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerint32_t* SkDS32Array::insert(U16CPU index, U16CPU count, const int32_t* src) 154f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 155f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(count); 156f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int oldCount = fCount; 157f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->growBy(count); 158f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int32_t* dst = fArray + index; 159f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memmove(dst + count, dst, sizeof(int32_t) * (oldCount - index)); 160f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (src) 161f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(dst, src, sizeof(int32_t) * count); 162f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return dst; 163f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 164f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 165f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 166f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int SkDS32Array::rfind(const int32_t& elem) const 167f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 168f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const int32_t* iter = fArray + fCount; 169f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const int32_t* stop = fArray; 170f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 171f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger while (iter > stop) 172f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 173f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (*--iter == elem) 174f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return (int) (iter - stop); 175f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 176f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return -1; 177f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 178f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 179f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 180