X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FBox.java.pp;h=aac3bd196cd4690675770af12365f30cc29121dd;hb=77e2780ea906def4d1f83e12e810ab68af2bbd54;hp=f48835d64c79c3ec6cc024ab719b66ce9385dd1c;hpb=fdb9f1c6460e6833e58d1f8b4d45fd21306b88c0;p=org.ibex.core.git diff --git a/src/org/xwt/Box.java.pp b/src/org/xwt/Box.java.pp index f48835d..aac3bd1 100644 --- a/src/org/xwt/Box.java.pp +++ b/src/org/xwt/Box.java.pp @@ -6,9 +6,6 @@ package org.xwt; // RULE: coordinates on non-static methods are ALWAYS relative to the // upper-left hand corner of this -// FIXME: font color, italicization, bolding, and underlining -// FIXME: align -// FIXME: fixed aspect // FEATURE: reflow before allowing js to read from width/height // FEATURE: fastpath for rows=1/cols=1 // FEATURE: reflow starting with a certain child @@ -19,7 +16,7 @@ import java.net.*; import java.util.*; import org.xwt.js.*; import org.xwt.util.*; -import org.xwt.imp.*; +import org.xwt.translators.*; /** *

@@ -62,7 +59,7 @@ import org.xwt.imp.*; * position. * * A note on coordinates: the Box class represents regions - * internally as x,y,w,h tuples, even though the DoubleBuffer class + * internally as x,y,w,h tuples, even though the PixelBuffer class * uses x1,y1,x2,y2 tuples. */ public final class Box extends JS.Scope { @@ -72,7 +69,7 @@ public final class Box extends JS.Scope { // Misc instance data //////////////////////////////////////////////////////////////// - private static int sizePosChangesSinceLastRender = 0; + static int sizePosChangesSinceLastRender = 0; // Misc instance data //////////////////////////////////////////////////////////////// @@ -85,30 +82,17 @@ public final class Box extends JS.Scope { Box redirect = this; Surface surface = null; // null on all non-root boxen - // FEATURE: combine this with the JSObject Hash - Hash traps = null; - - // Flags /////////////////////////////////////////////////////////////////////////////// + short flags = 0; static int MOUSEINSIDE_FLAG = 0x00000001; static int INVISIBLE_FLAG = 0x00000002; static int ABSOLUTE_FLAG = 0x00000004; - static int HSHRINK_FLAG = 0x00000010; - static int VSHRINK_FLAG = 0x00000020; - static int TILE_FLAG = 0x00000040; - - /** - * Set when the font changes, cleared during repack. If set - * during repack, all font==null children are marked for reflow - * and given the font_changed_flag. We use this flag to avoid - * having to iterate over all descendents of a box when its font - * changes. - */ - static int FONT_CHANGED_FLAG = 0x00000100; - - static int ALIGN_FLAG = 0x00000000; - static int FIXEDASPECT_FLAG = 0x00000000; - int flags = 0; + static int HSHRINK_FLAG = 0x00000008; + static int VSHRINK_FLAG = 0x00000010; + static int TILE_FLAG = 0x00000020; + static int FONT_CHANGED_FLAG = 0x00000040; // set when font changes, cleared during repack + static int ISROOT_FLAG = 0x00000080; + static int NOCLIP_FLAG = 0x00000100; // Geometry //////////////////////////////////////////////////////////////////////////// @@ -119,14 +103,15 @@ public final class Box extends JS.Scope { //#define MIN_LENGTH Integer.MIN_VALUE // always correct (set directly by user) - LENGTH minwidth = 0; - LENGTH minheight = 0; - LENGTH maxwidth = MAX_LENGTH; - LENGTH maxheight = MAX_LENGTH; + public LENGTH minwidth = 0; + public LENGTH minheight = 0; + public LENGTH maxwidth = MAX_LENGTH; + public LENGTH maxheight = MAX_LENGTH; private LENGTH hpad = 0; private LENGTH vpad = 0; private String text = null; - private String font = null; + private Res font = null; + private int fontsize = 10; private LENGTH textwidth = 0; private LENGTH textheight = 0; @@ -137,8 +122,8 @@ public final class Box extends JS.Scope { private int colspan = 1; // computed during reflow - LENGTH x = 0; - LENGTH y = 0; + public LENGTH x = 0; + public LENGTH y = 0; public LENGTH width = 0; public LENGTH height = 0; private int row = 0; // FEATURE use a short @@ -149,11 +134,11 @@ public final class Box extends JS.Scope { // Rendering Properties /////////////////////////////////////////////////////////// - //private SVG.VP path = null; + private VectorGraphics.VectorPath path = null; //private SVG.Paint fill = null; //private SVG.Paint stroke = null; - private Picture image; // will disappear + public Picture image; // will disappear private int fillcolor = 0x00000000; // will become SVG.Paint private int strokecolor = 0xFF000000; // will become SVG.Paint @@ -163,13 +148,18 @@ public final class Box extends JS.Scope { // Instance Methods ///////////////////////////////////////////////////////////////////// /** Adds the intersection of (x,y,w,h) and the node's current actual geometry to the Surface's dirty list */ - public final void dirty() { dirty(0, 0, width, height); } + public final void dirty() { + if ((flags & NOCLIP_FLAG) != 0 && parent != null) parent.dirty(); + else dirty(0, 0, width, height); + } public final void dirty(int x, int y, int w, int h) { for(Box cur = this; cur != null; cur = cur.parent) { - w = min(x + w, cur.width) - max(x, 0); - h = min(y + h, cur.height) - max(y, 0); - x = max(x, 0); - y = max(y, 0); + if ((flags & NOCLIP_FLAG) == 0) { + w = min(x + w, cur.width) - max(x, 0); + h = min(y + h, cur.height) - max(y, 0); + x = max(x, 0); + y = max(y, 0); + } if (w <= 0 || h <= 0) return; if (cur.parent == null && cur.surface != null) cur.surface.dirty(x, y, w, h); x += cur.x; @@ -193,10 +183,10 @@ public final class Box extends JS.Scope { if (!wasinside && !isinside) return; - if (traps == null) { } - else if (!wasinside && isinside && traps.get("Enter") != null) put("Enter", Boolean.TRUE); - else if (wasinside && !isinside && traps.get("Leave") != null) put("Leave", Boolean.TRUE); - else if (wasinside && isinside && (mousex != oldmousex || mousey != oldmousey) && traps.get("Move") != null) put("Move", Boolean.TRUE); + if (!wasinside && isinside && get("Enter", Trap.class) != null) put("Enter", Boolean.TRUE); + else if (wasinside && !isinside && get("Leave", Trap.class) != null) put("Leave", Boolean.TRUE); + else if (wasinside && isinside && (mousex != oldmousex || mousey != oldmousey) && get("Move", Trap.class) != null) + put("Move", Boolean.TRUE); if (isinside && cursor != null) getRoot().cursor = cursor; @@ -212,10 +202,11 @@ public final class Box extends JS.Scope { // Reflow //////////////////////////////////////////////////////////////////////////////////////// - void reflow() { + void reflow() { reflow(width, height); } + void reflow(int new_width, int new_height) { repack(); if (Surface.abort) return; - resize(x, y, width, height); + resize(x, y, new_width, new_height); } /** Checks if the Box's size has changed, dirties it if necessary, and makes sure childrens' sizes are up to date */ @@ -224,6 +215,10 @@ public final class Box extends JS.Scope { if (numChildren() == 0) { contentwidth = max(textwidth + 2 * hpad, minwidth); contentheight = max(textheight + 2 * vpad, minheight); + if (path != null) { + contentwidth = max(contentwidth, path.boundingBoxWidth()); + contentheight = max(contentheight, path.boundingBoxHeight()); + } return; } @@ -282,19 +277,23 @@ public final class Box extends JS.Scope { for(int col=0; col 0) while(slack > 0) { @@ -400,51 +399,57 @@ public final class Box extends JS.Scope { // Rendering Pipeline ///////////////////////////////////////////////////////////////////// /** Renders self and children within the specified region. All rendering operations are clipped to xIn,yIn,wIn,hIn */ - void render(int parentx, int parenty, int clipx, int clipy, int clipw, int cliph, DoubleBuffer buf) { + void render(int parentx, int parenty, int clipx, int clipy, int clipw, int cliph, PixelBuffer buf, VectorGraphics.Affine a) { if (Surface.abort || (flags & INVISIBLE_FLAG) != 0) return; int globalx = parentx + (parent == null ? 0 : x); int globaly = parenty + (parent == null ? 0 : y); // intersect the x,y,w,h rendering window with ourselves; quit if it's empty - clipw = min(max(clipx, parent == null ? 0 : globalx) + clipw, - (parent == null ? 0 : globalx) + width) - globalx; - cliph = min(max(clipy, parent == null ? 0 : globaly) + cliph, - (parent == null ? 0 : globaly) + height) - globaly; - clipx = max(clipx, parent == null ? 0 : globalx); - clipy = max(clipy, parent == null ? 0 : globaly); + if ((flags & NOCLIP_FLAG) == 0) { + clipw = min(max(clipx, parent == null ? 0 : globalx) + clipw, (parent == null ? 0 : globalx) + width) - globalx; + cliph = min(max(clipy, parent == null ? 0 : globaly) + cliph, (parent == null ? 0 : globaly) + height) - globaly; + clipx = max(clipx, parent == null ? 0 : globalx); + clipy = max(clipy, parent == null ? 0 : globaly); + } if (clipw <= 0 || cliph <= 0) return; - if ((fillcolor & 0xFF000000) != 0x00000000 || parent == null) - buf.fillRect(clipx, clipy, clipx + clipw, clipy + cliph, - (fillcolor & 0xFF000000) != 0 ? fillcolor : 0xFF777777); + if ((fillcolor & 0xFF000000) != 0x00000000) + buf.fillTrapezoid(clipx, clipx + clipw, clipy, clipx, clipx + clipw, clipy + cliph, fillcolor); if (image != null) if ((flags & TILE_FLAG) != 0) renderTiledImage(globalx, globaly, clipx, clipy, clipw, cliph, buf); else renderStretchedImage(globalx, globaly, clipx, clipy, clipw, cliph, buf); if (text != null && !text.equals("")) - renderText(x, y, clipx, clipy, clipw, cliph, buf); + renderText(globalx, globaly, clipx, clipy, clipw, cliph, buf); + + if (path != null) { + VectorGraphics.RasterPath rp = path.realize(a); + if ((strokecolor & 0xff000000) != 0) rp.stroke(buf, 1, strokecolor); + if ((fillcolor & 0xff000000) != 0) rp.fill(buf, new VectorGraphics.SingleColorPaint(fillcolor)); + } // now subtract the pad region from the clip region before proceeding - clipw = min(max(clipx, globalx + hpad) + clipw, globalx + width - hpad) - clipx; - cliph = min(max(clipy, globaly + vpad) + cliph, globaly + height - vpad) - clipy; - clipx = max(clipx, globalx + hpad); - clipy = max(clipy, globaly + vpad); + if ((flags & NOCLIP_FLAG) == 0) { + clipw = min(max(clipx, globalx + hpad) + clipw, globalx + width - hpad) - clipx; + cliph = min(max(clipy, globaly + vpad) + cliph, globaly + height - vpad) - clipy; + clipx = max(clipx, globalx + hpad); + clipy = max(clipy, globaly + vpad); + } - for(Box b = getChild(0); b != null; b = b.nextSibling()) - b.render(globalx, globaly, clipx, clipy, clipw, cliph, buf); + for(Box b = getChild(0); b != null; b = b.nextSibling()) { + a.translate(b.x, b.y); + b.render(globalx, globaly, clipx, clipy, clipw, cliph, buf, a); + a.translate(-1 * b.x, -1 * b.y); + } } - void renderStretchedImage(int globalx, int globaly, int x, int y, int w, int h, DoubleBuffer buf) { - buf.setClip(x, y, w + x, h + y); - buf.drawPicture(image, - globalx, globaly, - globalx + width, globaly + height, - 0, 0, image.getWidth(), image.getHeight()); - buf.setClip(0, 0, buf.getWidth(), buf.getHeight()); + void renderStretchedImage(int globalx, int globaly, int clipx, int clipy, int clipw, int cliph, PixelBuffer buf) { + // FIXME: wrong + buf.drawPicture(image, clipx, clipy, clipx + clipw, clipy + cliph, 0, 0, image.getWidth(), image.getHeight()); } - void renderTiledImage(int globalx, int globaly, int x, int y, int w, int h, DoubleBuffer buf) { + void renderTiledImage(int globalx, int globaly, int x, int y, int w, int h, PixelBuffer buf) { int iw = image.getWidth(); int ih = image.getHeight(); for(int i=(x - x)/iw; i <= (x + w - x)/iw; i++) { @@ -466,19 +471,20 @@ public final class Box extends JS.Scope { } } - void renderText(int x, int y, int clipx, int clipy, int clipw, int cliph, DoubleBuffer buf) { - try { - ImageDecoder id = org.xwt.imp.Font.render(new FileInputStream("COMIC.TTF"), 24, text, false); - Picture p = Platform.createPicture(id); - // FIXME: clipping (don't use setClip) - buf.drawPicture(p, - x + hpad, y + vpad, - x + hpad + p.getWidth(), y + vpad + p.getHeight(), + void renderText(int x, int y, int clipx, int clipy, int clipw, int cliph, PixelBuffer buf) { + for(int i=0; i