plug-ins/ifscompose/ifscompose.[ch] use Pango to draw text.

2003-07-01  Sven Neumann  <sven@gimp.org>

	* plug-ins/ifscompose/ifscompose.[ch]
	* plug-ins/ifscompose/ifscompose_utils.c: use Pango to draw text.

	* plug-ins/ifscompose/ifscompose_storage.c: minor code cleanup.
This commit is contained in:
Sven Neumann
2003-07-01 16:07:13 +00:00
committed by Sven Neumann
parent 5b181dcf4d
commit a8f6d6de9b
5 changed files with 95 additions and 72 deletions

View File

@ -1,3 +1,10 @@
2003-07-01 Sven Neumann <sven@gimp.org>
* plug-ins/ifscompose/ifscompose.[ch]
* plug-ins/ifscompose/ifscompose_utils.c: use Pango to draw text.
* plug-ins/ifscompose/ifscompose_storage.c: minor code cleanup.
2003-07-01 Sven Neumann <sven@gimp.org> 2003-07-01 Sven Neumann <sven@gimp.org>
* configure.in: bumped version number to 1.3.17. * configure.in: bumped version number to 1.3.17.

View File

@ -99,7 +99,7 @@ typedef struct
{ {
IfsComposeVals ifsvals; IfsComposeVals ifsvals;
AffElement **elements; AffElement **elements;
gint *element_selected; gboolean *element_selected;
gint current_element; gint current_element;
} UndoItem; } UndoItem;
@ -1560,10 +1560,11 @@ set_current_element (gint index)
update_values (); update_values ();
} }
static gint static gboolean
design_area_expose (GtkWidget *widget, design_area_expose (GtkWidget *widget,
GdkEventExpose *event) GdkEventExpose *event)
{ {
PangoLayout *layout;
gint i; gint i;
gint cx, cy; gint cx, cy;
@ -1593,6 +1594,8 @@ design_area_expose (GtkWidget *widget,
widget->style->fg_gc[widget->state], widget->style->fg_gc[widget->state],
cx, cy - 10, cx, cy + 10); cx, cy - 10, cx, cy + 10);
layout = gtk_widget_create_pango_layout (widget, NULL);
for (i = 0; i < ifsvals.num_elements; i++) for (i = 0; i < ifsvals.num_elements; i++)
{ {
aff_element_draw (elements[i], element_selected[i], aff_element_draw (elements[i], element_selected[i],
@ -1601,9 +1604,11 @@ design_area_expose (GtkWidget *widget,
ifsDesign->pixmap, ifsDesign->pixmap,
widget->style->fg_gc[widget->state], widget->style->fg_gc[widget->state],
ifsDesign->selected_gc, ifsDesign->selected_gc,
gtk_style_get_font (ifsDesign->area->style)); layout);
} }
g_object_unref (layout);
gdk_draw_drawable (widget->window, gdk_draw_drawable (widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE (widget)], widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
ifsDesign->pixmap, ifsDesign->pixmap,
@ -1614,7 +1619,7 @@ design_area_expose (GtkWidget *widget,
return FALSE; return FALSE;
} }
static gint static gboolean
design_area_configure (GtkWidget *widget, design_area_configure (GtkWidget *widget,
GdkEventConfigure *event) GdkEventConfigure *event)
{ {
@ -1682,7 +1687,7 @@ design_area_button_press (GtkWidget *widget,
|| !element_selected[ifsD->current_element] )) || !element_selected[ifsD->current_element] ))
{ {
for (i = 0; i < ifsvals.num_elements; i++) for (i = 0; i < ifsvals.num_elements; i++)
element_selected[i] = 0; element_selected[i] = FALSE;
} }
if (ifsD->current_element >= 0) if (ifsD->current_element >= 0)
@ -1883,7 +1888,8 @@ undo_begin (void)
undo_ring[new_index].ifsvals = ifsvals; undo_ring[new_index].ifsvals = ifsvals;
undo_ring[new_index].elements = g_new (AffElement *,ifsvals.num_elements); undo_ring[new_index].elements = g_new (AffElement *,ifsvals.num_elements);
undo_ring[new_index].element_selected = g_new (gint, ifsvals.num_elements); undo_ring[new_index].element_selected = g_new (gboolean,
ifsvals.num_elements);
undo_ring[new_index].current_element = ifsD->current_element; undo_ring[new_index].current_element = ifsD->current_element;
for (i = 0; i < ifsvals.num_elements; i++) for (i = 0; i < ifsvals.num_elements; i++)
@ -1920,7 +1926,7 @@ undo_exchange (gint el)
{ {
gint i; gint i;
AffElement **telements; AffElement **telements;
gint *tselected; gboolean *tselected;
IfsComposeVals tifsvals; IfsComposeVals tifsvals;
gint tcurrent; gint tcurrent;
gdouble width = ifsDesign->area->allocation.width; gdouble width = ifsDesign->area->allocation.width;
@ -2509,7 +2515,7 @@ ifs_compose_set_defaults (void)
ifsvals.num_elements = 3; ifsvals.num_elements = 3;
elements = g_realloc (elements, ifsvals.num_elements * sizeof(AffElement *)); elements = g_realloc (elements, ifsvals.num_elements * sizeof(AffElement *));
element_selected = g_realloc (element_selected, element_selected = g_realloc (element_selected,
ifsvals.num_elements * sizeof(gint)); ifsvals.num_elements * sizeof(gboolean));
elements[0] = aff_element_new (0.3, 0.37 * ifsvals.aspect_ratio, &color, elements[0] = aff_element_new (0.3, 0.37 * ifsvals.aspect_ratio, &color,
++count_for_naming); ++count_for_naming);
@ -2646,7 +2652,7 @@ ifsfile_replace_ifsvals (IfsComposeVals *new_ifsvals,
} }
element_selected = g_realloc (element_selected, element_selected = g_realloc (element_selected,
ifsvals.num_elements * sizeof(gint)); ifsvals.num_elements * sizeof(gboolean));
for (i = 0; i < ifsvals.num_elements; i++) for (i = 0; i < ifsvals.num_elements; i++)
element_selected[i] = FALSE; element_selected[i] = FALSE;
@ -2791,7 +2797,7 @@ ifs_compose_new_callback (GtkWidget *widget,
ifsvals.num_elements++; ifsvals.num_elements++;
elements = g_realloc (elements, ifsvals.num_elements * sizeof (AffElement *)); elements = g_realloc (elements, ifsvals.num_elements * sizeof (AffElement *));
element_selected = g_realloc (element_selected, element_selected = g_realloc (element_selected,
ifsvals.num_elements * sizeof (gint)); ifsvals.num_elements * sizeof (gboolean));
for (i = 0; i < ifsvals.num_elements-1; i++) for (i = 0; i < ifsvals.num_elements-1; i++)
element_selected[i] = FALSE; element_selected[i] = FALSE;

View File

@ -117,11 +117,14 @@ void aff_element_compute_boundary (AffElement *elem, gint width,
gint height, gint height,
AffElement **elements, AffElement **elements,
int num_elements); int num_elements);
void aff_element_draw (AffElement *elem, gint selected, void aff_element_draw (AffElement *elem,
gint width, gint height, gint selected,
gint width,
gint height,
GdkDrawable *win, GdkDrawable *win,
GdkGC *normal_gc,GdkGC *selected_gc, GdkGC *normal_gc,
GdkFont *font); GdkGC *selected_gc,
PangoLayout *layout);
void ifs_render (AffElement **elements, gint num_elements, void ifs_render (AffElement **elements, gint num_elements,
@ -129,8 +132,9 @@ void ifs_render (AffElement **elements, gint num_elements,
IfsComposeVals *vals, gint band_y, gint band_height, IfsComposeVals *vals, gint band_y, gint band_height,
guchar *data, guchar *mask, guchar *nhits, gint preview); guchar *data, guchar *mask, guchar *nhits, gint preview);
char * ifsvals_stringify (IfsComposeVals *vals, AffElement **elements); gchar * ifsvals_stringify (IfsComposeVals *vals,
gboolean ifsvals_parse_string (char *str, AffElement **elements);
gboolean ifsvals_parse_string (const gchar *str,
IfsComposeVals *vals, IfsComposeVals *vals,
AffElement ***elements); AffElement ***elements);

View File

@ -135,7 +135,8 @@ ifsvals_parse_color (GScanner *scanner,
/* Parse a float which (unlike G_TOKEN_FLOAT) can be negative /* Parse a float which (unlike G_TOKEN_FLOAT) can be negative
*/ */
static GTokenType static GTokenType
parse_genuine_float (GScanner *scanner, gdouble *result) parse_genuine_float (GScanner *scanner,
gdouble *result)
{ {
gboolean negate = FALSE; gboolean negate = FALSE;
GTokenType token; GTokenType token;
@ -158,7 +159,8 @@ parse_genuine_float (GScanner *scanner, gdouble *result)
} }
static GTokenType static GTokenType
ifsvals_parse_element (GScanner *scanner, AffElementVals *result) ifsvals_parse_element (GScanner *scanner,
AffElementVals *result)
{ {
GTokenType token; GTokenType token;
GTokenType expected_token; GTokenType expected_token;
@ -297,7 +299,9 @@ ifsvals_parse_element (GScanner *scanner, AffElementVals *result)
*************************************************************/ *************************************************************/
static gboolean static gboolean
ifsvals_parse (GScanner *scanner, IfsComposeVals *vals, AffElement ***elements) ifsvals_parse (GScanner *scanner,
IfsComposeVals *vals,
AffElement ***elements)
{ {
GTokenType token, expected_token; GTokenType token, expected_token;
AffElement *el; AffElement *el;
@ -306,7 +310,7 @@ ifsvals_parse (GScanner *scanner, IfsComposeVals *vals, AffElement ***elements)
GList *el_list = NULL; GList *el_list = NULL;
GList *tmp_list; GList *tmp_list;
int i; gint i;
new_vals = *vals; new_vals = *vals;
new_vals.num_elements = 0; new_vals.num_elements = 0;
@ -413,7 +417,9 @@ ifsvals_parse (GScanner *scanner, IfsComposeVals *vals, AffElement ***elements)
} }
gboolean gboolean
ifsvals_parse_string (char *str, IfsComposeVals *vals, AffElement ***elements) ifsvals_parse_string (const gchar *str,
IfsComposeVals *vals,
AffElement ***elements)
{ {
GScanner *scanner = g_scanner_new (NULL); GScanner *scanner = g_scanner_new (NULL);
gboolean result; gboolean result;
@ -447,13 +453,16 @@ ifsvals_parse_string (char *str, IfsComposeVals *vals, AffElement ***elements)
* The stringified result (free with g_free) * The stringified result (free with g_free)
*************************************************************/ *************************************************************/
char * gchar *
ifsvals_stringify (IfsComposeVals *vals, AffElement **elements) ifsvals_stringify (IfsComposeVals *vals,
AffElement **elements)
{ {
gint i; gint i;
gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
gchar cbuf[3][G_ASCII_DTOSTR_BUF_SIZE]; gchar cbuf[3][G_ASCII_DTOSTR_BUF_SIZE];
GString *result = g_string_new (NULL); GString *result;
result = g_string_new (NULL);
g_string_append_printf (result, "iterations %d\n", vals->iterations); g_string_append_printf (result, "iterations %d\n", vals->iterations);
g_string_append_printf (result, "max_memory %d\n", vals->max_memory); g_string_append_printf (result, "max_memory %d\n", vals->max_memory);

View File

@ -25,12 +25,6 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#ifdef __GNUC__
#warning FIXME: GDK_DISABLE_DEPRECATED
#endif
#undef GDK_DISABLE_DEPRECATED
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <libgimp/gimp.h> #include <libgimp/gimp.h>
@ -712,26 +706,29 @@ aff_element_compute_boundary (AffElement *elem,
void void
aff_element_draw (AffElement *elem, aff_element_draw (AffElement *elem,
gint selected, gboolean selected,
gint width, gint width,
gint height, gint height,
GdkDrawable *win, GdkDrawable *win,
GdkGC *normal_gc, GdkGC *normal_gc,
GdkGC *selected_gc, GdkGC *selected_gc,
GdkFont *font) PangoLayout *layout)
{ {
PangoRectangle rect;
GdkGC *gc; GdkGC *gc;
gint string_width = gdk_string_width (font,elem->name);
gint string_height = font->ascent + font->descent + 2; pango_layout_set_text (layout, elem->name, -1);
pango_layout_get_pixel_extents (layout, NULL, &rect);
if (selected) if (selected)
gc = selected_gc; gc = selected_gc;
else else
gc = normal_gc; gc = normal_gc;
gdk_draw_string(win,font,gc, gdk_draw_layout (win, gc,
elem->v.x*width-string_width/2, elem->v.x * width - rect.width / 2,
elem->v.y*width+string_height/2,elem->name); elem->v.y * width + rect.height / 2,
layout);
if (elem->click_boundary != elem->draw_boundary) if (elem->click_boundary != elem->draw_boundary)
gdk_draw_polygon (win, normal_gc, FALSE, elem->click_boundary->points, gdk_draw_polygon (win, normal_gc, FALSE, elem->click_boundary->points,