Module: wine Branch: master Commit: 738059baf8ca921f8991e1f12264d53ced2bf69b URL: http://source.winehq.org/git/wine.git/?a=commit;h=738059baf8ca921f8991e1f122...
Author: Vincent Povirk vincent@codeweavers.com Date: Mon Mar 8 16:42:36 2010 -0600
gdiplus: Support decoders with multiple signatures.
---
dlls/gdiplus/image.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 58f3c65..f60f75c 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -2517,10 +2517,11 @@ static const struct image_codec codecs[NUM_CODECS]; static GpStatus get_decoder_info(IStream* stream, const struct image_codec **result) { BYTE signature[8]; + const BYTE *pattern, *mask; LARGE_INTEGER seek; HRESULT hr; UINT bytesread; - int i, j; + int i, j, sig;
/* seek to the start of the stream */ seek.QuadPart = 0; @@ -2528,7 +2529,7 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res if (FAILED(hr)) return hresult_to_status(hr);
/* read the first 8 bytes */ - /* FIXME: This assumes all codecs have one signature <= 8 bytes in length */ + /* FIXME: This assumes all codecs have signatures <= 8 bytes in length */ hr = IStream_Read(stream, signature, 8, &bytesread); if (FAILED(hr)) return hresult_to_status(hr); if (hr == S_FALSE || bytesread == 0) return GenericError; @@ -2537,13 +2538,18 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res if ((codecs[i].info.Flags & ImageCodecFlagsDecoder) && bytesread >= codecs[i].info.SigSize) { - for (j=0; j<codecs[i].info.SigSize; j++) - if ((signature[j] & codecs[i].info.SigMask[j]) != codecs[i].info.SigPattern[j]) - break; - if (j == codecs[i].info.SigSize) + for (sig=0; sig<codecs[i].info.SigCount; sig++) { - *result = &codecs[i]; - return Ok; + pattern = &codecs[i].info.SigPattern[codecs[i].info.SigSize*sig]; + mask = &codecs[i].info.SigMask[codecs[i].info.SigSize*sig]; + for (j=0; j<codecs[i].info.SigSize; j++) + if ((signature[j] & mask[j]) != pattern[j]) + break; + if (j == codecs[i].info.SigSize) + { + *result = &codecs[i]; + return Ok; + } } } }