/* Copyright (c) 1992 Colin Jensen.  All Rights Reserved. */

/****************************** Module Header ******************************\
*
* Module Name: PMORD.H
*
* OS/2 include file which defines all the structures and constants
* that can be used to build or interpret GOCA orders for the GPI
*
* Copyright (c) International Business Machines Corporation 1981, 1988-1992
*
* ===========================================================================
*
* The orders fall into 4 categories :-
*
* 1) 1-byte orders
*
* 2) 2-byte orders    - second byte contains the value
*
* 3) Long orders      - second byte gives the order length, subsequent bytes
*                       contain the values (up to 256 bytes long)
*
* 4) Very long orders - third and fourth bytes gives the order length,
*                       subsequent bytes contain the values (up to 64K long)
*
* ===========================================================================
*
* Comments at the end of each typedef line give the name tags used in
* the assembler include version of this file.
*
* The assembler include version of this file excludes lines between XLATOFF
* and XLATON comments.
*
\***************************************************************************/

/* XLATOFF */
#ifdef __IBMC__
   #pragma checkout( suspend )
   #ifndef __CHKHDR__
      #pragma checkout( suspend )
   #endif
   #pragma checkout( resume )
#endif
/* XLATON */

#define ORD_INCLUDED

/* XLATOFF */
#pragma pack(1)      /* pack on byte boundary */
/* XLATON */

/***************************************************************************\
*
* Miscellaneous structures used in this file
*
\***************************************************************************/

/* form of RECTL with shorts instead of longs */
typedef struct _RECT1S         /* rcs */
{
   SHORT xLeft;
   SHORT yBottom;
   SHORT xRight;
   SHORT yTop;
} RECT1S;

/* form of POINTL with 1 byte offsets instead of longs */
typedef struct _ODPOINT          /* odpt */
{
   CHAR   dx;
   CHAR   dy;
} ODPOINT;

/* form of SIZEL with shorts instead of longs */
typedef struct _SIZES            /* sizs */
{
   SHORT  cx;
   SHORT  cy;
} SIZES;


/* unsigned two-byte swapped integer */
typedef struct _SWPUSHORT        /* swpus */
{
   UCHAR  HiByte;
   UCHAR  LoByte;
} SWPUSHORT;

/***************************************************************************\
*
* 1-byte orders
*
\***************************************************************************/

/* macro to tell whether this is a 1-byte order */
#define BYTE_ORDER(oc)   ((oc)==OCODE_GNOP1 || (oc)==OCODE_GESD)

/* 1-byte order codes */
#define OCODE_GNOP1    0x00            /* No-operation                */
#define OCODE_GESD     0xFF            /* End symbol definition       */

/***************************************************************************\
*
* 2-byte orders
*
\***************************************************************************/

/* definitions to help determine whether an order code is a 2-byte order */
#define OCODE2_1       0x80
#define OCODE2_2       0x88

#define SHORT_ORDER(oc)  ((((oc)^OCODE2_1)&OCODE2_2)==OCODE2_2)

/* General 2-byte order structure */
typedef struct _ORDER            /* ord */
{
   UCHAR  idCode;
   UCHAR  uchData;
} ORDER;

