|
|
@ -75,21 +75,21 @@ PixelArray::GetLength(Local<String> prop, const AccessorInfo &info) { |
|
|
|
} |
|
|
|
|
|
|
|
/*
|
|
|
|
* Initialize a new PixelArray. |
|
|
|
* Initialize a new PixelArray copying data |
|
|
|
* from the canvas surface using the given rect. |
|
|
|
*/ |
|
|
|
|
|
|
|
PixelArray::PixelArray(Canvas *canvas, int sx, int sy, int width, int height): |
|
|
|
_width(width), _height(height) { |
|
|
|
|
|
|
|
// Alloc space for our new data
|
|
|
|
_stride = width * 4; |
|
|
|
uint8_t *dst = _data = (uint8_t *) malloc(length()); |
|
|
|
memset(_data, 0, length()); |
|
|
|
uint8_t *dst = alloc(); |
|
|
|
uint8_t *src = canvas->data(); |
|
|
|
int s = stride(); |
|
|
|
|
|
|
|
// Normalize data (argb -> rgba)
|
|
|
|
for (int y = 0; y < height; ++y) { |
|
|
|
uint32_t *row = (uint32_t *)(src + _stride * y); |
|
|
|
uint32_t *row = (uint32_t *)(src + s * y); |
|
|
|
for (int x = 0; x < width; ++x) { |
|
|
|
int bx = x * 4; |
|
|
|
uint32_t *pixel = row + x; |
|
|
@ -101,14 +101,28 @@ PixelArray::PixelArray(Canvas *canvas, int sx, int sy, int width, int height): |
|
|
|
dst[bx + 1] = (*pixel >> 8) * 255 / a; |
|
|
|
dst[bx + 2] = *pixel * 255 / a; |
|
|
|
} |
|
|
|
dst += _stride; |
|
|
|
dst += s; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/*
|
|
|
|
* Initialize an empty PixelArray with the given dimensions. |
|
|
|
*/ |
|
|
|
|
|
|
|
PixelArray::PixelArray(int width, int height): |
|
|
|
_width(width), _height(height) { |
|
|
|
// TODO: error handling
|
|
|
|
// TODO: implement
|
|
|
|
alloc(); |
|
|
|
} |
|
|
|
|
|
|
|
/*
|
|
|
|
* Allocate / zero data buffer. |
|
|
|
*/ |
|
|
|
|
|
|
|
uint8_t * |
|
|
|
PixelArray::alloc() { |
|
|
|
_data = (uint8_t *) malloc(length()); |
|
|
|
memset(_data, 0, length()); |
|
|
|
return _data; |
|
|
|
} |
|
|
|
|
|
|
|
PixelArray::~PixelArray() { |
|
|
|