Thanks Phil and Jim for your review. 

-----Original Message-----
From: Philip Race 
Sent: Friday, May 06, 2016 4:17 AM
To: Jayathirth D V
Cc: Jim Graham; 2d-dev@openjdk.java.net
Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-7116979 : Unexpected pixel 
colour when converting images to TYPE_BYTE_INDEXED

Looks good to me.

-phil.

On 5/4/16, 10:46 PM, Jayathirth D V wrote:
> Hi,
>
> Gentle reminder. Please review.
>
> Thanks,
> Jay
>
> -----Original Message-----
> From: Jayathirth D V
> Sent: Monday, May 02, 2016 4:05 PM
> To: Jim Graham; Philip Race
> Cc: 2d-dev@openjdk.java.net
> Subject: RE: [OpenJDK 2D-Dev] Review Request for JDK-7116979 : 
> Unexpected pixel colour when converting images to TYPE_BYTE_INDEXED
>
> Hi Jim,
>
> Thanks for your valuable review.
> I verified what you have mentioned and we are doing the same while mapping 
> colormap to InverseLUT.
> I also tried populating InverseLUT serially from 0 to 255 index and with this 
> change for white color also test is passing because we are selecting 215 
> index for white instead of 255.
>
> But I have to figure out a way for calculating what should be the ideal 
> colormap index we should store in InverseLUT in INSERTNEW macro.
> For this I have raised separate bug : 
> https://bugs.openjdk.java.net/browse/JDK-8155814 .
>
> After fixing new bug I will add testing of white color in JDK-7116979. I 
> think we can check-in present changes and work on new bug. Please let me know 
> your inputs.
>
> Thanks,
> Jay
>
> -----Original Message-----
> From: Jim Graham
> Sent: Monday, May 02, 2016 3:46 AM
> To: Jayathirth D V; Philip Race
> Cc: 2d-dev@openjdk.java.net
> Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-7116979 : 
> Unexpected pixel colour when converting images to TYPE_BYTE_INDEXED
>
> Ugh.  I took a look at the inverse colormap creation code and believe I see 
> the problem.  It first takes all of the colors in the colormap and inserts a 
> backmapping from their index in the "inverse cube" back to the color in the 
> colormap.  If an entry already has an index assigned, it skips it, even if 
> the new color is a better match for the cell in the inverse cube than the 
> index it already contains.  This isn't a simulation of "take each entry in 
> the cube and pick the best color in the map for it".  The INSERT macro should 
> check which of the two options are better in the case where the cell already 
> has an index assigned.
>
> For the default colormaps, WHITE seems to be the color that takes a hit, but 
> other custom colormaps could end up with poor choices for a lot of different 
> colors, particularly the primaries.  If you test with a colormap that has, 
> for instance:  primaries with +/- 7, followed by the pure primaries, none of 
> the primaries will be filled well.
>
> Note that one silly ideosyncracy of the way the loop is encoded in the above 
> case causes the problem for white.  It simultaneously iterates the color cube 
> from 0 and from 255 towards the middle, which means we handle BLACK from the 
> rgb cube first and it wins the battle for its cell, but when we process WHITE 
> at the end of the rgb cube, we've already processed a "very close gray" from 
> the top of the colormap before it and that non-WHITE color won the battle for 
> the WHITE cell.  I have no idea why the loop was written that way, though.  I 
> can't imagine that it would help performance much in any case and that seems 
> to be the only reason to do it that way...?
>
> This should be filed as a separate bug as it will otherwise cause us to use 
> less than effective colors in our dithering for reasons beyond this current 
> case of whether or not white maps well.  Fixing it would also allow us to 
> test WHITE in this test case...
>
>                       ...jim
>
> On 4/30/2016 12:59 AM, Jayathirth D V wrote:
>> Hi Jim,
>>
>> As I have mentioned in my previously, It looks like we take index from 
>> (31,31) in cube for white color which is gray value increment from color-map 
>> in 255 index.
>>
>> "I have observed that in case of white color we are picking (252,252,252) 
>> and not (255,255,255) from color-map. What I have observed that out of 256 
>> places we are storing RGB colors at start and then gray values. So we are 
>> picking final gray value and not in between white value. That's why I am not 
>> verifying white color validity in test case."
>>
>> There is no variable to find out exactly until where we are storing RGB 
>> colors in color-map as it can vary if user provides custom color-map. This 
>> looks like completely different issue of not extracting proper value for 
>> white color.
>>
>> Thanks,
>> Jay
>>
>> -----Original Message-----
>> From: Jim Graham
>> Sent: Saturday, April 30, 2016 4:43 AM
>> To: Jayathirth D V; Philip Race
>> Cc: 2d-dev@openjdk.java.net
>> Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-7116979 :
>> Unexpected pixel colour when converting images to TYPE_BYTE_INDEXED
>>
>> The code changes look good.
>>
>> One question on the test case, though - why is Color.WHITE commented out in 
>> the test case?  Was it failing?
>>
>>                      ...jim
>>
>> On 4/29/16 4:45 AM, Jayathirth D V wrote:
>>> Hi,
>>>
>>> Thanks Phil&  Jim for your inputs.
>>> I have made all recommended changes.
>>> Please find updated webrev for review :
>>> http://cr.openjdk.java.net/~jdv/7116979/webrev.02/
>>>
>>> Thanks,
>>> Jay
>>>
>>> -----Original Message-----
>>> From: Phil Race
>>> Sent: Tuesday, April 26, 2016 11:56 PM
>>> To: Jim Graham
>>> Cc: Jayathirth D V; 2d-dev@openjdk.java.net
>>> Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-7116979 :
>>> Unexpected pixel colour when converting images to TYPE_BYTE_INDEXED
>>>
>>> On 04/22/2016 06:56 PM, Jim Graham wrote:
>>>> Hi Jay,
>>>>
>>>> It looks like it will work, but there are some inconsistencies in 
>>>> the code that we should address and a couple of optimizations.
>>>>
>>>> First, there is a mixture of using "int" and "jboolean" for the 
>>>> type of the new boolean parameter.  It would be great if we could 
>>>> just declare it as jboolean in the structures, but it looks like 
>>>> those are limited to basic C types.  It seems a little clunky to 
>>>> mix types like this, but I'd be interested in hearing what Phil 
>>>> says.  I think it would be fine to just use int throughout.
>>>    From the ones I've seen may be much better to just use int 
>>> throughout. Eg
>>>
>>>    264 static jboolean calculatePrimaryColorsAprroximation(int* 
>>> cmap, unsigned char* cube, int cube_size) {
>>>
>>> aside from having a typo in the name also makes a fair amount of internal 
>>> uses of jboolean and JNI_TRUE/JNI_FALSE.
>>>
>>> It then does this
>>>
>>>    385         cData->representsPrimary = 
>>> calculatePrimaryColorsAprroximation(pRgb, cData->img_clr_tbl, 32);
>>>
>>> ie stores it in an int .. I see no reason for this as there is no JNI code 
>>> involved.
>>>
>>>
>>> Moreover this usage of the variables declared as boolean then has 
>>> code like
>>>
>>>    174               (representsPrimary == 1))) { \
>>>
>>>
>>> -phil.
>>>
>>>> I'd suggest a name change:
>>>>      representsPrimary =>  representsPrimaries (since there are 
>>>> multiple primary colors)
>>>>
>>>> The place to load the variable for testing in the ByteIndexed 
>>>> macros would be in the "InitByteIndexedStoreVarsY" macro where it 
>>>> sets up the "PREFIX ## InvLut" variable.  It should also use a 
>>>> PREFIX.  Look through those macros for wherever the InvLut value is 
>>>> declared and initialized, and follow a similar pattern for "PREFIX 
>>>> ##<somename>".
>>>> You could use "representsPrimaries" for the name here too, but it 
>>>> could also be shortened to just "repPrims" or "optPrims" since the 
>>>> macros are all centralized here.
>>>>
>>>> Once you do the preceding step, you can delete a lot of lines that 
>>>> pre-load the "representsPrimaries" in the calling macros, which 
>>>> should also eliminate a lot of files from the webrev.
>>>>
>>>> In the code in ByteIndexed.h:StoreByteIndexedFrom3ByteRgb() that 
>>>> tests the variable, I'd just test "representsPrimary" with no "=="
>>>> rather than comparing it to 1 since it is a boolean, not (really) an 
>>>> integer.
>>>>
>>>> With respect to the new function that tests the primary matches (in 
>>>> ByteIndexed.c), some of the code is unnecessarily complicated:
>>>>
>>>> - When you find a color match failure (lines 301, et al), you could 
>>>> just return false directly.  As it stands, you set a variable and 
>>>> break, but the break only breaks out of 1 of 3 nested if 
>>>> statements, so it doesn't save any calculations.  Just return false 
>>>> directly as a single failure means the answer is "no".
>>>>
>>>> - your r, g, and b values are extracted from the color in the wrong 
>>>> order near line 285.  r involves a shift of 16, and b involves no 
>>>> shift.  I suppose this is paired with computing the dr and db 
>>>> values with the wrong indices or this technique wouldn't work, but 
>>>> it is clunky to name the variables inconsistently with the data 
>>>> they actually hold.
>>>>
>>>> - you use parentheses on the left-hand side of an assignment when 
>>>> you extract the r, g, and b values (also near line 285).  You don't 
>>>> need parentheses on that side of an assignment operator.
>>>>
>>>> There are several things that are more complicated than they need 
>>>> to be with your testing lines.  They use a lot more computations 
>>>> than you need.  For instance:
>>>>
>>>> - You test the i,j,k using a modulus operation (lines 298, 312, 
>>>> 326), but really you just need to know if it is 0 or not-0, so just 
>>>> test it for ==0 or !=0.
>>>> - rather than using multiplication and modulus to assign the 
>>>> dr,dg,db values near line 291, why not just use "dr = (i == 0) ? 0 : 255;"?
>>>> - the tests for range use a separate subtraction and a compare, 
>>>> when they could be inlined.
>>>>
>>>> First, I'd get rid of the "represents_primary" variable entirely 
>>>> and then rewrite the whole tail end of the loop body from 291 to 
>>>> the end of the loop as:
>>>>
>>>> if (i == 0) {
>>>>      if (r>  delta) return false;
>>>> } else {
>>>>      if (r<  255-delta) return false; } // 2 more similar tests for 
>>>> j/g and k/b
>>>>
>>>> Then "return true" at the end of the function if it reaches there.
>>>> Keep in mind that the mapping of ijk to rgb might be affected if 
>>>> you fix the shifts used to extract the rgb components from color...
>>>>
>>>>              ...jim
>>>>
>>>> On 4/20/2016 2:46 AM, Jayathirth D V wrote:
>>>>> Hi Jim,
>>>>>
>>>>> As discussed we will not add dithering error values to primary 
>>>>> colors with color map which represents Primary colors
>>>>> approximately(+/-5 delta).
>>>>> I have made changes based on this suggestion and added new 
>>>>> function to calculate whether color map represents primary colors 
>>>>> approximately or not.
>>>>> If it represents only then we will avoid adding dithering error 
>>>>> values in case ByteIndexed destination.
>>>>>
>>>>> I have observed that in case of white color we are picking
>>>>> (252,252,252) or (246,246,246) and not (255,255,255) from colormap.
>>>>> What I have observed that out of 256 places we are storing RGB 
>>>>> colors at start and then gray values. So we are picking final gray 
>>>>> value and not in between white value. That's why I am not 
>>>>> verifying white color validity in test case.
>>>>>
>>>>> Please find updated webrev for review :
>>>>> http://cr.openjdk.java.net/~jdv/7116979/webrev.01/
>>>>>
>>>>> Thanks,
>>>>> Jay
>>>>>
>>>>> -----Original Message-----
>>>>> From: Jim Graham
>>>>> Sent: Saturday, February 20, 2016 3:02 AM
>>>>> To: Jayathirth D V
>>>>> Cc: 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,
>>>>>
>>>>> Thank you for attaching the detailed logs, but I don't have a 
>>>>> program that can deal with the 7z files.  Can you summarize what 
>>>>> was learned from them?
>>>>>
>>>>> Also, the colormap you created, while subset, was a perfectly 
>>>>> scaled cube.  I was referring more to a random colormap where you 
>>>>> might have
>>>>> 2 colors close to a primary, but neither is on a line from the 
>>>>> primary to the 0.5 gray value so each has a different hue.  That's 
>>>>> something that can only be evaluated visually.  One example of 
>>>>> randomized colormaps is when we display via X11 onto an 8-bit 
>>>>> display.  That probably never happens any more, but we may not be 
>>>>> able to allocate colors in the colormap in such a case and if 
>>>>> another program has already allocated most of the dynamic colormap 
>>>>> then we would not be able to add our own colors.
>>>>>
>>>>> This could be dealt with by simply marking our standard colormap 
>>>>> as having primaries, or by scanning any given colormap and marking 
>>>>> it if it has primaries, and then only perform this code on 
>>>>> colormaps with the primaries.  Solving it for our own colormap (or 
>>>>> solving it for any colormap that has all primaries) would likely 
>>>>> solve it for 99% of the vanishingly small number of developers who might 
>>>>> run into this.
>>>>>
>>>>> But, in the end, what would we accomplish by adding this one very 
>>>>> targeted fix?
>>>>>
>>>>> I'm also curious where the push for this is coming from.  While we 
>>>>> aren't perfect here, so much of the world today is focused on 
>>>>> lossless image formats that I don't imagine there is much need for 
>>>>> really good 8-bit indexed image support any more...?
>>>>>
>>>>> If anything, spatial dithering is considered a very low quality 
>>>>> algorithm and error propagation dithering would handle all of the 
>>>>> colormaps much better.  We used to do error propagation dithering 
>>>>> back in the JDK 1.1 days, but we dropped it when we introduced 2D 
>>>>> because we added a bunch of ways to render small pieces of an 
>>>>> image and only the current spatial dithering algorithm can be 
>>>>> started in the middle of an operation.  That doesn't mean that you 
>>>>> can't still do error propagation since many operations already 
>>>>> operate on the full image any way and you can still handle subset 
>>>>> image operations by either converting the full image first and 
>>>>> then copying or by tracing the errors from the edge of the image 
>>>>> to the point of the subimage operation.  We never bothered to 
>>>>> upgrade our algorithms it just never seemed to be work that made 
>>>>> sense to prioritize given that screens were overwhelmingly moving 
>>>>> to full-color at the time of "Java 2" (and now to HDR in 2016+).  8-bit 
>>>>> indexed isn't used much any more.
>>>>>
>>>>> If we want to make 8-bit destination images work better we'd be 
>>>>> better off adopting error propagation dithering again rather than 
>>>>> trying to tune this algorithm for black.
>>>>>
>>>>> It looks like the bug was closed briefly in 2014 and then reopened 
>>>>> soon thereafter with no justification.  It is true that we still 
>>>>> have this anomaly, but it isn't clear why this is high enough 
>>>>> priority to work on in 2016 when other bit depths would work 
>>>>> better for destination imagery and other dithering algorithms 
>>>>> would work better for most customers and even this targeted fix isn't 
>>>>> perfect...
>>>>>
>>>>>              ...jim
>>>>>
>>>>> On 2/16/2016 8:32 AM, Jayathirth D V wrote:
>>>>>> Hi Jim,
>>>>>>
>>>>>> Thanks for letting me know about the importance of custom color 
>>>>>> maps. I was not able to understand what you mentioned previously 
>>>>>> since I am new to this terminology.
>>>>>>
>>>>>> Regarding performance I checked with image having complete
>>>>>> 255,255,128 pixels and ran it for 100 times. I am running on 
>>>>>> Windows
>>>>>> 7  Professional SP1 with Intel i5-5300U CPU. Overall I don't see 
>>>>>> much difference in time taken for drawImage() API before and 
>>>>>> after change. Details for INT_RGB image as input:
>>>>>>
>>>>>> Before change :
>>>>>> Minimum time   536827ns
>>>>>> Maximum time  1560947ns
>>>>>> Average time      871167ns
>>>>>>
>>>>>> After change :
>>>>>> Minimum time  536380ns
>>>>>> Maximum time 1468130ns
>>>>>> Average time     830778ns
>>>>>>
>>>>>> There is +/- 10% delta both for before and after change time but 
>>>>>> there is no major gap. Even for image with other input type it 
>>>>>> holds the same.
>>>>>>
>>>>>>
>>>>>> Regarding custom color maps, previously I ran on default color 
>>>>>> map generated in TYPE_BYTE_INDEXED constructor. Now I tested with 
>>>>>> modified color map so that it doesn't contain any of the primary 
>>>>>> color values. Instead of using 0-255 values with value 51 
>>>>>> increments in R,G,B components I used color map with 20-245 
>>>>>> values with value
>>>>>> 45 as increment. For this color map before and after change all 
>>>>>> the pixels are referring to same index in color map irrespective 
>>>>>> of removal of error delta addition in case of primary colors.
>>>>>>
>>>>>> I have attached log for Red and Green primary colors before and 
>>>>>> after change(Was not able to attach for more since it exceeded 
>>>>>> 120KB mailing list limit). Please search for "Final index value ="
>>>>>> in the logs. Please let me know your inputs.
>>>>>>
>>>>>> Thanks,
>>>>>> Jay
>>>>>>
>>>>>> -----Original Message-----
>>>>>> From: Jim Graham
>>>>>> Sent: Tuesday, February 16, 2016 1:03 AM
>>>>>> To: Jayathirth D V
>>>>>> Cc: 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,
>>>>>>
>>>>>> The issue with testing performance with white images is that the 
>>>>>> tests allow the code to eliminate 3 indexed fetches which take time.
>>>>>> Primary colors end up being the one obscure case where the new 
>>>>>> code might be faster.  But, non-primary colors would be slower by 
>>>>>> a fair amount, so performance testing with converting a 
>>>>>> randomized or non-primary-color image are the more telling case.  
>>>>>> An image filled with 255,255,128 would be the worst case because 
>>>>>> it would involve all of the tests and still have to do all of the 
>>>>>> lookups.
>>>>>>
>>>>>> My question about how this works with custom colormaps was not 
>>>>>> really addressed by your response.  A simple test to make sure 
>>>>>> the colormap has accurate (or very close) conversions for the 
>>>>>> primary colors may be enough to validate the colormap for the 
>>>>>> indicated tests.  If the colormap contains no pure conversions 
>>>>>> for some of the primary colors then they may need to be dithered 
>>>>>> anyway...
>>>>>>
>>>>>>              ...jim
>>>>>>
>>>>>> On 2/15/16 3:39 AM, Jayathirth D V wrote:
>>>>>>> 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

Reply via email to