| /* ==================================================================== |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ==================================================================== */ |
| |
| package org.apache.poi.hwmf.record; |
| |
| import java.io.IOException; |
| |
| import org.apache.poi.hwmf.draw.HwmfGraphics; |
| import org.apache.poi.util.HexDump; |
| import org.apache.poi.util.IOUtils; |
| import org.apache.poi.util.LittleEndianConsts; |
| import org.apache.poi.util.LittleEndianInputStream; |
| |
| /** |
| * The MetafileEscapes specifies printer driver functionality that |
| * might not be directly accessible through WMF records |
| */ |
| public class HwmfEscape implements HwmfRecord { |
| |
| public enum EscapeFunction { |
| /** Notifies the printer driver that the application has finished writing to a page. */ |
| NEWFRAME(0x0001), |
| /** Stops processing the current document. */ |
| ABORTDOC(0x0002), |
| /** Notifies the printer driver that the application has finished writing to a band. */ |
| NEXTBAND(0x0003), |
| /** Sets color table values. */ |
| SETCOLORTABLE(0x0004), |
| /** Gets color table values. */ |
| GETCOLORTABLE(0x0005), |
| /** Causes all pending output to be flushed to the output device. */ |
| FLUSHOUT(0x0006), |
| /** Indicates that the printer driver SHOULD print text only, and no graphics. */ |
| DRAFTMODE(0x0007), |
| /** Queries a printer driver to determine whether a specific escape function is supported on the output device it drives. */ |
| QUERYESCSUPPORT(0x0008), |
| /** Sets the application-defined function that allows a print job to be canceled during printing. */ |
| SETABORTPROC(0x0009), |
| /** Notifies the printer driver that a new print job is starting. */ |
| STARTDOC(0x000A), |
| /** Notifies the printer driver that the current print job is ending. */ |
| ENDDOC(0x000B), |
| /** Retrieves the physical page size currently selected on an output device. */ |
| GETPHYSPAGESIZE(0x000C), |
| /** Retrieves the offset from the upper-left corner of the physical page where the actual printing or drawing begins. */ |
| GETPRINTINGOFFSET(0x000D), |
| /** Retrieves the scaling factors for the x-axis and the y-axis of a printer. */ |
| GETSCALINGFACTOR(0x000E), |
| /** Used to embed an enhanced metafile format (EMF) metafile within a WMF metafile. */ |
| META_ESCAPE_ENHANCED_METAFILE(0x000F), |
| /** Sets the width of a pen in pixels. */ |
| SETPENWIDTH(0x0010), |
| /** Sets the number of copies. */ |
| SETCOPYCOUNT(0x0011), |
| /** Sets the source, such as a particular paper tray or bin on a printer, for output forms. */ |
| SETPAPERSOURCE(0x0012), |
| /** This record passes through arbitrary data. */ |
| PASSTHROUGH(0x0013), |
| /** Gets information concerning graphics technology that is supported on a device. */ |
| GETTECHNOLOGY(0x0014), |
| /** Specifies the line-drawing mode to use in output to a device. */ |
| SETLINECAP(0x0015), |
| /** Specifies the line-joining mode to use in output to a device. */ |
| SETLINEJOIN(0x0016), |
| /** Sets the limit for the length of miter joins to use in output to a device. */ |
| SETMITERLIMIT(0x0017), |
| /** Retrieves or specifies settings concerning banding on a device, such as the number of bands. */ |
| BANDINFO(0x0018), |
| /** Draws a rectangle with a defined pattern. */ |
| DRAWPATTERNRECT(0x0019), |
| /** Retrieves the physical pen size currently defined on a device. */ |
| GETVECTORPENSIZE(0x001A), |
| /** Retrieves the physical brush size currently defined on a device. */ |
| GETVECTORBRUSHSIZE(0x001B), |
| /** Enables or disables double-sided (duplex) printing on a device. */ |
| ENABLEDUPLEX(0x001C), |
| /** Retrieves or specifies the source of output forms on a device. */ |
| GETSETPAPERBINS(0x001D), |
| /** Retrieves or specifies the paper orientation on a device. */ |
| GETSETPRINTORIENT(0x001E), |
| /** Retrieves information concerning the sources of different forms on an output device. */ |
| ENUMPAPERBINS(0x001F), |
| /** Specifies the scaling of device-independent bitmaps (DIBs). */ |
| SETDIBSCALING(0x0020), |
| /** Indicates the start and end of an encapsulated PostScript (EPS) section. */ |
| EPSPRINTING(0x0021), |
| /** Queries a printer driver for paper dimensions and other forms data. */ |
| ENUMPAPERMETRICS(0x0022), |
| /** Retrieves or specifies paper dimensions and other forms data on an output device. */ |
| GETSETPAPERMETRICS(0x0023), |
| /** Sends arbitrary PostScript data to an output device. */ |
| POSTSCRIPT_DATA(0x0025), |
| /** Notifies an output device to ignore PostScript data. */ |
| POSTSCRIPT_IGNORE(0x0026), |
| /** Gets the device units currently configured on an output device. */ |
| GETDEVICEUNITS(0x002A), |
| /** Gets extended text metrics currently configured on an output device. */ |
| GETEXTENDEDTEXTMETRICS(0x0100), |
| /** Gets the font kern table currently defined on an output device. */ |
| GETPAIRKERNTABLE(0x0102), |
| /** Draws text using the currently selected font, background color, and text color. */ |
| EXTTEXTOUT(0x0200), |
| /** Gets the font face name currently configured on a device. */ |
| GETFACENAME(0x0201), |
| /** Sets the font face name on a device. */ |
| DOWNLOADFACE(0x0202), |
| /** Queries a printer driver about the support for metafiles on an output device. */ |
| METAFILE_DRIVER(0x0801), |
| /** Queries the printer driver about its support for DIBs on an output device. */ |
| QUERYDIBSUPPORT(0x0C01), |
| /** Opens a path. */ |
| BEGIN_PATH(0x1000), |
| /** Defines a clip region that is bounded by a path. The input MUST be a 16-bit quantity that defines the action to take. */ |
| CLIP_TO_PATH(0x1001), |
| /** Ends a path. */ |
| END_PATH(0x1002), |
| /** The same as STARTDOC specified with a NULL document and output filename, data in raw mode, and a type of zero. */ |
| OPEN_CHANNEL(0x100E), |
| /** Instructs the printer driver to download sets of PostScript procedures. */ |
| DOWNLOADHEADER(0x100F), |
| /** The same as ENDDOC. See OPEN_CHANNEL. */ |
| CLOSE_CHANNEL(0x1010), |
| /** Sends arbitrary data directly to a printer driver, which is expected to process this data only when in PostScript mode. */ |
| POSTSCRIPT_PASSTHROUGH(0x1013), |
| /** Sends arbitrary data directly to the printer driver. */ |
| ENCAPSULATED_POSTSCRIPT(0x1014), |
| /** Sets the printer driver to either PostScript or GDI mode. */ |
| POSTSCRIPT_IDENTIFY(0x1015), |
| /** Inserts a block of raw data into a PostScript stream. The input MUST be |
| a 32-bit quantity specifying the number of bytes to inject, a 16-bit quantity specifying the |
| injection point, and a 16-bit quantity specifying the page number, followed by the bytes to |
| inject. */ |
| POSTSCRIPT_INJECTION(0x1016), |
| /** Checks whether the printer supports a JPEG image. */ |
| CHECKJPEGFORMAT(0x1017), |
| /** Checks whether the printer supports a PNG image */ |
| CHECKPNGFORMAT(0x1018), |
| /** Gets information on a specified feature setting for a PostScript printer driver. */ |
| GET_PS_FEATURESETTING(0x1019), |
| /** Enables applications to write documents to a file or to a printer in XML Paper Specification (XPS) format. */ |
| MXDC_ESCAPE(0x101A), |
| /** Enables applications to include private procedures and other arbitrary data in documents. */ |
| SPCLPASSTHROUGH2(0x11D8); |
| |
| int flag; |
| EscapeFunction(int flag) { |
| this.flag = flag; |
| } |
| |
| static EscapeFunction valueOf(int flag) { |
| for (EscapeFunction hs : values()) { |
| if (hs.flag == flag) return hs; |
| } |
| return null; |
| } |
| } |
| |
| /** |
| * A 16-bit unsigned integer that defines the escape function. The |
| * value MUST be from the MetafileEscapes enumeration. |
| */ |
| private EscapeFunction escapeFunction; |
| /** |
| * A 16-bit unsigned integer that specifies the size, in bytes, of the |
| * EscapeData field. |
| */ |
| private int byteCount; |
| /** |
| * An array of bytes of size ByteCount. |
| */ |
| private byte escapeData[]; |
| |
| @Override |
| public HwmfRecordType getWmfRecordType() { |
| return HwmfRecordType.escape; |
| } |
| |
| @Override |
| public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException { |
| escapeFunction = EscapeFunction.valueOf(leis.readUShort()); |
| byteCount = leis.readUShort(); |
| escapeData = IOUtils.toByteArray(leis,byteCount); |
| |
| return 2*LittleEndianConsts.SHORT_SIZE+byteCount; |
| } |
| |
| @Override |
| public void draw(HwmfGraphics ctx) { |
| |
| } |
| |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append("escape - function: "+escapeFunction+"\n"); |
| sb.append(HexDump.dump(escapeData, 0, 0)); |
| return sb.toString(); |
| } |
| } |