Ver código fonte

adds border support (contributed by Jon Smirl) also to the awt rendering (Jon Smirl, Fotis Jannidis)


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193300 13f79535-47bb-0310-9956-ffa450edef68
pull/42/head
fotis 24 anos atrás
pai
commit
bff487e55c
1 arquivos alterados com 274 adições e 180 exclusões
  1. 274
    180
      src/org/apache/fop/render/awt/AWTRenderer.java

+ 274
- 180
src/org/apache/fop/render/awt/AWTRenderer.java Ver arquivo

@@ -9,7 +9,6 @@ package org.apache.fop.render.awt;
Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de
*/


import org.apache.fop.layout.*;
import org.apache.fop.datatypes.*;
import org.apache.fop.image.*;
@@ -18,9 +17,6 @@ import org.apache.fop.render.pdf.*;
import org.apache.fop.viewer.*;
import org.apache.fop.apps.*;




import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
@@ -45,17 +41,16 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P

protected Hashtable fontNames = new Hashtable();
protected Hashtable fontStyles = new Hashtable();
protected Color saveColor;


// Key - Font name, Value - java Font name.
protected static Hashtable JAVA_FONT_NAMES;


protected Graphics2D graphics = null;

protected DocumentPanel documentPanel = null;


/** the current (internal) font name */
protected String currentFontName;

@@ -83,7 +78,6 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P

// String oldFontName = null;


static {
JAVA_FONT_NAMES = new Hashtable();
JAVA_FONT_NAMES.put("Times", "serif");
@@ -93,7 +87,6 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
// JAVA_FONT_NAMES.put("Serif", "sansserif");
}


public AWTRenderer(Translator aRes) {
res = aRes;
}
@@ -130,6 +123,63 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
}


/**
* add a line to the current stream
*
* @param x1 the start x location in millipoints
* @param y1 the start y location in millipoints
* @param x2 the end x location in millipoints
* @param y2 the end y location in millipoints
* @param th the thickness in millipoints
* @param r the red component
* @param g the green component
* @param b the blue component
*/
protected void addLine(int x1, int y1, int x2, int y2, int th,
float r, float g, float b) {
graphics.setColor(new Color (r,g,b));
graphics.drawLine((int)(x1/1000f), pageHeight - (int)(y1/1000f), (int)(x2/1000f), pageHeight - (int)(y2/1000f));
}


/**
* draw a filled rectangle
*
* @param x the x position of left edge in millipoints
* @param y the y position of top edge in millipoints
* @param w the width in millipoints
* @param h the height in millipoints
* @param r the red component
* @param g the green component
* @param b the blue component
*/
protected void addRect(int x, int y, int w, int h,
float r, float g, float b) {
graphics.setColor(new Color (r,g,b));
graphics.fill3DRect((int) (x/1000f),pageHeight - (int) (y/1000f),(int) (w/1000f),-(int) (h/1000f),false);
}

/**
* draw a filled rectangle
*
* @param x the x position of left edge in millipoints
* @param y the y position of top edge in millipoints
* @param w the width in millipoints
* @param h the height in millipoints
* @param r the red component of edges
* @param g the green component of edges
* @param b the blue component of edges
* @param fr the red component of the fill
* @param fg the green component of the fill
* @param fb the blue component of the fill
*/
protected void addRect(int x, int y, int w, int h,
float r, float g, float b,
float fr, float fg, float fb) {
graphics.setColor(new Color (r,g,b));
graphics.fill3DRect((int) (x/1000f),pageHeight - (int) (y/1000f),(int) (w/1000f),-(int) (h/1000f),true);
}

