?? gdkcolor-fb.c
字號:
&& colormap->visual->type != GDK_VISUAL_PSEUDO_COLOR) return FALSE; *ret = *color; gdk_fb_color_round_to_hw (ret); for (i = 0; i<colormap->size; i++) { if (!(private->info[i].flags & GDK_COLOR_WRITEABLE) && (ret->red == colormap->colors[i].red) && (ret->green == colormap->colors[i].green) && (ret->blue == colormap->colors[i].blue)) { ret->pixel = i; colormap->colors[i].pixel = i; if (private->info[i].ref_count == 0) g_hash_table_insert (private->hash, &colormap->colors[ret->pixel], &colormap->colors[ret->pixel]); private->info[i].ref_count++; return TRUE; } } for (i = 0; i<colormap->size; i++) { if (private->info[i].ref_count==0) { guint16 red = color->red, green = color->green, blue = color->blue; struct fb_cmap fbc; fbc.len = 1; fbc.start = i; fbc.red = &red; fbc.green = &green; fbc.blue = &blue; ioctl (gdk_display->fb_fd, FBIOPUTCMAP, &fbc); ret->pixel = i; colormap->colors[ret->pixel] = *ret; private->info[ret->pixel].ref_count = 1; g_hash_table_insert (private->hash, &colormap->colors[ret->pixel], &colormap->colors[ret->pixel]); return TRUE; } } return FALSE;}static gintgdk_colormap_alloc_colors_shared (GdkColormap *colormap, GdkColor *colors, gint ncolors, gboolean writeable, gboolean best_match, gboolean *success){ GdkColormapPrivateFB *private; gint i, index; gint nremaining = 0; gint nfailed = 0; private = GDK_COLORMAP_PRIVATE_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){ GdkColormapPrivateFB *private; GdkColor *lookup_color; gint i; gint nremaining = 0; private = GDK_COLORMAP_PRIVATE_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) 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){ GdkColormapPrivateFB *private; GdkVisual *visual; gint i; gint nremaining = 0; g_return_val_if_fail (colormap != NULL, FALSE); g_return_val_if_fail (colors != NULL, FALSE); private = GDK_COLORMAP_PRIVATE_DATA (colormap); for (i = 0; i < ncolors; i++) success[i] = FALSE; visual = colormap->visual; switch (visual->type) { case GDK_VISUAL_PSEUDO_COLOR: case GDK_VISUAL_GRAYSCALE: case GDK_VISUAL_STATIC_GRAY: case GDK_VISUAL_STATIC_COLOR: return gdk_colormap_alloc_colors_pseudocolor (colormap, colors, ncolors, writeable, best_match, success); break; case GDK_VISUAL_DIRECT_COLOR: case GDK_VISUAL_TRUE_COLOR: 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; } return nremaining;}gbooleangdk_color_change (GdkColormap *colormap, GdkColor *color){ GdkColormapPrivateFB *private; struct fb_cmap fbc = {0, 1}; g_return_val_if_fail (colormap != NULL, FALSE); g_return_val_if_fail (color != NULL, FALSE); private = GDK_COLORMAP_PRIVATE_DATA (colormap); switch(colormap->visual->type) { case GDK_VISUAL_GRAYSCALE: color->red = color->green = color->blue = (color->red + color->green + color->blue)/3; /* Fall through */ case GDK_VISUAL_PSEUDO_COLOR: colormap->colors[color->pixel] = *color; fbc.start = color->pixel; fbc.red = &color->red; fbc.green = &color->green; fbc.blue = &color->blue; ioctl (gdk_display->fb_fd, FBIOPUTCMAP, &fbc); break; default: break; } return TRUE;}static gintgdk_colormap_match_color (GdkColormap *cmap, GdkColor *color, const gchar *available){ GdkColor *colors; guint sum, max; 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; max = 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 < max) { index = i; max = sum; } } } return index;}gbooleangdk_colors_alloc (GdkColormap *colormap, gboolean contiguous, gulong *planes, gint nplanes, gulong *pixels, gint npixels){ GdkColormapPrivateFB *private; gint found, i, col; g_return_val_if_fail (colormap != NULL, FALSE); private = GDK_COLORMAP_PRIVATE_DATA (colormap); if (nplanes > 0) return FALSE; found = 0; for (i = 1; i < colormap->size; i++) { if (private->info[i].ref_count == 0) { found++; if (found >= npixels) break; } } if (found < npixels) return FALSE; col = 0; for (i = 1; i < colormap->size; i++) { if (private->info[i].ref_count == 0) { pixels[col++] = i; private->info[i].ref_count++; private->info[i].flags |= GDK_COLOR_WRITEABLE; if (col == npixels) return TRUE; } } g_assert_not_reached (); return FALSE;}voidgdk_colors_free (GdkColormap *colormap, gulong *pixels, gint npixels, gulong planes){ GdkColormapPrivateFB *private; gint i, pixel; g_return_if_fail (colormap != NULL); if ((colormap->visual->type != GDK_VISUAL_PSEUDO_COLOR) && (colormap->visual->type != GDK_VISUAL_GRAYSCALE)) return; private = GDK_COLORMAP_PRIVATE_DATA (colormap); for (i = 0; i < npixels; i++) { pixel = pixels[i]; if (private->info[pixel].ref_count) { private->info[pixel].ref_count--; if (private->info[pixel].ref_count == 0) { if (!(private->info[pixel].flags & GDK_COLOR_WRITEABLE)) g_hash_table_remove (private->hash, &colormap->colors[pixel]); private->info[pixel].flags = 0; } } }}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. * (gdouble) ((pixel & visual->red_mask) >> visual->red_shift) / ((1 << visual->red_prec) - 1); result->green = 65535. * (gdouble) ((pixel & visual->green_mask) >> visual->green_shift) / ((1 << visual->green_prec) - 1); result->blue = 65535. * (gdouble) ((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_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; }}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 + -