/* 2-byte order codes */
#define OCODE_GBAR     0x68            /* Begin area                  */
#define OCODE_GCFIG    0x7D            /* Close figure                */
#define OCODE_GEEL     0x49            /* End element                 */
#define OCODE_GEPTH    0x7F            /* End path                    */
#define OCODE_GEPROL   0x3E            /* End prologue                */
#define OCODE_GPOP     0x3F            /* Pop                         */
#define OCODE_GSBMX    0x0D            /* Set background mix          */
#define OCODE_GPSBMX   0x4D            /* Push & set b/g mix          */
#define OCODE_GSCD     0x3A            /* Set char direction          */
#define OCODE_GPSCD    0x7A            /* Push & set char direction   */
#define OCODE_GSCR     0x39            /* Set char precision          */
#define OCODE_GPSCR    0x79            /* Push & set char precision   */
#define OCODE_GSCS     0x38            /* Set char set                */
#define OCODE_GPSCS    0x78            /* Push & set char set         */
#define OCODE_GSCOL    0x0A            /* Set color                   */
#define OCODE_GPSCOL   0x4A            /* Push & set color            */
#define OCODE_GSLE     0x1A            /* Set line end                */
#define OCODE_GPSLE    0x5A            /* Push & set line end         */
#define OCODE_GSLJ     0x1B            /* Set line join               */
#define OCODE_GPSLJ    0x5B            /* Push & set line join        */
#define OCODE_GSLT     0x18            /* Set line type               */
#define OCODE_GPSLT    0x58            /* Push & set line type        */
#define OCODE_GSLW     0x19            /* Set line width              */
#define OCODE_GPSLW    0x59            /* Push & set line width       */
#define OCODE_GSMP     0x3B            /* Set marker precision        */
#define OCODE_GPSMP    0x7B            /* Push & set marker precision */
#define OCODE_GSMS     0x3C            /* Set marker set              */
#define OCODE_GPSMS    0x7C            /* Push & set marker set       */
#define OCODE_GSMT     0x29            /* Set marker symbol           */
#define OCODE_GPSMT    0x69            /* Push & set marker symbol    */
#define OCODE_GSMX     0x0C            /* Set mix                     */
#define OCODE_GPSMX    0x4C            /* Push & set mix              */
#define OCODE_GSPS     0x08            /* Set pattern set             */
#define OCODE_GPSPS    0x48            /* Push & set pattern set      */
#define OCODE_GSPT     0x28            /* Set pattern symbol          */
#define OCODE_GPSPT    0x09            /* Push & set pattern symbol   */

/* constants for 2-byte orders */

/* Begin area */
#define GBAR_RESERVED   0x80
#define GBAR_BOUNDARY   0xC0
#define GBAR_NOBOUNDARY 0x80
#define GBAR_WINDING    0xA0
#define GBAR_ALTERNATE  0x80

/* Set Character Precision */
#define GSCR_PRECISION  0x0F

/***************************************************************************\
*
* Long orders
*
\***************************************************************************/

/* definitions to help determine whether an order code is a long order */

#define OCODE_VLONG    0xFE

#define LONG_ORDER(oc) (!((oc)==OCODE_VLONG||BYTE_ORDER(oc)||SHORT_ORDER(oc)))

/* long order structure */
#define LORDER_ML 253
typedef struct _LORDER           /* lord */
{
   UCHAR  idCode;
   UCHAR  uchLength;
   UCHAR  uchData[LORDER_ML];
} LORDER;

/* Long orders for which the length of data is normally zero */
#define OCODE_GEAR     0x60            /* End Area                    */
#define OCODE_GEIMG    0x93            /* End Image                   */

/* Long orders for which the data is contained in a type already defined */

/* Character String */
#define OCODE_GCCHST   0x83            /* char string at curr posn    */
#define GCCHST_MC      255             /* Max len of string in bytes  */

#define OCODE_GCHST    0xC3            /* char string at given pos    */
#define GCHST_SMC      251             /* Max len of string (S)       */
#define GCHST_LMC      247             /* Max len of string (L)       */

/* Character String Move */
#define OCODE_GCCHSTM  0xB1            /* char string move at c.p.    */
#define GCCHSTM_MC     255             /* Max len of string in byte   */

#define OCODE_GCHSTM   0xF1            /* char string move at g.p.    */
#define GCHSTM_SMC     251             /* Max len of string (S)       */
#define GCHSTM_LMC     247             /* Max len of string (L)       */

/* Comment */
#define OCODE_GCOMT    0x01            /* Comment                     */
#define GCOMT_ML       255             /* Maximum len of comment data */

/* Image */
#define OCODE_GIMD     0x92            /* Image data                  */
#define GIMD_ML        255             /* Maximum len of image data   */

/* Full Arc */
#define OCODE_GCFARC   0x87            /* full arc at current posn    */
#define OCODE_GFARC    0xC7            /* full arc at given posn      */

