Hi Prahalad,

Thank you for reviewing the change.

Yes we don't have any official Microsoft documentation today for 
BITMAPV2INFOHEADER & BITMAPV3INFOHEADER.
We have only references to these undocumented DIB header types in 
http://fileformats.archiveteam.org/wiki/BMP , 
https://forums.adobe.com/message/3272950#3272950 & 
https://en.wikipedia.org/wiki/BMP_file_format 

I think that while BMP specification was getting enhanced Microsoft might have 
supported these formats but after that made BITMAPV4HEADER as officially 
supported format. Because of that we see that still some software like GIMP, 
Adobe Photoshop generate images with BITMAPV2INFOHEADER/ BITMAPV3INFOHEADER.
Also all the official Microsoft documentation present as of now are from 
Windows SDK 2000 so we don't know what was the official journey of BMP 
specification pre 2000.

Regards,
Jay

-----Original Message-----
From: Prahalad Kumar Narayanan 
Sent: Wednesday, March 21, 2018 2:33 PM
To: Philip Race; Jayathirth D V; 2d-dev
Subject: RE: [OpenJDK 2D-Dev] [11] RFR JDK-7031957: DIB header of type 
BITMAPV2INFOHEADER & BITMAPV3INFOHEADER is not supported in BMPImageReader

Hello Jay

Good day to you.

I looked into the code changes and they look good.

Appreciate the links that you have posted on JBS. 
I see that - the only reference material on Bitmap V2/V3 Info Header header 
exists on Adobe Forums (https://forums.adobe.com/message/3272950#3272950)

I could not find official reference from Microsoft describing the same.
Just curious to know : If there was any reason behind not documenting these 
versions of image header.

Thank you
Have a good day

Prahalad N.

----- Original Message -----
From: Phil Race
Sent: Tuesday, March 20, 2018 9:57 PM
To: Jayathirth D V; 2d-dev
Subject: Re: [OpenJDK 2D-Dev] [11] RFR JDK-7031957: DIB header of type 
BITMAPV2INFOHEADER & BITMAPV3INFOHEADER is not supported in BMPImageReader

In that case the patch is fine.

-phil.
On 03/20/2018 12:15 AM, Jayathirth D V wrote:
HI Phil,
 
Please find my observation:
In case of DIB header type BITMAPINFOHEADER/ BITMAPV4HEADER/ BITMAPV5HEADER, 
Microsoft 
documentation(https://msdn.microsoft.com/en-us/library/dd183376(v=vs.85).aspx ) 
mentions that mask values are valid only when compression type is BI_BITFIELDS. 
When compression type is BI_RGB which ii no compression, Microsoft document 
mentions that
 
1) For 16 bpp : "The relative intensities of red, green, and blue are 
represented with five bits for each color component. The value for blue is in 
the least significant five bits, followed by five bits each for green and red. 
The most significant bit is not used.". So basically it should be RGB555.
2) For 32 bpp : "Each DWORD in the bitmap array represents the relative 
intensities of blue, green, and red for a pixel. The value for blue is in the 
least significant 8 bits, followed by 8 bits each for green and red. The high 
byte in each DWORD is not used". So basically it should be XRGB8888.
 
This is why we have redMask = 0x7C00, greenMask = 0x3E0, blueMask = 0x1F in 
case of 16bpp and redMask   = 0x00FF0000, greenMask = 0x0000FF00, blueMask  = 
0x000000FFfor 32bpp for all the three standard formats BITMAPINFOHEADER, 
BITMAPV4HEADER and BITMAPV5HEADER.
 
Since BITMAPV2INFOHEADER & BITMAPV3INFOHEADER support falls in between that of 
other Microsoft documented DIB header types it is good that we follow the same 
approach in case of BITMAPV2INFOHEADER & BITMAPV3INFOHEADER also.
 
Please let us know your inputs.
 
Thanks,
Jay
 
From: Phil Race
Sent: Monday, March 19, 2018 11:07 PM
To: Jayathirth D V; 2d-dev
Subject: Re: [OpenJDK 2D-Dev] [11] RFR JDK-7031957: DIB header of type 
BITMAPV2INFOHEADER & BITMAPV3INFOHEADER is not supported in BMPImageReader
 
Since the principal addition of these formats is to add explicit fields for 
supporting the bitmasks for accessing R/G/B/A it seems odd to see there is code 
like this which ignores it when the data is uncompressed by using these 
hardcoded values :
 456                             if ((int)compression == BI_RGB) {
 457                                 redMask = 0x7C00;
 458                                 greenMask = 0x3E0;
 459                                 blueMask = 0x1F;

I do see that it seems likely you copied this from the 108/124 case but I'd 
like to see some proof that this is correct.


-phil.

On 03/14/2018 03:39 AM, Jayathirth D V wrote:
Hello All,
 
Please review the following solution in JDK11 :
 
Bug : https://bugs.openjdk.java.net/browse/JDK-7031957
Webrev : http://cr.openjdk.java.net/~jdv/7031957/webrev.00/ 
 
Issue: If we try to read any BMP image of DIB header type BITMAPV2INFOHEADER/ 
BITMAPV3INFOHEADER, we get IOException mentioning the BMP image type in not yet 
implemented.
 
Root cause:  BMPImageReader doesn't support DIB header types 
BITMAPV2INFOHEADER/ BITMAPV3INFOHEADER we support only BITMAPCOREHEADER, 
BITMAPINFOHEADER, BITMAPV4HEADER & BITMAPV5HEADER.
 
Solution: Many other tools like GIMP, Microsoft PowerPoint, IrfanView support 
BITMAPV2INFOHEADER & BITMAPV3INFOHEADER format BMP images. We can consider 
BITMAPV2INFOHEADER & BITMAPV3INFOHEADER header types having functionality in 
between that of BITMAPINFOHEADER & BITMAPV4HEADER. BITMAPINFOHEADER with type 
BITFIELDS & extra 4 bytes for alpha channel or First 56 bytes of BITMAPV4HEADER 
is nothing but BITMAPV3INFOHEADER.
 
To support BITMAPV2INFOHEADER & BITMAPV3INFOHEADER we can use similar approach 
of what we are doing while decoding first 56 bytes under BITMAPV4HEADER. So I 
have added additional "if()" to do the same, we can merge decoding of 
BITMAPV2INFOHEADER & BITMAPV3INFOHEADER at the same place where we are decoding 
BITMAPV4HEADER but we need to add many branch conditions to follow that 
approach.
 
Thanks,
Jay
 
 

Reply via email to