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