?? gdkcolor-win32.c
字號:
} else { pixels = g_new (gulong, ncolors); /* Allocation of a writeable color cells */ status = alloc_color_cells (colormap, FALSE, NULL, 0, pixels, ncolors); if (status) { for (i = 0; i < ncolors; i++) { colors[i].pixel = pixels[i]; private->info[pixels[i]].ref_count++; private->info[pixels[i]].flags |= GDK_COLOR_WRITEABLE; } } g_free (pixels); return status ? ncolors : 0; }}static gintgdk_colormap_alloc_colors_private (GdkColormap *colormap, GdkColor *colors, gint ncolors, gboolean writeable, gboolean best_match, gboolean *success){ GdkColormapPrivateWin32 *cmapp; gint i, index; PALETTEENTRY pe; gint nremaining = 0; cmapp = GDK_WIN32_COLORMAP_DATA (colormap); index = -1; /* First, store the colors we have room for */ index = 0; for (i = 0; i < ncolors; i++) { if (!success[i]) { while ((index < colormap->size) && (cmapp->info[index].ref_count != 0)) index++; if (index < colormap->size) { if (index >= cmapp->current_size) { if (!ResizePalette (cmapp->hpal, index + 1)) { WIN32_GDI_FAILED ("ResizePalette"); nremaining++; } else cmapp->current_size = index + 1; } if (index < cmapp->current_size) { pe.peRed = colors[i].red >> 8; pe.peBlue = colors[i].blue >> 8; pe.peGreen = colors[i].green >> 8; pe.peFlags = 0; if (!SetPaletteEntries (cmapp->hpal, index, 1, &pe)) { WIN32_GDI_FAILED ("SetPaletteEntries"); nremaining++; } else { success[i] = TRUE; colors[i].pixel = index; colormap->colors[index] = colors[i]; cmapp->info[index].ref_count++; } } } else nremaining++; } } if (nremaining > 0 && best_match) { /* Get best matches for remaining colors */ gchar *available = g_new (gchar, colormap->size); for (i = 0; i < colormap->size; i++) available[i] = TRUE; for (i=0; i<ncolors; i++) { if (!success[i]) { index = gdk_colormap_match_color (colormap, &colors[i], available); if (index != -1) { colors[i] = colormap->colors[index]; cmapp->info[index].ref_count++; success[i] = TRUE; nremaining--; } } } g_free (available); } return (ncolors - nremaining);}static gintgdk_colormap_alloc_colors_shared (GdkColormap *colormap, GdkColor *colors, gint ncolors, gboolean writeable, gboolean best_match, gboolean *success){ GdkColormapPrivateWin32 *private; gint i, index; gint nremaining = 0; gint nfailed = 0; private = GDK_WIN32_COLORMAP_DATA (colormap); index = -1; for (i = 0; i < ncolors; i++) { if (!success[i]) { if (gdk_colormap_alloc1 (colormap, &colors[i], &colors[i])) success[i] = TRUE; else nremaining++; } } if (nremaining > 0 && best_match) { gchar *available = g_new (gchar, colormap->size); for (i = 0; i < colormap->size; i++) available[i] = ((private->info[i].ref_count == 0) || !(private->info[i].flags & GDK_COLOR_WRITEABLE)); while (nremaining > 0) { for (i = 0; i < ncolors; i++) { if (!success[i]) { index = gdk_colormap_match_color (colormap, &colors[i], available); if (index != -1) { if (private->info[index].ref_count) { private->info[index].ref_count++; colors[i] = colormap->colors[index]; success[i] = TRUE; nremaining--; } else { if (gdk_colormap_alloc1 (colormap, &colormap->colors[index], &colors[i])) { success[i] = TRUE; nremaining--; break; } else { available[index] = FALSE; } } } else { nfailed++; nremaining--; success[i] = 2; /* flag as permanent failure */ } } } } g_free (available); } /* Change back the values we flagged as permanent failures */ if (nfailed > 0) { for (i = 0; i < ncolors; i++) if (success[i] == 2) success[i] = FALSE; nremaining = nfailed; } return (ncolors - nremaining);}static gintgdk_colormap_alloc_colors_pseudocolor (GdkColormap *colormap, GdkColor *colors, gint ncolors, gboolean writeable, gboolean best_match, gboolean *success){ GdkColormapPrivateWin32 *private; GdkColor *lookup_color; gint i; gint nremaining = 0; private = GDK_WIN32_COLORMAP_DATA (colormap); /* Check for an exact match among previously allocated colors */ for (i = 0; i < ncolors; i++) { if (!success[i]) { lookup_color = g_hash_table_lookup (private->hash, &colors[i]); if (lookup_color) { private->info[lookup_color->pixel].ref_count++; colors[i].pixel = lookup_color->pixel; success[i] = TRUE; } else nremaining++; } } /* If that failed, we try to allocate a new color, or approxmiate * with what we can get if best_match is TRUE. */ if (nremaining > 0) { if (private->private_val) return gdk_colormap_alloc_colors_private (colormap, colors, ncolors, writeable, best_match, success); else return gdk_colormap_alloc_colors_shared (colormap, colors, ncolors, writeable, best_match, success); } else return 0;}gintgdk_colormap_alloc_colors (GdkColormap *colormap, GdkColor *colors, gint ncolors, gboolean writeable, gboolean best_match, gboolean *success){ GdkColormapPrivateWin32 *private; GdkVisual *visual; gint i; gint nremaining = 0; PALETTEENTRY pe; g_return_val_if_fail (GDK_IS_COLORMAP (colormap), FALSE); g_return_val_if_fail (colors != NULL, FALSE); private = GDK_WIN32_COLORMAP_DATA (colormap); for (i = 0; i < ncolors; i++) success[i] = FALSE; switch (colormap->visual->type) { case GDK_VISUAL_PSEUDO_COLOR: case GDK_VISUAL_GRAYSCALE: if (writeable) return gdk_colormap_alloc_colors_writeable (colormap, colors, ncolors, writeable, best_match, success); else return gdk_colormap_alloc_colors_pseudocolor (colormap, colors, ncolors, writeable, best_match, success); break; case GDK_VISUAL_TRUE_COLOR: visual = colormap->visual; for (i = 0; i < ncolors; i++) { colors[i].pixel = (((colors[i].red >> (16 - visual->red_prec)) << visual->red_shift) + ((colors[i].green >> (16 - visual->green_prec)) << visual->green_shift) + ((colors[i].blue >> (16 - visual->blue_prec)) << visual->blue_shift)); success[i] = TRUE; } break; case GDK_VISUAL_STATIC_GRAY: case GDK_VISUAL_STATIC_COLOR: for (i = 0; i < ncolors; i++) { pe.peRed = colors[i].red >> 8; pe.peGreen = colors[i].green >> 8; pe.peBlue = colors[i].blue >> 8; if (alloc_color (colormap, &pe, &colors[i].pixel)) success[i] = TRUE; else nremaining++; } break; case GDK_VISUAL_DIRECT_COLOR: g_assert_not_reached (); } return nremaining;}voidgdk_colormap_query_color (GdkColormap *colormap, gulong pixel, GdkColor *result){ GdkVisual *visual; g_return_if_fail (GDK_IS_COLORMAP (colormap)); visual = gdk_colormap_get_visual (colormap); switch (visual->type) { case GDK_VISUAL_DIRECT_COLOR: case GDK_VISUAL_TRUE_COLOR: result->red = 65535. * (double)((pixel & visual->red_mask) >> visual->red_shift) / ((1 << visual->red_prec) - 1); result->green = 65535. * (double)((pixel & visual->green_mask) >> visual->green_shift) / ((1 << visual->green_prec) - 1); result->blue = 65535. * (double)((pixel & visual->blue_mask) >> visual->blue_shift) / ((1 << visual->blue_prec) - 1); break; case GDK_VISUAL_STATIC_GRAY: case GDK_VISUAL_GRAYSCALE: result->red = result->green = result->blue = 65535. * (double)pixel/((1<<visual->depth) - 1); break; case GDK_VISUAL_STATIC_COLOR: case GDK_VISUAL_PSEUDO_COLOR: result->red = colormap->colors[pixel].red; result->green = colormap->colors[pixel].green; result->blue = colormap->colors[pixel].blue; break; default: g_assert_not_reached (); break; }}gbooleangdk_color_change (GdkColormap *colormap, GdkColor *color){ GdkColormapPrivateWin32 *private; PALETTEENTRY pe; g_return_val_if_fail (GDK_IS_COLORMAP (colormap), FALSE); g_return_val_if_fail (color != NULL, FALSE); private = GDK_WIN32_COLORMAP_DATA (colormap); if (color->pixel < 0 || color->pixel >= colormap->size) return FALSE; if (private->use[color->pixel] == GDK_WIN32_PE_STATIC) return FALSE; pe.peRed = color->red >> 8; pe.peGreen = color->green >> 8; pe.peBlue = color->blue >> 8; if (SetPaletteEntries (private->hpal, color->pixel, 1, &pe) == 0) WIN32_GDI_FAILED ("SetPaletteEntries"); return TRUE;}static gintgdk_colormap_match_color (GdkColormap *cmap, GdkColor *color, const gchar *available){ GdkColor *colors; guint sum, min; gint rdiff, gdiff, bdiff; gint i, index; g_return_val_if_fail (cmap != NULL, 0); g_return_val_if_fail (color != NULL, 0); colors = cmap->colors; min = 3 * (65536); index = -1; for (i = 0; i < cmap->size; i++) { if ((!available) || (available && available[i])) { rdiff = (color->red - colors[i].red); gdiff = (color->green - colors[i].green); bdiff = (color->blue - colors[i].blue); sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff); if (sum < min) { index = i; min = sum; } } } return index;}GdkScreen*gdk_colormap_get_screen (GdkColormap *cmap){ g_return_val_if_fail (cmap != NULL, NULL); return gdk_screen_get_default ();}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -