/*
* 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.graphics.shading;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.common.COSObjectable;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
/**
* This represents resources for a shading.
*
* @version $Revision: 1.0 $
*/
public abstract class PDShadingResources implements COSObjectable
{
private COSDictionary dictionary;
private COSArray background = null;
private PDRectangle bBox = null;
private PDColorSpace colorspace = null;
/**
* shading type 1 = function based shading.
*/
public static final int SHADING_TYPE1 = 1;
/**
* shading type 2 = axial shading.
*/
public static final int SHADING_TYPE2 = 2;
/**
* shading type 3 = radial shading.
*/
public static final int SHADING_TYPE3 = 3;
/**
* shading type 4 = Free-Form Gouraud-Shaded Triangle Meshes.
*/
public static final int SHADING_TYPE4 = 4;
/**
* shading type 5 = Lattice-Form Gouraud-Shaded Triangle Meshes.
*/
public static final int SHADING_TYPE5 = 5;
/**
* shading type 6 = Coons Patch Meshes.
*/
public static final int SHADING_TYPE6 = 6;
/**
* shading type 7 = Tensor-Product Patch Meshes.
*/
public static final int SHADING_TYPE7 = 7;
/**
* Log instance.
*/
private static final Log log = LogFactory.getLog(PDShadingResources.class);
/**
* Default constructor.
*/
public PDShadingResources()
{
dictionary = new COSDictionary();
}
/**
* Constructor using the given shading dictionary.
*
* @param shadingDictionary The dictionary for this shading.
*/
public PDShadingResources( COSDictionary shadingDictionary )
{
dictionary = shadingDictionary;
}
/**
* This will get the underlying dictionary.
*
* @return The dictionary for this shading.
*/
public COSDictionary getCOSDictionary()
{
return dictionary;
}
/**
* Convert this standard java object to a COS object.
*
* @return The cos object that matches this Java object.
*/
public COSBase getCOSObject()
{
return dictionary;
}
/**
* This will return the type.
*
* @return The type of object that this is.
*/
public String getType()
{
return COSName.SHADING.getName();
}
/**
* This will set the shading type.
*
* @param shadingType The new shading type.
*/
public void setShadingType(int shadingType)
{
dictionary.setInt(COSName.SHADING_TYPE, shadingType);
}
/**
* This will return the shading type.
*
* @return The shading type
*/
public abstract int getShadingType();
/**
* This will set the background.
*
* @param newBackground The new background.
*/
public void setBackground(COSArray newBackground)
{
background = newBackground;
dictionary.setItem(COSName.BACKGROUND, newBackground);
}
/**
* This will return the background.
*
* @return The background
*/
public COSArray getBackground()
{
if (background == null)
{
background = (COSArray)dictionary.getDictionaryObject( COSName.BACKGROUND );
}
return background;
}
/**
* An array of four numbers in the form coordinate system (see
* below), giving the coordinates of the left, bottom, right, and top edges,
* respectively, of the shadings's bounding box.
*
* @return The BBox of the form.
*/
public PDRectangle getBBox()
{
if (bBox == null)
{
COSArray array = (COSArray)dictionary.getDictionaryObject( COSName.BBOX );
if( array != null )
{
bBox = new PDRectangle( array );
}
}
return bBox;
}
/**
* This will set the BBox (bounding box) for this Shading.
*
* @param newBBox The new BBox.
*/
public void setBBox(PDRectangle newBBox)
{
bBox = newBBox;
if( bBox == null )
{
dictionary.removeItem( COSName.BBOX );
}
else
{
dictionary.setItem( COSName.BBOX, bBox.getCOSArray() );
}
}
/**
* This will set the AntiAlias value.
*
* @param antiAlias The new AntiAlias value.
*/
public void setAntiAlias(boolean antiAlias)
{
dictionary.setBoolean(COSName.ANTI_ALIAS, antiAlias);
}
/**
* This will return the AntiAlias value.
*
* @return The AntiAlias value
*/
public boolean getAntiAlias()
{
return dictionary.getBoolean( COSName.ANTI_ALIAS, false );
}
/**
* This will get the color space or null if none exists.
*
* @return The color space for the shading.
*
* @throws IOException If there is an error getting the colorspace.
*/
public PDColorSpace getColorSpace() throws IOException
{
if( colorspace == null )
{
COSBase colorSpaceDictionary = dictionary.getDictionaryObject( COSName.CS, COSName.COLORSPACE );
colorspace = PDColorSpaceFactory.createColorSpace( colorSpaceDictionary );
}
return colorspace;
}
/**
* This will set the color space for the shading.
*
* @param newColorspace The color space
*/
public void setColorSpace( PDColorSpace newColorspace )
{
colorspace = newColorspace;
if( newColorspace != null )
{
dictionary.setItem( COSName.COLORSPACE, newColorspace.getCOSObject() );
}
else
{
dictionary.removeItem( COSName.COLORSPACE );
}
}
/**
* Create the correct PD Model shading based on the COS base shading.
*
* @param resourceDictionary the COS shading dictionary
*
* @return the newly created shading resources object
*
* @throws IOException If we are unable to create the PDShading object.
*/
public static PDShadingResources create(COSDictionary resourceDictionary) throws IOException
{
PDShadingResources shading = null;
int shadingType = resourceDictionary.getInt( COSName.SHADING_TYPE, 0 );
switch (shadingType)
{
case SHADING_TYPE1:
shading = new PDShadingType1(resourceDictionary);
break;
case SHADING_TYPE2:
shading = new PDShadingType2(resourceDictionary);
break;
case SHADING_TYPE3:
shading = new PDShadingType3(resourceDictionary);
break;
case SHADING_TYPE4:
case SHADING_TYPE5:
case SHADING_TYPE6:
case SHADING_TYPE7:
log.debug( "Error: Unsupported shading type " + shadingType );
break;
default:
throw new IOException( "Error: Unknown shading type " + shadingType );
}
return shading;
}
}