X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FImageMaker.java;h=fa473f3d02be27be9f32cf013ec59454be60c094;hb=HEAD;hp=162e79fbd6c7ac3157df6d89c5be66594977281a;hpb=f9f0b83445a2da848d21614d94a909888484e25e;p=jalview.git diff --git a/src/jalview/util/ImageMaker.java b/src/jalview/util/ImageMaker.java index 162e79f..fa473f3 100755 --- a/src/jalview/util/ImageMaker.java +++ b/src/jalview/util/ImageMaker.java @@ -20,8 +20,6 @@ */ package jalview.util; -import jalview.io.JalviewFileChooser; - import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; @@ -36,6 +34,10 @@ import org.jfree.graphics2d.svg.SVGGraphics2D; import org.jfree.graphics2d.svg.SVGHints; import org.jibble.epsgraphics.EpsGraphics2D; +import jalview.bin.Console; +import jalview.io.JalviewFileChooser; +import jalview.util.imagemaker.BitmapImageSizing; + public class ImageMaker { public static final String SVG_DESCRIPTION = "Scalable Vector Graphics"; @@ -110,26 +112,28 @@ public class ImageMaker * @param file * @param fileTitle * @param useLineart + * @param bitmapscale * @throws IOException */ - public ImageMaker(TYPE imageType, int width, int height, - File file, String fileTitle, boolean useLineart) + public ImageMaker(TYPE imageType, int width, int height, File file, + String fileTitle, boolean useLineart, BitmapImageSizing userBis) throws IOException { this.type = imageType; out = new FileOutputStream(file); - if (imageType == TYPE.SVG) + switch (imageType) { + case SVG: setupSVG(width, height, useLineart); - } - else if (imageType == TYPE.EPS) - { + break; + case EPS: setupEPS(width, height, fileTitle, useLineart); - } - else if (imageType == TYPE.PNG) - { - setupPNG(width, height); + break; + case PNG: + setupPNG(width, height, userBis); + break; + default: } } @@ -176,14 +180,28 @@ public class ImageMaker * * @param width * @param height + * @param scale */ - protected void setupPNG(int width, int height) + protected void setupPNG(int width, int height, BitmapImageSizing userBis) { - bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + if (width == 0 || height == 0) + return; + + BitmapImageSizing bis = ImageMaker.getScaleWidthHeight(width, height, + userBis); + float usescale = bis.scale(); + int usewidth = bis.width(); + int useheight = bis.height(); + + bi = new BufferedImage(usewidth, useheight, BufferedImage.TYPE_INT_RGB); graphics = bi.getGraphics(); Graphics2D ig2 = (Graphics2D) graphics; ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + if (usescale > 0.0f) + { + ig2.scale(usescale, usescale); + } } /** @@ -227,4 +245,142 @@ public class ImageMaker pg.setAccurateTextMode(useLineart); graphics = pg; } + + /** + * Takes initial width and height, and suggested float scale, int width, int + * height and create a bounding box returned as a BitmapImageSizing object + * with consistent scale, width, height fields. + * + * @param width + * The unscaled image width + * @param height + * The unscaled image height + * @param scale + * The suggested scaling + * @param bitmapwidth + * The suggested width + * @param bitmapheight + * The suggested height + * @return BitmapImageSizing A consistent scale,width and height for the final + * image + */ + public static BitmapImageSizing getScaleWidthHeight(int width, int height, + float scale, int bitmapwidth, int bitmapheight) + { + float usescale = 0.0f; + int usewidth = width; + int useheight = height; + + if ((width == 0 && bitmapwidth > 0) + || (height == 0 && bitmapheight > 0)) + { + // original image is zero sized! Avoid dividing by zero! + return BitmapImageSizing.nullBitmapImageSizing(); + } + + // use the smallest positive scale (i.e. fit in the box) + if (scale > 0.0f) + { + usescale = scale; + usewidth = Math.round(scale * width); + useheight = Math.round(scale * height); + } + if (bitmapwidth > 0) + { + float wscale = (float) bitmapwidth / width; + if (wscale > 0.0f && (usescale == 0.0f || wscale < usescale)) + { + usescale = wscale; + usewidth = bitmapwidth; + useheight = Math.round(usescale * height); + } + } + if (bitmapheight > 0) + { + float hscale = (float) bitmapheight / height; + if (hscale > 0.0f && (usescale == 0.0f || hscale < usescale)) + { + usescale = hscale; + usewidth = Math.round(usescale * width); + useheight = bitmapheight; + } + } + return new BitmapImageSizing(usescale, usewidth, useheight, false); + } + + /** + * Takes suggested scale, width, height as a BitmapImageSizing object and + * create a bounding box returned as a BitmapImageSizing object with + * consistent scale, width, height fields. + * + * @param bis + * @return BitmapImageSizing + */ + public static BitmapImageSizing getScaleWidthHeight(int width, int height, + BitmapImageSizing bis) + { + return ImageMaker.getScaleWidthHeight(width, height, bis.scale(), + bis.width(), bis.height()); + } + + /** + * Takes String versions of suggested float scale, int width, int height and + * create a bounding box returned as a BitmapImageSizing object with + * consistent scale, width, height fields. + * + * @param scaleS + * @param widthS + * @param heightS + * @return BitmapImageSizing + */ + public static BitmapImageSizing parseScaleWidthHeightStrings( + String scaleS, String widthS, String heightS) + { + if (scaleS == null && widthS == null && heightS == null) + { + // if all items are null (i.e. not provided) we use the dynamic + // preferences set BIS + return BitmapImageSizing.defaultBitmapImageSizing(); + } + + float scale = 0.0f; + int width = 0; + int height = 0; + + if (scaleS != null) + { + try + { + scale = Float.parseFloat(scaleS); + } catch (NumberFormatException e) + { + Console.warn("Did not understand scale '" + scaleS + + "', won't be used."); + } + } + if (widthS != null) + { + try + { + width = Integer.parseInt(widthS); + } catch (NumberFormatException e) + { + Console.warn("Did not understand width '" + widthS + + "', won't be used."); + } + } + if (heightS != null) + { + try + { + height = Integer.parseInt(heightS); + } catch (NumberFormatException e) + { + Console.warn("Did not understand height '" + heightS + + "', won't be used."); + } + } + + return new BitmapImageSizing(scale, width, height, false); + } }