Lines 775-820
bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon
Link Here
|
775 |
|
775 |
|
776 |
bool ImplReadDIBFileHeader( SvStream& rIStm, sal_uLong& rOffset ) |
776 |
bool ImplReadDIBFileHeader( SvStream& rIStm, sal_uLong& rOffset ) |
777 |
{ |
777 |
{ |
778 |
sal_uInt32 nTmp32; |
778 |
bool bRet = false; |
779 |
sal_uInt16 nTmp16 = 0; |
|
|
780 |
bool bRet = false; |
781 |
|
779 |
|
782 |
const sal_Int64 nStreamLength (rIStm.Seek(STREAM_SEEK_TO_END)); |
780 |
const sal_Int64 nSavedStreamPos( rIStm.Tell() ); |
783 |
rIStm.Seek(STREAM_SEEK_TO_BEGIN); |
781 |
const sal_Int64 nStreamLength( rIStm.Seek( STREAM_SEEK_TO_END ) ); |
|
|
782 |
rIStm.Seek( nSavedStreamPos ); |
784 |
|
783 |
|
785 |
rIStm >> nTmp16; |
784 |
sal_uInt16 nTmp16 = 0; |
|
|
785 |
rIStm >> nTmp16; |
786 |
|
786 |
|
787 |
if ( ( 0x4D42 == nTmp16 ) || ( 0x4142 == nTmp16 ) ) |
787 |
if ( ( 0x4D42 == nTmp16 ) || ( 0x4142 == nTmp16 ) ) |
788 |
{ |
788 |
{ |
789 |
if ( 0x4142 == nTmp16 ) |
789 |
sal_uInt32 nTmp32; |
790 |
{ |
790 |
if ( 0x4142 == nTmp16 ) |
791 |
rIStm.SeekRel( 12L ); |
791 |
{ |
792 |
rIStm >> nTmp16; |
792 |
rIStm.SeekRel( 12L ); |
793 |
rIStm.SeekRel( 8L ); |
793 |
rIStm >> nTmp16; |
794 |
rIStm >> nTmp32; |
794 |
rIStm.SeekRel( 8L ); |
795 |
rOffset = nTmp32 - 28UL; |
795 |
rIStm >> nTmp32; |
796 |
bRet = ( 0x4D42 == nTmp16 ); |
796 |
rOffset = nTmp32 - 28UL; |
797 |
} |
797 |
bRet = ( 0x4D42 == nTmp16 ); |
798 |
else // 0x4D42 == nTmp16, 'MB' from BITMAPFILEHEADER |
798 |
} |
799 |
{ |
799 |
else // 0x4D42 == nTmp16, 'MB' from BITMAPFILEHEADER |
800 |
rIStm.SeekRel( 8L ); // we are on bfSize member of BITMAPFILEHEADER, forward to bfOffBits |
800 |
{ |
801 |
rIStm >> nTmp32; // read bfOffBits |
801 |
rIStm.SeekRel( 8L ); // we are on bfSize member of BITMAPFILEHEADER, forward to bfOffBits |
802 |
rOffset = nTmp32 - 14UL; // adapt offset by sizeof(BITMAPFILEHEADER) |
802 |
rIStm >> nTmp32; // read bfOffBits |
803 |
bRet = ( rIStm.GetError() == 0UL ); |
803 |
rOffset = nTmp32 - 14UL; // adapt offset by sizeof(BITMAPFILEHEADER) |
804 |
} |
804 |
bRet = ( rIStm.GetError() == 0UL ); |
|
|
805 |
} |
805 |
|
806 |
|
806 |
if (rOffset >= nStreamLength) |
807 |
if ( rOffset >= nStreamLength ) |
807 |
{ |
808 |
{ |
808 |
// Offset claims that image starts past the end of the |
809 |
// Offset claims that image starts past the end of the |
809 |
// stream. Unlikely. |
810 |
// stream. Unlikely. |
810 |
rIStm.SetError( SVSTREAM_FILEFORMAT_ERROR ); |
811 |
rIStm.SetError( SVSTREAM_FILEFORMAT_ERROR ); |
811 |
bRet = false; |
812 |
bRet = false; |
812 |
} |
813 |
} |
813 |
} |
814 |
} |
814 |
else |
815 |
else |
815 |
rIStm.SetError( SVSTREAM_FILEFORMAT_ERROR ); |
816 |
rIStm.SetError( SVSTREAM_FILEFORMAT_ERROR ); |
816 |
|
817 |
|
817 |
return bRet; |
818 |
return bRet; |
818 |
} |
819 |
} |
819 |
|
820 |
|
820 |
bool ImplWriteDIBPalette( SvStream& rOStm, BitmapReadAccess& rAcc ) |
821 |
bool ImplWriteDIBPalette( SvStream& rOStm, BitmapReadAccess& rAcc ) |