/**
* Vor dem Druck einzustellen:
*
@@ -158,7 +208,6 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P

graphics.drawLine(0, height+2, width+2, height+2);
graphics.drawLine(1, height+3, width+3, height+3);

}


@@ -184,74 +233,122 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
}

public void renderPage(Page page) {
AreaContainer body, before, after;

body = page.getBody();
before = page.getBefore();
after = page.getAfter();
AreaContainer body, before, after;

this.currentFontName = "";
this.currentFontSize = 0;
body = page.getBody();
before = page.getBefore();
after = page.getAfter();

renderAreaContainer(body);
this.currentFontName = "";
this.currentFontSize = 0;

if (before != null) {
renderAreaContainer(before);
}
renderAreaContainer(body);

if (after != null) {
renderAreaContainer(after);
}
if (before != null) {
renderAreaContainer(before);
}

if (after != null) {
renderAreaContainer(after);
}
}


public void renderAreaContainer(AreaContainer area) {

int saveY = this.currentYPosition;
int saveX = this.currentAreaContainerXPosition;

if (area.getPosition() == org.apache.fop.fo.properties.Position.ABSOLUTE) {
// Y position is computed assuming positive Y axis, adjust for negative postscript one
this.currentYPosition = area.getYPosition() - 2 * area.getPaddingTop() - 2 * area.borderWidthTop;
this.currentAreaContainerXPosition = area.getXPosition();
} else if (area.getPosition() == org.apache.fop.fo.properties.Position.RELATIVE) {
this.currentYPosition -= area.getYPosition();
this.currentAreaContainerXPosition += area.getXPosition();
} else if (area.getPosition() == org.apache.fop.fo.properties.Position.STATIC) {
this.currentYPosition -= area.getPaddingTop() + area.borderWidthTop;
this.currentAreaContainerXPosition += area.getPaddingLeft() + area.borderWidthLeft;
}

doFrame(area);

this.currentYPosition = area.getYPosition();
this.currentAreaContainerXPosition = area.getXPosition();
Enumeration e = area.getChildren().elements();
while (e.hasMoreElements()) {
org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
b.render(this);
}

Enumeration e = area.getChildren().elements();
while (e.hasMoreElements()) {
org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
b.render(this);
}
if (area.getPosition() != org.apache.fop.fo.properties.Position.STATIC) {
this.currentYPosition = saveY;
this.currentAreaContainerXPosition = saveX;
} else {
this.currentYPosition -= area.getHeight();
}
}

private void doFrame(org.apache.fop.layout.Area area) {
int w, h;
int rx = this.currentAreaContainerXPosition;
w = area.getContentWidth();
if (area instanceof BlockArea)
rx += ((BlockArea)area).getStartIndent();
h = area.getContentHeight();
int ry = this.currentYPosition;
ColorType bg = area.getBackgroundColor();

rx = rx - area.getPaddingLeft();
ry = ry + area.getPaddingTop();
w = w + area.getPaddingLeft() + area.getPaddingRight();
h = h + area.getPaddingTop() + area.getPaddingBottom();

// I'm not sure I should have to check for bg being null
// but I do
if ((bg != null) && (bg.alpha() == 0)) {
this.addRect(rx, ry, w, -h,
bg.red(), bg.green(), bg.blue(),
bg.red(), bg.green(), bg.blue());
}

rx = rx - area.borderWidthLeft;
ry = ry + area.borderWidthTop;
w = w + area.borderWidthLeft + area.borderWidthRight;
h = h + area.borderWidthTop + area.borderWidthBottom;

if (area.borderWidthTop != 0)
addLine(rx, ry, rx + w, ry,
area.borderWidthTop,
area.borderColorTop.red(), area.borderColorTop.green(), area.borderColorTop.blue());
if (area.borderWidthLeft != 0)
addLine(rx, ry, rx, ry - h,
area.borderWidthLeft,
area.borderColorLeft.red(), area.borderColorLeft.green(), area.borderColorLeft.blue());
if (area.borderWidthRight != 0)
addLine(rx + w, ry, rx + w, ry - h,
area.borderWidthRight,
area.borderColorRight.red(), area.borderColorRight.green(), area.borderColorRight.blue());
if (area.borderWidthBottom != 0)
addLine(rx, ry - h, rx + w, ry - h,
area.borderWidthBottom,
area.borderColorBottom.red(), area.borderColorBottom.green(), area.borderColorBottom.blue());
}



protected Rectangle2D getBounds(org.apache.fop.layout.Area a) {
return new Rectangle2D.Double(currentAreaContainerXPosition,
currentYPosition,
a.getAllocationWidth(),
a.getHeight());
currentYPosition,
a.getAllocationWidth(),
a.getHeight());
}

public void renderBlockArea(BlockArea area) {
int rx = this.currentAreaContainerXPosition
+ area.getStartIndent();
int ry = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();
ColorType bg = area.getBackgroundColor();
if ((bg != null) && (bg.alpha() == 0)) {
Color oldColor = graphics.getColor();
// Color bgColor = new Color(bg.red(), bg.green(), bg.blue());
Color bgColor = colorType2Color(bg);
graphics.setColor(bgColor);
graphics.fillRect((int)(rx / 1000f), (int)(pageHeight - ry/ 1000f),
(int)(w / 1000f), (int)(h / 1000f));
graphics.setColor(oldColor);
public void renderBlockArea(BlockArea area) {
doFrame(area);
Enumeration e = area.getChildren().elements();
while (e.hasMoreElements()) {
org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
b.render(this);
}

Enumeration e = area.getChildren().elements();
while (e.hasMoreElements()) {
org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
b.render(this);
}
}

}

public void setupFontInfo(FontInfo fontInfo) {
FontSetup.setup(fontInfo);
@@ -286,77 +383,76 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P



public void renderDisplaySpace(DisplaySpace space) {
int d = space.getSize();
this.currentYPosition -= d;
}

public void renderDisplaySpace(DisplaySpace space) {
int d = space.getSize();
this.currentYPosition -= d;
}

public void renderImageArea(ImageArea area) {
int x = this.currentAreaContainerXPosition +
area.getXOffset();
int y = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();

public void renderImageArea(ImageArea area) {
int x = this.currentAreaContainerXPosition +
area.getXOffset();
int y = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();

FopImage img = area.getImage();
FopImage img = area.getImage();

if (img == null) {
System.out.println("area.getImage() is null");
}
if (img == null) {
System.out.println("area.getImage() is null");
}

int[] map = img.getimagemap();
int[] map = img.getimagemap();

String path = img.gethref();
// path = "c:/any.gif";
String path = img.gethref();
// path = "c:/any.gif";

ImageIcon icon = new ImageIcon(path);
ImageIcon icon = new ImageIcon(path);

Image imgage = icon.getImage();
Image imgage = icon.getImage();

graphics.drawImage(imgage, currentXPosition / 1000,
pageHeight - y / 1000,
img.getWidth() / 1000,
img.getHeight() / 1000,
null);
graphics.drawImage(imgage, currentXPosition / 1000,
pageHeight - y / 1000,
img.getWidth() / 1000,
img.getHeight() / 1000,
null);

currentYPosition -= h;
}
currentYPosition -= h;
}




public void renderInlineArea(InlineArea area) {
char ch;
StringBuffer pdf = new StringBuffer();
char ch;
StringBuffer pdf = new StringBuffer();

String name = area.getFontState().getFontName();
int size = area.getFontState().getFontSize();
String name = area.getFontState().getFontName();
int size = area.getFontState().getFontSize();

float red = area.getRed();
float green = area.getGreen();
float blue = area.getBlue();
float red = area.getRed();
float green = area.getGreen();
float blue = area.getBlue();

if ((!name.equals(this.currentFontName))
|| (size != this.currentFontSize)) {
this.currentFontName = name;
this.currentFontSize = size;
}
if ((!name.equals(this.currentFontName))
|| (size != this.currentFontSize)) {
this.currentFontName = name;
this.currentFontSize = size;
}

if ((red != this.currentRed)
|| (green != this.currentGreen)
|| (blue != this.currentBlue)) {
this.currentRed = red;
this.currentGreen = green;
this.currentBlue = blue;
}
if ((red != this.currentRed)
|| (green != this.currentGreen)
|| (blue != this.currentBlue)) {
this.currentRed = red;
this.currentGreen = green;
this.currentBlue = blue;
}

int rx = this.currentXPosition;
int bl = this.currentYPosition;
int rx = this.currentXPosition;
int bl = this.currentYPosition;


String s = area.getText();
String s = area.getText();
Color oldColor = graphics.getColor();
java.awt.Font oldFont = graphics.getFont();
String aFontName = fontNames.get(name).toString();
@@ -390,50 +486,51 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
graphics.setColor(oldColor);


this.currentXPosition += area.getContentWidth();
}
this.currentXPosition += area.getContentWidth();
}

public void renderInlineSpace(InlineSpace space) {
this.currentXPosition += space.getSize();
}

public void renderInlineSpace(InlineSpace space) {
this.currentXPosition += space.getSize();
}

public void renderLineArea(LineArea area) {
int rx = this.currentAreaContainerXPosition
+ area.getStartIndent();
int ry = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();

this.currentYPosition -= area.getPlacementOffset();
this.currentXPosition = rx;
public void renderLineArea(LineArea area) {
int rx = this.currentAreaContainerXPosition
+ area.getStartIndent();
int ry = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();

int bl = this.currentYPosition;
this.currentYPosition -= area.getPlacementOffset();
this.currentXPosition = rx;

Enumeration e = area.getChildren().elements();
while (e.hasMoreElements()) {
org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
b.render(this);
}
int bl = this.currentYPosition;

this.currentYPosition = ry-h;
Enumeration e = area.getChildren().elements();
while (e.hasMoreElements()) {
org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
b.render(this);
}

/**
* render rule area into PDF
*
* @param area area to render
*/
public void renderRuleArea(RuleArea area) {
int rx = this.currentAreaContainerXPosition
+ area.getStartIndent();
int ry = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();
int th = area.getRuleThickness();
float r = area.getRed();
float g = area.getGreen();
float b = area.getBlue();
this.currentYPosition = ry-h;
}

