Commit 65ae5245 authored by Raph Levien's avatar Raph Levien
Browse files

This is the integration of GdkRgb into Gimp.

parent d4936d20
1998-08-19 Raph Levien <raph@gimp.org>
This is the GdkRgb integration.
* app/gximage.c (gximage_put): Uses gdk_draw_rgb_image rather
than gdk_draw_image.
* app/image_render.c: gutted most of this, as it is now subsumed
by GdkRgb. In the process, gamma != 1.0 doesn't work anymore.
Also, speedups are almost certainly possible in a bunch of cases.
* app/info_window.c (get_shades): compiles and runs, but is
not functional.
* app/colormaps.c: gutted
* app/color_select.c: changed dither to max
A few things remain: the dithering is _not_ correctly aligned for
scrolling - looks like I'll need to add some more API to GdkRgb
for that. The gradient editor needs to be set to maximum
dithering. I'd like to draw the foreground and background colors
dithered so they don't quantize so much in 8bpp modes.
Wed Aug 19 21:00:00 PDT 1998 Ray Lehtiniemi <rayl@netrover.com>
* app/airbrush.c gdisplay.c gimage.h gimpimage.c gimpimage.h
......
......@@ -206,6 +206,7 @@ color_select_new (int r,
gtk_widget_show (xy_frame);
csp->xy_color = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_set_dither (GTK_PREVIEW (csp->xy_color), GDK_RGB_DITHER_MAX);
gtk_preview_size (GTK_PREVIEW (csp->xy_color), XY_DEF_WIDTH, XY_DEF_HEIGHT);
gtk_widget_set_events (csp->xy_color, COLOR_AREA_MASK);
gtk_signal_connect_after (GTK_OBJECT (csp->xy_color), "expose_event",
......@@ -223,6 +224,7 @@ color_select_new (int r,
gtk_widget_show (z_frame);
csp->z_color = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_set_dither (GTK_PREVIEW (csp->z_color), GDK_RGB_DITHER_MAX);
gtk_preview_size (GTK_PREVIEW (csp->z_color), Z_DEF_WIDTH, Z_DEF_HEIGHT);
gtk_widget_set_events (csp->z_color, COLOR_AREA_MASK);
gtk_signal_connect_after (GTK_OBJECT (csp->z_color), "expose_event",
......
......@@ -65,9 +65,6 @@ gulong *g_lookup_blue;
gulong *color_pixel_vals;
gulong *gray_pixel_vals;
static int reserved_entries = 4; /* extra colors aside from color cube */
static gulong *reserved_pixels;
static void make_color (gulong *pixel_ptr,
int red,
int green,
......@@ -77,20 +74,7 @@ static void make_color (gulong *pixel_ptr,
static void
set_app_colors ()
{
int i;
if ((g_visual->type == GDK_VISUAL_PSEUDO_COLOR) ||
(g_visual->type == GDK_VISUAL_GRAYSCALE))
{
foreground_pixel = reserved_pixels[0];
background_pixel = reserved_pixels[1];
old_color_pixel = reserved_pixels[2];
new_color_pixel = reserved_pixels[3];
}
else
{
cycled_marching_ants = FALSE;
}
cycled_marching_ants = FALSE;
make_color (&g_black_pixel, 0, 0, 0, FALSE);
make_color (&g_gray_pixel, 127, 127, 127, FALSE);
......@@ -104,19 +88,9 @@ set_app_colors ()
store_color (&old_color_pixel, 0, 0, 0);
store_color (&new_color_pixel, 255, 255, 255);
/* marching ants pixels--if enabled */
if (cycled_marching_ants)
for (i = 0; i < 8; i++)
{
marching_ants_pixels[i] = reserved_pixels[i + reserved_entries - 8];
if (i < 4)
store_color (&marching_ants_pixels[i], 0, 0, 0);
else
store_color (&marching_ants_pixels[i], 255, 255, 255);
}
}
/* This probably doesn't belong here - RLL*/
static unsigned int
gamma_correct (int intensity, double gamma)
{
......@@ -144,17 +118,7 @@ get_color (int red,
int green,
int blue)
{
gulong pixel;
if ((g_visual->type == GDK_VISUAL_PSEUDO_COLOR) ||
(g_visual->type == GDK_VISUAL_GRAYSCALE))
pixel = color_pixel_vals [(red_ordered_dither[red].s[1] +
green_ordered_dither[green].s[1] +
blue_ordered_dither[blue].s[1])];
else
store_color (&pixel, red, green, blue);
return pixel;
return gdk_rgb_xpixel_from_rgb ((red << 16) | (green << 8) | blue);
}
......@@ -165,24 +129,7 @@ make_color (gulong *pixel_ptr,
int blue,
int readwrite)
{
GdkColor col;
red = gamma_correct (red, gamma_val);
green = gamma_correct (green, gamma_val);
blue = gamma_correct (blue, gamma_val);
col.red = red * (65535 / 255);
col.green = green * (65535 / 255);
col.blue = blue * (65535 / 255);
col.pixel = *pixel_ptr;
if (readwrite && ((g_visual->type == GDK_VISUAL_PSEUDO_COLOR) ||
(g_visual->type == GDK_VISUAL_GRAYSCALE)))
gdk_color_change (g_cmap, &col);
else
gdk_color_alloc (g_cmap, &col);
*pixel_ptr = col.pixel;
*pixel_ptr = get_color (red, green, blue);
}
void
......@@ -191,7 +138,7 @@ store_color (gulong *pixel_ptr,
int green,
int blue)
{
make_color (pixel_ptr, red, green, blue, TRUE);
*pixel_ptr = get_color (red, green, blue);
}
......@@ -200,43 +147,14 @@ get_standard_colormaps ()
{
GtkPreviewInfo *info;
if (cycled_marching_ants)
reserved_entries += 8;
gtk_preview_set_gamma (gamma_val);
gtk_preview_set_color_cube (color_cube_shades[0], color_cube_shades[1],
color_cube_shades[2], color_cube_shades[3]);
gtk_preview_set_install_cmap (install_cmap);
gtk_preview_set_reserved (reserved_entries);
/* so we can reinit the colormaps */
gtk_preview_reset ();
gtk_widget_set_default_visual (gtk_preview_get_visual ());
gtk_widget_set_default_colormap (gtk_preview_get_cmap ());
info = gtk_preview_get_info ();
g_visual = info->visual;
if (((g_visual->type == GDK_VISUAL_PSEUDO_COLOR) ||
(g_visual->type == GDK_VISUAL_GRAYSCALE)) &&
info->reserved_pixels == NULL) {
g_print("GIMP cannot get enough colormaps to boot.\n");
g_print("Try exiting other color intensive applications.\n");
g_print("Also try enabling the (install-colormap) option in gimprc.\n");
swapping_free ();
brushes_free ();
patterns_free ();
palettes_free ();
gradients_free ();
palette_free ();
procedural_db_free ();
plug_in_kill ();
tile_swap_exit ();
gtk_exit(0);
}
g_cmap = info->cmap;
#if 0
color_pixel_vals = info->color_pixels;
gray_pixel_vals = info->gray_pixels;
reserved_pixels = info->reserved_pixels;
......@@ -251,6 +169,7 @@ get_standard_colormaps ()
g_lookup_red = info->lookup_red;
g_lookup_green = info->lookup_green;
g_lookup_blue = info->lookup_blue;
#endif
set_app_colors ();
}
......@@ -57,6 +57,8 @@ static void
get_shades (GDisplay *gdisp,
char *buf)
{
sprintf (buf, "Using GdkRgb - we'll get back to you");
#if 0
GtkPreviewInfo *info;
info = gtk_preview_get_info ();
......@@ -91,6 +93,7 @@ get_shades (GDisplay *gdisp,
sprintf (buf, "%d", gdisp->gimage->num_cols);
break;
}
#endif
}
static void
......
This diff is collapsed.
This diff is collapsed.
......@@ -31,7 +31,7 @@ struct _GXImage
GdkVisual *visual; /* visual appropriate to our depth */
GdkGC *gc; /* graphics context */
GdkImage *image; /* private data */
guchar *data;
};
......@@ -52,7 +52,7 @@ create_gximage (GdkVisual *visual, int width, int height)
gximage->visual = visual;
gximage->gc = NULL;
gximage->image = gdk_image_new (GDK_IMAGE_FASTEST, visual, width, height);
gximage->data = g_malloc (width * height * 3);
return gximage;
}
......@@ -60,7 +60,7 @@ create_gximage (GdkVisual *visual, int width, int height)
static void
delete_gximage (GXImage *gximage)
{
gdk_image_destroy (gximage->image);
g_free (gximage->data);
if (gximage->gc)
gdk_gc_destroy (gximage->gc);
g_free (gximage);
......@@ -86,25 +86,25 @@ gximage_free ()
guchar*
gximage_get_data ()
{
return gximage->image->mem;
return gximage->data;
}
int
gximage_get_bpp ()
{
return gximage->image->bpp;
return 3;
}
int
gximage_get_bpl ()
{
return gximage->image->bpl;
return 3 * GXIMAGE_WIDTH;
}
int
gximage_get_byte_order ()
{
return gximage->image->byte_order;
return GDK_MSB_FIRST;
}
void
......@@ -117,8 +117,13 @@ gximage_put (GdkWindow *win, int x, int y, int w, int h)
gdk_gc_set_exposures (gximage->gc, TRUE);
}
gdk_draw_image (win, gximage->gc, gximage->image, 0, 0, x, y, w, h);
/* sync the draw image to make sure it has been displayed before continuing */
gdk_flush ();
gdk_draw_rgb_image (win,
gximage->gc,
x,
y,
w,
h,
GDK_RGB_DITHER_MAX, /* todo: make configurable */
gximage->data,
GXIMAGE_WIDTH * 3);
}
......@@ -206,6 +206,7 @@ color_select_new (int r,
gtk_widget_show (xy_frame);
csp->xy_color = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_set_dither (GTK_PREVIEW (csp->xy_color), GDK_RGB_DITHER_MAX);
gtk_preview_size (GTK_PREVIEW (csp->xy_color), XY_DEF_WIDTH, XY_DEF_HEIGHT);
gtk_widget_set_events (csp->xy_color, COLOR_AREA_MASK);
gtk_signal_connect_after (GTK_OBJECT (csp->xy_color), "expose_event",
......@@ -223,6 +224,7 @@ color_select_new (int r,
gtk_widget_show (z_frame);
csp->z_color = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_set_dither (GTK_PREVIEW (csp->z_color), GDK_RGB_DITHER_MAX);
gtk_preview_size (GTK_PREVIEW (csp->z_color), Z_DEF_WIDTH, Z_DEF_HEIGHT);
gtk_widget_set_events (csp->z_color, COLOR_AREA_MASK);
gtk_signal_connect_after (GTK_OBJECT (csp->z_color), "expose_event",
......
......@@ -57,6 +57,8 @@ static void
get_shades (GDisplay *gdisp,
char *buf)
{
sprintf (buf, "Using GdkRgb - we'll get back to you");
#if 0
GtkPreviewInfo *info;
info = gtk_preview_get_info ();
......@@ -91,6 +93,7 @@ get_shades (GDisplay *gdisp,
sprintf (buf, "%d", gdisp->gimage->num_cols);
break;
}
#endif
}
static void
......
......@@ -31,7 +31,7 @@ struct _GXImage
GdkVisual *visual; /* visual appropriate to our depth */
GdkGC *gc; /* graphics context */
GdkImage *image; /* private data */
guchar *data;
};
......@@ -52,7 +52,7 @@ create_gximage (GdkVisual *visual, int width, int height)
gximage->visual = visual;
gximage->gc = NULL;
gximage->image = gdk_image_new (GDK_IMAGE_FASTEST, visual, width, height);
gximage->data = g_malloc (width * height * 3);
return gximage;
}
......@@ -60,7 +60,7 @@ create_gximage (GdkVisual *visual, int width, int height)
static void
delete_gximage (GXImage *gximage)
{
gdk_image_destroy (gximage->image);
g_free (gximage->data);
if (gximage->gc)
gdk_gc_destroy (gximage->gc);
g_free (gximage);
......@@ -86,25 +86,25 @@ gximage_free ()
guchar*
gximage_get_data ()
{
return gximage->image->mem;
return gximage->data;
}
int
gximage_get_bpp ()
{
return gximage->image->bpp;
return 3;
}
int
gximage_get_bpl ()
{
return gximage->image->bpl;
return 3 * GXIMAGE_WIDTH;
}
int
gximage_get_byte_order ()
{
return gximage->image->byte_order;
return GDK_MSB_FIRST;
}
void
......@@ -117,8 +117,13 @@ gximage_put (GdkWindow *win, int x, int y, int w, int h)
gdk_gc_set_exposures (gximage->gc, TRUE);
}
gdk_draw_image (win, gximage->gc, gximage->image, 0, 0, x, y, w, h);
/* sync the draw image to make sure it has been displayed before continuing */
gdk_flush ();
gdk_draw_rgb_image (win,
gximage->gc,
x,
y,
w,
h,
GDK_RGB_DITHER_MAX, /* todo: make configurable */
gximage->data,
GXIMAGE_WIDTH * 3);
}
This diff is collapsed.
......@@ -57,6 +57,8 @@ static void
get_shades (GDisplay *gdisp,
char *buf)
{
sprintf (buf, "Using GdkRgb - we'll get back to you");
#if 0
GtkPreviewInfo *info;
info = gtk_preview_get_info ();
......@@ -91,6 +93,7 @@ get_shades (GDisplay *gdisp,
sprintf (buf, "%d", gdisp->gimage->num_cols);
break;
}
#endif
}
static void
......
......@@ -206,6 +206,7 @@ color_select_new (int r,
gtk_widget_show (xy_frame);
csp->xy_color = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_set_dither (GTK_PREVIEW (csp->xy_color), GDK_RGB_DITHER_MAX);
gtk_preview_size (GTK_PREVIEW (csp->xy_color), XY_DEF_WIDTH, XY_DEF_HEIGHT);
gtk_widget_set_events (csp->xy_color, COLOR_AREA_MASK);
gtk_signal_connect_after (GTK_OBJECT (csp->xy_color), "expose_event",
......@@ -223,6 +224,7 @@ color_select_new (int r,
gtk_widget_show (z_frame);
csp->z_color = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_set_dither (GTK_PREVIEW (csp->z_color), GDK_RGB_DITHER_MAX);
gtk_preview_size (GTK_PREVIEW (csp->z_color), Z_DEF_WIDTH, Z_DEF_HEIGHT);
gtk_widget_set_events (csp->z_color, COLOR_AREA_MASK);
gtk_signal_connect_after (GTK_OBJECT (csp->z_color), "expose_event",
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment