diff options
| author | Gerd Moellmann | 2000-03-12 12:52:29 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 2000-03-12 12:52:29 +0000 |
| commit | 7b746c381028daf76dee9a2a9f2c5fbe01217f48 (patch) | |
| tree | eafd3b9c8ad8af49ec6ace4487de27856b7fd565 /src | |
| parent | e411ce4be078f9d9846cfff09daf6a2849f362d8 (diff) | |
| download | emacs-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.c | 100 |
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 | ||
| 1239 | int | 1240 | int |
| 1240 | x_defined_color (f, color, color_def, alloc) | 1241 | x_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 | ||