//--------------------------------------------------------------------------- void File_Bmp::Read_Buffer_Continue() { //Parsing int32u Size, DIB_Size, Offset; Element_Begin1("File header"); Skip_C2( "Magic"); Get_L4 (Size, "Size"); Skip_L2( "Reserved"); Skip_L2( "Reserved"); Get_L4 (Offset, "Offset of data"); Element_End0(); FILLING_BEGIN(); if (Size!=(int32u)-1 && Size!=File_Size) { Reject("BMP"); return; } Accept("BMP"); Fill(Stream_General, 0, General_Format, "Bitmap"); Stream_Prepare(Stream_Image); FILLING_END(); Element_Begin1("DIB header"); Peek_L4 (DIB_Size); switch (DIB_Size) { case 12 : BitmapCoreHeader(1); break; case 40 : BitmapInfoHeader(1); break; case 52 : BitmapInfoHeader(2); break; case 56 : BitmapInfoHeader(3); break; case 64 : BitmapCoreHeader(2); break; case 108 : BitmapInfoHeader(4); break; case 124 : BitmapInfoHeader(5); break; default : if (DIB_Size>124) { BitmapInfoHeader((int8u)-1); //Future versions of BitmapInfoHeader (OS/2 is abandonned) Skip_XX(14+124-Element_Offset, "Unknown"); } } Element_End0(); if (Element_Offset<Offset) Skip_XX(Offset-Element_Offset, "Other header data"); Skip_XX(File_Size-Offset, "Image data"); //No need of more Finish("BMP"); }
//--------------------------------------------------------------------------- void File_Bmp::Read_Buffer_Continue() { //Parsing int32u Size, DIB_Size, Offset; Element_Begin("File header", 14); Skip_C2( "Magic"); Get_L4 (Size, "Size"); Skip_L2( "Reserved"); Skip_L2( "Reserved"); Get_L4 (Offset, "Offset of data"); Element_End(); FILLING_BEGIN(); if (Size!=File_Size) { Reject("BMP"); return; } Accept("BMP"); Fill(Stream_General, 0, General_Format, "Bitmap"); Stream_Prepare(Stream_Image); FILLING_END(); Element_Begin("DIB header"); Peek_L4 (DIB_Size); switch (DIB_Size) { case 12 : Skip_XX(DIB_Size-4, "OS/2 v1 header"); break; case 40 : BitmapInfoHeader(); break; case 52 : Skip_XX(DIB_Size-4, "BitmapV2Header"); break; case 56 : Skip_XX(DIB_Size-4, "BitmapV3Header"); break; case 64 : Skip_XX(DIB_Size-4, "OS/2 v2 header"); break; case 108 : BitmapV4Header(); break; case 124 : Skip_XX(DIB_Size-4, "BitmapV5Header"); break; default : Skip_XX(DIB_Size-4, "Unknown header"); ; } Element_End(); Skip_XX(Offset-Element_Offset, "Color palette"); Skip_XX(Element_Size-Offset, "Bitmap data"); //No need of more Finish("BMP"); }