aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGerd Moellmann2000-03-12 12:52:29 +0000
committerGerd Moellmann2000-03-12 12:52:29 +0000
commit7b746c381028daf76dee9a2a9f2c5fbe01217f48 (patch)
treeeafd3b9c8ad8af49ec6ace4487de27856b7fd565 /src
parente411ce4be078f9d9846cfff09daf6a2849f362d8 (diff)
downloademacs-7b746c381028daf76dee9a2a9f2c5fbe01217f48.tar.gz
emacs-7b746c381028daf76dee9a2a9f2c5fbe01217f48.zip
(x_defined_color): Rewritten to use x_allocate_nearest_color.
Diffstat (limited to 'src')
-rw-r--r--src/xfns.c100
1 files changed, 16 insertions, 84 deletions
diff --git a/src/xfns.c b/src/xfns.c
index 0282f651d0e..496b9a931b0 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -1232,97 +1232,29 @@ gamma_correct (f, color)
1232} 1232}
1233 1233
1234 1234
1235/* Decide if color named COLOR is valid for the display associated with 1235/* Decide if color named COLOR_NAME is valid for use on frame F. If
1236 the selected frame; if so, return the rgb values in COLOR_DEF. 1236 so, return the RGB values in COLOR. If ALLOC_P is non-zero,
1237 If ALLOC is nonzero, allocate a new colormap cell. */ 1237 allocate the color. Value is zero if COLOR_NAME is invalid, or
1238 no color could be allocated. */
1238 1239
1239int 1240int
1240x_defined_color (f, color, color_def, alloc) 1241x_defined_color (f, color_name, color, alloc_p)
1241 FRAME_PTR f; 1242 struct frame *f;
1242 char *color; 1243 char *color_name;
1243 XColor *color_def; 1244 XColor *color;
1244 int alloc; 1245 int alloc_p;
1245{ 1246{
1246 register int status; 1247 int success_p;
1247 Colormap screen_colormap; 1248 Display *dpy = FRAME_X_DISPLAY (f);
1248 Display *display = FRAME_X_DISPLAY (f); 1249 Colormap cmap = FRAME_X_COLORMAP (f);
1249 1250
1250 BLOCK_INPUT; 1251 BLOCK_INPUT;
1251 screen_colormap = FRAME_X_COLORMAP (f); 1252 success_p = XParseColor (dpy, cmap, color_name, color);
1252 1253 if (success_p && alloc_p)
1253 status = XParseColor (display, screen_colormap, color, color_def); 1254 success_p = x_alloc_nearest_color (f, cmap, color);
1254 if (status && alloc)
1255 {
1256 /* Apply gamma correction. */
1257 gamma_correct (f, color_def);
1258
1259 status = XAllocColor (display, screen_colormap, color_def);
1260 if (!status)
1261 {
1262 /* If we got to this point, the colormap is full, so we're
1263 going to try and get the next closest color.
1264 The algorithm used is a least-squares matching, which is
1265 what X uses for closest color matching with StaticColor visuals. */
1266
1267 XColor *cells;
1268 int no_cells;
1269 int nearest;
1270 long nearest_delta, trial_delta;
1271 int x;
1272
1273 no_cells = XDisplayCells (display, XDefaultScreen (display));
1274 cells = (XColor *) alloca (sizeof (XColor) * no_cells);
1275
1276 for (x = 0; x < no_cells; x++)
1277 cells[x].pixel = x;
1278
1279 XQueryColors (display, screen_colormap, cells, no_cells);
1280 nearest = 0;
1281 /* I'm assuming CSE so I'm not going to condense this. */
1282 nearest_delta = ((((color_def->red >> 8) - (cells[0].red >> 8))
1283 * ((color_def->red >> 8) - (cells[0].red >> 8)))
1284 +
1285 (((color_def->green >> 8) - (cells[0].green >> 8))
1286 * ((color_def->green >> 8) - (cells[0].green >> 8)))
1287 +
1288 (((color_def->blue >> 8) - (cells[0].blue >> 8))
1289 * ((color_def->blue >> 8) - (cells[0].blue >> 8))));
1290 for (x = 1; x < no_cells; x++)
1291 {
1292 trial_delta = ((((color_def->red >> 8) - (cells[x].red >> 8))
1293 * ((color_def->red >> 8) - (cells[x].red >> 8)))
1294 +
1295 (((color_def->green >> 8) - (cells[x].green >> 8))
1296 * ((color_def->green >> 8) - (cells[x].green >> 8)))
1297 +
1298 (((color_def->blue >> 8) - (cells[x].blue >> 8))
1299 * ((color_def->blue >> 8) - (cells[x].blue >> 8))));
1300 if (trial_delta < nearest_delta)
1301 {
1302 XColor temp;
1303 temp.red = cells[x].red;
1304 temp.green = cells[x].green;
1305 temp.blue = cells[x].blue;
1306 status = XAllocColor (display, screen_colormap, &temp);
1307 if (status)
1308 {
1309 nearest = x;
1310 nearest_delta = trial_delta;
1311 }
1312 }
1313 }
1314 color_def->red = cells[nearest].red;
1315 color_def->green = cells[nearest].green;
1316 color_def->blue = cells[nearest].blue;
1317 status = XAllocColor (display, screen_colormap, color_def);
1318 }
1319 }
1320 UNBLOCK_INPUT; 1255 UNBLOCK_INPUT;
1321 1256
1322 if (status) 1257 return success_p;
1323 return 1;
1324 else
1325 return 0;
1326} 1258}
1327 1259
1328 1260