Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
typed arrays: add Uint8ClampedArray
Browse files Browse the repository at this point in the history
  • Loading branch information
mikeseven authored and bnoordhuis committed Mar 28, 2012
1 parent 48bbdde commit 67fc1da
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
13 changes: 13 additions & 0 deletions src/v8_typed_array.cc
Expand Up @@ -339,6 +339,15 @@ class TypedArray {
reinterpret_cast<float*>(ptr)[index] = (float) args[1]->NumberValue();
else if (TEAType == v8::kExternalDoubleArray)
reinterpret_cast<double*>(ptr)[index] = (double) args[1]->NumberValue();
else if (TEAType == v8::kExternalPixelArray) {
int value = args[1]->Int32Value();
if (value < 0)
value = 0;
else if (value > 255)
value = 255;
reinterpret_cast<unsigned char*>(ptr)[index] =
(unsigned char) value;
}
} else if (args[0]->IsObject()) {
v8::Handle<v8::Object> obj = v8::Handle<v8::Object>::Cast(args[0]);

Expand Down Expand Up @@ -439,13 +448,15 @@ class TypedArray {
case v8::kExternalUnsignedIntArray: return "Uint32Array";
case v8::kExternalFloatArray: return "Float32Array";
case v8::kExternalDoubleArray: return "Float64Array";
case v8::kExternalPixelArray: return "Uint8ClampedArray";
}
abort();
}
};

class Int8Array : public TypedArray<1, v8::kExternalByteArray> { };
class Uint8Array : public TypedArray<1, v8::kExternalUnsignedByteArray> { };
class Uint8ClampedArray : public TypedArray<1, v8::kExternalPixelArray> { };
class Int16Array : public TypedArray<2, v8::kExternalShortArray> { };
class Uint16Array : public TypedArray<2, v8::kExternalUnsignedShortArray> { };
class Int32Array : public TypedArray<4, v8::kExternalIntArray> { };
Expand Down Expand Up @@ -799,6 +810,8 @@ void AttachBindings(v8::Handle<v8::Object> obj) {
Int8Array::GetTemplate()->GetFunction());
obj->Set(v8::String::New("Uint8Array"),
Uint8Array::GetTemplate()->GetFunction());
obj->Set(v8::String::New("Uint8ClampedArray"),
Uint8ClampedArray::GetTemplate()->GetFunction());
obj->Set(v8::String::New("Int16Array"),
Int16Array::GetTemplate()->GetFunction());
obj->Set(v8::String::New("Uint16Array"),
Expand Down
1 change: 1 addition & 0 deletions test/common.js
Expand Up @@ -111,6 +111,7 @@ process.on('exit', function() {
knownGlobals.push(ArrayBuffer);
knownGlobals.push(Int8Array);
knownGlobals.push(Uint8Array);
knownGlobals.push(Uint8ClampedArray);
knownGlobals.push(Int16Array);
knownGlobals.push(Uint16Array);
knownGlobals.push(Int32Array);
Expand Down
17 changes: 16 additions & 1 deletion test/simple/test-typed-arrays.js
Expand Up @@ -37,7 +37,8 @@ var assert = require('assert');
'Int32Array',
'Uint32Array',
'Float32Array',
'Float64Array'
'Float64Array',
'Uint8ClampedArray'
].forEach(function(name) {
var expected = '[object ' + name + ']';
var clazz = global[name];
Expand Down Expand Up @@ -145,3 +146,17 @@ uint8.set([0x0a, 0x0b], 2);
assert.equal(uint8.get(1), 0x09);
assert.equal(uint8.get(2), 0x0a);
assert.equal(uint8.get(3), 0x0b);

// test clamped array
var uint8c = new Uint8ClampedArray(buffer);
uint8c[0] = -1;
uint8c[1] = 257;

assert.equal(uint8c[0], 0);
assert.equal(uint8c[1], 255);

uint8c.set(0, -10);
uint8c.set(1, 260);

assert.equal(uint8c[0], 0);
assert.equal(uint8c[1], 255);

0 comments on commit 67fc1da

Please sign in to comment.