bugGNUstep - Bugs: bug #23333, -initWithFocusedViewRect: seems to...

 
 

You are not allowed to post comments on this tracker with your current authentification level.

bug #23333: -initWithFocusedViewRect: seems to crash with clipped views

Submitted by:  Quentin Mathé <qmathe>
Submitted on:  Fri 23 May 2008 05:09:57 PM UTC  
 
Category: BackendSeverity: 3 - Normal
Item Group: BugStatus: None
Privacy: PublicAssigned to: None
Open/Closed: Open

Tue 03 Jul 2012 07:27:34 PM UTC, comment #5:

Has there ever been any progress on this? It seems as though this might be either fixed or, ultimately, moot since Cairo is the default backend now.

Gregory John Casamento <gcasa>
Project Administrator
Thu 26 Jun 2008 12:12:00 AM UTC, comment #4:

Cairo backend solves my problem, so you're correct it's a art backend issue.

Quentin Mathé <qmathe>
Project Member
Wed 25 Jun 2008 07:55:44 PM UTC, comment #3:

Changed into a backend bug. I hope this is correct as there was no further feedback.

Fred Kiefer <FredKiefer>
Project Member
Wed 28 May 2008 10:14:41 AM UTC, comment #2:

I'll give a try to Cairo backend and also see whether the fix for art is easy or not.

Thanks for the reply, Fred.

Quentin Mathé <qmathe>
Project Member
Tue 27 May 2008 10:54:36 PM UTC, comment #1:

The GSReadRect method in art is rather broken. It does not take the current transformation into account and also creates an image that this one pixel to wide.
Any patch for this will be greatly welcomed.

Fred Kiefer <FredKiefer>
Project Member
Fri 23 May 2008 05:09:57 PM UTC, original submission:

Ubuntu 7.10
gnustep-base r26119
gnustep-gui r26262
gnustep-back (art) r26014

I use the following method in an NSImage category to take snapshots of views.

// I take care to only pass the visible rect of view as sourceRect
- (void) takeSnapshotFromRect: (NSRect)sourceRect inView: (NSView *)view
{
NSBitmapImageRep *rep = nil;

if ([view window] == nil || [view canDraw] == NO)
{
ETLog(@"WARNING: Impossible to snapshot view %@", view);
return;
}

[view lockFocus];
rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect: sourceRect];
[view unlockFocus];

[self addRepresentation: rep];
RELEASE(rep);
}

It works very well on Cocoa, but I have troubles with it on GNUstep. I often got the following segfaults, here is the end of the stack trace:

#0 0xb70d6d8a in bgra_read_pixels_o (c=0xbf8f1aec, num=134) at blit.m:436
#1 0xb70fe546 in -[ARTGState(ReadRect) GSReadRect:] (self=0x8511f48, _cmd=0xb71089f0, r=
{origin = {x = 0, y = 0}, size = {width = 580, height = 261}}) at ReadRect.m:132
#2 0xb7097d6c in -[GSContext(NSGraphics) GSReadRect:] (self=0x83deb08, _cmd=0xb7dcc6f8,
rect={origin = {x = 0, y = 0}, size = {width = 580, height = 261}})
at GSContext.m:872
#3 0xb7b9b7bb in -[NSBitmapImageRep initWithFocusedViewRect:] (self=0x8451350,
_cmd=0xb7f22ed8, rect={origin = {x = 0, y = 0}, size = {width = 580, height = 261}})
at NSBitmapImageRep.m:323
#4 0xb7eec06f in -[NSImage(Etoile) takeSnapshotFromRect:inView:] (self=0x8316160,
_cmd=0xb7f22ea0, sourceRect=
{origin = {x = 0, y = 0}, size = {width = 580, height = 261}}, view=0x83e0598)
at NSImage+Etoile.m:93

I have been able to reproduce it in a relatively simple case which consists of calling this method with an image view, located inside a scroll view, and partially or fully obscured by the clip view. If the image view is fully visible within the scroll view (scrollers disabled), the snapshot doesn't trigger a segfault. On the other hand, if I resize the scroll view to clip the content and get the scrollers enabled then I get a segfault if I try to take a snapshot on this image view. Taking a snapshot on the scroll view seems to be fine though.

I have other cases where I get this crash by taking a snapshot of a table/outline or browser views, but they are more complicated to reproduce. May be that's only one bug since table/outline and browser views are all enclosed inside a scroll view by default (when you use the Gorm provided instances)... Not really sure about that though.

By reading the stack trace, it looks like GNUstep is unable to provide valid data for a view that is clipped even if the view belongs to a window and doesn't report a problem when -lockFocus is called on it. It would be great to have the same behavior than Cocoa but if it's too complicated, I'd like to suggest the method should return a nil image rep in such problematic cases instead of crashing. May be -lockFocus should log a message too...
The Cocoa implementation isn't perfect because it doesn't check for [view window] == nil, it just crashes in a very weird way. -canDraw doesn't help in my test. May be GNUstep could implement this extra check [view window] == nil.

Thanks,
Quentin.

Quentin Mathé <qmathe>
Project Member

 

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -unavailable- added by gcasa (Posted a comment)
  • -unavailable- added by FredKiefer (Posted a comment)
  • -unavailable- added by qmathe (Submitted the item)
  •  

    Do you think this task is very important?
    If so, you can click here to add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.

     

    Please enter the title of George Orwell's famous dystopian book (it's a date):

     

     

    Follows 1 latest change.

    Date Changed By Updated Field Previous Value => Replaced By
    Wed 25 Jun 2008 07:55:44 PM UTCFredKieferCategoryGui/AppKit=>Backend

    Back to the top


    Powered by Savane 3.1-cleanup