You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
290 lines
6.8 KiB
290 lines
6.8 KiB
// Copyright 2014-2015 Yahoo! Inc.
|
|
// Copyrights licensed under the Mit License. See the accompanying LICENSE file for terms.
|
|
|
|
/**
|
|
* Pixel manipulation functions
|
|
*
|
|
* @class PNGImage
|
|
* @submodule Core
|
|
* @type {object}
|
|
*/
|
|
module.exports = {
|
|
|
|
/**
|
|
* Gets the color of a pixel at a specific index
|
|
*
|
|
* @method getPixel
|
|
* @param {int} idx Index of pixel
|
|
* @return {int} Color
|
|
*/
|
|
getAtIndex: function (idx) {
|
|
return this.getColorAtIndex(idx) | (this.getAlpha(idx) << 24);
|
|
},
|
|
|
|
/**
|
|
* Gets the color of a pixel at a specific coordinate
|
|
*
|
|
* @method getAt
|
|
* @param {int} x X-coordinate of pixel
|
|
* @param {int} y Y-coordinate of pixel
|
|
* @return {int} Color
|
|
*/
|
|
getAt: function (x, y) {
|
|
var idx = this.getIndex(x, y);
|
|
return this.getAtIndex(idx);
|
|
},
|
|
|
|
/**
|
|
* Gets the color of a pixel at a specific coordinate
|
|
* Alias for getAt
|
|
*
|
|
* @method getPixel
|
|
* @param {int} x X-coordinate of pixel
|
|
* @param {int} y Y-coordinate of pixel
|
|
* @return {int} Color
|
|
*/
|
|
getPixel: function (x, y) {
|
|
return this.getAt(x, y);
|
|
},
|
|
|
|
|
|
/**
|
|
* Sets the color of a pixel at a specific index
|
|
*
|
|
* @method setAtIndex
|
|
* @param {int} idx Index of pixel
|
|
* @param {object|int} color
|
|
* @param {int} [color.red] Red value for pixel
|
|
* @param {int} [color.green] Green value for pixel
|
|
* @param {int} [color.blue] Blue value for pixel
|
|
* @param {int} [color.alpha] Alpha value for pixel
|
|
* @param {number} [color.opacity] Opacity of color
|
|
*/
|
|
setAtIndex: function (idx, color) {
|
|
if (typeof color === 'object') {
|
|
if (color.red !== undefined) this.setRed(idx, color.red, color.opacity);
|
|
if (color.green !== undefined) this.setGreen(idx, color.green, color.opacity);
|
|
if (color.blue !== undefined) this.setBlue(idx, color.blue, color.opacity);
|
|
if (color.alpha !== undefined) this.setAlpha(idx, color.alpha, color.opacity);
|
|
} else {
|
|
this.setRed(idx, color & 0xff);
|
|
this.setGreen(idx, (color & 0xff00) >> 8);
|
|
this.setBlue(idx, (color & 0xff0000) >> 16);
|
|
this.setAlpha(idx, (color & 0xff000000) >> 24);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Sets the color of a pixel at a specific coordinate
|
|
*
|
|
* @method setAt
|
|
* @param {int} x X-coordinate for pixel
|
|
* @param {int} y Y-coordinate for pixel
|
|
* @param {object} color
|
|
* @param {int} [color.red] Red value for pixel
|
|
* @param {int} [color.green] Green value for pixel
|
|
* @param {int} [color.blue] Blue value for pixel
|
|
* @param {int} [color.alpha] Alpha value for pixel
|
|
* @param {number} [color.opacity] Opacity of color
|
|
*/
|
|
setAt: function (x, y, color) {
|
|
var idx = this.getIndex(x, y);
|
|
this.setAtIndex(idx, color);
|
|
},
|
|
|
|
/**
|
|
* Sets the color of a pixel at a specific coordinate
|
|
* Alias for setAt
|
|
*
|
|
* @method setPixel
|
|
* @param {int} x X-coordinate for pixel
|
|
* @param {int} y Y-coordinate for pixel
|
|
* @param {object} color
|
|
* @param {int} [color.red] Red value for pixel
|
|
* @param {int} [color.green] Green value for pixel
|
|
* @param {int} [color.blue] Blue value for pixel
|
|
* @param {int} [color.alpha] Alpha value for pixel
|
|
* @param {number} [color.opacity] Opacity of color
|
|
*/
|
|
setPixel: function (x, y, color) {
|
|
this.setAt(x, y, color);
|
|
},
|
|
|
|
|
|
/**
|
|
* Gets the color of a pixel at a specific index
|
|
*
|
|
* @method getColorAtIndex
|
|
* @param {int} idx Index of pixel
|
|
* @return {int} Color
|
|
*/
|
|
getColorAtIndex: function (idx) {
|
|
return this.getRed(idx) | (this.getGreen(idx) << 8) | (this.getBlue(idx) << 16);
|
|
},
|
|
|
|
/**
|
|
* Gets the color of a pixel at a specific coordinate
|
|
*
|
|
* @method getColor
|
|
* @param {int} x X-coordinate of pixel
|
|
* @param {int} y Y-coordinate of pixel
|
|
* @return {int} Color
|
|
*/
|
|
getColor: function (x, y) {
|
|
var idx = this.getIndex(x, y);
|
|
return this.getColorAtIndex(idx);
|
|
},
|
|
|
|
|
|
/**
|
|
* Calculates the final color value for opacity
|
|
*
|
|
* @method _calculateColorValue
|
|
* @param {int} originalValue
|
|
* @param {int} paintValue
|
|
* @param {number} [opacity]
|
|
* @return {int}
|
|
* @private
|
|
*/
|
|
_calculateColorValue: function (originalValue, paintValue, opacity) {
|
|
|
|
var originalPart, paintPart;
|
|
|
|
if (opacity === undefined) {
|
|
return paintValue;
|
|
} else {
|
|
originalPart = originalValue * (1 - opacity);
|
|
paintPart = (paintValue * opacity);
|
|
|
|
return Math.floor(originalPart + paintPart);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Get the red value of a pixel
|
|
*
|
|
* @method getRed
|
|
* @param {int} idx Index of pixel
|
|
* @return {int}
|
|
*/
|
|
getRed: function (idx) {
|
|
return this._getValue(idx, 0);
|
|
},
|
|
|
|
/**
|
|
* Set the red value of a pixel
|
|
*
|
|
* @method setRed
|
|
* @param {int} idx Index of pixel
|
|
* @param {int} value Value for pixel
|
|
* @param {number} [opacity] Opacity of value set
|
|
*/
|
|
setRed: function (idx, value, opacity) {
|
|
this._setValue(idx, 0, value, opacity);
|
|
},
|
|
|
|
|
|
/**
|
|
* Get the green value of a pixel
|
|
*
|
|
* @method getGreen
|
|
* @param {int} idx Index of pixel
|
|
* @return {int}
|
|
*/
|
|
getGreen: function (idx) {
|
|
return this._getValue(idx, 1);
|
|
},
|
|
|
|
/**
|
|
* Set the green value of a pixel
|
|
*
|
|
* @method setGreen
|
|
* @param {int} idx Index of pixel
|
|
* @param {int} value Value for pixel
|
|
* @param {number} [opacity] Opacity of value set
|
|
*/
|
|
setGreen: function (idx, value, opacity) {
|
|
this._setValue(idx, 1, value, opacity);
|
|
},
|
|
|
|
|
|
/**
|
|
* Get the blue value of a pixel
|
|
*
|
|
* @method getBlue
|
|
* @param {int} idx Index of pixel
|
|
* @return {int}
|
|
*/
|
|
getBlue: function (idx) {
|
|
return this._getValue(idx, 2);
|
|
},
|
|
|
|
/**
|
|
* Set the blue value of a pixel
|
|
*
|
|
* @method setBlue
|
|
* @param {int} idx Index of pixel
|
|
* @param {int} value Value for pixel
|
|
* @param {number} [opacity] Opacity of value set
|
|
*/
|
|
setBlue: function (idx, value, opacity) {
|
|
this._setValue(idx, 2, value, opacity);
|
|
},
|
|
|
|
|
|
/**
|
|
* Get the alpha value of a pixel
|
|
*
|
|
* @method getAlpha
|
|
* @param {int} idx Index of pixel
|
|
* @return {int}
|
|
*/
|
|
getAlpha: function (idx) {
|
|
return this._getValue(idx, 3);
|
|
},
|
|
|
|
/**
|
|
* Set the alpha value of a pixel
|
|
*
|
|
* @method setAlpha
|
|
* @param {int} idx Index of pixel
|
|
* @param {int} value Value for pixel
|
|
* @param {number} [opacity] Opacity of value set
|
|
*/
|
|
setAlpha: function (idx, value, opacity) {
|
|
this._setValue(idx, 3, value, opacity);
|
|
},
|
|
|
|
|
|
/**
|
|
* Sets the value of a pixel
|
|
*
|
|
* @method _getValue
|
|
* @param {int} offset Offset of a value
|
|
* @param {int} colorOffset Offset of a color
|
|
* @return {int}
|
|
* @private
|
|
*/
|
|
_getValue: function (offset, colorOffset) {
|
|
var localOffset = offset << 2;
|
|
return this._image.data[localOffset + colorOffset];
|
|
},
|
|
|
|
/**
|
|
* Sets the value of a pixel
|
|
*
|
|
* @method _setValue
|
|
* @param {int} offset Offset of a value
|
|
* @param {int} colorOffset Offset of a color
|
|
* @param {int} value Value for pixel
|
|
* @param {number} [opacity] Opacity of value set
|
|
* @private
|
|
*/
|
|
_setValue: function (offset, colorOffset, value, opacity) {
|
|
var previousValue = this._getValue(offset, colorOffset),
|
|
localOffset = offset << 2;
|
|
|
|
this._image.data[localOffset + colorOffset] = this._calculateColorValue(previousValue, value, opacity);
|
|
}
|
|
};
|