* (1-bit) bitmap image.
* @param img the bitmap image
* @param targetDim the target Dimention (in mpt)
+ * @param sourceTransparency true if the background should not be erased
* @throws IOException In case of an I/O error
*/
- public void paintBitmap(RenderedImage img, Dimension targetDim) throws IOException {
+ public void paintBitmap(RenderedImage img, Dimension targetDim, boolean sourceTransparency)
+ throws IOException {
double targetResolution = img.getWidth() / UnitConv.mpt2in(targetDim.width);
int resolution = (int)Math.round(targetResolution);
int effResolution = calculatePCLResolution(resolution, true);
RenderedImage red = buf;
selectCurrentPattern(0, 0); //Solid black
- setTransparencyMode(mask != null, true);
+ setTransparencyMode(sourceTransparency || mask != null, true);
paintMonochromeBitmap(red, effResolution);
} else {
//TODO untested!
}
effImg = buf;
}
- setSourceTransparencyMode(false);
+ setSourceTransparencyMode(sourceTransparency);
selectCurrentPattern(0, 0); //Solid black
paintMonochromeBitmap(effImg, effResolution);
}
/** The MIME type for PCL */
public static final String MIME_TYPE = MimeConstants.MIME_PCL_ALT;
+ private static final QName CONV_MODE
+ = new QName(ExtensionElementMapping.URI, null, "conversion-mode");
+ private static final QName SRC_TRANSPARENCY
+ = new QName(ExtensionElementMapping.URI, null, "source-transparency");
+
/** The OutputStream to write the PCL stream to */
protected OutputStream out;
RendererContext rc = createRendererContext(paintRect.x, paintRect.y,
paintRect.width, paintRect.height, null);
Map atts = new java.util.HashMap();
- atts.put(new QName(ExtensionElementMapping.URI, null, "conversion-mode"), "bitmap");
+ atts.put(CONV_MODE, "bitmap");
+ atts.put(SRC_TRANSPARENCY, "true");
rc.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, atts);
Graphics2DImagePainter painter = new Graphics2DImagePainter() {
try {
setCursorPos(this.currentIPPosition + (int)pos.getX(),
this.currentBPPosition + (int)pos.getY());
- gen.paintBitmap(img, new Dimension((int)pos.getWidth(), (int)pos.getHeight()));
+ gen.paintBitmap(img,
+ new Dimension((int)pos.getWidth(), (int)pos.getHeight()),
+ false);
} catch (IOException ioe) {
handleIOTrouble(ioe);
}
final Rectangle.Float effBorderRect = new Rectangle2D.Float(
borderRect.x - (currentIPPosition / 1000f),
borderRect.y - (currentBPPosition / 1000f),
- borderRect.width, borderRect.height);
+ borderRect.width,
+ borderRect.height);
final Rectangle paintRect = new Rectangle(
- (int)Math.round(borderRect.x * 1000),
- (int)Math.round(borderRect.y * 1000),
- (int)Math.floor(borderRect.width * 1000) + 1,
- (int)Math.floor(borderRect.height * 1000) + 1);
- int xoffset = (bpsStart != null ? bpsStart.width : 0);
+ (int)Math.round(borderRect.x * 1000f),
+ (int)Math.round(borderRect.y * 1000f),
+ (int)Math.floor(borderRect.width * 1000f) + 1,
+ (int)Math.floor(borderRect.height * 1000f) + 1);
+ //Add one pixel wide safety margin around the paint area
+ int pixelWidth = (int)Math.round(UnitConv.in2mpt(1) / userAgent.getTargetResolution());
+ final int xoffset = (bpsStart != null ? bpsStart.width : 0) + pixelWidth;
+ final int yoffset = pixelWidth;
paintRect.x += xoffset;
- paintRect.width += xoffset;
- paintRect.width += (bpsEnd != null ? bpsEnd.width : 0);
+ paintRect.y += yoffset;
+ paintRect.width += 2 * pixelWidth;
+ paintRect.height += 2 * pixelWidth;
RendererContext rc = createRendererContext(paintRect.x, paintRect.y,
paintRect.width, paintRect.height, null);
- if (false) {
- Map atts = new java.util.HashMap();
- atts.put(new QName(ExtensionElementMapping.URI, null, "conversion-mode"), "bitmap");
- rc.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, atts);
- }
+ Map atts = new java.util.HashMap();
+ atts.put(CONV_MODE, "bitmap");
+ atts.put(SRC_TRANSPARENCY, "true");
+ rc.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, atts);
Graphics2DImagePainter painter = new Graphics2DImagePainter() {
public void paint(Graphics2D g2d, Rectangle2D area) {
- g2d.translate((bpsStart != null ? bpsStart.width : 0), 0);
+ g2d.translate(xoffset, yoffset);
g2d.scale(1000, 1000);
float startx = effBorderRect.x;
float starty = effBorderRect.y;