X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FBox.java.pp;h=73524f70ae4a5e1e1c11ba6ad06d762b51b88a1a;hb=2f02c1815b096a837b7ee70eb6d775ee959525c8;hp=85b143e42d0e047e3f11596c5473122a9982a999;hpb=0373b49c4640afde70d852f2531e46b19260554f;p=org.ibex.core.git diff --git a/src/org/xwt/Box.java.pp b/src/org/xwt/Box.java.pp index 85b143e..73524f7 100644 --- a/src/org/xwt/Box.java.pp +++ b/src/org/xwt/Box.java.pp @@ -135,12 +135,14 @@ public final class Box extends JS.Scope { // Rendering Properties /////////////////////////////////////////////////////////// private VectorGraphics.VectorPath path = null; - //private SVG.Paint fill = null; - //private SVG.Paint stroke = null; + private VectorGraphics.Affine transform = null; + //private VectorGraphics.Paint fill = null; + //private VectorGraphics.Paint stroke = null; + int strokewidth = 1; public Picture image; // will disappear - private int fillcolor = 0x00000000; // will become SVG.Paint - private int strokecolor = 0xFF000000; // will become SVG.Paint + private int fillcolor = 0x00000000; // will become VectorGraphics.Paint + private int strokecolor = 0xFF000000; // will become VectorGraphics.Paint private String cursor = null; // the cursor for this box @@ -476,13 +478,14 @@ public final class Box extends JS.Scope { // FIXME: clipping char c = text.charAt(i); Glyph g = Glyph.getGlyph(font, fontsize, c); - buf.drawPicture(g.p, - x + hpad, - y + vpad + g.max_ascent - g.baseline, - x + hpad + g.p.getWidth(), - y + vpad + g.max_ascent - g.baseline + g.p.getHeight(), - 0, 0, - g.p.getWidth(), g.p.getHeight()); + buf.drawPictureAlphaOnly(g.p, + x + hpad, + y + vpad + g.max_ascent - g.baseline, + x + hpad + g.p.getWidth(), + y + vpad + g.max_ascent - g.baseline + g.p.getHeight(), + 0, 0, + g.p.getWidth(), g.p.getHeight(), + strokecolor); x += g.advance; } } @@ -524,6 +527,7 @@ public final class Box extends JS.Scope { if (Log.on) Log.logJS(this, "attempt to set a numerical property on a box to anything other than a box"); } else if (redirect == null) { if (Log.on) Log.logJS(this, "attempt to add/remove children to/from a node with a null redirect"); + put("0", (Box)value); } else if (redirect != this) { Box b = value == null ? (Box)redirect.get(i) : (Box)value; redirect.put(i, value); @@ -950,6 +954,74 @@ public final class Box extends JS.Scope { b.dirty(); } }); + specialBoxProperties.put("transform", new SpecialBoxProperty() { + public void put(Box b, Object value) { + String t = value.toString().trim(); + b.transform = VectorGraphics.Affine.identity(); + while (t.length() > 0) { + if (t.startsWith("skewX(")) { + // FIXME + + } else if (t.startsWith("shear(")) { + // FIXME: nonstandard; remove this + b.transform.multiply(VectorGraphics.Affine.shear(Float.parseFloat(t.substring(t.indexOf('(') + 1, t.indexOf(')'))))); + + } else if (t.startsWith("skewY(")) { + // FIXME + + } else if (t.startsWith("rotate(")) { + String sub = t.substring(t.indexOf('(') + 1, t.indexOf(')')); + if (sub.indexOf(',') != -1) { + float angle = Float.parseFloat(sub.substring(0, sub.indexOf(','))); + sub = sub.substring(sub.indexOf(',') + 1); + float cx = Float.parseFloat(sub.substring(0, sub.indexOf(','))); + sub = sub.substring(sub.indexOf(',') + 1); + float cy = Float.parseFloat(sub); + b.transform.multiply(VectorGraphics.Affine.translate(cx, cy)); + b.transform.multiply(VectorGraphics.Affine.rotate(angle)); + b.transform.multiply(VectorGraphics.Affine.translate(-1 * cx, -1 * cy)); + } else { + b.transform.multiply(VectorGraphics.Affine.rotate(Float.parseFloat(t.substring(t.indexOf('(') + 1, t.indexOf(')'))))); + } + + } else if (t.startsWith("translate(")) { + String sub = t.substring(t.indexOf('(') + 1, t.indexOf(')')); + if (sub.indexOf(',') > -1) { + b.transform.multiply(VectorGraphics.Affine.translate(Float.parseFloat(t.substring(t.indexOf('(') + 1, t.indexOf(','))), + Float.parseFloat(t.substring(t.indexOf(',') + 1, t.indexOf(')'))))); + } else { + b.transform.multiply(VectorGraphics.Affine.translate(Float.parseFloat(t.substring(t.indexOf('(') + 1, t.indexOf(','))), 0)); + } + + } else if (t.startsWith("flip(")) { + String which = t.substring(t.indexOf('(') + 1, t.indexOf(')')); + b.transform.multiply(VectorGraphics.Affine.flip(which.equals("horizontal"), which.equals("vertical"))); + + } else if (t.startsWith("scale(")) { + String sub = t.substring(t.indexOf('(') + 1, t.indexOf(')')); + if (sub.indexOf(',') > -1) { + b.transform.multiply(VectorGraphics.Affine.scale(Float.parseFloat(t.substring(t.indexOf('(') + 1, t.indexOf(','))), + Float.parseFloat(t.substring(t.indexOf(',') + 1, t.indexOf(')'))))); + } else { + b.transform.multiply(VectorGraphics.Affine.scale(Float.parseFloat(t.substring(t.indexOf('(') + 1, t.indexOf(','))), + Float.parseFloat(t.substring(t.indexOf('(') + 1, t.indexOf(','))))); + } + + } else if (t.startsWith("matrix(")) { + // FIXME: is this mapped right? + float d[] = new float[6]; + StringTokenizer st = new StringTokenizer(t, ",", false); + for(int i=0; i<6; i++) + d[i] = Float.parseFloat(st.nextToken()); + b.transform.multiply(new VectorGraphics.Affine(d[0], d[1], d[2], d[3], d[4], d[5])); + } + t = t.substring(t.indexOf(')') + 1).trim(); + } + b.dirty(); + } + public Object get(Box b) { return b.transform.toString(); } + }); + specialBoxProperties.put("font", new SpecialBoxProperty() { public Object get(Box b) { return b.font; } public void put(Box b, Object value) { @@ -970,6 +1042,14 @@ public final class Box extends JS.Scope { b.dirty(); } }); + specialBoxProperties.put("strokewidth", new SpecialBoxProperty() { + public Object get(Box b) { return new Integer(b.strokewidth); } + public void put(Box b, Object value) { + if (b.strokewidth == stoi(value)) return; + b.strokewidth = stoi(value); + b.dirty(); + } }); + specialBoxProperties.put("thisbox", new SpecialBoxProperty() { public Object get(Box b) { return b; } public void put(Box b, Object value) { @@ -1004,10 +1084,6 @@ public final class Box extends JS.Scope { MARK_FOR_REFLOW_b; } }); - //FIXME - specialBoxProperties.put("static", new SpecialBoxProperty() { - }); - specialBoxProperties.put("shrink", new SpecialBoxProperty() { public Object get(Box b) { return (((b.flags & HSHRINK_FLAG) != 0) || ((b.flags & VSHRINK_FLAG) != 0)) ? Boolean.TRUE : Boolean.FALSE; } public void put(Box b, Object value) { b.put("hshrink", value); b.put("vshrink", value); }