(moved to gnustep-dev)

On 2011-06-09, at 1:36 AM, Dr. H. Nikolaus Schaller wrote:

> 
> Am 09.06.2011 um 09:28 schrieb Dr. H. Nikolaus Schaller:
> 
>> 
>> Am 09.06.2011 um 09:15 schrieb Eric Wasylishen:
>> 
>>> 
>>>>> From some brief experimentation on Cocoa, it seems that ICNS files are 
>>>>> given special treatment: If you create an NSImageView with an NSImage 
>>>>> loaded from an ICNS file, resizing the image view will cause the 
>>>>> best-sized representations to be used (the smallest one which is larger 
>>>>> than or equal the destination size). However, if you do the same thing 
>>>>> with either of the TIFF files I posted above, only the first sub-image in 
>>>>> the TIFF is used. I'm not sure why this is; it seems like a bug in Cocoa.
>>>> 
>>>> I am not sure if Cocoa handles multi-image TIFF files at all and always 
>>>> uses the first (sub)image.
>>>> 
>>>>> 
>>>>> I should point out that according to the documentation, the way that 
>>>>> NSImage picks a best representation when there are representations with 
>>>>> different point sizes (as is the case with icons) is undefined.
>>>> 
>>>> It is described here (section "How an Image Representation Is Chosen"):
>>>> 
>>>> http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CocoaDrawingGuide/Images/Images.html
>>>> 
>>> Right. The instructions there have to be read very carefully, though - by 
>>> "resolution" they are referring to DPI. If the representations have the 
>>> same DPI, color depth, and color space, but different dimensions (in 
>>> points), by following that set of instructions the best representation 
>>> would be "operating-system dependent". At least, that's how I interpret it.
>>> 
>>>> and done by -bestRepresentation:
>>>> 
>>>> http://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSImage_Class/DeprecationAppendix/AppendixADeprecatedAPI.html%23//apple_ref/occ/instm/NSImage/bestRepresentationForDevice:
>>>> 
>>>> But beware: it is deprecated in 10.6.
>>>> 
>>>>> 
>>>>> One potential solution I have in mind is modifying -[NSImageCell 
>>>>> drawInteriorWithFrame:] so it manually chooses an image rep based on the 
>>>>> size that the cell is going to be drawn in. That's only the first thing 
>>>>> that came to mind, though; it probably needs some closer investigation.
>>>> 
>>>> On Cocoa it is fully automatic within NSImage (i.e. it scans and scores 
>>>> all image reps it knows) so there is no special case to be considered in 
>>>> any NSView or NSCell.
>>> 
>>> 
>>> Yes, but as far as I know, the rect given to -[NSImage drawInRect:...] has 
>>> no influence on the choice of representation to use to draw with (in either 
>>> Cocoa or GNUstep).  If we have a TIFF or ICNS file with different versions 
>>> of an icon at 16x16, 32x32, 128x128, etc, and if we want to draw that in an 
>>> NSImageView, and we want the frame size of the image view to determine 
>>> which image rep is chosen, we can't just rely on the built-in image rep 
>>> matching of NSImage. That's why I was suggesting we might need to implement 
>>> a special case in NSImageCell which uses the frame to draw in to choose an 
>>> image rep.
>> 
>> Hm. Why should the frame size influence resolution? The screen resolution 
>> doesn't change if you make windows smaller or larger. The scoring mechanism 
>> should find the best representation for a given pixel density of the screen.
>> 

I just meant the frame size could influence representation choice when the 
NSImage is an "icon-like" image (it has representations at different sizes like 
16, 32, 128.) These could all be at the same resolution (72dpi).

>> This may only have an influence if you want to scale (enlarge) the image. I 
>> think this should be embedded in
>> 
>> drawInRect:fromRect:operation:fraction:
>> 
>> which can choose any representation that best its the scaled rect (I have no 
>> idea how that works internally).

Indeed, just experimenting on Cocoa, and drawing the ICNS image I posted 
earlier, simply calling drawInRect:fromRect:operation:fraction: with different 
destination rect sizes, I can get it to use different representations. So we 
shouldn't need any special cases in NSImageCell to duplicate this behaviour 
like I was thinking about earlier. 

>> In that case we must enlarge a finer resolution than the default. I just 
>> found that 10.6 appears to address this with a new method:
>> 
>> http://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSImage_Class/Reference/Reference.html%23//apple_ref/occ/instm/NSImage/representations
> 

Did you mean bestRepresentationForRect:context:hints: ? That looks like exactly 
what we need to implement. I just tested it a bit and the size of the first 
parameter is used in choosing the rep to return.

> And one more thought about the reason why it is as it is. This may be the way 
> Postscript/PDF works. There, you have to choose some bitmap that you must 
> encode into the PDF file (I think in TIFF). Later the CTM is set controlling 
> scaling etc. and the bitmap is stamped on paper. If the same image is drawn 
> several times in different scales, only the CTM changes. This explains why 
> choosing the best representation must know the device resolution in advance 
> and why scaling appears not to influence the choice of a representation.
> 
> But this is only a theory...
> 

I think that's right.

So in summary, I think we just need to implement 
-bestRepresentationForRect:context:hints:, which looks for a rep which is equal 
to or larger in size than the given rect's size. Next we need to modify 
-drawInRect:... to call this new bestRepresentationForRect:context:hints: 
method instead of -bestRepresentationForDevice:.

Cheers,
Eric
_______________________________________________
Gnustep-dev mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to