2002/06/23 21:26:37
authormegacz <megacz@xwt.org>
Fri, 30 Jan 2004 06:48:17 +0000 (06:48 +0000)
committermegacz <megacz@xwt.org>
Fri, 30 Jan 2004 06:48:17 +0000 (06:48 +0000)
darcs-hash:20040130064817-2ba56-46cd3acb79c3a5dfb18fb0e111d32b593f87cedf.gz

CHANGES
src/org/xwt/Box.java

diff --git a/CHANGES b/CHANGES
index 7507b93..4b08a3e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
 
 16-Jun megacz HTTP.java: diabled xwt-httpProxy, etc
 
+23-Jun megacz Box.java: JPEG hack, fastpath rendering bugfix,
+              fixedaspect, improved >500 Pos/SizeChange loop breakout
+
index e34fe98..1e9bcc0 100644 (file)
@@ -234,6 +234,9 @@ public final class Box extends JSObject {
     /** If true, the Box will force its own size to the natural size of its background image */
     boolean sizetoimage = false;
 
+    /** If true and tile is false, the background of this image will never be stretched */
+    boolean fixedaspect = false;
+
     /** If true, the box will shrink to the smallest vertical size possible */
     boolean vshrink = false;
 
@@ -426,12 +429,17 @@ public final class Box extends JSObject {
                 if (Log.on) Log.log(Box.class, "HTTP images can not be loaded from the foreground thread");
                 return null;
             }
+            // FIXME: use primitives here
             ThreadMessage mythread = (ThreadMessage)thread;
             mythread.setPriority(Thread.MIN_PRIORITY);
             mythread.done.release();
             try {
-                if (str.endsWith(".png")) ret = PNG.decode(Platform.urlToInputStream(new URL(str)), str);
-                else ret = GIF.decode(Platform.urlToInputStream(new URL(str)), str);
+                // FIXME use mime types here, not extensions
+                if (str.endsWith(".jpeg") || str.endsWith(".jpg"))
+                    str = "http://xmlrpc.xwt.org/jpeg2png/" + str.substring(str.indexOf("//") + 2);
+
+                if (str.endsWith(".gif")) ret = GIF.decode(new HTTP(str).getInputStream(), str);
+                else ret = PNG.decode(new HTTP(str).getInputStream(), str);
                 return ret;
 
             } catch (IOException e) {
@@ -660,10 +668,11 @@ public final class Box extends JSObject {
 
         // FASTPATH: if we haven't moved position (just changed size), and we're not a stretched image:
         if (oldpos(0) == pos(0) && oldpos(1) == pos(1) && (image == null || tile)) {
-            
-            int bw = border == null ? 0 : border[2].getWidth();
-            int bh = border == null ? 0 : border[0].getHeight();
-            
+
+            // we use the max(border, pad) since because of the pad we might be revealing an abs-pos child
+            int bw = max(border == null ? 0 : border[2].getWidth(), pad(0));
+            int bh = max(border == null ? 0 : border[0].getHeight(), pad(1));
+
             // dirty only the *change* in the area we cover, both on ourselves and on our parent
             for(Box cur = this; cur != null && (cur == this || cur == this.getParent()); cur = cur.getParent()) {
                 cur.dirty(pos(0) + min(oldsize(0) - bw, size(0) - bw),
@@ -693,8 +702,10 @@ public final class Box extends JSObject {
         set(oldpos, 0, pos(0));
         set(oldpos, 1, pos(1));
 
-        if (sizechange || poschange)
-            if (surface.sizePosChangesSinceLastRender++ > 500) {
+        if (!sizechange && !poschange) return;
+
+        if (++surface.sizePosChangesSinceLastRender >= 500) {
+            if (surface.sizePosChangesSinceLastRender == 500) {
                 if (Log.on) Log.log(this, "Warning, more than 500 SizeChange/PosChange traps triggered since last complete render");
                 if (Log.on) Log.log(this, "    interpreter is at " + Context.enter().interpreterSourceFile + ":" + Context.enter().interpreterLine);
                 try {
@@ -703,12 +714,13 @@ public final class Box extends JSObject {
                     if (Log.on) Log.log(this, "Current trap is at " + f.getSourceName() + ":" + f.getLineNumbers()[0]);
                 } catch (Throwable t) { }
             }
-
-        if (sizechange) put("SizeChange", null, Boolean.TRUE);
-        if (poschange) put("PosChange", null, Boolean.TRUE);
-        if (sizechange || poschange) {
-            surface.abort = true;
-            return;
+        } else {
+            if (sizechange) put("SizeChange", null, Boolean.TRUE);
+            if (poschange) put("PosChange", null, Boolean.TRUE);
+            if (sizechange || poschange) {
+                surface.abort = true;
+                return;
+            }
         }
     }
     
@@ -860,7 +872,6 @@ public final class Box extends JSObject {
         buf.setClip(x, y, w + x, h + y);
 
         if ((color & 0xFF000000) != 0xFF000000) {
-
             // if the color is null, we have to be very careful about drawing the corners
             //if (Log.verbose) Log.log(this, "WARNING: (color == null && border != null) on box with border " + imageToNameMap.get(border[4]));
 
@@ -917,11 +928,28 @@ public final class Box extends JSObject {
         buf.setClip(x, y, w + x, h + y);
         int bw = border == null ? 0 : border[4].getHeight();
         int bh = border == null ? 0 : border[4].getWidth();
+
+        int width = pos(0) + size(0) - bw / 2 - pos(0) + bw / 2;
+        int height = pos(1) + size(1) - bh / 2 - pos(1) + bh / 2;
+
+        if (fixedaspect) {
+            int hstretch = width / image.getWidth();
+            if (hstretch == 0) hstretch = -1 * image.getWidth() / width;
+            int vstretch = height / image.getHeight();
+            if (vstretch == 0) vstretch = -1 * image.getHeight() / height;
+
+            if (hstretch < vstretch) {
+                height = image.getHeight() * width / image.getWidth();
+            } else {
+                width = image.getWidth() * height / image.getHeight();
+            }
+        }
+
         buf.drawPicture(image,
                         pos(0) + bw / 2,
                         pos(1) + bh / 2,
-                        pos(0) + size(0) - bw / 2,
-                        pos(1) + size(1) - bh / 2,
+                        pos(0) + bw / 2 + width,
+                        pos(1) + bh / 2 + height,
                         0, 0, image.getWidth(), image.getHeight());
         buf.setClip(0, 0, buf.getWidth(), buf.getHeight());
     }