Author: tilman
Date: Sun Sep 28 15:54:42 2025
New Revision: 1928818

Log:
PDFBOX-5660: optimize, as suggested by Valery Bokov; closes #268

Modified:
   
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java
    Sun Sep 28 15:54:39 2025        (r1928817)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDCaretAppearanceHandler.java
    Sun Sep 28 15:54:42 2025        (r1928818)
@@ -1,122 +1,124 @@
-/*
- * Copyright 2018 The Apache Software Foundation.
- *
- * Licensed 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.pdmodel.interactive.annotation.handlers;
-
-import java.io.IOException;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.pdfbox.cos.COSName;
-import org.apache.pdfbox.io.IOUtils;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
-import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationMarkup;
-import org.apache.pdfbox.pdmodel.PDAppearanceContentStream;
-import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
-import org.apache.pdfbox.util.Matrix;
-
-/**
- * Handler to generate the caret annotations appearance.
- *
- * @author Tilman Hausherr
- */
-public class PDCaretAppearanceHandler extends PDAbstractAppearanceHandler
-{
-    private static final Log LOG = 
LogFactory.getLog(PDCaretAppearanceHandler.class);
-
-    public PDCaretAppearanceHandler(PDAnnotation annotation)
-    {
-        super(annotation);
-    }
-
-    public PDCaretAppearanceHandler(PDAnnotation annotation, PDDocument 
document)
-    {
-        super(annotation, document);
-    }
-
-    @Override
-    public void generateNormalAppearance()
-    {
-        PDAnnotationMarkup annotation = (PDAnnotationMarkup) getAnnotation();
-        PDAppearanceContentStream contentStream = null;
-
-        try
-        {
-            contentStream = getNormalAppearanceAsContentStream();
-
-            contentStream.setStrokingColor(getColor());
-            contentStream.setNonStrokingColor(getColor());
-
-            setOpacity(contentStream, annotation.getConstantOpacity());
-
-            PDRectangle rect = getRectangle();
-            PDRectangle bbox = new PDRectangle(rect.getWidth(), 
rect.getHeight());
-            PDAppearanceStream pdAppearanceStream = 
annotation.getNormalAppearanceStream();
-            if (!annotation.getCOSObject().containsKey(COSName.RD))
-            {
-                // Adobe creates the /RD entry with a number that is decided
-                // by dividing the height by 10, with a maximum result of 5.
-                // That number is then used to enlarge the bbox and the 
rectangle and added to the
-                // translation values in the matrix and also used for the line 
width
-                // (not here because it has no effect, see comment near fill() 
).
-                // The curves are based on the original rectangle.
-                float rd = Math.min(rect.getHeight() / 10, 5);
-                annotation.setRectDifferences(rd);
-                bbox = new PDRectangle(-rd, -rd, rect.getWidth() + 2 * rd, 
rect.getHeight() + 2 * rd);
-                Matrix matrix = pdAppearanceStream.getMatrix();
-                pdAppearanceStream.setMatrix(matrix.createAffineTransform());
-                PDRectangle rect2 = new PDRectangle(rect.getLowerLeftX() - rd, 
rect.getLowerLeftY() - rd,
-                                                    rect.getWidth() + 2 * rd, 
rect.getHeight() + 2 * rd);
-                annotation.setRectangle(rect2);
-            }
-            pdAppearanceStream.setBBox(bbox);
-
-            float halfX = rect.getWidth() / 2;
-            float halfY = rect.getHeight() / 2;
-            contentStream.moveTo(0, 0);
-            contentStream.curveTo(halfX, 0,
-                                  halfX, halfY, 
-                                  halfX, rect.getHeight());
-            contentStream.curveTo(halfX, halfY, 
-                                  halfX, 0,
-                                  rect.getWidth(), 0);
-            contentStream.closePath();
-            contentStream.fill();
-            // Adobe has an additional stroke, but it has no effect
-            // because fill "consumes" the path.
-        }
-        catch (IOException e)
-        {
-            LOG.error(e);
-        }
-        finally
-        {
-            IOUtils.closeQuietly(contentStream);
-        }
-    }
-
-    @Override
-    public void generateRolloverAppearance()
-    {
-        // TODO to be implemented
-    }
-
-    @Override
-    public void generateDownAppearance()
-    {
-        // TODO to be implemented
-    }
-}
\ No newline at end of file
+/*
+ * Copyright 2018 The Apache Software Foundation.
+ *
+ * Licensed 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.pdmodel.interactive.annotation.handlers;
+
+import java.io.IOException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.io.IOUtils;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationMarkup;
+import org.apache.pdfbox.pdmodel.PDAppearanceContentStream;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
+import org.apache.pdfbox.util.Matrix;
+
+/**
+ * Handler to generate the caret annotations appearance.
+ *
+ * @author Tilman Hausherr
+ */
+public class PDCaretAppearanceHandler extends PDAbstractAppearanceHandler
+{
+    private static final Log LOG = 
LogFactory.getLog(PDCaretAppearanceHandler.class);
+
+    public PDCaretAppearanceHandler(PDAnnotation annotation)
+    {
+        super(annotation);
+    }
+
+    public PDCaretAppearanceHandler(PDAnnotation annotation, PDDocument 
document)
+    {
+        super(annotation, document);
+    }
+
+    @Override
+    public void generateNormalAppearance()
+    {
+        PDAnnotationMarkup annotation = (PDAnnotationMarkup) getAnnotation();
+        PDAppearanceContentStream contentStream = null;
+
+        try
+        {
+            contentStream = getNormalAppearanceAsContentStream();
+
+            contentStream.setStrokingColor(getColor());
+            contentStream.setNonStrokingColor(getColor());
+
+            setOpacity(contentStream, annotation.getConstantOpacity());
+
+            PDRectangle rect = getRectangle();
+            float rectWidth = rect.getWidth();
+            float rectHeight = rect.getHeight();
+            PDRectangle bbox = new PDRectangle(rectWidth, rectHeight);
+            PDAppearanceStream pdAppearanceStream = 
annotation.getNormalAppearanceStream();
+            if (!annotation.getCOSObject().containsKey(COSName.RD))
+            {
+                // Adobe creates the /RD entry with a number that is decided
+                // by dividing the height by 10, with a maximum result of 5.
+                // That number is then used to enlarge the bbox and the 
rectangle and added to the
+                // translation values in the matrix and also used for the line 
width
+                // (not here because it has no effect, see comment near fill() 
).
+                // The curves are based on the original rectangle.
+                float rd = Math.min(rectHeight / 10, 5);
+                annotation.setRectDifferences(rd);
+                bbox = new PDRectangle(-rd, -rd, rectWidth + 2 * rd, 
rectHeight + 2 * rd);
+                Matrix matrix = pdAppearanceStream.getMatrix();
+                pdAppearanceStream.setMatrix(matrix.createAffineTransform());
+                PDRectangle rect2 = new PDRectangle(rect.getLowerLeftX() - rd, 
rect.getLowerLeftY() - rd,
+                                                rectWidth + 2 * rd, rectHeight 
+ 2 * rd);
+                annotation.setRectangle(rect2);
+            }
+            pdAppearanceStream.setBBox(bbox);
+
+            float halfX = rectWidth / 2;
+            float halfY = rectHeight / 2;
+            contentStream.moveTo(0, 0);
+            contentStream.curveTo(halfX, 0,
+                                  halfX, halfY, 
+                                  halfX, rectHeight);
+            contentStream.curveTo(halfX, halfY, 
+                                  halfX, 0,
+                                  rectWidth, 0);
+            contentStream.closePath();
+            contentStream.fill();
+            // Adobe has an additional stroke, but it has no effect
+            // because fill "consumes" the path.
+        }
+        catch (IOException e)
+        {
+            LOG.error(e);
+        }
+        finally
+        {
+            IOUtils.closeQuietly(contentStream);
+        }
+    }
+
+    @Override
+    public void generateRolloverAppearance()
+    {
+        // TODO to be implemented
+    }
+
+    @Override
+    public void generateDownAppearance()
+    {
+        // TODO to be implemented
+    }
+}

Reply via email to