/*
* 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.graphics;
import org.icepdf.core.pobjects.ImageStream;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.pobjects.Resources;
import org.icepdf.core.util.Defs;
/**
* The ImageReferenceFactory determines which implementation of the
* Image Reference should be created. The ImageReference type can be specified
* by the following system properties or alternatively by the enum type.
* <ul>
* <li>org.icepdf.core.imageReference = default</li>
* <li>org.icepdf.core.imageReference = scaled</li>
* <li>org.icepdf.core.imageReference = mipmap</li>
* <li>org.icepdf.core.imageReference = smoothScaled</li>
* </ul>
* The default value returns an unaltered image, scaled returns a scaled
* image instance and there MIP mapped returns/picks a scaled image that
* best fits the current zoom level for a balance of render speed and quality.
*
* @see MipMappedImageReference
* @see ImageStreamReference
* @see ScaledImageReference
* @since 5.0
*/
public class ImageReferenceFactory {
// allow scaling of large images to improve clarity on screen
public enum ImageReference {
DEFAULT, SCALED, MIP_MAP, SMOOTH_SCALED, BLURRED // FLOYD_STEINBERG
}
private static ImageReference scaleType;
static {
// decide if large images will be scaled
String imageReferencetype =
Defs.sysProperty("org.icepdf.core.imageReference",
"default");
if ("scaled".equals(imageReferencetype)) {
scaleType = ImageReference.SCALED;
} else if ("mipmap".equals(imageReferencetype)) {
scaleType = ImageReference.MIP_MAP;
} else if ("smoothScaled".equals(imageReferencetype)) {
scaleType = ImageReference.SMOOTH_SCALED;
} else if ("blurred".equals(imageReferencetype)) {
scaleType = ImageReference.BLURRED;
} else {
scaleType = ImageReference.DEFAULT;
}
}
private ImageReferenceFactory() {
}
public static ImageReference getScaleType() {
return scaleType;
}
public static void setScaleType(ImageReference scaleType) {
ImageReferenceFactory.scaleType = scaleType;
}
/**
* Gets an instance of an ImageReference object for the given image data.
* The ImageReference is specified by the system property org.icepdf.core.imageReference
* or by the static instance variable scale type.
*
* @param imageStream image data
* @param resources parent resource object.
* @param graphicsState image graphic state.
* @return newly create ImageReference.
*/
public static org.icepdf.core.pobjects.graphics.ImageReference
getImageReference(ImageStream imageStream, Resources resources, GraphicsState graphicsState,
Integer imageIndex, Page page) {
switch (scaleType) {
case SCALED:
return new ScaledImageReference(imageStream, graphicsState, resources, imageIndex, page);
case SMOOTH_SCALED:
return new SmoothScaledImageReference(imageStream, graphicsState, resources, imageIndex, page);
case MIP_MAP:
return new MipMappedImageReference(imageStream, graphicsState, resources, imageIndex, page);
case BLURRED:
return new BlurredImageReference(imageStream, graphicsState, resources, imageIndex, page);
default:
return new ImageStreamReference(imageStream, graphicsState, resources, imageIndex, page);
}
}
}