Async Image Saver: use Files instead of filenames

- solves headaches with path equivalence
This commit is contained in:
Jakub Valtar
2016-05-11 10:50:01 +02:00
parent 688487f3ae
commit 1653a2af3f
2 changed files with 26 additions and 24 deletions
+11 -10
View File
@@ -32,6 +32,7 @@ import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.io.File;
import java.io.InputStream;
import java.util.Map;
import java.util.HashMap;
@@ -8290,7 +8291,7 @@ public class PGraphics extends PImage implements PConstants {
if (target == null) return false;
int count = PApplet.min(pixels.length, target.pixels.length);
System.arraycopy(pixels, 0, target.pixels, 0, count);
asyncImageSaver.saveTargetAsync(this, target, parent.sketchPath(filename));
asyncImageSaver.saveTargetAsync(this, target, parent.sketchFile(filename));
return true;
}
@@ -8305,7 +8306,7 @@ public class PGraphics extends PImage implements PConstants {
*/
protected void awaitAsyncSaveCompletion(String filename) {
if (asyncImageSaver != null) {
asyncImageSaver.awaitAsyncSaveCompletion(parent.sketchPath(filename));
asyncImageSaver.awaitAsyncSaveCompletion(parent.sketchFile(filename));
}
}
@@ -8322,7 +8323,7 @@ public class PGraphics extends PImage implements PConstants {
int targetsCreated = 0;
Map<String, Future<?>> runningTasks = new HashMap<>();
Map<File, Future<?>> runningTasks = new HashMap<>();
final Object runningTasksLock = new Object();
@@ -8384,7 +8385,7 @@ public class PGraphics extends PImage implements PConstants {
public void saveTargetAsync(final PGraphics renderer, final PImage target, // ignore
final String absFilename) {
final File file) {
target.parent = renderer.parent;
// if running every frame, smooth the framerate
@@ -8405,7 +8406,7 @@ public class PGraphics extends PImage implements PConstants {
lastFrameCount = target.parent.frameCount;
lastTime = System.nanoTime();
awaitAsyncSaveCompletion(absFilename);
awaitAsyncSaveCompletion(file);
// Explicit lock, because submitting a task and putting it into map
// has to be atomic (and happen before task tries to remove itself)
@@ -8415,7 +8416,7 @@ public class PGraphics extends PImage implements PConstants {
try {
long startTime = System.nanoTime();
renderer.processImageBeforeAsyncSave(target);
target.save(absFilename);
target.save(file.getAbsolutePath());
long saveNanos = System.nanoTime() - startTime;
synchronized (AsyncImageSaver.this) {
if (avgNanos == 0) {
@@ -8430,11 +8431,11 @@ public class PGraphics extends PImage implements PConstants {
} finally {
targetPool.offer(target);
synchronized (runningTasksLock) {
runningTasks.remove(absFilename);
runningTasks.remove(file);
}
}
});
runningTasks.put(absFilename, task);
runningTasks.put(file, task);
} catch (RejectedExecutionException e) {
// the executor service was probably shut down, no more saving for us
}
@@ -8442,10 +8443,10 @@ public class PGraphics extends PImage implements PConstants {
}
public void awaitAsyncSaveCompletion(final String absFilename) { // ignore
public void awaitAsyncSaveCompletion(final File file) { // ignore
Future<?> taskWithSameFilename;
synchronized (runningTasksLock) {
taskWithSameFilename = runningTasks.get(absFilename);
taskWithSameFilename = runningTasks.get(file);
}
if (taskWithSameFilename != null) {
+15 -14
View File
@@ -26,6 +26,7 @@ package processing.opengl;
import processing.core.*;
import java.io.File;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.net.URL;
@@ -730,7 +731,7 @@ public class PGraphicsOpenGL extends PGraphics {
updatePixelSize();
// get the whole async package
asyncPixelReader.readAndSaveAsync(parent.sketchPath(filename));
asyncPixelReader.readAndSaveAsync(parent.sketchFile(filename));
if (needEndDraw) endDraw();
} else {
@@ -743,7 +744,7 @@ public class PGraphicsOpenGL extends PGraphics {
if (target == null) return false;
int count = PApplet.min(pixels.length, target.pixels.length);
System.arraycopy(pixels, 0, target.pixels, 0, count);
asyncImageSaver.saveTargetAsync(this, target, parent.sketchPath(filename));
asyncImageSaver.saveTargetAsync(this, target, parent.sketchFile(filename));
}
return true;
@@ -5608,9 +5609,9 @@ public class PGraphicsOpenGL extends PGraphics {
protected void awaitAsyncSaveCompletion(String filename) {
if (asyncPixelReader != null) {
ongoingPixelTransfersIterable.addAll(ongoingPixelTransfers);
String absFilename = parent.sketchPath(filename);
File file = parent.sketchFile(filename);
for (AsyncPixelReader pixelReader : ongoingPixelTransfersIterable) {
pixelReader.awaitTransferCompletion(absFilename);
pixelReader.awaitTransferCompletion(file);
}
ongoingPixelTransfersIterable.clear();
}
@@ -5629,7 +5630,7 @@ public class PGraphicsOpenGL extends PGraphics {
int[] pbos;
long[] fences;
String[] filenames;
File[] files;
int[] widths;
int[] heights;
@@ -5649,7 +5650,7 @@ public class PGraphicsOpenGL extends PGraphics {
if (supportsAsyncTransfers) {
pbos = new int[BUFFER_COUNT];
fences = new long[BUFFER_COUNT];
filenames = new String[BUFFER_COUNT];
files = new File[BUFFER_COUNT];
widths = new int[BUFFER_COUNT];
heights = new int[BUFFER_COUNT];
@@ -5679,7 +5680,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
pbos = null;
}
filenames = null;
files = null;
widths = null;
heights = null;
size = 0;
@@ -5690,7 +5691,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
public void readAndSaveAsync(final String absFilename) {
public void readAndSaveAsync(final File file) {
if (size > 0) {
boolean shouldRead = (size == BUFFER_COUNT);
if (!shouldRead) shouldRead = isLastTransferComplete();
@@ -5698,7 +5699,7 @@ public class PGraphicsOpenGL extends PGraphics {
} else {
ongoingPixelTransfers.add(this);
}
beginTransfer(absFilename);
beginTransfer(file);
calledThisFrame = true;
}
@@ -5756,14 +5757,14 @@ public class PGraphicsOpenGL extends PGraphics {
}
protected void awaitTransferCompletion(String absFilename) {
protected void awaitTransferCompletion(File file) {
if (size <= 0) return;
int i = tail; // tail -> head, wraps around (we have circular queue)
int j = 0; // 0 -> size, simple counter
int lastIndex = 0;
do {
if (absFilename.equals(filenames[i])) {
if (file.equals(files[i])) {
lastIndex = j; // no 'break' here, we need last index for this filename
}
i = (i + 1) % BUFFER_COUNT;
@@ -5787,7 +5788,7 @@ public class PGraphicsOpenGL extends PGraphics {
}
public void beginTransfer(String filename) {
public void beginTransfer(File file) {
// check the size of the buffer
if (widths[head] != pixelWidth || heights[head] != pixelHeight) {
if (widths[head] * heights[head] != pixelWidth * pixelHeight) {
@@ -5806,7 +5807,7 @@ public class PGraphicsOpenGL extends PGraphics {
pgl.bindBuffer(PGL.PIXEL_PACK_BUFFER, 0);
fences[head] = pgl.fenceSync(PGL.SYNC_GPU_COMMANDS_COMPLETE, 0);
filenames[head] = filename;
files[head] = file;
head = (head + 1) % BUFFER_COUNT;
size++;
@@ -5828,7 +5829,7 @@ public class PGraphicsOpenGL extends PGraphics {
readBuffer.asIntBuffer().get(target.pixels);
pgl.unmapBuffer(PGL.PIXEL_PACK_BUFFER);
asyncImageSaver.saveTargetAsync(PGraphicsOpenGL.this, target,
filenames[tail]);
files[tail]);
}
pgl.bindBuffer(PGL.PIXEL_PACK_BUFFER, 0);