/* * @doc INTERNAL * * @module _RTFCONV.H -- RichEdit RTF Converter Base Class Definition | * * Description: * This file contains the type declarations used by both the RTF reader * and writer for the RICHEDIT control * * Authors: * Original RichEdit 1.0 RTF converter: Anthony Francisco * Conversion to C++ and RichEdit 2.0: Murray Sargent * * @devnote * All sz's in the RTF*.? files refer to a LPSTRs, not LPTSTRs, unless * noted as a szUnicode. * * Copyright (c) 1995-1997, Microsoft Corporation. All rights reserved. */ #ifndef __RTFCONV_H #define __RTFCONV_H #include "_edit.h" #include "_array.h" #include "_range.h" #include "_rtext.h" #include "tokens.h" extern const KEYWORD rgKeyword[]; // Convert between Twips and Himetric // Ratio is 1440 twips/in, 2540 him/in, therefore 1440/2540 = 72/127 him/twips // Use muldiv() to include rounding and 64-bit intermediate result #define TwipsFromHimetric(_hm) MulDiv(_hm, 72, 127) #define HimetricFromTwips(_tw) MulDiv(_tw, 127, 72) #define LBRACE TEXT('{') #define BSLASH TEXT('\\') #define RBRACE TEXT('}') #define ZERO TEXT('0') // Character property bits like an ASCII-only ANSI C LC_CTYPE types #define fUC 0x01 // A-Z #define fLC 0x02 // a-z #define fDG 0x04 // 0-9 #define fSP 0x08 // Space chars #define fPN 0x10 // Punctuation chars #define fCT 0x20 // Control chars #define fBL 0x40 // Blank chars #define fHX 0x80 // 0-9, a-f, or A-F #define fAlpha (fUC + fLC) #define fAlphaNum (fAlpha + fDG) extern const BYTE rgbCharClass[256]; #define Classify(_ch) (rgbCharClass[_ch]) #define IsLC(_ch) ((Classify(_ch) & fLC)) #define IsAlpha(_ch) ((Classify(_ch) & fAlpha)) #define IsDigit(_ch) ((Classify(_ch) & fDG)) #define IsXDigit(_ch) ((Classify(_ch) & fHX)) #define IsAlphaNum(_ch) ((Classify(_ch) & fAlphaNum)) #define IsAlphaNumBlank(_ch) ((Classify(_ch) & (fAlphaNum + fBL))) template unsigned int DiffPtrs(T *pA, T *pB) { return pA - pB; } //#define DiffPtrs(_pA, _pB, _type) ((UINT) (((_type *) (_pA)) - ((_type *) (_pB)))) extern INT cKeywords; extern const COLORREF g_Colors[]; extern const char szEndGroupCRLF[]; #define szaCRLF (BYTE *)&szEndGroupCRLF[1] /* * Converter Error Codes */ enum { ecNoError = 0, // Success ecCantUnicode, ecColorTableOverflow, ecExpectingRtfKeyword, ecExpectingStartGroup, ecFontTableOverflow, ecGeneralFailure, ecKeywordTooLong, ecLexInitFailed, ecNoMemory, ecParserBusy, ecPutCharFailed, ecStackOverflow, ecStackUnderflow, ecUnexpectedChar, ecUnexpectedEOF, ecUnexpectedToken, ecUnGetCharFailed, ecTextMax, ecStreamOutObj, ecStreamInObj, ecTruncateAtCRLF, ecFormatCache, ecLastError // Total error messages }; typedef INT EC; /* * @struct RTFOBJECT | * Object data transfer structure */ typedef struct _rtfobject { SHORT sType; // @field object type (ROT_*) SHORT sPictureType; // @field specific type of sPicture SHORT cBitsPerPixel; // @field # bits per pixel, if bitmap SHORT cColorPlanes; // @field # color planes, if bitmap SHORT cBytesPerLine; // @field # bytes per raster line, if bitmap BOOL fSetSize; // @field Let client tell server the size LONG xExt, yExt; // @field dimensions in pixels for pictures, twips for // for objects LONG xScale, yScale; // @field scaling percentage along axes SHORT xExtGoal, yExtGoal; // @field desired dimensions in twips for pictures RECT rectCrop; // @field cropping information in twips TCHAR * szClass; // @field object class TCHAR * szName; // @field object name // On RTF generation LONG xExtPict, yExtPict; // @field metafile dimensions LPBYTE pbResult; // metafile depiction of the object ULONG cbResult; } RTFOBJECT; /* * @enum ROTYPE | The values for OBJECT.sType * * Keep this in sync with rgszROT in rtfwrit.c */ enum ROTYPE { ROT_Bitmap, // @emem Bitmap ROT_Metafile, // @emem Metafile ROT_DIB, // @emem Device-Independent Bitmap ROT_Embedded, // @emem Embedded Object ROT_Link, // @emem Linked Object ROT_AutoLink, // @emem Autolink ROT_MacEdition // @emem Mac object }; /* * DEFINE's */ #define cachBufferMost 4096 #define cachTextMax ( 512 + 1 ) #define cachKeywordMax ( 32 + 1 ) #define cachParamMax ( 11 + 1 ) #define cFooChunk 8 // Characters to give to RichEdit #define chNonBreakingSpace 160 #define chOptionalHyphen 173 #if ( cachTextMax - 1 ) % 2 == 1 #error "cachTextMax - 1 MUST be even" #endif #if ( cachParamMax - 1 ) < 11 #error "cachParamMax MUST be >= 11" #endif /* * Some RTF defaults */ #ifdef NEVER // we don't care about margins, just indents #define dxDefaultLeftMargin 1800 #define dxDefaultRightMargin 1800 #else #define dxDefaultLeftMargin 0 #define dxDefaultRightMargin 0 #endif // next two in half points #define yDefaultFontSize ( 12 * 2 ) #define dyDefaultSuperscript 6 #define RESERVED_FONT_HANDLES 0x800 /* * @struct TEXTFONT | * text font structure */ typedef struct _textfont { SHORT sHandle; // @field RTF input font handle BYTE bCharSet; // @field Font character set BYTE bPitchAndFamily; // @field Font family SHORT iFont; // @field Font name index TCHAR szName[LF_FACESIZE+1]; // @field Font name SHORT sCodePage; // @field Code page for font // (INVALID_CODEPAGE == not set) BYTE fNameIsDBCS; // @field Indicates if szName is DBCS stuffed into Unicode buffer BYTE fCpgFromSystem; // @field Indicates is cpg was // retrieved from system based // on font name. } TEXTFONT; /* * Global variables for the scope of the entire parser/reader */ #ifdef DEBUG extern CHAR * rgszParseError[]; extern CHAR * szDest[]; #endif #define cchMaxNumText 16 // tagged font info typedef struct _tfi { TCHAR *szNormalName; TCHAR *szTaggedName; BYTE bCharSet; } TFI; typedef CArray TEXTFONTS; typedef CArray COLORREFS; const short INVALID_CODEPAGE = -1; const short INVALID_LANGUAGE = -1; // default value for \ucN tag const int iUnicodeCChDefault = 1; /* * CRTFConverter * * @class RTF converter base class used by CRTFRead and CRTFWrite */ class CRTFConverter { //@access Protected Data Members protected: TEXTFONTS _fonts; // @cmember Font table COLORREFS _colors; // @cmember Color table EC _ecParseError; // @cmember Error code CTxtEdit * _ped; // @cmember CTxtEdit CTxtRange * _prg; // @cmember CTxtRange to replace/write from EDITSTREAM *_pes; // @cmember EDITSTREAM to use DWORD _dwFlags; // @cmember See #defines below CCharFormat _CF; // @cmember Character formatting info BYTE _bCharSet; // @cmember Converter char set (ANSI, UTF7, UTF8) static TFI *_rgtfi; // @cmember Pointer to the first font substitute record static INT _ctfi; // @cmember Number of the font substitute records static TCHAR *_pchFontSubInfo; // @cmember Font strings for substitutions //@access Protected Functions void ReadFontSubInfo(void); enum PARSEFONTNAME { PFN_SUCCESS, PFN_FAIL, PFN_EOF }; PARSEFONTNAME ParseFontName(TCHAR *pchBuf, TCHAR *pchBufMax, TCHAR chDelimiter, TCHAR **pszName, BYTE &bCharSet, BOOL &fSetCharSet, TCHAR **ppchBufNew) const; BOOL FontSubstitute(TCHAR *szTaggedName, TCHAR *szNormalName, BYTE *pbCharSet); BOOL FindTaggedFont(const TCHAR *szNormalName, BYTE bCharSet, TCHAR **ppchTaggedName); // @cmember Find font name with additional special tag // corresponding to szNormalName & bCharSet BOOL IsTaggedFont(const TCHAR *szName, BYTE *pbCharSet, TCHAR **ppchNormalName); // @cmember Figure out is szName font name with additional tag // corresponding to pbCharSet //@access Public Functions public: CRTFConverter(CTxtRange *prg, EDITSTREAM *pes, DWORD dwFlags, BOOL fRead); inline ~CRTFConverter(); static void FreeFontSubInfo(); protected: #if defined(DEBUG) && !defined(MACPORT) // for capturing RTF as its read from or written to a file HANDLE _hfileCapture; #endif }; #define fRTFNoObjs 1 #define fRTFFE 8 // Check this #define IsUTF8 ((_dwFlags & (0xFFFF0000 | SF_USECODEPAGE)) \ == ((CP_UTF8 << 16) | SF_USECODEPAGE)) /* * CRTFConverter::CRTFConverter() * * @mfunc * RTF Converter constructor */ inline CRTFConverter::~CRTFConverter() { #if defined(DEBUG) && !defined(MACPORT) if(_hfileCapture) { CloseHandle(_hfileCapture); _hfileCapture = NULL; } #endif } #endif // __RTFCONV_H