# PDAnnotationSquareCircle.java

    /*
     * 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.pdmodel.interactive.annotation;

    import org.apache.pdfbox.cos.COSArray;
    import org.apache.pdfbox.cos.COSDictionary;
    import org.apache.pdfbox.cos.COSFloat;
    import org.apache.pdfbox.cos.COSName;
    import org.apache.pdfbox.pdmodel.common.PDRectangle;
    import org.apache.pdfbox.pdmodel.graphics.color.PDColor;

    /**
     * This is the class that represents a rectangular or elliptical annotation introduced in PDF 1.3
     * specification .
     *
     * @author Paul King
     */
    public abstract class PDAnnotationSquareCircle extends PDAnnotationMarkup
    {
        /**
         * Creates a Circle or Square annotation of the specified sub type.
         *
         * @param subType the subtype the annotation represents.
         */
        protected PDAnnotationSquareCircle(String subType)
        {
            setSubtype(subType);
        }

        /**
         * Constructor.
         *
         * @param dict The annotations dictionary.
         */
        protected PDAnnotationSquareCircle(COSDictionary dict)
        {
            super(dict);
        }

        @Override
        public abstract void constructAppearances();

        /**
         * This will set interior color of the drawn area color is in DeviceRGB colorspace.
         *
         * @param ic color in the DeviceRGB color space.
         *
         */
        public void setInteriorColor(PDColor ic)
        {
            getCOSObject().setItem(COSName.IC, ic.toCOSArray());
        }

        /**
         * This will retrieve the interior color of the drawn area color is in DeviceRGB color space.
         *
         * @return object representing the color.
         */
        public PDColor getInteriorColor()
        {
            return getColor(COSName.IC);
        }

        /**
         * This will set the border effect dictionary, specifying effects to be applied when drawing the
         * line. This is supported by PDF 1.5 and higher.
         *
         * @param be The border effect dictionary to set.
         *
         */
        public void setBorderEffect(PDBorderEffectDictionary be)
        {
            getCOSObject().setItem(COSName.BE, be);
        }

        /**
         * This will retrieve the border effect dictionary, specifying effects to be applied used in
         * drawing the line.
         *
         * @return The border effect dictionary
         */
        public PDBorderEffectDictionary getBorderEffect()
        {
            COSDictionary borderEffect = getCOSObject().getCOSDictionary(COSName.BE);
            return borderEffect != null ? new PDBorderEffectDictionary(borderEffect) : null;
        }

        /**
         * This will set the rectangle difference rectangle. Giving the difference between the
         * annotations rectangle and where the drawing occurs. (To take account of any effects applied
         * through the BE entry for example)
         *
         * @param rd the rectangle difference
         *
         */
        public void setRectDifference(PDRectangle rd)
        {
            getCOSObject().setItem(COSName.RD, rd);
        }

        /**
         * This will get the rectangle difference rectangle. Giving the difference between the
         * annotations rectangle and where the drawing occurs. (To take account of any effects applied
         * through the BE entry for example)
         *
         * @return the rectangle difference
         */
        public PDRectangle getRectDifference()
        {
            COSArray difference = getCOSObject().getCOSArray(COSName.RD);
            return difference != null ? new PDRectangle(difference) : null;
        }

        /**
         * This will set the difference between the annotations "outer" rectangle defined by /Rect and
         * the border.
         *
         * <p>
         * This will set an equal difference for all sides</p>
         *
         * @param difference from the annotations /Rect entry
         */
        public void setRectDifferences(float difference)
        {
            setRectDifferences(difference, difference, difference, difference);
        }

        /**
         * This will set the difference between the annotations "outer" rectangle defined by
         * /Rect and the border.
         *
         * @param differenceLeft left difference from the annotations /Rect entry
         * @param differenceTop top difference from the annotations /Rect entry
         * @param differenceRight right difference from  the annotations /Rect entry
         * @param differenceBottom bottom difference from the annotations /Rect entry
         *
         */
        public void setRectDifferences(float differenceLeft, float differenceTop, float differenceRight, float differenceBottom)
        {
            COSArray margins = new COSArray();
            margins.add(new COSFloat(differenceLeft));
            margins.add(new COSFloat(differenceTop));
            margins.add(new COSFloat(differenceRight));
            margins.add(new COSFloat(differenceBottom));
            getCOSObject().setItem(COSName.RD, margins);
        }

        /**
         * This will get the differences between the annotations "outer" rectangle defined by
         * /Rect and the border.
         *
         * @return the differences. If the entry hasn't been set am empty array is returned.
         */
        public float[] getRectDifferences()
        {
            COSArray margin = getCOSObject().getCOSArray(COSName.RD);
            return margin != null ? margin.toFloatArray() : new float[] {};
        }

    }