mirror of
https://github.com/processing/processing4.git
synced 2026-06-16 04:26:26 +02:00
Async Image Saver: use Files instead of filenames
- solves headaches with path equivalence
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user