]>
git.saurik.com Git - wxWidgets.git/blob - utils/tex2rtf/src/readshg.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Petr Smilauer's .SHG (Segmented Hypergraphics file) reading
5 // Note: .SHG is undocumented (anywhere!) so this is
7 // and guesswork at its best.
8 // Author: Petr Smilauer
9 // Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support
13 // Copyright: (c) Petr Smilauer
14 // Licence: wxWindows licence
15 /////////////////////////////////////////////////////////////////////////////
17 // For compilers that support precompilation, includes "wx.h".
18 #include "wx/wxprec.h"
33 // Returns the number of hotspots, and the array of hotspots.
36 // int n = ParseSHG("thing.shg", &array);
38 int ParseSHG( const wxChar
* fileName
, HotSpot
**hotspots
)
39 { FILE* fSHG
= wxFopen( fileName
, _T("rb"));
46 //first, look at offset OFF_OFFSET to get another offset :-)
47 fseek( fSHG
, OFF_OFFSET
, SEEK_SET
);
48 offset
= 0L; // init whole 4-byte variable
49 fread( &offset
, 2, 1, fSHG
); // get the offset in first two bytes..
50 if(offset
== 0) // if zero, used next DWORD field
51 fread( &offset
, 4, 1, fSHG
);// this is our offset for very long DIB
52 offset
+= 9; // don't know hot this delta comes-about
53 if(fseek( fSHG
, offset
, SEEK_SET
) != 0)
56 return -1; // this is probably because incorrect offset calculation.
58 fread( &nHotspots
, 2, 1, fSHG
);
60 *hotspots
= new HotSpot
[nHotspots
];
62 int nMacroStrings
= 0;
64 fread( &nMacroStrings
, 2, 1, fSHG
); // we can ignore the macros, as this is
65 // repeated later, but we need to know how much to skip
66 fseek( fSHG
, 2, SEEK_CUR
); // skip another 2 bytes I do not understand ;-)
71 int sizeOf
= sizeof( ShgInfoBlock
);
73 for( i
= 0 ; i
< nHotspots
; ++i
)
75 fread( &sib
, sizeOf
, 1, fSHG
); // read one hotspot' info
77 (*hotspots
)[i
].type
= (HotspotType
)(sib
.hotspotType
& 0xFB);
78 (*hotspots
)[i
].left
= sib
.left
;
79 (*hotspots
)[i
].top
= sib
.top
;
80 (*hotspots
)[i
].right
= sib
.left
+ sib
.width
;
81 (*hotspots
)[i
].bottom
= sib
.top
+ sib
.height
;
82 (*hotspots
)[i
].IsVisible
= ((sib
.hotspotType
& 4) == 0);
83 (*hotspots
)[i
].szHlpTopic_Macro
[0] = '\0';
85 // we have it...now read-off the macro-string block
87 fseek( fSHG
, nMacroStrings
, SEEK_CUR
); //nMacroStrings is byte offset...
88 // and, at the last, read through the strings: hotspot-id[ignored], then topic/macro
90 for( i
= 0 ; i
< nHotspots
; ++i
)
92 while( (c
= fgetc( fSHG
)) != 0)
96 while( (c
= fgetc( fSHG
)) != 0)
98 (*hotspots
)[i
].szHlpTopic_Macro
[j
] = (wxChar
)c
;
101 (*hotspots
)[i
].szHlpTopic_Macro
[j
] = 0;
108 // Convert Windows .SHG file to HTML map file
110 bool SHGToMap(wxChar
*filename
, wxChar
*defaultFile
)
112 // Test the SHG parser
113 HotSpot
*hotspots
= NULL
;
114 int n
= ParseSHG(filename
, &hotspots
);
119 wxSnprintf(buf
, sizeof(buf
), _T("Converting .SHG file to HTML map file: there are %d hotspots in %s."), n
, filename
);
123 wxStrcpy(outBuf
, filename
);
124 StripExtension(outBuf
);
125 wxStrcat(outBuf
, _T(".map"));
127 FILE *fd
= wxFopen(outBuf
, _T("w"));
130 OnError(_T("Could not open .map file for writing."));
135 wxFprintf(fd
, _T("default %s\n"), defaultFile
);
136 for (int i
= 0; i
< n
; i
++)
138 wxChar
*refFilename
= _T("??");
140 TexRef
*texRef
= FindReference(hotspots
[i
].szHlpTopic_Macro
);
142 refFilename
= texRef
->refFile
;
146 wxSnprintf(buf
, sizeof(buf
), _T("Warning: could not find hotspot reference %s"), hotspots
[i
].szHlpTopic_Macro
);
149 wxFprintf(fd
, _T("rect %s %d %d %d %d\n"), refFilename
, (int)hotspots
[i
].left
, (int)hotspots
[i
].top
,
150 (int)hotspots
[i
].right
, (int)hotspots
[i
].bottom
);
152 wxFprintf(fd
, _T("\n"));