forked from AuroraMiddleware/gtk
Made the XCC stuff more accessible
This commit is contained in:
parent
4de2665e8c
commit
65e63db01e
@ -680,10 +680,6 @@ void gdk_color_context_get_pixels_incremental (GdkColorContext *cc,
|
||||
gulong *colors,
|
||||
gint *nallocated);
|
||||
|
||||
gint gdk_color_context_get_num_colors (GdkColorContext *cc);
|
||||
gint gdk_color_context_get_depth (GdkColorContext *cc);
|
||||
GdkColorContextMode gdk_color_context_get_mode (GdkColorContext *cc);
|
||||
GdkVisual *gdk_color_context_get_visual (GdkColorContext *cc);
|
||||
gint gdk_color_context_query_color (GdkColorContext *cc,
|
||||
GdkColor *color);
|
||||
gint gdk_color_context_query_colors (GdkColorContext *cc,
|
||||
|
352
gdk/gdkcc.c
352
gdk/gdkcc.c
@ -126,14 +126,14 @@ my_x_query_colors(GdkColormap *colormap,
|
||||
}
|
||||
|
||||
static void
|
||||
query_colors(GdkColorContextPrivate *cc)
|
||||
query_colors(GdkColorContext *cc)
|
||||
{
|
||||
gint i;
|
||||
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
cc->cmap = g_new(GdkColor, cc->num_colors);
|
||||
|
||||
for (i = 0; i < cc->num_colors; i++)
|
||||
cc->cmap[i].pixel = cc->clut ? cc->clut[i] : cc->std_cmap.base_pixel + i;
|
||||
cc->cmap[i].pixel = cc->clut ? cc->clut[i] : ccp->std_cmap.base_pixel + i;
|
||||
|
||||
my_x_query_colors(cc->colormap, cc->cmap, cc->num_colors);
|
||||
|
||||
@ -141,7 +141,7 @@ query_colors(GdkColorContextPrivate *cc)
|
||||
}
|
||||
|
||||
static void
|
||||
init_bw(GdkColorContextPrivate *cc)
|
||||
init_bw(GdkColorContext *cc)
|
||||
{
|
||||
GdkColor color;
|
||||
|
||||
@ -165,8 +165,9 @@ init_bw(GdkColorContextPrivate *cc)
|
||||
}
|
||||
|
||||
static void
|
||||
init_gray(GdkColorContextPrivate *cc)
|
||||
init_gray(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
GdkColor *clrs, *cstart;
|
||||
gint i;
|
||||
gdouble dinc;
|
||||
@ -207,17 +208,17 @@ retrygray:
|
||||
g_free(cstart);
|
||||
|
||||
/* XXX: is this the right thing to do? */
|
||||
cc->std_cmap.colormap = GDK_COLORMAP_XCOLORMAP(cc->colormap);
|
||||
cc->std_cmap.base_pixel = 0;
|
||||
cc->std_cmap.red_max = cc->num_colors - 1;
|
||||
cc->std_cmap.green_max = 0;
|
||||
cc->std_cmap.blue_max = 0;
|
||||
cc->std_cmap.red_mult = 1;
|
||||
cc->std_cmap.green_mult = 0;
|
||||
cc->std_cmap.blue_mult = 0;
|
||||
ccp->std_cmap.colormap = GDK_COLORMAP_XCOLORMAP(cc->colormap);
|
||||
ccp->std_cmap.base_pixel = 0;
|
||||
ccp->std_cmap.red_max = cc->num_colors - 1;
|
||||
ccp->std_cmap.green_max = 0;
|
||||
ccp->std_cmap.blue_max = 0;
|
||||
ccp->std_cmap.red_mult = 1;
|
||||
ccp->std_cmap.green_mult = 0;
|
||||
ccp->std_cmap.blue_mult = 0;
|
||||
|
||||
cc->white_pixel = WhitePixel(cc->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(cc->xdisplay, gdk_screen);
|
||||
cc->white_pixel = WhitePixel(ccp->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(ccp->xdisplay, gdk_screen);
|
||||
|
||||
query_colors(cc);
|
||||
|
||||
@ -225,8 +226,9 @@ retrygray:
|
||||
}
|
||||
|
||||
static void
|
||||
init_color(GdkColorContextPrivate *cc)
|
||||
init_color(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
gint cubeval;
|
||||
|
||||
cubeval = 1;
|
||||
@ -236,17 +238,17 @@ init_color(GdkColorContextPrivate *cc)
|
||||
|
||||
cc->num_colors = cubeval * cubeval * cubeval;
|
||||
|
||||
cc->std_cmap.red_max = cubeval - 1;
|
||||
cc->std_cmap.green_max = cubeval - 1;
|
||||
cc->std_cmap.blue_max = cubeval - 1;
|
||||
cc->std_cmap.red_mult = cubeval * cubeval;
|
||||
cc->std_cmap.green_mult = cubeval;
|
||||
cc->std_cmap.blue_mult = 1;
|
||||
cc->std_cmap.base_pixel = 0;
|
||||
ccp->std_cmap.red_max = cubeval - 1;
|
||||
ccp->std_cmap.green_max = cubeval - 1;
|
||||
ccp->std_cmap.blue_max = cubeval - 1;
|
||||
ccp->std_cmap.red_mult = cubeval * cubeval;
|
||||
ccp->std_cmap.green_mult = cubeval;
|
||||
ccp->std_cmap.blue_mult = 1;
|
||||
ccp->std_cmap.base_pixel = 0;
|
||||
|
||||
cc->white_pixel = WhitePixel(cc->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(cc->xdisplay, gdk_screen);
|
||||
cc->num_colors = DisplayCells(cc->xdisplay, gdk_screen);
|
||||
cc->white_pixel = WhitePixel(ccp->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(ccp->xdisplay, gdk_screen);
|
||||
cc->num_colors = DisplayCells(ccp->xdisplay, gdk_screen);
|
||||
|
||||
/* a CLUT for storing allocated pixel indices */
|
||||
|
||||
@ -263,8 +265,9 @@ init_color(GdkColorContextPrivate *cc)
|
||||
|
||||
|
||||
static void
|
||||
init_true_color(GdkColorContextPrivate *cc)
|
||||
init_true_color(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
gulong rmask, gmask, bmask;
|
||||
|
||||
cc->mode = GDK_CC_MODE_TRUE;
|
||||
@ -321,12 +324,12 @@ init_true_color(GdkColorContextPrivate *cc)
|
||||
}
|
||||
|
||||
cc->num_colors = (cc->visual->red_mask | cc->visual->green_mask | cc->visual->blue_mask) + 1;
|
||||
cc->white_pixel = WhitePixel(cc->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(cc->xdisplay, gdk_screen);
|
||||
cc->white_pixel = WhitePixel(ccp->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(ccp->xdisplay, gdk_screen);
|
||||
}
|
||||
|
||||
static void
|
||||
init_direct_color(GdkColorContextPrivate *cc)
|
||||
init_direct_color(GdkColorContext *cc)
|
||||
{
|
||||
gint n, count;
|
||||
GdkColor *clrs, *cstart;
|
||||
@ -425,7 +428,7 @@ retrydirect:
|
||||
}
|
||||
|
||||
static void
|
||||
init_palette(GdkColorContextPrivate *cc)
|
||||
init_palette(GdkColorContext *cc)
|
||||
{
|
||||
/* restore correct mode for this cc */
|
||||
|
||||
@ -479,17 +482,18 @@ GdkColorContext *
|
||||
gdk_color_context_new(GdkVisual *visual,
|
||||
GdkColormap *colormap)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint use_private_colormap = FALSE; /* XXX: maybe restore full functionality later? */
|
||||
GdkColorContextPrivate *cc;
|
||||
GdkColorContext *cc;
|
||||
gint retry_count;
|
||||
GdkColormap *default_colormap;
|
||||
|
||||
g_assert(visual != NULL);
|
||||
g_assert(colormap != NULL);
|
||||
|
||||
cc = g_new(GdkColorContextPrivate, 1);
|
||||
|
||||
cc->xdisplay = gdk_display;
|
||||
cc = g_new(GdkColorContext, 1);
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
ccp->xdisplay = gdk_display;
|
||||
cc->visual = visual;
|
||||
cc->colormap = colormap;
|
||||
cc->clut = NULL;
|
||||
@ -599,14 +603,15 @@ GdkColorContext *
|
||||
gdk_color_context_new_mono(GdkVisual *visual,
|
||||
GdkColormap *colormap)
|
||||
{
|
||||
GdkColorContextPrivate *cc;
|
||||
GdkColorContextPrivate *ccp;
|
||||
GdkColorContext *cc;
|
||||
|
||||
g_assert(visual != NULL);
|
||||
g_assert(colormap != NULL);
|
||||
|
||||
cc = g_new(GdkColorContextPrivate, 1);
|
||||
|
||||
cc->xdisplay = gdk_display;
|
||||
cc = g_new(GdkColorContext, 1);
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
ccp->xdisplay = gdk_display;
|
||||
cc->visual = visual;
|
||||
cc->colormap = colormap;
|
||||
cc->clut = NULL;
|
||||
@ -624,36 +629,32 @@ gdk_color_context_new_mono(GdkVisual *visual,
|
||||
void
|
||||
gdk_color_context_free(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
if ((ccp->visual->type == GDK_VISUAL_STATIC_COLOR)
|
||||
|| (ccp->visual->type == GDK_VISUAL_PSEUDO_COLOR)) {
|
||||
gdk_colors_free(ccp->colormap, ccp->clut, ccp->num_allocated, 0);
|
||||
g_free(ccp->clut);
|
||||
} else if (ccp->clut != NULL) {
|
||||
gdk_colors_free(ccp->colormap, ccp->clut, ccp->num_colors, 0);
|
||||
g_free(ccp->clut);
|
||||
if ((cc->visual->type == GDK_VISUAL_STATIC_COLOR)
|
||||
|| (cc->visual->type == GDK_VISUAL_PSEUDO_COLOR)) {
|
||||
gdk_colors_free(cc->colormap, cc->clut, cc->num_allocated, 0);
|
||||
g_free(cc->clut);
|
||||
} else if (cc->clut != NULL) {
|
||||
gdk_colors_free(cc->colormap, cc->clut, cc->num_colors, 0);
|
||||
g_free(cc->clut);
|
||||
}
|
||||
|
||||
if (ccp->cmap != NULL)
|
||||
g_free(ccp->cmap);
|
||||
if (cc->cmap != NULL)
|
||||
g_free(cc->cmap);
|
||||
|
||||
if (ccp->need_to_free_colormap)
|
||||
gdk_colormap_destroy(ccp->colormap);
|
||||
if (cc->need_to_free_colormap)
|
||||
gdk_colormap_destroy(cc->colormap);
|
||||
|
||||
/* free any palette that has been associated with this GdkColorContext */
|
||||
|
||||
init_palette(ccp);
|
||||
init_palette(cc);
|
||||
|
||||
if (ccp->color_hash) {
|
||||
g_hash_table_foreach(ccp->color_hash,
|
||||
if (cc->color_hash) {
|
||||
g_hash_table_foreach(cc->color_hash,
|
||||
free_hash_entry,
|
||||
NULL);
|
||||
g_hash_table_destroy(ccp->color_hash);
|
||||
g_hash_table_destroy(cc->color_hash);
|
||||
}
|
||||
|
||||
g_free(cc);
|
||||
@ -666,16 +667,13 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
gushort blue,
|
||||
gint *failed)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
g_assert(cc != NULL);
|
||||
g_assert(failed != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
*failed = FALSE;
|
||||
|
||||
switch (ccp->mode) {
|
||||
switch (cc->mode) {
|
||||
case GDK_CC_MODE_BW: {
|
||||
gdouble value;
|
||||
|
||||
@ -688,9 +686,9 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
+ blue / 65535.0 * 0.11;
|
||||
|
||||
if (value > 0.5)
|
||||
return ccp->white_pixel;
|
||||
return cc->white_pixel;
|
||||
|
||||
return ccp->black_pixel;
|
||||
return cc->black_pixel;
|
||||
}
|
||||
|
||||
case GDK_CC_MODE_MY_GRAY: {
|
||||
@ -722,8 +720,8 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
|
||||
iblue *= ccp->std_cmap.blue_mult;
|
||||
|
||||
if (ccp->clut != NULL)
|
||||
return ccp->clut[ccp->std_cmap.base_pixel + ired + igreen + iblue];
|
||||
if (cc->clut != NULL)
|
||||
return cc->clut[ccp->std_cmap.base_pixel + ired + igreen + iblue];
|
||||
|
||||
return ccp->std_cmap.base_pixel + ired + igreen + iblue;
|
||||
}
|
||||
@ -735,21 +733,21 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
green <<= 8;
|
||||
blue <<= 8;
|
||||
|
||||
if (ccp->clut == NULL) {
|
||||
red >>= 16 - ccp->bits.red;
|
||||
green >>= 16 - ccp->bits.green;
|
||||
blue >>= 16 - ccp->bits.blue;
|
||||
if (cc->clut == NULL) {
|
||||
red >>= 16 - cc->bits.red;
|
||||
green >>= 16 - cc->bits.green;
|
||||
blue >>= 16 - cc->bits.blue;
|
||||
|
||||
ired = (red << ccp->shifts.red) & ccp->masks.red;
|
||||
igreen = (green << ccp->shifts.green) & ccp->masks.green;
|
||||
iblue = (blue << ccp->shifts.blue) & ccp->masks.blue;
|
||||
ired = (red << cc->shifts.red) & cc->masks.red;
|
||||
igreen = (green << cc->shifts.green) & cc->masks.green;
|
||||
iblue = (blue << cc->shifts.blue) & cc->masks.blue;
|
||||
|
||||
return ired | igreen | iblue;
|
||||
}
|
||||
|
||||
ired = ccp->clut[red * ccp->max_entry / 65535] & ccp->masks.red;
|
||||
igreen = ccp->clut[green * ccp->max_entry / 65535] & ccp->masks.green;
|
||||
iblue = ccp->clut[blue * ccp->max_entry / 65535] & ccp->masks.blue;
|
||||
ired = cc->clut[red * cc->max_entry / 65535] & cc->masks.red;
|
||||
igreen = cc->clut[green * cc->max_entry / 65535] & cc->masks.green;
|
||||
iblue = cc->clut[blue * cc->max_entry / 65535] & cc->masks.blue;
|
||||
|
||||
return ired | igreen | iblue;
|
||||
}
|
||||
@ -770,7 +768,7 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
color.green = green;
|
||||
color.blue = blue;
|
||||
|
||||
result = g_hash_table_lookup(ccp->color_hash, &color);
|
||||
result = g_hash_table_lookup(cc->color_hash, &color);
|
||||
|
||||
if (!result) {
|
||||
color.red = red;
|
||||
@ -778,7 +776,7 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
color.blue = blue;
|
||||
color.pixel = 0;
|
||||
|
||||
if (!gdk_color_alloc(ccp->colormap, &color))
|
||||
if (!gdk_color_alloc(cc->colormap, &color))
|
||||
*failed = TRUE;
|
||||
else {
|
||||
GdkColor *cnew;
|
||||
@ -796,26 +794,26 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
* might be necessary for us to resize the CLUT.
|
||||
*/
|
||||
|
||||
if (ccp->num_allocated == ccp->max_colors) {
|
||||
ccp->max_colors *= 2;
|
||||
if (cc->num_allocated == cc->max_colors) {
|
||||
cc->max_colors *= 2;
|
||||
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixel: "
|
||||
"resizing CLUT to %i entries",
|
||||
ccp->max_colors);
|
||||
cc->max_colors);
|
||||
|
||||
ccp->clut = g_realloc(ccp->clut,
|
||||
ccp->max_colors * sizeof(gulong));
|
||||
cc->clut = g_realloc(cc->clut,
|
||||
cc->max_colors * sizeof(gulong));
|
||||
}
|
||||
|
||||
/* Key and value are the same color structure */
|
||||
|
||||
cnew = g_new(GdkColor, 1);
|
||||
*cnew = color;
|
||||
g_hash_table_insert(ccp->color_hash, cnew, cnew);
|
||||
g_hash_table_insert(cc->color_hash, cnew, cnew);
|
||||
|
||||
ccp->clut[ccp->num_allocated] = color.pixel;
|
||||
ccp->num_allocated++;
|
||||
cc->clut[cc->num_allocated] = color.pixel;
|
||||
cc->num_allocated++;
|
||||
return color.pixel;
|
||||
}
|
||||
}
|
||||
@ -834,7 +832,6 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
gulong *colors,
|
||||
gint *nallocated)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint i, k, idx;
|
||||
gint cmapsize, ncols = 0, nopen = 0, counter = 0;
|
||||
gint bad_alloc = FALSE;
|
||||
@ -849,8 +846,6 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
g_assert(colors != NULL);
|
||||
g_assert(nallocated != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
memset(defs, 0, MAX_IMAGE_COLORS * sizeof(GdkColor));
|
||||
memset(failed, 0, MAX_IMAGE_COLORS * sizeof(gint));
|
||||
memset(allocated, 0, MAX_IMAGE_COLORS * sizeof(gint));
|
||||
@ -894,7 +889,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
if ((ncols == ncolors) || (nopen == 0)) {
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixels: got all %i colors; "
|
||||
"(%i colors allocated so far", ncolors, ccp->num_allocated);
|
||||
"(%i colors allocated so far", ncolors, cc->num_allocated);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -908,7 +903,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
|
||||
/* read up to MAX_IMAGE_COLORS colors of the current colormap */
|
||||
|
||||
cmapsize = MIN(ccp->num_colors, MAX_IMAGE_COLORS);
|
||||
cmapsize = MIN(cc->num_colors, MAX_IMAGE_COLORS);
|
||||
|
||||
/* see if the colormap has any colors to read */
|
||||
|
||||
@ -932,7 +927,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
|
||||
/* read the colormap */
|
||||
|
||||
my_x_query_colors(ccp->colormap, cmap, cmapsize);
|
||||
my_x_query_colors(cc->colormap, cmap, cmapsize);
|
||||
|
||||
/* speedup: downscale here instead of in the matching code */
|
||||
|
||||
@ -1017,7 +1012,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixels: got %i colors, %i exact and "
|
||||
"%i close (%i colors allocated so far)",
|
||||
ncolors, exact_col, close_col, ccp->num_allocated);
|
||||
ncolors, exact_col, close_col, cc->num_allocated);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -1061,7 +1056,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
if (close < 0) {
|
||||
/* too bad, map to black */
|
||||
|
||||
defs[i].pixel = ccp->black_pixel;
|
||||
defs[i].pixel = cc->black_pixel;
|
||||
defs[i].red = defs[i].green = defs[i].blue = 0;
|
||||
#ifdef DEBUG
|
||||
black_col++;
|
||||
@ -1079,7 +1074,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixels: got %i colors, %i exact, %i close, "
|
||||
"%i substituted, %i to black (%i colors allocated so far)",
|
||||
ncolors, exact_col, close_col, subst_col, black_col, ccp->num_allocated);
|
||||
ncolors, exact_col, close_col, subst_col, black_col, cc->num_allocated);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1092,7 +1087,6 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
gulong *colors,
|
||||
gint *nallocated)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint i, k, idx;
|
||||
gint cmapsize, ncols = 0, nopen = 0, counter = 0;
|
||||
gint bad_alloc = FALSE;
|
||||
@ -1108,8 +1102,6 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
g_assert(colors != NULL);
|
||||
g_assert(nallocated != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
memset(defs, 0, MAX_IMAGE_COLORS * sizeof(GdkColor));
|
||||
memset(failed, 0, MAX_IMAGE_COLORS * sizeof(gint));
|
||||
memset(allocated, 0, MAX_IMAGE_COLORS * sizeof(gint));
|
||||
@ -1161,12 +1153,12 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixels_incremental: got all %i colors "
|
||||
"(%i colors allocated so far)",
|
||||
ncolors, ccp->num_allocated);
|
||||
ncolors, cc->num_allocated);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
cmapsize = MIN(ccp->num_colors, MAX_IMAGE_COLORS);
|
||||
cmapsize = MIN(cc->num_colors, MAX_IMAGE_COLORS);
|
||||
|
||||
if (cmapsize < 0) {
|
||||
g_warning("gdk_color_context_get_pixels_incremental: oops! "
|
||||
@ -1187,7 +1179,7 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
|
||||
/* read and downscale */
|
||||
|
||||
my_x_query_colors(ccp->colormap, cmap, cmapsize);
|
||||
my_x_query_colors(cc->colormap, cmap, cmapsize);
|
||||
|
||||
for (i = 0; i < cmapsize; i++) {
|
||||
cmap[i].red >>= 8;
|
||||
@ -1261,7 +1253,7 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
g_print("gdk_color_context_get_pixels_incremental: "
|
||||
"got %i colors, %i exact and %i close "
|
||||
"(%i colors allocated so far)",
|
||||
ncolors, exact_col, close_col, ccp->num_allocated);
|
||||
ncolors, exact_col, close_col, cc->num_allocated);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -1305,7 +1297,7 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
if (close < 0) {
|
||||
/* too bad, map to black */
|
||||
|
||||
defs[i].pixel = ccp->black_pixel;
|
||||
defs[i].pixel = cc->black_pixel;
|
||||
defs[i].red = defs[i].green = defs[i].blue = 0;
|
||||
#ifdef DEBUG
|
||||
black_col++;
|
||||
@ -1324,42 +1316,7 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
g_print("gdk_color_context_get_pixels_incremental: "
|
||||
"got %i colors, %i exact, %i close, %i substituted, %i to black "
|
||||
"(%i colors allocated so far)",
|
||||
ncolors, exact_col, close_col, subst_col, black_col, ccp->num_allocated);
|
||||
}
|
||||
|
||||
gint
|
||||
gdk_color_context_get_num_colors(GdkColorContext *cc)
|
||||
{
|
||||
g_assert(cc != NULL);
|
||||
|
||||
return ((GdkColorContextPrivate *) cc)->num_colors;
|
||||
}
|
||||
|
||||
gint
|
||||
gdk_color_context_get_depth(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
return ccp->visual->depth;
|
||||
}
|
||||
|
||||
GdkColorContextMode
|
||||
gdk_color_context_get_mode(GdkColorContext *cc)
|
||||
{
|
||||
g_assert(cc != NULL);
|
||||
|
||||
return ((GdkColorContextPrivate *) cc)->mode;
|
||||
|
||||
}
|
||||
|
||||
GdkVisual *
|
||||
gdk_color_context_get_visual(GdkColorContext *cc)
|
||||
{
|
||||
g_assert(cc != NULL);
|
||||
|
||||
return ((GdkColorContextPrivate *) cc)->visual;
|
||||
ncolors, exact_col, close_col, subst_col, black_col, cc->num_allocated);
|
||||
}
|
||||
|
||||
gint
|
||||
@ -1374,19 +1331,16 @@ gdk_color_context_query_colors(GdkColorContext *cc,
|
||||
GdkColor *colors,
|
||||
gint num_colors)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint i;
|
||||
GdkColor *tc;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
g_assert(colors != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
switch (ccp->mode) {
|
||||
switch (cc->mode) {
|
||||
case GDK_CC_MODE_BW:
|
||||
for (i = 0, tc = colors; i < num_colors; i++, tc++) {
|
||||
if (tc->pixel == ccp->white_pixel)
|
||||
if (tc->pixel == cc->white_pixel)
|
||||
tc->red = tc->green = tc->blue = 65535;
|
||||
else
|
||||
tc->red = tc->green = tc->blue = 0;
|
||||
@ -1394,22 +1348,22 @@ gdk_color_context_query_colors(GdkColorContext *cc,
|
||||
break;
|
||||
|
||||
case GDK_CC_MODE_TRUE:
|
||||
if (ccp->clut == NULL)
|
||||
if (cc->clut == NULL)
|
||||
for (i = 0, tc = colors; i < num_colors; i++, tc++) {
|
||||
tc->red = (tc->pixel & ccp->masks.red) * 65535 / ccp->masks.red;
|
||||
tc->green = (tc->pixel & ccp->masks.green) * 65535 / ccp->masks.green;
|
||||
tc->blue = (tc->pixel & ccp->masks.blue) * 65535 / ccp->masks.blue;
|
||||
tc->red = (tc->pixel & cc->masks.red) * 65535 / cc->masks.red;
|
||||
tc->green = (tc->pixel & cc->masks.green) * 65535 / cc->masks.green;
|
||||
tc->blue = (tc->pixel & cc->masks.blue) * 65535 / cc->masks.blue;
|
||||
}
|
||||
else {
|
||||
my_x_query_colors(ccp->colormap, colors, num_colors);
|
||||
my_x_query_colors(cc->colormap, colors, num_colors);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case GDK_CC_MODE_STD_CMAP:
|
||||
default:
|
||||
if (ccp->cmap == NULL) {
|
||||
my_x_query_colors(ccp->colormap, colors, num_colors);
|
||||
if (cc->cmap == NULL) {
|
||||
my_x_query_colors(cc->colormap, colors, num_colors);
|
||||
return 1;
|
||||
} else {
|
||||
gint first, last, half;
|
||||
@ -1417,16 +1371,16 @@ gdk_color_context_query_colors(GdkColorContext *cc,
|
||||
|
||||
for (i = 0, tc = colors; i < num_colors; i++) {
|
||||
first = 0;
|
||||
last = ccp->num_colors - 1;
|
||||
last = cc->num_colors - 1;
|
||||
|
||||
while (first <= last) {
|
||||
half = (first + last) / 2;
|
||||
half_pixel = ccp->cmap[half].pixel;
|
||||
half_pixel = cc->cmap[half].pixel;
|
||||
|
||||
if (tc->pixel == half_pixel) {
|
||||
tc->red = ccp->cmap[half].red;
|
||||
tc->green = ccp->cmap[half].green;
|
||||
tc->blue = ccp->cmap[half].blue;
|
||||
tc->red = cc->cmap[half].red;
|
||||
tc->green = cc->cmap[half].green;
|
||||
tc->blue = cc->cmap[half].blue;
|
||||
first = last + 1; /* false break */
|
||||
} else {
|
||||
if (tc->pixel > half_pixel)
|
||||
@ -1448,18 +1402,15 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
GdkColor *palette,
|
||||
gint num_palette)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint i, j, erg;
|
||||
gushort r, g, b;
|
||||
gulong pixel[1];
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
/* initialize this palette (will also erase previous palette as well) */
|
||||
|
||||
init_palette(ccp);
|
||||
init_palette(cc);
|
||||
|
||||
/* restore previous mode if we aren't adding a new palette */
|
||||
|
||||
@ -1475,12 +1426,12 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
* the pixels in the palette using the current settings)
|
||||
*/
|
||||
|
||||
if (ccp->color_hash == NULL)
|
||||
ccp->color_hash = g_hash_table_new(hash_color, compare_colors);
|
||||
if (cc->color_hash == NULL)
|
||||
cc->color_hash = g_hash_table_new(hash_color, compare_colors);
|
||||
|
||||
/* copy incoming palette */
|
||||
|
||||
ccp->palette = g_new0(GdkColor, num_palette);
|
||||
cc->palette = g_new0(GdkColor, num_palette);
|
||||
|
||||
j = 0;
|
||||
|
||||
@ -1501,10 +1452,10 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
if (erg) {
|
||||
/* store in palette */
|
||||
|
||||
ccp->palette[j].red = r;
|
||||
ccp->palette[j].green = g;
|
||||
ccp->palette[j].blue = b;
|
||||
ccp->palette[j].pixel = pixel[0];
|
||||
cc->palette[j].red = r;
|
||||
cc->palette[j].green = g;
|
||||
cc->palette[j].blue = b;
|
||||
cc->palette[j].pixel = pixel[0];
|
||||
|
||||
/* move to next slot */
|
||||
|
||||
@ -1515,28 +1466,28 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
/* resize to fit */
|
||||
|
||||
if (j != num_palette)
|
||||
ccp->palette = g_realloc(ccp->palette, j * sizeof(GdkColor));
|
||||
cc->palette = g_realloc(cc->palette, j * sizeof(GdkColor));
|
||||
|
||||
/* clear the hash table, we don't use it when dithering */
|
||||
|
||||
if (ccp->color_hash) {
|
||||
g_hash_table_destroy(ccp->color_hash);
|
||||
ccp->color_hash = NULL;
|
||||
if (cc->color_hash) {
|
||||
g_hash_table_destroy(cc->color_hash);
|
||||
cc->color_hash = NULL;
|
||||
}
|
||||
|
||||
/* store real palette size */
|
||||
|
||||
ccp->num_palette = j;
|
||||
cc->num_palette = j;
|
||||
|
||||
/* switch to palette mode */
|
||||
|
||||
ccp->mode = GDK_CC_MODE_PALETTE;
|
||||
cc->mode = GDK_CC_MODE_PALETTE;
|
||||
|
||||
/* sort palette */
|
||||
|
||||
qsort(ccp->palette, ccp->num_palette, sizeof(GdkColor), pixel_sort);
|
||||
qsort(cc->palette, cc->num_palette, sizeof(GdkColor), pixel_sort);
|
||||
|
||||
ccp->fast_dither = NULL;
|
||||
cc->fast_dither = NULL;
|
||||
|
||||
return j;
|
||||
}
|
||||
@ -1544,18 +1495,15 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
void
|
||||
gdk_color_context_init_dither(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint rr, gg, bb, err, erg, erb;
|
||||
gint success = FALSE;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
/* now we can initialize the fast dither matrix */
|
||||
|
||||
if(ccp->fast_dither == NULL)
|
||||
ccp->fast_dither = g_new(GdkColorContextDither, 1);
|
||||
if(cc->fast_dither == NULL)
|
||||
cc->fast_dither = g_new(GdkColorContextDither, 1);
|
||||
|
||||
/* Fill it. We ignore unsuccessful allocations, they are just mapped
|
||||
* to black instead */
|
||||
@ -1567,27 +1515,23 @@ gdk_color_context_init_dither(GdkColorContext *cc)
|
||||
erg = (gg << 3) | (gg >> 2);
|
||||
erb = (bb << 3) | (bb >> 2);
|
||||
|
||||
ccp->fast_dither->fast_rgb[rr][gg][bb] =
|
||||
cc->fast_dither->fast_rgb[rr][gg][bb] =
|
||||
gdk_color_context_get_index_from_palette(cc, &err, &erg, &erb, &success);
|
||||
ccp->fast_dither->fast_err[rr][gg][bb] = err;
|
||||
ccp->fast_dither->fast_erg[rr][gg][bb] = erg;
|
||||
ccp->fast_dither->fast_erb[rr][gg][bb] = erb;
|
||||
cc->fast_dither->fast_err[rr][gg][bb] = err;
|
||||
cc->fast_dither->fast_erg[rr][gg][bb] = erg;
|
||||
cc->fast_dither->fast_erb[rr][gg][bb] = erb;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gdk_color_context_free_dither(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
if (cc->fast_dither)
|
||||
g_free(cc->fast_dither);
|
||||
|
||||
if (ccp->fast_dither)
|
||||
g_free(ccp->fast_dither);
|
||||
|
||||
ccp->fast_dither = NULL;
|
||||
cc->fast_dither = NULL;
|
||||
}
|
||||
|
||||
gulong
|
||||
@ -1597,7 +1541,6 @@ gdk_color_context_get_pixel_from_palette(GdkColorContext *cc,
|
||||
gushort *blue,
|
||||
gint *failed)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gulong pixel = 0;
|
||||
gint dif, dr, dg, db, j = -1;
|
||||
gint mindif = 0x7fffffff;
|
||||
@ -1610,21 +1553,19 @@ gdk_color_context_get_pixel_from_palette(GdkColorContext *cc,
|
||||
g_assert(blue != NULL);
|
||||
g_assert(failed != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
*failed = FALSE;
|
||||
|
||||
for (i = 0; i < ccp->num_palette; i++) {
|
||||
dr = *red - ccp->palette[i].red;
|
||||
dg = *green - ccp->palette[i].green;
|
||||
db = *blue - ccp->palette[i].blue;
|
||||
for (i = 0; i < cc->num_palette; i++) {
|
||||
dr = *red - cc->palette[i].red;
|
||||
dg = *green - cc->palette[i].green;
|
||||
db = *blue - cc->palette[i].blue;
|
||||
|
||||
dif = dr * dr + dg * dg + db * db;
|
||||
|
||||
if (dif < mindif) {
|
||||
mindif = dif;
|
||||
j = i;
|
||||
pixel = ccp->palette[i].pixel;
|
||||
pixel = cc->palette[i].pixel;
|
||||
err = dr;
|
||||
erg = dg;
|
||||
erb = db;
|
||||
@ -1654,7 +1595,6 @@ gdk_color_context_get_index_from_palette(GdkColorContext *cc,
|
||||
gint *blue,
|
||||
gint *failed)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint dif, dr, dg, db, j = -1;
|
||||
gint mindif = 0x7fffffff;
|
||||
gint err = 0, erg = 0, erb = 0;
|
||||
@ -1666,14 +1606,12 @@ gdk_color_context_get_index_from_palette(GdkColorContext *cc,
|
||||
g_assert(blue != NULL);
|
||||
g_assert(failed != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
*failed = FALSE;
|
||||
|
||||
for (i = 0; i < ccp->num_palette; i++) {
|
||||
dr = *red - ccp->palette[i].red;
|
||||
dg = *green - ccp->palette[i].green;
|
||||
db = *blue - ccp->palette[i].blue;
|
||||
for (i = 0; i < cc->num_palette; i++) {
|
||||
dr = *red - cc->palette[i].red;
|
||||
dg = *green - cc->palette[i].green;
|
||||
db = *blue - cc->palette[i].blue;
|
||||
|
||||
dif = dr * dr + dg * dg + db * db;
|
||||
|
||||
|
@ -166,52 +166,7 @@ struct _GdkColorContextPrivate
|
||||
{
|
||||
GdkColorContext color_context;
|
||||
Display *xdisplay;
|
||||
GdkVisual *visual;
|
||||
GdkColormap *colormap;
|
||||
|
||||
gint num_colors; /* available no. of colors in colormap */
|
||||
gint max_colors; /* maximum no. of colors */
|
||||
gint num_allocated; /* no. of allocated colors */
|
||||
|
||||
GdkColorContextMode mode;
|
||||
gint need_to_free_colormap;
|
||||
GdkAtom std_cmap_atom;
|
||||
|
||||
XStandardColormap std_cmap;
|
||||
gulong *clut; /* color look-up table */
|
||||
GdkColor *cmap; /* colormap */
|
||||
|
||||
GHashTable *color_hash; /* hash table of allocated colors */
|
||||
GdkColor *palette; /* preallocated palette */
|
||||
gint num_palette; /* size of palette */
|
||||
|
||||
GdkColorContextDither *fast_dither; /* fast dither matrix */
|
||||
|
||||
struct
|
||||
{
|
||||
gint red;
|
||||
gint green;
|
||||
gint blue;
|
||||
} shifts;
|
||||
|
||||
struct
|
||||
{
|
||||
gulong red;
|
||||
gulong green;
|
||||
gulong blue;
|
||||
} masks;
|
||||
|
||||
|
||||
struct {
|
||||
gint red;
|
||||
gint green;
|
||||
gint blue;
|
||||
} bits;
|
||||
|
||||
gulong max_entry;
|
||||
|
||||
gulong black_pixel;
|
||||
gulong white_pixel;
|
||||
};
|
||||
|
||||
|
||||
|
@ -752,7 +752,51 @@ struct _GdkColorContextDither
|
||||
|
||||
struct _GdkColorContext
|
||||
{
|
||||
gint dummy;
|
||||
GdkVisual *visual;
|
||||
GdkColormap *colormap;
|
||||
|
||||
gint num_colors; /* available no. of colors in colormap */
|
||||
gint max_colors; /* maximum no. of colors */
|
||||
gint num_allocated; /* no. of allocated colors */
|
||||
|
||||
GdkColorContextMode mode;
|
||||
gint need_to_free_colormap;
|
||||
GdkAtom std_cmap_atom;
|
||||
|
||||
gulong *clut; /* color look-up table */
|
||||
GdkColor *cmap; /* colormap */
|
||||
|
||||
GHashTable *color_hash; /* hash table of allocated colors */
|
||||
GdkColor *palette; /* preallocated palette */
|
||||
gint num_palette; /* size of palette */
|
||||
|
||||
GdkColorContextDither *fast_dither; /* fast dither matrix */
|
||||
|
||||
struct
|
||||
{
|
||||
gint red;
|
||||
gint green;
|
||||
gint blue;
|
||||
} shifts;
|
||||
|
||||
struct
|
||||
{
|
||||
gulong red;
|
||||
gulong green;
|
||||
gulong blue;
|
||||
} masks;
|
||||
|
||||
|
||||
struct {
|
||||
gint red;
|
||||
gint green;
|
||||
gint blue;
|
||||
} bits;
|
||||
|
||||
gulong max_entry;
|
||||
|
||||
gulong black_pixel;
|
||||
gulong white_pixel;
|
||||
};
|
||||
|
||||
/* Types for XInput support */
|
||||
|
@ -126,14 +126,14 @@ my_x_query_colors(GdkColormap *colormap,
|
||||
}
|
||||
|
||||
static void
|
||||
query_colors(GdkColorContextPrivate *cc)
|
||||
query_colors(GdkColorContext *cc)
|
||||
{
|
||||
gint i;
|
||||
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
cc->cmap = g_new(GdkColor, cc->num_colors);
|
||||
|
||||
for (i = 0; i < cc->num_colors; i++)
|
||||
cc->cmap[i].pixel = cc->clut ? cc->clut[i] : cc->std_cmap.base_pixel + i;
|
||||
cc->cmap[i].pixel = cc->clut ? cc->clut[i] : ccp->std_cmap.base_pixel + i;
|
||||
|
||||
my_x_query_colors(cc->colormap, cc->cmap, cc->num_colors);
|
||||
|
||||
@ -141,7 +141,7 @@ query_colors(GdkColorContextPrivate *cc)
|
||||
}
|
||||
|
||||
static void
|
||||
init_bw(GdkColorContextPrivate *cc)
|
||||
init_bw(GdkColorContext *cc)
|
||||
{
|
||||
GdkColor color;
|
||||
|
||||
@ -165,8 +165,9 @@ init_bw(GdkColorContextPrivate *cc)
|
||||
}
|
||||
|
||||
static void
|
||||
init_gray(GdkColorContextPrivate *cc)
|
||||
init_gray(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
GdkColor *clrs, *cstart;
|
||||
gint i;
|
||||
gdouble dinc;
|
||||
@ -207,17 +208,17 @@ retrygray:
|
||||
g_free(cstart);
|
||||
|
||||
/* XXX: is this the right thing to do? */
|
||||
cc->std_cmap.colormap = GDK_COLORMAP_XCOLORMAP(cc->colormap);
|
||||
cc->std_cmap.base_pixel = 0;
|
||||
cc->std_cmap.red_max = cc->num_colors - 1;
|
||||
cc->std_cmap.green_max = 0;
|
||||
cc->std_cmap.blue_max = 0;
|
||||
cc->std_cmap.red_mult = 1;
|
||||
cc->std_cmap.green_mult = 0;
|
||||
cc->std_cmap.blue_mult = 0;
|
||||
ccp->std_cmap.colormap = GDK_COLORMAP_XCOLORMAP(cc->colormap);
|
||||
ccp->std_cmap.base_pixel = 0;
|
||||
ccp->std_cmap.red_max = cc->num_colors - 1;
|
||||
ccp->std_cmap.green_max = 0;
|
||||
ccp->std_cmap.blue_max = 0;
|
||||
ccp->std_cmap.red_mult = 1;
|
||||
ccp->std_cmap.green_mult = 0;
|
||||
ccp->std_cmap.blue_mult = 0;
|
||||
|
||||
cc->white_pixel = WhitePixel(cc->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(cc->xdisplay, gdk_screen);
|
||||
cc->white_pixel = WhitePixel(ccp->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(ccp->xdisplay, gdk_screen);
|
||||
|
||||
query_colors(cc);
|
||||
|
||||
@ -225,8 +226,9 @@ retrygray:
|
||||
}
|
||||
|
||||
static void
|
||||
init_color(GdkColorContextPrivate *cc)
|
||||
init_color(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
gint cubeval;
|
||||
|
||||
cubeval = 1;
|
||||
@ -236,17 +238,17 @@ init_color(GdkColorContextPrivate *cc)
|
||||
|
||||
cc->num_colors = cubeval * cubeval * cubeval;
|
||||
|
||||
cc->std_cmap.red_max = cubeval - 1;
|
||||
cc->std_cmap.green_max = cubeval - 1;
|
||||
cc->std_cmap.blue_max = cubeval - 1;
|
||||
cc->std_cmap.red_mult = cubeval * cubeval;
|
||||
cc->std_cmap.green_mult = cubeval;
|
||||
cc->std_cmap.blue_mult = 1;
|
||||
cc->std_cmap.base_pixel = 0;
|
||||
ccp->std_cmap.red_max = cubeval - 1;
|
||||
ccp->std_cmap.green_max = cubeval - 1;
|
||||
ccp->std_cmap.blue_max = cubeval - 1;
|
||||
ccp->std_cmap.red_mult = cubeval * cubeval;
|
||||
ccp->std_cmap.green_mult = cubeval;
|
||||
ccp->std_cmap.blue_mult = 1;
|
||||
ccp->std_cmap.base_pixel = 0;
|
||||
|
||||
cc->white_pixel = WhitePixel(cc->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(cc->xdisplay, gdk_screen);
|
||||
cc->num_colors = DisplayCells(cc->xdisplay, gdk_screen);
|
||||
cc->white_pixel = WhitePixel(ccp->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(ccp->xdisplay, gdk_screen);
|
||||
cc->num_colors = DisplayCells(ccp->xdisplay, gdk_screen);
|
||||
|
||||
/* a CLUT for storing allocated pixel indices */
|
||||
|
||||
@ -263,8 +265,9 @@ init_color(GdkColorContextPrivate *cc)
|
||||
|
||||
|
||||
static void
|
||||
init_true_color(GdkColorContextPrivate *cc)
|
||||
init_true_color(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
gulong rmask, gmask, bmask;
|
||||
|
||||
cc->mode = GDK_CC_MODE_TRUE;
|
||||
@ -321,12 +324,12 @@ init_true_color(GdkColorContextPrivate *cc)
|
||||
}
|
||||
|
||||
cc->num_colors = (cc->visual->red_mask | cc->visual->green_mask | cc->visual->blue_mask) + 1;
|
||||
cc->white_pixel = WhitePixel(cc->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(cc->xdisplay, gdk_screen);
|
||||
cc->white_pixel = WhitePixel(ccp->xdisplay, gdk_screen);
|
||||
cc->black_pixel = BlackPixel(ccp->xdisplay, gdk_screen);
|
||||
}
|
||||
|
||||
static void
|
||||
init_direct_color(GdkColorContextPrivate *cc)
|
||||
init_direct_color(GdkColorContext *cc)
|
||||
{
|
||||
gint n, count;
|
||||
GdkColor *clrs, *cstart;
|
||||
@ -425,7 +428,7 @@ retrydirect:
|
||||
}
|
||||
|
||||
static void
|
||||
init_palette(GdkColorContextPrivate *cc)
|
||||
init_palette(GdkColorContext *cc)
|
||||
{
|
||||
/* restore correct mode for this cc */
|
||||
|
||||
@ -479,17 +482,18 @@ GdkColorContext *
|
||||
gdk_color_context_new(GdkVisual *visual,
|
||||
GdkColormap *colormap)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint use_private_colormap = FALSE; /* XXX: maybe restore full functionality later? */
|
||||
GdkColorContextPrivate *cc;
|
||||
GdkColorContext *cc;
|
||||
gint retry_count;
|
||||
GdkColormap *default_colormap;
|
||||
|
||||
g_assert(visual != NULL);
|
||||
g_assert(colormap != NULL);
|
||||
|
||||
cc = g_new(GdkColorContextPrivate, 1);
|
||||
|
||||
cc->xdisplay = gdk_display;
|
||||
cc = g_new(GdkColorContext, 1);
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
ccp->xdisplay = gdk_display;
|
||||
cc->visual = visual;
|
||||
cc->colormap = colormap;
|
||||
cc->clut = NULL;
|
||||
@ -599,14 +603,15 @@ GdkColorContext *
|
||||
gdk_color_context_new_mono(GdkVisual *visual,
|
||||
GdkColormap *colormap)
|
||||
{
|
||||
GdkColorContextPrivate *cc;
|
||||
GdkColorContextPrivate *ccp;
|
||||
GdkColorContext *cc;
|
||||
|
||||
g_assert(visual != NULL);
|
||||
g_assert(colormap != NULL);
|
||||
|
||||
cc = g_new(GdkColorContextPrivate, 1);
|
||||
|
||||
cc->xdisplay = gdk_display;
|
||||
cc = g_new(GdkColorContext, 1);
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
ccp->xdisplay = gdk_display;
|
||||
cc->visual = visual;
|
||||
cc->colormap = colormap;
|
||||
cc->clut = NULL;
|
||||
@ -624,36 +629,32 @@ gdk_color_context_new_mono(GdkVisual *visual,
|
||||
void
|
||||
gdk_color_context_free(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
if ((ccp->visual->type == GDK_VISUAL_STATIC_COLOR)
|
||||
|| (ccp->visual->type == GDK_VISUAL_PSEUDO_COLOR)) {
|
||||
gdk_colors_free(ccp->colormap, ccp->clut, ccp->num_allocated, 0);
|
||||
g_free(ccp->clut);
|
||||
} else if (ccp->clut != NULL) {
|
||||
gdk_colors_free(ccp->colormap, ccp->clut, ccp->num_colors, 0);
|
||||
g_free(ccp->clut);
|
||||
if ((cc->visual->type == GDK_VISUAL_STATIC_COLOR)
|
||||
|| (cc->visual->type == GDK_VISUAL_PSEUDO_COLOR)) {
|
||||
gdk_colors_free(cc->colormap, cc->clut, cc->num_allocated, 0);
|
||||
g_free(cc->clut);
|
||||
} else if (cc->clut != NULL) {
|
||||
gdk_colors_free(cc->colormap, cc->clut, cc->num_colors, 0);
|
||||
g_free(cc->clut);
|
||||
}
|
||||
|
||||
if (ccp->cmap != NULL)
|
||||
g_free(ccp->cmap);
|
||||
if (cc->cmap != NULL)
|
||||
g_free(cc->cmap);
|
||||
|
||||
if (ccp->need_to_free_colormap)
|
||||
gdk_colormap_destroy(ccp->colormap);
|
||||
if (cc->need_to_free_colormap)
|
||||
gdk_colormap_destroy(cc->colormap);
|
||||
|
||||
/* free any palette that has been associated with this GdkColorContext */
|
||||
|
||||
init_palette(ccp);
|
||||
init_palette(cc);
|
||||
|
||||
if (ccp->color_hash) {
|
||||
g_hash_table_foreach(ccp->color_hash,
|
||||
if (cc->color_hash) {
|
||||
g_hash_table_foreach(cc->color_hash,
|
||||
free_hash_entry,
|
||||
NULL);
|
||||
g_hash_table_destroy(ccp->color_hash);
|
||||
g_hash_table_destroy(cc->color_hash);
|
||||
}
|
||||
|
||||
g_free(cc);
|
||||
@ -666,16 +667,13 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
gushort blue,
|
||||
gint *failed)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
g_assert(cc != NULL);
|
||||
g_assert(failed != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
*failed = FALSE;
|
||||
|
||||
switch (ccp->mode) {
|
||||
switch (cc->mode) {
|
||||
case GDK_CC_MODE_BW: {
|
||||
gdouble value;
|
||||
|
||||
@ -688,9 +686,9 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
+ blue / 65535.0 * 0.11;
|
||||
|
||||
if (value > 0.5)
|
||||
return ccp->white_pixel;
|
||||
return cc->white_pixel;
|
||||
|
||||
return ccp->black_pixel;
|
||||
return cc->black_pixel;
|
||||
}
|
||||
|
||||
case GDK_CC_MODE_MY_GRAY: {
|
||||
@ -722,8 +720,8 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
|
||||
iblue *= ccp->std_cmap.blue_mult;
|
||||
|
||||
if (ccp->clut != NULL)
|
||||
return ccp->clut[ccp->std_cmap.base_pixel + ired + igreen + iblue];
|
||||
if (cc->clut != NULL)
|
||||
return cc->clut[ccp->std_cmap.base_pixel + ired + igreen + iblue];
|
||||
|
||||
return ccp->std_cmap.base_pixel + ired + igreen + iblue;
|
||||
}
|
||||
@ -735,21 +733,21 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
green <<= 8;
|
||||
blue <<= 8;
|
||||
|
||||
if (ccp->clut == NULL) {
|
||||
red >>= 16 - ccp->bits.red;
|
||||
green >>= 16 - ccp->bits.green;
|
||||
blue >>= 16 - ccp->bits.blue;
|
||||
if (cc->clut == NULL) {
|
||||
red >>= 16 - cc->bits.red;
|
||||
green >>= 16 - cc->bits.green;
|
||||
blue >>= 16 - cc->bits.blue;
|
||||
|
||||
ired = (red << ccp->shifts.red) & ccp->masks.red;
|
||||
igreen = (green << ccp->shifts.green) & ccp->masks.green;
|
||||
iblue = (blue << ccp->shifts.blue) & ccp->masks.blue;
|
||||
ired = (red << cc->shifts.red) & cc->masks.red;
|
||||
igreen = (green << cc->shifts.green) & cc->masks.green;
|
||||
iblue = (blue << cc->shifts.blue) & cc->masks.blue;
|
||||
|
||||
return ired | igreen | iblue;
|
||||
}
|
||||
|
||||
ired = ccp->clut[red * ccp->max_entry / 65535] & ccp->masks.red;
|
||||
igreen = ccp->clut[green * ccp->max_entry / 65535] & ccp->masks.green;
|
||||
iblue = ccp->clut[blue * ccp->max_entry / 65535] & ccp->masks.blue;
|
||||
ired = cc->clut[red * cc->max_entry / 65535] & cc->masks.red;
|
||||
igreen = cc->clut[green * cc->max_entry / 65535] & cc->masks.green;
|
||||
iblue = cc->clut[blue * cc->max_entry / 65535] & cc->masks.blue;
|
||||
|
||||
return ired | igreen | iblue;
|
||||
}
|
||||
@ -770,7 +768,7 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
color.green = green;
|
||||
color.blue = blue;
|
||||
|
||||
result = g_hash_table_lookup(ccp->color_hash, &color);
|
||||
result = g_hash_table_lookup(cc->color_hash, &color);
|
||||
|
||||
if (!result) {
|
||||
color.red = red;
|
||||
@ -778,7 +776,7 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
color.blue = blue;
|
||||
color.pixel = 0;
|
||||
|
||||
if (!gdk_color_alloc(ccp->colormap, &color))
|
||||
if (!gdk_color_alloc(cc->colormap, &color))
|
||||
*failed = TRUE;
|
||||
else {
|
||||
GdkColor *cnew;
|
||||
@ -796,26 +794,26 @@ gdk_color_context_get_pixel(GdkColorContext *cc,
|
||||
* might be necessary for us to resize the CLUT.
|
||||
*/
|
||||
|
||||
if (ccp->num_allocated == ccp->max_colors) {
|
||||
ccp->max_colors *= 2;
|
||||
if (cc->num_allocated == cc->max_colors) {
|
||||
cc->max_colors *= 2;
|
||||
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixel: "
|
||||
"resizing CLUT to %i entries",
|
||||
ccp->max_colors);
|
||||
cc->max_colors);
|
||||
|
||||
ccp->clut = g_realloc(ccp->clut,
|
||||
ccp->max_colors * sizeof(gulong));
|
||||
cc->clut = g_realloc(cc->clut,
|
||||
cc->max_colors * sizeof(gulong));
|
||||
}
|
||||
|
||||
/* Key and value are the same color structure */
|
||||
|
||||
cnew = g_new(GdkColor, 1);
|
||||
*cnew = color;
|
||||
g_hash_table_insert(ccp->color_hash, cnew, cnew);
|
||||
g_hash_table_insert(cc->color_hash, cnew, cnew);
|
||||
|
||||
ccp->clut[ccp->num_allocated] = color.pixel;
|
||||
ccp->num_allocated++;
|
||||
cc->clut[cc->num_allocated] = color.pixel;
|
||||
cc->num_allocated++;
|
||||
return color.pixel;
|
||||
}
|
||||
}
|
||||
@ -834,7 +832,6 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
gulong *colors,
|
||||
gint *nallocated)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint i, k, idx;
|
||||
gint cmapsize, ncols = 0, nopen = 0, counter = 0;
|
||||
gint bad_alloc = FALSE;
|
||||
@ -849,8 +846,6 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
g_assert(colors != NULL);
|
||||
g_assert(nallocated != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
memset(defs, 0, MAX_IMAGE_COLORS * sizeof(GdkColor));
|
||||
memset(failed, 0, MAX_IMAGE_COLORS * sizeof(gint));
|
||||
memset(allocated, 0, MAX_IMAGE_COLORS * sizeof(gint));
|
||||
@ -894,7 +889,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
if ((ncols == ncolors) || (nopen == 0)) {
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixels: got all %i colors; "
|
||||
"(%i colors allocated so far", ncolors, ccp->num_allocated);
|
||||
"(%i colors allocated so far", ncolors, cc->num_allocated);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -908,7 +903,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
|
||||
/* read up to MAX_IMAGE_COLORS colors of the current colormap */
|
||||
|
||||
cmapsize = MIN(ccp->num_colors, MAX_IMAGE_COLORS);
|
||||
cmapsize = MIN(cc->num_colors, MAX_IMAGE_COLORS);
|
||||
|
||||
/* see if the colormap has any colors to read */
|
||||
|
||||
@ -932,7 +927,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
|
||||
/* read the colormap */
|
||||
|
||||
my_x_query_colors(ccp->colormap, cmap, cmapsize);
|
||||
my_x_query_colors(cc->colormap, cmap, cmapsize);
|
||||
|
||||
/* speedup: downscale here instead of in the matching code */
|
||||
|
||||
@ -1017,7 +1012,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixels: got %i colors, %i exact and "
|
||||
"%i close (%i colors allocated so far)",
|
||||
ncolors, exact_col, close_col, ccp->num_allocated);
|
||||
ncolors, exact_col, close_col, cc->num_allocated);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -1061,7 +1056,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
if (close < 0) {
|
||||
/* too bad, map to black */
|
||||
|
||||
defs[i].pixel = ccp->black_pixel;
|
||||
defs[i].pixel = cc->black_pixel;
|
||||
defs[i].red = defs[i].green = defs[i].blue = 0;
|
||||
#ifdef DEBUG
|
||||
black_col++;
|
||||
@ -1079,7 +1074,7 @@ gdk_color_context_get_pixels(GdkColorContext *cc,
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixels: got %i colors, %i exact, %i close, "
|
||||
"%i substituted, %i to black (%i colors allocated so far)",
|
||||
ncolors, exact_col, close_col, subst_col, black_col, ccp->num_allocated);
|
||||
ncolors, exact_col, close_col, subst_col, black_col, cc->num_allocated);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1092,7 +1087,6 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
gulong *colors,
|
||||
gint *nallocated)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint i, k, idx;
|
||||
gint cmapsize, ncols = 0, nopen = 0, counter = 0;
|
||||
gint bad_alloc = FALSE;
|
||||
@ -1108,8 +1102,6 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
g_assert(colors != NULL);
|
||||
g_assert(nallocated != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
memset(defs, 0, MAX_IMAGE_COLORS * sizeof(GdkColor));
|
||||
memset(failed, 0, MAX_IMAGE_COLORS * sizeof(gint));
|
||||
memset(allocated, 0, MAX_IMAGE_COLORS * sizeof(gint));
|
||||
@ -1161,12 +1153,12 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
if (gdk_debug_level >= 1)
|
||||
g_print("gdk_color_context_get_pixels_incremental: got all %i colors "
|
||||
"(%i colors allocated so far)",
|
||||
ncolors, ccp->num_allocated);
|
||||
ncolors, cc->num_allocated);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
cmapsize = MIN(ccp->num_colors, MAX_IMAGE_COLORS);
|
||||
cmapsize = MIN(cc->num_colors, MAX_IMAGE_COLORS);
|
||||
|
||||
if (cmapsize < 0) {
|
||||
g_warning("gdk_color_context_get_pixels_incremental: oops! "
|
||||
@ -1187,7 +1179,7 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
|
||||
/* read and downscale */
|
||||
|
||||
my_x_query_colors(ccp->colormap, cmap, cmapsize);
|
||||
my_x_query_colors(cc->colormap, cmap, cmapsize);
|
||||
|
||||
for (i = 0; i < cmapsize; i++) {
|
||||
cmap[i].red >>= 8;
|
||||
@ -1261,7 +1253,7 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
g_print("gdk_color_context_get_pixels_incremental: "
|
||||
"got %i colors, %i exact and %i close "
|
||||
"(%i colors allocated so far)",
|
||||
ncolors, exact_col, close_col, ccp->num_allocated);
|
||||
ncolors, exact_col, close_col, cc->num_allocated);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -1305,7 +1297,7 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
if (close < 0) {
|
||||
/* too bad, map to black */
|
||||
|
||||
defs[i].pixel = ccp->black_pixel;
|
||||
defs[i].pixel = cc->black_pixel;
|
||||
defs[i].red = defs[i].green = defs[i].blue = 0;
|
||||
#ifdef DEBUG
|
||||
black_col++;
|
||||
@ -1324,42 +1316,7 @@ gdk_color_context_get_pixels_incremental(GdkColorContext *cc,
|
||||
g_print("gdk_color_context_get_pixels_incremental: "
|
||||
"got %i colors, %i exact, %i close, %i substituted, %i to black "
|
||||
"(%i colors allocated so far)",
|
||||
ncolors, exact_col, close_col, subst_col, black_col, ccp->num_allocated);
|
||||
}
|
||||
|
||||
gint
|
||||
gdk_color_context_get_num_colors(GdkColorContext *cc)
|
||||
{
|
||||
g_assert(cc != NULL);
|
||||
|
||||
return ((GdkColorContextPrivate *) cc)->num_colors;
|
||||
}
|
||||
|
||||
gint
|
||||
gdk_color_context_get_depth(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
return ccp->visual->depth;
|
||||
}
|
||||
|
||||
GdkColorContextMode
|
||||
gdk_color_context_get_mode(GdkColorContext *cc)
|
||||
{
|
||||
g_assert(cc != NULL);
|
||||
|
||||
return ((GdkColorContextPrivate *) cc)->mode;
|
||||
|
||||
}
|
||||
|
||||
GdkVisual *
|
||||
gdk_color_context_get_visual(GdkColorContext *cc)
|
||||
{
|
||||
g_assert(cc != NULL);
|
||||
|
||||
return ((GdkColorContextPrivate *) cc)->visual;
|
||||
ncolors, exact_col, close_col, subst_col, black_col, cc->num_allocated);
|
||||
}
|
||||
|
||||
gint
|
||||
@ -1374,19 +1331,16 @@ gdk_color_context_query_colors(GdkColorContext *cc,
|
||||
GdkColor *colors,
|
||||
gint num_colors)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint i;
|
||||
GdkColor *tc;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
g_assert(colors != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
switch (ccp->mode) {
|
||||
switch (cc->mode) {
|
||||
case GDK_CC_MODE_BW:
|
||||
for (i = 0, tc = colors; i < num_colors; i++, tc++) {
|
||||
if (tc->pixel == ccp->white_pixel)
|
||||
if (tc->pixel == cc->white_pixel)
|
||||
tc->red = tc->green = tc->blue = 65535;
|
||||
else
|
||||
tc->red = tc->green = tc->blue = 0;
|
||||
@ -1394,22 +1348,22 @@ gdk_color_context_query_colors(GdkColorContext *cc,
|
||||
break;
|
||||
|
||||
case GDK_CC_MODE_TRUE:
|
||||
if (ccp->clut == NULL)
|
||||
if (cc->clut == NULL)
|
||||
for (i = 0, tc = colors; i < num_colors; i++, tc++) {
|
||||
tc->red = (tc->pixel & ccp->masks.red) * 65535 / ccp->masks.red;
|
||||
tc->green = (tc->pixel & ccp->masks.green) * 65535 / ccp->masks.green;
|
||||
tc->blue = (tc->pixel & ccp->masks.blue) * 65535 / ccp->masks.blue;
|
||||
tc->red = (tc->pixel & cc->masks.red) * 65535 / cc->masks.red;
|
||||
tc->green = (tc->pixel & cc->masks.green) * 65535 / cc->masks.green;
|
||||
tc->blue = (tc->pixel & cc->masks.blue) * 65535 / cc->masks.blue;
|
||||
}
|
||||
else {
|
||||
my_x_query_colors(ccp->colormap, colors, num_colors);
|
||||
my_x_query_colors(cc->colormap, colors, num_colors);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case GDK_CC_MODE_STD_CMAP:
|
||||
default:
|
||||
if (ccp->cmap == NULL) {
|
||||
my_x_query_colors(ccp->colormap, colors, num_colors);
|
||||
if (cc->cmap == NULL) {
|
||||
my_x_query_colors(cc->colormap, colors, num_colors);
|
||||
return 1;
|
||||
} else {
|
||||
gint first, last, half;
|
||||
@ -1417,16 +1371,16 @@ gdk_color_context_query_colors(GdkColorContext *cc,
|
||||
|
||||
for (i = 0, tc = colors; i < num_colors; i++) {
|
||||
first = 0;
|
||||
last = ccp->num_colors - 1;
|
||||
last = cc->num_colors - 1;
|
||||
|
||||
while (first <= last) {
|
||||
half = (first + last) / 2;
|
||||
half_pixel = ccp->cmap[half].pixel;
|
||||
half_pixel = cc->cmap[half].pixel;
|
||||
|
||||
if (tc->pixel == half_pixel) {
|
||||
tc->red = ccp->cmap[half].red;
|
||||
tc->green = ccp->cmap[half].green;
|
||||
tc->blue = ccp->cmap[half].blue;
|
||||
tc->red = cc->cmap[half].red;
|
||||
tc->green = cc->cmap[half].green;
|
||||
tc->blue = cc->cmap[half].blue;
|
||||
first = last + 1; /* false break */
|
||||
} else {
|
||||
if (tc->pixel > half_pixel)
|
||||
@ -1448,18 +1402,15 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
GdkColor *palette,
|
||||
gint num_palette)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint i, j, erg;
|
||||
gushort r, g, b;
|
||||
gulong pixel[1];
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
/* initialize this palette (will also erase previous palette as well) */
|
||||
|
||||
init_palette(ccp);
|
||||
init_palette(cc);
|
||||
|
||||
/* restore previous mode if we aren't adding a new palette */
|
||||
|
||||
@ -1475,12 +1426,12 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
* the pixels in the palette using the current settings)
|
||||
*/
|
||||
|
||||
if (ccp->color_hash == NULL)
|
||||
ccp->color_hash = g_hash_table_new(hash_color, compare_colors);
|
||||
if (cc->color_hash == NULL)
|
||||
cc->color_hash = g_hash_table_new(hash_color, compare_colors);
|
||||
|
||||
/* copy incoming palette */
|
||||
|
||||
ccp->palette = g_new0(GdkColor, num_palette);
|
||||
cc->palette = g_new0(GdkColor, num_palette);
|
||||
|
||||
j = 0;
|
||||
|
||||
@ -1501,10 +1452,10 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
if (erg) {
|
||||
/* store in palette */
|
||||
|
||||
ccp->palette[j].red = r;
|
||||
ccp->palette[j].green = g;
|
||||
ccp->palette[j].blue = b;
|
||||
ccp->palette[j].pixel = pixel[0];
|
||||
cc->palette[j].red = r;
|
||||
cc->palette[j].green = g;
|
||||
cc->palette[j].blue = b;
|
||||
cc->palette[j].pixel = pixel[0];
|
||||
|
||||
/* move to next slot */
|
||||
|
||||
@ -1515,28 +1466,28 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
/* resize to fit */
|
||||
|
||||
if (j != num_palette)
|
||||
ccp->palette = g_realloc(ccp->palette, j * sizeof(GdkColor));
|
||||
cc->palette = g_realloc(cc->palette, j * sizeof(GdkColor));
|
||||
|
||||
/* clear the hash table, we don't use it when dithering */
|
||||
|
||||
if (ccp->color_hash) {
|
||||
g_hash_table_destroy(ccp->color_hash);
|
||||
ccp->color_hash = NULL;
|
||||
if (cc->color_hash) {
|
||||
g_hash_table_destroy(cc->color_hash);
|
||||
cc->color_hash = NULL;
|
||||
}
|
||||
|
||||
/* store real palette size */
|
||||
|
||||
ccp->num_palette = j;
|
||||
cc->num_palette = j;
|
||||
|
||||
/* switch to palette mode */
|
||||
|
||||
ccp->mode = GDK_CC_MODE_PALETTE;
|
||||
cc->mode = GDK_CC_MODE_PALETTE;
|
||||
|
||||
/* sort palette */
|
||||
|
||||
qsort(ccp->palette, ccp->num_palette, sizeof(GdkColor), pixel_sort);
|
||||
qsort(cc->palette, cc->num_palette, sizeof(GdkColor), pixel_sort);
|
||||
|
||||
ccp->fast_dither = NULL;
|
||||
cc->fast_dither = NULL;
|
||||
|
||||
return j;
|
||||
}
|
||||
@ -1544,18 +1495,15 @@ gdk_color_context_add_palette(GdkColorContext *cc,
|
||||
void
|
||||
gdk_color_context_init_dither(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint rr, gg, bb, err, erg, erb;
|
||||
gint success = FALSE;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
/* now we can initialize the fast dither matrix */
|
||||
|
||||
if(ccp->fast_dither == NULL)
|
||||
ccp->fast_dither = g_new(GdkColorContextDither, 1);
|
||||
if(cc->fast_dither == NULL)
|
||||
cc->fast_dither = g_new(GdkColorContextDither, 1);
|
||||
|
||||
/* Fill it. We ignore unsuccessful allocations, they are just mapped
|
||||
* to black instead */
|
||||
@ -1567,27 +1515,23 @@ gdk_color_context_init_dither(GdkColorContext *cc)
|
||||
erg = (gg << 3) | (gg >> 2);
|
||||
erb = (bb << 3) | (bb >> 2);
|
||||
|
||||
ccp->fast_dither->fast_rgb[rr][gg][bb] =
|
||||
cc->fast_dither->fast_rgb[rr][gg][bb] =
|
||||
gdk_color_context_get_index_from_palette(cc, &err, &erg, &erb, &success);
|
||||
ccp->fast_dither->fast_err[rr][gg][bb] = err;
|
||||
ccp->fast_dither->fast_erg[rr][gg][bb] = erg;
|
||||
ccp->fast_dither->fast_erb[rr][gg][bb] = erb;
|
||||
cc->fast_dither->fast_err[rr][gg][bb] = err;
|
||||
cc->fast_dither->fast_erg[rr][gg][bb] = erg;
|
||||
cc->fast_dither->fast_erb[rr][gg][bb] = erb;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gdk_color_context_free_dither(GdkColorContext *cc)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
|
||||
g_assert(cc != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
if (cc->fast_dither)
|
||||
g_free(cc->fast_dither);
|
||||
|
||||
if (ccp->fast_dither)
|
||||
g_free(ccp->fast_dither);
|
||||
|
||||
ccp->fast_dither = NULL;
|
||||
cc->fast_dither = NULL;
|
||||
}
|
||||
|
||||
gulong
|
||||
@ -1597,7 +1541,6 @@ gdk_color_context_get_pixel_from_palette(GdkColorContext *cc,
|
||||
gushort *blue,
|
||||
gint *failed)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gulong pixel = 0;
|
||||
gint dif, dr, dg, db, j = -1;
|
||||
gint mindif = 0x7fffffff;
|
||||
@ -1610,21 +1553,19 @@ gdk_color_context_get_pixel_from_palette(GdkColorContext *cc,
|
||||
g_assert(blue != NULL);
|
||||
g_assert(failed != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
*failed = FALSE;
|
||||
|
||||
for (i = 0; i < ccp->num_palette; i++) {
|
||||
dr = *red - ccp->palette[i].red;
|
||||
dg = *green - ccp->palette[i].green;
|
||||
db = *blue - ccp->palette[i].blue;
|
||||
for (i = 0; i < cc->num_palette; i++) {
|
||||
dr = *red - cc->palette[i].red;
|
||||
dg = *green - cc->palette[i].green;
|
||||
db = *blue - cc->palette[i].blue;
|
||||
|
||||
dif = dr * dr + dg * dg + db * db;
|
||||
|
||||
if (dif < mindif) {
|
||||
mindif = dif;
|
||||
j = i;
|
||||
pixel = ccp->palette[i].pixel;
|
||||
pixel = cc->palette[i].pixel;
|
||||
err = dr;
|
||||
erg = dg;
|
||||
erb = db;
|
||||
@ -1654,7 +1595,6 @@ gdk_color_context_get_index_from_palette(GdkColorContext *cc,
|
||||
gint *blue,
|
||||
gint *failed)
|
||||
{
|
||||
GdkColorContextPrivate *ccp;
|
||||
gint dif, dr, dg, db, j = -1;
|
||||
gint mindif = 0x7fffffff;
|
||||
gint err = 0, erg = 0, erb = 0;
|
||||
@ -1666,14 +1606,12 @@ gdk_color_context_get_index_from_palette(GdkColorContext *cc,
|
||||
g_assert(blue != NULL);
|
||||
g_assert(failed != NULL);
|
||||
|
||||
ccp = (GdkColorContextPrivate *) cc;
|
||||
|
||||
*failed = FALSE;
|
||||
|
||||
for (i = 0; i < ccp->num_palette; i++) {
|
||||
dr = *red - ccp->palette[i].red;
|
||||
dg = *green - ccp->palette[i].green;
|
||||
db = *blue - ccp->palette[i].blue;
|
||||
for (i = 0; i < cc->num_palette; i++) {
|
||||
dr = *red - cc->palette[i].red;
|
||||
dg = *green - cc->palette[i].green;
|
||||
db = *blue - cc->palette[i].blue;
|
||||
|
||||
dif = dr * dr + dg * dg + db * db;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user