X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/a971635315e259c076de020b3676c04d1dcc415e..eefc9486e823512a4c1928b6264c5a1ce9142624:/src/nsimage.m diff --git a/src/nsimage.m b/src/nsimage.m index cf974be6c4..c38cefdc5d 100644 --- a/src/nsimage.m +++ b/src/nsimage.m @@ -1,5 +1,5 @@ /* Image support for the NeXT/Open/GNUstep and MacOSX window system. - Copyright (C) 1989, 1992, 1993, 1994, 2005, 2006, 2008 + Copyright (C) 1989, 1992-1994, 2005-2006, 2008-2011 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -25,7 +25,11 @@ MacOSX/Aqua port by Christophe de Dinechin (descubes@earthlink.net) GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) */ -#include "config.h" +/* This should be the first include, as it may set up #defines affecting + interpretation of even the system includes. */ +#include +#include + #include "lisp.h" #include "dispextern.h" #include "nsterm.h" @@ -79,19 +83,21 @@ int ns_load_image (struct frame *f, struct image *img, Lisp_Object spec_file, Lisp_Object spec_data) { - NSTRACE (ns_load_image); - - EmacsImage *eImg; + EmacsImage *eImg = nil; NSSize size; - if (NILP (spec_data)) + NSTRACE (ns_load_image); + + if (STRINGP (spec_file)) { eImg = [EmacsImage allocInitFromFile: spec_file]; } - else + else if (STRINGP (spec_data)) { - NSData *data = [NSData dataWithBytes: XSTRING (spec_data)->data - length: SBYTES (spec_data)]; + NSData *data; + + data = [NSData dataWithBytes: SDATA (spec_data) + length: SBYTES (spec_data)]; eImg = [[EmacsImage alloc] initWithData: data]; [eImg setPixmapData]; } @@ -160,6 +166,7 @@ static EmacsImage *ImageList = nil; + allocInitFromFile: (Lisp_Object)file { EmacsImage *image = ImageList; + NSImageRep *imgRep; Lisp_Object found; /* look for an existing image of the same name */ @@ -182,12 +189,18 @@ static EmacsImage *ImageList = nil; image = [[EmacsImage alloc] initByReferencingFile: [NSString stringWithUTF8String: SDATA (found)]]; - if ([image bestRepresentationForDevice: nil] == nil) + imgRep = [image bestRepresentationForDevice: nil]; + if (imgRep == nil) { [image release]; return nil; } + /* The next two lines cause the DPI of the image to be ignored. + This seems to be the behavior users expect. */ + [image setScalesWhenResized: YES]; + [image setSize: NSMakeSize([imgRep pixelsWide], [imgRep pixelsHigh])]; + [image setName: [NSString stringWithUTF8String: SDATA (file)]]; [image reference]; ImageList = [image imageListSetNext: ImageList]; @@ -304,9 +317,9 @@ static EmacsImage *ImageList = nil; [self addRepresentation: bmRep]; - bzero (planes[0], w*h); - bzero (planes[1], w*h); - bzero (planes[2], w*h); + memset (planes[0], 0, w*h); + memset (planes[1], 0, w*h); + memset (planes[2], 0, w*h); [self setXBMColor: [NSColor blackColor]]; return self; } @@ -319,11 +332,11 @@ static EmacsImage *ImageList = nil; NSSize s = [self size]; int len = (int) s.width * s.height; unsigned char *planes[5]; - float r, g, b, a; + CGFloat r, g, b, a; NSColor *rgbColor; if (bmRep == nil || color == nil) - return; + return self; if ([color colorSpaceName] != NSCalibratedRGBColorSpace) rgbColor = [color colorUsingColorSpaceName: NSCalibratedRGBColorSpace]; @@ -348,6 +361,8 @@ static EmacsImage *ImageList = nil; planes[2][i] = bb; } } + + return self; } @@ -368,7 +383,7 @@ static EmacsImage *ImageList = nil; [bmRep getBitmapDataPlanes: pixmapData]; for (i =0; i<4; i++) - bzero (pixmapData[i], width*height); + memset (pixmapData[i], 0, width*height); [self addRepresentation: bmRep]; return self; } @@ -390,6 +405,12 @@ static EmacsImage *ImageList = nil; if ([bmRep numberOfPlanes] >= 3) [bmRep getBitmapDataPlanes: pixmapData]; + + /* The next two lines cause the DPI of the image to be ignored. + This seems to be the behavior users expect. */ + [self setScalesWhenResized: YES]; + [self setSize: NSMakeSize([bmRep pixelsWide], [bmRep pixelsHigh])]; + break; } } @@ -415,7 +436,7 @@ static EmacsImage *ImageList = nil; else if (onTiger) { NSColor *color = [bmRep colorAtX: x y: y]; - float r, g, b, a; + CGFloat r, g, b, a; [color getRed: &r green: &g blue: &b alpha: &a]; return ((int)(a * 255.0) << 24) | ((int)(r * 255.0) << 16) | ((int)(g * 255.0) << 8) @@ -443,7 +464,8 @@ static EmacsImage *ImageList = nil; else if (onTiger) { [bmRep setColor: - [NSColor colorWithCalibratedRed: r green: g blue: b alpha: a] + [NSColor colorWithCalibratedRed: (r/255.0) green: (g/255.0) + blue: (b/255.0) alpha: (a/255.0)] atX: x y: y]; } } @@ -477,4 +499,3 @@ static EmacsImage *ImageList = nil; @end -// arch-tag: 6b310280-6892-4e5e-8f34-41c4d384874f