Warning: session_start(): open(/var/lib/php/sessions/sess_l1tpl6f0kkflaigrdds2j49eap, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
abstract sclass DynImageSurface extends DynModule {
transient ImageSurface imageSurface;
transient BufferedImage image;
transient S imageID;
transient bool useUpdateHack, zoomToWindowOnSetImage;
transient O onNewImage;
switchable bool autoSaveToDisk = autoSaveToDiskDefault(); // dev.
switchable bool pixelate;
visualize { ret _visualize(); }
final private JComponent _visualize() {
imageSurface = imageSurface(image);
imageSurface.onNewImage = r newImageFromSurface;
if (pixelate) imageSurface_pixelated(imageSurface);
ret jscroll_center(imageSurface);
}
// call after visualize
void enableDoubleBuffering {
if (imageSurface != null) imageSurface.setDoubleBuffered(true);
}
JComponent visualizeWithDoubleBuffering() {
JComponent c = _visualize();
enableDoubleBuffering();
ret c;
}
// hold image during reload (not during reboot yet)
O _getReloadData() { ret image; }
void _setReloadData(BufferedImage image) { this.image = image; }
start {
if (autoSaveToDisk)
autoLoadNow();
}
void autoLoadNow enter {
pcall {
File f = autoSaveImageFile();
if (fileExists(f)) {
print("Auto-loading " + f);
setImage(loadImage2(f), true);
}
}
}
void autoSaveNow enter {
pcall {
File f = autoSaveImageFile();
savePNG(f, image);
infoBox("Auto-saved " + renderFileInfo(f));
}
}
bool autoSaveToDiskDefault() { false; }
enhanceFrame {
internalFramePopupMenuItem(f, "Auto-save now", rThread autoSaveNow);
}
// API
void setImage(MakesBufferedImage image) { imageID = null; setImage(image == null ? null : image.getBufferedImage()); }
void newImageFromSurface {
setImage(imageSurface.getImage());
}
void setImage(BufferedImage image, bool loadingFromAutoSave default false) {
this.image = image; imageID = null;
if (imageSurface != null) {
temp tempSetField(imageSurface, onNewImage := null); // avoid recursion
imageSurface.setImage(image);
if (zoomToWindowOnSetImage) imageSurface.zoomToWindow();
if (autoSaveToDisk && !loadingFromAutoSave)
autoSaveNow();
}
vmBus_send('newImage, this);
pcallF(onNewImage, image);
}
void setImage(S imageID) {
if (sameSnippetID(this.imageID, imageID)) ret;
setImage(loadImage2(imageID));
this.imageID = imageID;
}
File autoSaveImageFile() {
S id = dm_moduleID(me());
ret javaxDataDir("Image Autosaves/" + id + "-autosave.png");
}
BufferedImage getImage() {
if (useUpdateHack) {
// HACKY: to get changes in ImageSurface (e.g. images drag&dropped in there directly)
ImageSurface is = imageSurface;
if (is != null && is.getImage() != image) setImage(is.getImage());
}
ret image;
}
bool hasImage() { ret image != null; }
void setZoom(double zoom) { if (imageSurface != null) imageSurface.setZoom(zoom); }
Rect getSelection() { ret imageSurface == null ? null : toRect(imageSurface.getSelection()); }
void setSelection(Rect r) { if (imageSurface != null) imageSurface.setSelection(toRectangle(r)); }
int imageWidth() { ret imageSurface.getImage().getWidth(); }
int imageHeight() { ret imageSurface.getImage().getHeight(); }
void pixelate() {
set pixelate;
imageSurface_pixelated(imageSurface);
}
}