]>
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
12 // Copyright: (c) Petr Smilauer
13 // Licence: wxWindows licence
14 /////////////////////////////////////////////////////////////////////////////
17 #pragma implementation
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
36 // Returns the number of hotspots, and the array of hotspots.
39 // int n = ParseSHG("thing.shg", &array);
41 int ParseSHG( const char* fileName
, HotSpot
**hotspots
)
42 { FILE* fSHG
= fopen( fileName
, "rb");
49 //first, look at offset OFF_OFFSET to get another offset :-)
50 fseek( fSHG
, OFF_OFFSET
, SEEK_SET
);
51 offset
= 0L; // init whole 4-byte variable
52 fread( &offset
, 2, 1, fSHG
); // get the offset in first two bytes..
53 if(offset
== 0) // if zero, used next DWORD field
54 fread( &offset
, 4, 1, fSHG
);// this is our offset for very long DIB
55 offset
+= 9; // don't know hot this delta comes-about
56 if(fseek( fSHG
, offset
, SEEK_SET
) != 0)
59 return -1; // this is probably because incorrect offset calculation.
61 fread( &nHotspots
, 2, 1, fSHG
);
63 *hotspots
= new HotSpot
[nHotspots
];
65 int nMacroStrings
= 0;
67 fread( &nMacroStrings
, 2, 1, fSHG
); // we can ignore the macros, as this is
68 // repeated later, but we need to know how much to skip
69 fseek( fSHG
, 2, SEEK_CUR
); // skip another 2 bytes I do not understand ;-)
74 int sizeOf
= sizeof( ShgInfoBlock
);
76 for( i
= 0 ; i
< nHotspots
; ++i
)
78 fread( &sib
, sizeOf
, 1, fSHG
); // read one hotspot' info
80 (*hotspots
)[i
].type
= (HotspotType
)(sib
.hotspotType
& 0xFB);
81 (*hotspots
)[i
].left
= sib
.left
;
82 (*hotspots
)[i
].top
= sib
.top
;
83 (*hotspots
)[i
].right
= sib
.left
+ sib
.width
;
84 (*hotspots
)[i
].bottom
= sib
.top
+ sib
.height
;
85 (*hotspots
)[i
].IsVisible
= ((sib
.hotspotType
& 4) == 0);
86 (*hotspots
)[i
].szHlpTopic_Macro
[0] = '\0';
88 // we have it...now read-off the macro-string block
90 fseek( fSHG
, nMacroStrings
, SEEK_CUR
); //nMacroStrings is byte offset...
91 // and, at the last, read through the strings: hotspot-id[ignored], then topic/macro
93 for( i
= 0 ; i
< nHotspots
; ++i
)
95 while( (c
= fgetc( fSHG
)) != 0)
99 while( (c
= fgetc( fSHG
)) != 0)
101 (*hotspots
)[i
].szHlpTopic_Macro
[j
] = c
;
104 (*hotspots
)[i
].szHlpTopic_Macro
[j
] = 0;
111 // Convert Windows .SHG file to HTML map file
113 bool SHGToMap(char *filename
, char *defaultFile
)
115 // Test the SHG parser
116 HotSpot
*hotspots
= NULL
;
117 int n
= ParseSHG(filename
, &hotspots
);
122 sprintf(buf
, "Converting .SHG file to HTML map file: there are %d hotspots in %s.", n
, filename
);
126 strcpy(outBuf
, filename
);
127 StripExtension(outBuf
);
128 strcat(outBuf
, ".map");
130 FILE *fd
= fopen(outBuf
, "w");
133 OnError("Could not open .map file for writing.");
138 fprintf(fd
, "default %s\n", defaultFile
);
139 for (int i
= 0; i
< n
; i
++)
141 char *refFilename
= "??";
143 TexRef
*texRef
= FindReference(hotspots
[i
].szHlpTopic_Macro
);
145 refFilename
= texRef
->refFile
;
149 sprintf(buf
, "Warning: could not find hotspot reference %s", hotspots
[i
].szHlpTopic_Macro
);
152 fprintf(fd
, "rect %s %d %d %d %d\n", refFilename
, (int)hotspots
[i
].left
, (int)hotspots
[i
].top
,
153 (int)hotspots
[i
].right
, (int)hotspots
[i
].bottom
);