/* * Copyright © 2009-2011 Rebecca G. Bettencourt / Kreative Software * <p> * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * <a href="http://www.mozilla.org/MPL/">http://www.mozilla.org/MPL/</a> * <p> * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * <p> * Alternatively, the contents of this file may be used under the terms * of the GNU Lesser General Public License (the "LGPL License"), in which * case the provisions of LGPL License are applicable instead of those * above. If you wish to allow use of your version of this file only * under the terms of the LGPL License and not to allow others to use * your version of this file under the MPL, indicate your decision by * deleting the provisions above and replace them with the notice and * other provisions required by the LGPL License. If you do not delete * the provisions above, a recipient may use your version of this file * under either the MPL or the LGPL License. * @since PowerPaint 1.0 * @author Rebecca G. Bettencourt, Kreative Software */ package com.kreative.paint.io; import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import java.awt.image.BufferedImage; import java.io.*; import java.util.*; import java.util.zip.*; /* This and ShapeSerializer more or less cover the java.awt package. */ /* This more or less covers the java.awt.font package. */ public class AWTSerializer extends Serializer { private static final int TYPE_ALPHA_COMPOSITE = fcc("AlCx"); private static final int TYPE_BASIC_STROKE = fcc("BStk"); private static final int TYPE_BUFFERED_IMAGE = fcc("BImg"); private static final int TYPE_COLOR = fcc("Colr"); private static final int TYPE_FONT = fcc("Font"); private static final int TYPE_GRADIENT_PAINT = fcc("GPnt"); //private static final int TYPE_IMAGE_GRAPHIC_ATTRIBUTE = fcc("IGAt"); private static final int TYPE_INSETS = fcc("Inse"); private static final int TYPE_NUMERIC_SHAPER = fcc("NmSh"); private static final int TYPE_RENDERING_HINTS = fcc("RdHt"); //private static final int TYPE_SHAPE_GRAPHIC_ATTRIBUTE = fcc("SGAt"); private static final int TYPE_SYSTEM_COLOR = fcc("SClr"); private static final int TYPE_TEXTURE_PAINT = fcc("TPnt"); private static final int TYPE_TRANSFORM_ATTRIBUTE = fcc("TxAt"); private static final int BI_TYPE_3BYTE_BGR = fcc("3bgr"); private static final int BI_TYPE_4BYTE_ABGR = fcc("4abg"); private static final int BI_TYPE_4BYTE_ABGR_PRE = fcc("4abp"); private static final int BI_TYPE_BYTE_BINARY = fcc("bbin"); private static final int BI_TYPE_BYTE_GRAY = fcc("bgry"); private static final int BI_TYPE_BYTE_INDEXED = fcc("bidx"); private static final int BI_TYPE_CUSTOM = fcc("cust"); private static final int BI_TYPE_INT_ARGB = fcc("argb"); private static final int BI_TYPE_INT_ARGB_PRE = fcc("argp"); private static final int BI_TYPE_INT_BGR = fcc("ibgr"); private static final int BI_TYPE_INT_RGB = fcc("irgb"); private static final int BI_TYPE_USHORT_555_RGB = fcc("u555"); private static final int BI_TYPE_USHORT_565_RGB = fcc("u565"); private static final int BI_TYPE_USHORT_GRAY = fcc("ugry"); private static final int KEY_ALPHA_INTERPOLATION = fcc("aint"); private static final int KEY_ANTIALIASING = fcc("aals"); private static final int KEY_COLOR_RENDERING = fcc("cren"); private static final int KEY_DITHERING = fcc("dith"); private static final int KEY_FRACTIONALMETRICS = fcc("fmtx"); private static final int KEY_INTERPOLATION = fcc("inte"); private static final int KEY_RENDERING = fcc("rndr"); private static final int KEY_STROKE_CONTROL = fcc("stct"); private static final int KEY_TEXT_ANTIALIASING = fcc("taal"); private static final int VALUE_ALPHA_INTERPOLATION_DEFAULT = fcc("aidf"); private static final int VALUE_ALPHA_INTERPOLATION_QUALITY = fcc("aiql"); private static final int VALUE_ALPHA_INTERPOLATION_SPEED = fcc("aisp"); private static final int VALUE_ANTIALIAS_DEFAULT = fcc("aadf"); private static final int VALUE_ANTIALIAS_OFF = fcc("aaof"); private static final int VALUE_ANTIALIAS_ON = fcc("aaon"); private static final int VALUE_COLOR_RENDER_DEFAULT = fcc("crdf"); private static final int VALUE_COLOR_RENDER_QUALITY = fcc("crql"); private static final int VALUE_COLOR_RENDER_SPEED = fcc("crsp"); private static final int VALUE_DITHER_DEFAULT = fcc("didf"); private static final int VALUE_DITHER_DISABLE = fcc("didi"); private static final int VALUE_DITHER_ENABLE = fcc("dien"); private static final int VALUE_FRACTIONALMETRICS_DEFAULT = fcc("fmdf"); private static final int VALUE_FRACTIONALMETRICS_OFF = fcc("fmof"); private static final int VALUE_FRACTIONALMETRICS_ON = fcc("fmon"); private static final int VALUE_INTERPOLATION_BICUBIC = fcc("inbc"); private static final int VALUE_INTERPOLATION_BILINEAR = fcc("inbl"); private static final int VALUE_INTERPOLATION_NEAREST_NEIGHBOR = fcc("innn"); private static final int VALUE_RENDER_DEFAULT = fcc("rndf"); private static final int VALUE_RENDER_QUALITY = fcc("rnql"); private static final int VALUE_RENDER_SPEED = fcc("rnsp"); private static final int VALUE_STROKE_DEFAULT = fcc("stdf"); private static final int VALUE_STROKE_NORMALIZE = fcc("stnm"); private static final int VALUE_STROKE_PURE = fcc("stpr"); private static final int VALUE_TEXT_ANTIALIAS_DEFAULT = fcc("tadf"); private static final int VALUE_TEXT_ANTIALIAS_OFF = fcc("taof"); private static final int VALUE_TEXT_ANTIALIAS_ON = fcc("taon"); private static final int SYSTEM_COLOR_ACTIVECAPTION = fcc("acap"); private static final int SYSTEM_COLOR_ACTIVECAPTIONBORDER = fcc("acbd"); private static final int SYSTEM_COLOR_ACTIVECAPTIONTEXT = fcc("actx"); private static final int SYSTEM_COLOR_CONTROL = fcc("ctrl"); private static final int SYSTEM_COLOR_CONTROLDKSHADOW = fcc("cdks"); private static final int SYSTEM_COLOR_CONTROLHIGHLIGHT = fcc("chlt"); private static final int SYSTEM_COLOR_CONTROLLTHIGHLIGHT = fcc("clth"); private static final int SYSTEM_COLOR_CONTROLSHADOW = fcc("csdw"); private static final int SYSTEM_COLOR_CONTROLTEXT = fcc("ctxt"); private static final int SYSTEM_COLOR_DESKTOP = fcc("dktp"); private static final int SYSTEM_COLOR_INACTIVECAPTION = fcc("icap"); private static final int SYSTEM_COLOR_INACTIVECAPTIONBORDER = fcc("icbd"); private static final int SYSTEM_COLOR_INACTIVECAPTIONTEXT = fcc("ictx"); private static final int SYSTEM_COLOR_INFO = fcc("info"); private static final int SYSTEM_COLOR_INFOTEXT = fcc("itxt"); private static final int SYSTEM_COLOR_MENU = fcc("menu"); private static final int SYSTEM_COLOR_MENUTEXT = fcc("mtxt"); private static final int SYSTEM_COLOR_SCROLLBAR = fcc("sbar"); private static final int SYSTEM_COLOR_TEXT = fcc("text"); private static final int SYSTEM_COLOR_TEXTHIGHLIGHT = fcc("thlt"); private static final int SYSTEM_COLOR_TEXTHIGHLIGHTTEXT = fcc("thtx"); private static final int SYSTEM_COLOR_TEXTINACTIVETEXT = fcc("titx"); private static final int SYSTEM_COLOR_TEXTTEXT = fcc("ttxt"); private static final int SYSTEM_COLOR_WINDOW = fcc("wind"); private static final int SYSTEM_COLOR_WINDOWBORDER = fcc("wbdr"); private static final int SYSTEM_COLOR_WINDOWTEXT = fcc("wtxt"); private static final int TEXT_ATTRIBUTE_BACKGROUND = fcc("bkgd"); private static final int TEXT_ATTRIBUTE_BIDI_EMBEDDING = fcc("bidi"); private static final int TEXT_ATTRIBUTE_CHAR_REPLACEMENT = fcc("chrp"); private static final int TEXT_ATTRIBUTE_FAMILY = fcc("ffam"); private static final int TEXT_ATTRIBUTE_FONT = fcc("font"); private static final int TEXT_ATTRIBUTE_FOREGROUND = fcc("frgd"); private static final int TEXT_ATTRIBUTE_INPUT_METHOD_HIGHLIGHT = fcc("imhl"); private static final int TEXT_ATTRIBUTE_INPUT_METHOD_UNDERLINE = fcc("imul"); private static final int TEXT_ATTRIBUTE_JUSTIFICATION = fcc("jstf"); private static final int TEXT_ATTRIBUTE_NUMERIC_SHAPING = fcc("nmsh"); private static final int TEXT_ATTRIBUTE_POSTURE = fcc("pstr"); private static final int TEXT_ATTRIBUTE_RUN_DIRECTION = fcc("rdir"); private static final int TEXT_ATTRIBUTE_SIZE = fcc("fsiz"); private static final int TEXT_ATTRIBUTE_STRIKETHROUGH = fcc("strk"); private static final int TEXT_ATTRIBUTE_SUPERSCRIPT = fcc("supr"); private static final int TEXT_ATTRIBUTE_SWAP_COLORS = fcc("swap"); private static final int TEXT_ATTRIBUTE_TRANSFORM = fcc("trfm"); private static final int TEXT_ATTRIBUTE_UNDERLINE = fcc("undl"); private static final int TEXT_ATTRIBUTE_WEIGHT = fcc("wght"); private static final int TEXT_ATTRIBUTE_WIDTH = fcc("wdth"); protected void loadRecognizedTypesAndClasses() { addTypeAndClass(TYPE_ALPHA_COMPOSITE, 1, AlphaComposite.class); addTypeAndClass(TYPE_BASIC_STROKE, 1, BasicStroke.class); addTypeAndClass(TYPE_BUFFERED_IMAGE, 1, BufferedImage.class); addTypeAndClass(TYPE_COLOR, 1, Color.class); addTypeAndClass(TYPE_FONT, 1, Font.class); addTypeAndClass(TYPE_GRADIENT_PAINT, 1, GradientPaint.class); //addTypeAndClass(TYPE_IMAGE_GRAPHIC_ATTRIBUTE, 1, ImageGraphicAttribute.class); addTypeAndClass(TYPE_INSETS, 1, Insets.class); addTypeAndClass(TYPE_NUMERIC_SHAPER, 1, NumericShaper.class); addTypeAndClass(TYPE_RENDERING_HINTS, 1, RenderingHints.class); //addTypeAndClass(TYPE_SHAPE_GRAPHIC_ATTRIBUTE, 1, ShapeGraphicAttribute.class); addTypeAndClass(TYPE_SYSTEM_COLOR, 1, SystemColor.class); addTypeAndClass(TYPE_TEXTURE_PAINT, 1, TexturePaint.class); addTypeAndClass(TYPE_TRANSFORM_ATTRIBUTE, 1, TransformAttribute.class); } public void serializeObject(Object o, DataOutputStream stream) throws IOException { if (o instanceof AlphaComposite) { AlphaComposite v = (AlphaComposite)o; stream.writeInt(v.getRule()); stream.writeFloat(v.getAlpha()); } else if (o instanceof BasicStroke) { BasicStroke v = (BasicStroke)o; stream.writeFloat(v.getLineWidth()); stream.writeInt(v.getEndCap()); stream.writeInt(v.getLineJoin()); stream.writeFloat(v.getMiterLimit()); stream.writeFloat(v.getDashPhase()); float[] dash = v.getDashArray(); if (dash == null) stream.writeInt(-1); else { stream.writeInt(dash.length); for (int i = 0; i < dash.length; i++) { stream.writeFloat(dash[i]); } } } else if (o instanceof BufferedImage) { BufferedImage v = (BufferedImage)o; stream.writeInt(v.getWidth()); stream.writeInt(v.getHeight()); if (v.getType() == BufferedImage.TYPE_3BYTE_BGR) stream.writeInt(BI_TYPE_3BYTE_BGR); else if (v.getType() == BufferedImage.TYPE_4BYTE_ABGR) stream.writeInt(BI_TYPE_4BYTE_ABGR); else if (v.getType() == BufferedImage.TYPE_4BYTE_ABGR_PRE) stream.writeInt(BI_TYPE_4BYTE_ABGR_PRE); else if (v.getType() == BufferedImage.TYPE_BYTE_BINARY) stream.writeInt(BI_TYPE_BYTE_BINARY); else if (v.getType() == BufferedImage.TYPE_BYTE_GRAY) stream.writeInt(BI_TYPE_BYTE_GRAY); else if (v.getType() == BufferedImage.TYPE_BYTE_INDEXED) stream.writeInt(BI_TYPE_BYTE_INDEXED); else if (v.getType() == BufferedImage.TYPE_CUSTOM) stream.writeInt(BI_TYPE_CUSTOM); else if (v.getType() == BufferedImage.TYPE_INT_ARGB) stream.writeInt(BI_TYPE_INT_ARGB); else if (v.getType() == BufferedImage.TYPE_INT_ARGB_PRE) stream.writeInt(BI_TYPE_INT_ARGB_PRE); else if (v.getType() == BufferedImage.TYPE_INT_BGR) stream.writeInt(BI_TYPE_INT_BGR); else if (v.getType() == BufferedImage.TYPE_INT_RGB) stream.writeInt(BI_TYPE_INT_RGB); else if (v.getType() == BufferedImage.TYPE_USHORT_555_RGB) stream.writeInt(BI_TYPE_USHORT_555_RGB); else if (v.getType() == BufferedImage.TYPE_USHORT_565_RGB) stream.writeInt(BI_TYPE_USHORT_565_RGB); else if (v.getType() == BufferedImage.TYPE_USHORT_GRAY) stream.writeInt(BI_TYPE_USHORT_GRAY); else stream.writeInt(0x3F3F3F3F); int[] rgb = new int[v.getWidth()*v.getHeight()]; v.getRGB(0, 0, v.getWidth(), v.getHeight(), rgb, 0, v.getWidth()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); DeflaterOutputStream dos = new DeflaterOutputStream(bos); for (int p : rgb) dos.write((p >> 24) & 0xFF); for (int p : rgb) dos.write((p >> 16) & 0xFF); for (int p : rgb) dos.write((p >> 8) & 0xFF); for (int p : rgb) dos.write(p & 0xFF); dos.finish(); dos.close(); bos.close(); byte crgb[] = bos.toByteArray(); stream.writeInt(crgb.length); stream.write(crgb); } else if (o instanceof Color) { Color v = (Color)o; float[] rgb = v.getRGBComponents(null); stream.writeFloat(rgb[0]); stream.writeFloat(rgb[1]); stream.writeFloat(rgb[2]); stream.writeFloat(rgb[3]); } else if (o instanceof Font) { Font v = (Font)o; Map<TextAttribute,?> att = v.getAttributes(); stream.writeInt(att.size()); for (Map.Entry<TextAttribute, ?> e : att.entrySet()) { if (e.getKey() == TextAttribute.BACKGROUND) stream.writeInt(TEXT_ATTRIBUTE_BACKGROUND); else if (e.getKey() == TextAttribute.BIDI_EMBEDDING) stream.writeInt(TEXT_ATTRIBUTE_BIDI_EMBEDDING); else if (e.getKey() == TextAttribute.CHAR_REPLACEMENT) stream.writeInt(TEXT_ATTRIBUTE_CHAR_REPLACEMENT); else if (e.getKey() == TextAttribute.FAMILY) stream.writeInt(TEXT_ATTRIBUTE_FAMILY); else if (e.getKey() == TextAttribute.FONT) stream.writeInt(TEXT_ATTRIBUTE_FONT); else if (e.getKey() == TextAttribute.FOREGROUND) stream.writeInt(TEXT_ATTRIBUTE_FOREGROUND); else if (e.getKey() == TextAttribute.INPUT_METHOD_HIGHLIGHT) stream.writeInt(TEXT_ATTRIBUTE_INPUT_METHOD_HIGHLIGHT); else if (e.getKey() == TextAttribute.INPUT_METHOD_UNDERLINE) stream.writeInt(TEXT_ATTRIBUTE_INPUT_METHOD_UNDERLINE); else if (e.getKey() == TextAttribute.JUSTIFICATION) stream.writeInt(TEXT_ATTRIBUTE_JUSTIFICATION); else if (e.getKey() == TextAttribute.NUMERIC_SHAPING) stream.writeInt(TEXT_ATTRIBUTE_NUMERIC_SHAPING); else if (e.getKey() == TextAttribute.POSTURE) stream.writeInt(TEXT_ATTRIBUTE_POSTURE); else if (e.getKey() == TextAttribute.RUN_DIRECTION) stream.writeInt(TEXT_ATTRIBUTE_RUN_DIRECTION); else if (e.getKey() == TextAttribute.SIZE) stream.writeInt(TEXT_ATTRIBUTE_SIZE); else if (e.getKey() == TextAttribute.STRIKETHROUGH) stream.writeInt(TEXT_ATTRIBUTE_STRIKETHROUGH); else if (e.getKey() == TextAttribute.SUPERSCRIPT) stream.writeInt(TEXT_ATTRIBUTE_SUPERSCRIPT); else if (e.getKey() == TextAttribute.SWAP_COLORS) stream.writeInt(TEXT_ATTRIBUTE_SWAP_COLORS); else if (e.getKey() == TextAttribute.TRANSFORM) stream.writeInt(TEXT_ATTRIBUTE_TRANSFORM); else if (e.getKey() == TextAttribute.UNDERLINE) stream.writeInt(TEXT_ATTRIBUTE_UNDERLINE); else if (e.getKey() == TextAttribute.WEIGHT) stream.writeInt(TEXT_ATTRIBUTE_WEIGHT); else if (e.getKey() == TextAttribute.WIDTH) stream.writeInt(TEXT_ATTRIBUTE_WIDTH); else stream.writeInt(0x3F3F3F3F); if (e.getValue() instanceof Font) SerializationManager.writeObject(null, stream); else SerializationManager.writeObject(e.getValue(), stream); } } else if (o instanceof GradientPaint) { GradientPaint v = (GradientPaint)o; SerializationManager.writeObject(v.getColor1(), stream); SerializationManager.writeObject(v.getColor2(), stream); SerializationManager.writeObject(v.getPoint1(), stream); SerializationManager.writeObject(v.getPoint2(), stream); stream.writeBoolean(v.isCyclic()); } else if (o instanceof Insets) { Insets v = (Insets)o; stream.writeInt(v.top); stream.writeInt(v.left); stream.writeInt(v.bottom); stream.writeInt(v.right); } else if (o instanceof NumericShaper) { NumericShaper v = (NumericShaper)o; stream.writeInt(v.getRanges()); stream.writeBoolean(v.isContextual()); } else if (o instanceof RenderingHints) { RenderingHints v = (RenderingHints)o; stream.writeInt(v.size()); for (Map.Entry<Object,Object> e : v.entrySet()) { if (e.getKey() == RenderingHints.KEY_ALPHA_INTERPOLATION) stream.writeInt(KEY_ALPHA_INTERPOLATION); else if (e.getKey() == RenderingHints.KEY_ANTIALIASING) stream.writeInt(KEY_ANTIALIASING); else if (e.getKey() == RenderingHints.KEY_COLOR_RENDERING) stream.writeInt(KEY_COLOR_RENDERING); else if (e.getKey() == RenderingHints.KEY_DITHERING) stream.writeInt(KEY_DITHERING); else if (e.getKey() == RenderingHints.KEY_FRACTIONALMETRICS) stream.writeInt(KEY_FRACTIONALMETRICS); else if (e.getKey() == RenderingHints.KEY_INTERPOLATION) stream.writeInt(KEY_INTERPOLATION); else if (e.getKey() == RenderingHints.KEY_RENDERING) stream.writeInt(KEY_RENDERING); else if (e.getKey() == RenderingHints.KEY_STROKE_CONTROL) stream.writeInt(KEY_STROKE_CONTROL); else if (e.getKey() == RenderingHints.KEY_TEXT_ANTIALIASING) stream.writeInt(KEY_TEXT_ANTIALIASING); else stream.writeInt(0x3F3F3F3F); if (e.getValue() == RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT) stream.writeInt(VALUE_ALPHA_INTERPOLATION_DEFAULT); else if (e.getValue() == RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY) stream.writeInt(VALUE_ALPHA_INTERPOLATION_QUALITY); else if (e.getValue() == RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED) stream.writeInt(VALUE_ALPHA_INTERPOLATION_SPEED); else if (e.getValue() == RenderingHints.VALUE_ANTIALIAS_DEFAULT) stream.writeInt(VALUE_ANTIALIAS_DEFAULT); else if (e.getValue() == RenderingHints.VALUE_ANTIALIAS_OFF) stream.writeInt(VALUE_ANTIALIAS_OFF); else if (e.getValue() == RenderingHints.VALUE_ANTIALIAS_ON) stream.writeInt(VALUE_ANTIALIAS_ON); else if (e.getValue() == RenderingHints.VALUE_COLOR_RENDER_DEFAULT) stream.writeInt(VALUE_COLOR_RENDER_DEFAULT); else if (e.getValue() == RenderingHints.VALUE_COLOR_RENDER_QUALITY) stream.writeInt(VALUE_COLOR_RENDER_QUALITY); else if (e.getValue() == RenderingHints.VALUE_COLOR_RENDER_SPEED) stream.writeInt(VALUE_COLOR_RENDER_SPEED); else if (e.getValue() == RenderingHints.VALUE_DITHER_DEFAULT) stream.writeInt(VALUE_DITHER_DEFAULT); else if (e.getValue() == RenderingHints.VALUE_DITHER_DISABLE) stream.writeInt(VALUE_DITHER_DISABLE); else if (e.getValue() == RenderingHints.VALUE_DITHER_ENABLE) stream.writeInt(VALUE_DITHER_ENABLE); else if (e.getValue() == RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT) stream.writeInt(VALUE_FRACTIONALMETRICS_DEFAULT); else if (e.getValue() == RenderingHints.VALUE_FRACTIONALMETRICS_OFF) stream.writeInt(VALUE_FRACTIONALMETRICS_OFF); else if (e.getValue() == RenderingHints.VALUE_FRACTIONALMETRICS_ON) stream.writeInt(VALUE_FRACTIONALMETRICS_ON); else if (e.getValue() == RenderingHints.VALUE_INTERPOLATION_BICUBIC) stream.writeInt(VALUE_INTERPOLATION_BICUBIC); else if (e.getValue() == RenderingHints.VALUE_INTERPOLATION_BILINEAR) stream.writeInt(VALUE_INTERPOLATION_BILINEAR); else if (e.getValue() == RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR) stream.writeInt(VALUE_INTERPOLATION_NEAREST_NEIGHBOR); else if (e.getValue() == RenderingHints.VALUE_RENDER_DEFAULT) stream.writeInt(VALUE_RENDER_DEFAULT); else if (e.getValue() == RenderingHints.VALUE_RENDER_QUALITY) stream.writeInt(VALUE_RENDER_QUALITY); else if (e.getValue() == RenderingHints.VALUE_RENDER_SPEED) stream.writeInt(VALUE_RENDER_SPEED); else if (e.getValue() == RenderingHints.VALUE_STROKE_DEFAULT) stream.writeInt(VALUE_STROKE_DEFAULT); else if (e.getValue() == RenderingHints.VALUE_STROKE_NORMALIZE) stream.writeInt(VALUE_STROKE_NORMALIZE); else if (e.getValue() == RenderingHints.VALUE_STROKE_PURE) stream.writeInt(VALUE_STROKE_PURE); else if (e.getValue() == RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT) stream.writeInt(VALUE_TEXT_ANTIALIAS_DEFAULT); else if (e.getValue() == RenderingHints.VALUE_TEXT_ANTIALIAS_OFF) stream.writeInt(VALUE_TEXT_ANTIALIAS_OFF); else if (e.getValue() == RenderingHints.VALUE_TEXT_ANTIALIAS_ON) stream.writeInt(VALUE_TEXT_ANTIALIAS_ON); else stream.writeInt(0x3F3F3F3F); } } else if (o instanceof SystemColor) { SystemColor v = (SystemColor)o; if (v == SystemColor.activeCaption) stream.writeInt(SYSTEM_COLOR_ACTIVECAPTION); else if (v == SystemColor.activeCaptionBorder) stream.writeInt(SYSTEM_COLOR_ACTIVECAPTIONBORDER); else if (v == SystemColor.activeCaptionText) stream.writeInt(SYSTEM_COLOR_ACTIVECAPTIONTEXT); else if (v == SystemColor.control) stream.writeInt(SYSTEM_COLOR_CONTROL); else if (v == SystemColor.controlDkShadow) stream.writeInt(SYSTEM_COLOR_CONTROLDKSHADOW); else if (v == SystemColor.controlHighlight) stream.writeInt(SYSTEM_COLOR_CONTROLHIGHLIGHT); else if (v == SystemColor.controlLtHighlight) stream.writeInt(SYSTEM_COLOR_CONTROLLTHIGHLIGHT); else if (v == SystemColor.controlShadow) stream.writeInt(SYSTEM_COLOR_CONTROLSHADOW); else if (v == SystemColor.controlText) stream.writeInt(SYSTEM_COLOR_CONTROLTEXT); else if (v == SystemColor.desktop) stream.writeInt(SYSTEM_COLOR_DESKTOP); else if (v == SystemColor.inactiveCaption) stream.writeInt(SYSTEM_COLOR_INACTIVECAPTION); else if (v == SystemColor.inactiveCaptionBorder) stream.writeInt(SYSTEM_COLOR_INACTIVECAPTIONBORDER); else if (v == SystemColor.inactiveCaptionText) stream.writeInt(SYSTEM_COLOR_INACTIVECAPTIONTEXT); else if (v == SystemColor.info) stream.writeInt(SYSTEM_COLOR_INFO); else if (v == SystemColor.infoText) stream.writeInt(SYSTEM_COLOR_INFOTEXT); else if (v == SystemColor.menu) stream.writeInt(SYSTEM_COLOR_MENU); else if (v == SystemColor.menuText) stream.writeInt(SYSTEM_COLOR_MENUTEXT); else if (v == SystemColor.scrollbar) stream.writeInt(SYSTEM_COLOR_SCROLLBAR); else if (v == SystemColor.text) stream.writeInt(SYSTEM_COLOR_TEXT); else if (v == SystemColor.textHighlight) stream.writeInt(SYSTEM_COLOR_TEXTHIGHLIGHT); else if (v == SystemColor.textHighlightText) stream.writeInt(SYSTEM_COLOR_TEXTHIGHLIGHTTEXT); else if (v == SystemColor.textInactiveText) stream.writeInt(SYSTEM_COLOR_TEXTINACTIVETEXT); else if (v == SystemColor.textText) stream.writeInt(SYSTEM_COLOR_TEXTTEXT); else if (v == SystemColor.window) stream.writeInt(SYSTEM_COLOR_WINDOW); else if (v == SystemColor.windowBorder) stream.writeInt(SYSTEM_COLOR_WINDOWBORDER); else if (v == SystemColor.windowText) stream.writeInt(SYSTEM_COLOR_WINDOWTEXT); else stream.writeInt(0x3F3F3F3F); } else if (o instanceof TexturePaint) { TexturePaint v = (TexturePaint)o; SerializationManager.writeObject(v.getAnchorRect(), stream); SerializationManager.writeObject(v.getImage(), stream); } else if (o instanceof TransformAttribute) { AffineTransform v = ((TransformAttribute)o).getTransform(); double[] m = new double[6]; v.getMatrix(m); for (int i = 0; i < 6; i++) { stream.writeDouble(m[i]); } } } public Object deserializeObject(int type, int version, DataInputStream stream) throws IOException { if (version != 1) throw new IOException("Invalid version number."); else if (type == TYPE_ALPHA_COMPOSITE) { int r = stream.readInt(); float a = stream.readFloat(); return AlphaComposite.getInstance(r,a); } else if (type == TYPE_BASIC_STROKE) { float lw = stream.readFloat(); int ec = stream.readInt(); int lj = stream.readInt(); float ml = stream.readFloat(); float dp = stream.readFloat(); int n = stream.readInt(); float[] dash; if (n < 0) { dash = null; } else { dash = new float[n]; for (int i = 0; i < n; i++) { dash[i] = stream.readFloat(); } } return new BasicStroke(lw, ec, lj, ml, dash, dp); } else if (type == TYPE_BUFFERED_IMAGE) { int w = stream.readInt(); int h = stream.readInt(); int t = stream.readInt(); int bt; if (t == BI_TYPE_3BYTE_BGR) bt = BufferedImage.TYPE_3BYTE_BGR; else if (t == BI_TYPE_4BYTE_ABGR) bt = BufferedImage.TYPE_4BYTE_ABGR; else if (t == BI_TYPE_4BYTE_ABGR_PRE) bt = BufferedImage.TYPE_4BYTE_ABGR_PRE; else if (t == BI_TYPE_BYTE_BINARY) bt = BufferedImage.TYPE_BYTE_BINARY; else if (t == BI_TYPE_BYTE_GRAY) bt = BufferedImage.TYPE_BYTE_GRAY; else if (t == BI_TYPE_BYTE_INDEXED) bt = BufferedImage.TYPE_BYTE_INDEXED; else if (t == BI_TYPE_CUSTOM) bt = BufferedImage.TYPE_CUSTOM; else if (t == BI_TYPE_INT_ARGB) bt = BufferedImage.TYPE_INT_ARGB; else if (t == BI_TYPE_INT_ARGB_PRE) bt = BufferedImage.TYPE_INT_ARGB_PRE; else if (t == BI_TYPE_INT_BGR) bt = BufferedImage.TYPE_INT_BGR; else if (t == BI_TYPE_INT_RGB) bt = BufferedImage.TYPE_INT_RGB; else if (t == BI_TYPE_USHORT_555_RGB) bt = BufferedImage.TYPE_USHORT_555_RGB; else if (t == BI_TYPE_USHORT_565_RGB) bt = BufferedImage.TYPE_USHORT_565_RGB; else if (t == BI_TYPE_USHORT_GRAY) bt = BufferedImage.TYPE_USHORT_GRAY; else bt = BufferedImage.TYPE_INT_ARGB; int l = stream.readInt(); byte[] crgb = new byte[l]; stream.read(crgb); int[] rgb = new int[w*h]; ByteArrayInputStream bis = new ByteArrayInputStream(crgb); InflaterInputStream iis = new InflaterInputStream(bis); for (int i = 0; i < rgb.length; i++) rgb[i] |= ((iis.read() << 24) & 0xFF000000); for (int i = 0; i < rgb.length; i++) rgb[i] |= ((iis.read() << 16) & 0x00FF0000); for (int i = 0; i < rgb.length; i++) rgb[i] |= ((iis.read() << 8) & 0xFF00); for (int i = 0; i < rgb.length; i++) rgb[i] |= (iis.read() & 0xFF); iis.close(); bis.close(); BufferedImage bi = new BufferedImage(w,h,bt); bi.setRGB(0, 0, w, h, rgb, 0, w); return bi; } else if (type == TYPE_COLOR) { float r = stream.readFloat(); float g = stream.readFloat(); float b = stream.readFloat(); float a = stream.readFloat(); return new Color(r,g,b,a); } else if (type == TYPE_FONT) { int n = stream.readInt(); Map<TextAttribute,Object> att = new HashMap<TextAttribute,Object>(); for (int i = 0; i < n; i++) { int k = stream.readInt(); Object v = SerializationManager.readObject(stream); TextAttribute ka; if (k == TEXT_ATTRIBUTE_BACKGROUND) ka = TextAttribute.BACKGROUND; else if (k == TEXT_ATTRIBUTE_BIDI_EMBEDDING) ka = TextAttribute.BIDI_EMBEDDING; else if (k == TEXT_ATTRIBUTE_CHAR_REPLACEMENT) ka = TextAttribute.CHAR_REPLACEMENT; else if (k == TEXT_ATTRIBUTE_FAMILY) ka = TextAttribute.FAMILY; else if (k == TEXT_ATTRIBUTE_FONT) ka = TextAttribute.FONT; else if (k == TEXT_ATTRIBUTE_FOREGROUND) ka = TextAttribute.FOREGROUND; else if (k == TEXT_ATTRIBUTE_INPUT_METHOD_HIGHLIGHT) ka = TextAttribute.INPUT_METHOD_HIGHLIGHT; else if (k == TEXT_ATTRIBUTE_INPUT_METHOD_UNDERLINE) ka = TextAttribute.INPUT_METHOD_UNDERLINE; else if (k == TEXT_ATTRIBUTE_JUSTIFICATION) ka = TextAttribute.JUSTIFICATION; else if (k == TEXT_ATTRIBUTE_NUMERIC_SHAPING) ka = TextAttribute.NUMERIC_SHAPING; else if (k == TEXT_ATTRIBUTE_POSTURE) ka = TextAttribute.POSTURE; else if (k == TEXT_ATTRIBUTE_RUN_DIRECTION) ka = TextAttribute.RUN_DIRECTION; else if (k == TEXT_ATTRIBUTE_SIZE) ka = TextAttribute.SIZE; else if (k == TEXT_ATTRIBUTE_STRIKETHROUGH) ka = TextAttribute.STRIKETHROUGH; else if (k == TEXT_ATTRIBUTE_SUPERSCRIPT) ka = TextAttribute.SUPERSCRIPT; else if (k == TEXT_ATTRIBUTE_SWAP_COLORS) ka = TextAttribute.SWAP_COLORS; else if (k == TEXT_ATTRIBUTE_TRANSFORM) ka = TextAttribute.TRANSFORM; else if (k == TEXT_ATTRIBUTE_UNDERLINE) ka = TextAttribute.UNDERLINE; else if (k == TEXT_ATTRIBUTE_WEIGHT) ka = TextAttribute.WEIGHT; else if (k == TEXT_ATTRIBUTE_WIDTH) ka = TextAttribute.WIDTH; else continue; att.put(ka, v); } try { return new Font(att); } catch (NullPointerException npe) { return new Font("SansSerif", Font.PLAIN, 12); } } else if (type == TYPE_GRADIENT_PAINT) { Color c1 = (Color)SerializationManager.readObject(stream); Color c2 = (Color)SerializationManager.readObject(stream); Point2D p1 = (Point2D)SerializationManager.readObject(stream); Point2D p2 = (Point2D)SerializationManager.readObject(stream); boolean c = stream.readBoolean(); return new GradientPaint(p1,c1,p2,c2,c); } else if (type == TYPE_INSETS) { int t = stream.readInt(); int l = stream.readInt(); int b = stream.readInt(); int r = stream.readInt(); return new Insets(t,l,b,r); } else if (type == TYPE_NUMERIC_SHAPER) { int r = stream.readInt(); boolean c = stream.readBoolean(); if (c) return NumericShaper.getContextualShaper(r); else return NumericShaper.getShaper(r); } else if (type == TYPE_RENDERING_HINTS) { RenderingHints rh = new RenderingHints(null); int n = stream.readInt(); for (int i = 0; i < n; i++) { int k = stream.readInt(); int v = stream.readInt(); Object ko; Object vo; if (k == KEY_ALPHA_INTERPOLATION) ko = RenderingHints.KEY_ALPHA_INTERPOLATION; else if (k == KEY_ANTIALIASING) ko = RenderingHints.KEY_ANTIALIASING; else if (k == KEY_COLOR_RENDERING) ko = RenderingHints.KEY_COLOR_RENDERING; else if (k == KEY_DITHERING) ko = RenderingHints.KEY_DITHERING; else if (k == KEY_FRACTIONALMETRICS) ko = RenderingHints.KEY_FRACTIONALMETRICS; else if (k == KEY_INTERPOLATION) ko = RenderingHints.KEY_INTERPOLATION; else if (k == KEY_RENDERING) ko = RenderingHints.KEY_RENDERING; else if (k == KEY_STROKE_CONTROL) ko = RenderingHints.KEY_STROKE_CONTROL; else if (k == KEY_TEXT_ANTIALIASING) ko = RenderingHints.KEY_TEXT_ANTIALIASING; else continue; if (v == VALUE_ALPHA_INTERPOLATION_DEFAULT) vo = RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT; else if (v == VALUE_ALPHA_INTERPOLATION_QUALITY) vo = RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY; else if (v == VALUE_ALPHA_INTERPOLATION_SPEED) vo = RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED; else if (v == VALUE_ANTIALIAS_DEFAULT) vo = RenderingHints.VALUE_ANTIALIAS_DEFAULT; else if (v == VALUE_ANTIALIAS_OFF) vo = RenderingHints.VALUE_ANTIALIAS_OFF; else if (v == VALUE_ANTIALIAS_ON) vo = RenderingHints.VALUE_ANTIALIAS_ON; else if (v == VALUE_COLOR_RENDER_DEFAULT) vo = RenderingHints.VALUE_COLOR_RENDER_DEFAULT; else if (v == VALUE_COLOR_RENDER_QUALITY) vo = RenderingHints.VALUE_COLOR_RENDER_QUALITY; else if (v == VALUE_COLOR_RENDER_SPEED) vo = RenderingHints.VALUE_COLOR_RENDER_SPEED; else if (v == VALUE_DITHER_DEFAULT) vo = RenderingHints.VALUE_DITHER_DEFAULT; else if (v == VALUE_DITHER_DISABLE) vo = RenderingHints.VALUE_DITHER_DISABLE; else if (v == VALUE_DITHER_ENABLE) vo = RenderingHints.VALUE_DITHER_ENABLE; else if (v == VALUE_FRACTIONALMETRICS_DEFAULT) vo = RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT; else if (v == VALUE_FRACTIONALMETRICS_OFF) vo = RenderingHints.VALUE_FRACTIONALMETRICS_OFF; else if (v == VALUE_FRACTIONALMETRICS_ON) vo = RenderingHints.VALUE_FRACTIONALMETRICS_ON; else if (v == VALUE_INTERPOLATION_BICUBIC) vo = RenderingHints.VALUE_INTERPOLATION_BICUBIC; else if (v == VALUE_INTERPOLATION_BILINEAR) vo = RenderingHints.VALUE_INTERPOLATION_BILINEAR; else if (v == VALUE_INTERPOLATION_NEAREST_NEIGHBOR) vo = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR; else if (v == VALUE_RENDER_DEFAULT) vo = RenderingHints.VALUE_RENDER_DEFAULT; else if (v == VALUE_RENDER_QUALITY) vo = RenderingHints.VALUE_RENDER_QUALITY; else if (v == VALUE_RENDER_SPEED) vo = RenderingHints.VALUE_RENDER_SPEED; else if (v == VALUE_STROKE_DEFAULT) vo = RenderingHints.VALUE_STROKE_DEFAULT; else if (v == VALUE_STROKE_NORMALIZE) vo = RenderingHints.VALUE_STROKE_NORMALIZE; else if (v == VALUE_STROKE_PURE) vo = RenderingHints.VALUE_STROKE_PURE; else if (v == VALUE_TEXT_ANTIALIAS_DEFAULT) vo = RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT; else if (v == VALUE_TEXT_ANTIALIAS_OFF) vo = RenderingHints.VALUE_TEXT_ANTIALIAS_OFF; else if (v == VALUE_TEXT_ANTIALIAS_ON) vo = RenderingHints.VALUE_TEXT_ANTIALIAS_ON; else continue; rh.put(ko, vo); } return rh; } else if (type == TYPE_SYSTEM_COLOR) { int i = stream.readInt(); if (i == SYSTEM_COLOR_ACTIVECAPTION) return SystemColor.activeCaption; else if (i == SYSTEM_COLOR_ACTIVECAPTIONBORDER) return SystemColor.activeCaptionBorder; else if (i == SYSTEM_COLOR_ACTIVECAPTIONTEXT) return SystemColor.activeCaptionText; else if (i == SYSTEM_COLOR_CONTROL) return SystemColor.control; else if (i == SYSTEM_COLOR_CONTROLDKSHADOW) return SystemColor.controlDkShadow; else if (i == SYSTEM_COLOR_CONTROLHIGHLIGHT) return SystemColor.controlHighlight; else if (i == SYSTEM_COLOR_CONTROLLTHIGHLIGHT) return SystemColor.controlLtHighlight; else if (i == SYSTEM_COLOR_CONTROLSHADOW) return SystemColor.controlShadow; else if (i == SYSTEM_COLOR_CONTROLTEXT) return SystemColor.controlText; else if (i == SYSTEM_COLOR_DESKTOP) return SystemColor.desktop; else if (i == SYSTEM_COLOR_INACTIVECAPTION) return SystemColor.inactiveCaption; else if (i == SYSTEM_COLOR_INACTIVECAPTIONBORDER) return SystemColor.inactiveCaptionBorder; else if (i == SYSTEM_COLOR_INACTIVECAPTIONTEXT) return SystemColor.inactiveCaptionText; else if (i == SYSTEM_COLOR_INFO) return SystemColor.info; else if (i == SYSTEM_COLOR_INFOTEXT) return SystemColor.infoText; else if (i == SYSTEM_COLOR_MENU) return SystemColor.menu; else if (i == SYSTEM_COLOR_MENUTEXT) return SystemColor.menuText; else if (i == SYSTEM_COLOR_SCROLLBAR) return SystemColor.scrollbar; else if (i == SYSTEM_COLOR_TEXT) return SystemColor.text; else if (i == SYSTEM_COLOR_TEXTHIGHLIGHT) return SystemColor.textHighlight; else if (i == SYSTEM_COLOR_TEXTHIGHLIGHTTEXT) return SystemColor.textHighlightText; else if (i == SYSTEM_COLOR_TEXTINACTIVETEXT) return SystemColor.textInactiveText; else if (i == SYSTEM_COLOR_TEXTTEXT) return SystemColor.textText; else if (i == SYSTEM_COLOR_WINDOW) return SystemColor.window; else if (i == SYSTEM_COLOR_WINDOWBORDER) return SystemColor.windowBorder; else if (i == SYSTEM_COLOR_WINDOWTEXT) return SystemColor.windowText; else return null; } else if (type == TYPE_TEXTURE_PAINT) { Rectangle2D a = (Rectangle2D)SerializationManager.readObject(stream); BufferedImage b = (BufferedImage)SerializationManager.readObject(stream); return new TexturePaint(b,a); } else if (type == TYPE_TRANSFORM_ATTRIBUTE) { double[] m = new double[6]; for (int i = 0; i < 6; i++) { m[i] = stream.readDouble(); } return new TransformAttribute(new AffineTransform(m)); } else return null; } }