Changeset 792


Ignore:
Timestamp:
01/30/14 15:55:59 (10 years ago)
Author:
jts21
Message:

Fix positioning of rotated images in exported PDFs. Also in the process made image rendering in general faster (no longer has to recalculate the image every time it redraws), at the cost of additional memory usage (not sure if that's an acceptable trade-off)

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

Legend:

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

    r789 r792  
    100100        @Override
    101101        protected void writePicture(Picture pic) throws IOException {
    102                 Image image = pic.getCroppedImage();
     102                Image image = pic.getImageToDraw();
    103103                try {
    104104                        PdfContentByte cb = _pdfWriter.getDirectContent();
    105105                        com.lowagie.text.Image iTextImage = com.lowagie.text.Image.getInstance(image, null);
    106                         iTextImage.setAbsolutePosition(pic.getX(), _pdfWriter.getPageSize().getHeight() - pic.getY() - pic.getHeight());
    107                         iTextImage.setRotationDegrees((float) - pic.getRotate());
     106                        // System.out.println(pic.getScale());
     107                        // iTextImage.scalePercent(pic.getScale() * 100);
     108                        iTextImage.setAbsolutePosition(pic.getPolygon().getBounds().x, _pdfWriter.getPageSize().getHeight() - pic.getPolygon().getBounds().y - image.getHeight(null));
     109                        // iTextImage.setRotationDegrees((float) - pic.getRotate());
    108110                        cb.addImage(iTextImage);
    109111                } catch (DocumentException e) {
     
    113115       
    114116        private List<Line> seenLines = new LinkedList<Line>();
    115         private List<Item> seenArrowHeads = new LinkedList<Item>();
    116117        @Override
    117118        protected void writeLine(Line line) throws IOException {
  • trunk/src/org/expeditee/items/Picture.java

    r726 r792  
    99import java.awt.Polygon;
    1010import java.awt.Rectangle;
     11import java.awt.RenderingHints;
    1112import java.awt.Shape;
    1213import java.awt.Stroke;
     
    1617import java.awt.image.BufferedImage;
    1718import java.awt.image.CropImageFilter;
     19import java.awt.image.DataBufferInt;
    1820import java.awt.image.FilteredImageSource;
    1921import java.awt.image.ImageObserver;
     
    2123import java.io.IOException;
    2224import java.text.DecimalFormat;
     25import java.util.Arrays;
    2326
    2427import javax.imageio.ImageIO;
     
    5558
    5659        protected Image _image = null;
     60        protected Image _imageToDraw = null;
    5761
    5862        private int _scaleType = RATIO;
     
    202206                        _scale = 1F;
    203207                }
     208               
     209                updateImageToDraw();
    204210        }
    205211
     
    332338        public void setWidth(Integer width) {
    333339                _scale = width * 1F / (_end.x - _start.x);
     340                _imageToDraw = null;
    334341        }
    335342
     
    368375        }
    369376       
    370         public void paintImageTiling(Graphics2D g) {
     377        protected void updateImageToDraw() {
     378                _imageToDraw = null;
    371379                if (_image == null) {
    372380                        return;
     
    437445                }
    438446               
    439                 AffineTransform at = new AffineTransform();
    440                 at.translate(dX1, dY1);
    441                 at.rotate(Math.PI * _rotate / 180, tmp.getWidth() / 2, tmp.getHeight() / 2);
    442                 g.drawImage(tmp, at, _imageObserver);
    443                 // g.drawImage(tmp, dX1, dY1, dX2, dY2, 0, 0, tmp.getWidth(), tmp.getHeight(), _imageObserver);
     447                double angle = Math.PI * _rotate / 180;
     448                double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
     449        int w = tmp.getWidth(), h = tmp.getHeight();
     450        int neww = (int)Math.floor(w * cos + h * sin), newh = (int)Math.floor(h * cos + w * sin);
     451               
     452                BufferedImage rotated = new BufferedImage(neww, newh, BufferedImage.TYPE_INT_ARGB);
     453                Arrays.fill(((DataBufferInt)rotated.getRaster().getDataBuffer()).getData(), 0);
     454               
     455                Graphics2D g = rotated.createGraphics();
     456                g.translate((neww - w) / 2, (newh - h) / 2);
     457                g.rotate(angle, tmp.getWidth() / 2, tmp.getHeight() / 2);
     458                g.drawRenderedImage(tmp, null);
     459               
     460                _imageToDraw = rotated;//.getScaledInstance(rotated.getWidth(), rotated.getHeight(), Image.SCALE_REPLICATE);
     461        }
     462       
     463        public Image getImageToDraw() {
     464                return _imageToDraw;
     465        }
     466       
     467        // TODO:
     468        //  - Fix positioning (need to use something like polygon position)
     469        //  - Use anti-aliasing for rotation
     470       
     471        public void paintImageTiling(Graphics2D g) {
     472
     473//              BufferedImage tmp = getImageToDraw();
     474//              if(tmp == null) {
     475//                      return;
     476//              }
     477//              tmp.
     478//              g.drawImage(tmp, at, _imageObserver);
     479                if(_imageToDraw == null) {
     480                        updateImageToDraw();
     481                }
     482                Rectangle b = getPolygon().getBounds();
     483                g.drawImage(_imageToDraw, b.x + 1, b.y + 1, _imageObserver);
    444484        }
    445485
     
    519559                Picture p = createPicture();
    520560                p._image = _image;
     561                p._imageToDraw = null;
    521562                p._mode = _mode;
    522563                // Doing Duplicate item duplicates link mark which we dont want to do
     
    575616        public void setScale(float scale) {
    576617                _scale = scale;
     618                _imageToDraw = null;
    577619        }
    578620       
     
    629671                updateSource();
    630672                updatePolygon();
     673                updateImageToDraw();
    631674                // Make sure items that are resized display the border
    632675                invalidateAll();
     
    791834                updateSource();
    792835                super.translate(origin, ratio);
     836                _imageToDraw = null;
    793837        }
    794838
     
    817861                setScale(getScale() * scale);
    818862                super.scale(scale, originX, originY);
     863                _imageToDraw = null;
    819864        }
    820865       
    821866        public void setFlipX(boolean flip) {
    822867                _flipX = flip;
     868                _imageToDraw = null;
    823869        }
    824870       
    825871        public void setFlipY(boolean flip) {
    826872                _flipY = flip;
     873                _imageToDraw = null;
    827874        }
    828875       
     
    839886                updateSource();
    840887                updatePolygon();
     888                _imageToDraw = null;
    841889        }
    842890       
Note: See TracChangeset for help on using the changeset viewer.