123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /*
- * 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;
-
- import java.awt.Color;
- import java.awt.Dimension;
- import java.awt.geom.AffineTransform;
- import java.awt.geom.Point2D;
- import java.io.IOException;
-
- import org.apache.xmlgraphics.image.loader.ImageSize;
- import org.apache.xmlgraphics.util.MimeConstants;
-
- import org.apache.fop.afp.AFPResourceLevel.ResourceType;
- import org.apache.fop.afp.modca.triplets.MappingOptionTriplet;
- import org.apache.fop.util.bitmap.DitherUtil;
-
-
- /**
- * A painter of rectangles in AFP
- */
- public class AFPDitheredRectanglePainter extends AbstractAFPPainter {
-
- private AFPResourceManager resourceManager;
-
- /**
- * Main constructor
- *
- * @param paintingState the AFP painting state
- * @param dataStream the AFP datastream
- * @param resourceManager the resource manager
- */
- public AFPDitheredRectanglePainter(AFPPaintingState paintingState, DataStream dataStream,
- AFPResourceManager resourceManager) {
- super(paintingState, dataStream);
- this.resourceManager = resourceManager;
- }
-
- /** {@inheritDoc} */
- public void paint(PaintingInfo paintInfo) throws IOException {
- RectanglePaintingInfo rectanglePaintInfo = (RectanglePaintingInfo)paintInfo;
- if (rectanglePaintInfo.getWidth() <= 0 || rectanglePaintInfo.getHeight() <= 0) {
- return;
- }
-
- int ditherMatrix = DitherUtil.DITHER_MATRIX_8X8;
- Dimension ditherSize = new Dimension(ditherMatrix, ditherMatrix);
-
- //Prepare an FS10 bi-level image
- AFPImageObjectInfo imageObjectInfo = new AFPImageObjectInfo();
- imageObjectInfo.setMimeType(MimeConstants.MIME_AFP_IOCA_FS10);
- //imageObjectInfo.setCreatePageSegment(true);
- imageObjectInfo.getResourceInfo().setLevel(new AFPResourceLevel(ResourceType.INLINE));
- imageObjectInfo.getResourceInfo().setImageDimension(ditherSize);
- imageObjectInfo.setBitsPerPixel(1);
- imageObjectInfo.setColor(false);
- //Note: the following may not be supported by older implementations
- imageObjectInfo.setMappingOption(MappingOptionTriplet.REPLICATE_AND_TRIM);
-
- //Dither image size
- int resolution = paintingState.getResolution();
- ImageSize ditherBitmapSize = new ImageSize(
- ditherSize.width, ditherSize.height, resolution);
- imageObjectInfo.setDataHeightRes((int)Math.round(
- ditherBitmapSize.getDpiHorizontal() * 10));
- imageObjectInfo.setDataWidthRes((int)Math.round(
- ditherBitmapSize.getDpiVertical() * 10));
- imageObjectInfo.setDataWidth(ditherSize.width);
- imageObjectInfo.setDataHeight(ditherSize.height);
-
- //Create dither image
- Color col = paintingState.getColor();
- byte[] dither = DitherUtil.getBayerDither(ditherMatrix, col, false);
- imageObjectInfo.setData(dither);
-
- //Positioning
- int rotation = paintingState.getRotation();
- AffineTransform at = paintingState.getData().getTransform();
- Point2D origin = at.transform(new Point2D.Float(
- rectanglePaintInfo.getX() * 1000,
- rectanglePaintInfo.getY() * 1000), null);
- AFPUnitConverter unitConv = paintingState.getUnitConverter();
- float width = unitConv.pt2units(rectanglePaintInfo.getWidth());
- float height = unitConv.pt2units(rectanglePaintInfo.getHeight());
- AFPObjectAreaInfo objectAreaInfo = new AFPObjectAreaInfo(
- (int) Math.round(origin.getX()),
- (int) Math.round(origin.getY()),
- Math.round(width), Math.round(height), resolution, rotation);
- imageObjectInfo.setObjectAreaInfo(objectAreaInfo);
-
- //Create rectangle
- resourceManager.createObject(imageObjectInfo);
- }
-
- }
|