/* XOWA: the XOWA Offline Wiki Application Copyright (C) 2012 gnosygnu@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui.imgs; import gplx.*; import gplx.gfui.*; import gplx.core.primitives.*; import gplx.core.ios.*; /*IoStream*/ import gplx.core.ios.streams.*; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; public class ImageAdp_ { public static ImageAdp as_(Object obj) {return obj instanceof ImageAdp ? (ImageAdp)obj : null;} public static ImageAdp cast(Object obj) {try {return (ImageAdp)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, ImageAdp.class, obj);}} public static final ImageAdp Null = new_(10, 10); public static ImageAdp new_(int width, int height) { // BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // JAVA: must be TYPE_INT_RGB or else ImageIO.write("bmp") will fail BufferedImage img = getCompatibleImage(width, height); return new ImageAdp_base(img); } public static ImageAdp txt_mem_(Io_url url, SizeAdp size) {return new ImageAdp_txt(url, size);} public static ImageAdp txt_fil_(Io_url url) { String raw = Io_mgr.Instance.LoadFilStr(url); SizeAdp size = null; if (String_.Eq(raw, "")) size = SizeAdp_.Zero; else if (String_.Eq(url.Ext(), ".svg")) size = SizeOf_svg(url); else size = SizeAdp_.parse(raw); return new ImageAdp_txt(url, size); } public static SizeAdp SizeOf_svg(Io_url url) {return Gfui_svg_util.QuerySize(url);} public static ImageAdp file_(Io_url url) { if (url.EqNull()) throw Err_.new_wo_type("cannot load image from null url"); if (String_.Eq(url.Info().Key(), IoUrlInfo_.Mem.Key())) return txt_fil_(url); if (!Io_mgr.Instance.ExistsFil(url)) return Null; BufferedImage img = null; try { File f = new File(url.Xto_api()); img = ImageIO.read(f); } catch (IOException e) {throw Err_.new_exc(e, "ui", "image load failed", "url", url.Xto_api());} // FileInputStream istream = new FileInputStream(new File(url.Xto_api())); // JPEGImageDecoder dec = JPEGCodec.createJPEGDecoder(istream); // BufferedImage im = dec.decodeAsBufferedImage(); // try {img = ImageIO.read(new File());} // catch (IOException e) {} return new ImageAdp_base(img).Url_(url); } private static BufferedImage getCompatibleImage(int w, int h) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gd.getDefaultConfiguration(); BufferedImage image = gc.createCompatibleImage(w, h); // System.out.println("compatible image type = " + image.getType()); return image; } public static int MemorySize(ImageAdp image) { int areaInPixels = image.Height() * image.Width(); BufferedImage bufferedImage = (BufferedImage)image.Under(); int bitsPerPixel = BitsPerPixelCalc(bufferedImage.getType(), image.Url()); // int bitsPerPixel = 4; return areaInPixels * (bitsPerPixel / 8); // 8 bits per byte } static int BitsPerPixelCalc(int imageType, Io_url url) { // REF:http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/BufferedImage.html if (imageType == BufferedImage.TYPE_3BYTE_BGR) return 24; else if (imageType == BufferedImage.TYPE_4BYTE_ABGR) return 32; else if (imageType == BufferedImage.TYPE_4BYTE_ABGR_PRE) return 32; else if (imageType == BufferedImage.TYPE_BYTE_BINARY) return 8; //? else if (imageType == BufferedImage.TYPE_BYTE_GRAY) return 8; //? else if (imageType == BufferedImage.TYPE_BYTE_INDEXED) return 8; //? else if (imageType == BufferedImage.TYPE_CUSTOM) return 8; //? else if (imageType == BufferedImage.TYPE_INT_ARGB) return 32; //? else if (imageType == BufferedImage.TYPE_INT_ARGB_PRE) return 32; //? else if (imageType == BufferedImage.TYPE_INT_BGR) return 32; //? else if (imageType == BufferedImage.TYPE_INT_RGB) return 32; //? else if (imageType == BufferedImage.TYPE_USHORT_555_RGB) return 16; //? else if (imageType == BufferedImage.TYPE_USHORT_565_RGB) return 16; //? else if (imageType == BufferedImage.TYPE_USHORT_GRAY) return 16; //? else {UsrDlg_.Instance.Warn("unknown bits per pixel", "imageType", imageType, "url", url.Xto_api()); return 8;} } } class Gfui_svg_util { public static SizeAdp QuerySize(Io_url url) { try { // NOTE: not using XmlDoc b/c invalid doctypes can cause xml to hang;