/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* 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.icepdf.core.pobjects.annotations;
import org.icepdf.core.pobjects.*;
import org.icepdf.core.pobjects.acroform.InteractiveForm;
import org.icepdf.core.pobjects.graphics.Shapes;
import org.icepdf.core.util.Library;
import org.icepdf.core.util.content.ContentParser;
import org.icepdf.core.util.content.ContentParserFactory;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* An appearance dictionary dictionary entry for N, R or D can be associated
* with one or more appearance streams. For example a Widget btn annotation
* can have an /ON and /Off state. This class represents one of the named states.
* The class Appearance stores these named Appearance states.
*
* @since 5.1
*/
public class AppearanceState extends Dictionary {
private static final Logger logger =
Logger.getLogger(AppearanceState.class.toString());
// shapes form appearance stream
protected Shapes shapes;
protected AffineTransform matrix;
protected Rectangle2D bbox;
protected String originalContentStream;
protected Resources resources;
public AppearanceState(Library library, HashMap entries, Object streamOrDictionary) {
super(library, entries);
if (streamOrDictionary instanceof Reference) {
streamOrDictionary = library.getObject((Reference) streamOrDictionary);
}
// gather the state info for the appearance.
if (streamOrDictionary instanceof Form) {
Form form = (Form) streamOrDictionary;
form.init();
originalContentStream = new String(((Form) streamOrDictionary).getDecodedStreamBytes());
resources = form.getResources();
shapes = form.getShapes();
matrix = form.getMatrix();
bbox = form.getBBox();
} else if (streamOrDictionary instanceof Stream) {
Stream stream = (Stream) streamOrDictionary;
resources = library.getResources(stream.getEntries(), Annotation.RESOURCES_VALUE);
bbox = library.getRectangle(stream.getEntries(), Annotation.BBOX_VALUE);
if (bbox == null) {
bbox = library.getRectangle(entries, Annotation.RECTANGLE_KEY);
bbox.setRect(0, 0, bbox.getWidth(), bbox.getHeight());
}
matrix = new AffineTransform();
originalContentStream = new String(stream.getDecodedStreamBytes());
try {
ContentParser cp = ContentParserFactory.getInstance()
.getContentParser(library, resources);
shapes = cp.parse(new byte[][]{stream.getDecodedStreamBytes()}, null).getShapes();
} catch (Exception e) {
shapes = new Shapes();
logger.log(Level.FINE, "Error initializing Page.", e);
}
}
}
public AppearanceState(Library library, HashMap entries) {
super(library, entries);
matrix = new AffineTransform();
bbox = (Rectangle2D) library.getObject(entries, Annotation.BBOX_VALUE);
InteractiveForm form = library.getCatalog().getInteractiveForm();
// assign parent resource if not found in current appearance.
if (form != null){
resources = form.getResources();
}
}
public Shapes getShapes() {
return shapes;
}
public void setShapes(Shapes shapes) {
this.shapes = shapes;
}
public AffineTransform getMatrix() {
return matrix;
}
public void setMatrix(AffineTransform matrix) {
this.matrix = matrix;
}
public Rectangle2D getBbox() {
return bbox;
}
public void setBbox(Rectangle2D bbox) {
this.bbox = bbox;
entries.put(Annotation.BBOX_VALUE, PRectangle.getPRectangleVector(bbox));
}
public Resources getResources() {
return resources;
}
/**
* Gets the original unaltered content stream. When the annotation is initialized the content stream is cached
* and use used in some instances as the base to any content stream editing during an annotation edit.
*
* @return original unaltered content stream.
*/
public String getOriginalContentStream() {
return originalContentStream;
}
public void setContentStream(byte[] contentBytes){
try {
ContentParser cp = ContentParserFactory.getInstance()
.getContentParser(library, resources);
shapes = cp.parse(new byte[][]{contentBytes}, null).getShapes();
} catch (Exception e) {
shapes = new Shapes();
logger.log(Level.FINE, "Error initializing Page.", e);
}
}
}