Hi Jim,
I performed performance analysis with white image so that all conditions are checked in the new branch added. There is no major difference in time taken before and after change. For each input I have tested time taken for drawImage() API to convert from every format to Byte indexed type. For every unique conversion test is run for 100 times. Please find the details: Input type Min before change (ns) Min after change (ns) Max before change (ns) Max after change (ns) Average before change (ns) Average after change (ns) INT_RGB 523437 481491 1230724 1270440 789452 666144 INT_ARGB 500232 493986 12406307 1308816 793384 654015 INT_ARGB_PRE 500233 492201 1037057 981277 710250 699214 INT_BGR 537716 562706 1446703 2046001 862377 863256 3BYTE_BGR 483275 481045 1181638 1384676 651427 580961 4BYTE_ABGR 544410 499786 1292305 968783 690106 683881 4BYTE_ABGR_PRE 504249 505588 1680086 1216445 756101 687750 USHORT_565_RGB 507818 505588 978153 1346746 652908 655782 USHORT_555_RGB 510496 509604 952272 1162004 650418 670811 BYTE_GRAY 481491 478367 1140585 1799231 691160 583250 USHORT_GRAY 506927 507373 1375751 1255267 728202 646902 BYTE_BINARY 541733 496217 1083466 959411 730527 728461 The changes are tested with plain images having primary colors like RED, GREEN, BLUE, BLACK and WHITE. Thanks, Jay -----Original Message----- From: Jim Graham Sent: Friday, February 12, 2016 4:05 AM To: Jayathirth D V; 2d-dev@openjdk.java.net; Philip Race; Prasanta Sadhukhan Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-7116979 : Unexpected pixel colour when converting images to TYPE_BYTE_INDEXED Hi Jayathirth, Did you do any performance analysis of this change? You are adding 6 tests and multiple branches to per-pixel code. The effectiveness of this technique depends on the colormap that we have set up. For the BufferedImage.TYPE_INDEXED constructor we produce a fairly nice colormap, but if someone creates a custom colormap then the colors could be anything. We create a decent inversion for just about any colormap, but that doesn't mean that using only "the best match for solid red" will produce a better result for a dithered approximation for red. It is true that if there is a really good match for red then we should just use that, but if there are no direct matches for red then we may choose to paint a red region with solid orange even though there is another color in the colormap that when mixed with orange approximates a red tone better. For example, if a colormap contains no pure red, but contains: 240, 20, 0 240, 0, 20 (I'm not sure if 20 is within our current error deltas that we use for dithering, but this is an example not a test case.) Then using one of these alone might skew the color towards orange or purple. Using both together in a dither pattern might keep the overall hue impression as red, but with a small amount of noise in its saturation. What types of colormaps was this tested with? ...jim On 2/11/16 6:37 AM, Jayathirth D V wrote: > Hi, > > _Please review the following fix in JDK9:_ > > __ > > Bug : https://bugs.openjdk.java.net/browse/JDK-7116979 > > Webrev : http://cr.openjdk.java.net/~jdv/7116979/webrev.00/ > > Issue : When Image containing black pixels are converted from any > format to Byte Indexed format some of the pixels are not black. They > are following pattern similar to dithering. > > Root cause : When we convert any format type to ByteIndexed we are > adding Error delta values to R,G,B components using dithering indices. > This is causing some pixels values to not point to proper index in > color table. > > Solution : There is no need to add error delta for primary colors > containing basic values in R,G,B components. Exclude such pixels from > delta addition. > > Thanks, > > Jay >