diff options
Diffstat (limited to 'Source/WebCore/html/canvas/ArrayBuffer.cpp')
-rw-r--r-- | Source/WebCore/html/canvas/ArrayBuffer.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/Source/WebCore/html/canvas/ArrayBuffer.cpp b/Source/WebCore/html/canvas/ArrayBuffer.cpp index 4f75cc3..9c072ed 100644 --- a/Source/WebCore/html/canvas/ArrayBuffer.cpp +++ b/Source/WebCore/html/canvas/ArrayBuffer.cpp @@ -1,5 +1,7 @@ /* * Copyright (C) 2009 Apple Inc. All rights reserved. + * Copyright (C) 2012 Sony Ericsson Mobile Communications AB + * Copyright (C) 2012 Sony Mobile Communications AB * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,6 +32,16 @@ namespace WebCore { +static int clampValue(int x, int left, int right) +{ + ASSERT(left <= right); + if (x < left) + x = left; + if (right < x) + x = right; + return x; +} + PassRefPtr<ArrayBuffer> ArrayBuffer::create(unsigned numElements, unsigned elementByteSize) { void* data = tryAllocate(numElements, elementByteSize); @@ -43,7 +55,7 @@ PassRefPtr<ArrayBuffer> ArrayBuffer::create(ArrayBuffer* other) return ArrayBuffer::create(other->data(), other->byteLength()); } -PassRefPtr<ArrayBuffer> ArrayBuffer::create(void* source, unsigned byteLength) +PassRefPtr<ArrayBuffer> ArrayBuffer::create(const void* source, unsigned byteLength) { void* data = tryAllocate(byteLength, 1); if (!data) @@ -74,6 +86,30 @@ unsigned ArrayBuffer::byteLength() const return m_sizeInBytes; } +PassRefPtr<ArrayBuffer> ArrayBuffer::slice(int begin, int end) const +{ + return sliceImpl(clampIndex(begin), clampIndex(end)); +} + +PassRefPtr<ArrayBuffer> ArrayBuffer::slice(int begin) const +{ + return sliceImpl(clampIndex(begin), byteLength()); +} + +PassRefPtr<ArrayBuffer> ArrayBuffer::sliceImpl(unsigned begin, unsigned end) const +{ + unsigned size = begin <= end ? end - begin : 0; + return ArrayBuffer::create(static_cast<const char*>(data()) + begin, size); +} + +unsigned ArrayBuffer::clampIndex(int index) const +{ + unsigned currentLength = byteLength(); + if (index < 0) + index = currentLength + index; + return clampValue(index, 0, currentLength); +} + ArrayBuffer::~ArrayBuffer() { WTF::fastFree(m_data); |