X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_color.c;h=2343219e0aec79514e3cea59614c28d090912fe7;hp=433b1641c5967179f0d16bd35634f9b0997e5668;hb=1f7a36fe16b11bb4aab51be89bbc1b0f75936b78;hpb=0485620c03e69b1b58a6b12e5e45c98415fc7575 diff --git a/ncurses/base/lib_color.c b/ncurses/base/lib_color.c index 433b1641..2343219e 100644 --- a/ncurses/base/lib_color.c +++ b/ncurses/base/lib_color.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2016,2017 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -48,7 +49,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_color.c,v 1.135 2017/08/19 23:48:19 tom Exp $") +MODULE_ID("$Id: lib_color.c,v 1.145 2020/05/27 23:55:32 tom Exp $") #ifdef USE_TERM_DRIVER #define CanChange InfoOf(SP_PARM).canchange @@ -139,7 +140,6 @@ NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette = hls_palette; #endif /* *INDENT-ON* */ - #if NCURSES_EXT_FUNCS /* * These are called from _nc_do_color(), which in turn is called from @@ -189,12 +189,12 @@ set_background_color(NCURSES_SP_DCLx int bg, NCURSES_SP_OUTC outc) if (set_a_background) { TPUTS_TRACE("set_a_background"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_1(set_a_background, bg), + TIPARM_1(set_a_background, bg), 1, outc); } else { TPUTS_TRACE("set_background"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_1(set_background, toggled_colors(bg)), + TIPARM_1(set_background, toggled_colors(bg)), 1, outc); } #endif @@ -209,12 +209,12 @@ set_foreground_color(NCURSES_SP_DCLx int fg, NCURSES_SP_OUTC outc) if (set_a_foreground) { TPUTS_TRACE("set_a_foreground"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_1(set_a_foreground, fg), + TIPARM_1(set_a_foreground, fg), 1, outc); } else { TPUTS_TRACE("set_foreground"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_1(set_foreground, toggled_colors(fg)), + TIPARM_1(set_foreground, toggled_colors(fg)), 1, outc); } #endif @@ -396,8 +396,10 @@ NCURSES_SP_NAME(start_color) (NCURSES_SP_DCL0) * allow for default-color as a component of a color-pair. */ SP_PARM->_pair_limit += (1 + (2 * maxcolors)); +#if !NCURSES_EXT_COLORS SP_PARM->_pair_limit = limit_PAIRS(SP_PARM->_pair_limit); #endif +#endif /* NCURSES_EXT_FUNCS */ SP_PARM->_pair_count = maxpairs; SP_PARM->_color_count = maxcolors; #if !USE_REENTRANT @@ -405,7 +407,7 @@ NCURSES_SP_NAME(start_color) (NCURSES_SP_DCL0) COLORS = maxcolors; #endif - _nc_reserve_pairs(SP_PARM, 16); + ReservePairs(SP_PARM, 16); if (SP_PARM->_color_pairs != 0) { if (init_direct_colors(NCURSES_SP_ARG)) { result = OK; @@ -514,49 +516,41 @@ _nc_change_pair(SCREEN *sp, int pair) } } -NCURSES_EXPORT(colorpair_t *) +NCURSES_EXPORT(void) _nc_reserve_pairs(SCREEN *sp, int want) { - colorpair_t *result = 0; int have = sp->_pair_alloc; - if ((sp->_color_pairs != 0) && (want < sp->_pair_alloc)) { - result = &(sp->_color_pairs[want]); - } else { - - if (have == 0) - have = 1; - while (have <= want) - have *= 2; - if (have > sp->_pair_limit) - have = sp->_pair_limit; - - if (sp->_color_pairs == 0) { - sp->_color_pairs = TYPE_CALLOC(colorpair_t, have); - } else if (have > sp->_pair_alloc) { -#if USE_NEW_PAIR - colorpair_t *next; - - if ((next = typeCalloc(colorpair_t, have)) == 0) - _nc_err_abort(MSG_NO_MEMORY); - memcpy(next, sp->_color_pairs, (size_t) sp->_pair_alloc * sizeof(*next)); - _nc_copy_pairs(sp, next, sp->_color_pairs, sp->_pair_alloc); - free(sp->_color_pairs); - sp->_color_pairs = next; + if (have == 0) + have = 1; + while (have <= want) + have *= 2; + if (have > sp->_pair_limit) + have = sp->_pair_limit; + + if (sp->_color_pairs == 0) { + sp->_color_pairs = TYPE_CALLOC(colorpair_t, have); + } else if (have > sp->_pair_alloc) { +#if NCURSES_EXT_COLORS + colorpair_t *next; + + if ((next = typeCalloc(colorpair_t, have)) == 0) + _nc_err_abort(MSG_NO_MEMORY); + memcpy(next, sp->_color_pairs, (size_t) sp->_pair_alloc * sizeof(*next)); + _nc_copy_pairs(sp, next, sp->_color_pairs, sp->_pair_alloc); + free(sp->_color_pairs); + sp->_color_pairs = next; #else - TYPE_REALLOC(colorpair_t, have, sp->_color_pairs); - if (sp->_color_pairs != 0) { - memset(sp->_color_pairs + sp->_pair_alloc, 0, - sizeof(colorpair_t) * (have - sp->_pair_alloc)); - } -#endif - } + TYPE_REALLOC(colorpair_t, have, sp->_color_pairs); if (sp->_color_pairs != 0) { - sp->_pair_alloc = have; - result = &(sp->_color_pairs[want]); + memset(sp->_color_pairs + sp->_pair_alloc, 0, + sizeof(colorpair_t) * (size_t) (have - sp->_pair_alloc)); } +#endif + } + if (sp->_color_pairs != 0) { + sp->_pair_alloc = have; } - return result; } /* @@ -578,7 +572,7 @@ _nc_init_pair(SCREEN *sp, int pair, int f, int b) maxcolors = MaxColors; - _nc_reserve_pairs(sp, pair); + ReservePairs(sp, pair); previous = sp->_color_pairs[pair]; #if NCURSES_EXT_FUNCS if (sp->_default_color || sp->_assumed_color) { @@ -677,14 +671,14 @@ _nc_init_pair(SCREEN *sp, int pair, int f, int b) (int) tp[b].red, (int) tp[b].green, (int) tp[b].blue)); NCURSES_PUTP2("initialize_pair", - TPARM_7(initialize_pair, - pair, - (int) tp[f].red, - (int) tp[f].green, - (int) tp[f].blue, - (int) tp[b].red, - (int) tp[b].green, - (int) tp[b].blue)); + TIPARM_7(initialize_pair, + pair, + (int) tp[f].red, + (int) tp[f].green, + (int) tp[f].blue, + (int) tp[b].red, + (int) tp[b].green, + (int) tp[b].blue)); } #endif @@ -751,7 +745,7 @@ _nc_init_color(SCREEN *sp, int color, int r, int g, int b) CallDriver_4(sp, td_initcolor, color, r, g, b); #else NCURSES_PUTP2("initialize_color", - TPARM_4(initialize_color, color, r, g, b)); + TIPARM_4(initialize_color, color, r, g, b)); #endif sp->_color_defs = max(color + 1, sp->_color_defs); @@ -809,7 +803,7 @@ NCURSES_SP_NAME(has_colors) (NCURSES_SP_DCL0) int code = FALSE; (void) SP_PARM; - T((T_CALLED("has_colors()"))); + T((T_CALLED("has_colors(%p)"), (void *) SP_PARM)); if (HasTerminal(SP_PARM)) { #ifdef USE_TERM_DRIVER code = HasColor; @@ -938,9 +932,12 @@ _nc_pair_content(SCREEN *sp, int pair, int *f, int *b) if (!ValidPair(sp, pair)) { result = ERR; } else { - int fg = FORE_OF(sp->_color_pairs[pair]); - int bg = BACK_OF(sp->_color_pairs[pair]); + int fg; + int bg; + ReservePairs(sp, pair); + fg = FORE_OF(sp->_color_pairs[pair]); + bg = BACK_OF(sp->_color_pairs[pair]); #if NCURSES_EXT_FUNCS if (isDefaultColor(fg)) fg = -1; @@ -1006,7 +1003,7 @@ NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx if (set_color_pair) { TPUTS_TRACE("set_color_pair"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_1(set_color_pair, pair), + TIPARM_1(set_color_pair, pair), 1, outc); return; } else if (SP_PARM != 0) { @@ -1082,7 +1079,7 @@ _nc_do_color(int old_pair, int pair, int reverse, NCURSES_OUTC outc) } #endif -#if USE_EXTENDED_COLORS +#if NCURSES_EXT_COLORS NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_pair) (NCURSES_SP_DCLx int pair, int f, int b) { @@ -1122,7 +1119,7 @@ NCURSES_SP_NAME(reset_color_pairs) (NCURSES_SP_DCL0) free(SP_PARM->_color_pairs); SP_PARM->_color_pairs = 0; SP_PARM->_pair_alloc = 0; - _nc_reserve_pairs(SP_PARM, 16); + ReservePairs(SP_PARM, 16); clearok(CurScreen(SP_PARM), TRUE); touchwin(StdScreen(SP_PARM)); } @@ -1164,4 +1161,4 @@ reset_color_pairs(void) NCURSES_SP_NAME(reset_color_pairs) (CURRENT_SCREEN); } #endif /* NCURSES_SP_FUNCS */ -#endif /* USE_EXTENDED_COLORS */ +#endif /* NCURSES_EXT_COLORS */