net.arnx.wmf2svg.gdi.wmf.WmfGdi Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of wmf2svg Show documentation
Show all versions of wmf2svg Show documentation
WMF to SVG Converting Tool & Library
package net.arnx.wmf2svg.gdi.wmf;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.arnx.wmf2svg.gdi.Gdi;
import net.arnx.wmf2svg.gdi.GdiBrush;
import net.arnx.wmf2svg.gdi.GdiFont;
import net.arnx.wmf2svg.gdi.GdiObject;
import net.arnx.wmf2svg.gdi.GdiPalette;
import net.arnx.wmf2svg.gdi.GdiPatternBrush;
import net.arnx.wmf2svg.gdi.GdiPen;
import net.arnx.wmf2svg.gdi.GdiRegion;
import net.arnx.wmf2svg.gdi.Point;
import net.arnx.wmf2svg.gdi.Size;
public class WmfGdi implements Gdi, WmfConstants {
private byte[] placeableHeader;
private byte[] header;
private List objects = new ArrayList();
private List records = new ArrayList();
public WmfGdi() {
}
public void write(OutputStream out) throws IOException {
footer();
if (placeableHeader != null) out.write(placeableHeader);
if (header != null) out.write(header);
Iterator i = records.iterator();
while (i.hasNext()) {
out.write((byte[])i.next());
}
}
public void placeableHeader(int vsx, int vsy, int vex, int vey, int dpi) {
byte[] record = new byte[22];
int pos = 0;
pos = setUint32(record, pos, 0x9AC6CDD7);
pos = setInt16(record, pos, 0x0000);
pos = setInt16(record, pos, vsx);
pos = setInt16(record, pos, vsy);
pos = setInt16(record, pos, vex);
pos = setInt16(record, pos, vey);
pos = setUint16(record, pos, dpi);
pos = setUint32(record, pos, 0x00000000);
int checksum = 0;
for (int i = 0; i < record.length-2; i+=2) {
checksum ^= (0xFF & record[i]) | ((0xFF & record[i+1]) << 8);
}
pos = setUint16(record, pos, checksum);
placeableHeader = record;
}
public void header() {
byte[] record = new byte[18];
int pos = 0;
pos = setUint16(record, pos, 0x0001);
pos = setUint16(record, pos, 0x0009);
pos = setUint16(record, pos, 0x0300);
pos = setUint32(record, pos, 0x0000); // dummy size
pos = setUint16(record, pos, 0x0000); // dummy noObjects
pos = setUint32(record, pos, 0x0000); // dummy maxRecords
pos = setUint16(record, pos, 0x0000);
header = record;
}
public void animatePalette(GdiPalette palette, int startIndex, int[] entries) {
byte[] record = new byte[22];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_ANIMATE_PALETTE);
pos = setUint16(record, pos, entries.length);
pos = setUint16(record, pos, startIndex);
pos = setUint16(record, pos, ((WmfPalette)palette).getID());
for (int i = 0; i < entries.length; i++) {
pos = setInt32(record, pos, entries[i]);
}
records.add(record);
}
public void arc(int sxr, int syr, int exr, int eyr, int sxa, int sya, int exa, int eya) {
byte[] record = new byte[22];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_ARC);
pos = setInt16(record, pos, eya);
pos = setInt16(record, pos, exa);
pos = setInt16(record, pos, sya);
pos = setInt16(record, pos, sxa);
pos = setInt16(record, pos, eyr);
pos = setInt16(record, pos, exr);
pos = setInt16(record, pos, syr);
pos = setInt16(record, pos, sxr);
records.add(record);
}
public void bitBlt(byte[] image, int dx, int dy, int dw, int dh, int sx, int sy, long rop) {
byte[] record = new byte[22 + (image.length + image.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_BIT_BLT);
pos = setUint32(record, pos, rop);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
pos = setInt16(record, pos, dw);
pos = setInt16(record, pos, dh);
pos = setInt16(record, pos, dy);
pos = setInt16(record, pos, dx);
pos = setBytes(record, pos, image);
if (image.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
}
public void chord(int sxr, int syr, int exr, int eyr, int sxa, int sya, int exa, int eya) {
byte[] record = new byte[22];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_CHORD);
pos = setInt16(record, pos, eya);
pos = setInt16(record, pos, exa);
pos = setInt16(record, pos, sya);
pos = setInt16(record, pos, sxa);
pos = setInt16(record, pos, eyr);
pos = setInt16(record, pos, exr);
pos = setInt16(record, pos, syr);
pos = setInt16(record, pos, sxr);
records.add(record);
}
public GdiBrush createBrushIndirect(int style, int color, int hatch) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_CREATE_BRUSH_INDIRECT);
pos = setUint16(record, pos, style);
pos = setInt32(record, pos, color);
pos = setUint16(record, pos, hatch);
records.add(record);
WmfBrush brush = new WmfBrush(objects.size(), style, color, hatch);
objects.add(brush);
return brush;
}
public GdiFont createFontIndirect(int height, int width, int escapement,
int orientation, int weight, boolean italic, boolean underline,
boolean strikeout, int charset, int outPrecision,
int clipPrecision, int quality, int pitchAndFamily, byte[] faceName) {
byte[] record = new byte[24 + (faceName.length + faceName.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_CREATE_FONT_INDIRECT);
pos = setInt16(record, pos, height);
pos = setInt16(record, pos, width);
pos = setInt16(record, pos, escapement);
pos = setInt16(record, pos, orientation);
pos = setInt16(record, pos, weight);
pos = setByte(record, pos, (italic) ? 0x01 : 0x00);
pos = setByte(record, pos, (underline) ? 0x01 : 0x00);
pos = setByte(record, pos, (strikeout) ? 0x01 : 0x00);
pos = setByte(record, pos, charset);
pos = setByte(record, pos, outPrecision);
pos = setByte(record, pos, clipPrecision);
pos = setByte(record, pos, quality);
pos = setByte(record, pos, pitchAndFamily);
pos = setBytes(record, pos, faceName);
if (faceName.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
WmfFont font = new WmfFont(objects.size(), height, width, escapement,
orientation, weight, italic, underline, strikeout, charset, outPrecision,
clipPrecision, quality, pitchAndFamily, faceName);
objects.add(font);
return font;
}
public GdiPalette createPalette(int version, int[] entries) {
byte[] record = new byte[10 + entries.length * 4];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_CREATE_PALETTE);
pos = setUint16(record, pos, version);
pos = setUint16(record, pos, entries.length);
for (int i = 0; i < entries.length; i++) {
pos = setInt32(record, pos, entries[i]);
}
records.add(record);
GdiPalette palette = new WmfPalette(objects.size(), version, entries);
objects.add(palette);
return palette;
}
public GdiPatternBrush createPatternBrush(byte[] image) {
byte[] record = new byte[6 + (image.length + image.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_CREATE_PATTERN_BRUSH);
pos = setBytes(record, pos, image);
if (image.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
GdiPatternBrush brush = new WmfPatternBrush(objects.size(), image);
objects.add(brush);
return brush;
}
public GdiPen createPenIndirect(int style, int width, int color) {
byte[] record = new byte[16];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_CREATE_PEN_INDIRECT);
pos = setUint16(record, pos, style);
pos = setInt16(record, pos, width);
pos = setInt16(record, pos, 0);
pos = setInt32(record, pos, color);
records.add(record);
WmfPen pen = new WmfPen(objects.size(), style, width, color);
objects.add(pen);
return pen;
}
public GdiRegion createRectRgn(int left, int top, int right, int bottom) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_CREATE_RECT_RGN);
pos = setInt16(record, pos, bottom);
pos = setInt16(record, pos, right);
pos = setInt16(record, pos, top);
pos = setInt16(record, pos, left);
records.add(record);
WmfRectRegion rgn = new WmfRectRegion(objects.size(), left, top, right, bottom);
objects.add(rgn);
return rgn;
}
public void deleteObject(GdiObject obj) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_DELETE_OBJECT);
pos = setUint16(record, pos, ((WmfObject)obj).getID());
records.add(record);
objects.set(((WmfObject)obj).getID(), null);
}
public void dibBitBlt(byte[] image, int dx, int dy, int dw, int dh, int sx, int sy, long rop) {
byte[] record = new byte[22 + (image.length + image.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_DIB_BIT_BLT);
pos = setUint32(record, pos, rop);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
pos = setInt16(record, pos, dw);
pos = setInt16(record, pos, dh);
pos = setInt16(record, pos, dy);
pos = setInt16(record, pos, dx);
pos = setBytes(record, pos, image);
if (image.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
}
public GdiPatternBrush dibCreatePatternBrush(byte[] image, int usage) {
byte[] record = new byte[10 + (image.length + image.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_DIB_CREATE_PATTERN_BRUSH);
pos = setInt32(record, pos, usage);
pos = setBytes(record, pos, image);
if (image.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
// TODO usage
GdiPatternBrush brush = new WmfPatternBrush(objects.size(), image);
objects.add(brush);
return brush;
}
public void dibStretchBlt(byte[] image, int dx, int dy, int dw, int dh,
int sx, int sy, int sw, int sh, long rop) {
byte[] record = new byte[26 + (image.length + image.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_DIB_STRETCH_BLT);
pos = setUint32(record, pos, rop);
pos = setInt16(record, pos, sh);
pos = setInt16(record, pos, sw);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
pos = setInt16(record, pos, dw);
pos = setInt16(record, pos, dh);
pos = setInt16(record, pos, dy);
pos = setInt16(record, pos, dx);
pos = setBytes(record, pos, image);
if (image.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
}
public void ellipse(int sx, int sy, int ex, int ey) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_ELLIPSE);
pos = setInt16(record, pos, ey);
pos = setInt16(record, pos, ex);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
records.add(record);
}
public void escape(byte[] data) {
byte[] record = new byte[10 + (data.length + data.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_ESCAPE);
pos = setBytes(record, pos, data);
if (data.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
}
public int excludeClipRect(int left, int top, int right, int bottom) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_EXCLUDE_CLIP_RECT);
pos = setInt16(record, pos, bottom);
pos = setInt16(record, pos, right);
pos = setInt16(record, pos, top);
pos = setInt16(record, pos, left);
records.add(record);
// TODO
return GdiRegion.COMPLEXREGION;
}
public void extFloodFill(int x, int y, int color, int type) {
byte[] record = new byte[16];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_EXT_FLOOD_FILL);
pos = setUint16(record, pos, type);
pos = setInt32(record, pos, color);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void extTextOut(int x, int y, int options, int[] rect, byte[] text, int[] lpdx) {
if (rect != null && rect.length != 4) {
throw new IllegalArgumentException("rect must be 4 length.");
}
byte[] record = new byte[14 + ((rect != null) ? 8 : 0) + (text.length + text.length%2) + (lpdx.length * 2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_EXT_TEXT_OUT);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
pos = setInt16(record, pos, text.length);
pos = setInt16(record, pos, options);
if (rect != null) {
pos = setInt16(record, pos, rect[0]);
pos = setInt16(record, pos, rect[1]);
pos = setInt16(record, pos, rect[2]);
pos = setInt16(record, pos, rect[3]);
}
pos = setBytes(record, pos, text);
if (text.length%2 == 1) pos = setByte(record, pos, 0);
for (int i = 0; i < lpdx.length; i++) {
pos = setInt16(record, pos, lpdx[i]);
}
records.add(record);
}
public void fillRgn(GdiRegion rgn, GdiBrush brush) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_FLOOD_FILL);
pos = setUint16(record, pos, ((WmfBrush)brush).getID());
pos = setUint16(record, pos, ((WmfRegion)rgn).getID());
records.add(record);
}
public void floodFill(int x, int y, int color) {
byte[] record = new byte[16];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_FLOOD_FILL);
pos = setInt32(record, pos, color);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void frameRgn(GdiRegion rgn, GdiBrush brush, int w, int h) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_FRAME_RGN);
pos = setInt16(record, pos, h);
pos = setInt16(record, pos, w);
pos = setUint16(record, pos, ((WmfBrush)brush).getID());
pos = setUint16(record, pos, ((WmfRegion)rgn).getID());
records.add(record);
}
public void intersectClipRect(int left, int top, int right, int bottom) {
byte[] record = new byte[16];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_INTERSECT_CLIP_RECT);
pos = setInt16(record, pos, bottom);
pos = setInt16(record, pos, right);
pos = setInt16(record, pos, top);
pos = setInt16(record, pos, left);
records.add(record);
}
public void invertRgn(GdiRegion rgn) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_INVERT_RGN);
pos = setUint16(record, pos, ((WmfRegion)rgn).getID());
records.add(record);
}
public void lineTo(int ex, int ey) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_LINE_TO);
pos = setInt16(record, pos, ey);
pos = setInt16(record, pos, ex);
records.add(record);
}
public void moveToEx(int x, int y, Point old) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_MOVE_TO_EX);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
//TODO old
records.add(record);
}
public void offsetClipRgn(int x, int y) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_OFFSET_CLIP_RGN);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void offsetViewportOrgEx(int x, int y, Point point) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_OFFSET_VIEWPORT_ORG_EX);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
// TODO
records.add(record);
}
public void offsetWindowOrgEx(int x, int y, Point point) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_OFFSET_WINDOW_ORG_EX);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
// TODO
records.add(record);
}
public void paintRgn(GdiRegion rgn) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_PAINT_RGN);
pos = setUint16(record, pos, ((WmfRegion)rgn).getID());
records.add(record);
}
public void patBlt(int x, int y, int width, int height, long rop) {
byte[] record = new byte[18];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_PAT_BLT);
pos = setUint32(record, pos, rop);
pos = setInt16(record, pos, height);
pos = setInt16(record, pos, width);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void pie(int sx, int sy, int ex, int ey, int sxr, int syr, int exr, int eyr) {
byte[] record = new byte[22];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_PIE);
pos = setInt16(record, pos, eyr);
pos = setInt16(record, pos, exr);
pos = setInt16(record, pos, syr);
pos = setInt16(record, pos, sxr);
pos = setInt16(record, pos, ey);
pos = setInt16(record, pos, ex);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
records.add(record);
}
public void polygon(Point[] points) {
byte[] record = new byte[8 + points.length * 4];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_POLYGON);
pos = setInt16(record, pos, points.length);
for (int i = 0; i < points.length; i++) {
pos = setInt16(record, pos, points[i].x);
pos = setInt16(record, pos, points[i].y);
}
records.add(record);
}
public void polyline(Point[] points) {
byte[] record = new byte[8 + points.length * 4];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_POLYLINE);
pos = setInt16(record, pos, points.length);
for (int i = 0; i < points.length; i++) {
pos = setInt16(record, pos, points[i].x);
pos = setInt16(record, pos, points[i].y);
}
records.add(record);
}
public void polyPolygon(Point[][] points) {
int length = 8;
for (int i = 0; i < points.length; i++) {
length += 2 + points[i].length * 4;
}
byte[] record = new byte[length];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_POLYLINE);
pos = setInt16(record, pos, points.length);
for (int i = 0; i < points.length; i++) {
pos = setInt16(record, pos, points[i].length);
}
for (int i = 0; i < points.length; i++) {
for (int j = 0; j < points[i].length; j++) {
pos = setInt16(record, pos, points[i][j].x);
pos = setInt16(record, pos, points[i][j].y);
}
}
records.add(record);
}
public void realizePalette() {
byte[] record = new byte[6];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_REALIZE_PALETTE);
records.add(record);
}
public void restoreDC(int savedDC) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_RESTORE_DC);
pos = setInt16(record, pos, savedDC);
records.add(record);
}
public void rectangle(int sx, int sy, int ex, int ey) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_RECTANGLE);
pos = setInt16(record, pos, ey);
pos = setInt16(record, pos, ex);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
records.add(record);
}
public void resizePalette(GdiPalette palette) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_REALIZE_PALETTE);
pos = setUint16(record, pos, ((WmfPalette)palette).getID());
records.add(record);
}
public void roundRect(int sx, int sy, int ex, int ey, int rw, int rh) {
byte[] record = new byte[18];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_ROUND_RECT);
pos = setInt16(record, pos, rh);
pos = setInt16(record, pos, rw);
pos = setInt16(record, pos, ey);
pos = setInt16(record, pos, ex);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
records.add(record);
}
public void seveDC() {
byte[] record = new byte[6];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SAVE_DC);
records.add(record);
}
public void scaleViewportExtEx(int x, int xd, int y, int yd, Size old) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SCALE_VIEWPORT_EXT_EX);
pos = setInt16(record, pos, yd);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, xd);
pos = setInt16(record, pos, x);
// TODO
records.add(record);
}
public void scaleWindowExtEx(int x, int xd, int y, int yd, Size old) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SCALE_WINDOW_EXT_EX);
pos = setInt16(record, pos, yd);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, xd);
pos = setInt16(record, pos, x);
// TODO
records.add(record);
}
public void selectClipRgn(GdiRegion rgn) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SELECT_CLIP_RGN);
pos = setUint16(record, pos, ((WmfRegion)rgn).getID());
records.add(record);
}
public void selectObject(GdiObject obj) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SELECT_OBJECT);
pos = setUint16(record, pos, ((WmfObject)obj).getID());
records.add(record);
}
public void selectPalette(GdiPalette palette, boolean mode) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SELECT_PALETTE);
pos = setInt16(record, pos, mode ? 1 : 0);
pos = setUint16(record, pos, ((WmfPalette)palette).getID());
records.add(record);
}
public void setBkColor(int color) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_BK_COLOR);
pos = setInt32(record, pos, color);
records.add(record);
}
public void setBkMode(int mode) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_BK_MODE);
pos = setInt16(record, pos, mode);
records.add(record);
}
public void setDIBitsToDevice(int dx, int dy, int dw, int dh, int sx,
int sy, int startscan, int scanlines, byte[] image, int colorUse) {
byte[] record = new byte[24 + (image.length + image.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_DIBITS_TO_DEVICE);
pos = setUint16(record, pos, colorUse);
pos = setUint16(record, pos, scanlines);
pos = setUint16(record, pos, startscan);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
pos = setInt16(record, pos, dw);
pos = setInt16(record, pos, dh);
pos = setInt16(record, pos, dy);
pos = setInt16(record, pos, dx);
pos = setBytes(record, pos, image);
if (image.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
}
public void setLayout(long layout) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_LAYOUT);
pos = setUint32(record, pos, layout);
records.add(record);
}
public void setMapMode(int mode) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_MAP_MODE);
pos = setInt16(record, pos, mode);
records.add(record);
}
public void setMapperFlags(long flags) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_MAPPER_FLAGS);
pos = setUint32(record, pos, flags);
records.add(record);
}
public void setPaletteEntries(GdiPalette palette, int startIndex, int[] entries) {
byte[] record = new byte[6 + entries.length * 4];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_PALETTE_ENTRIES);
pos = setUint16(record, pos, ((WmfPalette)palette).getID());
pos = setUint16(record, pos, entries.length);
pos = setUint16(record, pos, startIndex);
for (int i = 0; i < entries.length; i++) {
pos = setInt32(record, pos, entries[i]);
}
records.add(record);
}
public void setPixel(int x, int y, int color) {
byte[] record = new byte[14];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_PIXEL);
pos = setInt32(record, pos, color);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void setPolyFillMode(int mode) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_POLY_FILL_MODE);
pos = setInt16(record, pos, mode);
records.add(record);
}
public void setRelAbs(int mode) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_REL_ABS);
pos = setInt16(record, pos, mode);
records.add(record);
}
public void setROP2(int mode) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_ROP2);
pos = setInt16(record, pos, mode);
records.add(record);
}
public void setStretchBltMode(int mode) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_STRETCH_BLT_MODE);
pos = setInt16(record, pos, mode);
records.add(record);
}
public void setTextAlign(int align) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_TEXT_ALIGN);
pos = setInt16(record, pos, align);
records.add(record);
}
public void setTextCharacterExtra(int extra) {
byte[] record = new byte[8];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_TEXT_CHARACTER_EXTRA);
pos = setInt16(record, pos, extra);
records.add(record);
}
public void setTextColor(int color) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_TEXT_COLOR);
pos = setInt32(record, pos, color);
records.add(record);
}
public void setTextJustification(int breakExtra, int breakCount) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_TEXT_COLOR);
pos = setInt16(record, pos, breakCount);
pos = setInt16(record, pos, breakExtra);
records.add(record);
}
public void setViewportExtEx(int x, int y, Size old) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_VIEWPORT_EXT_EX);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void setViewportOrgEx(int x, int y, Point old) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_VIEWPORT_ORG_EX);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void setWindowExtEx(int width, int height, Size old) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_WINDOW_EXT_EX);
pos = setInt16(record, pos, height);
pos = setInt16(record, pos, width);
records.add(record);
}
public void setWindowOrgEx(int x, int y, Point old) {
byte[] record = new byte[10];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_SET_WINDOW_ORG_EX);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void stretchBlt(byte[] image, int dx, int dy, int dw, int dh,
int sx, int sy, int sw, int sh, long rop) {
byte[] record = new byte[26 + (image.length + image.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_STRETCH_BLT);
pos = setUint32(record, pos, rop);
pos = setInt16(record, pos, sh);
pos = setInt16(record, pos, sw);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
pos = setInt16(record, pos, dw);
pos = setInt16(record, pos, dh);
pos = setInt16(record, pos, dy);
pos = setInt16(record, pos, dx);
pos = setBytes(record, pos, image);
if (image.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
}
public void stretchDIBits(int dx, int dy, int dw, int dh, int sx, int sy,
int sw, int sh, byte[] image, int usage, long rop) {
byte[] record = new byte[26 + (image.length + image.length%2)];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_STRETCH_DIBITS);
pos = setUint32(record, pos, rop);
pos = setUint16(record, pos, usage);
pos = setInt16(record, pos, sh);
pos = setInt16(record, pos, sw);
pos = setInt16(record, pos, sy);
pos = setInt16(record, pos, sx);
pos = setInt16(record, pos, dw);
pos = setInt16(record, pos, dh);
pos = setInt16(record, pos, dy);
pos = setInt16(record, pos, dx);
pos = setBytes(record, pos, image);
if (image.length%2 == 1) pos = setByte(record, pos, 0);
records.add(record);
}
public void textOut(int x, int y, byte[] text) {
byte[] record = new byte[10 + text.length + text.length%2];
int pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, RECORD_TEXT_OUT);
pos = setInt16(record, pos, text.length);
pos = setBytes(record, pos, text);
if (text.length%2 == 1) pos = setByte(record, pos, 0);
pos = setInt16(record, pos, y);
pos = setInt16(record, pos, x);
records.add(record);
}
public void footer() {
int pos = 0;
if (header != null) {
long size = header.length;
long maxRecordSize = 0;
Iterator i = records.iterator();
while (i.hasNext()) {
byte[] record = (byte[])i.next();
size += record.length;
if (record.length > maxRecordSize) maxRecordSize = record.length;
}
pos = setUint32(header, 6, size/2);
pos = setUint16(header, pos, objects.size());
pos = setUint32(header, pos, maxRecordSize / 2);
}
byte[] record = new byte[6];
pos = 0;
pos = setUint32(record, pos, record.length/2);
pos = setUint16(record, pos, 0x0000);
records.add(record);
}
private int setByte(byte[] out, int pos, int value) {
out[pos] = (byte)(0xFF & value);
return pos + 1;
}
private int setBytes(byte[] out, int pos, byte[] data) {
System.arraycopy(data, 0, out, pos, data.length);
return pos + data.length;
}
private int setInt16(byte[] out, int pos, int value) {
out[pos] = (byte)(0xFF & value);
out[pos+1] = (byte)(0xFF & (value >> 8));
return pos + 2;
}
private int setInt32(byte[] out, int pos, int value) {
out[pos] = (byte)(0xFF & value);
out[pos+1] = (byte)(0xFF & (value >> 8));
out[pos+2] = (byte)(0xFF & (value >> 16));
out[pos+3] = (byte)(0xFF & (value >> 24));
return pos + 4;
}
private int setUint16(byte[] out, int pos, int value) {
out[pos] = (byte)(0xFF & value);
out[pos+1] = (byte)(0xFF & (value >> 8));
return pos + 2;
}
private int setUint32(byte[] out, int pos, long value) {
out[pos] = (byte)(0xFF & value);
out[pos+1] = (byte)(0xFF & (value >> 8));
out[pos+2] = (byte)(0xFF & (value >> 16));
out[pos+3] = (byte)(0xFF & (value >> 24));
return pos + 4;
}
}