From b1b4eca3755ee0062a6d9595a377ebf26bd02d74 Mon Sep 17 00:00:00 2001 From: ippo615 Date: Tue, 3 Dec 2013 19:20:34 -0500 Subject: [PATCH] Fixed bug in Flip filter, works on single buffer --- src/filters/Flip.js | 48 +++++++++++++++++++++++++++++----- test/unit/filters/Flip-test.js | 42 +++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/src/filters/Flip.js b/src/filters/Flip.js index aad863fb..8ba6adf8 100644 --- a/src/filters/Flip.js +++ b/src/filters/Flip.js @@ -16,16 +16,27 @@ var srcPixels = src.data, dstPixels = dst.data, xSize = src.width, + xEnd = Math.ceil(0.5*xSize), ySize = src.height, - i, m, x, y; - for (x = 0; x < xSize; x += 1) { + i, m, x, y, r,g,b,a; + for (x = 0; x < xEnd; x += 1) { for (y = 0; y < ySize; y += 1) { i = (y * xSize + x) * 4; // original m = (y * xSize + (xSize-1) - x) * 4; // flipped + // Instead of copying each row from the source to the destiation + // swap rows - this let's us achive a full flip in a single buffer + r = srcPixels[m + 0]; + g = srcPixels[m + 1]; + b = srcPixels[m + 2]; + a = srcPixels[m + 3]; dstPixels[m + 0] = srcPixels[i + 0]; dstPixels[m + 1] = srcPixels[i + 1]; dstPixels[m + 2] = srcPixels[i + 2]; dstPixels[m + 3] = srcPixels[i + 3]; + dstPixels[i + 0] = r; + dstPixels[i + 1] = g; + dstPixels[i + 2] = b; + dstPixels[i + 3] = a; } } }; @@ -47,19 +58,44 @@ dstPixels = dst.data, xSize = src.width, ySize = src.height, - i, m, x, y; + yEnd = Math.ceil(0.5*ySize), + i, m, x, y, r,g,b,a; for (x = 0; x < xSize; x += 1) { - for (y = 0; y < ySize; y += 1) { + for (y = 0; y < yEnd; y += 1) { i = (y * xSize + x) * 4; // original m = ((ySize-1 - y) * xSize + x) * 4; // flipped + // Instead of copying each row from the source to the destiation + // swap rows - this let's us achive a full flip in a single buffer + r = srcPixels[m + 0]; + g = srcPixels[m + 1]; + b = srcPixels[m + 2]; + a = srcPixels[m + 3]; dstPixels[m + 0] = srcPixels[i + 0]; dstPixels[m + 1] = srcPixels[i + 1]; dstPixels[m + 2] = srcPixels[i + 2]; dstPixels[m + 3] = srcPixels[i + 3]; + dstPixels[i + 0] = r; + dstPixels[i + 1] = g; + dstPixels[i + 2] = b; + dstPixels[i + 3] = a; } } }; - Kinetic.Filters.FlipX = Kinetic.Util._FilterWrapSingleBuffer(FlipX); - Kinetic.Filters.FlipY = Kinetic.Util._FilterWrapSingleBuffer(FlipY); + Kinetic.Filters.FlipX = function(src,dst,opt){ + if( this === Kinetic.Filters ){ + FlipX(src, dst||src, opt ); + }else{ + FlipX.call(this, src, dst||src, opt); + } + }; + + Kinetic.Filters.FlipY = function(src,dst,opt){ + if( this === Kinetic.Filters ){ + FlipY(src, dst||src, opt ); + }else{ + FlipY.call(this, src, dst||src, opt); + } + }; + })(); diff --git a/test/unit/filters/Flip-test.js b/test/unit/filters/Flip-test.js index 437112e2..d1750cbb 100644 --- a/test/unit/filters/Flip-test.js +++ b/test/unit/filters/Flip-test.js @@ -224,4 +224,46 @@ suite('Flip', function () { done(); }); + // ====================================================== + test('on image', function(done) { + var stage = addStage(); + + var imageObj = new Image(); + imageObj.onload = function() { + + var layer = new Kinetic.Layer(); + var xFlip = new Kinetic.Image({ + x: 160, + y: 10, + image: imageObj, + draggable: true, + filter: Kinetic.Filters.FlipX + }); + var yFlip = new Kinetic.Image({ + x: 320, + y: 10, + image: imageObj, + draggable: true, + filter: Kinetic.Filters.FlipY + }); + var noFlip = new Kinetic.Image({ + x: 0, + y: 10, + image: imageObj, + draggable: true + }); + + layer.add(noFlip); + layer.add(xFlip); + layer.add(yFlip); + stage.add(layer); + + layer.draw(); + + done(); + }; + imageObj.src = 'assets/lion.png'; + + }); + });