blob: bae75f9fe2783717cfa22a6c0e128f9a607c2ae0 [file] [log] [blame]
/*
* 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.
*/
/* $Id$ */
package org.apache.fop.afp.modca;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.fop.afp.Factory;
import org.apache.fop.afp.ioca.ImageCellPosition;
import org.apache.fop.afp.ioca.ImageInputDescriptor;
import org.apache.fop.afp.ioca.ImageOutputControl;
import org.apache.fop.afp.ioca.ImageRasterData;
import org.apache.fop.afp.ioca.ImageRasterPattern;
/**
* Pages contain the data objects that comprise a presentation document. Each
* page has a set of data objects associated with it. Each page within a
* document is independent from any other page, and each must establish its own
* environment parameters.
*
* The page is the level in the document component hierarchy that is used for
* printing or displaying a document's content. The data objects contained in
* the page envelope in the data stream are presented when the page is
* presented. Each data object has layout information associated with it that
* directs the placement and orientation of the data on the page. In addition,
* each page contains layout information that specifies the measurement units,
* page width, and page depth.
*
* A page is initiated by a begin page structured field and terminated by an end
* page structured field. Structured fields that define objects and active
* environment groups or that specify attributes of the page may be encountered
* in page state.
*
*/
public class PageObject extends AbstractResourceGroupContainer {
/**
* Construct a new page object for the specified name argument, the page
* name should be an 8 character identifier.
*
* @param factory the resource manager
*
* @param name
* the name of the page.
* @param width
* the width of the page.
* @param height
* the height of the page.
* @param rotation
* the rotation of the page.
* @param widthRes
* the width resolution of the page.
* @param heightRes
* the height resolution of the page.
*/
public PageObject(Factory factory,
String name, int width, int height, int rotation,
int widthRes, int heightRes) {
super(factory, name, width, height, rotation, widthRes, heightRes);
}
/**
* Creates an IncludePageOverlay on the page.
*
* @param name
* the name of the overlay
* @param x
* the x position of the overlay
* @param y
* the y position of the overlay
* @param orientation
* the orientation required for the overlay
*/
public void createIncludePageOverlay(String name, int x, int y, int orientation) {
getActiveEnvironmentGroup().createOverlay(name);
IncludePageOverlay ipo = new IncludePageOverlay(name, x, y, orientation);
addObject(ipo);
}
/**
* This method will create shading on the page using the specified
* coordinates (the shading contrast is controlled via the red, green blue
* parameters, by converting this to grayscale).
*
* @param x
* the x coordinate of the shading
* @param y
* the y coordinate of the shading
* @param w
* the width of the shaded area
* @param h
* the height of the shaded area
* @param red
* the red value
* @param green
* the green value
* @param blue
* the blue value
*/
public void createShading(int x, int y, int w, int h, int red, int green, int blue) {
int xCoord = 0;
int yCoord = 0;
int areaWidth = 0;
int areaHeight = 0;
switch (rotation) {
case 90:
xCoord = areaWidth - y - h;
yCoord = x;
areaWidth = h;
areaHeight = w;
break;
case 180:
xCoord = areaWidth - x - w;
yCoord = areaHeight - y - h;
areaWidth = w;
areaHeight = h;
break;
case 270:
xCoord = y;
yCoord = areaHeight - x - w;
areaWidth = h;
areaHeight = w;
break;
default:
xCoord = x;
yCoord = y;
areaWidth = w;
areaHeight = h;
break;
}
// Convert the color to grey scale
float shade = (float) ((red * 0.3) + (green * 0.59) + (blue * 0.11));
int grayscale = Math.round((shade / 255) * 16);
IMImageObject imImageObject = factory.createIMImageObject();
ImageOutputControl imageOutputControl = new ImageOutputControl(0, 0);
ImageInputDescriptor imageInputDescriptor = new ImageInputDescriptor();
ImageCellPosition imageCellPosition = new ImageCellPosition(xCoord, yCoord);
imageCellPosition.setXFillSize(areaWidth);
imageCellPosition.setYFillSize(areaHeight);
imageCellPosition.setXSize(64);
imageCellPosition.setYSize(8);
//defining this as a resource
byte[] rasterData = ImageRasterPattern.getRasterData(grayscale);
ImageRasterData imageRasterData = factory.createImageRasterData(rasterData);
imImageObject.setImageOutputControl(imageOutputControl);
imImageObject.setImageInputDescriptor(imageInputDescriptor);
imImageObject.setImageCellPosition(imageCellPosition);
imImageObject.setImageRasterData(imageRasterData);
addObject(imImageObject);
}
/** {@inheritDoc} */
protected void writeStart(OutputStream os) throws IOException {
byte[] data = new byte[17];
copySF(data, Type.BEGIN, Category.PAGE);
os.write(data);
}
/** {@inheritDoc} */
protected void writeContent(OutputStream os) throws IOException {
writeTriplets(os);
writeObjects(invokeMediumMaps, os);
getActiveEnvironmentGroup().writeToStream(os);
writeObjects(objects, os);
}
/** {@inheritDoc} */
protected void writeEnd(OutputStream os) throws IOException {
byte[] data = new byte[17];
copySF(data, Type.END, Category.PAGE);
os.write(data);
}
/**
* Adds an AFP object reference to this page
*
* @param obj an AFP object
*/
public void addObject(Object obj) {
endPresentationObject();
super.addObject(obj);
}
/** {@inheritDoc} */
public String toString() {
return this.getName();
}
/** {@inheritDoc} */
protected boolean canWrite(AbstractAFPObject ao) {
return true;
}
}