Add multiframe image support to NS port (bug#21714)
* src/nsimage.m (ns_load_image): Handle multiple frames. (EmacsImage::getMetadata, EmacsImage::setFrame): New functions. * src/nsterm.h (EmacsImage::getMetadata, EmacsImage::setFrame): New function prototypes.
This commit is contained in:
parent
400934b694
commit
3505b77ad7
2 changed files with 62 additions and 0 deletions
|
@ -76,9 +76,16 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
{
|
||||
EmacsImage *eImg = nil;
|
||||
NSSize size;
|
||||
Lisp_Object lisp_index;
|
||||
unsigned int index;
|
||||
|
||||
NSTRACE ("ns_load_image");
|
||||
|
||||
eassert (valid_image_p (img->spec));
|
||||
|
||||
lisp_index = Fplist_get (XCDR (img->spec), QCindex);
|
||||
index = INTEGERP (lisp_index) ? XFASTINT (lisp_index) : 0;
|
||||
|
||||
if (STRINGP (spec_file))
|
||||
{
|
||||
eImg = [EmacsImage allocInitFromFile: spec_file];
|
||||
|
@ -99,12 +106,20 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (index < 0 || ![eImg setFrame: index])
|
||||
{
|
||||
add_to_log ("Unable to set index %d for image %s", index, img->spec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
size = [eImg size];
|
||||
img->width = size.width;
|
||||
img->height = size.height;
|
||||
|
||||
/* 4) set img->pixmap = emacsimage */
|
||||
img->pixmap = eImg;
|
||||
|
||||
img->lisp_data = [eImg getMetadata];
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -435,4 +450,49 @@ - (NSColor *)stippleMask
|
|||
return stippleMask;
|
||||
}
|
||||
|
||||
/* If the image has multiple frames, get a count of them and the
|
||||
animation delay, if available. */
|
||||
- (Lisp_Object)getMetadata
|
||||
{
|
||||
Lisp_Object metadata = Qnil;
|
||||
|
||||
for (NSImageRep * r in [self representations])
|
||||
{
|
||||
if ([r isKindOfClass:[NSBitmapImageRep class]])
|
||||
{
|
||||
NSBitmapImageRep * bm = (NSBitmapImageRep *)r;
|
||||
int frames = [[bm valueForProperty: NSImageFrameCount] intValue];
|
||||
float delay = [[bm valueForProperty: NSImageCurrentFrameDuration]
|
||||
floatValue];
|
||||
|
||||
if (frames > 1)
|
||||
metadata = Fcons (Qcount, Fcons (make_number (frames), metadata));
|
||||
if (delay > 0)
|
||||
metadata = Fcons (Qdelay, Fcons (make_float (delay), metadata));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return metadata;
|
||||
}
|
||||
|
||||
/* Attempt to set the animation frame to be displayed. */
|
||||
- (BOOL)setFrame: (unsigned int) index
|
||||
{
|
||||
for (NSImageRep * r in [self representations])
|
||||
{
|
||||
if ([r isKindOfClass:[NSBitmapImageRep class]])
|
||||
{
|
||||
NSBitmapImageRep * bm = (NSBitmapImageRep *)r;
|
||||
if ([[bm valueForProperty: NSImageFrameCount] intValue] <= index)
|
||||
continue;
|
||||
|
||||
[bm setProperty: NSImageCurrentFrame
|
||||
withValue: [NSNumber numberWithUnsignedInt: index]];
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -668,6 +668,8 @@ typedef id instancetype;
|
|||
alpha:(unsigned char)a;
|
||||
- (void)setAlphaAtX: (int)x Y: (int)y to: (unsigned char)a;
|
||||
- (NSColor *)stippleMask;
|
||||
- (Lisp_Object)getMetadata;
|
||||
- (BOOL)setFrame: (unsigned int) index;
|
||||
@end
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue