1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-27 07:41:28 -08:00

Simplify NS color handling

* src/image.c (RGB_TO_ULONG):
(ARGB_TO_ULONG):
(RED_FROM_ULONG):
(RED16_FROM_ULONG):
(GREEN16_FROM_ULONG):
(BLUE16_FROM_ULONG): Define these here for NS too.
* src/nsfns.m (ns_set_foreground_color):
(ns_set_background_color): Use new EmacsColor methods.
* src/nsterm.h (struct ns_color_table): Replace this struct with a
built-in Objective C type.
(RGB_TO_ULONG):
(ARGB_TO_ULONG):
(ALPHA_FROM_ULONG):
(RED_FROM_ULONG):
(GREEN_FROM_ULONG):
(BLUE_FROM_ULONG):
(RED16_FROM_ULONG):
(GREEN16_FROM_ULONG):
(BLUE16_FROM_ULONG): These are no longer needed in the NS specific code.
(struct ns_display_info): Use an NSMutableArray instead of a custom struct.
* src/nsterm.m ([NSColor colorWithUnsignedLong:hasAlpha:]):
([NSColor unsignedLong]): New methods.
(ns_lookup_indexed_color):
(ns_index_color): Use the NSMutableArray lookup table.
(ns_term_init):
(ns_color_index_to_rgba):
(ns_query_color): Use the new EmacsColor methods.
(ns_initialize_display_info):
(ns_delete_display): Initialize and release the NSMutableArray lookup table.
This commit is contained in:
Alan Third 2021-08-14 16:11:30 +01:00
parent 5b0121b708
commit 0f427befe8
4 changed files with 60 additions and 107 deletions

View file

@ -80,14 +80,7 @@ typedef struct x_bitmap_record Bitmap_Record;
#endif /* !USE_CAIRO */
#endif /* HAVE_X_WINDOWS */
#ifdef USE_CAIRO
#define GET_PIXEL image_pix_context_get_pixel
#define PUT_PIXEL image_pix_container_put_pixel
#define NO_PIXMAP 0
#define PIX_MASK_RETAIN 0
#define PIX_MASK_DRAW 255
#if defined(USE_CAIRO) || defined(HAVE_NS)
#define RGB_TO_ULONG(r, g, b) (((r) << 16) | ((g) << 8) | (b))
#define ARGB_TO_ULONG(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
#define RED_FROM_ULONG(color) (((color) >> 16) & 0xff)
@ -96,6 +89,15 @@ typedef struct x_bitmap_record Bitmap_Record;
#define RED16_FROM_ULONG(color) (RED_FROM_ULONG (color) * 0x101)
#define GREEN16_FROM_ULONG(color) (GREEN_FROM_ULONG (color) * 0x101)
#define BLUE16_FROM_ULONG(color) (BLUE_FROM_ULONG (color) * 0x101)
#endif
#ifdef USE_CAIRO
#define GET_PIXEL image_pix_context_get_pixel
#define PUT_PIXEL image_pix_container_put_pixel
#define NO_PIXMAP 0
#define PIX_MASK_RETAIN 0
#define PIX_MASK_DRAW 255
static unsigned long image_alloc_image_color (struct frame *, struct image *,
Lisp_Object, unsigned long);

View file

