poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kiwiwi...@apache.org
Subject svn commit: r1566181 [2/2] - in /poi/branches/wmf_render/src: java/org/apache/poi/util/ scratchpad/src/org/apache/poi/hwmf/ scratchpad/src/org/apache/poi/hwmf/record/
Date Sun, 09 Feb 2014 01:14:55 GMT
Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfHeader.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfHeader.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfHeader.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfHeader.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,57 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+public class WmfHeader {
+    private int type;
+    private int recordSize;
+    private int version;
+    private int filesize;
+    private int numberOfObjects;
+    private long maxRecord;
+    private int numberOfMembers;
+    
+    public WmfHeader(LittleEndianInputStream leis) throws IOException {
+        // Type (2 bytes):  A 16-bit unsigned integer that defines the type of metafile
+        // MEMORYMETAFILE = 0x0001, DISKMETAFILE = 0x0002 
+        type = leis.readUShort();
+
+        // HeaderSize (2 bytes):  A 16-bit unsigned integer that defines the number
+        // of 16-bit words in the header.
+        recordSize = leis.readUShort();
+        int bytesLeft = recordSize*LittleEndianConsts.SHORT_SIZE;
+        
+        // Version (2 bytes):  A 16-bit unsigned integer that defines the metafile version.
+        // METAVERSION100 = 0x0100, METAVERSION300 = 0x0300
+        version = leis.readUShort();
+        bytesLeft -= LittleEndianConsts.SHORT_SIZE;
+        
+        // SizeLow (2 bytes):  A 16-bit unsigned integer that defines the low-order word
+        // of the number of 16-bit words in the entire metafile.
+        // SizeHigh (2 bytes):  A 16-bit unsigned integer that defines the high-order word
+        // of the number of 16-bit words in the entire metafile.
+        filesize = leis.readInt();
+        bytesLeft -= LittleEndianConsts.INT_SIZE;
+        
+        // NumberOfObjects (2 bytes):  A 16-bit unsigned integer that specifies the number
+        // of graphics objects that are defined in the entire metafile. These objects include
+        // brushes, pens, and the other objects
+        numberOfObjects = leis.readUShort();
+        bytesLeft -= LittleEndianConsts.SHORT_SIZE;
+        
+        // MaxRecord (4 bytes):  A 32-bit unsigned integer that specifies the size of the
+        // largest record used in the metafile (in 16-bit elements).
+        maxRecord = leis.readUInt();
+        bytesLeft -= LittleEndianConsts.INT_SIZE;
+        
+        // NumberOfMembers (2 bytes):  A 16-bit unsigned integer that is not used.
+        // It SHOULD be 0x0000.
+        numberOfMembers = leis.readUShort();
+        bytesLeft -= LittleEndianConsts.SHORT_SIZE;
+        
+        leis.skip(bytesLeft);
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfMoveTo.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfMoveTo.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfMoveTo.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfMoveTo.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,33 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_MOVETO record sets the output position in the playback device context to a specified
+ * point.
+ */
+public class WmfMoveTo implements WmfRecord {
+    
+    /**
+     * A 16-bit signed integer that defines the y-coordinate, in logical units.
+     */
+    int y;
+    
+    /**
+     * A 16-bit signed integer that defines the x-coordinate, in logical units.
+     */
+    int x;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.moveTo;
+    }
+    
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        y = leis.readShort();
+        x = leis.readShort();
+        return 2*LittleEndianConsts.SHORT_SIZE;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfNoArg.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfNoArg.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfNoArg.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfNoArg.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,27 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianInputStream;
+
+public class WmfNoArg {
+    protected static abstract class WmfNoArgParent implements WmfRecord {
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            return 0;
+        }
+    }
+    
+    /**
+     * The META_SAVEDC record saves the playback device context for later retrieval.
+     */
+    public static class WmfSaveDc extends WmfNoArgParent {
+        public WmfRecordType getRecordType() { return WmfRecordType.saveDc; }
+    }
+
+    /**
+     * The META_SETRELABS record is reserved and not supported.
+     */
+    public static class WmfSetRelabs extends WmfNoArgParent {
+        public WmfRecordType getRecordType() { return WmfRecordType.setRelabs; }
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfPalette.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfPalette.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfPalette.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfPalette.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,146 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+public class WmfPalette {
+    
+    public static class PaletteEntry {
+        // Values (1 byte):  An 8-bit unsigned integer that defines how the palette entry is to be used. 
+        // The Values field MUST be 0x00 or one of the values in the PaletteEntryFlag Enumeration table.
+        // Blue (1 byte): An 8-bit unsigned integer that defines the blue intensity value for the palette entry.
+        // Green (1 byte): An 8-bit unsigned integer that defines the green intensity value for the palette entry.
+        // Red (1 byte): An 8-bit unsigned integer that defines the red intensity value for the palette entry.
+        int values, blue, green, red;
+        
+        public int init(LittleEndianInputStream leis) throws IOException {
+            values = leis.readUByte();
+            blue = leis.readUByte();
+            green = leis.readUByte();
+            red = leis.readUByte();
+            return 4*LittleEndianConsts.BYTE_SIZE;
+        }
+    }
+    
+    public static abstract class WmfPaletteParent implements WmfRecord  {
+    
+        /**
+         * Start (2 bytes):  A 16-bit unsigned integer that defines the offset into the Palette Object when
+         * used with the META_SETPALENTRIES and META_ANIMATEPALETTE record types.
+         * When used with META_CREATEPALETTE, it MUST be 0x0300
+         */
+        int start;
+        
+        /**
+         * NumberOfEntries (2 bytes):  A 16-bit unsigned integer that defines the number of objects in
+         * aPaletteEntries.  
+         */
+        int numberOfEntries;
+        
+        PaletteEntry entries[];
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            start = leis.readUShort();
+            numberOfEntries = leis.readUShort();
+            int size = 2*LittleEndianConsts.SHORT_SIZE;
+            entries = new PaletteEntry[numberOfEntries];
+            for (int i=0; i<numberOfEntries; i++) {
+                entries[i] = new PaletteEntry();
+                size += entries[i].init(leis);
+            }
+            return size;
+        }
+    }
+    
+    /**
+     * The META_CREATEPALETTE record creates a Palette Object
+     */
+    public static class WmfCreatePalette extends WmfPaletteParent {
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.createPalette;
+        }
+    }
+
+    /**
+     * The META_SETPALENTRIES record defines RGB color values in a range of entries in the logical
+     * palette that is defined in the playback device context.
+     */
+    public static class WmfSetPaletteEntries extends WmfPaletteParent {
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setPalEntries;
+        }
+    }
+    
+    /**
+     * The META_RESIZEPALETTE record redefines the size of the logical palette that is defined in the
+     * playback device context.
+     */
+    public static class WmfResizePalette implements WmfRecord {
+        /**
+         * A 16-bit unsigned integer that defines the number of entries in 
+         * the logical palette.
+         */
+        int numberOfEntries;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.resizePalette;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            numberOfEntries = leis.readUShort();
+            return LittleEndianConsts.SHORT_SIZE;
+        }        
+    }
+
+    /**
+     * The META_SELECTPALETTE record defines the current logical palette with a specified Palette Object.
+     */
+    public static class WmfSelectPalette implements WmfRecord {
+        /**
+         * A 16-bit unsigned integer used to index into the WMF Object Table to get
+         * the Palette Object to be selected.
+         */
+        int palette;
+
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.selectPalette;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            palette = leis.readUShort();
+            return LittleEndianConsts.SHORT_SIZE;
+        }        
+    }
+
+    /**
+     * The META_REALIZEPALETTE record maps entries from the logical palette that
+     * is defined in the playback device context to the system palette.
+     */
+    public static class WmfRealizePalette implements WmfRecord {
+        public WmfRecordType getRecordType() { return WmfRecordType.realizePalette; }
+
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            return 0;
+        }
+    }
+
+    /**
+     * The META_ANIMATEPALETTE record redefines entries in the logical palette that
+     * is defined in the playback device context with the specified Palette object
+     * 
+     * The logical palette that is specified by the Palette object in this record is the
+     * source of the palette changes, and the logical palette that is currently selected
+     * into the playback device context is the destination. Entries in the destination
+     * palette with the PC_RESERVED PaletteEntryFlag set SHOULD be modified by this record,
+     * and entries with that flag clear SHOULD NOT be modified.
+     * If none of the entries in the destination palette have the PC_RESERVED flag set, then
+     * this record SHOULD have no effect.
+     */
+    public static class WmfAnimatePalette extends WmfPaletteParent {
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.animatePalette;
+        }
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfPlaceableHeader.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfPlaceableHeader.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfPlaceableHeader.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfPlaceableHeader.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,60 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+public class WmfPlaceableHeader {
+    public static int WMF_HEADER_MAGIC = 0x9AC6CDD7;
+    
+    protected WmfPlaceableHeader(LittleEndianInputStream leis) throws IOException {
+        /*
+         * HWmf (2 bytes):  The resource handle to the metafile, when the metafile is in memory. When
+         * the metafile is on disk, this field MUST contain 0x0000. This attribute of the metafile is
+         * specified in the Type field of the META_HEADER record.
+         */
+        leis.readShort(); // ignore
+        
+        /*
+         * BoundingBox (8 bytes):  The destination rectangle, measured in logical units, for displaying
+         * the metafile. The size of a logical unit is specified by the Inch field.
+         */
+        int x1 = leis.readShort();
+        int y1 = leis.readShort();
+        int x2 = leis.readShort();
+        int y2 = leis.readShort();
+        
+        /*
+         * Inch (2 bytes):  The number of logical units per inch used to represent the image.
+         * This value can be used to scale an image.
+         * By convention, an image is considered to be recorded at 1440 logical units (twips) per inch.
+         * Thus, a value of 720 specifies that the image SHOULD be rendered at twice its normal size,
+         * and a value of 2880 specifies that the image SHOULD be rendered at half its normal size.
+         */
+        int inch = leis.readShort();
+        
+        /*
+         * Reserved (4 bytes):  A field that is not used and MUST be set to 0x00000000.
+         */
+        leis.readInt();
+        
+        /*
+         * Checksum (2 bytes):  A checksum for the previous 10 16-bit values in the header.
+         * This value can be used to determine whether the metafile has become corrupted.
+         */
+        leis.readShort();
+        
+    }
+    
+    public static WmfPlaceableHeader readHeader(LittleEndianInputStream leis) throws IOException {
+        leis.mark(LittleEndianConsts.INT_SIZE);
+        int magic = leis.readInt();
+        if (magic == WMF_HEADER_MAGIC) {
+            return new WmfPlaceableHeader(leis);
+        } else {
+            leis.reset();
+            return null;
+        }
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRecord.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRecord.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRecord.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRecord.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,18 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianInputStream;
+
+public interface WmfRecord {
+    WmfRecordType getRecordType();
+
+    /**
+     * Init record from stream
+     *
+     * @param leis the little endian input stream
+     * @return count of processed bytes
+     * @throws IOException
+     */
+    int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException;
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRecordType.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRecordType.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRecordType.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRecordType.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,89 @@
+package org.apache.poi.hwmf.record;
+
+public enum WmfRecordType {
+    eof(0x0000, null),
+    realizePalette(0x0035, WmfPalette.WmfRealizePalette.class),
+    setPalEntries(0x0037, WmfPalette.WmfSetPaletteEntries.class),
+    setBkMode(0x0102, WmfSetBkMode.class),
+    setMapMode(0x0103, WmfSetMapMode.class),
+    setRop2(0x0104, WmfSetRop2.class),
+    setRelabs(0x0105, WmfNoArg.WmfSetRelabs.class),
+    setPolyFillMode(0x0106, WmfFill.WmfSetPolyfillMode.class),
+    setStretchBltMode(0x0107, WmfSetStretchBltMode.class),
+    setTextCharExtra(0x0108, WmfText.WmfSetTextCharExtra.class),
+    restoreDc(0x0127, WmfRestoreDc.class),
+    resizePalette(0x0139, WmfPalette.WmfResizePalette.class),
+    dibCreatePatternBrush(0x0142, WmfDibCreatePatternBrush.class),
+    setLayout(0x0149, WmfSetLayout.class),
+    setBkColor(0x0201, WmfSetBkColor.class),
+    setTextColor(0x0209, WmfText.WmfSetTextColor.class),
+    offsetViewportOrg(0x0211, WmfWindowing.WmfOffsetViewportOrg.class),
+    lineTo(0x0213, WmfDraw.WmfLineTo.class),
+    moveTo(0x0214, WmfMoveTo.class),
+    offsetClipRgn(0x0220, WmfWindowing.WmfOffsetClipRgn.class),
+    fillRegion(0x0228, WmfFill.WmfFillRegion.class),
+    setMapperFlags(0x0231, WmfSetMapperFlags.class),
+    selectPalette(0x0234, WmfPalette.WmfSelectPalette.class),
+    polygon(0x0324, WmfDraw.WmfPolygon.class),
+    polyline(0x0325, WmfDraw.WmfPolyline.class),
+    setTextJustification(0x020a, WmfText.WmfSetTextJustification.class),
+    setWindowOrg(0x020b, WmfWindowing.WmfSetWindowOrg.class),
+    setWindowExt(0x020c, WmfWindowing.WmfSetWindowExt.class),
+    setViewportOrg(0x020d, WmfWindowing.WmfSetViewportOrg.class),
+    setViewportExt(0x020e, WmfWindowing.WmfSetViewportExt.class),
+    offsetWindowOrg(0x020f, WmfWindowing.WmfOffsetWindowOrg.class),
+    scaleWindowExt(0x0410, WmfWindowing.WmfScaleWindowExt.class),
+    scaleViewportExt(0x0412, WmfWindowing.WmfScaleViewportExt.class), 
+    excludeClipRect(0x0415, WmfWindowing.WmfExcludeClipRect.class),
+    intersectClipRect(0x0416, WmfWindowing.WmfIntersectClipRect.class),
+    ellipse(0x0418, WmfDraw.WmfEllipse.class),
+    floodFill(0x0419, WmfFill.WmfFloodFill.class),
+    frameRegion(0x0429, WmfDraw.WmfFrameRegion.class),
+    animatePalette(0x0436, WmfPalette.WmfAnimatePalette.class),
+    textOut(0x0521, WmfText.WmfTextOut.class),
+    polyPolygon(0x0538, WmfDraw.WmfPolyPolygon.class),
+    extFloodFill(0x0548, WmfFill.WmfExtFloodFill.class),
+    rectangle(0x041b, WmfDraw.WmfRectangle.class),
+    setPixel(0x041f, WmfDraw.WmfSetPixel.class),
+    roundRect(0x061c, WmfDraw.WmfRoundRect.class),
+    patBlt(0x061d, WmfFill.WmfPatBlt.class),
+    saveDc(0x001e, WmfNoArg.WmfSaveDc.class),
+    pie(0x081a, WmfDraw.WmfPie.class),
+    stretchBlt(0x0b23, WmfFill.WmfStretchBlt.class),
+    escape(0x0626, WmfEscape.class),
+    invertRegion(0x012a, WmfFill.WmfInvertRegion.class),
+    paintRegion(0x012b, WmfFill.WmfPaintRegion.class),
+    selectClipRegion(0x012c, WmfWindowing.WmfSelectClipRegion.class),
+    selectObject(0x012d, WmfDraw.WmfSelectObject.class),
+    setTextAlign(0x012e, WmfText.WmfSetTextAlign.class),
+    arc(0x0817, WmfDraw.WmfArc.class),
+    chord(0x0830, WmfDraw.WmfChord.class),
+    bitBlt(0x0922, WmfFill.WmfBitBlt.class),
+    extTextOut(0x0a32, WmfText.WmfExtTextOut.class),
+    setDibToDev(0x0d33, WmfBitmap.WmfSetDibToDev.class),
+    dibBitBlt(0x0940, null),
+    dibStretchBlt(0x0b41, null),
+    stretchDib(0x0f43, null),
+    deleteObject(0x01f0, null),
+    createPalette(0x00f7, WmfPalette.WmfCreatePalette.class),
+    createPatternBrush(0x01f9, null),
+    createPenIndirect(0x02fa, null),
+    createFontIndirect(0x02fb, null),
+    createBrushIndirect(0x02fc, null),
+    createRegion(0x06ff, null);
+    
+    public int id;
+    public Class<? extends WmfRecord> clazz;
+    
+    WmfRecordType(int id, Class<? extends WmfRecord> clazz) {
+        this.id = id;
+        this.clazz = clazz;
+    }
+    
+    public static WmfRecordType getById(int id) {
+        for (WmfRecordType wrt : values()) {
+            if (wrt.id == id) return wrt;
+        }
+        return null;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRestoreDc.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRestoreDc.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRestoreDc.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfRestoreDc.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,29 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_RESTOREDC record restores the playback device context from a previously saved device
+ * context.
+ */
+public class WmfRestoreDc implements WmfRecord {
+    
+    /**
+     * nSavedDC (2 bytes):  A 16-bit signed integer that defines the saved state to be restored. If this 
+     * member is positive, nSavedDC represents a specific instance of the state to be restored. If 
+     * this member is negative, nSavedDC represents an instance relative to the current state.
+     */
+    int nSavedDC;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.restoreDc;
+    }
+    
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        nSavedDC = leis.readShort();
+        return LittleEndianConsts.SHORT_SIZE;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetBkColor.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetBkColor.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetBkColor.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetBkColor.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,23 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_SETBKCOLOR record sets the background color in the playback device context to a
+ * specified color, or to the nearest physical color if the device cannot represent the specified color.
+ */
+public class WmfSetBkColor implements WmfRecord {
+    
+    WmfColorRef colorRef;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.setBkColor;
+    }
+    
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        WmfColorRef colorRef = new WmfColorRef();
+        return colorRef.init(leis);
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetBkMode.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetBkMode.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetBkMode.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetBkMode.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,29 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_SETBKMODE record defines the background raster operation mix mode in the playback
+ * device context. The background mix mode is the mode for combining pens, text, hatched brushes,
+ * and interiors of filled objects with background colors on the output surface.
+ */
+public class WmfSetBkMode implements WmfRecord {
+    
+    /**
+     * A 16-bit unsigned integer that defines background mix mode.
+     * This MUST be either TRANSPARENT = 0x0001 or OPAQUE = 0x0002
+     */
+    int bkMode;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.setBkMode;
+    }
+    
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        bkMode = leis.readUShort();
+        return LittleEndianConsts.SHORT_SIZE;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetLayout.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetLayout.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetLayout.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetLayout.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,33 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_SETLAYOUT record defines the layout orientation in the playback device context.
+ * The layout orientation determines the direction in which text and graphics are drawn
+ */
+public class WmfSetLayout implements WmfRecord {
+    
+    /**
+     * A 16-bit unsigned integer that defines the layout of text and graphics.
+     * LAYOUT_LTR = 0x0000
+     * LAYOUT_RTL = 0x0001
+     * LAYOUT_BITMAPORIENTATIONPRESERVED = 0x0008
+     */
+    int layout;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.setLayout;
+    }
+    
+    @SuppressWarnings("unused")
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        layout = leis.readUShort();
+        // A 16-bit field that MUST be ignored.
+        int reserved = leis.readShort();
+        return 2*LittleEndianConsts.SHORT_SIZE;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetMapMode.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetMapMode.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetMapMode.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetMapMode.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,81 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_SETMAPMODE record defines the mapping mode in the playback device context.
+ * The mapping mode defines the unit of measure used to transform page-space units into
+ * device-space units, and also defines the orientation of the device's x and y axes. 
+ */
+public class WmfSetMapMode implements WmfRecord {
+    
+    /**
+     * A 16-bit unsigned integer that defines the mapping mode.
+     * 
+     * The MapMode defines how logical units are mapped to physical units;
+     * that is, assuming that the origins in both the logical and physical coordinate systems
+     * are at the same point on the drawing surface, what is the physical coordinate (x',y')
+     * that corresponds to logical coordinate (x,y).
+     * 
+     * For example, suppose the mapping mode is MM_TEXT. Given the following definition of that
+     * mapping mode, and an origin (0,0) at the top left corner of the drawing surface, logical
+     * coordinate (4,5) would map to physical coordinate (4,5) in pixels.
+     * 
+     * Now suppose the mapping mode is MM_LOENGLISH, with the same origin as the previous
+     * example. Given the following definition of that mapping mode, logical coordinate (4,-5)
+     * would map to physical coordinate (0.04,0.05) in inches.
+     * 
+     * This MUST be one of the following:
+     * 
+     * MM_TEXT (= 0x0001):
+     *  Each logical unit is mapped to one device pixel.
+     *  Positive x is to the right; positive y is down.
+     *  
+     * MM_LOMETRIC (= 0x0002):
+     *  Each logical unit is mapped to 0.1 millimeter.
+     *  Positive x is to the right; positive y is up.
+     *
+     * MM_HIMETRIC (= 0x0003):
+     *  Each logical unit is mapped to 0.01 millimeter.
+     *  Positive x is to the right; positive y is up.
+     *
+     * MM_LOENGLISH (= 0x0004):
+     *  Each logical unit is mapped to 0.01 inch.
+     *  Positive x is to the right; positive y is up.
+     * 
+     * MM_HIENGLISH (= 0x0005):
+     *  Each logical unit is mapped to 0.001 inch.
+     *  Positive x is to the right; positive y is up.
+     * 
+     * MM_TWIPS (= 0x0006):
+     *  Each logical unit is mapped to one twentieth (1/20) of a point.
+     *  In printing, a point is 1/72 of an inch; therefore, 1/20 of a point is 1/1440 of an inch.
+     *  This unit is also known as a "twip".
+     *  Positive x is to the right; positive y is up.
+     *
+     * MM_ISOTROPIC (= 0x0007):
+     *  Logical units are mapped to arbitrary device units with equally scaled axes;
+     *  that is, one unit along the x-axis is equal to one unit along the y-axis.
+     *  The META_SETWINDOWEXT and META_SETVIEWPORTEXT records specify the units and the
+     *  orientation of the axes.
+     *  The processing application SHOULD make adjustments as necessary to ensure the x and y
+     *  units remain the same size. For example, when the window extent is set, the viewport
+     *  SHOULD be adjusted to keep the units isotropic.
+     *
+     * MM_ANISOTROPIC (= 0x0008):
+     *  Logical units are mapped to arbitrary units with arbitrarily scaled axes.
+     */
+    int mapMode;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.setMapMode;
+    }
+    
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        mapMode = leis.readUShort();
+        return LittleEndianConsts.SHORT_SIZE;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetMapperFlags.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetMapperFlags.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetMapperFlags.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetMapperFlags.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,29 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_SETMAPPERFLAGS record defines the algorithm that the font mapper uses when it maps
+ * logical fonts to physical fonts.
+ */
+public class WmfSetMapperFlags implements WmfRecord {
+    
+    /**
+     * A 32-bit unsigned integer that defines whether the font mapper should attempt to
+     * match a font's aspect ratio to the current device's aspect ratio. If bit 0 is
+     * set, the mapper selects only matching fonts.
+     */
+    long mapperValues;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.setMapperFlags;
+    }
+    
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        mapperValues = leis.readUInt();
+        return LittleEndianConsts.INT_SIZE;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetRop2.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetRop2.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetRop2.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetRop2.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,45 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_SETROP2 record defines the foreground raster operation mix mode in the playback device
+ * context. The foreground mix mode is the mode for combining pens and interiors of filled objects with
+ * foreground colors on the output surface.
+ */
+public class WmfSetRop2 implements WmfRecord {
+    
+    /**
+     * A 16-bit unsigned integer that defines the foreground binary raster
+     * operation mixing mode. This MUST be one of the values:
+     * R2_BLACK = 0x0001,
+     * R2_NOTMERGEPEN = 0x0002,
+     * R2_MASKNOTPEN = 0x0003,
+     * R2_NOTCOPYPEN = 0x0004,
+     * R2_MASKPENNOT = 0x0005,
+     * R2_NOT = 0x0006,
+     * R2_XORPEN = 0x0007,
+     * R2_NOTMASKPEN = 0x0008,
+     * R2_MASKPEN = 0x0009,
+     * R2_NOTXORPEN = 0x000A,
+     * R2_NOP = 0x000B,
+     * R2_MERGENOTPEN = 0x000C,
+     * R2_COPYPEN = 0x000D,
+     * R2_MERGEPENNOT = 0x000E,
+     * R2_MERGEPEN = 0x000F,
+     * R2_WHITE = 0x0010
+     */
+    int drawMode;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.setRop2;
+    }
+    
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        drawMode = leis.readUShort();
+        return LittleEndianConsts.SHORT_SIZE;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetStretchBltMode.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetStretchBltMode.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetStretchBltMode.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfSetStretchBltMode.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,32 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+/**
+ * The META_SETSTRETCHBLTMODE record defines the bitmap stretching mode in the playback device
+ * context.
+ */
+public class WmfSetStretchBltMode implements WmfRecord {
+    
+    /**
+     * A 16-bit unsigned integer that defines bitmap stretching mode.
+     * This MUST be one of the values:
+     * BLACKONWHITE = 0x0001,
+     * WHITEONBLACK = 0x0002,
+     * COLORONCOLOR = 0x0003,
+     * HALFTONE = 0x0004
+     */
+    int setStretchBltMode;
+    
+    public WmfRecordType getRecordType() {
+        return WmfRecordType.setStretchBltMode;
+    }
+    
+    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+        setStretchBltMode = leis.readUShort();
+        return LittleEndianConsts.SHORT_SIZE;
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfTernaryRasterOp.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfTernaryRasterOp.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfTernaryRasterOp.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfTernaryRasterOp.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,319 @@
+package org.apache.poi.hwmf.record;
+
+public enum WmfTernaryRasterOp {
+    BLACKNESS(0x0000,0x0042,"0"),
+    DPSOON(0x0001,0x0289,"DPSoon"),
+    DPSONA(0x0002,0x0C89,"DPSona"),
+    PSON(0x0003,0x00AA,"PSon"),
+    SDPONA(0x0004,0x0C88,"SDPona"),
+    DPON(0x0005,0x00A9,"DPon"),
+    PDSXNON(0x0006,0x0865,"PDSxnon"),
+    PDSAON(0x0007,0x02C5,"PDSaon"),
+    SDPNAA(0x0008,0x0F08,"SDPnaa"),
+    PDSXON(0x0009,0x0245,"PDSxon"),
+    DPNA(0x000A,0x0329,"DPna"),
+    PSDNAON(0x000B,0x0B2A,"PSDnaon"),
+    SPNA(0x000C,0x0324,"SPna"),
+    PDSNAON(0x000D,0x0B25,"PDSnaon"),
+    PDSONON(0x000E,0x08A5,"PDSonon"),
+    PN(0x000F,0x0001,"Pn"),
+    PDSONA(0x0010,0x0C85,"PDSona"),
+    NOTSRCERASE(0x0011,0x00A6,"DSon"),
+    SDPXNON(0x0012,0x0868,"SDPxnon"),
+    SDPAON(0x0013,0x02C8,"SDPaon"),
+    DPSXNON(0x0014,0x0869,"DPSxnon"),
+    DPSAON(0x0015,0x02C9,"DPSaon"),
+    PSDPSANAXX(0x0016,0x5CCA,"PSDPSanaxx"),
+    SSPXDSXAXN(0x0017,0x1D54,"SSPxDSxaxn"),
+    SPXPDXA(0x0018,0x0D59,"SPxPDxa"),
+    SDPSANAXN(0x0019,0x1CC8,"SDPSanaxn"),
+    PDSPAOX(0x001A,0x06C5,"PDSPaox"),
+    SDPSXAXN(0x001B,0x0768,"SDPSxaxn"),
+    PSDPAOX(0x001C,0x06CA,"PSDPaox"),
+    DSPDXAXN(0x001D,0x0766,"DSPDxaxn"),
+    PDSOX(0x001E,0x01A5,"PDSox"),
+    PDSOAN(0x001F,0x0385,"PDSoan"),
+    DPSNAA(0x0020,0x0F09,"DPSnaa"),
+    SDPXON(0x0021,0x0248,"SDPxon"),
+    DSNA(0x0022,0x0326,"DSna"),
+    SPDNAON(0x0023,0x0B24,"SPDnaon"),
+    SPXDSXA(0x0024,0x0D55,"SPxDSxa"),
+    PDSPANAXN(0x0025,0x1CC5,"PDSPanaxn"),
+    SDPSAOX(0x0026,0x06C8,"SDPSaox"),
+    SDPSXNOX(0x0027,0x1868,"SDPSxnox"),
+    DPSXA(0x0028,0x0369,"DPSxa"),
+    PSDPSAOXXN(0x0029,0x16CA,"PSDPSaoxxn"),
+    DPSANA(0x002A,0x0CC9,"DPSana"),
+    SSPXPDXAXN(0x002B,0x1D58,"SSPxPDxaxn"),
+    SPDSOAX(0x002C,0x0784,"SPDSoax"),
+    PSDNOX(0x002D,0x060A,"PSDnox"),
+    PSDPXOX(0x002E,0x064A,"PSDPxox"),
+    PSDNOAN(0x002F,0x0E2A,"PSDnoan"),
+    PSNA(0x0030,0x032A,"PSna"),
+    SDPNAON(0x0031,0x0B28,"SDPnaon"),
+    SDPSOOX(0x0032,0x0688,"SDPSoox"),
+    NOTSRCCOPY(0x0033,0x0008,"Sn"),
+    SPDSAOX(0x0034,0x06C4,"SPDSaox"),
+    SPDSXNOX(0x0035,0x1864,"SPDSxnox"),
+    SDPOX(0x0036,0x01A8,"SDPox"),
+    SDPOAN(0x0037,0x0388,"SDPoan"),
+    PSDPOAX(0x0038,0x078A,"PSDPoax"),
+    SPDNOX(0x0390,0x604,"SPDnox"),
+    SPDSXOX(0x003A,0x0644,"SPDSxox"),
+    SPDNOAN(0x003B,0x0E24,"SPDnoan"),
+    PSX(0x003C,0x004A,"PSx"),
+    SPDSONOX(0x003D,0x18A4,"SPDSonox"),
+    SPDSNAOX(0x003E,0x1B24,"SPDSnaox"),
+    PSAN(0x003F,0x00EA,"PSan"),
+    PSDNAA(0x0040,0x0F0A,"PSDnaa"),
+    DPSXON(0x0041,0x0249,"DPSxon"),
+    SDXPDXA(0x0042,0x0D5D,"SDxPDxa"),
+    SPDSANAXN(0x0043,0x1CC4,"SPDSanaxn"),
+    SRCERASE(0x0044,0x0328,"SDna"),
+    DPSNAON(0x0045,0x0B29,"DPSnaon"),
+    DSPDAOX(0x0046,0x06C6,"DSPDaox"),
+    PSDPXAXN(0x0047,0x076A,"PSDPxaxn"),
+    SDPXA(0x0048,0x0368,"SDPxa"),
+    PDSPDAOXXN(0x0049,0x16C5,"PDSPDaoxxn"),
+    DPSDOAX(0x004A,0x0789,"DPSDoax"),
+    PDSNOX(0x004B,0x0605,"PDSnox"),
+    SDPANA(0x004C,0x0CC8,"SDPana"),
+    SSPXDSXOXN(0x004D,0x1954,"SSPxDSxoxn"),
+    PDSPXOX(0x004E,0x0645,"PDSPxox"),
+    PDSNOAN(0x004F,0x0E25,"PDSnoan"),
+    PDNA(0x0050,0x0325,"PDna"),
+    DSPNAON(0x0051,0x0B26,"DSPnaon"),
+    DPSDAOX(0x0052,0x06C9,"DPSDaox"),
+    SPDSXAXN(0x0053,0x0764,"SPDSxaxn"),
+    DPSONON(0x0054,0x08A9,"DPSonon"),
+    DSTINVERT(0x0055,0x0009,"Dn"),
+    DPSOX(0x0056,0x01A9,"DPSox"),
+    DPSOAN(0x0005,0x70389,"DPSoan"),
+    PDSPOAX(0x0058,0x0785,"PDSPoax"),
+    DPSNOX(0x0059,0x0609,"DPSnox"),
+    PATINVERT(0x005A,0x0049,"DPx"),
+    DPSDONOX(0x005B,0x18A9,"DPSDonox"),
+    DPSDXOX(0x005C,0x0649,"DPSDxox"),
+    DPSNOAN(0x005D,0x0E29,"DPSnoan"),
+    DPSDNAOX(0x005E,0x1B29,"DPSDnaox"),
+    DPAN(0x005F,0x00E9,"DPan"),
+    PDSXA(0x0060,0x0365,"PDSxa"),
+    DSPDSAOXXN(0x0061,0x16C6,"DSPDSaoxxn"),
+    DSPDOAX(0x0062,0x0786,"DSPDoax"),
+    SDPNOX(0x0063,0x0608,"SDPnox"),
+    SDPSOAX(0x0064,0x0788,"SDPSoax"),
+    DSPNOX(0x0065,0x0606,"DSPnox"),
+    SRCINVERT(0x0066,0x0046,"DSx"),
+    SDPSONOX(0x0067,0x18A8,"SDPSonox"),
+    DSPDSONOXXN(0x0068,0x58A6,"DSPDSonoxxn"),
+    PDSXXN(0x0069,0x0145,"PDSxxn"),
+    DPSAX(0x006A,0x01E9,"DPSax"),
+    PSDPSOAXXN(0x006B,0x178A,"PSDPSoaxxn"),
+    SDPAX(0x006C,0x01E8,"SDPax"),
+    PDSPDOAXXN(0x006D,0x1785,"PDSPDoaxxn"),
+    SDPSNOAX(0x006E,0x1E28,"SDPSnoax"),
+    // PDXNAN(0x006F,0x0C65,"PDXnan"), // invalid combo
+    PDSANA(0x0070,0x0CC5,"PDSana"),
+    SSDXPDXAXN(0x0071,0x1D5C,"SSDxPDxaxn"),
+    SDPSXOX(0x0072,0x0648,"SDPSxox"),
+    SDPNOAN(0x0073,0x0E28,"SDPnoan"),
+    DSPDXOX(0x0074,0x0646,"DSPDxox"),
+    DSPNOAN(0x0075,0x0E26,"DSPnoan"),
+    SDPSNAOX(0x0076,0x1B28,"SDPSnaox"),
+    DSAN(0x0077,0x00E6,"DSan"),
+    PDSAX(0x0078,0x01E5,"PDSax"),
+    DSPDSOAXXN(0x0079,0x1786,"DSPDSoaxxn"),
+    DPSDNOAX(0x007A,0x1E29,"DPSDnoax"),
+    SDPXNAN(0x007B,0x0C68,"SDPxnan"),
+    SPDSNOAX(0x007C,0x1E24,"SPDSnoax"),
+    DPSXNAN(0x007D,0x0C69,"DPSxnan"),
+    SPXDSXO(0x007E,0x0955,"SPxDSxo"),
+    DPSAAN(0x007F,0x03C9,"DPSaan"),
+    DPSAA(0x0080,0x03E9,"DPSaa"),
+    SPXDSXON(0x0081,0x0975,"SPxDSxon"),
+    DPSXNA(0x0082,0x0C49,"DPSxna"),
+    SPDSNOAXN(0x0083,0x1E04,"SPDSnoaxn"),
+    SDPXNA(0x0084,0x0C48,"SDPxna"),
+    PDSPNOAXN(0x0085,0x1E05,"PDSPnoaxn"),
+    DSPDSOAXX(0x0086,0x17A6,"DSPDSoaxx"),
+    PDSAXN(0x0087,0x01C5,"PDSaxn"),
+    SRCAND(0x0088,0x00C6,"DSa"),
+    SDPSNAOXN(0x0089,0x1B08,"SDPSnaoxn"),
+    DSPNOA(0x008A,0x0E06,"DSPnoa"),
+    DSPDXOXN(0x008B,0x0666,"DSPDxoxn"),
+    SDPNOA(0x008C,0x0E08,"SDPnoa"),
+    SDPSXOXN(0x008D,0x0668,"SDPSxoxn"),
+    SSDXPDXAX(0x008E,0x1D7C,"SSDxPDxax"),
+    PDSANAN(0x008F,0x0CE5,"PDSanan"),
+    PDSXNA(0x0090,0x0C45,"PDSxna"),
+    SDPSNOAXN(0x0091,0x1E08,"SDPSnoaxn"),
+    DPSDPOAXX(0x0092,0x17A9,"DPSDPoaxx"),
+    SPDAXN(0x0093,0x01C4,"SPDaxn"),
+    PSDPSOAXX(0x0094,0x17AA,"PSDPSoaxx"),
+    DPSAXN(0x0095,0x01C9,"DPSaxn"),
+    DPSXX(0x0096,0x0169,"DPSxx"),
+    PSDPSONOXX(0x0097,0x588A,"PSDPSonoxx"),
+    SDPSONOXN(0x0098,0x1888,"SDPSonoxn"),
+    DSXN(0x0099,0x0066,"DSxn"),
+    DPSNAX(0x009A,0x0709,"DPSnax"),
+    SDPSOAXN(0x009B,0x07A8,"SDPSoaxn"),
+    SPDNAX(0x009C,0x0704,"SPDnax"),
+    DSPDOAXN(0x009D,0x07A6,"DSPDoaxn"),
+    DSPDSAOXX(0x009E,0x16E6,"DSPDSaoxx"),
+    PDSXAN(0x009F,0x0345,"PDSxan"),
+    DPA(0x00A0,0x00C9,"DPa"),
+    PDSPNAOXN(0x00A1,0x1B05,"PDSPnaoxn"),
+    DPSNOA(0x00A2,0x0E09,"DPSnoa"),
+    DPSDXOXN(0x00A3,0x0669,"DPSDxoxn"),
+    PDSPONOXN(0x00A4,0x1885,"PDSPonoxn"),
+    PDXN(0x00A5,0x0065,"PDxn"),
+    DSPNAX(0x00A6,0x0706,"DSPnax"),
+    PDSPOAXN(0x00A7,0x07A5,"PDSPoaxn"),
+    DPSOA(0x00A8,0x03A9,"DPSoa"),
+    DPSOXN(0x00A9,0x0189,"DPSoxn"),
+    D(0x00AA,0x0029,"D"),
+    DPSONO(0x00AB,0x0889,"DPSono"),
+    SPDSXAX(0x00AC,0x0744,"SPDSxax"),
+    DPSDAOXN(0x00AD,0x06E9,"DPSDaoxn"),
+    DSPNAO(0x00AE,0x0B06,"DSPnao"),
+    DPNO(0x00AF,0x0229,"DPno"),
+    PDSNOA(0x00B0,0x0E05,"PDSnoa"),
+    PDSPXOXN(0x00B1,0x0665,"PDSPxoxn"),
+    SSPXDSXOX(0x00B2,0x1974,"SSPxDSxox"),
+    SDPANAN(0x00B3,0x0CE8,"SDPanan"),
+    PSDNAX(0x00B4,0x070A,"PSDnax"),
+    DPSDOAXN(0x00B5,0x07A9,"DPSDoaxn"),
+    DPSDPAOXX(0x00B6,0x16E9,"DPSDPaoxx"),
+    SDPXAN(0x00B7,0x0348,"SDPxan"),
+    PSDPXAX(0x00B8,0x074A,"PSDPxax"),
+    DSPDAOXN(0x00B9,0x06E6,"DSPDaoxn"),
+    DPSNAO(0x00BA,0x0B09,"DPSnao"),
+    MERGEPAINT(0x00BB,0x0226,"DSno"),
+    SPDSANAX(0x00BC,0x1CE4,"SPDSanax"),
+    SDXPDXAN(0x00BD,0x0D7D,"SDxPDxan"),
+    DPSXO(0x00BE,0x0269,"DPSxo"),
+    DPSANO(0x00BF,0x08C9,"DPSano"),
+    MERGECOPY(0x00C0,0x00CA,"PSa"),
+    SPDSNAOXN(0x00C1,0x1B04,"SPDSnaoxn"),
+    SPDSONOXN(0x00C2,0x1884,"SPDSonoxn"),
+    PSXN(0x00C3,0x006A,"PSxn"),
+    SPDNOA(0x00C4,0x0E04,"SPDnoa"),
+    SPDSXOXN(0x00C5,0x0664,"SPDSxoxn"),
+    SDPNAX(0x00C6,0x0708,"SDPnax"),
+    PSDPOAXN(0x00C7,0x07AA,"PSDPoaxn"),
+    SDPOA(0x00C8,0x03A8,"SDPoa"),
+    SPDOXN(0x00C9,0x0184,"SPDoxn"),
+    DPSDXAX(0x00CA,0x0749,"DPSDxax"),
+    SPDSAOXN(0x00CB,0x06E4,"SPDSaoxn"),
+    SRCCOPY(0x00CC,0x0020,"S"),
+    SDPONO(0x00CD,0x0888,"SDPono"),
+    SDPNAO(0x00CE,0x0B08,"SDPnao"),
+    SPNO(0x00CF,0x0224,"SPno"),
+    PSDNOA(0x00D0,0x0E0A,"PSDnoa"),
+    PSDPXOXN(0x00D1,0x066A,"PSDPxoxn"),
+    PDSNAX(0x00D2,0x0705,"PDSnax"),
+    SPDSOAXN(0x00D3,0x07A4,"SPDSoaxn"),
+    SSPXPDXAX(0x00D4,0x1D78,"SSPxPDxax"),
+    DPSANAN(0x00D5,0x0CE9,"DPSanan"),
+    PSDPSAOXX(0x00D6,0x16EA,"PSDPSaoxx"),
+    DPSXAN(0x00D7,0x0349,"DPSxan"),
+    PDSPXAX(0x00D8,0x0745,"PDSPxax"),
+    SDPSAOXN(0x00D9,0x06E8,"SDPSaoxn"),
+    DPSDANAX(0x00DA,0x1CE9,"DPSDanax"),
+    SPXDSXAN(0x00DB,0x0D75,"SPxDSxan"),
+    SPDNAO(0x00DC,0x0B04,"SPDnao"),
+    SDNO(0x00DD,0x0228,"SDno"),
+    SDPXO(0x00DE,0x0268,"SDPxo"),
+    SDPANO(0x00DF,0x08C8,"SDPano"),
+    PDSOA(0x00E0,0x03A5,"PDSoa"),
+    PDSOXN(0x00E1,0x0185,"PDSoxn"),
+    DSPDXAX(0x00E2,0x0746,"DSPDxax"),
+    PSDPAOXN(0x00E3,0x06EA,"PSDPaoxn"),
+    SDPSXAX(0x00E4,0x0748,"SDPSxax"),
+    PDSPAOXN(0x00E5,0x06E5,"PDSPaoxn"),
+    SDPSANAX(0x00E6,0x1CE8,"SDPSanax"),
+    SPXPDXAN(0x00E7,0x0D79,"SPxPDxan"),
+    SSPXDSXAX(0x00E8,0x1D74,"SSPxDSxax"),
+    DSPDSANAXXN(0x00E9,0x5CE6,"DSPDSanaxxn"),
+    DPSAO(0x00EA,0x02E9,"DPSao"),
+    DPSXNO(0x00EB,0x0849,"DPSxno"),
+    SDPAO(0x00EC,0x02E8,"SDPao"),
+    SDPXNO(0x00ED,0x0848,"SDPxno"),
+    SRCPAINT(0x00EE,0x0086,"DSo"),
+    SDPNOO(0x00EF,0x0A08,"SDPnoo"),
+    PATCOPY(0x00F0,0x0021,"P"),
+    PDSONO(0x00F1,0x0885,"PDSono"),
+    PDSNAO(0x00F2,0x0B05,"PDSnao"),
+    PSNO(0x00F3,0x022A,"PSno"),
+    PSDNAO(0x00F4,0x0B0A,"PSDnao"),
+    PDNO(0x00F5,0x0225,"PDno"),
+    PDSXO(0x00F6,0x0265,"PDSxo"),
+    PDSANO(0x00F7,0x08C5,"PDSano"),
+    PDSAO(0x00F8,0x02E5,"PDSao"),
+    PDSXNO(0x00F9,0x0845,"PDSxno"),
+    DPO(0x00FA,0x0089,"DPo"),
+    PATPAINT(0x00FB,0x0A09,"DPSnoo"),
+    PSO(0x00FC,0x008A,"PSo"),
+    PSDNOO(0x00FD,0x0A0A,"PSDnoo"),
+    DPSOO(0x00FE,0x02A9,"DPSoo"),
+    WHITENESS(0x00FF,0x0062,"1");
+    
+    int opIndex;
+    int opCode;
+    String opCmd;
+    
+    WmfTernaryRasterOp(int opIndex, int opCode, String opCmd) {
+        this.opIndex=opIndex;
+        this.opCode=opCode;
+        this.opCmd=opCmd;
+    }
+    
+    public static WmfTernaryRasterOp fromOpIndex(int opIndex) {
+        for (WmfTernaryRasterOp bb : WmfTernaryRasterOp.values()) {
+            if (bb.opIndex == opIndex) {
+                return bb;
+            }
+        }
+        return null;
+    }
+    
+    public String describeCmd() {
+        String stack[] = new String[10];
+        int stackPnt = 0;
+        
+        for (char c : opCmd.toCharArray()) {
+            switch (c) {
+                case 'S':
+                case 'D':
+                case 'P':
+                    stack[stackPnt++] = ""+c;
+                    break;
+                case 'n':
+                    stack[stackPnt-1] = "not("+stack[stackPnt-1]+")";
+                    break;
+                case 'a':
+                    stack[stackPnt-2] = "("+stack[stackPnt-1]+" and "+stack[stackPnt-2]+")";
+                    stackPnt--;
+                    break;
+                case 'o':
+                    stack[stackPnt-2] = "("+stack[stackPnt-1]+" or "+stack[stackPnt-2]+")";
+                    stackPnt--;
+                    break;
+                case 'x':
+                    stack[stackPnt-2] = "("+stack[stackPnt-1]+" xor "+stack[stackPnt-2]+")";
+                    stackPnt--;
+                    break;
+                case '1':
+                    stack[stackPnt++] = "all white";
+                    break;
+                case '0':
+                    stack[stackPnt++] = "all black";
+                    break;
+                default:
+                    throw new RuntimeException("unknown cmd '"+c+"'.");
+            }
+        }
+
+        return stack[--stackPnt];
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfText.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfText.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfText.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfText.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,316 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+public class WmfText {
+
+    /**
+     * The META_SETTEXTCHAREXTRA record defines inter-character spacing for text justification in the 
+     * playback device context. Spacing is added to the white space between each character, including
+     * break characters, when a line of justified text is output.
+     */
+    public static class WmfSetTextCharExtra implements WmfRecord {
+        
+        /**
+         * A 16-bit unsigned integer that defines the amount of extra space, in
+         * logical units, to be added to each character. If the current mapping mode is not MM_TEXT,
+         * this value is transformed and rounded to the nearest pixel. For details about setting the
+         * mapping mode, see META_SETMAPMODE
+         */
+        int charExtra;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setTextCharExtra;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            charExtra = leis.readUShort();
+            return LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+    
+    /**
+     * The META_SETTEXTCOLOR record defines the text foreground color in the playback device context.
+     */
+    public static class WmfSetTextColor implements WmfRecord {
+        
+        WmfColorRef colorRef;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setTextColor;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            WmfColorRef colorRef = new WmfColorRef();
+            return colorRef.init(leis);
+        }
+    }
+    
+    /**
+     * The META_SETTEXTJUSTIFICATION record defines the amount of space to add to break characters
+     * in a string of justified text.
+     */
+    public static class WmfSetTextJustification implements WmfRecord {
+        
+        /**
+         * A 16-bit unsigned integer that specifies the number of space characters in the line.
+         */
+        int breakCount;
+        
+        /**
+         * A 16-bit unsigned integer that specifies the total extra space, in logical
+         * units, to be added to the line of text. If the current mapping mode is not MM_TEXT, the value
+         * identified by the BreakExtra member is transformed and rounded to the nearest pixel. For
+         * details about setting the mapping mode, see {@link WmfSetMapMode}.
+         */
+        int breakExtra;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setBkColor;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            breakCount = leis.readUShort();
+            breakExtra = leis.readUShort();
+            return 2*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+    
+    /**
+     * The META_TEXTOUT record outputs a character string at the specified location by using the font,
+     * background color, and text color that are defined in the playback device context.
+     */
+    public static class WmfTextOut implements WmfRecord {
+        /**
+         * A 16-bit signed integer that defines the length of the string, in bytes, pointed to by String.
+         */
+        int stringLength;
+        /**
+         * The size of this field MUST be a multiple of two. If StringLength is an odd
+         * number, then this field MUST be of a size greater than or equal to StringLength + 1.
+         * A variable-length string that specifies the text to be drawn.
+         * The string does not need to be null-terminated, because StringLength specifies the
+         * length of the string.
+         * The string is written at the location specified by the XStart and YStart fields.
+         */
+        String text;
+        /**
+         * A 16-bit signed integer that defines the vertical (y-axis) coordinate, in logical
+         * units, of the point where drawing is to start.
+         */
+        int yStart;
+        /**
+         * A 16-bit signed integer that defines the horizontal (x-axis) coordinate, in
+         * logical units, of the point where drawing is to start.
+         */
+        int xStart;  
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.textOut;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            stringLength = leis.readShort();
+            byte buf[] = new byte[stringLength+(stringLength%2)];
+            leis.readFully(buf);
+            text = new String(buf, "UTF16-LE").trim();
+            yStart = leis.readShort();
+            xStart = leis.readShort();
+            return 3*LittleEndianConsts.SHORT_SIZE+buf.length;
+        }
+    }
+    
+    /**
+     * The META_EXTTEXTOUT record outputs text by using the font, background color, and text color that
+     * are defined in the playback device context. Optionally, dimensions can be provided for clipping,
+     * opaquing, or both.
+     */
+    public static class WmfExtTextOut implements WmfRecord {
+
+        /**
+         * A 16-bit signed integer that defines the y-coordinate, in logical units, where the 
+        text string is to be located.
+         */
+        int y;  
+        /**
+         * A 16-bit signed integer that defines the x-coordinate, in logical units, where the 
+        text string is to be located.
+         */
+        int x;  
+        /**
+         * A 16-bit signed integer that defines the length of the string.
+         */
+        int stringLength;
+        /**
+         * A 16-bit unsigned integer that defines the use of the application-defined 
+         * rectangle. This member can be a combination of one or more values in the 
+         * ExtTextOutOptions Flags:
+         * 
+         * ETO_OPAQUE (0x0002):
+         * Indicates that the background color that is defined in the playback device context 
+         * SHOULD be used to fill the rectangle.
+         * 
+         * ETO_CLIPPED (0x0004):
+         * Indicates that the text SHOULD be clipped to the rectangle.
+         * 
+         * ETO_GLYPH_INDEX (0x0010):
+         * Indicates that the string to be output SHOULD NOT require further processing 
+         * with respect to the placement of the characters, and an array of character 
+         * placement values SHOULD be provided. This character placement process is 
+         * useful for fonts in which diacritical characters affect character spacing.
+         * 
+         * ETO_RTLREADING (0x0080):
+         * Indicates that the text MUST be laid out in right-to-left reading order, instead of 
+         * the default left-to-right order. This SHOULD be applied only when the font that is 
+         * defined in the playback device context is either Hebrew or Arabic. <37>
+         * 
+         * ETO_NUMERICSLOCAL (0x0400):
+         * Indicates that to display numbers, digits appropriate to the locale SHOULD be 
+         * used.
+         * 
+         * ETO_NUMERICSLATIN (0x0800):
+         * Indicates that to display numbers, European digits SHOULD be used. <39>
+         * 
+         * ETO_PDY (0x2000):
+         * Indicates that both horizontal and vertical character displacement values 
+         * SHOULD be provided.
+         */
+        int fwOpts;
+        /**
+         * An optional 8-byte Rect Object (section 2.2.2.18) that defines the 
+         * dimensions, in logical coordinates, of a rectangle that is used for clipping, opaquing, or both.
+         * 
+         * The corners are given in the order left, top, right, bottom.
+         * Each value is a 16-bit signed integer that defines the coordinate, in logical coordinates, of 
+         * the upper-left corner of the rectangle
+         */
+        int left,top,right,bottom;
+        /**
+         * A variable-length string that specifies the text to be drawn. The string does 
+         * not need to be null-terminated, because StringLength specifies the length of the string. If 
+         * the length is odd, an extra byte is placed after it so that the following member (optional Dx) is 
+         * aligned on a 16-bit boundary.
+         */
+        String text;
+        /**
+         * An optional array of 16-bit signed integers that indicate the distance between 
+         * origins of adjacent character cells. For example, Dx[i] logical units separate the origins of 
+         * character cell i and character cell i + 1. If this field is present, there MUST be the same 
+         * number of values as there are characters in the string.
+         */
+        int dx[];
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.extTextOut;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            y = leis.readShort();
+            x = leis.readShort();
+            stringLength = leis.readShort();
+            fwOpts = leis.readUShort();
+            left = leis.readShort();
+            top = leis.readShort();
+            right = leis.readShort();
+            bottom = leis.readShort();
+            
+            byte buf[] = new byte[stringLength+(stringLength%2)];
+            leis.readFully(buf);
+            text = new String(buf, "UTF16-LE");
+            
+            int size = 8*LittleEndianConsts.SHORT_SIZE+buf.length;
+            if (size < recordSize) {
+                dx = new int[text.length()];
+                for (int i=0; i<dx.length; i++) {
+                    dx[i] = leis.readShort();
+                }
+                size += dx.length*LittleEndianConsts.SHORT_SIZE;
+            }
+            
+            return size;
+        }
+    }
+    
+
+    
+    
+    /**
+     * The META_SETTEXTALIGN record defines text-alignment values in the playback device context.
+     */
+    public static class WmfSetTextAlign implements WmfRecord {
+        
+        /**
+         * A 16-bit unsigned integer that defines text alignment.
+         * This value MUST be a combination of one or more TextAlignmentMode Flags
+         * for text with a horizontal baseline, and VerticalTextAlignmentMode Flags
+         * for text with a vertical baseline.
+         * 
+         * TextAlignmentMode Flags:
+         * TA_NOUPDATECP (0x0000):
+         * The drawing position in the playback device context MUST NOT be updated after each
+         * text output call. The reference point MUST be passed to the text output function.
+         * 
+         * TA_LEFT (0x0000):
+         * The reference point MUST be on the left edge of the bounding rectangle.
+         * 
+         * TA_TOP (0x0000):
+         * The reference point MUST be on the top edge of the bounding rectangle.
+         * 
+         * TA_UPDATECP (0x0001):
+         * The drawing position in the playback device context MUST be updated after each text
+         * output call. It MUST be used as the reference point.
+         * 
+         * TA_RIGHT (0x0002):
+         * The reference point MUST be on the right edge of the bounding rectangle.
+         * 
+         * TA_CENTER (0x0006):
+         * The reference point MUST be aligned horizontally with the center of the bounding
+         * rectangle.
+         * 
+         * TA_BOTTOM (0x0008):
+         * The reference point MUST be on the bottom edge of the bounding rectangle.
+         * 
+         * TA_BASELINE (0x0018):
+         * The reference point MUST be on the baseline of the text.
+         * 
+         * TA_RTLREADING (0x0100):
+         * The text MUST be laid out in right-to-left reading order, instead of the default
+         * left-toright order. This SHOULD be applied only when the font that is defined in the
+         * playback device context is either Hebrew or Arabic.
+         * 
+         * 
+         * VerticalTextAlignmentMode Flags (e.g. for Kanji fonts)
+         * VTA_TOP (0x0000):
+         * The reference point MUST be on the top edge of the bounding rectangle.
+         * 
+         * VTA_RIGHT (0x0000):
+         * The reference point MUST be on the right edge of the bounding rectangle.
+         * 
+         * VTA_BOTTOM (0x0002):
+         * The reference point MUST be on the bottom edge of the bounding rectangle.
+         * 
+         * VTA_CENTER (0x0006):
+         * The reference point MUST be aligned vertically with the center of the bounding
+         * rectangle.
+         * 
+         * VTA_LEFT (0x0008):
+         * The reference point MUST be on the left edge of the bounding rectangle.
+         * 
+         * VTA_BASELINE (0x0018):
+         * The reference point MUST be on the baseline of the text.
+         */
+        int textAlignmentMode;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setTextAlign;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            textAlignmentMode = leis.readUShort();
+            return LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+}

Added: poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfWindowing.java
URL: http://svn.apache.org/viewvc/poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfWindowing.java?rev=1566181&view=auto
==============================================================================
--- poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfWindowing.java (added)
+++ poi/branches/wmf_render/src/scratchpad/src/org/apache/poi/hwmf/record/WmfWindowing.java Sun Feb  9 01:14:54 2014
@@ -0,0 +1,399 @@
+package org.apache.poi.hwmf.record;
+
+import java.io.IOException;
+
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInputStream;
+
+public class WmfWindowing {
+    
+    /**
+     * The META_OFFSETCLIPRGN record moves the clipping region in the playback device context by the
+     * specified offsets.
+     */
+    public static class WmfOffsetClipRgn implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the number of logical units to move up or down.
+         */
+        int yOffset;
+        
+        /**
+         * A 16-bit signed integer that defines the number of logical units to move left or right. 
+         */
+        int xOffset;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.offsetClipRgn;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            yOffset = leis.readShort();
+            xOffset = leis.readShort();
+            return 2*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+    
+    
+    /**
+     * The META_SETVIEWPORTORG record defines the viewport origin in the playback device context.
+     */
+    public static class WmfSetViewportOrg implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the vertical offset, in device units.
+         */
+        int y;
+        
+        /**
+         * A 16-bit signed integer that defines the horizontal offset, in device units.
+         */
+        int x;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setViewportOrg;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            y = leis.readShort();
+            x = leis.readShort();
+            return 2*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+    /**
+     * The META_SETVIEWPORTEXT record sets the horizontal and vertical extents
+     * of the viewport in the playback device context.
+     */
+    public static class WmfSetViewportExt implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the vertical extent
+         * of the viewport in device units.
+         */
+        int y;
+        
+        /**
+         * A 16-bit signed integer that defines the horizontal extent
+         * of the viewport in device units.
+         */
+        int x;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setViewportExt;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            y = leis.readShort();
+            x = leis.readShort();
+            return 2*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+    /**
+     * The META_OFFSETVIEWPORTORG record moves the viewport origin in the playback device context
+     * by specified horizontal and vertical offsets.
+     */
+    public static class WmfOffsetViewportOrg implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the vertical offset, in device units.
+         */
+        int yOffset;
+        
+        /**
+         * A 16-bit signed integer that defines the horizontal offset, in device units.
+         */
+        int xOffset;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.offsetViewportOrg;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            yOffset = leis.readShort();
+            xOffset = leis.readShort();
+            return 2*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+    /**
+     * The META_SETWINDOWORG record defines the output window origin in the playback device context.
+     */
+    public static class WmfSetWindowOrg implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the y-coordinate, in logical units.
+         */
+        int y;
+        
+        /**
+         * A 16-bit signed integer that defines the x-coordinate, in logical units.
+         */
+        int x;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setWindowOrg;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            y = leis.readShort();
+            x = leis.readShort();
+            return 2*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+    /**
+     * The META_SETWINDOWEXT record defines the horizontal and vertical extents
+     * of the output window in the playback device context.
+     */
+    public static class WmfSetWindowExt implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the vertical extent of
+         * the window in logical units.
+         */
+        int y;
+        
+        /**
+         * A 16-bit signed integer that defines the horizontal extent of
+         * the window in logical units.
+         */
+        int x;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.setWindowExt;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            y = leis.readShort();
+            x = leis.readShort();
+            return 2*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+    /**
+     * The META_OFFSETWINDOWORG record moves the output window origin in the
+     * playback device context by specified horizontal and vertical offsets.
+     */
+    public static class WmfOffsetWindowOrg implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the vertical offset, in device units.
+         */
+        int yOffset;
+        
+        /**
+         * A 16-bit signed integer that defines the horizontal offset, in device units.
+         */
+        int xOffset;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.offsetWindowOrg;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            yOffset = leis.readShort();
+            xOffset = leis.readShort();
+            return 2*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+    /**
+     * The META_OFFSETWINDOWORG record moves the output window origin in the
+     * playback device context by specified horizontal and vertical offsets.
+     */
+    public static class WmfScaleWindowExt implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the amount by which to divide the
+         * result of multiplying the current y-extent by the value of the yNum member.
+         */
+        int yDenom;
+        
+        /**
+         * A 16-bit signed integer that defines the amount by which to multiply the
+         * current y-extent.
+         */
+        int yNum;
+        
+        /**
+         * A 16-bit signed integer that defines the amount by which to divide the
+         * result of multiplying the current x-extent by the value of the xNum member.
+         */
+        int xDenom;
+        
+        /**
+         * A 16-bit signed integer that defines the amount by which to multiply the
+         * current x-extent.
+         */
+        int xNum;  
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.scaleWindowExt;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            yDenom = leis.readShort();
+            yNum = leis.readShort();
+            xDenom = leis.readShort();
+            xNum = leis.readShort();
+            return 4*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+
+    /**
+     * The META_SCALEVIEWPORTEXT record scales the horizontal and vertical extents of the viewport
+     * that is defined in the playback device context by using the ratios formed by the specified
+     * multiplicands and divisors.
+     */
+    public static class WmfScaleViewportExt implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the amount by which to divide the
+         * result of multiplying the current y-extent by the value of the yNum member.
+         */
+        int yDenom;
+        
+        /**
+         * A 16-bit signed integer that defines the amount by which to multiply the
+         * current y-extent.
+         */
+        int yNum;
+        
+        /**
+         * A 16-bit signed integer that defines the amount by which to divide the
+         * result of multiplying the current x-extent by the value of the xNum member.
+         */
+        int xDenom;
+        
+        /**
+         * A 16-bit signed integer that defines the amount by which to multiply the
+         * current x-extent.
+         */
+        int xNum;  
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.scaleViewportExt;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            yDenom = leis.readShort();
+            yNum = leis.readShort();
+            xDenom = leis.readShort();
+            xNum = leis.readShort();
+            return 4*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+    /**
+     * The META_EXCLUDECLIPRECT record sets the clipping region in the playback device context to the
+     * existing clipping region minus the specified rectangle.
+     */
+    public static class WmfExcludeClipRect implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the y-coordinate, in logical units, of the
+         * lower-right corner of the rectangle.
+         */
+        int bottom;
+        
+        /**
+         * A 16-bit signed integer that defines the x-coordinate, in logical units, of the
+         * lower-right corner of the rectangle.
+         */
+        int right;
+        
+        /**
+         * A 16-bit signed integer that defines the y-coordinate, in logical units, of the
+         * upper-left corner of the rectangle.
+         */
+        int top;
+        
+        /**
+         * A 16-bit signed integer that defines the x-coordinate, in logical units, of the
+         * upper-left corner of the rectangle.
+         */
+        int left;  
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.excludeClipRect;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            bottom = leis.readShort();
+            right = leis.readShort();
+            top = leis.readShort();
+            left = leis.readShort();
+            return 4*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+
+    /**
+     * The META_INTERSECTCLIPRECT record sets the clipping region in the playback device context to the
+     * intersection of the existing clipping region and the specified rectangle.
+     */
+    public static class WmfIntersectClipRect implements WmfRecord {
+        
+        /**
+         * A 16-bit signed integer that defines the y-coordinate, in logical units, of the
+         * lower-right corner of the rectangle.
+         */
+        int bottom;
+        
+        /**
+         * A 16-bit signed integer that defines the x-coordinate, in logical units, of the
+         * lower-right corner of the rectangle.
+         */
+        int right;
+        
+        /**
+         * A 16-bit signed integer that defines the y-coordinate, in logical units, of the
+         * upper-left corner of the rectangle.
+         */
+        int top;
+        
+        /**
+         * A 16-bit signed integer that defines the x-coordinate, in logical units, of the
+         * upper-left corner of the rectangle.
+         */
+        int left;  
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.intersectClipRect;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            bottom = leis.readShort();
+            right = leis.readShort();
+            top = leis.readShort();
+            left = leis.readShort();
+            return 4*LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+    /**
+     * The META_INTERSECTCLIPRECT record sets the clipping region in the playback device context to the
+     * intersection of the existing clipping region and the specified rectangle.
+     */
+    public static class WmfSelectClipRegion implements WmfRecord {
+        
+        /**
+         * A 16-bit unsigned integer used to index into the WMF Object Table to get
+         * the region to be clipped.
+         */
+        int region;
+        
+        public WmfRecordType getRecordType() {
+            return WmfRecordType.selectClipRegion;
+        }
+        
+        public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
+            region = leis.readShort();
+            return LittleEndianConsts.SHORT_SIZE;
+        }
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message