/* Label */
#define OCODE_GLABL    0xD3            /* Label                       */

/* Set Current Position */
#define OCODE_GSCP     0x21            /* Set current position        */
#define OCODE_GPSCP    0x61            /* Push and set curr posn      */

/* Bezier spline */
#define OCODE_GCBEZ    0xA5            /* Bezier spline at curr pos   */
#define GCBEZ_SMB      21              /* Max number of splines (S)   */
#define GCBEZ_LMB      10              /* Max number of splines (L)   */

#define OCODE_GBEZ     0xE5            /* Bezier spline at given pos  */
#define GBEZ_SMB       20              /* Max number of splines (S)   */
#define GBEZ_LMB       10              /* Max number of splines (L)   */

/* Fillet */
#define OCODE_GCFLT    0x85            /* fillet at current posn      */
#define GCFLT_SMP      63              /* Max number of points (S)    */
#define GCFLT_LMP      31              /* Max number of points (L)    */

#define OCODE_GFLT     0xC5            /* fillet at given position    */
#define GFLT_SMP       62              /* Max number of points (S)    */
#define GFLT_LMP       30              /* Max number of points (L)    */

/* Polyline */
#define OCODE_GCLINE   0x81            /* polyline at current posn    */
#define GCLINE_SMP     63              /* Max number of points (S)    */
#define GCLINE_LMP     31              /* Max number of points (L)    */

#define OCODE_GLINE    0xC1            /* polyline at given posn      */
#define GLINE_SMP      62              /* Max number of points (S)    */
#define GLINE_LMP      30              /* Max number of points (L)    */

/* Polymarker */
#define OCODE_GCMRK    0x82            /* marker at current posn      */
#define GCMRK_SMP      63              /* Max number of points (S)    */
#define GCMRK_LMP      31              /* Max number of points (L)    */

#define OCODE_GMRK     0xC2            /* marker at given posn        */
#define GMRK_SMP       62              /* Max number of points (S)    */
#define GMRK_LMP       30              /* Max number of points (L)    */

/* Relative Line */
#define OCODE_GCRLINE  0xA1            /* Relative line at curr pos   */
#define GCRLINE_MP     127             /* Max number of points        */

#define OCODE_GRLINE   0xE1            /* Relative line at givn pos   */
#define GRLINE_SMP     125             /* Max number of points (S)    */
#define GRLINE_LMP     123             /* Max number of points (L)    */

/* Set Background Color */
#define OCODE_GSBCOL   0x25            /* Set background color        */
#define OCODE_GPSBCOL  0x65            /* Push and set b/g color      */

/* Set Extended Color */
#define OCODE_GSECOL   0x26            /* Set extended color          */
#define OCODE_GPSECOL  0x66            /* Push and set ext color      */

/* Extended Color values */
#define SECOL_DEFAULT0  0x0000
#define SECOL_DEFAULT1  0xFF00
#define SECOL_NEUTRAL   0xFF07
#define SECOL_RESET     0xFF08

/* Set Character Angle */
#define OCODE_GSCA     0x34            /* Set character angle         */
#define OCODE_GPSCA    0x74            /* Push and set char angle     */

/* Set Character Shear */
#define OCODE_GSCH     0x35            /* Set character shear         */
#define OCODE_GPSCH    0x75            /* Push and set char shear     */

/* Set Fractional Line Width */
#define OCODE_GSFLW    0x11            /* Set fractional line width   */
#define OCODE_GPSFLW   0x51            /* Push and set frac l width   */

/* Set Pick Identifier */
#define OCODE_GSPIK    0x43            /* Set pick identifier         */
#define OCODE_GPSPIK   0x23            /* Push and set pick id        */


/* Long Orders for which a structure can be defined for the data */

/* Arc */
#define OCODE_GCARC    0x86            /* Arc at Current Position     */
#define OCODE_GARC     0xC6            /* Arc at Given Position       */

typedef struct _ORDERS_GCARC     /* osgcarc */
{
   POINTS ptInter;
   POINTS ptEnd;
} ORDERS_GCARC;

