|
|
/*-------------------------------------------------------------------------
| Objects.h | | Copyright (C) 1989 Microsoft Corporation | | | | mattb 4/19/89 | |-------------------------------------------------------------------------| | This file contains definitions associated with the layout objects used | | in help. | -------------------------------------------------------------------------*/
#ifndef __OBJECTS_H__
#define __OBJECTS_H__
#include <address.h> // for VA
#include <hash.h> // for HASH
/*-------------------------------------------------------------------------
| Objects fall in two ranges: Uncounted objects and counted objects. | | For uncounted objects, the count of object regions is contained in a | | fixed array, or calculated on the fly. (see datapres.c) | -------------------------------------------------------------------------*/ #define bTypeParaGroup 1 /* Object type indicating paragraph group */
#define bTypeTopic 2 /* Object type indicating topic break */
#define bTypeBitmap 3 /* Bitmap */
#define bTypeSbys 4 /* Side-by-side paragraphs */
#define bTypeWindow 5 /* Windows */
#define bTypeMarker 6 /* Generic inter-layout marker */
#define MAX_UNCOUNTED_OBJ_TYPE 16 /* Unused numbers are reserved for future
use. While uncounted objects can actually go up to 31, going past 15 will break the file format. */
#define bTypeParaGroupCounted 32 /* Object type indicating paragraph group */
#define bTypeTopicCounted 33 /* Object type indicating topic break */
#define bTypeBitmapCounted 34 /* Bitmap */
#define bTypeSbysCounted 35 /* Side-by-side paragraphs */
#define bTypeWindowCounted 36 /* Windows */
#define bTypeMultiParaGroup 37 /* Array of paragraph groups */
#define MAX_OBJ_TYPE 37
#define bMagicMBHD 0x11
#define bMagicMFCP 0x22
#define bMagicMOBJ 0x33
#define bMagicMTOP 0x44
#define bMagicMOPG 0x55
#define bMagicMBMR 0x66
#define bMagicMBHS 0x77
#define bMagicMSBS 0x88
#define bMagicMCOL 0x99
#define cxTabsMax 32 /* Maximum number of tabs in MOPG */
#define cbBLOCK_SIZE 4096 /* Size of blocks in the topic. */
#define cbMAX_BLOCK_SIZE (1<<14) // max size of 2k block after decompress
#define shrFclToBlknum 11 // offset to blknum transform, used in hc
#define bHotspotInvisible 0
#define bHotspotVisible 1
/* Paragraph justification properties */ #define wJustifyMost 2
#define wJustifyLeft 0
#define wJustifyRight 1
#define wJustifyCenter 2
/* Paragraph box line types */ #define wBoxLineMost 5
#define wBoxLineNormal 0
#define wBoxLineThick 1
#define wBoxLineDouble 2
#define wBoxLineShadow 3
#define wBoxLineDotted 4
#define wBoxLineDash 5
/* Border line orientations */ /* The order must match order in MBOX */ #define wBoxBorderNone ((WORD)(-1))
#define wBoxBorderFull 0
#define wBoxBorderTop 0
#define wBoxBorderLeft 1
#define wBoxBorderBottom 2
#define wBoxBorderRight 3
#define wBoxPatternNone 0
#define wBoxPatternDkHoriz 1
#define wBoxPatternDkVert 2
#define wBoxPatternDkFdiag 3
#define wBoxPatternDkBdiag 4
#define wBoxPatternDkCross 5
#define wBoxPatternDkDcross 6
#define wBoxPatternHoriz 7
#define wBoxPatternVert 8
#define wBoxPatternFdiag 9
#define wBoxPatternBdiag 10
#define wBoxPatternCross 11
#define wBoxPatternDcross 12
/* Tab types */ #define wTabTypeMost 3
#define wTabTypeLeft 0
#define wTabTypeRight 1
#define wTabTypeCenter 2
#define wTabTypeDecimal 3
/* Used for various things */ #define ldibNil ((LONG)-1) // Protect comparisons in WIN32
/* End of a side by side paragraph list */ #define cColumnMax 32
#define iColumnNil ((WORD)-1) // (WORD) fixes 32bit BUG !! ARGHH!
// Critical structures that gets messed up in /Zp8
#pragma pack(1)
/* MBHD- Memory resident block header structure */ typedef struct mbhd { VA vaFCPPrev; VA vaFCPNext; VA vaFCPTopic; } MBHD, FAR *QMBHD;
/* MFCP- Memory resident FCP header structure */ typedef struct mfcp { long lcbSizeCompressed; /* Size of whole FC when compressed */ long lcbSizeText; /* Size of uncompressed text (not FC) */ VA vaPrevFc; /* File address to previous FC */ VA vaNextFc; /* File address to next FC */ ULONG ichText; /* Memory image offset to text */ } MFCP, FAR *QMFCP;
/* MOBJ- Memory resident generic object header */ typedef struct mobj { BYTE bType; LONG lcbSize; WORD wObjInfo; } MOBJ, FAR *QMOBJ, FAR *LPMOBJ;
/*** Group macro structures start ***/
/* MTOP contains an offset into the Group subfile.
* This offset serves as a group identifier and also * indicates where the group macro strings are in the * file. */
#define NULLGROUP (0L) // NULL group number for MTOP
#define NOGROUPEXIT ((ULONG)(-1)) // No group exit macros
#define GRPFILENAME "|GMACROS" // Group macros subfile
/*** Structure for group file entry (when not NULLGROUP)
* * cbGrpMac - byte count of macro data including header * cbToExit - byte count to exit macros (including header) * NOGROUPEXIT indicates none * * * This structure is followed by SZ for entry macros and then * an SZ for exit macros if they exist. * * cbGrpMac == sizeof(GMH) means no macros * cbToExit == sizeof(GMH) means no entry macros * cbToExit == NOGROUPEXIT means no exit macros * * MTOP contains an offset into GRPFILENAME and a count of bytes * for the size of the macro data. Having the size in MTOP allows * quicker retreival. A size == sizeof(GMH) means the group * has no macros. * * This technique for determining where the group entry and exit * macros start is awkward, but there wasn't time to have the * compiler use a more flexible approach. Note that there * is no way to add new fields to the end of the group data. * ***/ typedef struct gmh_tag { ULONG cbGrpMac; // cb group data
ULONG cbToExit; // cb to exit macros or NOGROUPEXIT
} GMH;
typedef GMH FAR *QGMH;
/*** Group macro structures end ***/
#if 1
/* MTOP- Memory resident topic object structure */ typedef struct mtopent { ADDR addrPrev; /* Physical address */ ADDR addrNext; /* Physical address */
LONG lTopicNo;
VA vaNSR; // non scrollable region, if any, vaNil if none.
VA vaSR; // scrollable region, if any, vaNil if none.
VA vaNextSeqTopic; // next sequential topic, for scrollbar calc.
// For Help 3.0 files this will not be correct in
// the case that there is padding between the MTOP
// and the end of a block.
ULONG ulGrpNum; // Group number
ULONG ulGrpFileOff; // Offset into group file for macros
ULONG cbGrpMacro; // Size of group macros
} MTOP, FAR *QMTOP;
#endif
// The new mv2.0 FC header
typedef struct tagFC { DWORD dwFcIndex; DWORD lichCumulativeText; // total of all previous lichText TO DO: REMOVE THIS EVENTUALLY
MVADDR mva; WORD wUserFlags; // kevynct added
WORD iSubtopic; LPCSTR lpszSubtopicUnique; LPCSTR lpszSubtopicTitle; DWORD lcbSize; // sizeof data + text
DWORD lichText; // offset to text
DWORD lcbText; // sizeof text
LPBYTE lpbData; // start of the whoel thing
DWORD dwReserved1; // Don't touch!
DWORD dwReserved2; // Don't touch!
} FC, FAR *LPFC;
// The new mv2.0 topic header
#pragma warning(disable : 4200) // for zero-sized array
typedef struct tagTOPIC { HANDLE hTopic; VOID FAR * lpvMemory; // Using block mgr for strings/FC data
DWORD dwReserved; DWORD dwReserved2; DWORD dwUser; // Anything you want!
DWORD dwUserRef; // Anything you want!
DWORD dwAllocatedSize; DWORD dwBrowseDefault; // zero if none
HASH uhUnique; WORD wSubtopicCount; LPCSTR lpszTitle; LPCSTR lpszUserData; DWORD dwFcCount; FC fc[0]; } TOPIC, FAR *LPTOPIC;
#pragma warning(default : 4200)
/* MPFG- Disk resident paragraph flag information */ // kevynct: slightly modified to support paragraph styles
typedef struct mpfg { // (kevynct) I have unionized the MPFG as it should have been in the first place.
// but this will break the file format, so I'm ifdefing for now.
// the difference is that in the old format, there was a separate SHORT for a style number
// and another SHORT for the flags. if MV20_STYLEONLY is defined, these structures will be
// merged and an fStyle added to the flags for the case where both a para style and para attributes
// are specified.
#ifdef MV20_STYLEONLY
union { #endif //MV20_STYLEONLY
struct { unsigned short fStyleOnly:1; // if set, mopg consists of a style number only and no more flags...
unsigned short wStyle:15; // in the past, this was never set, and for rgf never will be
} st; struct { #ifdef MV20_STYLEONLY
unsigned short fStyleOnly:1; #endif //MV20_STYLEONLY
unsigned short fMoreFlags:1; unsigned short fSpaceOver:1; unsigned short fSpaceUnder:1; unsigned short fLineSpacing:1; unsigned short fLeftIndent:1; unsigned short fRightIndent:1; unsigned short fFirstIndent:1; unsigned short fTabSpacing:1; unsigned short fBoxed:1; unsigned short fTabs:1; unsigned short wJustify:2; unsigned short fSingleLine:1; #ifdef MV20_STYLEONLY
unsigned short fStyle:1; unsigned short wUnused:1; #else
unsigned short wUnused:2; #endif //MV20_STYLEONLY
} rgf; #ifdef MV20_STYLEONLY
} #endif //MV20_STYLEONLY
} MPFG, FAR *QMPFG, FAR *LPMPFG;
typedef struct tagMBRD { unsigned short wLineType; unsigned short wWidth; // in twips.
unsigned short wDistance; // distance from text, in twips
unsigned long dwColor; // COLORREF
} MBRD, FAR *LPMBRD;
#define IS_VISIBLE_MBOX(x) ((x).fBorderAtAll || (x).fHasShading || (x).fHasPattern)
/* MBOX- Memory/disk resident paragraph frame record */ typedef struct mbox { // these initial flags describe the lines that are present in the box.
// MBOX structures occur in the same order as the flags if they are present
union { unsigned short wFlags; struct { unsigned short fBorderAtAll:1; unsigned short fFullBox:1; // if true, there is only one MBRD which is used for all lines
unsigned short fTopLine:1; // else these four bits describe the MBRDs present
unsigned short fLeftLine:1; unsigned short fBottomLine:1; unsigned short fRightLine:1; unsigned short fHasShading:1; // true if percent shading is used
unsigned short fHasPattern:1; // true if pattern is used. mutex with shading if set
unsigned short bUnused:8; }; }; union { unsigned short wPercentShading; // percent shading value.
unsigned short wBoxPattern; }; unsigned long dwClrPatFore; // line color for bkground patter.
unsigned long dwClrPatBack; // background color for bkground patter.
MBRD rgmbrd[4]; // up to four different lines can be part of a box
} MBOX, FAR *QMBOX, FAR *LPMBOX;
/* TAB: Tab data structure */ typedef struct tab { SHORT x; SHORT wType; } TAB, FAR *QTAB;
#define wParaStyleNil ((SHORT) 0x7FFF)
#define wParaStyleDefault ((SHORT) 0)
/* MOPG- Memory resident paragraph group object structure */ typedef struct mopg { long libText; SHORT wStyle; // kevynct: the (optional) paragraph style to apply
SHORT iFnt; SHORT fMoreFlags; SHORT fBoxed; SHORT wJustify; SHORT fSingleLine; SHORT wUnused; long lMoreFlags; SHORT ySpaceOver; SHORT ySpaceUnder; SHORT yLineSpacing; SHORT xLeftIndent; SHORT xRightIndent; SHORT xFirstIndent; SHORT xTabSpacing; MBOX mbox; SHORT cTabs; TAB rgtab[cxTabsMax]; } MOPG, FAR *QMOPG, FAR *LPMOPG;
// Values that can be used in the lMoreFlags field.
#define PF_SIZESINTWIPS 0x00000001
/* MBMR- Memory/disk resident bitmap record (layout component) */ typedef struct mbmr { BYTE bVersion; SHORT dxSize; SHORT dySize; SHORT wColor; SHORT cHotspots; LONG lcbData; } MBMR, FAR *QMBMR;
/* MBHS- Memory / disk resident bitmap hotspot record */ typedef struct mbhs { BYTE bType; BYTE bAttributes; BYTE bFutureRegionType; SHORT xPos; SHORT yPos; SHORT dxSize; SHORT dySize; long lBinding; } MBHS, FAR *QMBHS;
/* MSBS- Memory/disk resident side by side paragraph group object structure */ typedef struct msbs { BYTE bcCol; BYTE bFlags; // new members go here
SHORT dxRowIndent; SHORT dxRowWidth; // used for relative spacing: stores total width of table, zero otherwise
SHORT dyRowHeight; // height of the table row in twips: zero if "automatic", < 0 if "absolute", > 0 if "at least"
} MSBS, FAR *QMSBS, FAR *LPMSBS;
// Values for use with the bFlags field of the MSBS structure.
#define MSBS_ABSOLUTE 0x0001 // Must be 1 to correspond to old version
#define MSBS_SIZESINTWIPS 0x0002
/* MCOL- Memory/disk resident column structure */ typedef struct mcol { unsigned short xWidthColumn; // cell width
unsigned short xWidthSpace; // space between cells
// new members for mv2.0
MBOX mbox; // the cell's border formatting
} MCOL, FAR *QMCOL, FAR *LPMCOL;
/* MWIN- Memory/disk resident embedded window object structure */ typedef struct mwin { WORD wStyle; SHORT dx; SHORT dy; char szData[1]; } MWIN, FAR *QMWIN;
// Critical structure that gets messed up in /Zp8
#pragma pack()
//wjc Size of command and data for searcher commands (see below)
#define cbSearchFieldCommand 5
#define cbDTypeCommand 3
#define cbAliasCommand 7
#define chCommand 0x00 /* Indicates a parallel command in text */
// The following definitions describe the commands used in the layout command table.
//
// (kevynct) The following three commands were added during Viewer and are never used
// at run-time. They really shouldn't have been put in here.
// (kevynct) Removed for mv2.0, but not removed from cmd table space. sigh.
#define bSearchFieldCommand 0x20 /* Followed by 4 byte ident */
#define bDTypeCommand 0x21 /* Followed by 2 byte unsigned */
#define bAliasCommand 0x22 /* Followed by 6 bytes (alias idx & highlight length) */
#define IsFormatCommand(b) ((b) >= bSmallFormat0 && (b) <= bWordFormat)
// Format change commands: the order of these should not be changed
#define GetSmallFormat(b) ((b) & 0x0f)
#define IsSmallFormat(b) ((b) & 0x0f) == bSmallFormat0)
#define IsMediumFormat(b) ((b) == bByteFormat)
#define bSmallFormat0 0x60 // Format change: 0 (least-sig nibble must be zero)
#define bSmallFormat1 0x61 // Format change: 1
#define bSmallFormat2 0x62 // Format change: 2
#define bSmallFormat3 0x63 // Format change: 3
#define bSmallFormat4 0x64 // Format change: 4
#define bSmallFormat5 0x65 // Format change: 5
#define bSmallFormat6 0x66 // Format change: 6
#define bSmallFormat7 0x67 // Format change: 7
#define bSmallFormat8 0x68 // Format change: 8
#define bSmallFormat9 0x69 // Format change: 9
#define bSmallFormat10 0x6a // Format change: 10
#define bSmallFormat11 0x6b // Format change: 11
#define bSmallFormat12 0x6c // Format change: 12
#define bSmallFormat13 0x6d // Format change: 13
#define bSmallFormat14 0x6e // Format change: 14
#define bSmallFormat15 0x6f // Format change: 15
#define bByteFormat 0x70 // Format change: (one-byte arg) 16-255. Must follow bSmallFormat15
// New commands are allowed in this space
#define bWordFormat 0x80 /* Format change, two byte arg (0-32767) */
#define bNewLine 0x81 /* Newline */
#define bNewPara 0x82 /* New paragraph */
#define bTab 0x83 /* Left-aligned tab */
#define bBlankLine 0x85 /* Followed by 16 bit skip count */
#define bInlineObject 0x86 /* Followed by inline layout object */
#define bWrapObjLeft 0x87 /* Left- aligned wrapping object */
#define bWrapObjRight 0x88 /* Right-aligned wrapping object */
#define bEndHotspot 0x89 /* End of a hotspot */
#define bColdspot 0x8A /* Coldspot for searchable bitmaps */
#define bNoBreakSpace 0x8B /* a non-breaking space */
#define bOptionalHyphen 0x8C /* a potentially existing hypen */
#define bBeginFold 0x8D // start of collapsable region
#define bEndFold 0x8E // end of collapsable region
/*
Coldspot Commands
A "coldspot" is understood by the runtime but not added to the hotspot list, since it is not a hotspot. This is used to create searchable regions in metafiles and bitmaps. Coldspots are always invisible, and currently not inserted into the command table. */
/*
Hotspot Commands
Hotspot commands have first nibble of E or C.
E - normal hotspot C - macro
Bits in the second nibble have the following meaning:
(set) (clear) 8 - long short 4 - invisible visible 2 - ITO HASH 1 - jump popup
Long hotspots are followed by a word count prefixed block of binding data. The count does not include the command byte or the count word.
Short hotspots are followed by four bytes of binding data.
** Note that some of the combinations of bits are meaningless. */
#define fHSMask 0xD0
#define fHS 0xC0
#define fHSNorm 0x20
#define fHSLong 0x08
#define fHSInv 0x04
#define fHSHash 0x02
#define fHSJump 0x01
#define FHotspot( b ) (((b) & fHSMask ) == fHS )
#define FNormalHotspot( b ) (((b) & (fHSMask|fHSNorm)) == (fHS|fHSNorm))
#define FLongHotspot( b ) (((b) & (fHSMask|fHSLong)) == (fHS|fHSLong))
#define FInvisibleHotspot( b ) (((b) & (fHSMask|fHSInv )) == (fHS|fHSInv ))
#define FHashHotspot( b ) (((b) & (fHSMask|fHSNorm|fHSHash)) == (fHS|fHSNorm|fHSHash))
#define FJumpHotspot( b ) (((b) & (fHSMask|fHSNorm|fHSJump)) == (fHS|fHSNorm|fHSJump))
#define FMacroHotspot( b ) (((b) & (fHSMask|fHSNorm)) == fHS)
#define FShortHotspot( b ) (((b) & (fHSMask|fHSLong)) == fHS)
#define FVisibleHotspot( b ) (((b) & (fHSMask|fHSInv )) == fHS)
#define FItoHotspot( b ) (((b) & (fHSMask|fHSNorm|fHSHash)) == (fHS|fHSNorm))
#define FPopupHotspot( b ) (((b) & (fHSMask|fHSNorm|fHSJump)) == (fHS|fHSNorm))
#define bLongMacro (fHS |fHSLong )
//
//
//
#define bLongMacroInv (fHS |fHSLong|fHSInv )
//
//
//
#define bShortUidPopup (fHS|fHSNorm )
#define bShortUidJump (fHS|fHSNorm |fHSJump)
#define bShortHashPopup (fHS|fHSNorm |fHSHash )
#define bShortHashJump (fHS|fHSNorm |fHSHash|fHSJump)
// (fHS|fHSNorm |fHSInv )
// (fHS|fHSNorm |fHSInv |fHSJump)
#define bShortInvHashJump (fHS|fHSNorm |fHSInv|fHSHash|fHSJump)
#define bShortInvHashPopup (fHS|fHSNorm |fHSInv|fHSHash )
// (fHS|fHSNorm|fHSLong )
// (fHS|fHSNorm|fHSLong |fHSJump)
#define bLongHashPopup (fHS|fHSNorm|fHSLong |fHSHash )
#define bLongHashJump (fHS|fHSNorm|fHSLong |fHSHash|fHSJump)
// (fHS|fHSNorm|fHSLong|fHSInv )
// (fHS|fHSNorm|fHSLong|fHSInv |fHSJump)
#define bLongInvHashPopup (fHS|fHSNorm|fHSLong|fHSInv|fHSHash )
#define bLongInvHashJump (fHS|fHSNorm|fHSLong|fHSInv|fHSHash|fHSJump)
#define bEnd 0xFF /* End of text */
// Upon encountering an embedded window with a class name of
// EW_CALLBACK_CLASS, a special EW will be created and the data for
// the embedded window will be saved. Upon an attempt to render this
// embedded window, instead of actually creating a window, MediaView
// will execute the qde->lpfnHotspotCallback() routine with a hotspot
// of type HOTSPOT_EWSHOWN and with a pointer to the saved string
// containing the data for the embedded window.
#define EW_CALLBACK_CLASS "MVEWCallBack"
#ifndef CONTENTTYPE_DEFINED
#define CONTENTTYPE_DEFINED
enum CONTENTTYPE { CONTENT_TEXT, CONTENT_BITMAP, CONTENT_WINDOW, CONTENT_UNKNOWN }; #endif // CONTENTTYPE_DEFINED
// These first four hotspot types are public.
// They MUST correspond to those in MEDV14.H
#define HOTSPOT_STRING 0
#define HOTSPOT_HASH 1
#define HOTSPOT_POPUPHASH 2
#define HOTSPOT_UNKNOWN 3
// These next six are not public.
#define HOTSPOT_TOPICUID 4
#define HOTSPOT_POPUPTOPICUID 5
#define HOTSPOT_JI 6
#define HOTSPOT_POPUPJI 7
#define HOTSPOT_EWSHOWN 8 // Occurs when an embedded window with
// the classname EW_CALLBACK_CLASS is shown.
#define HOTSPOT_EWHIDDEN 9 // Occurs when an embedded window with the
// classname EW_CALLBACK_CLASS is hidden.
/* Function prototypes */
VOID PASCAL FAR GetMacMFCP (QMFCP qmfcp, unsigned char far * qb); VOID PASCAL FAR GetMacMBHD (QMBHD qmbhd, unsigned char far * qb);
#endif // !OBJECTS_H
|