piskel/src/js/utils/FrameTransform.js

65 lines
1.7 KiB
JavaScript

(function () {
var ns = $.namespace('pskl.utils');
ns.FrameTransform = {
VERTICAL : 'vertical',
HORIZONTAL : 'HORIZONTAL',
flip : function (frame, axis) {
var clone = frame.clone();
var w = frame.getWidth();
var h = frame.getHeight();
clone.forEachPixel(function (color, x, y) {
if (axis === ns.FrameTransform.VERTICAL) {
x = w-x-1;
} else if (axis === ns.FrameTransform.HORIZONTAL) {
y = h-y-1;
}
frame.pixels[x][y] = color;
});
frame.version++;
return frame;
},
CLOCKWISE : 'clockwise',
COUNTERCLOCKWISE : 'counterclockwise',
rotate : function (frame, direction) {
var clone = frame.clone();
var w = frame.getWidth();
var h = frame.getHeight();
var max = Math.max(w, h);
var xDelta = Math.ceil((max - w)/2);
var yDelta = Math.ceil((max - h)/2);
frame.forEachPixel(function (color, x, y) {
var _x = x, _y = y;
// Convert to square coords
x = x + xDelta;
y = y + yDelta;
// Perform the rotation
var tmpX = x, tmpY = y;
if (direction === ns.FrameTransform.CLOCKWISE) {
x = tmpY;
y = max - 1 - tmpX;
} else if (direction === ns.FrameTransform.COUNTERCLOCKWISE) {
y = tmpX;
x = max - 1 - tmpY;
}
// Convert the coordinates back to the rectangular grid
x = x - xDelta;
y = y - yDelta;
if (clone.containsPixel(x, y)) {
frame.pixels[_x][_y] = clone.getPixel(x, y);
} else {
frame.pixels[_x][_y] = Constants.TRANSPARENT_COLOR;
}
});
frame.version++;
return frame;
}
};
})();