typedef struct _ORDERL_GCARC     /* olgcarc */
{
   POINTL ptInter;
   POINTL ptEnd;
} ORDERL_GCARC;

/* Begin Element */
#define OCODE_GBEL     0xD2            /* Begin Element               */

#define GBEL_DL        251
typedef struct _ORDER_GBEL       /* ogbel */
{
   LONG   lElementType;
   CHAR   achDesc[GBEL_DL];
} ORDER_GBEL;

/* Begin Image */
#define OCODE_GCBIMG   0x91            /* Begin Image at curr posn    */
#define OCODE_GBIMG    0xD1            /* Begin Image at given posn   */

typedef struct _ORDER_GCBIMG     /* ogbimg */
{
   UCHAR     uchFormat;
   UCHAR     uchReserved;
   SWPUSHORT cx;
   SWPUSHORT cy;
} ORDER_GCBIMG;

/* Begin Path */
#define OCODE_GBPTH    0xD0            /* Begin Path                  */

typedef struct _ORDER_GBPTH      /* ogbpth */
{
   USHORT usReserved;
   LONG   idPath;
} ORDER_GBPTH;

/* Box */
#define OCODE_GCBOX    0x80            /* Box at current position     */
#define OCODE_GBOX     0xC0            /* Box at given position       */

typedef struct _ORDERS_GCBOX     /* osgcbox */
{
   UCHAR  fbFlags;
   UCHAR  uchReserved;
   POINTS ptCorner;
   SHORT  hAxis;
   SHORT  vAxis;
} ORDERS_GCBOX;

typedef struct _ORDERL_GCBOX     /* olgcbox */
{
   UCHAR  fbFlags;
   UCHAR  uchReserved;
   POINTL ptCorner;
   LONG   hAxis;
   LONG   vAxis;
} ORDERL_GCBOX;

#define GCBOX_FILL     0x40
#define GCBOX_BOUNDARY 0x20

/* Call Segment */
#define OCODE_GCALLS   0x07            /* call segment                */

typedef struct _ORDER_GCALLS     /* ogcalls */
{
   USHORT sReserved;
   LONG   idSegment;
} ORDER_GCALLS;

/* Fill Path */
#define OCODE_GFPTH    0xD7            /* Fill path                   */
typedef struct _ORDER_GFPTH     /* ogfpth */
{
   UCHAR  fbFlags;
   UCHAR  uchReserved;
   LONG   idPath;
} ORDER_GFPTH;

#define GFPTH_ALTERNATE 0x00
#define GFPTH_WINDING   0x40
#define GFPTH_MODIFY    0x20

/* Outline Path */
#define OCODE_GOPTH    0xD4            /* Outline Path                */
typedef struct _ORDER_GOPTH     /* ogopth */
{
   UCHAR  fbFlags;
   UCHAR  uchReserved;
   LONG   idPath;
} ORDER_GOPTH;

/* Modify Path */
#define OCODE_GMPTH 0xD8               /* modify path                 */

typedef struct _ORDER_GMPTH      /* ogmpth */
{
   UCHAR  uchMode;
   UCHAR  uchReserved;
   LONG   idPath;
} ORDER_GMPTH;

#define GMPTH_STROKE    0x06

/* Partial Arc */
#define OCODE_GCPARC   0xA3            /* Partial arc at curr posn    */
#define OCODE_GPARC    0xE3            /* Partial arc at given posn   */

typedef struct _ORDERS_GCPARC    /* osgcparc */
{
   POINTS   ptCenter;
   FIXED88  ufx88Multiplier;
   LONG     usStartAngle;
   LONG     usSweepAngle;
} ORDERS_GCPARC;

typedef struct _ORDERL_GCPARC    /* olgcparc */
{
   POINTL   ptCenter;
   FIXED    ufxMultiplier;
   LONG     usStartAngle;
   LONG     usSweepAngle;
} ORDERL_GCPARC;

/* Set Clip Path */
#define OCODE_GSCPTH   0xB4            /* Set clip path               */

