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