@ -236,7 +236,6 @@ static void
ns_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
NSColor *col;
EmacsCGFloat r, g, b, alpha;
/* Must block_input, because ns_lisp_to_color does block/unblock_input
which means that col may be deallocated in its unblock_input if there
@ -253,12 +252,7 @@ ns_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
[f->output_data.ns->foreground_color release];
f->output_data.ns->foreground_color = col;
[col getRed: &r green: &g blue: &b alpha: &alpha];
FRAME_FOREGROUND_PIXEL (f) =
ARGB_TO_ULONG ((unsigned long) (alpha * 0xff),
(unsigned long) (r * 0xff),
(unsigned long) (g * 0xff),
(unsigned long) (b * 0xff));
FRAME_FOREGROUND_PIXEL (f) = [col unsignedLong];
if (FRAME_NS_VIEW (f))
{
@ -277,7 +271,7 @@ ns_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
struct face *face;
NSColor *col;
NSView *view = FRAME_NS_VIEW (f);
EmacsCGFloat r, g, b, alpha;
EmacsCGFloat alpha;
block_input ();
if (ns_lisp_to_color (arg, &col))
@ -291,12 +285,8 @@ ns_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
[f->output_data.ns->background_color release];
f->output_data.ns->background_color = col;
[col getRed: &r green: &g blue: &b alpha: &alpha];
FRAME_BACKGROUND_PIXEL (f) =
ARGB_TO_ULONG ((unsigned long) (alpha * 0xff),
(unsigned long) (r * 0xff),
(unsigned long) (g * 0xff),
(unsigned long) (b * 0xff));
FRAME_BACKGROUND_PIXEL (f) = [col unsignedLong];
alpha = [col alphaComponent];
if (view != nil)
{

View file

@ -358,7 +358,7 @@ typedef id instancetype;
+ (NSColor *)colorForEmacsRed:(CGFloat)red green:(CGFloat)green
blue:(CGFloat)blue alpha:(CGFloat)alpha;
- (NSColor *)colorUsingDefaultColorSpace;
- (unsigned long)unsignedLong;
@end
@ -766,35 +766,6 @@ struct ns_bitmap_record
int height, width, depth;
};
/* This maps between emacs color indices and NSColor objects. */
struct ns_color_table
{
ptrdiff_t size;
ptrdiff_t avail;
#ifdef __OBJC__
NSColor **colors;
NSMutableSet *empty_indices;
#else
void **items;
void *availIndices;
#endif
};
#define NS_COLOR_CAPACITY 256
#define RGB_TO_ULONG(r, g, b) (((r) << 16) | ((g) << 8) | (b))
#define ARGB_TO_ULONG(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
#define ALPHA_FROM_ULONG(color) ((color) >> 24)
#define RED_FROM_ULONG(color) (((color) >> 16) & 0xff)
#define GREEN_FROM_ULONG(color) (((color) >> 8) & 0xff)
#define BLUE_FROM_ULONG(color) ((color) & 0xff)
/* Do not change `* 0x101' in the following lines to `<< 8'. If
changed, image masks in 1-bit depth will not work. */
#define RED16_FROM_ULONG(color) (RED_FROM_ULONG(color) * 0x101)
#define GREEN16_FROM_ULONG(color) (GREEN_FROM_ULONG(color) * 0x101)
#define BLUE16_FROM_ULONG(color) (BLUE_FROM_ULONG(color) * 0x101)
#ifdef NS_IMPL_GNUSTEP
/* this extends font backend font */
struct nsfont_info
@ -850,7 +821,11 @@ struct ns_display_info
ptrdiff_t bitmaps_size;
ptrdiff_t bitmaps_last;
struct ns_color_table *color_table;
#ifdef __OBJC__
NSMutableArray *color_table;
#else
void *color_table;
#endif
/* DPI resolution of this screen */
double resx, resy;

View file

