[icedtea-web] RFC: Patch to double-buffer applets

Omair Majid omajid at redhat.com
Wed Nov 3 06:32:24 PDT 2010


Hi Deepak,

On 11/02/2010 05:37 PM, Deepak Bhole wrote:
> * Deepak Bhole<dbhole at redhat.com>  [2010-11-02 17:31]:
>> Hi,
>>
>> IcedTea plugin currently does not double-buffer the applet panel. As a
>> result, some applets may flicker depending on the machine.
>>
>> Attached patch buffers the frame offscreen and then draws it, thereby
>> addressing the issue.
>>

Is there a specific test case that this fixes? The only flickering 
applet that I know of is at 
http://download.oracle.com/javase/1.4.2/docs/guide/misc/applet.html, and 
I dont see any change in that applet with the patch applied.

>> ChangeLog:
>> 2010-11-02  Deepak Bhole<dbhole at redhat.com>
>>
>>     * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (update):
>>     Override method and implement double-buffering.
>>
>> Cheers,
>> Deepak
>
>
> Doh! There shouldn't be a println in there. New patch attached. I also
> fixed the variable names for the image and its graphics.
>
>
>> diff -r 6c2527d42900 ChangeLog
>> --- a/ChangeLog	Mon Nov 01 11:44:15 2010 -0400
>> +++ b/ChangeLog	Tue Nov 02 17:29:03 2010 -0700
>> @@ -1,3 +1,8 @@
>> +2010-11-02  Deepak Bhole<dbhole at redhat.com>
>> +
>> +	* plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (update):
>> +	Override method and implement double-buffering.
>> +
>>   2010-11-01  Omair Majid<omajid at redhat.com>
>>
>>   	* Makefile.am (clean-IcedTeaPlugin): Only delete launcher directory if it
>> diff -r 6c2527d42900 NEWS
>> --- a/NEWS	Mon Nov 01 11:44:15 2010 -0400
>> +++ b/NEWS	Tue Nov 02 17:29:03 2010 -0700
>> @@ -12,3 +12,4 @@
>>
>>   * Initial release of IcedTea-Web
>>   * PR542: Plugin fails with NPE on http://www.openprocessing.org/visuals/iframe.php?visualID=2615
>> +* Applets are now double-buffered to eliminate flicker in ones that do heavy drawing
>> diff -r 6c2527d42900 plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
>> --- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Mon Nov 01 11:44:15 2010 -0400
>> +++ b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Tue Nov 02 17:29:03 2010 -0700
>> @@ -359,6 +366,9 @@
>>
>>        private static Long requestIdentityCounter = 0L;
>>
>> +     private Image bufferedPanelImage;
>> +     private Graphics bufferedImageGraphics;
>> +
>>        /**
>>         * Null constructor to allow instantiation via newInstance()
>>         */
>> @@ -2163,4 +2178,24 @@
>>           }
>>       }
>>        }
>> +
>> +     /**
>> +      * {@inheritDoc}
>> +      */
>> +     public void update(Graphics g) {
>> +
>> +    	 System.err.println("Buffering and drawing");
>> +    	
>> +    	 // If the image or the graphics don't exist, create new ones
>> +    	 if (bufferedPanelImage == null || bufferedImageGraphics == null) {
>> +    		 bufferedPanelImage = createImage(getWidth(), getHeight());
>> +    		 bufferedImageGraphics = bufferedPanelImage.getGraphics ();
>> +    	 }
>> +
>> +    	 // Paint off-screen
>> +    	 paint(bufferedImageGraphics);

The overridden method is update, but paint is called here instead. Is 
there a reason for that? As far as I know, the semantics of update() are 
slightly different from paint() - update() clears the background and 
then calls paint(). Perhaps super.update() might be more appropriate?

>> +
>> +    	 // Draw the painted image
>> +    	 g.drawImage(bufferedPanelImage, 0, 0, this);
>> +     }
>>    }
>

Thanks,
Omair



More information about the distro-pkg-dev mailing list