/* * Copyright (c) 2013 Allogy Interactive. * * 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 com.hsl.txtreader; import java.io.IOException; import java.util.HashMap; import java.util.Map; import android.graphics.Bitmap; import com.sun.pdfview.FunctionType0; import com.sun.pdfview.PDFObject; /** * Encapsulates a PDF Image */ public class PDFImage { public static void dump(PDFObject obj) throws IOException { p("dumping PDF object: " + obj); if (obj == null) { return; } HashMap dict = obj.getDictionary(); p(" dict = " + dict); for (Object key : dict.keySet()) { p("key = " + key + " value = " + dict.get(key)); } } public static void p(String string) { System.out.println(string); } /** color key mask. Array of start/end pairs of ranges of color components to * mask out. If a component falls within any of the ranges it is clear. */ private int[] colorKeyMask = null; /** the width of this image in pixels */ private int width; /** the height of this image in pixels */ private int height; /** the colorspace to interpret the samples in */ //private PDFColorSpace colorSpace; /** the number of bits per sample component */ private int bpc; /** whether this image is a mask or not */ private boolean imageMask = false; /** the SMask image, if any */ private PDFImage sMask; /** the decode array */ private float[] decode; /** the actual image data */ private PDFObject imageObj; /** * Create an instance of a PDFImage */ protected PDFImage(PDFObject imageObj) { this.imageObj = imageObj; } /** * Read a PDFImage from an image dictionary and stream * * @param obj the PDFObject containing the image's dictionary and stream * @param resources the current resources */ public static PDFImage createImage(PDFObject obj, Map resources) throws IOException { return null; } /** * Get the image that this PDFImage generates. * * @return a buffered image containing the decoded image data */ public Bitmap getImage() { return null; } /** * <p>Parse the image stream into a buffered image. Note that this is * guaranteed to be called after all the other setXXX methods have been * called.</p> * * <p>NOTE: the color convolving is extremely slow on large images. * It would be good to see if it could be moved out into the rendering * phases, where we might be able to scale the image down first.</p */ protected Bitmap parseData(byte[] data) { return null; } /** * Get the image's width */ public int getWidth() { return width; } /** * Set the image's width */ protected void setWidth(int width) { this.width = width; } /** * Get the image's height */ public int getHeight() { return height; } /** * Set the image's height */ protected void setHeight(int height) { this.height = height; } /** * set the color key mask. It is an array of start/end entries * to indicate ranges of color indicies that should be masked out. * * @param maskArrayObject */ private void setColorKeyMask(PDFObject maskArrayObject) throws IOException { PDFObject[] maskObjects = maskArrayObject.getArray(); colorKeyMask = null; int[] masks = new int[maskObjects.length]; for (int i = 0; i < masks.length; i++) { masks[i] = maskObjects[i].getIntValue(); } colorKeyMask = masks; } /** * Get the number of bits per component sample */ protected int getBitsPerComponent() { return bpc; } /** * Set the number of bits per component sample */ protected void setBitsPerComponent(int bpc) { this.bpc = bpc; } /** * Return whether or not this is an image mask */ public boolean isImageMask() { return imageMask; } /** * Set whether or not this is an image mask */ public void setImageMask(boolean imageMask) { this.imageMask = imageMask; } /** * Return the soft mask associated with this image */ public PDFImage getSMask() { return sMask; } /** * Set the soft mask image */ protected void setSMask(PDFImage sMask) { this.sMask = sMask; } /** * Get the decode array */ protected float[] getDecode() { return decode; } /** * Set the decode array */ protected void setDecode(float[] decode) { this.decode = decode; } /** * Normalize an array of values to match the decode array */ private float[] normalize(byte[] pixels, float[] normComponents, int normOffset) { if (normComponents == null) { normComponents = new float[normOffset + pixels.length]; } float[] decodeArray = getDecode(); for (int i = 0; i < pixels.length; i++) { int val = pixels[i] & 0xff; int pow = ((int) Math.pow(2, getBitsPerComponent())) - 1; float ymin = decodeArray[i * 2]; float ymax = decodeArray[(i * 2) + 1]; normComponents[normOffset + i] = FunctionType0.interpolate(val, 0, pow, ymin, ymax); } return normComponents; } }