X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FBox.java.pp;h=c566a017e142fc0139e8ee55cff33fb6599bfdd8;hb=3c68ab103101636952799709c5a5b635d3cc214b;hp=7a4fc728099dc0f9a63efe83aeee3e68c5ae5437;hpb=f4ff7c16a3b69784da7f66f6ff1be899b4a5f508;p=org.ibex.core.git diff --git a/src/org/xwt/Box.java.pp b/src/org/xwt/Box.java.pp index 7a4fc72..c566a01 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; } } @@ -951,17 +954,75 @@ public final class Box extends JS.Scope { b.dirty(); } }); - specialBoxProperties.put("font", new SpecialBoxProperty() { - public Object get(Box b) { return b.font; } + specialBoxProperties.put("transform", new SpecialBoxProperty() { public void put(Box b, Object value) { - // FIXME: translate value into a resource if it is a string - b.font = value == null ? null : (Res)value; - MARK_FOR_REFLOW_b; - b.flags |= FONT_CHANGED_FLAG; + 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(); - } }); - - specialBoxProperties.put("transform", new SpecialBoxProperty() { + } + 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) { // FIXME: translate value into a resource if it is a string @@ -982,7 +1043,7 @@ public final class Box extends JS.Scope { } }); specialBoxProperties.put("strokewidth", new SpecialBoxProperty() { - public Object get(Box b) { return b.strokewidth; } + 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);