typedef struct _ORDER_GSCPTH     /* ogscpth */
{
   UCHAR  fbFlags;
   UCHAR  uchReserved;
   LONG   idPath;
} ORDER_GSCPTH;

#define GSCPTH_ALTERNATE 0x00
#define GSCPTH_WINDING   0x40
#define GSCPTH_RESET     0x00
#define GSCPTH_INTERSECT 0x20

/* Set Arc Parameters */
#define OCODE_GSAP     0x22            /* Set arc parameters          */
#define OCODE_GPSAP    0x62            /* Push and set arc params     */

typedef struct _ORDERS_GSAP      /* osgsap */
{
   SHORT  p;
   SHORT  q;
   SHORT  r;
   SHORT  s;
} ORDERS_GSAP;

typedef struct _ORDERL_GSAP      /* olgsap */
{
   LONG   p;
   LONG   q;
   LONG   r;
   LONG   s;
} ORDERL_GSAP;

/* Set Background Indexed Color */
#define OCODE_GSBICOL  0xA7            /* Set b/g indexed color       */
#define OCODE_GPSBICOL 0xE7            /* Push and set b/g ind color  */
#define OCODE_GSICOL   0xA6            /* Set indexed color           */
#define OCODE_GPSICOL  0xE6            /* Push and set indexd color   */

typedef struct _ORDER_GSBICOL    /* ogbicol */
{
   UCHAR  fbFlags;
   UCHAR  auchColor[3];
} ORDER_GSBICOL;

#define SICOL_SPECIFY  0x00
#define SICOL_SPECIAL  0x40
#define SICOL_DEFAULT  0x80
#define SICOL_BLACK    1
#define SICOL_WHITE    2
#define SICOL_ONES     4
#define SICOL_ZEROES   5

/* Set Character Cell */
#define OCODE_GSCC     0x33            /* Set character cell          */
#define OCODE_GPSCC    0x03            /* Push and set char cell      */

typedef struct _ORDERS_GSCC      /* osgscc */
{
   SHORT  cxInt;
   SHORT  cyInt;
   USHORT cxFract;
   USHORT cyFract;
   UCHAR  fbFlags;
   UCHAR  uchReserved;
} ORDERS_GSCC;

typedef struct _ORDERL_GSCC      /* olgscc */
{
   LONG   cxInt;
   LONG   cyInt;
   USHORT cxFract;
   USHORT cyFract;
   UCHAR  fbFlags;
   UCHAR  uchReserved;
} ORDERL_GSCC;

#define GSCC_ZERODEF   0x00
#define GSCC_ZEROZERO  0x80

/* Set Marker Cell */
#define OCODE_GSMC     0x37            /* Set marker cell             */
#define OCODE_GPSMC    0x77            /* Push and set marker cell    */

typedef struct _ORDERS_GSMC      /* osgsmc */
{
   SHORT  cx;
   SHORT  cy;
   UCHAR  fbFlags;
   UCHAR  uchReserved;
} ORDERS_GSMC;

typedef struct _ORDERL_GSMC      /* olgsmc */
{
   LONG   cx;
   LONG   cy;
   UCHAR  fbFlags;
   UCHAR  uchReserved;
} ORDERL_GSMC;

#define GSMC_ZERODEF   0x00
#define GSMC_ZEROZERO  0x80

/* Set Pattern Reference Point */
#define OCODE_GSPRP    0xA0            /* Set pattern ref point       */
#define OCODE_GPSPRP   0xE0            /* Push and set patt ref pt    */

typedef struct _ORDERS_GSPRP     /* osgsprp */
{
   UCHAR fbFlags;
   UCHAR uchReserved;
   POINTS ptPos;
} ORDERS_GSPRP;

typedef struct _ORDERL_GSPRP     /* olgsprp */
{
   UCHAR fbFlags;
   UCHAR uchReserved;
   POINTL ptPos;
} ORDERL_GSPRP;

#define GSPRP_DEFAULT  0x80
#define GSPRP_SPECIFY  0x00


/* Set Individual Attribute */
#define OCODE_GSIA     0x14            /* Set individual attribute    */
#define OCODE_GPSIA    0x54            /* Push and set ind attr       */

