X-Git-Url: http://git.megacz.com/?p=org.ibex.core.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fgraphics%2FSurface.java;h=b9207bb635ebda3c740c2b70b70300908776cf67;hp=7e23169c148078aa4f6c8966a95fbd66cc81a525;hb=8e190fb0ff508ccf4962bbfbf8295a431805c12b;hpb=4daeeb4119b901d53b44913c86f8af3ce67db925 diff --git a/src/org/ibex/graphics/Surface.java b/src/org/ibex/graphics/Surface.java index 7e23169..b9207bb 100644 --- a/src/org/ibex/graphics/Surface.java +++ b/src/org/ibex/graphics/Surface.java @@ -1,8 +1,11 @@ // Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL] -package org.ibex; +package org.ibex.graphics; import org.ibex.js.*; import org.ibex.util.*; +import org.ibex.plat.*; + +import org.ibex.core.*; // FIXME /** * A Surface, as described in the Ibex Reference. @@ -10,7 +13,7 @@ import org.ibex.util.*; * Platform subclasses should include an inner class subclass of * Surface to return from the Platform._createSurface() method */ -public abstract class Surface extends PixelBuffer implements Scheduler.Task { +public abstract class Surface extends PixelBuffer implements Task { // Static Data //////////////////////////////////////////////////////////////////////////////// @@ -21,12 +24,12 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { public static Vec allSurfaces = new Vec(); /** When set to true, render() should abort as soon as possible and restart the rendering process */ - volatile boolean abort = false; + public volatile boolean abort = false; // these three variables are used to ensure that user resizes trump programmatic resizes - volatile boolean syncRootBoxToSurface = false; - volatile int pendingWidth = 0; - volatile int pendingHeight = 0; + public volatile boolean syncRootBoxToSurface = false; + public volatile int pendingWidth = 0; + public volatile int pendingHeight = 0; public static boolean alt = false; ///< true iff the alt button is pressed down public static boolean control = false; ///< true iff the control button is pressed down @@ -74,6 +77,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { public void setMinimumSize(int minx, int miny, boolean resizable) { } protected void setSize(int w, int h) { _setSize(w, h); } + public static Picture scarImage = null; // Helper methods for subclasses //////////////////////////////////////////////////////////// @@ -88,7 +92,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { if (button == 1) new Message("_Press1", T, root); else if (button == 2) new Message("_Press2", T, root); else if (button == 3) { - Scheduler.add(new Scheduler.Task() { public void perform() throws JSExn { + Scheduler.add(new Task() { public void perform() throws JSExn { Platform.clipboardReadEnabled = true; try { root.putAndTriggerTraps("_Press3", T); @@ -126,7 +130,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { } /** we enqueue ourselves in the Scheduler when we have a Move message to deal with */ - private Scheduler.Task mover = new Scheduler.Task() { + private Task mover = new Task() { public void perform() { if (mousex == newmousex && mousey == newmousey) return; int oldmousex = mousex; mousex = newmousex; @@ -167,7 +171,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { // FEATURE: can we avoid creating objects here? protected final void PosChange(final int x, final int y) { - Scheduler.add(new Scheduler.Task() { public void perform() throws JSExn { + Scheduler.add(new Task() { public void perform() throws JSExn { root.x = x; root.y = y; root.putAndTriggerTrapsAndCatchExceptions("PosChange", T); @@ -220,15 +224,15 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { public Surface(Box root) { this.root = root; - root.setMaxWidth(JS.N(Math.min(Platform.getScreenWidth(), root.maxwidth))); - root.setMaxHeight(JS.N(Math.min(Platform.getScreenHeight(), root.maxheight))); + root.setWidth(root.minwidth, Math.min(Platform.getScreenWidth(), root.maxwidth)); + root.setHeight(root.minheight, Math.min(Platform.getScreenHeight(), root.maxheight)); Surface old = fromBox(root); if (old != null) old.dispose(false); else root.removeSelf(); Refresh(); } - private static VectorGraphics.Affine identity = VectorGraphics.Affine.identity(); + private static Affine identity = Affine.identity(); /** runs the prerender() and render() pipelines in the root Box to regenerate the backbuffer, then blits it to the screen */ public synchronized void render() { @@ -238,14 +242,14 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { abort = false; root.pack(); if (syncRootBoxToSurface) { - root.setMaxWidth(JS.N(pendingWidth)); - root.setMaxHeight(JS.N(pendingHeight)); + root.setWidth(root.minwidth, pendingWidth); + root.setHeight(root.minheight, pendingHeight); syncRootBoxToSurface = false; } if (root.maxwidth != root.width || root.maxheight != root.height) { // dirty the place where the scar used to be and where it is now - dirty(0, root.height - Main.scarImage.height, Main.scarImage.width, Main.scarImage.height); - dirty(0, root.maxheight - Main.scarImage.height, Main.scarImage.width, Main.scarImage.height); + dirty(0, root.height - scarImage.height, scarImage.width, scarImage.height); + dirty(0, root.maxheight - scarImage.height, scarImage.width, scarImage.height); } root.reflow(); setSize(root.width, root.height); @@ -266,7 +270,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { if (w <= 0 || h <= 0) continue; root.render(0, 0, x, y, x + w, y + h, this, identity); - drawPicture(Main.scarImage, 0, root.height - Main.scarImage.height, x, y, x+w, y+h); + drawPicture(scarImage, 0, root.height - scarImage.height, x, y, x+w, y+h); if (abort) { // x,y,w,h is only partially reconstructed, so we must be careful not to re-blit it @@ -281,7 +285,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { } // FEATURE: reinstate recycler - public class Message implements Scheduler.Task { + public class Message implements Task { private Box boxContainingMouse; private Object value;