keiron      2002/07/30 06:04:06

  Modified:    src/org/apache/fop/render/pdf PDFRenderer.java
               src/org/apache/fop/area CTM.java
  Added:       src/org/apache/fop/render/pdf CTMHelper.java
  Log:
  separated the specific PDFRender functionality from the CTM class
  and created a small utility class for the renderer to use
  Submitted by: Kevin O'Neill <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.112     +155 -139  xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java
  
  Index: PDFRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java,v
  retrieving revision 1.111
  retrieving revision 1.112
  diff -u -r1.111 -r1.112
  --- PDFRenderer.java  23 Jul 2002 11:06:51 -0000      1.111
  +++ PDFRenderer.java  30 Jul 2002 13:04:05 -0000      1.112
  @@ -41,13 +41,11 @@
   /*
   TODO:
   
  -viewport clipping
   word rendering and optimistion
   pdf state optimisation
   line and border
   leader
   background pattern
  -user agent xml (svg) rendering
   orientation
   writing mode
   text decoration
  @@ -186,13 +184,13 @@
        */
       public void preparePage(PageViewport page) {
           this.pdfResources = this.pdfDoc.getResources();
  -    
  +
           Rectangle2D bounds = page.getViewArea();
           double w = bounds.getWidth();
           double h = bounds.getHeight();
           currentPage = this.pdfDoc.makePage(this.pdfResources,
                                              (int) Math.round(w / 1000), (int) 
Math.round(h / 1000));
  -        if(pages == null) {
  +        if (pages == null) {
               pages = new HashMap();
           }
           pages.put(page, currentPage);
  @@ -206,25 +204,28 @@
        */
       public void renderPage(PageViewport page) throws IOException,
       FOPException {
  -        if(pages != null && (currentPage = (PDFPage)pages.get(page)) != null) {
  +        if (pages != null &&
  +                (currentPage = (PDFPage) pages.get(page)) != null) {
               pages.remove(page);
           } else {
               this.pdfResources = this.pdfDoc.getResources();
               Rectangle2D bounds = page.getViewArea();
               double w = bounds.getWidth();
               double h = bounds.getHeight();
  -            pageHeight = (int)h;
  -            currentPage = this.pdfDoc.makePage(this.pdfResources, 
  -                                           (int) Math.round(w / 1000), (int) 
Math.round(h / 1000));
  +            pageHeight = (int) h;
  +            currentPage = this.pdfDoc.makePage(this.pdfResources,
  +                                               (int) Math.round(w / 1000), (int) 
Math.round(h / 1000));
               pageReferences.put(page, currentPage.referencePDF());
           }
  -        currentStream = this.pdfDoc.makeStream(PDFStream.CONTENT_FILTER, false);
  +        currentStream =
  +          this.pdfDoc.makeStream(PDFStream.CONTENT_FILTER, false);
   
           currentState = new PDFState();
  -        currentState.setTransform(new AffineTransform(1, 0, 0, -1, 0, (int) 
Math.round(pageHeight / 1000)));
  -     // Transform origin at top left to origin at bottom left
  -     currentStream.add("1 0 0 -1 0 " +
  -                       (int) Math.round(pageHeight / 1000) + " cm\n");
  +        currentState.setTransform( new AffineTransform(1, 0, 0, -1, 0,
  +                                   (int) Math.round(pageHeight / 1000)));
  +        // Transform origin at top left to origin at bottom left
  +        currentStream.add("1 0 0 -1 0 " +
  +                          (int) Math.round(pageHeight / 1000) + " cm\n");
           //currentStream.add("BT\n");
           currentFontName = "";
   
  @@ -241,32 +242,33 @@
   
   
       protected void startVParea(CTM ctm) {
  -     // Set the given CTM in the graphics state
  +        // Set the given CTM in the graphics state
           currentState.push();
  -        currentState.setTransform(new AffineTransform(ctm.toArray()));
  +        currentState.setTransform(
  +          new AffineTransform(CTMHelper.toPDFArray(ctm)));
   
  -     currentStream.add("q\n");
  -     // multiply with current CTM
  -     currentStream.add(ctm.toPDFctm() + " cm\n");
  -     // Set clip?
  -  currentStream.add("BT\n");
  +        currentStream.add("q\n");
  +        // multiply with current CTM
  +        currentStream.add(CTMHelper.toPDFString(ctm) + " cm\n");
  +        // Set clip?
  +        currentStream.add("BT\n");
       }
   
       protected void endVParea() {
  -  currentStream.add("ET\n");
  -     currentStream.add("Q\n");
  +        currentStream.add("ET\n");
  +        currentStream.add("Q\n");
           currentState.pop();
       }
   
       protected void renderRegion(RegionReference region) {
  -     // Draw a rectangle so we can see it!
  -     // x=0,y=0,w=ipd,h=bpd
  -     super.renderRegion(region);
  +        // Draw a rectangle so we can see it!
  +        // x=0,y=0,w=ipd,h=bpd
  +        super.renderRegion(region);
       }
   
       protected void renderLineArea(LineArea line) {
  -     super.renderLineArea(line);
  -     closeText();
  +        super.renderLineArea(line);
  +        closeText();
       }
   
       public void renderCharacter(Character ch) {
  @@ -275,58 +277,58 @@
       }
   
       public void renderWord(Word word) {
  -            StringBuffer pdf = new StringBuffer();
  +        StringBuffer pdf = new StringBuffer();
   
  -            String name = (String)word.getTrait(Trait.FONT_NAME);
  -            int size = ((Integer)word.getTrait(Trait.FONT_SIZE)).intValue();
  +        String name = (String) word.getTrait(Trait.FONT_NAME);
  +        int size = ((Integer) word.getTrait(Trait.FONT_SIZE)).intValue();
   
  -            // This assumes that *all* CIDFonts use a /ToUnicode mapping
  -            Font f = (Font)fontInfo.getFonts().get(name);
  -            boolean useMultiByte = f.isMultiByte();
  +        // This assumes that *all* CIDFonts use a /ToUnicode mapping
  +        Font f = (Font) fontInfo.getFonts().get(name);
  +        boolean useMultiByte = f.isMultiByte();
   
  -            // String startText = useMultiByte ? "<FEFF" : "(";
  -            String startText = useMultiByte ? "<" : "(";
  -            String endText = useMultiByte ? "> " : ") ";
  +        // String startText = useMultiByte ? "<FEFF" : "(";
  +        String startText = useMultiByte ? "<" : "(";
  +        String endText = useMultiByte ? "> " : ") ";
   
  -            updateFont(name, size, pdf);
  -            updateColor(true, pdf);
  +        updateFont(name, size, pdf);
  +        updateColor(true, pdf);
   
  -            int rx = currentBlockIPPosition;
  -            // int bl = pageHeight - currentBPPosition;
  -            int bl = currentBPPosition + word.getOffset();
  +        int rx = currentBlockIPPosition;
  +        // int bl = pageHeight - currentBPPosition;
  +        int bl = currentBPPosition + word.getOffset();
  +
  +        // Set letterSpacing
  +        //float ls = fs.getLetterSpacing() / this.currentFontSize;
  +        //pdf.append(ls).append(" Tc\n");
   
  -            // Set letterSpacing
  -            //float ls = fs.getLetterSpacing() / this.currentFontSize;
  -            //pdf.append(ls).append(" Tc\n");
  +        if (!textOpen || bl != prevWordY) {
  +            closeText();
   
  -            if (!textOpen || bl != prevWordY) {
  +            pdf.append("1 0 0 -1 " + (rx / 1000f) + " " +
  +                       (bl / 1000f) + " Tm [" + startText);
  +            prevWordY = bl;
  +            textOpen = true;
  +        } else {
  +            // express the space between words in thousandths of an em
  +            int space = prevWordX - rx + prevWordWidth;
  +            float emDiff = (float) space / (float) currentFontSize * 1000f;
  +            // this prevents a problem in Acrobat Reader and other viewers
  +            // where large numbers cause text to disappear or default to
  +            // a limit
  +            if (emDiff < -33000) {
                   closeText();
   
  -                pdf.append("1 0 0 -1 " + (rx / 1000f) + " " + (bl / 1000f)
  -                           + " Tm [" + startText);
  -                prevWordY = bl;
  +                pdf.append("1 0 0 1 " + (rx / 1000f) + " " +
  +                           (bl / 1000f) + " Tm [" + startText);
                   textOpen = true;
               } else {
  -                // express the space between words in thousandths of an em
  -                int space = prevWordX - rx + prevWordWidth;
  -                float emDiff = (float)space / (float)currentFontSize * 1000f;
  -                // this prevents a problem in Acrobat Reader and other viewers
  -                // where large numbers cause text to disappear or default to
  -                // a limit
  -                if (emDiff < -33000) {
  -                    closeText();
  -
  -                    pdf.append("1 0 0 1 " + (rx / 1000f) + " " + (bl / 1000f)
  -                               + " Tm [" + startText);
  -                    textOpen = true;
  -                } else {
  -                    pdf.append(Float.toString(emDiff));
  -                    pdf.append(" ");
  -                    pdf.append(startText);
  -                }
  +                pdf.append(Float.toString(emDiff));
  +                pdf.append(" ");
  +                pdf.append(startText);
               }
  -            prevWordWidth = word.getWidth();
  -            prevWordX = rx;
  +        }
  +        prevWordWidth = word.getWidth();
  +        prevWordX = rx;
   
           String s = word.getWord();
   
  @@ -340,14 +342,15 @@
           super.renderWord(word);
       }
   
  -    public void escapeText(String s, FontState fs, boolean useMultiByte, 
StringBuffer pdf) {
  +    public void escapeText(String s, FontState fs,
  +                           boolean useMultiByte, StringBuffer pdf) {
           String startText = useMultiByte ? "<" : "(";
           String endText = useMultiByte ? "> " : ") ";
   
           boolean kerningAvailable = false;
           HashMap kerning = null;
           kerning = fs.getKerning();
  -        if (kerning != null &&!kerning.isEmpty()) {
  +        if (kerning != null && !kerning.isEmpty()) {
               kerningAvailable = true;
           }
   
  @@ -359,7 +362,7 @@
               if (!useMultiByte) {
                   if (ch > 127) {
                       pdf.append("\\");
  -                    pdf.append(Integer.toOctalString((int)ch));
  +                    pdf.append(Integer.toOctalString((int) ch));
                   } else {
                       switch (ch) {
                           case '(':
  @@ -375,9 +378,9 @@
               }
   
               if (kerningAvailable && (i + 1) < l) {
  -                addKerning(pdf, (new Integer((int)ch)),
  -                           (new Integer((int)fs.mapChar(s.charAt(i + 1)))),
  -                           kerning, startText, endText);
  +                addKerning(pdf, (new Integer((int) ch)),
  +                           (new Integer((int) fs.mapChar(s.charAt(i + 1)))
  +                           ), kerning, startText, endText);
               }
           }
       }
  @@ -397,8 +400,8 @@
           }
   
           for (int i = 0; i < uniBytes.length; i++) {
  -            int b = (uniBytes[i] < 0) ? (int)(256 + uniBytes[i])
  -                    : (int)uniBytes[i];
  +            int b = (uniBytes[i] < 0) ? (int)(256 + uniBytes[i]) :
  +                    (int) uniBytes[i];
   
               String hexString = Integer.toHexString(b);
               if (hexString.length() == 1)
  @@ -410,14 +413,14 @@
       }
   
       private void addKerning(StringBuffer buf, Integer ch1, Integer ch2,
  -                            HashMap kerning, String startText,
  -                            String endText) {
  -        HashMap kernPair = (HashMap)kerning.get(ch1);
  +                            HashMap kerning, String startText, String endText) {
  +        HashMap kernPair = (HashMap) kerning.get(ch1);
   
           if (kernPair != null) {
  -            Integer width = (Integer)kernPair.get(ch2);
  +            Integer width = (Integer) kernPair.get(ch2);
               if (width != null) {
  -                buf.append(endText).append(-(width.intValue())).append(' 
').append(startText);
  +                buf.append(endText).append(-
  +                                           (width.intValue())).append(' 
').append(startText);
               }
           }
       }
  @@ -437,32 +440,33 @@
   
       private void updateColor(boolean fill, StringBuffer pdf) {
           /*PDFColor areaColor = null;
  -        if (this.currentFill instanceof PDFColor) {
  -            areaColor = (PDFColor)this.currentFill;
  -        }
  -
  -        if (areaColor == null || areaColor.red() != (double)area.getRed()
  -                || areaColor.green() != (double)area.getGreen()
  -                || areaColor.blue() != (double)area.getBlue()) {
  -
  -            areaColor = new PDFColor((double)area.getRed(),
  -                                     (double)area.getGreen(),
  -                                     (double)area.getBlue());
  -
  -            closeText();
  -            this.currentFill = areaColor;
  -            pdf.append(this.currentFill.getColorSpaceOut(true));
  -        }*/
  +         if (this.currentFill instanceof PDFColor) {
  +             areaColor = (PDFColor)this.currentFill;
  +         }
  +
  +         if (areaColor == null || areaColor.red() != (double)area.getRed()
  +                 || areaColor.green() != (double)area.getGreen()
  +                 || areaColor.blue() != (double)area.getBlue()) {
  +
  +             areaColor = new PDFColor((double)area.getRed(),
  +                                      (double)area.getGreen(),
  +                                      (double)area.getBlue());
  +
  +             closeText();
  +             this.currentFill = areaColor;
  +             pdf.append(this.currentFill.getColorSpaceOut(true));
  +         }*/
       }
   
       private void updateFont(String name, int size, StringBuffer pdf) {
  -        if ((!name.equals(this.currentFontName))
  -                || (size != this.currentFontSize)) {
  +        if ((!name.equals(this.currentFontName)) ||
  +                (size != this.currentFontSize)) {
               closeText();
   
               this.currentFontName = name;
               this.currentFontSize = size;
  -            pdf = pdf.append("/" + name + " " + ((float)size / 1000f) + " Tf\n");
  +            pdf = pdf.append("/" + name + " " + ((float) size / 1000f) +
  +                             " Tf\n");
           }
       }
   
  @@ -470,83 +474,86 @@
           String url = image.getURL();
   
           PDFXObject xobject = pdfDoc.getImage(url);
  -        if(xobject != null) {
  -            int w = (int)pos.getWidth() / 1000;
  -            int h = (int)pos.getHeight() / 1000;
  -            placeImage((int)pos.getX() / 1000, (int)pos.getY() / 1000, w, h, 
xobject.getXNumber());
  +        if (xobject != null) {
  +            int w = (int) pos.getWidth() / 1000;
  +            int h = (int) pos.getHeight() / 1000;
  +            placeImage((int) pos.getX() / 1000,
  +                       (int) pos.getY() / 1000, w, h, xobject.getXNumber());
               return;
           }
   
           ImageFactory fact = ImageFactory.getInstance();
           FopImage fopimage = fact.getImage(url, userAgent);
  -        if(fopimage == null) {
  +        if (fopimage == null) {
               return;
           }
  -        if(!fopimage.load(FopImage.DIMENSIONS, userAgent)) {
  +        if (!fopimage.load(FopImage.DIMENSIONS, userAgent)) {
               return;
           }
           String mime = fopimage.getMimeType();
  -        if("text/xml".equals(mime)) {
  -            if(!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) {
  +        if ("text/xml".equals(mime)) {
  +            if (!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) {
                   return;
               }
  -            Document doc = ((XMLImage)fopimage).getDocument();
  -            String ns = ((XMLImage)fopimage).getNameSpace();
  +            Document doc = ((XMLImage) fopimage).getDocument();
  +            String ns = ((XMLImage) fopimage).getNameSpace();
   
               renderDocument(doc, ns, pos);
  -        } else if("image/svg+xml".equals(mime)) {
  -            if(!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) {
  +        } else if ("image/svg+xml".equals(mime)) {
  +            if (!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) {
                   return;
               }
  -            Document doc = ((XMLImage)fopimage).getDocument();
  -            String ns = ((XMLImage)fopimage).getNameSpace();
  +            Document doc = ((XMLImage) fopimage).getDocument();
  +            String ns = ((XMLImage) fopimage).getNameSpace();
   
               renderDocument(doc, ns, pos);
  -        } else if("image/eps".equals(mime)) {
  -            if(!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) {
  +        } else if ("image/eps".equals(mime)) {
  +            if (!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) {
                   return;
               }
               FopPDFImage pdfimage = new FopPDFImage(fopimage, url);
               int xobj = pdfDoc.addImage(null, pdfimage).getXNumber();
               fact.releaseImage(url, userAgent);
  -        } else if("image/jpg".equals(mime)) {
  -            if(!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) {
  +        } else if ("image/jpg".equals(mime)) {
  +            if (!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) {
                   return;
               }
               FopPDFImage pdfimage = new FopPDFImage(fopimage, url);
               int xobj = pdfDoc.addImage(null, pdfimage).getXNumber();
               fact.releaseImage(url, userAgent);
   
  -            int w = (int)pos.getWidth() / 1000;
  -            int h = (int)pos.getHeight() / 1000;
  -            placeImage((int)pos.getX() / 1000, (int)pos.getY() / 1000, w, h, xobj);
  +            int w = (int) pos.getWidth() / 1000;
  +            int h = (int) pos.getHeight() / 1000;
  +            placeImage((int) pos.getX() / 1000,
  +                       (int) pos.getY() / 1000, w, h, xobj);
           } else {
  -            if(!fopimage.load(FopImage.BITMAP, userAgent)) {
  +            if (!fopimage.load(FopImage.BITMAP, userAgent)) {
                   return;
               }
               FopPDFImage pdfimage = new FopPDFImage(fopimage, url);
               int xobj = pdfDoc.addImage(null, pdfimage).getXNumber();
               fact.releaseImage(url, userAgent);
   
  -            int w = (int)pos.getWidth() / 1000;
  -            int h = (int)pos.getHeight() / 1000;
  -            placeImage((int)pos.getX() / 1000, (int)pos.getY() / 1000, w, h, xobj);
  +            int w = (int) pos.getWidth() / 1000;
  +            int h = (int) pos.getHeight() / 1000;
  +            placeImage((int) pos.getX() / 1000,
  +                       (int) pos.getY() / 1000, w, h, xobj);
           }
   
           // output new data
           try {
               this.pdfDoc.output(ostream);
  -        } catch(IOException ioe) {
  +        } catch (IOException ioe) {
   
           }
       }
   
       protected void placeImage(int x, int y, int w, int h, int xobj) {
  -            currentStream.add("q\n" + ((float)w) + " 0 0 "
  -                              + ((float)-h) + " "
  -                              + (((float)currentBlockIPPosition) / 1000f + x) + " "
  -                              + (((float)(currentBPPosition + 1000 * h)) / 1000f + 
y) + " cm\n" + "/Im"
  -                              + xobj + " Do\nQ\n");
  +        currentStream.add("q\n" + ((float) w) + " 0 0 " +
  +                          ((float) - h) + " " +
  +                          (((float) currentBlockIPPosition) / 1000f + x) + " " +
  +                          (((float)(currentBPPosition + 1000 * h)) / 1000f +
  +                           y) + " cm\n" + "/Im" + xobj + " Do\nQ\n");
   
       }
   
  @@ -566,13 +573,18 @@
           context.setProperty(PDFXMLHandler.PDF_STATE, currentState);
           context.setProperty(PDFXMLHandler.PDF_PAGE, currentPage);
           context.setProperty(PDFXMLHandler.PDF_STREAM, currentStream);
  -        context.setProperty(PDFXMLHandler.PDF_XPOS, new 
Integer(currentBlockIPPosition + (int)pos.getX()));
  -        context.setProperty(PDFXMLHandler.PDF_YPOS, new Integer(currentBPPosition + 
(int)pos.getY()));
  +        context.setProperty(PDFXMLHandler.PDF_XPOS,
  +                            new Integer(currentBlockIPPosition + (int) pos.getX()));
  +        context.setProperty(PDFXMLHandler.PDF_YPOS,
  +                            new Integer(currentBPPosition + (int) pos.getY()));
           context.setProperty(PDFXMLHandler.PDF_FONT_INFO, fontInfo);
           context.setProperty(PDFXMLHandler.PDF_FONT_NAME, currentFontName);
  -        context.setProperty(PDFXMLHandler.PDF_FONT_SIZE, new 
Integer(currentFontSize));
  -        context.setProperty(PDFXMLHandler.PDF_WIDTH, new 
Integer((int)pos.getWidth()));
  -        context.setProperty(PDFXMLHandler.PDF_HEIGHT, new 
Integer((int)pos.getHeight()));
  +        context.setProperty(PDFXMLHandler.PDF_FONT_SIZE,
  +                            new Integer(currentFontSize));
  +        context.setProperty(PDFXMLHandler.PDF_WIDTH,
  +                            new Integer((int) pos.getWidth()));
  +        context.setProperty(PDFXMLHandler.PDF_HEIGHT,
  +                            new Integer((int) pos.getHeight()));
           userAgent.renderXML(context, doc, ns);
   
       }
  @@ -605,9 +617,13 @@
   
       public void renderLeader(Leader area) {
           currentStream.add("ET\n");
  -        currentStream.add((((float)currentBlockIPPosition) / 1000f) + " "
  -                          + ((currentBPPosition + area.getOffset()) / 1000f) + " 
m\n");
  -        currentStream.add(((currentBlockIPPosition + area.getWidth()) / 1000f) + " 
" + ((currentBPPosition + area.getOffset()) / 1000f) + " l\n");
  +        currentStream.add((((float) currentBlockIPPosition) / 1000f) +
  +                          " " + ((currentBPPosition + area.getOffset()) /
  +                                 1000f) + " m\n");
  +        currentStream.add(
  +          ((currentBlockIPPosition + area.getWidth()) / 1000f) +
  +          " " + ((currentBPPosition + area.getOffset()) /
  +                 1000f) + " l\n");
           currentStream.add("S\n");
           currentStream.add("BT\n");
           super.renderLeader(area);
  
  
  
  1.1                  xml-fop/src/org/apache/fop/render/pdf/CTMHelper.java
  
  Index: CTMHelper.java
  ===================================================================
  /*
   * $Id: CTMHelper.java,v 1.1 2002/07/30 13:04:05 keiron Exp $
   * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
   * For details on use and redistribution please refer to the
   * LICENSE file included with these sources.
   */
  
  package org.apache.fop.render.pdf;
  
  import org.apache.fop.area.CTM;
  
  /**
   * CTMHelper converts FOP transformation matrixis to those
   * suitable for use by the PDFRender. The e and f elements
   * of the matrix will be divided by 1000 as FOP uses millipoints
   * as it's default user space and PDF uses points.
   *
   * @see org.apache.fop.area.CTM
   *
   * @author <a href="[EMAIL PROTECTED]>Kevin O'Neill</a>
   */
  public final class CTMHelper {
      /**
       * <p>Converts the sourceMatrix to a string for use in the PDFRender cm 
operations.</p>
       * <p>For example:
       * <pre>
       *    org.apache.fop.area.CTM ctm = new org.apache.fop.area.CTM(1.0, 0.0, 0.0, 
1.0, 1000.0, 1000.0);
       *    String pdfMatrix =  org.apache.fop.render.pdf.CTMHelper.toPDFString(ctm);
       * </pre>
       * will return the string "<code>1.0 0.0 0.0 1.0 1.0 1.0</code>".
       *
       * @param sourceMatrix - The matrix to convert.
       *
       * @return  a space seperated string containing the matrix elements.
       *
       * @throws IllegalArgumentException if the sourceMatrix parameter is null.
       */
      public static String toPDFString(CTM sourceMatrix) {
          if (null == sourceMatrix) {
              throw new IllegalArgumentException("sourceMatrix must not be null");
          }
  
          final double matrix[] = toPDFArray(sourceMatrix);
  
          return matrix[0] + " " + matrix[1] + " " + matrix[2] + " " +
                 matrix[3] + " " + matrix[4] + " " + matrix[5];
      }
  
      /**
       * <p>Creates a new CTM based in the sourceMatrix.</p>
       * <p>For example:
       * <pre>
       *    org.apache.fop.area.CTM inCTM = new org.apache.fop.area.CTM(1.0, 0.0, 0.0, 
1.0, 1000.0, 1000.0);
       *    org.apache.fop.area.CTM outCTM 
org.apache.fop.render.pdf.CTMHelper.toPDFCTM(ctm);
       * </pre>
       * will return a new CTM where a == 1.0, b == 0.0, c == 0.0, d == 1.0, e == 1.0 
and f == 1.0.
       *
       * @param sourceMatrix - The matrix to convert.
       *
       * @return  a new converted matrix.
       *
       * @throws IllegalArgumentException if the sourceMatrix parameter is null.
       */
      public static CTM toPDFCTM(CTM sourceMatrix) {
          if (null == sourceMatrix) {
              throw new IllegalArgumentException("sourceMatrix must not be null");
          }
  
          final double matrix[] = toPDFArray(sourceMatrix);
  
          return new CTM(matrix[0], matrix[1], matrix[2], matrix[3],
                         matrix[4], matrix[5]);
      }
  
      /**
       * <p>Creates an array of six doubles from the source CTM.</p>
       * <p>For example:
       * <pre>
       *    org.apache.fop.area.CTM inCTM = new org.apache.fop.area.CTM(1.0, 0.0, 0.0, 
1.0, 1000.0, 1000.0);
       *    double matrix[] = org.apache.fop.render.pdf.CTMHelper.toPDFArray(ctm);
       * </pre>
       * will return a new array where matrix[0] == 1.0, matrix[1] == 0.0, matrix[2] 
== 0.0, matrix[3] == 1.0,
       * matrix[4] == 1.0 and matrix[5] == 1.0.
       *
       * @param sourceMatrix - The matrix to convert.
       *
       * @return  an array of doubles containing the converted matrix.
       *
       * @throws IllegalArgumentException if the sourceMatrix parameter is null.
       */
      public static double[] toPDFArray(CTM sourceMatrix) {
          if (null == sourceMatrix) {
              throw new IllegalArgumentException("sourceMatrix must not be null");
          }
  
          final double matrix[] = sourceMatrix.toArray();
  
          return new double[]{matrix[0], matrix[1], matrix[2], matrix[3],
                              matrix[4] / 1000.0, matrix[5] / 1000.0};
      }
  
  }
  
  
  
  
  1.5       +67 -75    xml-fop/src/org/apache/fop/area/CTM.java
  
  Index: CTM.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/area/CTM.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CTM.java  18 Jun 2002 13:42:55 -0000      1.4
  +++ CTM.java  30 Jul 2002 13:04:06 -0000      1.5
  @@ -19,21 +19,21 @@
    */
   
   public class CTM implements Serializable {
  -    private double a,b,c,d,e,f;
  +    private double a, b, c, d, e, f;
   
  -    private static CTM s_CTM_lrtb = new CTM(1,0,0,1,0,0);
  -    private static CTM s_CTM_rltb = new CTM(-1,0,0,1,0,0);
  -    private static CTM s_CTM_tbrl = new CTM(0,1,-1,0,0,0);
  -/**
  - * Create the identity matrix
  - */
  +    private static CTM s_CTM_lrtb = new CTM(1, 0, 0, 1, 0, 0);
  +    private static CTM s_CTM_rltb = new CTM(-1, 0, 0, 1, 0, 0);
  +    private static CTM s_CTM_tbrl = new CTM(0, 1, -1, 0, 0, 0);
  +    /**
  +     * Create the identity matrix
  +     */
       public CTM() {
  -        a=1;
  -        b=0;
  -        c=0;
  -        d=1;
  -        e=0;
  -        f=0;
  +        a = 1;
  +        b = 0;
  +        c = 0;
  +        d = 1;
  +        e = 0;
  +        f = 0;
       }
   
       /**
  @@ -62,12 +62,12 @@
       }
   
       protected CTM(CTM ctm) {
  -     this.a = ctm.a;
  -     this.b = ctm.b;
  -     this.c = ctm.c;
  -     this.d = ctm.d;
  -     this.e = ctm.e;
  -     this.f = ctm.f;
  +        this.a = ctm.a;
  +        this.b = ctm.b;
  +        this.c = ctm.c;
  +        this.d = ctm.d;
  +        this.e = ctm.e;
  +        this.f = ctm.f;
       }
   
       /**
  @@ -81,26 +81,26 @@
        * CTM is being set.
        */
       static public CTM getWMctm(int wm, int ipd, int bpd) {
  -     CTM wmctm;
  +        CTM wmctm;
           switch (wm) {
               case WritingMode.LR_TB:
                   return new CTM(s_CTM_lrtb);
               case WritingMode.RL_TB:
  -             {
  -             wmctm = new CTM(s_CTM_rltb);
  -             wmctm.e = ipd;
  -             return wmctm;
  -             }
  +                {
  +                    wmctm = new CTM(s_CTM_rltb);
  +                    wmctm.e = ipd;
  +                    return wmctm;
  +                }
                   //return  s_CTM_rltb.translate(ipd, 0);
               case WritingMode.TB_RL: // CJK
  -             {
  -             wmctm = new CTM(s_CTM_tbrl);
  -             wmctm.e = bpd;
  -             return wmctm;
  -             }
  +                {
  +                    wmctm = new CTM(s_CTM_tbrl);
  +                    wmctm.e = bpd;
  +                    return wmctm;
  +                }
                   //return s_CTM_tbrl.translate(0, ipd);
  -         default:
  -             return null;
  +            default:
  +                return null;
           }
       }
   
  @@ -111,14 +111,12 @@
        * @return CTM The result of multiplying premult * this.
        */
       public CTM multiply(CTM premult) {
  -        CTM rslt= new CTM (
  -            (premult.a * a) + (premult.b * c),
  -            (premult.a * b) + (premult.b * d),
  -            (premult.c * a) + (premult.d * c),
  -            (premult.c * b) + (premult.d * d),
  -            (premult.e * a) + (premult.f * c) + e,
  -            (premult.e * b) + (premult.f * d) + f
  -        );
  +        CTM rslt = new CTM ((premult.a * a) + (premult.b * c),
  +                            (premult.a * b) + (premult.b * d),
  +                            (premult.c * a) + (premult.d * c),
  +                            (premult.c * b) + (premult.d * d),
  +                            (premult.e * a) + (premult.f * c) + e,
  +                            (premult.e * b) + (premult.f * d) + f);
           return rslt;
       }
   
  @@ -130,25 +128,22 @@
        * @return CTM The result of rotating this CTM.
        */
       public CTM rotate(double angle) {
  -     double cos, sin;
  -     if (angle == 90.0) {
  -         cos = 0.0;
  -         sin = 1.0;
  -     }
  -     else if (angle == 270.0) {
  -         cos = 0.0;
  -         sin = -1.0;
  -     }
  -     else if (angle == 180.0) {
  -         cos = -1.0;
  -         sin = 0.0;
  -     }
  -     else {
  -         double rad = Math.toRadians(angle);
  -         cos = Math.cos(rad);
  -         sin = Math.sin(rad);
  -     }
  -        CTM rotate= new CTM(cos,-sin, sin, cos, 0, 0);
  +        double cos, sin;
  +        if (angle == 90.0) {
  +            cos = 0.0;
  +            sin = 1.0;
  +        } else if (angle == 270.0) {
  +            cos = 0.0;
  +            sin = -1.0;
  +        } else if (angle == 180.0) {
  +            cos = -1.0;
  +            sin = 0.0;
  +        } else {
  +            double rad = Math.toRadians(angle);
  +            cos = Math.cos(rad);
  +            sin = Math.sin(rad);
  +        }
  +        CTM rotate = new CTM(cos, -sin, sin, cos, 0, 0);
           return multiply(rotate);
       }
   
  @@ -159,7 +154,7 @@
        * @return CTM The result of translating this CTM.
        */
       public CTM translate(double x, double y) {
  -        CTM translate= new CTM(1,0,0,1,x,y);
  +        CTM translate = new CTM(1, 0, 0, 1, x, y);
           return multiply(translate);
       }
   
  @@ -170,7 +165,7 @@
        * @return CTM The result of scaling this CTM.
        */
       public CTM scale(double x, double y) {
  -        CTM scale= new CTM(x,0,0,y,0,0);
  +        CTM scale = new CTM(x, 0, 0, y, 0, 0);
           return multiply(scale);
       }
   
  @@ -183,12 +178,12 @@
       public Rectangle2D transform(Rectangle2D inRect) {
           // Store as 2 sets of 2 points and transform those, then
           // recalculate the width and height
  -        int x1t = (int)(inRect.getX()*a + inRect.getY()*c + e);
  -        int y1t = (int)(inRect.getX()*b + inRect.getY()*d + f);
  -        int x2t = (int)((inRect.getX()+inRect.getWidth())*a +
  -            (inRect.getY()+inRect.getHeight())*c + e);
  -        int y2t = (int)((inRect.getX()+inRect.getWidth())*b +
  -            (inRect.getY()+inRect.getHeight())*d + f);
  +        int x1t = (int)(inRect.getX() * a + inRect.getY() * c + e);
  +        int y1t = (int)(inRect.getX() * b + inRect.getY() * d + f);
  +        int x2t = (int)((inRect.getX() + inRect.getWidth()) * a +
  +                        (inRect.getY() + inRect.getHeight()) * c + e);
  +        int y2t = (int)((inRect.getX() + inRect.getWidth()) * b +
  +                        (inRect.getY() + inRect.getHeight()) * d + f);
           // Normalize with x1 < x2
           if (x1t > x2t) {
               int tmp = x2t;
  @@ -200,18 +195,15 @@
               y2t = y1t;
               y1t = tmp;
           }
  -        return new Rectangle(x1t, y1t, x2t-x1t, y2t-y1t);
  +        return new Rectangle(x1t, y1t, x2t - x1t, y2t - y1t);
       }
   
       public String toString() {
  -     return "[" + a + " " + b + " " + c + " " + d + " " + e + " " + f + "]";
  -    }
  -
  -    public String toPDFctm() {
  -     return a + " " + b + " " + c + " " + d + " " + e/1000f + " " + f/1000f;
  +        return "[" + a + " " + b + " " + c + " " + d + " " + e + " " +
  +               f + "]";
       }
   
       public double[] toArray() {
  -        return new double[] {a, b, c, d, e / 1000.0, f / 1000.0};
  +        return new double[]{a, b, c, d, e, f};
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to