// FIXME
// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL]
-package org.ibex;
+package org.ibex.core;
// FIXME: are traps on x/y meaningful?
// FIXME: if we trap on cols, then set rows to 0 (forcing cols to 1), does the cols trap get triggered?
import java.util.*;
import org.ibex.js.*;
import org.ibex.util.*;
-import org.ibex.translators.*;
+import org.ibex.graphics.*;
/**
* <p>
* trigger a Surface.abort; if rendering were done in the same pass,
* rendering work done prior to the Surface.abort would be wasted.
*/
-public final class Box extends JSScope implements Scheduler.Task {
+public final class Box extends JSScope implements Task {
// Macros //////////////////////////////////////////////////////////////////////
//#define CHECKSET_BOOLEAN(prop) boolean nu = toBoolean(value); if (nu == prop) break; prop = nu;
//#define CHECKSET_STRING(prop) if ((value==null&&prop==null)||(value!=null&&JS.toString(value).equals(prop))) break; prop=JS.toString(value);
- protected Box() { super(null); }
+ public Box() { super(null); }
// FIXME memory leak
static Hash boxToCursor = new Hash(500, 3);
/*
private VectorGraphics.VectorPath path = null;
- private VectorGraphics.Affine transform = null;
+ private Affine transform = null;
private VectorGraphics.RasterPath rpath = null;
- private VectorGraphics.Affine rtransform = null;
+ private Affine rtransform = null;
*/
//#define DIRTY dirty()
// Reflow ////////////////////////////////////////////////////////////////////////////////////////
/** should only be invoked on the root box */
- void reflow() { pack(); resize(x, y, maxwidth, maxheight); place(); }
+ public void reflow() { pack(); resize(x, y, maxwidth, maxheight); place(); }
private static Box[] frontier = new Box[65535];
/** pack the boxes into rows and columns, compute contentwidth */
- void pack() {
+ public void pack() {
if (!test(REPACK)) { constrain(); return; }
boolean haskid = false;
for(Box child = getChild(0); child != null; child = child.nextSibling()) { haskid = true; child.pack(); }
// 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 cx1, int cy1, int cx2, int cy2, PixelBuffer buf, VectorGraphics.Affine a) {
+ public void render(int parentx, int parenty, int cx1, int cy1, int cx2, int cy2, PixelBuffer buf, Affine a) {
if (!test(VISIBLE)) return;
int globalx = parentx + (parent == null ? 0 : x);
int globaly = parenty + (parent == null ? 0 : y);
case "distanceto": return METHOD;
case "text": return text;
case "path": throw new JSExn("cannot read from the path property");
- case "fill": return colorToString(fillcolor);
- case "strokecolor": return colorToString(strokecolor);
- case "textcolor": return colorToString(strokecolor);
+ case "fill": return Color.colorToString(fillcolor);
+ case "strokecolor": return Color.colorToString(strokecolor);
+ case "textcolor": return Color.colorToString(strokecolor);
case "font": return font == null ? null : font.stream;
case "fontsize": return font == null ? N(10) : N(font.pointsize);
case "strokewidth": return N(strokewidth);
//#switch(name)
case "thisbox": if (value == null) removeSelf();
case "text": if (value == null) value = ""; CHECKSET_STRING(text); RECONSTRAIN(); DIRTY;
- case "strokecolor": value = N(stringToColor((String)value)); CHECKSET_INT(strokecolor); DIRTY;
- case "textcolor": value = N(stringToColor((String)value)); CHECKSET_INT(strokecolor); DIRTY;
+ case "strokecolor": value = N(Color.stringToColor((String)value)); CHECKSET_INT(strokecolor); DIRTY;
+ case "textcolor": value = N(Color.stringToColor((String)value)); CHECKSET_INT(strokecolor); DIRTY;
case "strokewidth": CHECKSET_SHORT(strokewidth); DIRTY;
case "shrink": CHECKSET_FLAG(HSHRINK | VSHRINK); RECONSTRAIN();
case "hshrink": CHECKSET_FLAG(HSHRINK); RECONSTRAIN();
texture = null;
fillcolor = 0;
} else if (value instanceof String) {
- int newfillcolor = stringToColor((String)value);
+ int newfillcolor = Color.stringToColor((String)value);
if (newfillcolor == fillcolor) return;
fillcolor = newfillcolor;
texture = null;
putAndTriggerTrapsAndCatchExceptions(name.substring(1), value);
}
- private static int stringToColor(String s) {
- // FIXME support three-char strings by doubling digits
- if (s == null) return 0x00000000;
- else if (SVG.colors.get(s) != null) return 0xFF000000 | toInt(SVG.colors.get(s));
- else if (s.length() == 7 && s.charAt(0) == '#') try {
- // FEATURE alpha
- return 0xFF000000 |
- (Integer.parseInt(s.substring(1, 3), 16) << 16) |
- (Integer.parseInt(s.substring(3, 5), 16) << 8) |
- Integer.parseInt(s.substring(5, 7), 16);
- } catch (NumberFormatException e) {
- Log.info(Box.class, "invalid color " + s);
- return 0;
- }
- else return 0; // FEATURE: error?
- }
-
- private static String colorToString(int argb) {
- if ((argb & 0xFF000000) == 0) return null;
- String red = Integer.toHexString((argb & 0x00FF0000) >> 16);
- String green = Integer.toHexString((argb & 0x0000FF00) >> 8);
- String blue = Integer.toHexString(argb & 0x000000FF);
- if (red.length() < 2) red = "0" + red;
- if (blue.length() < 2) blue = "0" + blue;
- if (green.length() < 2) green = "0" + green;
- return "#" + red + green + blue;
- }
-
/** figures out what box in this subtree of the Box owns the pixel at x,y relitave to the Surface */
public static Box whoIs(Box cur, int x, int y) {
// Tree Manipulation /////////////////////////////////////////////////////////////////////
- void removeSelf() {
+ public void removeSelf() {
if (parent != null) { parent.removeChild(parent.indexNode(this)); return; }
Surface surface = Surface.fromBox(this);
if (surface != null) surface.dispose(true);
putAndTriggerTrapsAndCatchExceptions("ChildChange", b);
}
}
-
- void putAndTriggerTrapsAndCatchExceptions(Object name, Object val) {
+
+ public void putAndTriggerTrapsAndCatchExceptions(Object name, Object val) {
try {
putAndTriggerTraps(name, val);
} catch (JSExn e) {