Class CloudyBorder


  • class CloudyBorder
    extends java.lang.Object
    Generates annotation appearances with a cloudy border.

    Dashed stroke styles are not recommended with cloudy borders. The result would not look good because some parts of the arcs are traced twice by the stroked path. Actually Acrobat Reader's line style dialog does not allow to choose a dashed and a cloudy style at the same time.

    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private void addCornerCurl​(double anglePrev, double angleCur, double radius, double cx, double cy, double alpha, double alphaPrev, boolean addMoveTo)
      Creates a corner curl for polygons and ellipses.
      private void addFirstIntermediateCurl​(double angleCur, double r, double alpha, double cx, double cy)
      Generates the first intermediate curl for a cloudy polygon.
      private PDRectangle applyRectDiff​(PDRectangle rd, double min)  
      private void beginOutput​(double x, double y)  
      private void cloudyEllipseImpl​(double leftOrig, double bottomOrig, double rightOrig, double topOrig)
      Cloudy ellipse implementation.
      private void cloudyPolygonImpl​(java.awt.geom.Point2D.Double[] vertices, boolean isEllipse)
      Cloudy polygon implementation.
      private void cloudyRectangleImpl​(double left, double bottom, double right, double top, boolean isEllipse)
      Cloudy rectangle implementation is based on converting the rectangle to a polygon.
      private double computeParamsEllipse​(java.awt.geom.Point2D.Double pt, java.awt.geom.Point2D.Double ptNext, double r, double curlAdv)
      Computes the alpha parameter for an ellipse curl.
      private int computeParamsPolygon​(double advInterm, double advCorner, double k, double r, double length, double[] array)
      Computes parameters for a cloudy polygon: n, alpha, and dx.
      private static double cosine​(double dx, double hypot)  
      (package private) void createCloudyEllipse​(PDRectangle rd)
      Creates a cloudy border for a Circle annotation.
      (package private) void createCloudyPolygon​(float[][] path)
      Creates a cloudy border for a Polygon annotation.
      (package private) void createCloudyRectangle​(PDRectangle rd)
      Creates a cloudy border for a rectangular annotation.
      private void curveTo​(double ax, double ay, double bx, double by, double cx, double cy)  
      private void drawBasicEllipse​(double left, double bottom, double right, double top)
      Draws an ellipse without a cloudy border effect.
      private void finish()  
      private static java.awt.geom.Point2D.Double[] flattenEllipse​(double left, double bottom, double right, double top)
      Flattens an ellipse into a polygon.
      private void getArc​(double startAng, double endAng, double rx, double ry, double cx, double cy, java.util.ArrayList<java.awt.geom.Point2D.Double> out, boolean addMoveTo)
      Creates one or more Bézier curves that represent an elliptical arc.
      private void getArcSegment​(double startAng, double endAng, double cx, double cy, double rx, double ry, java.util.ArrayList<java.awt.geom.Point2D.Double> out, boolean addMoveTo)
      Creates a single Bézier curve that represents a section of an elliptical arc.
      (package private) PDRectangle getBBox()
      Returns the BBox entry (bounding box) for the appearance stream form XObject.
      private double getEllipseCloudRadius()  
      private java.awt.geom.Point2D.Double[] getIntermediateCurlTemplate​(double angleCur, double r)
      Returns a template for intermediate curls in a cloudy polygon.
      (package private) java.awt.geom.AffineTransform getMatrix()
      Returns the Matrix entry for the appearance stream form XObject.
      private double getPolygonCloudRadius()  
      private double getPolygonDirection​(java.awt.geom.Point2D.Double[] points)
      Returns the direction of the specified polygon.
      private void getPositivePolygon​(java.awt.geom.Point2D.Double[] points)
      Makes a polygon whose direction is the same as the positive angle direction in the coordinate system.
      (package private) PDRectangle getRectangle()
      Returns the updated Rect entry for the annotation.
      (package private) PDRectangle getRectDifference()
      Returns the updated RD entry for Square and Circle annotations.
      private void lineTo​(double x, double y)  
      private void lineTo​(java.awt.geom.Point2D.Double p)  
      private void moveTo​(double x, double y)  
      private void moveTo​(java.awt.geom.Point2D.Double p)  
      private void outputCurlTemplate​(java.awt.geom.Point2D.Double[] template, double x, double y)
      Writes the curl template points to the output and applies translation (x, y).
      private java.awt.geom.Point2D.Double[] removeZeroLengthSegments​(java.awt.geom.Point2D.Double[] polygon)  
      private void reversePolygon​(java.awt.geom.Point2D.Double[] points)  
      private static double sine​(double dy, double hypot)  
      private void updateBBox​(double x, double y)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • ANGLE_34_DEG

        private static final double ANGLE_34_DEG
      • ANGLE_30_DEG

        private static final double ANGLE_30_DEG
      • ANGLE_12_DEG

        private static final double ANGLE_12_DEG
      • intensity

        private final double intensity
      • lineWidth

        private final double lineWidth
      • outputStarted

        private boolean outputStarted
      • bboxMinX

        private double bboxMinX
      • bboxMinY

        private double bboxMinY
      • bboxMaxX

        private double bboxMaxX
      • bboxMaxY

        private double bboxMaxY
    • Constructor Detail

      • CloudyBorder

        CloudyBorder​(PDAppearanceContentStream stream,
                     double intensity,
                     double lineWidth,
                     PDRectangle rect)
        Creates a new CloudyBorder that writes to the specified content stream.
        Parameters:
        stream - content stream
        intensity - intensity of cloudy effect (entry I); typically 1.0 or 2.0
        lineWidth - line width for annotation border (entry W)
        rect - annotation rectangle (entry Rect)
    • Method Detail

      • createCloudyRectangle

        void createCloudyRectangle​(PDRectangle rd)
                            throws java.io.IOException
        Creates a cloudy border for a rectangular annotation. The rectangle is specified by the RD entry and the Rect entry that was passed in to the constructor.

        This can be used for Square and FreeText annotations. However, this does not produce the text and the callout line for FreeTexts.

        Parameters:
        rd - entry RD, or null if the entry does not exist
        Throws:
        java.io.IOException - If there is an error writing to the stream.
      • createCloudyPolygon

        void createCloudyPolygon​(float[][] path)
                          throws java.io.IOException
        Creates a cloudy border for a Polygon annotation.
        Parameters:
        path - polygon path
        Throws:
        java.io.IOException - If there is an error writing to the stream.
      • createCloudyEllipse

        void createCloudyEllipse​(PDRectangle rd)
                          throws java.io.IOException
        Creates a cloudy border for a Circle annotation. The ellipse is specified by the RD entry and the Rect entry that was passed in to the constructor.
        Parameters:
        rd - entry RD, or null if the entry does not exist
        Throws:
        java.io.IOException - If there is an error writing to the stream.
      • getBBox

        PDRectangle getBBox()
        Returns the BBox entry (bounding box) for the appearance stream form XObject.
        Returns:
        Bounding box for appearance stream form XObject.
      • getRectangle

        PDRectangle getRectangle()
        Returns the updated Rect entry for the annotation. The rectangle completely contains the cloudy border.
        Returns:
        Annotation Rect.
      • getMatrix

        java.awt.geom.AffineTransform getMatrix()
        Returns the Matrix entry for the appearance stream form XObject.
        Returns:
        Matrix for appearance stream form XObject.
      • getRectDifference

        PDRectangle getRectDifference()
        Returns the updated RD entry for Square and Circle annotations.
        Returns:
        Annotation RD value.
      • cosine

        private static double cosine​(double dx,
                                     double hypot)
      • sine

        private static double sine​(double dy,
                                   double hypot)
      • cloudyRectangleImpl

        private void cloudyRectangleImpl​(double left,
                                         double bottom,
                                         double right,
                                         double top,
                                         boolean isEllipse)
                                  throws java.io.IOException
        Cloudy rectangle implementation is based on converting the rectangle to a polygon.
        Throws:
        java.io.IOException
      • cloudyPolygonImpl

        private void cloudyPolygonImpl​(java.awt.geom.Point2D.Double[] vertices,
                                       boolean isEllipse)
                                throws java.io.IOException
        Cloudy polygon implementation.
        Parameters:
        vertices - polygon vertices; first and last point must be equal
        isEllipse - specifies if the polygon represents an ellipse
        Throws:
        java.io.IOException
      • computeParamsPolygon

        private int computeParamsPolygon​(double advInterm,
                                         double advCorner,
                                         double k,
                                         double r,
                                         double length,
                                         double[] array)
        Computes parameters for a cloudy polygon: n, alpha, and dx.
      • addCornerCurl

        private void addCornerCurl​(double anglePrev,
                                   double angleCur,
                                   double radius,
                                   double cx,
                                   double cy,
                                   double alpha,
                                   double alphaPrev,
                                   boolean addMoveTo)
                            throws java.io.IOException
        Creates a corner curl for polygons and ellipses.
        Throws:
        java.io.IOException
      • addFirstIntermediateCurl

        private void addFirstIntermediateCurl​(double angleCur,
                                              double r,
                                              double alpha,
                                              double cx,
                                              double cy)
                                       throws java.io.IOException
        Generates the first intermediate curl for a cloudy polygon.
        Throws:
        java.io.IOException
      • getIntermediateCurlTemplate

        private java.awt.geom.Point2D.Double[] getIntermediateCurlTemplate​(double angleCur,
                                                                           double r)
                                                                    throws java.io.IOException
        Returns a template for intermediate curls in a cloudy polygon.
        Throws:
        java.io.IOException
      • outputCurlTemplate

        private void outputCurlTemplate​(java.awt.geom.Point2D.Double[] template,
                                        double x,
                                        double y)
                                 throws java.io.IOException
        Writes the curl template points to the output and applies translation (x, y).
        Throws:
        java.io.IOException
      • reversePolygon

        private void reversePolygon​(java.awt.geom.Point2D.Double[] points)
      • getPositivePolygon

        private void getPositivePolygon​(java.awt.geom.Point2D.Double[] points)
        Makes a polygon whose direction is the same as the positive angle direction in the coordinate system. The polygon must not intersect itself.
      • getPolygonDirection

        private double getPolygonDirection​(java.awt.geom.Point2D.Double[] points)
        Returns the direction of the specified polygon. A positive value indicates that the polygon's direction is the same as the direction of positive angles in the coordinate system. A negative value indicates the opposite direction. The polygon must not intersect itself. A 2-point polygon is not acceptable. This is based on the "shoelace formula".
      • getArc

        private void getArc​(double startAng,
                            double endAng,
                            double rx,
                            double ry,
                            double cx,
                            double cy,
                            java.util.ArrayList<java.awt.geom.Point2D.Double> out,
                            boolean addMoveTo)
                     throws java.io.IOException
        Creates one or more Bézier curves that represent an elliptical arc. Angles are in radians. The arc will always proceed in the positive angle direction. If the argument `out` is null, this writes the results to the instance variable `output`.
        Throws:
        java.io.IOException
      • getArcSegment

        private void getArcSegment​(double startAng,
                                   double endAng,
                                   double cx,
                                   double cy,
                                   double rx,
                                   double ry,
                                   java.util.ArrayList<java.awt.geom.Point2D.Double> out,
                                   boolean addMoveTo)
                            throws java.io.IOException
        Creates a single Bézier curve that represents a section of an elliptical arc. The sweep angle of the section must not be larger than 90 degrees. If argument `out` is null, this writes the results to the instance variable `output`.
        Throws:
        java.io.IOException
      • flattenEllipse

        private static java.awt.geom.Point2D.Double[] flattenEllipse​(double left,
                                                                     double bottom,
                                                                     double right,
                                                                     double top)
        Flattens an ellipse into a polygon.
      • cloudyEllipseImpl

        private void cloudyEllipseImpl​(double leftOrig,
                                       double bottomOrig,
                                       double rightOrig,
                                       double topOrig)
                                throws java.io.IOException
        Cloudy ellipse implementation.
        Throws:
        java.io.IOException
      • computeParamsEllipse

        private double computeParamsEllipse​(java.awt.geom.Point2D.Double pt,
                                            java.awt.geom.Point2D.Double ptNext,
                                            double r,
                                            double curlAdv)
        Computes the alpha parameter for an ellipse curl.
      • removeZeroLengthSegments

        private java.awt.geom.Point2D.Double[] removeZeroLengthSegments​(java.awt.geom.Point2D.Double[] polygon)
      • drawBasicEllipse

        private void drawBasicEllipse​(double left,
                                      double bottom,
                                      double right,
                                      double top)
                               throws java.io.IOException
        Draws an ellipse without a cloudy border effect.
        Throws:
        java.io.IOException
      • beginOutput

        private void beginOutput​(double x,
                                 double y)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • updateBBox

        private void updateBBox​(double x,
                                double y)
      • moveTo

        private void moveTo​(java.awt.geom.Point2D.Double p)
                     throws java.io.IOException
        Throws:
        java.io.IOException
      • moveTo

        private void moveTo​(double x,
                            double y)
                     throws java.io.IOException
        Throws:
        java.io.IOException
      • lineTo

        private void lineTo​(java.awt.geom.Point2D.Double p)
                     throws java.io.IOException
        Throws:
        java.io.IOException
      • lineTo

        private void lineTo​(double x,
                            double y)
                     throws java.io.IOException
        Throws:
        java.io.IOException
      • curveTo

        private void curveTo​(double ax,
                             double ay,
                             double bx,
                             double by,
                             double cx,
                             double cy)
                      throws java.io.IOException
        Throws:
        java.io.IOException
      • finish

        private void finish()
                     throws java.io.IOException
        Throws:
        java.io.IOException
      • getEllipseCloudRadius

        private double getEllipseCloudRadius()
      • getPolygonCloudRadius

        private double getPolygonCloudRadius()