#define GSIA_VL 3
typedef struct _ORDER_GSIA       /* ogsia */
{
   UCHAR  uchAttrType;
   UCHAR  uchPrimType;
   UCHAR  fbFlags;
   UCHAR  auchValue[GSIA_VL];
} ORDER_GSIA;

#define GSIA_COLOR     0x01
#define GSIA_BCOLOR    0x02
#define GSIA_MIX       0x03
#define GSIA_BMIX      0x04
#define GSIA_LINE      0x01
#define GSIA_CHAR      0x02
#define GSIA_MARKER    0x03
#define GSIA_PATTERN   0x04
#define GSIA_IMAGE     0x05
#define GSIA_SPECIFY   0x00
#define GSIA_SPECIAL   0x40
#define GSIA_DEFAULT   0x80
#define GSIA_BLACK     1
#define GSIA_WHITE     2
#define GSIA_ONES      4
#define GSIA_ZEROES    5


/* Set Model /Viewing Transform */
#define OCODE_GSTM     0x24            /* Set model transform         */
#define OCODE_GPSTM    0x64            /* Push and set model tfm      */

#define OCODE_GSTV     0x31            /* Set Viewing Transform       */

#define GSTM_ML        16
typedef struct _ORDERS_GSTM       /* osgstm */
{
   UCHAR  uchReserved;
   UCHAR  fbFlags;
   USHORT fsMask;
   SHORT  asMatrix[GSTM_ML];
} ORDERS_GSTM;

typedef struct _ORDERL_GSTM       /* olgstm */
{
   UCHAR  uchReserved;
   UCHAR  fbFlags;
   USHORT fsMask;
   LONG   alMatrix[GSTM_ML];
} ORDERL_GSTM;

#define GSTM_M11     0x8000
#define GSTM_M12     0x4000
#define GSTM_M13     0x2000
#define GSTM_M14     0x1000
#define GSTM_M21     0x0800
#define GSTM_M22     0x0400
#define GSTM_M23     0x0200
#define GSTM_M24     0x0100
#define GSTM_M31     0x0080
#define GSTM_M32     0x0040
#define GSTM_M33     0x0020
#define GSTM_M34     0x0010
#define GSTM_M41     0x0008
#define GSTM_M42     0x0004
#define GSTM_M43     0x0002
#define GSTM_M44     0x0001

#define GSTM_UNITY     0x00
#define GSTM_AFTER     0x01
#define GSTM_BEFORE    0x02
#define GSTM_OVERWRITE 0x03

#define GSTV_OVERWRITE 0x00
#define GSTV_AFTER     0x04

/* Set Segment Boundary, Viewing Window */

#define OCODE_GSSB     0x32            /* Set segment boundary        */
#define OCODE_GSVW     0x27            /* Set viewing window          */
#define OCODE_GPSVW    0x67            /* Push and set view window    */

#define GSSB_ML        4
typedef struct _ORDERS_GSSB      /* osgssb */
{
   UCHAR  fbFlags;
   UCHAR  fbMask;
   SHORT  alMatrix[GSSB_ML];
} ORDERS_GSSB;

typedef struct _ORDERL_GSSB      /* olgssb */
{
   UCHAR  fbFLags;
   UCHAR  fbMask;
   LONG   alMatrix[GSSB_ML];
} ORDERL_GSSB;

#define GSSB_XLEFT     0x20
#define GSSB_XRIGHT    0x10
#define GSSB_YBOTTOM   0x08
#define GSSB_YTOP      0x04

#define GSVW_INTERSECT 0x00
#define GSVW_REPLACE   0x80

/* Set Segment Characteristics */
#define OCODE_GSGCH    0x04            /* Set segment characteristics */

#define GSGCH_ML       254
typedef struct _ORDER_GSGCH      /* ogsgch */
{
   UCHAR  uchIdent;
   UCHAR  auchData[GSGCH_ML];
} ORDER_GSGCH;

