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