1 # include "bitmapConfig.h"
2
3 # include "bmintern.h"
4 # include "bmio.h"
5 # include <appDebugon.h>
6 # include <sioFileio.h>
7 # include <sioHex.h>
8 # include <geoUnits.h>
9
10 /************************************************************************/
11 /* */
12 /* Write a bitmap to an rtf stream. */
13 /* */
14 /************************************************************************/
15
bmRtfStartRtf(const BitmapDescription * bd,const char * type,SimpleOutputStream * sos)16 static int bmRtfStartRtf( const BitmapDescription * bd,
17 const char * type,
18 SimpleOutputStream * sos )
19 {
20 sioOutPrintf( sos, "{\\rtf1\\ansi\r\n" );
21 sioOutPrintf( sos, "\\deff1\r\n" );
22 sioOutPrintf( sos, "{\\fonttbl{\\f1\\fswiss Helvetica;}}\r\n" );
23 sioOutPrintf( sos, "\\sectd\\f1\\fs20\r\n" );
24
25 sioOutPrintf( sos, "{\\pict%s", type );
26
27 return 0;
28 }
29
bmRtfImageSize(const BitmapDescription * bd,SimpleOutputStream * sos)30 static int bmRtfImageSize( const BitmapDescription * bd,
31 SimpleOutputStream * sos )
32 {
33 int picwgoal;
34 int pichgoal;
35 int picw;
36 int pich;
37
38 bmImageSizeTwips( &picwgoal, &pichgoal, bd );
39 picw= (int)( 100000.0* picwgoal )/ ( 20* POINTS_PER_M );
40 pich= (int)( 100000.0* pichgoal )/ ( 20* POINTS_PER_M );
41
42 sioOutPrintf( sos, "\\picw%d\\pich%d\\picwgoal%d\\pichgoal%d\r\n",
43 picw, pich, picwgoal, pichgoal );
44
45 return 0;
46 }
47
bmRtfWritePngRtf(const BitmapDescription * bd,const unsigned char * buffer,SimpleOutputStream * sos)48 int bmRtfWritePngRtf( const BitmapDescription * bd,
49 const unsigned char * buffer,
50 SimpleOutputStream * sos )
51 {
52 int rval= 0;
53 SimpleOutputStream * sosHex= (SimpleOutputStream *)0;
54 const int lastNl= 1;
55
56 bmRtfStartRtf( bd, "\\pngblip", sos );
57 bmRtfImageSize( bd, sos );
58
59 sosHex= sioOutHexOpenFolded( sos, 72, lastNl );
60 if ( ! sosHex )
61 { XDEB(sosHex); return -1; }
62
63 rval= bmPngWritePng( bd, buffer, sosHex );
64
65 sioOutClose( sosHex );
66 sioOutPrintf( sos, "}\\par}\r\n" );
67
68 return rval;
69 }
70
bmRtfWriteJfifRtf(const BitmapDescription * bd,const unsigned char * buffer,SimpleOutputStream * sos)71 int bmRtfWriteJfifRtf( const BitmapDescription * bd,
72 const unsigned char * buffer,
73 SimpleOutputStream * sos )
74 {
75 int rval= 0;
76 SimpleOutputStream * sosHex= (SimpleOutputStream *)0;
77 const int lastNl= 1;
78
79 bmRtfStartRtf( bd, "\\jpegblip", sos );
80 bmRtfImageSize( bd, sos );
81
82 sosHex= sioOutHexOpenFolded( sos, 72, lastNl );
83 if ( ! sosHex )
84 { XDEB(sosHex); return -1; }
85
86 rval= bmJpegWriteJfif( bd, buffer, sosHex );
87
88 sioOutClose( sosHex );
89 sioOutPrintf( sos, "}\\par}\r\n" );
90
91 return rval;
92 }
93
bmRtfWriteWmfRtf(const BitmapDescription * bd,const unsigned char * buffer,SimpleOutputStream * sos)94 int bmRtfWriteWmfRtf( const BitmapDescription * bd,
95 const unsigned char * buffer,
96 SimpleOutputStream * sos )
97 {
98 int rval= 0;
99 SimpleOutputStream * sosHex= (SimpleOutputStream *)0;
100 const int lastNl= 1;
101
102 sosHex= sioOutHexOpenFolded( sos, 72, lastNl );
103 if ( ! sosHex )
104 { XDEB(sosHex); return -1; }
105
106 bmRtfStartRtf( bd, "\\wmetafile8\\picbmp", sos );
107 sioOutPrintf( sos, "\\picbpp%d", bd->bdBitsPerPixel );
108 bmRtfImageSize( bd, sos );
109
110 rval= bmWmfWriteWmf( bd, buffer, sosHex );
111
112 sioOutClose( sosHex );
113 sioOutPrintf( sos, "}\\par}\r\n" );
114
115 return rval;
116 }
117
118 /************************************************************************/
119 /* */
120 /* Write a bitmap to an rtf stream. */
121 /* */
122 /************************************************************************/
123
bmRtfWriteRtf(const BitmapDescription * bd,const unsigned char * buffer,SimpleOutputStream * sos)124 int bmRtfWriteRtf( const BitmapDescription * bd,
125 const unsigned char * buffer,
126 SimpleOutputStream * sos )
127 { return bmRtfWritePngRtf( bd, buffer, sos ); }
128
129 /************************************************************************/
130 /* */
131 /* Can write a bitmap to an RTF file? */
132 /* */
133 /************************************************************************/
134
bmCanWriteRtfFile(const BitmapDescription * bd,int privateFormat)135 int bmCanWriteRtfFile( const BitmapDescription * bd,
136 int privateFormat )
137 {
138 switch( privateFormat )
139 {
140 case 0:
141 return bmCanWritePngFile( bd, 1 );
142 case 1:
143 return bmCanWriteJpegFile( bd, 1 );
144 case 2:
145 return bmCanWriteWmfFile( bd, 1 );
146 default:
147 LDEB(privateFormat); return -1;
148 }
149 }
150
bmWriteRtfFile(const MemoryBuffer * filename,const unsigned char * buffer,const BitmapDescription * bd,int privateFormat)151 int bmWriteRtfFile( const MemoryBuffer * filename,
152 const unsigned char * buffer,
153 const BitmapDescription * bd,
154 int privateFormat )
155 {
156 int rval= 0;
157 SimpleOutputStream * sos;
158
159 sos= sioOutFileioOpen( filename );
160 if ( ! sos )
161 { XDEB(sos); return -1; }
162
163 switch( privateFormat )
164 {
165 case 0:
166 rval= bmRtfWritePngRtf( bd, buffer, sos );
167 break;
168 case 1:
169 rval= bmRtfWriteJfifRtf( bd, buffer, sos );
170 break;
171 case 2:
172 rval= bmRtfWriteWmfRtf( bd, buffer, sos );
173 break;
174 default:
175 LDEB(privateFormat); rval= -1;
176 }
177
178 sioOutClose( sos );
179
180 return rval;
181 }
182
183