Changeset 789


Ignore:
Timestamp:
01/30/14 11:11:40 (10 years ago)
Author:
jts21
Message:

Add support to PDF2Writer for rotated images, filled polyons, polylines, and arrows (complete with arrowheads)

Location:
trunk/src/org/expeditee
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/expeditee/io/PDF2Writer.java

    r655 r789  
    33import java.awt.Dimension;
    44import java.awt.Image;
     5import java.awt.Polygon;
    56import java.io.FileOutputStream;
    67import java.io.IOException;
    78import java.io.Writer;
    89import java.util.Collection;
     10import java.util.LinkedList;
    911import java.util.List;
    1012
     
    1214import org.expeditee.gui.FrameGraphics;
    1315import org.expeditee.items.Item;
     16import org.expeditee.items.Line;
    1417import org.expeditee.items.Picture;
    1518import org.expeditee.items.Text;
     
    100103                try {
    101104                        PdfContentByte cb = _pdfWriter.getDirectContent();
    102                         com.lowagie.text.Image iTextImage = com.lowagie.text.Image
    103                                         .getInstance(image, null);
     105                        com.lowagie.text.Image iTextImage = com.lowagie.text.Image.getInstance(image, null);
    104106                        iTextImage.setAbsolutePosition(pic.getX(), _pdfWriter.getPageSize().getHeight() - pic.getY() - pic.getHeight());
     107                        iTextImage.setRotationDegrees((float) - pic.getRotate());
    105108                        cb.addImage(iTextImage);
    106109                } catch (DocumentException e) {
    107110                        e.printStackTrace();
     111                }
     112        }
     113       
     114        private List<Line> seenLines = new LinkedList<Line>();
     115        private List<Item> seenArrowHeads = new LinkedList<Item>();
     116        @Override
     117        protected void writeLine(Line line) throws IOException {
     118                if(seenLines.contains(line)) {
     119                        return;
     120                }
     121                PdfContentByte cb = _pdfWriter.getDirectContent();
     122                float height = _pdfWriter.getPageSize().getHeight();
     123                if(line.getStartItem().isEnclosed()) {
     124                        seenLines.add(line);
     125                        Line currentLine = line;
     126                        Item currentItem = line.getStartItem();
     127                        cb.moveTo(currentItem.getX(), height - currentItem.getY());
     128                        for(;;) {
     129                                currentItem = currentLine.getOppositeEnd(currentItem);
     130                                cb.lineTo(currentItem.getX(), height - currentItem.getY());
     131                                for(Line l : currentItem.getLines()) {
     132                                        if(l.equals(currentLine)) {
     133                                                continue;
     134                                        }
     135                                        currentLine = l;
     136                                        break;
     137                                }
     138                                if(currentLine == null || currentLine.equals(line)) {
     139                                        break;
     140                                }
     141                                seenLines.add(currentLine);
     142                        }
     143                        cb.setColorFill(currentItem.getFillColor());
     144                        cb.setColorStroke(currentLine.getColor());
     145                        cb.closePathFillStroke();
     146                } else {
     147                        for(Item l : line.getStartItem().getAllConnected()) {
     148                                if(l instanceof Line && !seenLines.contains(l)) {
     149                                        seenLines.add((Line) l);
     150                                        Item start = ((Line) l).getStartItem();
     151                                        Item end = ((Line) l).getEndItem();
     152                                        cb.moveTo(start.getX(), height - start.getY());
     153                                        cb.lineTo(end.getX(), height - end.getY());
     154                                        cb.setColorStroke(l.getColor());
     155                                        cb.closePathStroke();
     156                                        Polygon arrow = ((Line) l).getStartArrow();
     157                                        if(arrow != null) {
     158                                                cb.moveTo(arrow.xpoints[0], height - arrow.ypoints[0]);
     159                                                for(int i = 1; i < arrow.npoints; i++) {
     160                                                        cb.lineTo(arrow.xpoints[i], height - arrow.ypoints[i]);
     161                                                }
     162                                                cb.setColorFill(l.getColor());
     163                                                cb.closePath();
     164                                                cb.fill();
     165                                        }
     166                                        arrow = ((Line) l).getEndArrow();
     167                                        if(arrow != null) {
     168                                                cb.moveTo(arrow.xpoints[0], height - arrow.ypoints[0]);
     169                                                for(int i = 1; i < arrow.npoints; i++) {
     170                                                        cb.lineTo(arrow.xpoints[i], height - arrow.ypoints[i]);
     171                                                }
     172                                                cb.setColorFill(l.getColor());
     173                                                cb.closePath();
     174                                                cb.fill();
     175                                        }
     176                                }
     177                        }
    108178                }
    109179        }
  • trunk/src/org/expeditee/items/Line.java

    r737 r789  
    1111import java.awt.Stroke;
    1212import java.awt.geom.AffineTransform;
     13import java.awt.geom.Point2D;
    1314import java.util.ArrayList;
    1415import java.util.Collection;
     
    405406                g.setStroke(new BasicStroke(getPaintThickness(), CAP,
    406407                                BasicStroke.JOIN_MITER));
    407                 paintArrow(g, _start, _startOffset, _endOffset);
    408                 paintArrow(g, _end, _endOffset, _startOffset);
     408                paintArrow(g, getStartArrow());
     409                paintArrow(g, getEndArrow());
    409410
    410411                if (_virtualSpot != null) {
     
    429430
    430431        }
    431 
    432         /**
    433          * Based on code from DeSL (Arrow2D) http://sourceforge.net/projects/desl/
    434          */
    435         private void paintArrow(Graphics2D g, Item withArrow, Point startOffset,
    436                         Point endOffset) {
     432       
     433        /**
     434         * Gets the arrow head
     435         * @param withArrow
     436         * @param startOffset
     437         * @param endOffset
     438         * @return
     439         */
     440        private Shape getArrow(Item withArrow, Point startOffset, Point endOffset) {
    437441                boolean disconnectMode = withArrow._mode == Item.HighlightMode.Disconnect;
    438442                // only draw an arrowhead if necessary
    439443                if (!(this._mode == Item.HighlightMode.Disconnect && disconnectMode)
    440444                                && (!withArrow.hasVisibleArrow() || withArrow.getLines().size() > 1))
    441                         return;
     445                        return null;
    442446
    443447                int x0, x1, y0, y1;
     
    462466                // floating
    463467                if (arrowLength != AUTO_ARROWHEAD_LENGTH && (arrowRatio < 0 || arrowNibPerc < 0)) {
    464                         return;
     468                        return null;
    465469                }
    466470
     
    473477                // wont show the arrow
    474478                if (length <= MINIMUM_ARROW_HEAD_LENGTH)
    475                         return;
     479                        return null;
    476480                if (arrowLength == AUTO_ARROWHEAD_LENGTH) {
    477481                        arrowLength = getAutoArrowheadLength(length);
     
    498502                AffineTransform tx = AffineTransform.getRotateInstance(rad, x0, y0);
    499503               
     504        int[] rx = new int[arrowhead.npoints];
     505        int[] ry = new int[arrowhead.npoints];
     506       
     507        for(int i = 0; i < arrowhead.npoints; i++){
     508            Point2D p = new Point2D.Double(arrowhead.xpoints[i], arrowhead.ypoints[i]);
     509            tx.transform(p,p);
     510            rx[i] = (int) p.getX();
     511            ry[i] = (int) p.getY();
     512        }
     513       
     514        return new Polygon(rx, ry, arrowhead.npoints);
     515        }
     516       
     517        public Polygon getStartArrow() {
     518                return (Polygon) getArrow(_start, _startOffset, _endOffset);
     519        }
     520       
     521        public Polygon getEndArrow() {
     522                return (Polygon) getArrow(_end, _endOffset, _startOffset);
     523        }
     524
     525        /**
     526         * Based on code from DeSL (Arrow2D) http://sourceforge.net/projects/desl/
     527         */
     528        private void paintArrow(Graphics2D g, Shape arrow) {
     529               
     530                if(arrow == null) {
     531                        return;
     532                }
    500533               
    501534                // TODO
     
    508541                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    509542               
    510                 g.draw(tx.createTransformedShape((Shape) arrowhead));
    511                 g.fill(tx.createTransformedShape((Shape) arrowhead));
     543                g.draw(arrow);
     544                g.fill(arrow);
    512545       
    513546        }
Note: See TracChangeset for help on using the changeset viewer.