[gdi] bug reading/writing metafiles on sparc
Eric Frias
efrias at syncad.com
Thu Apr 13 10:58:02 CDT 2006
Due to little-endian/big-endian differences, winelib on Sparc can't read
windows metafiles generated on a PC (or on Wine on x86), and conversely
PCs can't read metafiles created on a Sparc. It looks like there are a
few ways this could be fixed, and I wanted to make sure we don't go
about it the wrong way (and that nobody else is working on it).
I think the right thing to do is make the on-disk and in-memory formats
always be little-endian. We would only convert the data to big-endian
format when it is generated or used. GetMetaFileBitsEx and
SetMetaFileBitsEx would return & take the raw data in little-endian format.
The implementation we're considering involves:
- in PlayMetaFileRecord(), convert endianness of paramters as
they're used:
LineTo(hdc, (SHORT)mr->rdParm[1], (SHORT)mr->rdParm[0]);
becomes
LineTo(hdc, (SHORT)convert_word_from_little_endian(mr->rdParm[1]),
(SHORT)convert_word_from_little_endian(mr->rdParm[0]));
- in MFDRV_MetaParam2(), convert endianness
*(mr->rdParm) = param2;
becomes
*(mr->rdParm) = convert_word_to_little_endian(param2);
- some similar conversions necessary for anything that reads/writes
the header
- anything that calls MFDRV_WriteRecord() would need special
handling. These seem to be the functions that embed bitmaps or text in
the METARECORD, so we'll have to be selective about what gets converted
and what gets written as-is.
Is this the right way to go about fixing the problem? Anything we
should look out for?
Thanks,
Eric
More information about the wine-devel
mailing list