#ifndef EMF_DEFINE_H #define EMF_DEFINE_H #define DIRTY_NONE 0x00 #define DIRTY_TEXT 0x01 #define DIRTY_FILL 0x02 #define DIRTY_STROKE 0x04 /** \cond */ #define TEREMIN(A,B) (A < B ? A : B) #define TEREMAX(A,B) (A > B ? A : B) #define ALLOCINFO_CHUNK 32 #define ALLOCOUT_CHUNK 8192 #define TRPRINT trinfo_append_out /** \defgroup color background options Text is underwritten with the background color not at all, by reassembled line, or by full assembly . @{ */ #define BKCLR_NONE 0x00 /**< text is not underwritten with background color (default) */ #define BKCLR_FRAG 0x01 /**< each fragment of text is underwritten with background color */ #define BKCLR_LINE 0x02 /**< each line of text is underwritten with background color */ #define BKCLR_ALL 0x03 /**< entire assembly is underwritten with background color */ /** @} */ /** \endcond */ /** \defgroup color background options Text is underwritten with the background color not at all, by reassembled line, or by full assembly . @{ */ //#define BKCLR_NONE 0x00 /**< text is not underwritten with background color (default) */ //#define BKCLR_FRAG 0x01 /**< each fragment of text is underwritten with background color */ //#define BKCLR_LINE 0x02 /**< each line of text is underwritten with background color */ //#define BKCLR_ALL 0x03 /**< entire assembly is underwritten with background color */ /** @} */ /** \defgroup decoration options One of these values may be present in the decoration field. Unused bits may be used by end user code. These values are SVG specific. Other applications could use the text decoration field for a different set of bits, so long as it provided its own output function. @{ */ #define TXTDECOR_NONE 0x000 /**< text is not decorated (default) */ #define TXTDECOR_UNDER 0x001 /**< underlined */ #define TXTDECOR_OVER 0x002 /**< overlined */ #define TXTDECOR_BLINK 0x004 /**< blinking text */ #define TXTDECOR_STRIKE 0x008 /**< strike through */ #define TXTDECOR_TMASK 0x00F /**< Mask for selecting bits above */ #define TXTDECOR_SOLID 0x000 /**< draw as single solid line */ #define TXTDECOR_DOUBLE 0x010 /**< draw as double solid line */ #define TXTDECOR_DOTTED 0x020 /**< draw as single dotted line */ #define TXTDECOR_DASHED 0x040 /**< draw as single dashed line */ #define TXTDECOR_WAVY 0x080 /**< draw as single wavy line */ #define TXTDECOR_LMASK 0x0F0 /**< Mask for selecting these bits */ #define TXTDECOR_CLRSET 0x100 /**< decoration has its own color */ /** @} */ /** \defgroup text alignment types Location of text's {X,Y} coordinate on bounding rectangle. Values are compatible with Fontconfig. @{ */ #define ALILEFT 0x01 /**< text object horizontal alignment = left */ #define ALICENTER 0x02 /**< text object horizontal alignment = center */ #define ALIRIGHT 0x04 /**< text object horizontal alignment = right */ #define ALIHORI 0x07 /**< text object horizontal alignment mask */ #define ALITOP 0x08 /**< text object vertical alignment = top */ #define ALIBASE 0x10 /**< text object vertical alignment = baseline */ #define ALIBOT 0x20 /**< text object vertical alignment = bottom */ #define ALIVERT 0x38 /**< text object vertical alignment mask */ /** @} */ /** \defgroup language direction types @{ */ #define LDIR_LR 0x00 /**< left to right */ #define LDIR_RL 0x01 /**< right to left */ #define LDIR_TB 0x02 /**< top to bottom */ /** @} */ static unsigned int wingdings_convert[256] = { 0xFFFD, // 0x00 no replacement 0xFFFD, // 0x01 no replacement 0xFFFD, // 0x02 no replacement 0xFFFD, // 0x03 no replacement 0xFFFD, // 0x04 no replacement 0xFFFD, // 0x05 no replacement 0xFFFD, // 0x06 no replacement 0xFFFD, // 0x07 no replacement 0xFFFD, // 0x08 no replacement 0xFFFD, // 0x09 no replacement 0xFFFD, // 0x0A no replacement 0xFFFD, // 0x0B no replacement 0xFFFD, // 0x0C no replacement 0xFFFD, // 0x0D no replacement 0xFFFD, // 0x0E no replacement 0xFFFD, // 0x0F no replacement 0xFFFD, // 0x10 no replacement 0xFFFD, // 0x11 no replacement 0xFFFD, // 0x12 no replacement 0xFFFD, // 0x13 no replacement 0xFFFD, // 0x14 no replacement 0xFFFD, // 0x15 no replacement 0xFFFD, // 0x16 no replacement 0xFFFD, // 0x17 no replacement 0xFFFD, // 0x18 no replacement 0xFFFD, // 0x19 no replacement 0xFFFD, // 0x1A no replacement 0xFFFD, // 0x1B no replacement 0xFFFD, // 0x1C no replacement 0xFFFD, // 0x1D no replacement 0xFFFD, // 0x1E no replacement 0xFFFD, // 0x1F no replacement 0x0020, // 0x20 SPACE 0x270E, // 0x21 LOWER RIGHT PENCIL (close, but not exact) 0x2702, // 0x22 BLACK SCISSORS 0x2701, // 0x23 UPPER BLADE SCISSORS 0xFFFD, // 0x24 no replacement 0xFFFD, // 0x25 no replacement 0xFFFD, // 0x26 no replacement 0xFFFD, // 0x27 no replacement 0x260E, // 0x28 BLACK TELEPHONE 0x2706, // 0x29 TELEPHONE LOCATION SIGN (close, but not exact) 0x2709, // 0x2A ENVELOPE 0x2709, // 0x2B ENVELOPE (close, but not exact) 0xFFFD, // 0x2C no replacement 0xFFFD, // 0x2D no replacement 0xFFFD, // 0x2E no replacement 0xFFFD, // 0x2F no replacement 0xFFFD, // 0x30 no replacement 0xFFFD, // 0x31 no replacement 0xFFFD, // 0x32 no replacement 0xFFFD, // 0x33 no replacement 0xFFFD, // 0x34 no replacement 0xFFFD, // 0x35 no replacement 0x231B, // 0x36 HOURGLASS 0x2328, // 0x37 KEYBOARD 0xFFFD, // 0x38 no replacement 0xFFFD, // 0x39 no replacement 0xFFFD, // 0x3A no replacement 0xFFFD, // 0x3B no replacement 0xFFFD, // 0x3C no replacement 0xFFFD, // 0x3D no replacement 0x2707, // 0x3E TAPE DRIVE 0x270D, // 0x3F WRITING HAND 0x270D, // 0x40 WRITING HAND (close, but not exact) 0x270C, // 0x41 VICTORY HAND 0xFFFD, // 0x42 3 FINGER UP HAND (no replacement) 0xFFFD, // 0x43 THUMBS UP HAND (no replacement) 0xFFFD, // 0x44 THUMBS DOWN HAND (no replacement) 0x261C, // 0x45 WHITE LEFT POINTING INDEX 0x261E, // 0x46 WHITE RIGHT POINTING INDEX 0x261D, // 0x47 WHITE UP POINTING INDEX 0x261F, // 0x48 WHITE DOWN POINTING INDEX 0xFFFD, // 0x49 OPEN HAND (no replacement) 0x263A, // 0x4A WHITE SMILING FACE 0x263A, // 0x4B WHITE SMILING FACE (close, but not exact) 0x2639, // 0x4C WHITE FROWNING FACE 0xFFFD, // 0x4D BOMB (no replacement. 1F4A3) 0x2620, // 0x4E SKULL AND CROSSBONES 0x2690, // 0x4F WHITE FLAG (not exact) 0x2691, // 0x50 WHITE PENANT (use BLACK FLAG) 0x2708, // 0x51 AIRPLANE 0x263C, // 0x52 WHITE SUN WITH RAYS (close, but not exact) 0x2602, // 0x53 RAINDROP (use UMBRELLA) 0x2744, // 0x54 SNOWFLAKE 0x271D, // 0x55 WHITE LATIN CROSS (use BLACK CROSS) 0x271E, // 0x56 SHADOWED WHITE LATIN CROSS 0x271F, // 0x57 CELTIC CROSS (use OUTLINED LATIN CROSS) 0x2720, // 0x58 MALTESE CROSS 0x2721, // 0x59 STAR OF DAVID 0x262A, // 0x5A STAR AND CRESCENT 0x262F, // 0x5B YIN YANG 0x0950, // 0x5C DEVANGARI OM CORRECT|CLOSE: Perhaps PROPOSE SACRED OM ? 0x2638, // 0x5D WHEEL OF DHARMA 0x2648, // 0x5E ARIES 0x2649, // 0x5F TAURUS 0x264A, // 0x60 GEMINI 0x264B, // 0x61 CANCER 0x264C, // 0x62 LEO 0x264D, // 0x63 VIRGO 0x264E, // 0x64 LIBRA 0x264F, // 0x65 SCORPIUS 0x2650, // 0x66 SAGITTARIUS 0x2651, // 0x67 CAPRICORN 0x2652, // 0x68 AQUARIUS 0x2653, // 0x69 PISCES 0xFFFD, // 0x6A LOWER CASE AMPERSAND)?) (no replacement) 0xFF06, // 0x6B AMPERSAND (use FULL WIDTH AMPERSAND, close, but not exact. Do NOT use 0026, or it maps normal Ampersands to Wingdings Ampersand) 0x25CF, // 0x6C BLACK CIRCLE 0x274D, // 0x6D SHADOWED WHITE CIRCLE (close, but not exact) 0x25A0, // 0x6E BLACK SQUARE 0x25A3, // 0x6F WHITE SQUARE IN BLACK RECTANGLE (use BLACK SQUSRE in WHITE SQUARE) 0x25A1, // 0x70 WHITE SQUARE (close, but not exact) 0x2751, // 0x71 LOWER RIGHT SHADOWED WHITE SQUARE 0x2752, // 0x72 UPPER RIGHT SHADOWED WHITE SQUARE 0x25CA, // 0x73 LOZENGE (close, but not exact) 0x25CA, // 0x74 LOZENGE (close, but not exact) 0x25C6, // 0x75 BLACK DIAMOND 0x2756, // 0x76 BLACK DIAMOND MINUS WHITE X 0x25C6, // 0x77 BLACK DIAMOND (close, but not exact) 0x2327, // 0x78 X IN A RECTANGLE BOX 0x2353, // 0x79 APL FUNCTIONAL SYMBOL QUAD UP CARET(close, but not exact) 0x2318, // 0x7A PLACE OF INTEREST SIGN 0x2740, // 0x7B WHITE FLORETTE (close, but not exact) 0x273F, // 0x7C BLACK FLORETTE (close, but not exact) 0x275D, // 0x7D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT 0x275E, // 0x7E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT 0xFFFD, // 0x7F unused 0x24EA, // 0x80 CIRCLED DIGIT ZERO 0x2460, // 0x81 CIRCLED DIGIT ONE 0x2461, // 0x82 CIRCLED DIGIT TWO 0x2462, // 0x83 CIRCLED DIGIT THREE 0x2463, // 0x84 CIRCLED DIGIT FOUR 0x2464, // 0x85 CIRCLED DIGIT FIVE 0x2465, // 0x86 CIRCLED DIGIT SIX 0x2466, // 0x87 CIRCLED DIGIT SEVEN 0x2467, // 0x88 CIRCLED DIGIT EIGHT 0x2468, // 0x89 CIRCLED DIGIT NINE 0x2469, // 0x8A CIRCLED NUMBER TEN 0xFFFD, // 0x8B no replacement 0x2776, // 0x8C DINGBAT NEGATIVE CIRCLED DIGIT ONE 0x2777, // 0x8D DINGBAT NEGATIVE CIRCLED DIGIT TWO 0x2778, // 0x8E DINGBAT NEGATIVE CIRCLED DIGIT THREE 0x2779, // 0x8F DINGBAT NEGATIVE CIRCLED DIGIT FOUR 0x277A, // 0x90 DINGBAT NEGATIVE CIRCLED DIGIT FIVE 0x277B, // 0x91 DINGBAT NEGATIVE CIRCLED DIGIT SIX 0x277C, // 0x92 DINGBAT NEGATIVE CIRCLED DIGIT SEVEN 0x277D, // 0x93 DINGBAT NEGATIVE CIRCLED DIGIT EIGHT 0x277E, // 0x94 DINGBAT NEGATIVE CIRCLED DIGIT NINE 0x277F, // 0x95 DINGBAT NEGATIVE CIRCLED NUMBER TEN 0xFFFD, // 0x96 ROTATED FLORAL HEART BULLET (no good replacement) 0xFFFD, // 0x97 REVERSED ROTATED FLORAL HEART BULLET (no good replacement) 0xFFFD, // 0x98 REVERSED ROTATED FLORAL HEART BULLET (no good replacement) 0xFFFD, // 0x99 ROTATED FLORAL HEART BULLET (no good replacement) 0xFFFD, // 0x9A ROTATED FLORAL HEART BULLET (no good replacement) 0xFFFD, // 0x9B REVERSED ROTATED FLORAL HEART BULLET (no good replacement) 0xFFFD, // 0x9C REVERSED ROTATED FLORAL HEART BULLET (no good replacement) 0xFFFD, // 0x9D ROTATED FLORAL HEART BULLET (no good replacement) 0x2219, // 0x9E BULLET (use BULLET operator, so normal font BULLET will not convert to Symbol BULLET) 0x25CF, // 0x9F BLACK CIRCLE (close, but not exact) 0x25AA, // 0xA0 BLACK VERY SMALL SQUARE 0x26AA, // 0xA1 WHITE CIRCLE (use MEDIUM WHITE CIRCLE) 0x25CB, // 0xA2 HEAVY WHITE CIRCLE (use WHITE CIRCLE) 0x25CD, // 0xA3 HEAVIEST CIRCLE (use CIRCLE WITH VERTICAL FILL) 0x25C9, // 0xA4 CIRCLE WITH A CENTRAL DOT (close, dot much bigger) 0x25CE, // 0xA5 BULLSEYE 0x274D, // 0xA6 SHADOWED WHITE CIRCLE (close, but not exact) 0xFFED, // 0xA7 BLACK SMALL SQUARE 0x2610, // 0xA8 WHITE SQUARE (close, but not exact, different fro 25A1) 0xFFFD, // 0xA9 no replacement 0x2726, // 0xAA BLACK FOUR POINTED STAR MAYBE 0x2605, // 0xAB BLACK STAR 0x2736, // 0xAC SIX POINTED BLACK STAR 0x2737, // 0xAD EIGHT POINTED RECTILINEAR BLACK STAR 0x2738, // 0xAE TWELVE POINTED BLACK STAR 0x2735, // 0xAF EIGHT POINTED PINWHEEL STAR 0xFFFD, // 0xB0 no replacement 0xFFFD, // 0xB1 no replacement 0x2727, // 0xB2 WHITE FOUR POINTED STAR 0x2726, // 0xB3 ROTATED WHITE FOUR POINTED STAR (use BLACK FOUR POINTED STAR) 0xFFFD, // 0xB4 REPLACEMENT CHARACTER (close, but not exact) 0x272A, // 0xB5 CIRCLED WHITE STAR 0x2730, // 0xB6 SHADOWED WHITE STAR 0xFFFD, // 0xB7 ANALOG CLOCK 1 (no replacement) 0xFFFD, // 0xB8 ANALOG CLOCK 2 (no replacement) 0xFFFD, // 0xB9 ANALOG CLOCK 3 (no replacement) 0xFFFD, // 0xBA ANALOG CLOCK 4 (no replacement) 0xFFFD, // 0xBB ANALOG CLOCK 5 (no replacement) 0xFFFD, // 0xBC ANALOG CLOCK 6 (no replacement) 0xFFFD, // 0xBD ANALOG CLOCK 7 (no replacement) 0xFFFD, // 0xBE ANALOG CLOCK 8 (no replacement) 0xFFFD, // 0xBF ANALOG CLOCK 9 (no replacement) 0xFFFD, // 0xC0 ANALOG CLOCK 10 (no replacement) 0xFFFD, // 0xC1 ANALOG CLOCK 11 (no replacement) 0xFFFD, // 0xC2 ANALOG CLOCK 12 (no replacement) 0x21B2, // 0xC3 TURN ARROW DOWN AND LEFT (Meaning close, shape differs) 0x21B3, // 0xC4 TURN ARROW DOWN AND RIGHT (Meaning close, shape differs) 0x21B0, // 0xC5 TURN ARROW UP AND LEFT (Meaning close, shape differs) 0x21B1, // 0xC6 TURN ARROW UP AND RIGHT (Meaning close, shape differs) 0x2B11, // 0xC7 TURN ARROW LEFT AND UP (Meaning close, shape differs) 0x2B0F, // 0xC8 TURN ARROW RIGHT AND UP (Meaning close, shape differs) 0x2B10, // 0xC9 TURN ARROW LEFT AND DOWN (Meaning close, shape differs) 0x2B0E, // 0xCA TURN ARROW RIGHT AND DOWN (Meaning close, shape differs) 0xFFFD, // 0xCB no replacement 0xFFFD, // 0xCC no replacement 0xFFFD, // 0xCD no replacement 0xFFFD, // 0xCE no replacement 0xFFFD, // 0xCF no replacement 0xFFFD, // 0xD0 no replacement 0xFFFD, // 0xD1 no replacement 0xFFFD, // 0xD2 no replacement 0xFFFD, // 0xD3 no replacement 0xFFFD, // 0xD4 no replacement 0x232B, // 0xD5 ERASE TO THE LEFT 0x2326, // 0xD6 ERASE TO THE RIGHT 0x25C0, // 0xD7 THREE-D LIGHTED LEFT ARROWHEAD (Use BLACK LEFT TRIANGLE) 0x25B6, // 0xD8 THREE-D LIGHTED RIGHT ARROWHEAD (Use BLACK RIGHT TRIANGLE, 27A2 is exact but has no other directions) 0x25B2, // 0xD9 THREE-D LIGHTED UP ARROWHEAD (Use BLACK UP TRIANGLE) 0x25BC, // 0xDA THREE-D LIGHTED DOWN ARROWHEAD (Use BLACK DOWN TRIANGLE) 0xFFFD, // 0xDB no replacement 0x27B2, // 0xDC CIRCLED HEAVY WHITE RIGHTWARDS ARROW 0xFFFD, // 0xDD no replacement 0xFFFD, // 0xDE no replacement 0x2190, // 0xDF LEFT ARROW 0x2192, // 0xE0 RIGHT ARROW 0x2191, // 0xE1 UP ARROW 0x2193, // 0xE2 DOWN ARROW 0x2196, // 0xE3 UPPER LEFT ARROW 0x2197, // 0xE4 UPPER RIGHT ARROW 0x2199, // 0xE5 LOWER LEFT ARROW 0x2198, // 0xE6 LOWER RIGHT ARROW 0x2B05, // 0xE7 HEAVY LEFT BLACK ARROW (same as regular BLACK ARROW) 0x2B08, // 0xE8 HEAVY RIGHT BLACK ARROW (same as regular BLACK ARROW) 0x2B06, // 0xE9 HEAVY UP BLACK ARROW (no equiv BLACK ARROW) 0x2B07, // 0xEA HEAVY DOWN BLACK ARROW (same as regular BLACK ARROW) 0x2B09, // 0xEB HEAVY UPPER LEFT BLACK ARROW same as regular BLACK ARROW) 0x2B08, // 0xEC HEAVY UPPER RIGHT BLACK ARROW same as regular BLACK ARROW) 0x2B0B, // 0xED HEAVY LOWER LEFT BLACK ARROW (same as regular BLACK ARROW) 0x2B0A, // 0xEE HEAVY LOWER RIGHT BLACK ARROW (same as regular BLACK ARROW) 0x21E6, // 0xEF LEFTWARDS WHITE ARROW 0x21E8, // 0xF0 RIGHTWARDS WHITE ARROW 0x21E7, // 0xF1 UPWARDS WHITE ARROW 0x21E9, // 0xF2 DOWNWARDS WHITE ARROW 0x21D4, // 0xF3 LEFT RIGHT DOUBLE ARROW 0x21D5, // 0xF4 UP DOWN DOUBLE ARROW 0x21D6, // 0xF5 NORTH WEST DOUBLE ARROW (close, but not exact) 0x21D7, // 0xF6 NORTH EAST DOUBLE ARROW (close, but not exact) 0x21D9, // 0xF7 SOUTH WEST DOUBLE ARROW (close, but not exact) 0x21D8, // 0xF8 SOUTH EAST DOUBLE ARROW (close, but not exact) 0xFFFD, // 0xF9 no replacement 0xFFFD, // 0xFA no replacement 0x2717, // 0xFB BALLOT X 0x2713, // 0xFC CHECK MARK 0x2612, // 0xFD BALLOT BOX WITH X 0x2611, // 0xFE BALLOT BOX WITH CHECK 0xFFFD // 0xFF no replacement }; /* characters from zapf dingbat font, conversion to a unicode font. Change both the code and the font on conversion. These are untested as the development machine did not have the font installed. */ static unsigned int dingbats_convert[256] = { 0xFFFD, // 0x00 no replacement 0xFFFD, // 0x01 no replacement 0xFFFD, // 0x02 no replacement 0xFFFD, // 0x03 no replacement 0xFFFD, // 0x04 no replacement 0xFFFD, // 0x05 no replacement 0xFFFD, // 0x06 no replacement 0xFFFD, // 0x07 no replacement 0xFFFD, // 0x08 no replacement 0xFFFD, // 0x09 no replacement 0xFFFD, // 0x0A no replacement 0xFFFD, // 0x0B no replacement 0xFFFD, // 0x0C no replacement 0xFFFD, // 0x0D no replacement 0xFFFD, // 0x0E no replacement 0xFFFD, // 0x0F no replacement 0xFFFD, // 0x10 no replacement 0xFFFD, // 0x11 no replacement 0xFFFD, // 0x12 no replacement 0xFFFD, // 0x13 no replacement 0xFFFD, // 0x14 no replacement 0xFFFD, // 0x15 no replacement 0xFFFD, // 0x16 no replacement 0xFFFD, // 0x17 no replacement 0xFFFD, // 0x18 no replacement 0xFFFD, // 0x19 no replacement 0xFFFD, // 0x1A no replacement 0xFFFD, // 0x1B no replacement 0xFFFD, // 0x1C no replacement 0xFFFD, // 0x1D no replacement 0xFFFD, // 0x1E no replacement 0xFFFD, // 0x1F no replacement 0x0020, // 0x20 SPACE 0x2701, // 0x21 UPPER BLADE SCISSORS 0x2702, // 0x22 BLACK SCISSORS 0x2703, // 0x23 LOWER BLADE SCISSORS 0x2704, // 0x24 WHITE SCISSORS 0x260E, // 0x25 BLACK TELEPHONE 0x2706, // 0x26 TELEPHONE LOCATION SIGN 0x2707, // 0x27 TAPE DRIVE 0x2708, // 0x28 AIRPLANE 0x2709, // 0x29 ENVELOPE 0x261B, // 0x2A BLACK RIGHT POINTING INDEX 0x261E, // 0x2B WHITE RIGHT POINTING INDEX 0x270C, // 0x2C VICTORY HAND 0x270D, // 0x2D WRITING HAND 0x270E, // 0x2E LOWER RIGHT PENCIL 0x270F, // 0x2F PENCIL 0x2710, // 0x30 UPPER RIGHT PENCIL 0x2711, // 0x31 WHITE NIB 0x2712, // 0x32 BLACK NIB 0x2713, // 0x33 CHECK MARK 0x2714, // 0x34 HEAVY CHECK MARK 0x2715, // 0x35 MULTIPLICATION X 0x2716, // 0x36 HEAVY MULTIPLICATION X 0x2717, // 0x37 BALLOT X 0x2718, // 0x38 HEAVY BALLOT X 0x2719, // 0x39 OUTLINED GREEK CROSS 0x271A, // 0x3A HEAVY GREEK CROSS 0x271B, // 0x3B OPEN CENTRE CROSS 0x271C, // 0x3C HEAVY OPEN CENTRE CROSS 0x271D, // 0x3D LATIN CROSS 0x271E, // 0x3E SHADOWED WHITE LATIN CROSS 0x271F, // 0x3F OUTLINED LATIN CROSS 0x2720, // 0x40 MALTESE CROSS 0x2721, // 0x41 STAR OF DAVID 0x2722, // 0x42 FOUR TEARDROP-SPOKED ASTERISK 0x2723, // 0x43 FOUR BALLOON-SPOKED ASTERISK 0x2724, // 0x44 HEAVY FOUR BALLOON-SPOKED ASTERISK 0x2725, // 0x45 FOUR CLUB-SPOKED ASTERISK 0x2726, // 0x46 BLACK FOUR POINTED STAR 0x2727, // 0x47 WHITE FOUR POINTED STAR 0x2605, // 0x48 BLACK STAR 0x2729, // 0x49 STRESS OUTLINED WHITE STAR 0x272A, // 0x4A CIRCLED WHITE STAR 0x272B, // 0x4B OPEN CENTRE BLACK STAR 0x272C, // 0x4C BLACK CENTRE WHITE STAR 0x272D, // 0x4D OUTLINED BLACK STAR 0x272E, // 0x4E HEAVY OUTLINED BLACK STAR 0x272F, // 0x4F PINWHEEL STAR 0x2730, // 0x50 SHADOWED WHITE STAR 0x2731, // 0x51 HEAVY ASTERISK 0x2732, // 0x52 OPEN CENTRE ASTERISK 0x2733, // 0x53 EIGHT SPOKED ASTERISK 0x2734, // 0x54 EIGHT POINTED BLACK STAR 0x2735, // 0x55 EIGHT POINTED PINWHEEL STAR 0x2736, // 0x56 SIX POINTED BLACK STAR 0x2737, // 0x57 EIGHT POINTED RECTILINEAR BLACK STAR 0x2738, // 0x58 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR 0x2739, // 0x59 TWELVE POINTED BLACK STAR 0x273A, // 0x5A SIXTEEN POINTED ASTERISK 0x273B, // 0x5B TEARDROP-SPOKED ASTERISK 0x273C, // 0x5C OPEN CENTRE TEARDROP-SPOKED ASTERISK 0x273D, // 0x5D HEAVY TEARDROP-SPOKED ASTERISK 0x273E, // 0x5E SIX PETALLED BLACK AND WHITE FLORETTE 0x273F, // 0x5F BLACK FLORETTE 0x2740, // 0x60 WHITE FLORETTE 0x2741, // 0x61 EIGHT PETALLED OUTLINED BLACK FLORETTE 0x2742, // 0x62 CIRCLED OPEN CENTRE EIGHT POINTED STAR 0x2743, // 0x63 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK 0x2744, // 0x64 SNOWFLAKE 0x2745, // 0x65 TIGHT TRIFOLIATE SNOWFLAKE 0x2746, // 0x66 HEAVY CHEVRON SNOWFLAKE 0x2747, // 0x67 SPARKLE 0x2748, // 0x68 HEAVY SPARKLE 0x2749, // 0x69 BALLOON-SPOKED ASTERISK 0x274A, // 0x6A EIGHT TEARDROP-SPOKED PROPELLER ASTERISK 0x274B, // 0x6B HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK 0x25CF, // 0x6C BLACK CIRCLE 0x274D, // 0x6D SHADOWED WHITE CIRCLE 0x25A0, // 0x6E BLACK SQUARE 0x274F, // 0x6F LOWER RIGHT DROP-SHADOWED WHITE SQUARE 0x2750, // 0x70 UPPER RIGHT DROP-SHADOWED WHITE SQUARE 0x2751, // 0x71 LOWER RIGHT SHADOWED WHITE SQUARE 0x2752, // 0x72 UPPER RIGHT SHADOWED WHITE SQUARE 0x25B2, // 0x73 BLACK UP-POINTING TRIANGLE 0x25BC, // 0x74 BLACK DOWN-POINTING TRIANGLE 0x25C6, // 0x75 BLACK DIAMOND 0x2756, // 0x76 BLACK DIAMOND MINUS WHITE X 0x25D7, // 0x77 RIGHT HALF BLACK CIRCLE 0x2758, // 0x78 LIGHT VERTICAL BAR 0x2759, // 0x79 MEDIUM VERTICAL BAR 0x275A, // 0x7A HEAVY VERTICAL BAR 0x275B, // 0x7B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT 0x275C, // 0x7C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT 0x275D, // 0x7D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT 0x275E, // 0x7E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT 0xFFFD, // 0x7F no replacement 0xF8D7, // 0x80 MEDIUM LEFT PARENTHESIS ORNAMENT 0xF8D8, // 0x81 MEDIUM RIGHT PARENTHESIS ORNAMENT 0xF8D9, // 0x82 MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT 0xF8DA, // 0x83 MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT 0xF8DB, // 0x84 MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT 0xF8DC, // 0x85 MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT 0xF8DD, // 0x86 HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT 0xF8DE, // 0x87 HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT 0xF8DF, // 0x88 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT 0xF8E0, // 0x89 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT 0xF8E1, // 0x8A LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT 0xF8E2, // 0x8B LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT 0xF8E3, // 0x8C MEDIUM LEFT CURLY BRACKET ORNAMENT 0xF8E4, // 0x8D MEDIUM RIGHT CURLY BRACKET ORNAMENT 0xFFFD, // 0x8E no replacement 0xFFFD, // 0x8F no replacement 0xFFFD, // 0x90 no replacement 0xFFFD, // 0x91 no replacement 0xFFFD, // 0x92 no replacement 0xFFFD, // 0x93 no replacement 0xFFFD, // 0x94 no replacement 0xFFFD, // 0x95 no replacement 0xFFFD, // 0x96 no replacement 0xFFFD, // 0x97 no replacement 0xFFFD, // 0x98 no replacement 0xFFFD, // 0x99 no replacement 0xFFFD, // 0x9A no replacement 0xFFFD, // 0x9B no replacement 0xFFFD, // 0x9C no replacement 0xFFFD, // 0x9D no replacement 0xFFFD, // 0x9E no replacement 0xFFFD, // 0x9F no replacement 0xFFFD, // 0xA0 no replacement 0x2761, // 0xA1 CURVED STEM PARAGRAPH SIGN ORNAMENT 0x2762, // 0xA2 HEAVY EXCLAMATION MARK ORNAMENT 0x2763, // 0xA3 HEAVY HEART EXCLAMATION MARK ORNAMENT 0x2764, // 0xA4 HEAVY BLACK HEART 0x2765, // 0xA5 ROTATED HEAVY BLACK HEART BULLET 0x2766, // 0xA6 FLORAL HEART 0x2767, // 0xA7 ROTATED FLORAL HEART BULLET 0x2663, // 0xA8 BLACK CLUB SUIT 0x2666, // 0xA9 BLACK DIAMOND SUIT 0x2665, // 0xAA BLACK HEART SUIT 0x2660, // 0xAB BLACK SPADE SUIT 0x2460, // 0xAC CIRCLED DIGIT ONE 0x2461, // 0xAD CIRCLED DIGIT TWO 0x2462, // 0xAE CIRCLED DIGIT THREE 0x2463, // 0xAF CIRCLED DIGIT FOUR 0x2464, // 0xB0 CIRCLED DIGIT FIVE 0x2465, // 0xB1 CIRCLED DIGIT SIX 0x2466, // 0xB2 CIRCLED DIGIT SEVEN 0x2467, // 0xB3 CIRCLED DIGIT EIGHT 0x2468, // 0xB4 CIRCLED DIGIT NINE 0x2469, // 0xB5 CIRCLED NUMBER TEN 0x2776, // 0xB6 DINGBAT NEGATIVE CIRCLED DIGIT ONE 0x2777, // 0xB7 DINGBAT NEGATIVE CIRCLED DIGIT TWO 0x2778, // 0xB8 DINGBAT NEGATIVE CIRCLED DIGIT THREE 0x2779, // 0xB9 DINGBAT NEGATIVE CIRCLED DIGIT FOUR 0x277A, // 0xBA DINGBAT NEGATIVE CIRCLED DIGIT FIVE 0x277B, // 0xBB DINGBAT NEGATIVE CIRCLED DIGIT SIX 0x277C, // 0xBC DINGBAT NEGATIVE CIRCLED DIGIT SEVEN 0x277D, // 0xBD DINGBAT NEGATIVE CIRCLED DIGIT EIGHT 0x277E, // 0xBE DINGBAT NEGATIVE CIRCLED DIGIT NINE 0x277F, // 0xBF DINGBAT NEGATIVE CIRCLED NUMBER TEN 0x2780, // 0xC0 DINGBAT CIRCLED SANS-SERIF DIGIT ONE 0x2781, // 0xC1 DINGBAT CIRCLED SANS-SERIF DIGIT TWO 0x2782, // 0xC2 DINGBAT CIRCLED SANS-SERIF DIGIT THREE 0x2783, // 0xC3 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR 0x2784, // 0xC4 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE 0x2785, // 0xC5 DINGBAT CIRCLED SANS-SERIF DIGIT SIX 0x2786, // 0xC6 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN 0x2787, // 0xC7 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT 0x2788, // 0xC8 DINGBAT CIRCLED SANS-SERIF DIGIT NINE 0x2789, // 0xC9 DINGBAT CIRCLED SANS-SERIF NUMBER TEN 0x278A, // 0xCA DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE 0x278B, // 0xCB DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO 0x278C, // 0xCC DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE 0x278D, // 0xCD DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR 0x278E, // 0xCE DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE 0x278F, // 0xCF DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX 0x2790, // 0xD0 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN 0x2791, // 0xD1 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT 0x2792, // 0xD2 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE 0x2793, // 0xD3 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN 0x2794, // 0xD4 HEAVY WIDE-HEADED RIGHTWARDS ARROW 0x2192, // 0xD5 RIGHTWARDS ARROW 0x2194, // 0xD6 LEFT RIGHT ARROW 0x2195, // 0xD7 UP DOWN ARROW 0x2798, // 0xD8 HEAVY SOUTH EAST ARROW 0x2799, // 0xD9 HEAVY RIGHTWARDS ARROW 0x279A, // 0xDA HEAVY NORTH EAST ARROW 0x279B, // 0xDB DRAFTING POINT RIGHTWARDS ARROW 0x279C, // 0xDC HEAVY ROUND-TIPPED RIGHTWARDS ARROW 0x279D, // 0xDD TRIANGLE-HEADED RIGHTWARDS ARROW 0x279E, // 0xDE HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW 0x279F, // 0xDF DASHED TRIANGLE-HEADED RIGHTWARDS ARROW 0x27A0, // 0xE0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW 0x27A1, // 0xE1 BLACK RIGHTWARDS ARROW 0x27A2, // 0xE2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD 0x27A3, // 0xE3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD 0x27A4, // 0xE4 BLACK RIGHTWARDS ARROWHEAD 0x27A5, // 0xE5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW 0x27A6, // 0xE6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW 0x27A7, // 0xE7 SQUAT BLACK RIGHTWARDS ARROW 0x27A8, // 0xE8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW 0x27A9, // 0xE9 RIGHT-SHADED WHITE RIGHTWARDS ARROW 0x27AA, // 0xEA LEFT-SHADED WHITE RIGHTWARDS ARROW 0x27AB, // 0xEB BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW 0x27AC, // 0xEC FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW 0x27AD, // 0xED HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW 0x27AE, // 0xEE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW 0x27AF, // 0xEF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW 0xFFFD, // 0xF0 no replacement 0x27B1, // 0xF1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW 0x27B2, // 0xF2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW 0x27B3, // 0xF3 WHITE-FEATHERED RIGHTWARDS ARROW 0x27B4, // 0xF4 BLACK-FEATHERED SOUTH EAST ARROW 0x27B5, // 0xF5 BLACK-FEATHERED RIGHTWARDS ARROW 0x27B6, // 0xF6 BLACK-FEATHERED NORTH EAST ARROW 0x27B7, // 0xF7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW 0x27B8, // 0xF8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW 0x27B9, // 0xF9 HEAVY BLACK-FEATHERED NORTH EAST ARROW 0x27BA, // 0xFA TEARDROP-BARBED RIGHTWARDS ARROW 0x27BB, // 0xFB HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW 0x27BC, // 0xFC WEDGE-TAILED RIGHTWARDS ARROW 0x27BD, // 0xFD HEAVY WEDGE-TAILED RIGHTWARDS ARROW 0x27BE, // 0xFE OPEN-OUTLINED RIGHTWARDS ARROW 0xFFFD // 0xFF no replacement }; /* characters from symbol font, conversion to a unicode font. Change both the code and the font on conversion. */ static unsigned int symbol_convert[256] = { 0xFFFD, // 0x00 no replacement 0xFFFD, // 0x01 no replacement 0xFFFD, // 0x02 no replacement 0xFFFD, // 0x03 no replacement 0xFFFD, // 0x04 no replacement 0xFFFD, // 0x05 no replacement 0xFFFD, // 0x06 no replacement 0xFFFD, // 0x07 no replacement 0xFFFD, // 0x08 no replacement 0xFFFD, // 0x09 no replacement 0xFFFD, // 0x0A no replacement 0xFFFD, // 0x0B no replacement 0xFFFD, // 0x0C no replacement 0xFFFD, // 0x0D no replacement 0xFFFD, // 0x0E no replacement 0xFFFD, // 0x0F no replacement 0xFFFD, // 0x10 no replacement 0xFFFD, // 0x11 no replacement 0xFFFD, // 0x12 no replacement 0xFFFD, // 0x13 no replacement 0xFFFD, // 0x14 no replacement 0xFFFD, // 0x15 no replacement 0xFFFD, // 0x16 no replacement 0xFFFD, // 0x17 no replacement 0xFFFD, // 0x18 no replacement 0xFFFD, // 0x19 no replacement 0xFFFD, // 0x1A no replacement 0xFFFD, // 0x1B no replacement 0xFFFD, // 0x1C no replacement 0xFFFD, // 0x1D no replacement 0xFFFD, // 0x1E no replacement 0xFFFD, // 0x1F no replacement 0x0020, // 0x20 SPACE 0x0021, // 0x21 EXCLAMATION MARK 0x2200, // 0x22 FOR ALL 0x0023, // 0x23 NUMBER SIGN 0x2203, // 0x24 THERE EXISTS 0x0025, // 0x25 PERCENT SIGN 0x0026, // 0x26 AMPERSAND 0x220B, // 0x27 CONTAINS AS MEMBER 0x0028, // 0x28 OPENING PARENTHESIS 0x0029, // 0x29 CLOSING PARENTHESIS 0x2217, // 0x2A ASTERISK OPERATOR 0x002B, // 0x2B PLUS SIGN 0x002C, // 0x2C COMMA 0x2212, // 0x2D MINUS SIGN 0x002E, // 0x2E PERIOD 0x002F, // 0x2F SLASH 0x0030, // 0x30 DIGIT ZERO 0x0031, // 0x31 DIGIT ONE 0x0032, // 0x32 DIGIT TWO 0x0033, // 0x33 DIGIT THREE 0x0034, // 0x34 DIGIT FOUR 0x0035, // 0x35 DIGIT FIVE 0x0036, // 0x36 DIGIT SIX 0x0037, // 0x37 DIGIT SEVEN 0x0038, // 0x38 DIGIT EIGHT 0x0039, // 0x39 DIGIT NINE 0x003A, // 0x3A COLON 0x003B, // 0x3B SEMICOLON 0x003C, // 0x3C LESS-THAN SIGN 0x003D, // 0x3D EQUALS SIGN 0x003E, // 0x3E GREATER-THAN SIGN 0x003F, // 0x3F QUESTION MARK 0x2245, // 0x40 APPROXIMATELY EQUAL TO 0x0391, // 0x41 GREEK CAPITAL LETTER ALPHA 0x0392, // 0x42 GREEK CAPITAL LETTER BETA 0x03A7, // 0x43 GREEK CAPITAL LETTER CHI 0x0394, // 0x44 GREEK CAPITAL LETTER DELTA 0x0395, // 0x45 GREEK CAPITAL LETTER EPSILON 0x03A6, // 0x46 GREEK CAPITAL LETTER PHI 0x0393, // 0x47 GREEK CAPITAL LETTER GAMMA 0x0397, // 0x48 GREEK CAPITAL LETTER ETA 0x0399, // 0x49 GREEK CAPITAL LETTER IOTA 0x03D1, // 0x4A GREEK SMALL LETTER SCRIPT THETA 0x039A, // 0x4B GREEK CAPITAL LETTER KAPPA 0x039B, // 0x4C GREEK CAPITAL LETTER LAMBDA 0x039C, // 0x4D GREEK CAPITAL LETTER MU 0x039D, // 0x4E GREEK CAPITAL LETTER NU 0x039F, // 0x4F GREEK CAPITAL LETTER OMICRON 0x03A0, // 0x50 GREEK CAPITAL LETTER PI 0x0398, // 0x51 GREEK CAPITAL LETTER THETA 0x03A1, // 0x52 GREEK CAPITAL LETTER RHO 0x03A3, // 0x53 GREEK CAPITAL LETTER SIGMA 0x03A4, // 0x54 GREEK CAPITAL LETTER TAU 0x03A5, // 0x55 GREEK CAPITAL LETTER UPSILON 0x03C2, // 0x56 GREEK SMALL LETTER FINAL SIGMA 0x03A9, // 0x57 GREEK CAPITAL LETTER OMEGA 0x039E, // 0x58 GREEK CAPITAL LETTER XI 0x03A8, // 0x59 GREEK CAPITAL LETTER PSI 0x0396, // 0x5A GREEK CAPITAL LETTER ZETA 0x005B, // 0x5B OPENING SQUARE BRACKET 0x2234, // 0x5C THEREFORE 0x005D, // 0x5D CLOSING SQUARE BRACKET 0x22A5, // 0x5E UP TACK 0x005F, // 0x5F SPACING UNDERSCORE 0x203E, // 0x60 SPACING OVERSCORE 0x03B1, // 0x61 GREEK SMALL LETTER ALPHA 0x03B2, // 0x62 GREEK SMALL LETTER BETA 0x03C7, // 0x63 GREEK SMALL LETTER CHI 0x03B4, // 0x64 GREEK SMALL LETTER DELTA 0x03B5, // 0x65 GREEK SMALL LETTER EPSILON 0x03C6, // 0x66 GREEK SMALL LETTER PHI 0x03B3, // 0x67 GREEK SMALL LETTER GAMMA 0x03B7, // 0x68 GREEK SMALL LETTER ETA 0x03B9, // 0x69 GREEK SMALL LETTER IOTA 0x03D5, // 0x6A GREEK SMALL LETTER SCRIPT PHI 0x03BA, // 0x6B GREEK SMALL LETTER KAPPA 0x03BB, // 0x6C GREEK SMALL LETTER LAMBDA 0x03BC, // 0x6D GREEK SMALL LETTER MU 0x03BD, // 0x6E GREEK SMALL LETTER NU 0x03BF, // 0x6F GREEK SMALL LETTER OMICRON 0x03C0, // 0x70 GREEK SMALL LETTER PI 0x03B8, // 0x71 GREEK SMALL LETTER THETA 0x03C1, // 0x72 GREEK SMALL LETTER RHO 0x03C3, // 0x73 GREEK SMALL LETTER SIGMA 0x03C4, // 0x74 GREEK SMALL LETTER TAU 0x03C5, // 0x75 GREEK SMALL LETTER UPSILON 0x03D6, // 0x76 GREEK SMALL LETTER OMEGA PI 0x03C9, // 0x77 GREEK SMALL LETTER OMEGA 0x03BE, // 0x78 GREEK SMALL LETTER XI 0x03C8, // 0x79 GREEK SMALL LETTER PSI 0x03B6, // 0x7A GREEK SMALL LETTER ZETA 0x007B, // 0x7B OPENING CURLY BRACKET 0x007C, // 0x7C VERTICAL BAR 0x007D, // 0x7D CLOSING CURLY BRACKET 0x223C, // 0x7E TILDE OPERATOR 0xFFFD, // 0x7F no replacement 0xFFFD, // 0x80 no replacement 0xFFFD, // 0x81 no replacement 0xFFFD, // 0x82 no replacement 0xFFFD, // 0x83 no replacement 0xFFFD, // 0x84 no replacement 0xFFFD, // 0x85 no replacement 0xFFFD, // 0x86 no replacement 0xFFFD, // 0x87 no replacement 0xFFFD, // 0x88 no replacement 0xFFFD, // 0x89 no replacement 0xFFFD, // 0x8A no replacement 0xFFFD, // 0x8B no replacement 0xFFFD, // 0x8C no replacement 0xFFFD, // 0x8D no replacement 0xFFFD, // 0x8E no replacement 0xFFFD, // 0x8F no replacement 0xFFFD, // 0x90 no replacement 0xFFFD, // 0x91 no replacement 0xFFFD, // 0x92 no replacement 0xFFFD, // 0x93 no replacement 0xFFFD, // 0x94 no replacement 0xFFFD, // 0x95 no replacement 0xFFFD, // 0x96 no replacement 0xFFFD, // 0x97 no replacement 0xFFFD, // 0x98 no replacement 0xFFFD, // 0x99 no replacement 0xFFFD, // 0x9A no replacement 0xFFFD, // 0x9B no replacement 0xFFFD, // 0x9C no replacement 0xFFFD, // 0x9D no replacement 0xFFFD, // 0x9E no replacement 0xFFFD, // 0x9F no replacement 0x20AC, // 0xA0 EURO SIGN 0x03D2, // 0xA1 GREEK CAPITAL LETTER UPSILON HOOK 0x2032, // 0xA2 PRIME 0x2264, // 0xA3 LESS THAN OR EQUAL TO 0x2044, // 0xA4 FRACTION SLASH 0x221E, // 0xA5 INFINITY 0x0192, // 0xA6 LATIN SMALL LETTER SCRIPT F 0x2663, // 0xA7 BLACK CLUB SUIT 0x2666, // 0xA8 BLACK DIAMOND SUIT 0x2665, // 0xA9 BLACK HEART SUIT 0x2660, // 0xAA BLACK SPADE SUIT 0x2194, // 0xAB LEFT RIGHT ARROW 0x2190, // 0xAC LEFT ARROW 0x2191, // 0xAD UP ARROW 0x2192, // 0xAE RIGHT ARROW 0x2193, // 0xAF DOWN ARROW 0x00B0, // 0xB0 DEGREE SIGN 0x00B1, // 0xB1 PLUS-OR-MINUS SIGN 0x2033, // 0xB2 DOUBLE PRIME 0x2265, // 0xB3 GREATER THAN OR EQUAL TO 0x00D7, // 0xB4 MULTIPLICATION SIGN 0x221D, // 0xB5 PROPORTIONAL TO 0x2202, // 0xB6 PARTIAL DIFFERENTIAL 0x2219, // 0xB7 BULLET (use BULLET operator, so normal font BULLET will not convert to Symbol BULLET) 0x00F7, // 0xB8 DIVISION SIGN 0x2260, // 0xB9 NOT EQUAL TO 0x2261, // 0xBA IDENTICAL TO 0x2248, // 0xBB ALMOST EQUAL TO 0x2026, // 0xBC HORIZONTAL ELLIPSIS 0xF8E6, // 0xBD VERTICAL ARROW EXTENDER 0xF8E7, // 0xBE HORIZONTAL ARROW EXTENDER 0x21B5, // 0xBF DOWN ARROW WITH CORNER LEFT 0x2135, // 0xC0 FIRST TRANSFINITE CARDINAL 0x2111, // 0xC1 BLACK-LETTER I 0x211C, // 0xC2 BLACK-LETTER R 0x2118, // 0xC3 SCRIPT P 0x2297, // 0xC4 CIRCLED TIMES 0x2295, // 0xC5 CIRCLED PLUS 0x2205, // 0xC6 EMPTY SET 0x2229, // 0xC7 INTERSECTION 0x222A, // 0xC8 UNION 0x2283, // 0xC9 SUPERSET OF 0x2287, // 0xCA SUPERSET OF OR EQUAL TO 0x2284, // 0xCB NOT A SUBSET OF 0x2282, // 0xCC SUBSET OF 0x2286, // 0xCD SUBSET OF OR EQUAL TO 0x2208, // 0xCE ELEMENT OF 0x2209, // 0xCF NOT AN ELEMENT OF 0x2220, // 0xD0 ANGLE 0x2207, // 0xD1 NABLA 0x00AE, // 0xD2 REGISTERED TRADE MARK SIGN 0x00A9, // 0xD3 COPYRIGHT SIGN 0x2122, // 0xD4 TRADEMARK 0x220F, // 0xD5 N-ARY PRODUCT 0x221A, // 0xD6 SQUARE ROOT 0x22C5, // 0xD7 DOT OPERATOR 0x00AC, // 0xD8 NOT SIGN 0x2227, // 0xD9 LOGICAL AND 0x2228, // 0xDA LOGICAL OR 0x21D4, // 0xDB LEFT RIGHT DOUBLE ARROW 0x21D0, // 0xDC LEFT DOUBLE ARROW 0x21D1, // 0xDD UP DOUBLE ARROW 0x21D2, // 0xDE RIGHT DOUBLE ARROW 0x21D3, // 0xDF DOWN DOUBLE ARROW 0x25CA, // 0xE0 LOZENGE 0x2329, // 0xE1 BRA 0x00AE, // 0xE2 REGISTERED TRADE MARK SIGN 0x00A9, // 0xE3 COPYRIGHT SIGN 0x2122, // 0xE4 TRADEMARK 0x2211, // 0xE5 N-ARY SUMMATION 0x239B, // 0xE6 LEFT PAREN TOP 0x239C, // 0xE7 LEFT PAREN EXTENDER 0x239D, // 0xE8 LEFT PAREN BOTTOM 0x23A1, // 0xE9 LEFT SQUARE BRACKET TOP 0x23A2, // 0xEA LEFT SQUARE BRACKET EXTENDER 0x23A3, // 0xEB LEFT SQUARE BRACKET BOTTOM 0x23A7, // 0xEC LEFT CURLY BRACKET TOP 0x23A8, // 0xED LEFT CURLY BRACKET MID 0x23A9, // 0xEE LEFT CURLY BRACKET BOTTOM 0x23AA, // 0xEF CURLY BRACKET EXTENDER 0xFFFD, // 0xF0 no replacement 0x232A, // 0xF1 KET 0x222B, // 0xF2 INTEGRAL 0x2320, // 0xF3 TOP HALF INTEGRAL 0x23AE, // 0xF4 INTEGRAL EXTENDER 0x2321, // 0xF5 BOTTOM HALF INTEGRAL 0x239E, // 0xF6 RIGHT PAREN TOP 0x239F, // 0xF7 RIGHT PAREN EXTENDER 0x23A0, // 0xF8 RIGHT PAREN BOTTOM 0x23A4, // 0xF9 RIGHT SQUARE BRACKET TOP 0x23A5, // 0xFA RIGHT SQUARE BRACKET EXTENDER 0x23A6, // 0xFB RIGHT SQUARE BRACKET BOTTOM 0x23AB, // 0xFC RIGHT CURLY BRACKET TOP 0x23AC, // 0xFD RIGHT CURLY BRACKET MID 0x23AD, // 0xFE RIGHT CURLY BRACKET BOTTOM 0xFFFD // 0xFF no replacement }; enum cvt_to_font { CVTNON, CVTSYM, CVTZDG, CVTWDG }; enum SPCSSFontStyle : std::uint_least8_t { SP_CSS_FONT_STYLE_NORMAL, SP_CSS_FONT_STYLE_ITALIC, SP_CSS_FONT_STYLE_OBLIQUE }; enum MFDrawMode { DRAW_PAINT, DRAW_PATTERN, DRAW_IMAGE, DRAW_LINEAR_GRADIENT, DRAW_RADIAL_GRADIENT }; #ifndef M_PI # define M_PI 3.14159265358979323846 /* pi */ #endif typedef struct { double x; //线段点的x double y; //线段点的y }EMRLINETOS; /** \brief 关于所有字体实例的信息。 */ typedef struct { //FT_Library library; // Fontconfig 句柄(暂时注释,不使用) //FNT_SPECS *fonts; // 包含字体信息结构数组(暂时注释,不使用) uint32_t space; // 已分配的存储槽数量 uint32_t used; // 已使用的存储槽数量 } FT_INFO; typedef struct { uint8_t Red; // 红色分量 (0-255) uint8_t Green; // 绿色分量 (0-255) uint8_t Blue; // 蓝色分量 (0-255) uint8_t Reserved; // 保留字段,未使用 } TRCOLORREF; /** \brief 表示单个文本对象的信息。 */ typedef struct { uint8_t *string; // UTF-8 编码的文本字符串 double ori; // 字符相对于基线的角度(度数) double fs; // 文本的字体大小 double x; // 相对于 TR_INFO 中 x,y 的 x 坐标,单位为点(points) double y; // 相对于 TR_INFO 中 x,y 的 y 坐标,单位为点(points) double xkern; // 与前一个文本块之间的 x 方向字距调整(若为复杂文本) double ykern; // 与前一个文本块之间的 y 方向字距调整(若为复杂文本) double boff; // 基线偏移量,用来确定文字相对于底部参考点的位置 double vadvance; // 行间距,典型值为 1.25 或 1.2,仅在复杂文本的第一个文本元素中设置 TRCOLORREF color1; // 文本颜色(RGB) int taln; // 文本相对于 x,y 的对齐方式 int ldir; // 语言方向(LDIR_*) int italics; // 是否倾斜,与 FontConfig 参数对应 int weight; // 字体粗细,与 FontConfig 参数对应 int condensed; // 是否压缩,与 FontConfig 参数对应 int decoration; // 文本修饰,在装配阶段忽略,在输出时使用 int spaces; // 记录在宽字距中转换的空格数量(可能是 1 或 2) TRCOLORREF decColor1; // 文本修饰使用的颜色,在装配阶段忽略,在输出时使用 int co; // 如果设置,则表示“压缩”覆盖;当包含 narrow 时字体名也需修改 int rt_tidx; // 包含该文本的矩形索引 int fi_idx; // 使用的字体在 FT_INFO 中的索引 } TCHUNK_SPECS; /** \brief 管理所有文本对象的信息。 这里的坐标是内部坐标,经过对 TR_INFO 中的坐标进行偏移/旋转后得到。 */ typedef struct { TCHUNK_SPECS *chunks; // 文本块数组 uint32_t space; // 已分配的存储槽数量 uint32_t used; // 已使用的存储槽数量 } TP_INFO; /** \brief 表示单个包围矩形的信息。 这里的坐标是内部坐标,经过对 TR_INFO 中的坐标进行偏移/旋转后得到。 */ typedef struct { double xll; // 矩形左下角的 x 坐标 double yll; // 矩形左下角的 y 坐标 double xur; // 矩形右上角的 x 坐标 double yur; // 矩形右上角的 y 坐标 double xbearing; // 左侧字符的 x 轴承(字体排版相关) } BRECT_SPECS; /** \brief 管理所有包围矩形的信息。 */ typedef struct { BRECT_SPECS *rects; // 包围矩形数组 uint32_t space; // 已分配的存储槽数量 uint32_t used; // 已使用的存储槽数量 } BR_INFO; /** \brief 记录一个“复合体”(complex)中的所有成员。 */ typedef struct { int *members; // 存储其直接子对象的数组。如果为 TR_PARA_*,则这些子对象是 // cxi 中的索引;如果为 TR_TEXT 或 TR_LINE,则这些索引 // 对应 tpi 中的文本 uint32_t space; // 已分配的存储槽数量 uint32_t used; // 已使用的存储槽数量 } CHILD_SPECS; /** \brief 表示一个“复合体”(complex)的信息。 */ typedef struct { int rt_cidx; // 包含该复合体所有成员的矩形索引 enum tr_classes type; // 该复合体的分类(tr_classes) CHILD_SPECS kids; // 该复合体的直接子节点信息。对于 TR_TEXT 类型,kids 中的索引指向 tpi;否则指向 cxi } CX_SPECS; /** \brief 管理所有“复合体”的信息。 */ typedef struct { CX_SPECS *cx; // 存储所有复合体的数组 uint32_t space; // 已分配的存储槽数量 uint32_t used; // 已使用的存储槽数量 uint32_t phase1; // 第一阶段输入的复合体数量(行 + 文本片段) uint32_t lines; // 第一阶段中行(lines)的数量 uint32_t paras; // 第二阶段输入的复合体(段落)数量 } CX_INFO; /** \brief 文本重组系统的整体信息。 */ typedef struct { FT_INFO *fti; // 字体信息存储结构指针 TP_INFO *tpi; // 文本信息/位置存储结构指针 BR_INFO *bri; // 包围矩形信息存储结构指针 CX_INFO *cxi; // 复合体信息存储结构指针 uint8_t *out; // 用于存储格式化输出的缓冲区 double qe; // 点数(points)级别的量化误差 double esc; // 字体倾斜角度(度数) double x; // 第一个文本对象的 x 坐标(points) double y; // 第一个文本对象的 y 坐标(points) int dirty; // 若文本记录已被加载则为 1 int use_kern; // 若使用字距调整(kerning)则为 1,否则为 0 int load_flags; // 字体加载标志:如 FT_LOAD_NO_SCALE 或 FT_LOAD_TARGET_NORMAL int kern_mode; // 字距调整模式:FT_KERNING_DEFAULT, FT_KERNING_UNFITTED 等 uint32_t outspace; // out 缓冲区已分配的大小 uint32_t outused; // out 缓冲区已使用的大小 int usebk; // 若输出时需要在文字下绘制背景色则为 1 TRCOLORREF bkcolor; // 文字背景色(RGB) } TR_INFO; /** \brief EMF_OBJECT 结构,描述 EMF 对象的基本信息。 */ struct EMF_OBJECT { int type = 0; // 对象类型 int level = 0; // 嵌套层级 char *lpEMFR = nullptr; // 指向对应的 EMF 记录数据 }; /** \brief EMF_STRINGS 结构,用于存储字符串数组信息。 */ struct EMF_STRINGS { int size = 0; // 已分配的字符串槽数量 int count = 0; // 已使用的字符串槽数量 char **strings = nullptr; // 存放字符串的指针数组 }; /** \brief EMF_DEVICE_CONTEXT 结构,用于记录当前设备上下文(DC)的信息。 */ struct EMF_DEVICE_CONTEXT { EMF_DEVICE_CONTEXT() : font_size(0), font_ori_value(0), font_name(nullptr), clip_id(0), stroke_set(false), stroke_mode(0), stroke_idx(0), stroke_recidx(0), fill_set(false), fill_mode(0), fill_idx(0), fill_recidx(0), dirty(0), ScaleInX(0), ScaleInY(0), ScaleOutX(0), ScaleOutY(0), bkMode(U_TRANSPARENT), textAlign(0), pen_width(0.1) { sizeWnd = sizel_set(0, 0); sizeView = sizel_set(0, 0); winorg = point32_set(0, 0); vieworg = point32_set(0, 0); bkColor = U_RGB(255, 255, 255); // 默认背景色为白色 textColor = U_RGB(0, 0, 0); // 默认文字颜色为黑色 worldTransform.eM11 = 1.0; worldTransform.eM12 = 0.0; worldTransform.eM21 = 0.0; worldTransform.eM22 = 1.0; worldTransform.eDx = 0.0; worldTransform.eDy = 0.0; cur = point32_set(0, 0); } double font_size; // 字体大小(points) double font_ori_value; // 字体旋转角度(度) char *font_name; // 字体名称 int clip_id; // 剪裁区 ID,0 表示无剪裁区 bool stroke_set; // 是否设置了笔画 int stroke_mode; // 笔画模式(枚举) int stroke_idx; // 笔画模式相关索引 int stroke_recidx; // 在记录中用于重现笔画的索引 bool fill_set; // 是否设置了填充 int fill_mode; // 填充模式(枚举) int fill_idx; // 填充模式相关索引 int fill_recidx; // 在记录中用于重现填充的索引 int dirty; // 标识文本、笔画、填充的“脏”状态 double pen_width; U_SIZEL sizeWnd; // 窗口大小 U_SIZEL sizeView; // 视图大小 U_POINTL winorg; // 窗口原点 U_POINTL vieworg; // 视图原点 double ScaleInX, ScaleInY; // 输入缩放 double ScaleOutX, ScaleOutY; // 输出缩放 uint16_t bkMode; // 背景模式(如透明 U_TRANSPARENT 等) U_COLORREF bkColor; // 背景颜色(RGB) U_COLORREF textColor; // 文字颜色(RGB) uint32_t textAlign; // 文本对齐方式 U_XFORM worldTransform; // 世界变换矩阵 U_POINTL cur; // 当前绘图坐标 }; inline constexpr auto EMF_MAX_DC = 128; /** \brief EMF_CALLBACK_DATA 结构,用于回调中传递上下文数据。 */ struct EMF_CALLBACK_DATA { EMF_CALLBACK_DATA() : level(0), E2IdirY(1.0), D2PscaleX(1.0), D2PscaleY(1.0), MM100InX(0), MM100InY(0), PixelsInX(0), PixelsInY(0), PixelsOutX(0), PixelsOutY(0), ulCornerInX(0), ulCornerInY(0), ulCornerOutX(0), ulCornerOutY(0), mask(0), arcdir(U_AD_COUNTERCLOCKWISE), dwRop2(U_R2_COPYPEN), dwRop3(0), MMX(0), MMY(0), m_wordScaleX(0), m_wordScaleY(0), m_renderingOriginX(0), m_renderingOriginY(0), m_objID(-1), m_fillColor(0), m_lineColor(0), m_fillRect(0, 0, 0, 0), drawtype(0), pDesc(nullptr), tri(nullptr), n_obj(0) {} EMF_DEVICE_CONTEXT dc[EMF_MAX_DC + 1]; // 存储各层级的设备上下文信息 int level; // 当前嵌套层级 double E2IdirY; // EMF 的 Y 方向相对于内部(如 Inkscape)的 Y 方向 double D2PscaleX, D2PscaleY; // EMF 设备到页面的缩放 double MM100InX, MM100InY; // 绘图大小(单位:百分之一毫米) double PixelsInX, PixelsInY; // 绘图大小(单位:EMF 像素) double PixelsOutX, PixelsOutY; // 绘图大小(单位:输出端像素,如 Inkscape 像素) double ulCornerInX, ulCornerInY; // 逻辑单位下的左上角(来自 EMF header rclBounds) double ulCornerOutX, ulCornerOutY; // 输出端像素下的左上角 uint32_t mask; // 绘图属性掩码 int arcdir; // 弧线方向:U_AD_COUNTERCLOCKWISE 或 U_AD_CLOCKWISE uint32_t dwRop2; // 二元光栅操作(若为 0 则不使用) uint32_t dwRop3; // 三元光栅操作(若为 0 则不使用) double MMX; // 记录的一些坐标/尺寸,用于后续运算 double MMY; double m_wordScaleX; //充填坐标X比例系数(U_PMR_ScaleWorldTransform) double m_wordScaleY; //充填坐标Y比例系数(U_PMR_ScaleWorldTransform) int m_renderingOriginX; //充填坐标X偏移系数(U_PMR_SetRenderingOrigin) int m_renderingOriginY; //充填坐标Y偏移系数(U_PMR_SetRenderingOrigin) int m_objID; //充填类型ID(U_PMR_Object) COLORREF m_fillColor; //充填颜色(U_PMR_FillRects) COLORREF m_lineColor; //线段颜色(U_PMR_Object) U_PMR_DrawPath CRect8 m_fillRect; //填充区域限制(U_PMR_FillRects) unsigned int drawtype; // 绘制类型,如 U_EMR_FILLPATH, U_EMR_STROKEPATH 等 char *pDesc; // 额外描述信息指针 EMF_STRINGS hatches; // 用于存储填充图案名称 EMF_STRINGS images; // 用于存储图像名称 EMF_STRINGS gradients; // 用于存储渐变名称 EMF_STRINGS clips; // 用于存储裁剪路径名称 TR_INFO *tri; // 文本重组(Text Reassembly)的数据结构指针 int n_obj; // EMF 对象数量 EMF_OBJECT *emf_obj; // 指向 EMF_OBJECT 数组 }; using PEMF_CALLBACK_DATA = EMF_CALLBACK_DATA * ; // boolean operation enum BooleanOp { bool_op_union, // A OR B bool_op_inters, // A AND B bool_op_diff, // A \ B bool_op_symdiff, // A XOR B bool_op_cut, // coupure (pleines) bool_op_slice // coupure (contour) }; #endif//EMF_DEFINE_H