Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Standard Widget Toolkit (SWT) » Displaying animated GIF in table cell, issues with GC
Displaying animated GIF in table cell, issues with GC [message #506779] Sat, 09 January 2010 21:40 Go to previous message
Marcel  tör is currently offline Marcel törFriend
Messages: 73
Registered: July 2009
Member
I copied and slightly modified the code from
http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Displayana nimatedGIF.htm
to write my own animation thread. The modifications were necessary
because the animated GIF is to be displayed in a table cell. Hence, I
essentially implemented my own OwnerDrawLabelProvider.

However, I'm having serious issues finding the right GC for the thread
to draw to. Generally one implements draw(Event, Object) and uses the
event's GC to draw to. In my case this fails because I need to start a
dedicated thread from within paint() and by the time its run method
draws the image to the GC the GC is reset/empty.

I tried creating my own GC inside the thread's constructor: this.gc =
new GC(event.gc.getDevice());. This seemed to work at first and while
debugging the thread's run method never failed to draw to this GC.
However, once I step out of the debugger it fails miserably:

Sat Jan 9 22:11:57 192.168.1.6.local.home java[25387] <Error>:
CGContextConcatCTM: invalid context 0x0
2010-01-09 22:12:18.356 java[25387:17b03] It does not make sense to draw
an image when [NSGraphicsContext currentContext] is nil. This is a
programming error. Break on _NSWarnForDrawingImageWithNoCurrentContext
to debug. This will be logged only once. This may break in the future.
Sat Jan 9 22:12:41 192.168.1.6.local.home java[25387] <Error>:
CGContextConcatCTM: invalid context 0x0

I'm pretty much at my wits end and I would very much appreciated to get
some hints as for how to deal with this.

Regards,
Marcel


/**** code *****/
-> called from OwnerDrawLabelProvider#paint(Event, Object) implementation

private void paintAnimated(final Event event, final ImageLoader
imageLoader) {
if (imageLoader == null || ArrayUtils.isEmpty(imageLoader.data)) {
return;
}
final Thread animateThread = new AnimationThread(event, imageLoader);
animateThread.setDaemon(true);
animateThread.start();
}

private class AnimationThread extends Thread {

private Display display;

private GC gc;

private ImageLoader imageLoader;

private Color background;

public AnimationThread(final Event event, final ImageLoader
imageLoader) {
super("Animation");
this.display = event.display;
/*
* If we were to simply reference event.gc it would be
reset/empty by the time it's being used
* in run().
*/
this.gc = new GC(event.gc.getDevice());
this.imageLoader = imageLoader;
this.background = getBackground(event.item, event.index);
}

@Override
public void run() {
/*
* Create an off-screen image to draw on, and fill it with the
shell background.
*/
final Image offScreenImage =
new Image(this.display, this.imageLoader.logicalScreenWidth,
this.imageLoader.logicalScreenHeight);
final GC offScreenImageGC = new GC(offScreenImage);
offScreenImageGC.setBackground(this.background);
offScreenImageGC.fillRectangle(0, 0,
this.imageLoader.logicalScreenWidth,
this.imageLoader.logicalScreenHeight);
Image image = null;
try {
/* Create the first image and draw it on the off-screen image. */
int imageDataIndex = 0;
ImageData imageData = this.imageLoader.data[imageDataIndex];
image = new Image(this.display, imageData);
offScreenImageGC.drawImage(image, 0, 0, imageData.width,
imageData.height, imageData.x,
imageData.y, imageData.width, imageData.height);

/*
* Now loop through the images, creating and drawing each one
on the off-screen image before
* drawing it on the shell.
*/
int repeatCount = this.imageLoader.repeatCount;
while (this.imageLoader.repeatCount == 0 || repeatCount > 0) {
switch (imageData.disposalMethod) {
case SWT.DM_FILL_BACKGROUND:
/* Fill with the background color before drawing. */
offScreenImageGC.setBackground(this.background);
offScreenImageGC.fillRectangle(imageData.x, imageData.y,
imageData.width,
imageData.height);
break;
case SWT.DM_FILL_PREVIOUS:
// Restore the previous image before drawing.
offScreenImageGC.drawImage(image, 0, 0, imageData.width,
imageData.height,
imageData.x, imageData.y, imageData.width,
imageData.height);
break;
}

imageDataIndex = (imageDataIndex + 1) %
this.imageLoader.data.length;
imageData = this.imageLoader.data[imageDataIndex];
image.dispose();
image = new Image(this.display, imageData);
offScreenImageGC.drawImage(image, 0, 0, imageData.width,
imageData.height, imageData.x,
imageData.y, imageData.width, imageData.height);

// Draw the off-screen image.
this.gc.drawImage(offScreenImage, 0, 0);

/*
* Sleeps for the specified delay time (adding commonly-used
slow-down fudge factors).
*/
try {
int ms = imageData.delayTime * 10;
if (ms < 20) {
ms += 30;
}
if (ms < 30) {
ms += 10;
}
Thread.sleep(ms);
} catch (InterruptedException e) {
ColorLabelProvider.this.log.log(new Status(IStatus.ERROR,
ColorLabelProvider.this.log.getBundle().getSymbolicName(),
"Thread interrupted", e));
}

/*
* If the last image was just drawn, decrement the repeat
count and start again.
*/
if (imageDataIndex == this.imageLoader.data.length - 1) {
repeatCount--;
}
}
} catch (SWTException ex) {
ColorLabelProvider.this.log.log(new Status(IStatus.ERROR,
ColorLabelProvider.this.log.getBundle().getSymbolicName(),
"There was an error animating the GIF", ex));
} finally {
if (offScreenImage != null && !offScreenImage.isDisposed()) {
offScreenImage.dispose();
}
if (offScreenImageGC != null && !offScreenImageGC.isDisposed()) {
offScreenImageGC.dispose();
}
if (image != null && !image.isDisposed()) {
image.dispose();
}
}
}
}

--
Marcel Stör, http://www.frightanic.com
Couchsurfing: http://www.couchsurfing.com/people/marcelstoer
Skype: marcelstoer
-> I kill Google Groups posts: http://improve-usenet.org
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic:Fwd: Focus and key events with SWT_AWT bridge
Next Topic:SWT chrashes in GDI
Goto Forum:
  


Current Time: Sat Apr 27 01:24:30 GMT 2024

Powered by FUDForum. Page generated in 0.03027 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top