in src/main/java/org/apache/xmlgraphics/ps/PSImageUtils.java [537:604]
protected static PSResource writeReusableImage(ImageEncoder encoder,
Dimension imgDim,
String formName, String imageDescription,
ColorSpace colorSpace, boolean invertImage,
PSGenerator gen) throws IOException {
if (gen.getPSLevel() < 2) {
throw new UnsupportedOperationException(
"Reusable images requires at least Level 2 PostScript");
}
String dataName = formName + ":Data";
gen.writeDSCComment(DSCConstants.BEGIN_RESOURCE, formName);
if (imageDescription != null) {
gen.writeDSCComment(DSCConstants.TITLE, imageDescription);
}
String additionalFilters;
String implicitFilter = encoder.getImplicitFilter();
if (implicitFilter != null) {
additionalFilters = "/ASCII85Decode filter " + implicitFilter + " filter";
} else {
if (gen.getPSLevel() >= 3) {
additionalFilters = "/ASCII85Decode filter /FlateDecode filter";
} else {
additionalFilters = "/ASCII85Decode filter /RunLengthDecode filter";
}
}
gen.writeln("/" + formName);
gen.writeln("<< /FormType 1");
gen.writeln(" /BBox [0 0 " + imgDim.width + " " + imgDim.height + "]");
gen.writeln(" /Matrix [1 0 0 1 0 0]");
gen.writeln(" /PaintProc {");
gen.writeln(" pop");
gen.writeln(" gsave");
if (gen.getPSLevel() == 2) {
gen.writeln(" userdict /i 0 put"); //rewind image data
} else {
gen.writeln(" " + dataName + " 0 setfileposition"); //rewind image data
}
String dataSource;
if (gen.getPSLevel() == 2) {
dataSource = "{ " + dataName + " i get /i i 1 add store } bind";
} else {
dataSource = dataName;
}
PSDictionary imageDict = new PSDictionary();
imageDict.put("/DataSource", dataSource);
imageDict.put("/BitsPerComponent", Integer.toString(8));
writeImageCommand(imageDict, imgDim, colorSpace, invertImage, gen);
gen.writeln(" grestore");
gen.writeln(" } bind");
gen.writeln(">> def");
gen.writeln("/" + dataName + " currentfile");
gen.writeln(additionalFilters);
if (gen.getPSLevel() == 2) {
//Creates a data array from the inline file
gen.writeln("{ /temp exch def ["
+ " { temp 16384 string readstring not {exit } if } loop ] } exec");
} else {
gen.writeln("/ReusableStreamDecode filter");
}
compressAndWriteBitmap(encoder, gen);
gen.writeln("def");
gen.writeDSCComment(DSCConstants.END_RESOURCE);
PSResource res = new PSResource(PSResource.TYPE_FORM, formName);
gen.getResourceTracker().registerSuppliedResource(res);
return res;
}