Home | History | Annotate | Download | only in canvas
      1 /*
      2  * Copyright (C) 2010 Apple Inc. All rights reserved.
      3  * Copyright (c) 2010, Google Inc. All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #ifndef TypedArrayBase_h
     28 #define TypedArrayBase_h
     29 
     30 #include "ArrayBuffer.h"
     31 #include "ArrayBufferView.h"
     32 
     33 namespace WebCore {
     34 
     35 template <typename T>
     36 class TypedArrayBase : public ArrayBufferView {
     37   public:
     38     T* data() const { return static_cast<T*>(baseAddress()); }
     39 
     40     void set(TypedArrayBase<T>* array, unsigned offset, ExceptionCode& ec)
     41     {
     42         setImpl(array, offset * sizeof(T), ec);
     43     }
     44 
     45     void setRange(const T* data, size_t dataLength, unsigned offset, ExceptionCode& ec)
     46     {
     47         setRangeImpl(reinterpret_cast<const char*>(data), dataLength * sizeof(T), offset * sizeof(T), ec);
     48     }
     49 
     50     void zeroRange(unsigned offset, size_t length, ExceptionCode& ec)
     51     {
     52         zeroRangeImpl(offset * sizeof(T), length * sizeof(T), ec);
     53     }
     54 
     55     // Overridden from ArrayBufferView. This must be public because of
     56     // rules about inheritance of members in template classes, and
     57     // because it is accessed via pointers to subclasses.
     58     unsigned length() const
     59     {
     60         return m_length;
     61     }
     62 
     63     virtual unsigned byteLength() const
     64     {
     65         return m_length * sizeof(T);
     66     }
     67 
     68 protected:
     69     TypedArrayBase(PassRefPtr<ArrayBuffer> buffer, unsigned byteOffset, unsigned length)
     70         : ArrayBufferView(buffer, byteOffset)
     71         , m_length(length)
     72     {
     73     }
     74 
     75     template <class Subclass>
     76     static PassRefPtr<Subclass> create(unsigned length)
     77     {
     78         RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(length, sizeof(T));
     79         if (!buffer.get())
     80             return 0;
     81         return create<Subclass>(buffer, 0, length);
     82     }
     83 
     84     template <class Subclass>
     85     static PassRefPtr<Subclass> create(const T* array, unsigned length)
     86     {
     87         RefPtr<Subclass> a = create<Subclass>(length);
     88         if (a)
     89             for (unsigned i = 0; i < length; ++i)
     90                 a->set(i, array[i]);
     91         return a;
     92     }
     93 
     94     template <class Subclass>
     95     static PassRefPtr<Subclass> create(PassRefPtr<ArrayBuffer> buffer,
     96                                        unsigned byteOffset,
     97                                        unsigned length)
     98     {
     99         RefPtr<ArrayBuffer> buf(buffer);
    100         if (!verifySubRange<T>(buf, byteOffset, length))
    101             return 0;
    102 
    103         return adoptRef(new Subclass(buf, byteOffset, length));
    104     }
    105 
    106     template <class Subclass>
    107     PassRefPtr<Subclass> subarrayImpl(int start, int end) const
    108     {
    109         unsigned offset, length;
    110         calculateOffsetAndLength(start, end, m_length, &offset, &length);
    111         clampOffsetAndNumElements<T>(buffer(), m_byteOffset, &offset, &length);
    112         return create<Subclass>(buffer(), offset, length);
    113     }
    114 
    115     // We do not want to have to access this via a virtual function in subclasses,
    116     // which is why it is protected rather than private.
    117     unsigned m_length;
    118 };
    119 
    120 } // namespace WebCore
    121 
    122 #endif // TypedArrayBase_h
    123