/* Set Stroke Line Width */
#define OCODE_GSSLW    0x15            /* Set stroke line width       */
#define OCODE_GPSSLW   0x55            /* Push and set strk l width   */

typedef struct _ORDERS_GSSLW     /* osgsslw */
{
   UCHAR  fbFlags;
   UCHAR  uchReserved;
   SHORT  LineWidth;
} ORDERS_GSSLW;

typedef struct _ORDERL_GSSLW     /* olgsslw */
{
   UCHAR  fbFlags;
   UCHAR  uchReserved;
   LONG   LineWidth;
} ORDERL_GSSLW;

#define GSSLW_DEFAULT  0x80
#define GSSLW_SPECIFY  0x00

/* Sharp Fillet at Current Position */
#define OCODE_GCSFLT   0xA4            /* Sharp fillet at curr pos    */
#define OCODE_GSFLT    0xE4            /* Sharp fillet at given pos   */

#define GCSFLT_SMF     21
#define GSFLT_SMF      20

typedef struct _ORDERS_GCSFLT    /* osgcsflt */
{
   POINTS apt[2*GCSFLT_SMF];
   FIXED  afxSharpness[GCSFLT_SMF];
} ORDERS_GCSFLT;

#define GCSFLT_LMF     12
#define GSFLT_LMF      12

typedef struct _ORDERL_GCSFLT    /* olgcsflt */
{
   POINTL apt[2*GCSFLT_SMF];
   FIXED  afxSharpness[GCSFLT_SMF];
} ORDERL_GCSFLT;

/* Bitblt */
#define OCODE_GBBLT    0xD6            /* Bitblt                      */

typedef struct _ORDERS_GBBLT      /* osgbblt */
{
   USHORT  fsFlags;
   USHORT  usMix;
   HBITMAP hbmSrc;
   LONG    lOptions;
   RECT1S  rcsTargetRect;
   RECTL   rclSourceRect;
} ORDERS_GBBLT;

typedef struct _ORDERL_GBBLT      /* olgbblt */
{
   USHORT  fsFlags;
   USHORT  usMix;
   HBITMAP hbmSrc;
   LONG    lOptions;
   RECTL   rclTargetRect;
   RECTL   rclSourceRect;
} ORDERL_GBBLT;

/* Char & break extra */
#define OCODE_GSCE     0x17            /* Set char extra                */
#define OCODE_GPSCE    0x57            /* Push and set char extra       */
#define OCODE_GSCBE    0x05            /* Set char break extra          */
#define OCODE_GPSCBE   0x45            /* Push and set char break extra */

typedef struct _ORDER_GSCBE       /* osgsce */
{
   UCHAR   fbFlags;
   UCHAR   uchReserved;
   FIXED   ufxextra;
} ORDER_GSCE, ORDER_GPSCE, ORDER_GSCBE, ORDER_GPSCBE;

/* Escape */
#define OCODE_GESCP    0xD5            /* Escape                      */

/*
* type describes type of escape order, identifier gives the escape
* order if the type is registered
*/
#define GESCP_ML       253
typedef struct _ORDER_GESCP      /* ogescp */
{
   UCHAR  uchType;
   UCHAR  uchIdent;
   UCHAR  auchData[GESCP_ML];           /* Escape data                 */
} ORDER_GESCP;

#define GESCP_REG      0x80            /* identifier is registered    */

/* Escape (Bitblt) */
#define GEBB_REGID     0x02            /* uchIdent - Bitblt           */

#define ETYPE_GEBB          0x800200D5L

#define GEBB_LMP       29
typedef struct _ORDERL_GEBB      /* olgebb */
{
   UCHAR   fbFlags;
   USHORT  usMix;
   UCHAR   cPoints;
   HBITMAP hbmSrc;
   LONG    lReserved;
   LONG    lOptions;
   POINTL  aptPoints[GEBB_LMP];
} ORDERL_GEBB;

/* Escape (Set Pel) */
#define GEPEL_REGID    0x01            /* uchIdent - Set Pel          */

#define ETYPE_GEPEL         0x800100D5L

/* Escape (DrawBits) */
#define GEDB_REGID     0x04          /* uchIdent - DrawBits */

