From 6ef1b244fa17f49df0deffcd42c9ca52b1a97f67 Mon Sep 17 00:00:00 2001 From: megacz Date: Fri, 30 Jan 2004 06:48:17 +0000 Subject: [PATCH] 2002/06/23 21:26:37 darcs-hash:20040130064817-2ba56-46cd3acb79c3a5dfb18fb0e111d32b593f87cedf.gz --- CHANGES | 3 +++ src/org/xwt/Box.java | 62 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/CHANGES b/CHANGES index 7507b93..4b08a3e 100644 --- a/CHANGES +++ b/CHANGES @@ -199,3 +199,6 @@ 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 + diff --git a/src/org/xwt/Box.java b/src/org/xwt/Box.java index e34fe98..1e9bcc0 100644 --- a/src/org/xwt/Box.java +++ b/src/org/xwt/Box.java @@ -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()); } -- 1.7.10.4