1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2025-06-13 12:54:14 +00:00
gnosygnu_xowa/150_gfui/src/gplx/gfui/imgs/ImageAdp_.java

125 lines
6.3 KiB
Java

/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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; <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"><!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns="http://www.w3.org/2000/svg"
String xml = Io_mgr.Instance.LoadFilStr(url);
int pos = String_.FindFwd(xml, "<svg", 0); if (pos == -1) return null;
Int_obj_ref pos_ref = Int_obj_ref.New(pos);
double w = ParseAtr(xml, pos_ref, "width");
double h = ParseAtr(xml, pos_ref, "height");
return SizeAdp_.new_((int)w, (int)h);
} catch (Exception e) {Err_.Noop(e); return SizeAdp_.Null;}
}
static double ParseAtr(String xml, Int_obj_ref pos_ref, String atr) {
int pos = String_.FindFwd(xml, atr, pos_ref.Val()); if (pos == -1) return -1;
int bgn = String_.FindFwd(xml, "\"", pos); if (bgn == -1) return -1;
++bgn; // place after quote
int end = String_.FindFwd(xml, "\"", bgn); if (end == -1) return -1;
int px = String_.FindBwd(xml, "px", end); // handle width="20px"
if (px != -1) end = px;
String str = String_.Mid(xml, bgn, end);
pos_ref.Val_(end);
return Double_.parse(str);
}
}