[libbluray-devel] Implement ImageProducer for off-screen images.
hpi1
git at videolan.org
Mon Aug 26 10:52:06 CEST 2013
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Mon Aug 26 11:12:15 2013 +0300| [731c40ffffbfea1eec25c66e29d417e214e3c792] | committer: hpi1
Implement ImageProducer for off-screen images.
Fixes Crank initial playlist.
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=731c40ffffbfea1eec25c66e29d417e214e3c792
---
src/libbluray/bdj/java/java/awt/BDImageBase.java | 5 +-
.../bdj/java/java/awt/BDOffScreenImageSource.java | 89 ++++++++++++++++++++
2 files changed, 93 insertions(+), 1 deletion(-)
diff --git a/src/libbluray/bdj/java/java/awt/BDImageBase.java b/src/libbluray/bdj/java/java/awt/BDImageBase.java
index 95c5de4..c2a5b52 100644
--- a/src/libbluray/bdj/java/java/awt/BDImageBase.java
+++ b/src/libbluray/bdj/java/java/awt/BDImageBase.java
@@ -42,6 +42,7 @@ class BDImageBase extends Image {
protected Area dirty;
private GraphicsConfiguration gc;
private Vector observers = new Vector();
+ private ImageProducer offscreenSource = null;
static {
try {
@@ -78,6 +79,8 @@ class BDImageBase extends Image {
backBuffer = new int[width * height];
dirty = new Area(width, height);
+
+ offscreenSource = new BDOffScreenImageSource(backBuffer, width, height);
}
public void flush() {
@@ -132,7 +135,7 @@ class BDImageBase extends Image {
}
public ImageProducer getSource() {
- return null;
+ return offscreenSource;
}
public Component getComponent() {
diff --git a/src/libbluray/bdj/java/java/awt/BDOffScreenImageSource.java b/src/libbluray/bdj/java/java/awt/BDOffScreenImageSource.java
new file mode 100644
index 0000000..a936dc8
--- /dev/null
+++ b/src/libbluray/bdj/java/java/awt/BDOffScreenImageSource.java
@@ -0,0 +1,89 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2013 Petri Hintukainen <phintuka at users.sourceforge.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+package java.awt;
+
+import java.util.Hashtable;
+import java.awt.Component;
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.DirectColorModel;
+import java.awt.image.ImageConsumer;
+import java.awt.image.ImageProducer;
+
+class BDOffScreenImageSource implements ImageProducer {
+ private ImageConsumer consumer;
+ private int width;
+ private int height;
+ private int[] buffer;
+
+ public BDOffScreenImageSource(int[] buffer, int w, int h) {
+ width = w;
+ height = h;
+ this.buffer = buffer;
+ }
+
+ public synchronized void addConsumer(ImageConsumer ic) {
+ consumer = ic;
+ produce();
+ }
+
+ public synchronized boolean isConsumer(ImageConsumer ic) {
+ return (ic == consumer);
+ }
+
+ public synchronized void removeConsumer(ImageConsumer ic) {
+ if (consumer == ic) {
+ consumer = null;
+ }
+ }
+
+ public void startProduction(ImageConsumer ic) {
+ addConsumer(ic);
+ }
+
+ private ColorModel getColorModel() {
+ return new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, true,
+ DataBuffer.TYPE_INT);
+ }
+
+ private void sendPixels()
+ {
+ if (consumer != null) {
+ consumer.setPixels(0, 0, width, height, getColorModel(), buffer, 0, width);
+ }
+ }
+
+ private void produce() {
+ if (consumer != null) {
+ consumer.setDimensions(width, height);
+ }
+ if (consumer != null) {
+ consumer.setProperties(new Hashtable());
+ }
+ sendPixels();
+ if (consumer != null) {
+ consumer.imageComplete(ImageConsumer.SINGLEFRAMEDONE);
+ }
+ }
+
+ public void requestTopDownLeftRightResend(ImageConsumer ic) {}
+}
More information about the libbluray-devel
mailing list