#define ETYPE_GEDB          0x800400D5L

typedef struct _ORDERL_GEDB      /* olgedb */
{
   USHORT      fsFlags;
   USHORT      usMix;
   PVOID       pBits;
   PBITMAPINFO2 pbmi;
   LONG        lOptions;
   RECTL       rclTargetRect;
   RECTL       rclSourceRect;
} ORDERL_GEDB;


/* Escape (FloodFill) */
#define GEFF_REGID     0x03          /* uchIdent - FloodFill */

#define ETYPE_GEFF          0x800300D5L

typedef struct _ORDERL_GEFF      /* olgeff */
{
   UCHAR       fsFlags;
   UCHAR       auchColor[3];
} ORDERL_GEFF;


/* Element Types for attribute bundles */
#define ETYPE_LINEBUNDLE    0x0000FD01L
#define ETYPE_CHARBUNDLE    0x0000FD02L
#define ETYPE_MARKERBUNDLE  0x0000FD03L
#define ETYPE_AREABUNDLE    0x0000FD04L
#define ETYPE_IMAGEBUNDLE   0x0000FD05L


/***************************************************************************\
*
* Very long orders
*
\***************************************************************************/

/* macro to tell whether this is a very long order */
#define VLONG_ORDER(oc)  ((oc)==OCODE_VLONG)

/* Very long order structure */
#define VORDER_ML 65531
typedef struct _VORDER           /* vord */
{
   UCHAR     idCode;
   UCHAR     uchQualifier;
   SWPUSHORT uchLength;
   UCHAR     uchData[VORDER_ML];
} VORDER;

/* Character String Extended */
#define OCODEQ_GCCHSTE  0xB0           /* Qualifier - current posn    */
#define OCODEQ_GCHSTE   0xF0           /* Qualifier - given position  */

#define ETYPE_GCCHSTE       0x0000FEB0L
#define ETYPE_GCHSTE        0x0000FEF0L

typedef struct _ORDERS_GCCHSTE    /* osgcchste */
{
   UCHAR     fbFlags;
   UCHAR     uchReserved;
   POINTS    ptRect[2];
   SWPUSHORT cchString;
   CHAR      achString[1];
   SHORT     adx[1];
} ORDERS_GCCHSTE;

typedef struct _ORDERL_GCCHSTE    /* olgcchste */
{
   UCHAR     fbFlags;
   UCHAR     uchReserved;
   POINTL    ptRect[2];
   SWPUSHORT cchString;
   CHAR      achString[1];
   LONG      adx[1];
} ORDERL_GCCHSTE;

#define GCCHSTE_DRAWRECT      0x80
#define GCCHSTE_NORECT        0x00
#define GCCHSTE_CLIP          0x40
#define GCCHSTE_NOCLIP        0x00
#define GCCHSTE_DEEMPHASIZE   0x20            /* Reserved */
#define GCCHSTE_NODEEMPHASIZE 0x00
#define GCCHSTE_LEAVEPOS      0x10
#define GCCHSTE_MOVEPOS       0x00
#define GCCHSTE_UNDERSCORE    0x08
#define GCCHSTE_NOUNDERSCORE  0x00
#define GCCHSTE_STRIKEOUT     0x04
#define GCCHSTE_NOSTRIKEOUT   0x00

/* Extended Escape */
#define OCODEQ_GEESCP   0xD5           /* Qualifier - extended escape */

#define GEESCP_ML      65533
typedef struct _ORDER_GEESCP     /* ogeescp */
{
   UCHAR  uchType;
   UCHAR  uchIdent;
   UCHAR  auchData[GEESCP_ML];
} ORDER_GEESCP;

/* XLATOFF */
#pragma pack()    /* reset to default packing */
/* XLATON */

/* XLATOFF */
#ifdef __IBMC__
   #pragma checkout( suspend )
   #ifndef __CHKHDR__
      #pragma checkout( resume )
   #endif
   #pragma checkout( resume )
#endif
/* XLATON */

/**************************** end of file **********************************/
