15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef Uint8ClampedArray_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define Uint8ClampedArray_h 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Uint8Array.h" 32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/MathExtras.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF { 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass Uint8ClampedArray final : public Uint8Array { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static inline PassRefPtr<Uint8ClampedArray> create(unsigned length); 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static inline PassRefPtr<Uint8ClampedArray> create(const unsigned char* array, unsigned length); 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static inline PassRefPtr<Uint8ClampedArray> create(PassRefPtr<ArrayBuffer>, unsigned byteOffset, unsigned length); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Should only be used when it is known the entire array will be filled. Do 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not return these results directly to JavaScript without filling first. 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static inline PassRefPtr<Uint8ClampedArray> createUninitialized(unsigned length); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It's only needed to potentially call this method if the array 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // was created uninitialized -- the default initialization paths 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // zero the allocated memory. 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inline void zeroFill(); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) using TypedArrayBase<unsigned char>::set; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inline void set(unsigned index, double value); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inline PassRefPtr<Uint8ClampedArray> subarray(int start) const; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inline PassRefPtr<Uint8ClampedArray> subarray(int start, int end) const; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual ViewType type() const override 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return TypeUint8Clamped; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inline Uint8ClampedArray(PassRefPtr<ArrayBuffer>, 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned byteOffset, 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned length); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make constructor visible to superclass. 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class TypedArrayBase<unsigned char>; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Uint8ClampedArray> Uint8ClampedArray::create(unsigned length) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return TypedArrayBase<unsigned char>::create<Uint8ClampedArray>(length); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Uint8ClampedArray> Uint8ClampedArray::create(const unsigned char* array, unsigned length) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return TypedArrayBase<unsigned char>::create<Uint8ClampedArray>(array, length); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Uint8ClampedArray> Uint8ClampedArray::create(PassRefPtr<ArrayBuffer> buffer, unsigned byteOffset, unsigned length) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return TypedArrayBase<unsigned char>::create<Uint8ClampedArray>(buffer, byteOffset, length); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Uint8ClampedArray> Uint8ClampedArray::createUninitialized(unsigned length) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return TypedArrayBase<unsigned char>::createUninitialized<Uint8ClampedArray>(length); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Uint8ClampedArray::zeroFill() 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) zeroRange(0, length()); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Uint8ClampedArray::set(unsigned index, double value) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (index >= m_length) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (std::isnan(value) || value < 0) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value = 0; 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (value > 255) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value = 255; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) data()[index] = static_cast<unsigned char>(lrint(value)); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Uint8ClampedArray::Uint8ClampedArray(PassRefPtr<ArrayBuffer> buffer, unsigned byteOffset, unsigned length) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles): Uint8Array(buffer, byteOffset, length) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Uint8ClampedArray> Uint8ClampedArray::subarray(int start) const 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return subarray(start, length()); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Uint8ClampedArray> Uint8ClampedArray::subarray(int start, int end) const 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return subarrayImpl<Uint8ClampedArray>(start, end); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WTF 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::Uint8ClampedArray; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // Uint8ClampedArray_h 126