/**
* render rule area into PDF
*
* @param area area to render
*/
public void renderRuleArea(RuleArea area) {
int rx = this.currentAreaContainerXPosition
+ area.getStartIndent();
int ry = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();
int th = area.getRuleThickness();
float r = area.getRed();
float g = area.getGreen();
float b = area.getBlue();


Color oldColor = graphics.getColor();
@@ -444,42 +541,42 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
(int)(w / 1000f), (int)(th / 1000f));
graphics.setColor(oldColor);

}
}


public void renderSVGArea(SVGArea area) {
int x = this.currentAreaContainerXPosition;
int y = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();
this.currentYPosition -= h;
/*
Enumeration e = area.getChildren().elements();
while (e.hasMoreElements()) {
Object o = e.nextElement();
if (o instanceof RectGraphic) {
int rx = ((RectGraphic)o).x;
int ry = ((RectGraphic)o).y;
int rw = ((RectGraphic)o).width;
int rh = ((RectGraphic)o).height;
addRect(x+rx,y-ry,rw,-rh,0,0,0);
} else if (o instanceof LineGraphic) {
int x1 = ((LineGraphic)o).x1;
int y1 = ((LineGraphic)o).y1;
int x2 = ((LineGraphic)o).x2;
int y2 = ((LineGraphic)o).y2;
addLine(x+x1,y-y1,x+x2,y-y2,0,0,0,0);
} else if (o instanceof TextGraphic) {
int tx = ((TextGraphic)o).x;
int ty = ((TextGraphic)o).y;
String s = ((TextGraphic)o).s;
currentStream.add("1 0 0 1 "
+ ((x+tx)/1000f) + " "
+ ((y-ty)/1000f) + " Tm "
+ "(" + s + ") Tj\n");
}
} */
}
public void renderSVGArea(SVGArea area) {
int x = this.currentAreaContainerXPosition;
int y = this.currentYPosition;
int w = area.getContentWidth();
int h = area.getHeight();
this.currentYPosition -= h;
/*
Enumeration e = area.getChildren().elements();
while (e.hasMoreElements()) {
Object o = e.nextElement();
if (o instanceof RectGraphic) {
int rx = ((RectGraphic)o).x;
int ry = ((RectGraphic)o).y;
int rw = ((RectGraphic)o).width;
int rh = ((RectGraphic)o).height;
addRect(x+rx,y-ry,rw,-rh,0,0,0);
} else if (o instanceof LineGraphic) {
int x1 = ((LineGraphic)o).x1;
int y1 = ((LineGraphic)o).y1;
int x2 = ((LineGraphic)o).x2;
int y2 = ((LineGraphic)o).y2;
addLine(x+x1,y-y1,x+x2,y-y2,0,0,0,0);
} else if (o instanceof TextGraphic) {
int tx = ((TextGraphic)o).x;
int ty = ((TextGraphic)o).y;
String s = ((TextGraphic)o).s;
currentStream.add("1 0 0 1 "
+ ((x+tx)/1000f) + " "
+ ((y-ty)/1000f) + " Tm "
+ "(" + s + ") Tj\n");
}
} */
}



@@ -543,14 +640,11 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
}

public static Color colorType2Color(ColorType ct) {
if (ct == null)
if (ct == null) {
return null;
}
return new Color(ct.red(), ct.green(), ct.blue());
}

}






Carregando…
Cancelar
Salvar