@ -166,6 +166,29 @@ char const * nstrace_fullscreen_type_name (int fs_type)
return [self colorUsingColorSpace: [NSColorSpace deviceRGBColorSpace]];
}
+ (NSColor *)colorWithUnsignedLong:(unsigned long)c
hasAlpha:(BOOL)alpha
{
EmacsCGFloat a = (double)((c >> 24) & 0xff) / 255.0;
EmacsCGFloat r = (double)((c >> 16) & 0xff) / 255.0;
EmacsCGFloat g = (double)((c >> 8) & 0xff) / 255.0;
EmacsCGFloat b = (double)(c & 0xff) / 255.0;
return [NSColor colorForEmacsRed:r green:g blue:b
alpha:(alpha ? a : (EmacsCGFloat)1.0)];
}
- (unsigned long)unsignedLong
{
EmacsCGFloat r, g, b, a;
[self getRed:&r green:&g blue:&b alpha:&a];
return (((unsigned long) (a * 255)) << 24)
| (((unsigned long) (r * 255)) << 16)
| (((unsigned long) (g * 255)) << 8)
| ((unsigned long) (b * 255));
}
@end
/* ==========================================================================
@ -1952,53 +1975,29 @@ ns_fullscreen_hook (struct frame *f)
NSColor *
ns_lookup_indexed_color (unsigned long idx, struct frame *f)
{
struct ns_color_table *color_table = FRAME_DISPLAY_INFO (f)->color_table;
if (idx < 1 || idx >= color_table->avail)
NSMutableArray *color_table = FRAME_DISPLAY_INFO (f)->color_table;
if (idx < 1 || idx >= [color_table count])
return nil;
return color_table->colors[idx];
return [color_table objectAtIndex:idx];
}
unsigned long
ns_index_color (NSColor *color, struct frame *f)
{
struct ns_color_table *color_table = FRAME_DISPLAY_INFO (f)->color_table;
ptrdiff_t idx;
ptrdiff_t i;
NSMutableArray *color_table = FRAME_DISPLAY_INFO (f)->color_table;
if (!color_table->colors)
{
color_table->size = NS_COLOR_CAPACITY;
color_table->avail = 1; /* skip idx=0 as marker */
color_table->colors = xmalloc (color_table->size * sizeof (NSColor *));
color_table->colors[0] = nil;
color_table->empty_indices = [[NSMutableSet alloc] init];
}
/* An index of 0 appears to be special in some way, so insert a
dummy object. */
if ([color_table count] == 0)
[color_table addObject:[NSNull null]];
/* Do we already have this color? */
for (i = 1; i < color_table->avail; i++)
if (color_table->colors[i] && [color_table->colors[i] isEqual: color])
return i;
if ([color_table containsObject:color])
return [color_table indexOfObject:color];
if ([color_table->empty_indices count] > 0)
{
NSNumber *index = [color_table->empty_indices anyObject];
[color_table->empty_indices removeObject: index];
idx = [index unsignedLongValue];
}
else
{
if (color_table->avail == color_table->size)
color_table->colors =
xpalloc (color_table->colors, &color_table->size, 1,
min (ULONG_MAX, PTRDIFF_MAX), sizeof *color_table->colors);
idx = color_table->avail++;
}
color_table->colors[idx] = color;
[color retain];
/* fprintf(stderr, "color_table: allocated %d\n",idx); */
return idx;
[color_table addObject:color];
return [color_table count] - 1;
}
@ -2136,13 +2135,7 @@ ns_color_index_to_rgba(int idx, struct frame *f)
NSColor *col;
col = ns_lookup_indexed_color (idx, f);
EmacsCGFloat r, g, b, a;
[col getRed: &r green: &g blue: &b alpha: &a];
return ARGB_TO_ULONG((unsigned long) (a * 255),
(unsigned long) (r * 255),
(unsigned long) (g * 255),
(unsigned long) (b * 255));
return [col unsignedLong];
}
void
@ -2161,11 +2154,7 @@ ns_query_color(void *col, Emacs_Color *color_def, bool setPixel)
color_def->blue = b * 65535;
if (setPixel == YES)
color_def->pixel
= ARGB_TO_ULONG((unsigned long) (a * 255),
(unsigned long) (r * 255),
(unsigned long) (g * 255),
(unsigned long) (b * 255));
color_def->pixel = [(NSColor *)col unsignedLong];
}
bool
@ -4933,8 +4922,7 @@ ns_initialize_display_info (struct ns_display_info *dpyinfo)
&& ![NSCalibratedWhiteColorSpace isEqualToString:
NSColorSpaceFromDepth (depth)];
dpyinfo->n_planes = NSBitsPerPixelFromDepth (depth);
dpyinfo->color_table = xmalloc (sizeof *dpyinfo->color_table);
dpyinfo->color_table->colors = NULL;
dpyinfo->color_table = [[NSMutableArray array] retain];
dpyinfo->root_window = 42; /* A placeholder. */
dpyinfo->highlight_frame = dpyinfo->ns_focus_frame = NULL;
dpyinfo->n_fonts = 0;
@ -5010,6 +4998,7 @@ static void
ns_delete_display (struct ns_display_info *dpyinfo)
{
/* TODO... */
[dpyinfo->color_table release];
}
@ -5223,10 +5212,7 @@ ns_term_init (Lisp_Object display_name)
name = XCAR (color);
c = XFIXNUM (XCDR (color));
[cl setColor:
[NSColor colorForEmacsRed: RED_FROM_ULONG (c) / 255.0
green: GREEN_FROM_ULONG (c) / 255.0
blue: BLUE_FROM_ULONG (c) / 255.0
alpha: 1.0]
[NSColor colorWithUnsignedLong:c hasAlpha:NO]
forKey: [NSString stringWithLispString: name]];
}