You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@xmlgraphics.apache.org by Manuel Polling <M....@edmond.nl> on 2007/06/06 16:08:26 UTC
bug / patch for org.apache.xmlgraphics.ps.PSGenerator
Hi,
I tried to find out how to submit a bug / patch for XML Graphics commons
without checking out and commiting the source myself but I could not
figure out how.
So here is a contribution by email. While using the PSGenerator
(org.apache.xmlgraphics.ps.PSGenerator) I found that the current
implementation of PSGenerator.escapeChar() is not working properly. Some
of the issues: the escaped chars are still Java chars instead of bytes,
when writing a char as an octal code it should have 3 digits, chars
below 32 are not escaped.
Below you find another method which does about the same task, it is not
a drop-in replacement but it solves most problems. There is a call in
this method to EPSGraphics2D.encode(), this one is intended to provide
translations for Unicode code points above 255 if they are supported by
the encoding vector of the font.
I hope this will help to improve the XML Graphics commons.
Kind regards,
Manuel Polling.
The code:
private static final char CHAR_BACKSPACE = '\b';
private static final char CHAR_CARRIAGE_RETURN = '\r';
private static final char CHAR_END_OF_LINE = '\n';
private static final char CHAR_ESCAPE = '\\';
private static final char CHAR_FORM_FEED = '\f';
private static final char CHAR_LEFT_PARENTHESIS = '(';
private static final char CHAR_RIGHT_PARENTHESIS = ')';
private static final char CHAR_TAB = '\t';
private static final char CHAR_SUBSTITUTE = '?';
/**
* TODO make this work for non iso-latin1 chars not present in our
own encoding (lookup chars in font),
* see org.apache.fop.render.ps.NativeTextHandler.
* @param text
* @param target
*/
private byte[] escapeText(final String text) {
final ByteArrayOutputStream asciiBuffer = new ByteArrayOutputStream(
text.length() * 2);
final int textLength = text.length();
for (int i = 0; i < textLength; i++) {
final char code = EPSGraphics2D.encode(text.charAt(i));
switch (code) {
case CHAR_LEFT_PARENTHESIS:
case CHAR_RIGHT_PARENTHESIS:
asciiBuffer.write(CHAR_ESCAPE);
asciiBuffer.write(code);
break;
case CHAR_CARRIAGE_RETURN:
asciiBuffer.write(CHAR_ESCAPE);
asciiBuffer.write('r');
break;
case CHAR_BACKSPACE:
asciiBuffer.write(CHAR_ESCAPE);
asciiBuffer.write('b');
break;
case CHAR_FORM_FEED:
asciiBuffer.write(CHAR_ESCAPE);
asciiBuffer.write('f');
break;
case CHAR_TAB:
asciiBuffer.write(CHAR_ESCAPE);
asciiBuffer.write('t');
break;
case CHAR_END_OF_LINE:
asciiBuffer.write(CHAR_ESCAPE);
asciiBuffer.write('n');
break;
case CHAR_ESCAPE:
asciiBuffer.write(CHAR_ESCAPE);
asciiBuffer.write(CHAR_ESCAPE);
break;
default:
if (code > 255) {
asciiBuffer.write(CHAR_SUBSTITUTE);
logger.warning(MessageFormat.format(
"unable to write codepoint ''{0}'' (0x{1}),
substituting ''{2}''.",
code, Integer.toString(code, 16), CHAR_SUBSTITUTE));
}
else if (code < 32 || code > 127) {
asciiBuffer.write(CHAR_ESCAPE);
asciiBuffer.write('0' + code / 64);
asciiBuffer.write('0' + (code / 8) % 8);
asciiBuffer.write('0' + code % 8);
}
else
asciiBuffer.write(code);
break;
}
}
return asciiBuffer.toByteArray();
}
--
drs. Manuel Polling
Consultant/Software Engineer
Edmond Research & Development B.V.
/The Document Solutions Specialist/
http://www.edmond.nl/
Re: bug / patch for org.apache.xmlgraphics.ps.PSGenerator
Posted by Christian Geisert <ch...@isu-gmbh.de>.
Manuel Polling schrieb:
> Hi,
> I tried to find out how to submit a bug / patch for XML Graphics commons
> without checking out and commiting the source myself but I could not
> figure out how.
Uh, this information is really missing on the website.
The procedure is basicly the same as with FOP
(http://xmlgraphics.apache.org/fop/dev/index.html#patches), just the
bugzilla product is XMLGraphicsCommons.
Thanks for telling us.
> So here is a contribution by email. While using the PSGenerator
> (org.apache.xmlgraphics.ps.PSGenerator) I found that the current
> implementation of PSGenerator.escapeChar() is not working properly. Some
> of the issues: the escaped chars are still Java chars instead of bytes,
> when writing a char as an octal code it should have 3 digits, chars
> below 32 are not escaped.
> Below you find another method which does about the same task, it is not
> a drop-in replacement but it solves most problems. There is a call in
> this method to EPSGraphics2D.encode(), this one is intended to provide
> translations for Unicode code points above 255 if they are supported by
> the encoding vector of the font.
> I hope this will help to improve the XML Graphics commons.
I'll have a closer look at this in the next days (if no one else beats me).
--
Christian
---------------------------------------------------------------------
Apache XML Graphics Project URL: http://xmlgraphics.apache.org/
To unsubscribe, e-mail: general-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: general-help@xmlgraphics.apache.org
Re: bug / patch for org.apache.xmlgraphics.ps.PSGenerator
Posted by Jeremias Maerki <de...@jeremias-maerki.ch>.
Thanks for the problem report, Manuel. I couldn't do anything with the
code you posted. There's no EPSGraphics2D anywhere in the XML Graphics
Project. The only thing resembling that is PSGraphics2D or
EPSDocumentGraphics2D but there's no encode method. So I just fixed the
bug by hand and added a JUnit test case. Please check if it works for
you now.
http://svn.apache.org/viewvc?view=rev&rev=549118
On 06.06.2007 16:08:26 Manuel Polling wrote:
> Hi,
> I tried to find out how to submit a bug / patch for XML Graphics commons
> without checking out and commiting the source myself but I could not
> figure out how.
>
> So here is a contribution by email. While using the PSGenerator
> (org.apache.xmlgraphics.ps.PSGenerator) I found that the current
> implementation of PSGenerator.escapeChar() is not working properly. Some
> of the issues: the escaped chars are still Java chars instead of bytes,
> when writing a char as an octal code it should have 3 digits, chars
> below 32 are not escaped.
> Below you find another method which does about the same task, it is not
> a drop-in replacement but it solves most problems. There is a call in
> this method to EPSGraphics2D.encode(), this one is intended to provide
> translations for Unicode code points above 255 if they are supported by
> the encoding vector of the font.
> I hope this will help to improve the XML Graphics commons.
>
> Kind regards,
> Manuel Polling.
>
> The code:
> private static final char CHAR_BACKSPACE = '\b';
> private static final char CHAR_CARRIAGE_RETURN = '\r';
> private static final char CHAR_END_OF_LINE = '\n';
> private static final char CHAR_ESCAPE = '\\';
> private static final char CHAR_FORM_FEED = '\f';
> private static final char CHAR_LEFT_PARENTHESIS = '(';
> private static final char CHAR_RIGHT_PARENTHESIS = ')';
> private static final char CHAR_TAB = '\t';
> private static final char CHAR_SUBSTITUTE = '?';
>
> /**
> * TODO make this work for non iso-latin1 chars not present in our
> own encoding (lookup chars in font),
> * see org.apache.fop.render.ps.NativeTextHandler.
> * @param text
> * @param target
> */
> private byte[] escapeText(final String text) {
> final ByteArrayOutputStream asciiBuffer = new ByteArrayOutputStream(
> text.length() * 2);
>
> final int textLength = text.length();
> for (int i = 0; i < textLength; i++) {
> final char code = EPSGraphics2D.encode(text.charAt(i));
> switch (code) {
> case CHAR_LEFT_PARENTHESIS:
> case CHAR_RIGHT_PARENTHESIS:
> asciiBuffer.write(CHAR_ESCAPE);
> asciiBuffer.write(code);
> break;
> case CHAR_CARRIAGE_RETURN:
> asciiBuffer.write(CHAR_ESCAPE);
> asciiBuffer.write('r');
> break;
> case CHAR_BACKSPACE:
> asciiBuffer.write(CHAR_ESCAPE);
> asciiBuffer.write('b');
> break;
> case CHAR_FORM_FEED:
> asciiBuffer.write(CHAR_ESCAPE);
> asciiBuffer.write('f');
> break;
> case CHAR_TAB:
> asciiBuffer.write(CHAR_ESCAPE);
> asciiBuffer.write('t');
> break;
> case CHAR_END_OF_LINE:
> asciiBuffer.write(CHAR_ESCAPE);
> asciiBuffer.write('n');
> break;
> case CHAR_ESCAPE:
> asciiBuffer.write(CHAR_ESCAPE);
> asciiBuffer.write(CHAR_ESCAPE);
> break;
> default:
> if (code > 255) {
> asciiBuffer.write(CHAR_SUBSTITUTE);
> logger.warning(MessageFormat.format(
> "unable to write codepoint ''{0}'' (0x{1}),
> substituting ''{2}''.",
> code, Integer.toString(code, 16), CHAR_SUBSTITUTE));
> }
> else if (code < 32 || code > 127) {
> asciiBuffer.write(CHAR_ESCAPE);
> asciiBuffer.write('0' + code / 64);
> asciiBuffer.write('0' + (code / 8) % 8);
> asciiBuffer.write('0' + code % 8);
> }
> else
> asciiBuffer.write(code);
> break;
> }
>
> }
> return asciiBuffer.toByteArray();
> }
>
> --
> drs. Manuel Polling
> Consultant/Software Engineer
> Edmond Research & Development B.V.
> /The Document Solutions Specialist/
> http://www.edmond.nl/
>
Jeremias Maerki
---------------------------------------------------------------------
Apache XML Graphics Project URL: http://xmlgraphics.apache.org/
To unsubscribe, e-mail: general-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: general-help@xmlgraphics.apache.org