Mercurial > hg > xemacs-beta
annotate lwlib/lwlib-colors.c @ 4981:4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
-------------------- ChangeLog entries follow: --------------------
modules/ChangeLog addition:
2010-02-05 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
* postgresql/postgresql.c (CHECK_LIVE_CONNECTION):
* postgresql/postgresql.c (Fpq_connectdb):
* postgresql/postgresql.c (Fpq_connect_start):
* postgresql/postgresql.c (Fpq_lo_import):
* postgresql/postgresql.c (Fpq_lo_export):
* ldap/eldap.c (Fldap_open):
* ldap/eldap.c (Fldap_search_basic):
* ldap/eldap.c (Fldap_add):
* ldap/eldap.c (Fldap_modify):
* ldap/eldap.c (Fldap_delete):
* canna/canna_api.c (Fcanna_initialize):
* canna/canna_api.c (Fcanna_store_yomi):
* canna/canna_api.c (Fcanna_parse):
* canna/canna_api.c (Fcanna_henkan_begin):
EXTERNAL_TO_C_STRING returns its argument instead of storing it
in a parameter, and is renamed to EXTERNAL_TO_ITEXT. Similar
things happen to related macros. See entry in src/ChangeLog.
More Mule-izing of postgresql.c. Extract out common code
between `pq-connectdb' and `pq-connect-start'. Fix places
that signal an error string using a formatted string to instead
follow the standard and have a fixed reason followed by the
particular error message stored as one of the frobs.
src/ChangeLog addition:
2010-02-05 Ben Wing <ben@xemacs.org>
* console-msw.c (write_string_to_mswindows_debugging_output):
* console-msw.c (Fmswindows_message_box):
* console-x.c (x_perhaps_init_unseen_key_defaults):
* console.c:
* database.c (dbm_get):
* database.c (dbm_put):
* database.c (dbm_remove):
* database.c (berkdb_get):
* database.c (berkdb_put):
* database.c (berkdb_remove):
* database.c (Fopen_database):
* device-gtk.c (gtk_init_device):
* device-msw.c (msprinter_init_device_internal):
* device-msw.c (msprinter_default_printer):
* device-msw.c (msprinter_init_device):
* device-msw.c (sync_printer_with_devmode):
* device-msw.c (Fmsprinter_select_settings):
* device-x.c (sanity_check_geometry_resource):
* device-x.c (Dynarr_add_validified_lisp_string):
* device-x.c (x_init_device):
* device-x.c (Fx_put_resource):
* device-x.c (Fx_valid_keysym_name_p):
* device-x.c (Fx_set_font_path):
* dialog-msw.c (push_lisp_string_as_unicode):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-msw.c (handle_file_dialog_box):
* dialog-x.c (dbox_descriptor_to_widget_value):
* editfns.c (Fformat_time_string):
* editfns.c (Fencode_time):
* editfns.c (Fset_time_zone_rule):
* emacs.c (make_argc_argv):
* emacs.c (Fdump_emacs):
* emodules.c (emodules_load):
* eval.c:
* eval.c (maybe_signal_error_1):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (mswindows_wnd_proc):
* fileio.c (report_error_with_errno):
* fileio.c (Fsysnetunam):
* fileio.c (Fdo_auto_save):
* font-mgr.c (extract_fcapi_string):
* font-mgr.c (Ffc_config_app_font_add_file):
* font-mgr.c (Ffc_config_app_font_add_dir):
* font-mgr.c (Ffc_config_filename):
* frame-gtk.c (gtk_set_frame_text_value):
* frame-gtk.c (gtk_create_widgets):
* frame-msw.c (mswindows_init_frame_1):
* frame-msw.c (mswindows_set_title_from_ibyte):
* frame-msw.c (msprinter_init_frame_3):
* frame-x.c (x_set_frame_text_value):
* frame-x.c (x_set_frame_properties):
* frame-x.c (start_drag_internal_1):
* frame-x.c (x_cde_transfer_callback):
* frame-x.c (x_create_widgets):
* glyphs-eimage.c (my_jpeg_output_message):
* glyphs-eimage.c (jpeg_instantiate):
* glyphs-eimage.c (gif_instantiate):
* glyphs-eimage.c (png_instantiate):
* glyphs-eimage.c (tiff_instantiate):
* glyphs-gtk.c (xbm_instantiate_1):
* glyphs-gtk.c (gtk_xbm_instantiate):
* glyphs-gtk.c (gtk_xpm_instantiate):
* glyphs-gtk.c (gtk_xface_instantiate):
* glyphs-gtk.c (cursor_font_instantiate):
* glyphs-gtk.c (gtk_redisplay_widget):
* glyphs-gtk.c (gtk_widget_instantiate_1):
* glyphs-gtk.c (gtk_add_tab_item):
* glyphs-msw.c (mswindows_xpm_instantiate):
* glyphs-msw.c (bmp_instantiate):
* glyphs-msw.c (mswindows_resource_instantiate):
* glyphs-msw.c (xbm_instantiate_1):
* glyphs-msw.c (mswindows_xbm_instantiate):
* glyphs-msw.c (mswindows_xface_instantiate):
* glyphs-msw.c (mswindows_redisplay_widget):
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs-msw.c (add_tree_item):
* glyphs-msw.c (add_tab_item):
* glyphs-msw.c (mswindows_combo_box_instantiate):
* glyphs-msw.c (mswindows_widget_query_string_geometry):
* glyphs-x.c (x_locate_pixmap_file):
* glyphs-x.c (xbm_instantiate_1):
* glyphs-x.c (x_xbm_instantiate):
* glyphs-x.c (extract_xpm_color_names):
* glyphs-x.c (x_xpm_instantiate):
* glyphs-x.c (x_xface_instantiate):
* glyphs-x.c (autodetect_instantiate):
* glyphs-x.c (safe_XLoadFont):
* glyphs-x.c (cursor_font_instantiate):
* glyphs-x.c (x_redisplay_widget):
* glyphs-x.c (Fchange_subwindow_property):
* glyphs-x.c (x_widget_instantiate):
* glyphs-x.c (x_tab_control_redisplay):
* glyphs.c (pixmap_to_lisp_data):
* gui-x.c (menu_separator_style_and_to_external):
* gui-x.c (add_accel_and_to_external):
* gui-x.c (button_item_to_widget_value):
* hpplay.c (player_error_internal):
* hpplay.c (play_sound_file):
* hpplay.c (play_sound_data):
* intl.c (Fset_current_locale):
* lisp.h:
* menubar-gtk.c (gtk_xemacs_set_accel_keys):
* menubar-msw.c (populate_menu_add_item):
* menubar-msw.c (populate_or_checksum_helper):
* menubar-x.c (menu_item_descriptor_to_widget_value_1):
* nt.c (init_user_info):
* nt.c (get_long_basename):
* nt.c (nt_get_resource):
* nt.c (init_mswindows_environment):
* nt.c (get_cached_volume_information):
* nt.c (mswindows_readdir):
* nt.c (read_unc_volume):
* nt.c (mswindows_stat):
* nt.c (mswindows_getdcwd):
* nt.c (mswindows_executable_type):
* nt.c (Fmswindows_short_file_name):
* ntplay.c (nt_play_sound_file):
* objects-gtk.c:
* objects-gtk.c (gtk_valid_color_name_p):
* objects-gtk.c (gtk_initialize_font_instance):
* objects-gtk.c (gtk_font_list):
* objects-msw.c (font_enum_callback_2):
* objects-msw.c (parse_font_spec):
* objects-x.c (x_parse_nearest_color):
* objects-x.c (x_valid_color_name_p):
* objects-x.c (x_initialize_font_instance):
* objects-x.c (x_font_instance_truename):
* objects-x.c (x_font_list):
* objects-xlike-inc.c (XFUN):
* objects-xlike-inc.c (xft_find_charset_font):
* process-nt.c (mswindows_report_winsock_error):
* process-nt.c (nt_create_process):
* process-nt.c (get_internet_address):
* process-nt.c (nt_open_network_stream):
* process-unix.c:
* process-unix.c (allocate_pty):
* process-unix.c (get_internet_address):
* process-unix.c (unix_canonicalize_host_name):
* process-unix.c (unix_open_network_stream):
* realpath.c:
* select-common.h (lisp_data_to_selection_data):
* select-gtk.c (symbol_to_gtk_atom):
* select-gtk.c (atom_to_symbol):
* select-msw.c (symbol_to_ms_cf):
* select-msw.c (mswindows_register_selection_data_type):
* select-x.c (symbol_to_x_atom):
* select-x.c (x_atom_to_symbol):
* select-x.c (hack_motif_clipboard_selection):
* select-x.c (Fx_store_cutbuffer_internal):
* sound.c (Fplay_sound_file):
* sound.c (Fplay_sound):
* sound.h (sound_perror):
* sysdep.c:
* sysdep.c (qxe_allocating_getcwd):
* sysdep.c (qxe_execve):
* sysdep.c (copy_in_passwd):
* sysdep.c (qxe_getpwnam):
* sysdep.c (qxe_ctime):
* sysdll.c (dll_open):
* sysdll.c (dll_function):
* sysdll.c (dll_variable):
* sysdll.c (search_linked_libs):
* sysdll.c (dll_error):
* sysfile.h:
* sysfile.h (PATHNAME_CONVERT_OUT_TSTR):
* sysfile.h (PATHNAME_CONVERT_OUT_UTF_8):
* sysfile.h (PATHNAME_CONVERT_OUT):
* sysfile.h (LISP_PATHNAME_CONVERT_OUT):
* syswindows.h (ITEXT_TO_TSTR):
* syswindows.h (LOCAL_FILE_FORMAT_TO_TSTR):
* syswindows.h (TSTR_TO_LOCAL_FILE_FORMAT):
* syswindows.h (LOCAL_FILE_FORMAT_TO_INTERNAL_MSWIN):
* syswindows.h (LISP_LOCAL_FILE_FORMAT_MAYBE_URL_TO_TSTR):
* text.h:
* text.h (eicpy_ext_len):
* text.h (enum new_dfc_src_type):
* text.h (EXTERNAL_TO_ITEXT):
* text.h (GET_STRERROR):
* tooltalk.c (check_status):
* tooltalk.c (Fadd_tooltalk_message_arg):
* tooltalk.c (Fadd_tooltalk_pattern_attribute):
* tooltalk.c (Fadd_tooltalk_pattern_arg):
* win32.c (tstr_to_local_file_format):
* win32.c (mswindows_lisp_error_1):
* win32.c (mswindows_report_process_error):
* win32.c (Fmswindows_shell_execute):
* win32.c (mswindows_read_link_1):
Changes involving external/internal format conversion,
mostly code cleanup and renaming.
1. Eliminate the previous macros like LISP_STRING_TO_EXTERNAL
that stored its result in a parameter. The new version of
LISP_STRING_TO_EXTERNAL returns its result through the
return value, same as the previous NEW_LISP_STRING_TO_EXTERNAL.
Use the new-style macros throughout the code.
2. Rename C_STRING_TO_EXTERNAL and friends to ITEXT_TO_EXTERNAL,
in keeping with overall naming rationalization involving
Itext and related types.
Macros involved in previous two:
EXTERNAL_TO_C_STRING -> EXTERNAL_TO_ITEXT
EXTERNAL_TO_C_STRING_MALLOC -> EXTERNAL_TO_ITEXT_MALLOC
SIZED_EXTERNAL_TO_C_STRING -> SIZED_EXTERNAL_TO_ITEXT
SIZED_EXTERNAL_TO_C_STRING_MALLOC -> SIZED_EXTERNAL_TO_ITEXT_MALLOC
C_STRING_TO_EXTERNAL -> ITEXT_TO_EXTERNAL
C_STRING_TO_EXTERNAL_MALLOC -> ITEXT_TO_EXTERNAL_MALLOC
LISP_STRING_TO_EXTERNAL
LISP_STRING_TO_EXTERNAL_MALLOC
LISP_STRING_TO_TSTR
C_STRING_TO_TSTR -> ITEXT_TO_TSTR
TSTR_TO_C_STRING -> TSTR_TO_ITEXT
The following four still return their values through parameters,
since they have more than one value to return:
C_STRING_TO_SIZED_EXTERNAL -> ITEXT_TO_SIZED_EXTERNAL
LISP_STRING_TO_SIZED_EXTERNAL
C_STRING_TO_SIZED_EXTERNAL_MALLOC -> ITEXT_TO_SIZED_EXTERNAL_MALLOC
LISP_STRING_TO_SIZED_EXTERNAL_MALLOC
Sometimes additional casts had to be inserted, since the old
macros played strange games and completely defeated the type system
of the store params.
3. Rewrite many places where direct calls to TO_EXTERNAL_FORMAT
occurred with calls to one of the convenience macros listed above,
or to make_extstring().
4. Eliminate SIZED_C_STRING macros (they were hardly used, anyway)
and use a direct call to TO_EXTERNAL_FORMAT or TO_INTERNAL_FORMAT.
4. Use LISP_PATHNAME_CONVERT_OUT in many places instead of something
like LISP_STRING_TO_EXTERNAL(..., Qfile_name).
5. Eliminate some temporary variables that are no longer necessary
now that we return a value rather than storing it into a variable.
6. Some Mule-izing in database.c.
7. Error functions:
-- A bit of code cleanup in maybe_signal_error_1.
-- Eliminate report_file_type_error; it's just an alias for
signal_error_2 with params in a different order.
-- Fix some places in the hostname-handling code that directly
inserted externally-retrieved error strings into the
supposed ASCII "reason" param instead of doing the right thing
and sticking text descriptive of what was going on in "reason"
and putting the external message in a frob.
8. Use Ascbyte instead of CIbyte in process-unix.c and maybe one
or two other places.
9. Some code cleanup in copy_in_passwd() in sysdep.c.
10. Fix a real bug due to accidental variable shadowing in
tstr_to_local_file_format() in win32.c.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Fri, 05 Feb 2010 11:02:24 -0600 |
parents | a6c778975d7d |
children | 308d34e9f07d |
rev | line source |
---|---|
3094 | 1 /* Color data structures for X and Xft. |
2 | |
3 Copyright (C) 2004 Free Software Foundation, Inc. | |
4 | |
5 Author: Stephen J. Turnbull <stephen@xemacs.org> | |
6 Created: 24 Jul 2004 by Stephen J. Turnbull | |
7 | |
8 This file is part of XEmacs. | |
9 | |
10 XEmacs is free software; you can redistribute it and/or modify it | |
11 under the terms of the GNU General Public License as published by the | |
12 Free Software Foundation; either version 2, or (at your option) any | |
13 later version. | |
14 | |
15 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
18 for more details. | |
19 | |
20 You should have received a copy of the GNU General Public License | |
21 along with XEmacs; see the file COPYING. If not, write to | |
22 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
23 Boston, MA 02111-1307, USA. */ | |
24 | |
25 /* Synched up with: Not in GNU Emacs. */ | |
26 | |
27 #include <config.h> | |
28 #include <limits.h> /* for ULONG_MAX */ | |
29 #include <stdlib.h> /* for malloc() */ | |
30 #include <stdio.h> | |
31 #include <X11/Xlib.h> | |
32 #include <X11/IntrinsicP.h> | |
33 #include <X11/ShellP.h> /* for ShellWidget */ | |
34 #include "lwlib-colors.h" | |
35 | |
36 static int debug_colors = 1; | |
37 | |
38 #ifdef __cplusplus | |
39 #define X_CLASSFIELD c_class | |
40 #else | |
41 #define X_CLASSFIELD class | |
42 #endif | |
43 | |
44 #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \ | |
45 ? ((unsigned long) (x)) : ((unsigned long) (y))) | |
46 | |
47 /* WIDGET is an Xt widget, VISUAL and DEPTH are return values */ | |
48 void | |
49 visual_info_from_widget (Widget widget, Visual **visual, int *depth) | |
50 { | |
51 /* grab the visual and depth from the nearest shell ancestor */ | |
52 Widget p = XtParent(widget); | |
53 | |
54 *visual = CopyFromParent; | |
55 *depth = -1; | |
56 while (*visual == CopyFromParent && p) | |
57 { | |
58 if (XtIsShell(p)) | |
59 { | |
60 *visual = ((ShellWidget)p)->shell.visual; | |
61 *depth = p->core.depth; | |
62 } | |
63 p = XtParent(p); | |
64 } | |
65 if (*visual == CopyFromParent || !*visual) | |
66 { | |
67 if (debug_colors > 1) | |
68 fprintf (stderr, "\nvisual_info_from_widget:" | |
69 " failed, using DefaultVisualOfScreen"); | |
70 *visual = DefaultVisualOfScreen (XtScreen (widget)); | |
71 *depth = DefaultDepthOfScreen (XtScreen (widget)); | |
72 } | |
73 else if (debug_colors > 1) | |
74 fprintf (stderr, "\nvisual_info_from_widget: succeeded"); | |
75 } | |
76 | |
77 /* Do we need all this hair on modern hardware? */ | |
78 | |
79 /* Replacement for XAllocColor() that tries to return the nearest | |
80 available color if the colormap is full. Original was from FSFmacs, | |
81 but rewritten by Jareth Hein <jareth@camelot-soft.com> 97/11/25 | |
82 Modified by Lee Kindness <lkindness@csl.co.uk> 31/08/99 to handle previous | |
83 total failure which was due to a read/write colorcell being the nearest | |
84 match - tries the next nearest... | |
85 | |
86 Return value is 1 for normal success, 2 for nearest color success, | |
87 3 for Non-deallocable success. */ | |
88 int | |
89 x_allocate_nearest_color (Display *display, Colormap colormap, | |
90 Visual *visual, XColor *color_def) | |
91 { | |
92 int status; | |
93 | |
94 /* #### [[Apparently this is often called with data derived from a widget | |
95 with no ShellWidget ancestor, or before the shell has a visual. | |
96 Currently this recovery code is in xlwmenu.c and xlwscrollbar.c, but | |
97 likely should come here.]] | |
98 I suspect the problem is that the visual-tracing code was improperly | |
99 written, missing a level of indirection. | |
100 CopyFromParent == NULL in XFree86/Darwin. | |
101 */ | |
102 if (visual == CopyFromParent || !visual) | |
103 { | |
104 Screen *screen = DefaultScreenOfDisplay (display); | |
105 fprintf (stderr, "\nx_allocate_nearest_color: bad visual (%08lx)", | |
106 (unsigned long) visual); | |
107 visual = DefaultVisualOfScreen (screen); | |
108 } | |
109 | |
110 if (visual->X_CLASSFIELD == DirectColor || visual->X_CLASSFIELD == TrueColor) | |
111 { | |
112 if (XAllocColor (display, colormap, color_def) != 0) | |
113 { | |
114 status = 1; | |
115 } | |
116 else | |
117 { | |
118 /* We're dealing with a TrueColor/DirectColor visual, so play games | |
119 with the RGB values in the XColor struct. */ | |
120 /* #### JH: I'm not sure how a call to XAllocColor can fail in a | |
121 TrueColor or DirectColor visual, so I will just reformat the | |
122 request to match the requirements of the visual, and re-issue | |
123 the request. If this fails for anybody, I wanna know about it | |
124 so I can come up with a better plan */ | |
125 | |
126 unsigned long rshift,gshift,bshift,rbits,gbits,bbits,junk; | |
127 junk = visual->red_mask; | |
128 rshift = 0; | |
129 while ((junk & 0x1) == 0) { | |
130 junk = junk >> 1; | |
131 rshift ++; | |
132 } | |
133 rbits = 0; | |
134 while (junk != 0) { | |
135 junk = junk >> 1; | |
136 rbits++; | |
137 } | |
138 junk = visual->green_mask; | |
139 gshift = 0; | |
140 while ((junk & 0x1) == 0) { | |
141 junk = junk >> 1; | |
142 gshift ++; | |
143 } | |
144 gbits = 0; | |
145 while (junk != 0) { | |
146 junk = junk >> 1; | |
147 gbits++; | |
148 } | |
149 junk = visual->blue_mask; | |
150 bshift = 0; | |
151 while ((junk & 0x1) == 0) { | |
152 junk = junk >> 1; | |
153 bshift ++; | |
154 } | |
155 bbits = 0; | |
156 while (junk != 0) { | |
157 junk = junk >> 1; | |
158 bbits++; | |
159 } | |
160 | |
161 color_def->red = color_def->red >> (16 - rbits); | |
162 color_def->green = color_def->green >> (16 - gbits); | |
163 color_def->blue = color_def->blue >> (16 - bbits); | |
164 if (XAllocColor (display, colormap, color_def) != 0) | |
165 status = 1; | |
166 else | |
167 { | |
168 int rd, gr, bl; | |
169 /* #### JH: I'm punting here, knowing that doing this will at | |
170 least draw the color correctly. However, unless we convert | |
171 all of the functions that allocate colors (graphics | |
172 libraries, etc) to use this function doing this is very | |
173 likely to cause problems later... */ | |
174 | |
175 if (rbits > 8) | |
176 rd = color_def->red << (rbits - 8); | |
177 else | |
178 rd = color_def->red >> (8 - rbits); | |
179 if (gbits > 8) | |
180 gr = color_def->green << (gbits - 8); | |
181 else | |
182 gr = color_def->green >> (8 - gbits); | |
183 if (bbits > 8) | |
184 bl = color_def->blue << (bbits - 8); | |
185 else | |
186 bl = color_def->blue >> (8 - bbits); | |
187 color_def->pixel = (rd << rshift) | (gr << gshift) | (bl << | |
188 bshift); | |
189 status = 3; | |
190 } | |
191 } | |
192 } | |
193 else | |
194 { | |
195 XColor *cells = NULL; | |
196 /* JH: I can't believe there's no way to go backwards from a | |
197 colormap ID and get its visual and number of entries, but X | |
198 apparently isn't built that way... */ | |
199 int no_cells = visual->map_entries; | |
200 status = 0; | |
201 | |
202 if (XAllocColor (display, colormap, color_def) != 0) | |
203 status = 1; | |
204 else while( status != 2 ) | |
205 { | |
206 /* If we got to this point, the colormap is full, so we're | |
207 going to try and get the next closest color. The algorithm used | |
208 is a least-squares matching, which is what X uses for closest | |
209 color matching with StaticColor visuals. */ | |
210 int nearest; | |
211 long nearest_delta, trial_delta; | |
212 int x; | |
213 | |
214 if( cells == NULL ) | |
215 { | |
216 /* #### this could be annoyingly slow | |
217 tell me again why lwlib can't use alloca & friends? */ | |
218 cells = (XColor *) malloc (sizeof(XColor)*no_cells); | |
219 for (x = 0; x < no_cells; x++) | |
220 cells[x].pixel = x; | |
221 | |
222 /* read the current colormap */ | |
223 XQueryColors (display, colormap, cells, no_cells); | |
224 } | |
225 | |
226 nearest = 0; | |
227 /* I'm assuming CSE so I'm not going to condense this. */ | |
228 nearest_delta = ((((color_def->red >> 8) - (cells[0].red >> 8)) | |
229 * ((color_def->red >> 8) - (cells[0].red >> 8))) | |
230 + | |
231 (((color_def->green >> 8) - (cells[0].green >> 8)) | |
232 * ((color_def->green >> 8) - (cells[0].green >> | |
233 8))) | |
234 + | |
235 (((color_def->blue >> 8) - (cells[0].blue >> 8)) | |
236 * ((color_def->blue >> 8) - (cells[0].blue >> | |
237 8)))); | |
238 for (x = 1; x < no_cells; x++) | |
239 { | |
240 trial_delta = ((((color_def->red >> 8) - (cells[x].red >> 8)) | |
241 * ((color_def->red >> 8) - (cells[x].red >> 8))) | |
242 + | |
243 (((color_def->green >> 8) - (cells[x].green >> 8)) | |
244 * ((color_def->green >> 8) - (cells[x].green >> | |
245 8))) | |
246 + | |
247 (((color_def->blue >> 8) - (cells[x].blue >> 8)) | |
248 * ((color_def->blue >> 8) - (cells[x].blue >> | |
249 8)))); | |
250 | |
251 /* less? Ignore cells marked as previously failing */ | |
252 if( (trial_delta < nearest_delta) && | |
253 (cells[x].pixel != ULONG_MAX) ) | |
254 { | |
255 nearest = x; | |
256 nearest_delta = trial_delta; | |
257 } | |
258 } | |
259 color_def->red = cells[nearest].red; | |
260 color_def->green = cells[nearest].green; | |
261 color_def->blue = cells[nearest].blue; | |
262 if (XAllocColor (display, colormap, color_def) != 0) | |
263 status = 2; | |
264 else | |
265 /* LSK: Either the colour map has changed since | |
266 * we read it, or the colour is allocated | |
267 * read/write... Mark this cmap entry so it's | |
268 * ignored in the next iteration. | |
269 */ | |
270 cells[nearest].pixel = ULONG_MAX; | |
271 } | |
272 } | |
273 return status; | |
274 } | |
275 | |
276 #if 0 | |
277 /* Replacement for XAllocColor() that tries to return the nearest | |
278 available color if the colormap is full. From GNU Emacs. | |
279 #### Review this to see if there's anything our hairy version could use. */ | |
280 | |
281 int | |
282 FIXME_allocate_nearest_color (Display *display, Colormap screen_colormap, | |
283 XColor *color_def) | |
284 { | |
285 int status = XAllocColor (display, screen_colormap, color_def); | |
286 if (status) | |
287 return status; | |
288 | |
289 { | |
290 /* If we got to this point, the colormap is full, so we're | |
291 going to try to get the next closest color. | |
292 The algorithm used is a least-squares matching, which is | |
293 what X uses for closest color matching with StaticColor visuals. */ | |
294 | |
295 int nearest, x; | |
296 unsigned long nearest_delta = ULONG_MAX; | |
297 | |
298 int no_cells = XDisplayCells (display, XDefaultScreen (display)); | |
299 /* Don't use alloca here because lwlib doesn't have the | |
300 necessary configuration information that src does. */ | |
301 XColor *cells = (XColor *) malloc (sizeof (XColor) * no_cells); | |
302 | |
303 for (x = 0; x < no_cells; x++) | |
304 cells[x].pixel = x; | |
305 | |
306 XQueryColors (display, screen_colormap, cells, no_cells); | |
307 | |
308 for (nearest = 0, x = 0; x < no_cells; x++) | |
309 { | |
310 long dred = (color_def->red >> 8) - (cells[x].red >> 8); | |
311 long dgreen = (color_def->green >> 8) - (cells[x].green >> 8); | |
312 long dblue = (color_def->blue >> 8) - (cells[x].blue >> 8); | |
313 unsigned long delta = dred * dred + dgreen * dgreen + dblue * dblue; | |
314 | |
315 if (delta < nearest_delta) | |
316 { | |
317 nearest = x; | |
318 nearest_delta = delta; | |
319 } | |
320 } | |
321 color_def->red = cells[nearest].red; | |
322 color_def->green = cells[nearest].green; | |
323 color_def->blue = cells[nearest].blue; | |
324 free (cells); | |
325 return XAllocColor (display, screen_colormap, color_def); | |
326 } | |
327 } | |
328 #endif | |
329 | |
330 | |
4916
a6c778975d7d
split USE_XFT into HAVE_XFT/USE_XFT
Ben Wing <ben@xemacs.org>
parents:
3094
diff
changeset
|
331 #ifdef HAVE_XFT |
3094 | 332 |
333 XftColor | |
334 xft_convert_color (Display *dpy, Colormap cmap, Visual *visual, int c, int dim) | |
335 { | |
336 static XColor color; /* #### why is this static ?? */ | |
337 XftColor result; | |
338 | |
339 color.pixel = c; | |
340 XQueryColor(dpy, cmap, &color); | |
341 | |
342 if (dim) | |
343 { | |
344 color.red = MINL (65535, color.red * 1.5); | |
345 color.green = MINL (65535, color.green * 1.5); | |
346 color.blue = MINL (65535, color.blue * 1.5); | |
347 x_allocate_nearest_color (dpy, cmap, visual, &color); | |
348 } | |
349 | |
350 result.pixel = color.pixel; | |
351 result.color.red = color.red; | |
352 result.color.green = color.green; | |
353 result.color.blue = color.blue; | |
354 result.color.alpha = 0xffff; | |
355 | |
356 return result; | |
357 } | |
358 | |
4916
a6c778975d7d
split USE_XFT into HAVE_XFT/USE_XFT
Ben Wing <ben@xemacs.org>
parents:
3094
diff
changeset
|
359 #endif /* HAVE_XFT */ |
3094 | 360 |
361 /* end of lwlib-colors.c */ |