/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.pdfbox.util.operator.pagedrawer;

import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.List;

import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSNumber;
import org.apache.pdfbox.pdfviewer.PageDrawer;
import org.apache.pdfbox.util.PDFOperator;
import org.apache.pdfbox.util.operator.OperatorProcessor;

/**
 * Implementation of content stream operator for page drawer.
 *
 * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
 * @version $Revision: 1.3 $
 */
public class AppendRectangleToPath extends OperatorProcessor
{


    /**
     * process : re : append rectangle to path.
     * @param operator The operator that is being executed.
     * @param arguments List
     */
    public void process(PDFOperator operator, List<COSBase> arguments)
    {
        PageDrawer drawer = (PageDrawer)context;

        COSNumber x = (COSNumber)arguments.get( 0 );
        COSNumber y = (COSNumber)arguments.get( 1 );
        COSNumber w = (COSNumber)arguments.get( 2 );
        COSNumber h = (COSNumber)arguments.get( 3 );

        double x1 = x.floatValue();
        double y1 = y.floatValue();
        // create a pair of coordinates for the transformation 
        double x2 = w.floatValue()+x1;
        double y2 = h.floatValue()+y1;

        Point2D startCoords = drawer.transformedPoint(x1,y1);
        Point2D endCoords = drawer.transformedPoint(x2,y2);

        double width = endCoords.getX()-startCoords.getX();
        double height =  endCoords.getY()-startCoords.getY();
        double xStart = startCoords.getX();
        double yStart = startCoords.getY();
        // we have to calculate the width and height from the two pairs of coordinates
        // if the endCoords are above the startCoords we have to switch them
        if (width < 0) 
        {
            xStart += width;
            width = -width;
        }
        if (height < 0) 
        {
            yStart += height;
            height = -height;
        }
        Rectangle2D rect = new Rectangle2D.Double(xStart, yStart, width, height);
        drawer.getLinePath().append( rect, false );
    }
}

@@ -870,23 +870,27 @@
 wt.geom.
-Point2D
+GeneralPath
 ;%0Aimport
@@ -904,25 +904,21 @@
 wt.geom.
-Rectangle
+Point
 2D;%0Aimpo
@@ -1915,21 +1915,22 @@
  x1 = x.
-float
+double
 Value();
@@ -1952,21 +1952,22 @@
  y1 = y.
-float
+double
 Value();
@@ -2053,21 +2053,22 @@
  x2 = w.
-float
+double
 Value()+
@@ -2097,13 +2097,14 @@
 = h.
-float
+double
 Valu
@@ -2243,22 +2243,21 @@
         
-double
+float
  width =
@@ -2257,16 +2257,24 @@
 width = 
+(float)(
 endCoord
@@ -2292,32 +2292,33 @@
 artCoords.getX()
+)
 ;%0A        double
@@ -2311,22 +2311,21 @@
         
-double
+float
  height 
@@ -2326,17 +2326,24 @@
 eight = 
- 
+(float)(
 endCoord
@@ -2361,32 +2361,33 @@
 artCoords.getY()
+)
 ;%0A        double
@@ -2380,22 +2380,21 @@
         
-double
+float
  xStart 
@@ -2387,32 +2387,39 @@
  float xStart = 
+(float)
 startCoords.getX
@@ -2430,22 +2430,21 @@
         
-double
+float
  yStart 
@@ -2445,16 +2445,23 @@
 Start = 
+(float)
 startCoo
@@ -2468,24 +2468,25 @@
 rds.getY();%0A
+%0A
         // w
@@ -2488,355 +2488,352 @@
  // 
-we have to calcul
+To ensure th
 at
-e
  the 
-width and height from the two pairs of coordinates%0A        // if the endCoords are above the startCoords we have to switch them%0A        if (width %3C 0) %0A        %7B%0A            xStart += width;%0A            width = -width;%0A        %7D%0A        if (height %3C 0) %0A        %7B%0A            yStart += height;%0A            height = -
+path is created in the right direction,%0A        // we have to create it by combining single lines instead of%0A        // creating a simple rectangle%0A        GeneralPath path = drawer.getLinePath();%0A        path.moveTo(xStart, yStart);%0A        path.lineTo(xStart+width, yStart);%0A        path.lineTo(xStart+width, yStart+
 height
+)
 ;%0A  
@@ -2842,59 +2842,19 @@
     
-%7D%0A        Rectangle2D rect = new Rectangle2D.Double
+path.lineTo
 (xSt
@@ -2868,17 +2868,9 @@
 tart
-, width, 
++
 heig
@@ -2886,49 +2886,34 @@
     
-drawer.getLinePath().append( rect, false 
+path.lineTo(xStart, yStart
 );%0A 

combine single lines to a rectangle to ensure the right path direction.