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>
* configure.in: bumped version number to 1.3.17.

View File

@ -99,7 +99,7 @@ typedef struct
{
IfsComposeVals ifsvals;
AffElement **elements;
gint *element_selected;
gboolean *element_selected;
gint current_element;
} UndoItem;
@ -1560,12 +1560,13 @@ set_current_element (gint index)
update_values ();
}
static gint
static gboolean
design_area_expose (GtkWidget *widget,
GdkEventExpose *event)
{
gint i;
gint cx, cy;
PangoLayout *layout;
gint i;
gint cx, cy;
if (!ifsDesign->selected_gc)
{
@ -1587,34 +1588,38 @@ design_area_expose (GtkWidget *widget,
cx = ifsvals.center_x * widget->allocation.width;
cy = ifsvals.center_y * widget->allocation.width;
gdk_draw_line (ifsDesign->pixmap,
widget->style->fg_gc[widget->state],
cx - 10, cy, cx + 10, cy);
widget->style->fg_gc[widget->state],
cx - 10, cy, cx + 10, cy);
gdk_draw_line (ifsDesign->pixmap,
widget->style->fg_gc[widget->state],
cx, cy - 10, cx, cy + 10);
widget->style->fg_gc[widget->state],
cx, cy - 10, cx, cy + 10);
layout = gtk_widget_create_pango_layout (widget, NULL);
for (i = 0; i < ifsvals.num_elements; i++)
{
aff_element_draw (elements[i], element_selected[i],
widget->allocation.width,
widget->allocation.height,
ifsDesign->pixmap,
widget->style->fg_gc[widget->state],
ifsDesign->selected_gc,
gtk_style_get_font (ifsDesign->area->style));
widget->allocation.width,
widget->allocation.height,
ifsDesign->pixmap,
widget->style->fg_gc[widget->state],
ifsDesign->selected_gc,
layout);
}
g_object_unref (layout);
gdk_draw_drawable (widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
ifsDesign->pixmap,
event->area.x, event->area.y,
event->area.x, event->area.y,
event->area.width, event->area.height);
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
ifsDesign->pixmap,
event->area.x, event->area.y,
event->area.x, event->area.y,
event->area.width, event->area.height);
return FALSE;
}
static gint
static gboolean
design_area_configure (GtkWidget *widget,
GdkEventConfigure *event)
{
@ -1682,7 +1687,7 @@ design_area_button_press (GtkWidget *widget,
|| !element_selected[ifsD->current_element] ))
{
for (i = 0; i < ifsvals.num_elements; i++)
element_selected[i] = 0;
element_selected[i] = FALSE;
}
if (ifsD->current_element >= 0)
@ -1883,7 +1888,8 @@ undo_begin (void)
undo_ring[new_index].ifsvals = ifsvals;
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;
for (i = 0; i < ifsvals.num_elements; i++)
@ -1920,7 +1926,7 @@ undo_exchange (gint el)
{
gint i;
AffElement **telements;
gint *tselected;
gboolean *tselected;
IfsComposeVals tifsvals;
gint tcurrent;
gdouble width = ifsDesign->area->allocation.width;
@ -2509,7 +2515,7 @@ ifs_compose_set_defaults (void)
ifsvals.num_elements = 3;
elements = g_realloc (elements, ifsvals.num_elements * sizeof(AffElement *));
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,
++count_for_naming);
@ -2646,7 +2652,7 @@ ifsfile_replace_ifsvals (IfsComposeVals *new_ifsvals,
}
element_selected = g_realloc (element_selected,
ifsvals.num_elements * sizeof(gint));
ifsvals.num_elements * sizeof(gboolean));
for (i = 0; i < ifsvals.num_elements; i++)
element_selected[i] = FALSE;
@ -2791,7 +2797,7 @@ ifs_compose_new_callback (GtkWidget *widget,
ifsvals.num_elements++;
elements = g_realloc (elements, ifsvals.num_elements * sizeof (AffElement *));
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++)
element_selected[i] = FALSE;
@ -2801,7 +2807,7 @@ ifs_compose_new_callback (GtkWidget *widget,
set_current_element (ifsvals.num_elements-1);
ifsD->selected_orig = g_realloc (ifsD->selected_orig,
ifsvals.num_elements*sizeof(AffElement));
ifsvals.num_elements * sizeof(AffElement));
aff_element_compute_trans (elem, width, height,
ifsvals.center_x, ifsvals.center_y);

View File

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

View File

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

View File

@ -25,12 +25,6 @@
#include <stdio.h>
#include <string.h>
#ifdef __GNUC__
#warning FIXME: GDK_DISABLE_DEPRECATED
#endif
#undef GDK_DISABLE_DEPRECATED
#include <gdk/gdk.h>
#include <libgimp/gimp.h>
@ -712,33 +706,36 @@ aff_element_compute_boundary (AffElement *elem,
void
aff_element_draw (AffElement *elem,
gint selected,
gboolean selected,
gint width,
gint height,
GdkDrawable *win,
GdkGC *normal_gc,
GdkGC *selected_gc,
GdkFont *font)
PangoLayout *layout)
{
GdkGC *gc;
gint string_width = gdk_string_width (font,elem->name);
gint string_height = font->ascent + font->descent + 2;
PangoRectangle rect;
GdkGC *gc;
pango_layout_set_text (layout, elem->name, -1);
pango_layout_get_pixel_extents (layout, NULL, &rect);
if (selected)
gc = selected_gc;
else
gc = normal_gc;
gdk_draw_string(win,font,gc,
elem->v.x*width-string_width/2,
elem->v.y*width+string_height/2,elem->name);
gdk_draw_layout (win, gc,
elem->v.x * width - rect.width / 2,
elem->v.y * width + rect.height / 2,
layout);
if (elem->click_boundary != elem->draw_boundary)
gdk_draw_polygon(win,normal_gc,FALSE,elem->click_boundary->points,
elem->click_boundary->npoints);
gdk_draw_polygon (win, normal_gc, FALSE, elem->click_boundary->points,
elem->click_boundary->npoints);
gdk_draw_polygon(win,gc,FALSE,elem->draw_boundary->points,
elem->draw_boundary->npoints);
gdk_draw_polygon (win, gc, FALSE, elem->draw_boundary->points,
elem->draw_boundary->npoints);
}
AffElement *
@ -914,7 +911,7 @@ ifs_render (AffElement **elements,
by roundoff*/
/* create the brush */
if (!preview)
brush = create_brush(vals,&brush_size,&brush_offset);
brush = create_brush (vals,&brush_size,&brush_offset);
x = y = 0;
r = g = b = 0;