libbluray | branch: master | Ian Curtis <[email protected]> | Thu Apr 3 09:44:02 2014 +0300| [1cc12cf45dd2a90728073cfd2bdea8b2b67db2cc] | committer: hpi1
BDGraphics: support image flipping in drawImage() > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=1cc12cf45dd2a90728073cfd2bdea8b2b67db2cc --- .../bdj/java/java/awt/BDGraphicsBase.java | 69 +++++++++++++++----- .../bdj/java/java/awt/BDWindowGraphics.java | 2 + 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/libbluray/bdj/java/java/awt/BDGraphicsBase.java b/src/libbluray/bdj/java/java/awt/BDGraphicsBase.java index 31a091d..8303e18 100644 --- a/src/libbluray/bdj/java/java/awt/BDGraphicsBase.java +++ b/src/libbluray/bdj/java/java/awt/BDGraphicsBase.java @@ -334,7 +334,7 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic dirty.add(rect); } - private void drawSpanN(int x, int y, int length, int src[], int srcOffset) { + private void drawSpanN(int x, int y, int length, int src[], int srcOffset, boolean flipX) { Rectangle rect = new Rectangle(x, y, length, 1); rect = actualClip.intersection(rect); @@ -343,13 +343,23 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic return; } + int dstOffset; + srcOffset += rect.x - x; x = rect.x; length = rect.width; + dstOffset = y * width + x; if (xorColor != null) { - for (int i = 0; i < length; i++) { - backBuffer[y * width + x + i] ^= xorColor.getRGB() ^ src[srcOffset + i]; + + if (flipX) { + for (int i = 0; i < length; i++) { + backBuffer[dstOffset + length -1 - i] ^= xorColor.getRGB() ^ src[srcOffset + i]; + } + } else { + for (int i = 0; i < length; i++) { + backBuffer[dstOffset + i] ^= xorColor.getRGB() ^ src[srcOffset + i]; + } } dirty.add(rect); @@ -359,17 +369,29 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic switch (composite.getRule()) { case AlphaComposite.CLEAR: for (int i = 0; i < length; i++) { - backBuffer[y * width + x + i] = 0; + backBuffer[dstOffset + i] = 0; } break; case AlphaComposite.SRC: - for (int i = 0; i < length; i++) { - backBuffer[y * width + x + i] = applyComposite(src[srcOffset + i]); + if (flipX) { + for (int i = 0; i < length; i++) { + backBuffer[dstOffset + length -1 - i] = applyComposite(src[srcOffset + i]); + } + } else { + for (int i = 0; i < length; i++) { + backBuffer[dstOffset + i] = applyComposite(src[srcOffset + i]); + } } break; case AlphaComposite.SRC_OVER: - for (int i = 0; i < length; i++) { - backBuffer[y * width + x + i] = alphaBlend(backBuffer[y * width + x + i], applyComposite(src[srcOffset + i])); + if (flipX) { + for (int i = 0; i < length; i++) { + backBuffer[dstOffset + length -1 - i] = alphaBlend(backBuffer[dstOffset + length -1 - i], applyComposite(src[srcOffset + i])); + } + } else { + for (int i = 0; i < length; i++) { + backBuffer[dstOffset + i] = alphaBlend(backBuffer[dstOffset + i], applyComposite(src[srcOffset + i])); + } } break; } @@ -383,10 +405,10 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic drawSpanN(x, y, length, rgb); } - private void drawSpan(int x, int y, int length, int src[], int srcOffset) { + private void drawSpan(int x, int y, int length, int src[], int srcOffset, boolean flipX) { x += originX; y += originY; - drawSpanN(x, y, length, src, srcOffset); + drawSpanN(x, y, length, src, srcOffset, flipX); } private void drawPointN(int x, int y, int rgb) { @@ -543,7 +565,7 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic // draw sub image for (int i = 0; i < h; i++) { - drawSpanN(x + dx, y + i + dy, w, subImage, w * i); + drawSpanN(x + dx, y + i + dy, w, subImage, w * i, false); } } @@ -899,7 +921,7 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic */ public boolean drawImage(Image img, int x, int y, Color bg, ImageObserver observer) { - return drawImageN(img, x, y, -1, -1, 0, 0, -1, -1, bg, observer); + return drawImageN(img, x, y, -1, -1, 0, 0, -1, -1, false, false, bg, observer); } /** @@ -917,7 +939,7 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic */ public boolean drawImage(Image img, int x, int y, int w, int h, Color bg, ImageObserver observer) { - return drawImageN(img, x, y, w, h, 0, 0, -1, -1, bg, observer); + return drawImageN(img, x, y, w, h, 0, 0, -1, -1, false, false, bg, observer); } /** @@ -940,32 +962,40 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic int sx1, int sy1, int sx2, int sy2, Color bg, ImageObserver observer) { + boolean flipX = false; + boolean flipY = false; + if (dx1 > dx2) { int swap = dx1; dx1 = dx2; dx2 = swap; + flipX = !flipX; } if (dy1 > dy2) { int swap = dy1; dy1 = dy2; dy2 = swap; + flipY = !flipY; } if (sx1 > sx2) { int swap = sx1; sx1 = sx2; sx2 = swap; + flipX = !flipX; } if (sy1 > sy2) { int swap = sy1; sy1 = sy2; sy2 = swap; + flipY = !flipY; } return drawImageN(img, dx1, dy1, dx2 - dx1, dy2 - dy1, - sx1, sy1, sx2 - sx1, sy2 - sy1, bg, observer); + sx1, sy1, sx2 - sx1, sy2 - sy1, + flipX, flipY, bg, observer); } /** @@ -975,6 +1005,7 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic protected boolean drawImageN(Image img, int dx, int dy, int dw, int dh, int sx, int sy, int sw, int sh, + boolean flipX, boolean flipY, Color bg, ImageObserver observer) { if ((sx < 0) || (sy < 0) || @@ -1037,8 +1068,14 @@ abstract class BDGraphicsBase extends Graphics2D implements ConstrainableGraphic } // draw actual colour array - for (int i = 0; i < dh; i++) { - drawSpan(dx, dy + i, dw, rgbArray, (stride * (i + sy)) + sx); + if (flipY) { + for (int i = 0; i < dh; i++) { + drawSpan(dx, dy + dh - 1 - i, dw, rgbArray, (stride * (i + sy)) + sx, flipX); + } + } else { + for (int i = 0; i < dh; i++) { + drawSpan(dx, dy + i, dw, rgbArray, (stride * (i + sy)) + sx, flipX); + } } return true; diff --git a/src/libbluray/bdj/java/java/awt/BDWindowGraphics.java b/src/libbluray/bdj/java/java/awt/BDWindowGraphics.java index 20e9c97..743f441 100644 --- a/src/libbluray/bdj/java/java/awt/BDWindowGraphics.java +++ b/src/libbluray/bdj/java/java/awt/BDWindowGraphics.java @@ -151,11 +151,13 @@ public class BDWindowGraphics extends BDGraphics { public boolean drawImageN(Image img, int dx, int dy, int dw, int dh, int sx, int sy, int sw, int sh, + boolean flipX, boolean flipY, Color bg, ImageObserver observer) { synchronized (window) { boolean complete = super.drawImageN( img, dx, dy, dw, dh, sx, sy, sw, sh, + flipX, flipY, bg, observer); if (complete) { window.notifyChanged(); _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
