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