Commit 34700fe6 authored by Behdad Esfahbod's avatar Behdad Esfahbod Committed by Behdad Esfahbod

Use pango_matrix_transform_rectangle(). (#340141)

2007-01-10  Behdad Esfahbod  <behdad@gnome.org>

        * gdk/gdkpango.c (gdk_draw_layout_with_colors):
        * gtk/gtklabel.c (gtk_label_size_request):
        Use pango_matrix_transform_rectangle(). (#340141)

        * configure.in: Bump pango requirement to 1.15.3.


svn path=/trunk/; revision=17129
parent 28c44b80
2007-01-10 Behdad Esfahbod <behdad@gnome.org>
* gdk/gdkpango.c (gdk_draw_layout_with_colors):
* gtk/gtklabel.c (gtk_label_size_request):
Use pango_matrix_transform_rectangle(). (#340141)
* configure.in: Bump pango requirement to 1.15.3.
2007-01-10 Kristian Rietveld <kris@imendio.com> 2007-01-10 Kristian Rietveld <kris@imendio.com>
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_init): * gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_init):
......
...@@ -32,7 +32,7 @@ m4_define([gtk_binary_version], [2.10.0]) ...@@ -32,7 +32,7 @@ m4_define([gtk_binary_version], [2.10.0])
# required versions of other packages # required versions of other packages
m4_define([glib_required_version], [2.12.0]) m4_define([glib_required_version], [2.12.0])
m4_define([pango_required_version], [1.15.2]) m4_define([pango_required_version], [1.15.3])
m4_define([atk_required_version], [1.9.0]) m4_define([atk_required_version], [1.9.0])
m4_define([cairo_required_version], [1.2.0]) m4_define([cairo_required_version], [1.2.0])
......
...@@ -873,55 +873,6 @@ gdk_draw_layout_line_with_colors (GdkDrawable *drawable, ...@@ -873,55 +873,6 @@ gdk_draw_layout_line_with_colors (GdkDrawable *drawable,
release_renderer (renderer); release_renderer (renderer);
} }
/* Gets the bounds of a layout in device coordinates. Note cut-and-paste
* between here and gtklabel.c */
static void
get_rotated_layout_bounds (PangoLayout *layout,
GdkRectangle *rect)
{
PangoContext *context = pango_layout_get_context (layout);
const PangoMatrix *matrix = pango_context_get_matrix (context);
gdouble x_min = 0, x_max = 0, y_min = 0, y_max = 0; /* quiet gcc */
PangoRectangle logical_rect;
gint i, j;
pango_layout_get_extents (layout, NULL, &logical_rect);
for (i = 0; i < 2; i++)
{
gdouble x = (i == 0) ? logical_rect.x : logical_rect.x + logical_rect.width;
for (j = 0; j < 2; j++)
{
gdouble y = (j == 0) ? logical_rect.y : logical_rect.y + logical_rect.height;
gdouble xt = (x * matrix->xx + y * matrix->xy) / PANGO_SCALE + matrix->x0;
gdouble yt = (x * matrix->yx + y * matrix->yy) / PANGO_SCALE + matrix->y0;
if (i == 0 && j == 0)
{
x_min = x_max = xt;
y_min = y_max = yt;
}
else
{
if (xt < x_min)
x_min = xt;
if (yt < y_min)
y_min = yt;
if (xt > x_max)
x_max = xt;
if (yt > y_max)
y_max = yt;
}
}
}
rect->x = floor (x_min);
rect->width = ceil (x_max) - rect->x;
rect->y = floor (y_min);
rect->height = floor (y_max) - rect->y;
}
/** /**
* gdk_draw_layout_with_colors: * gdk_draw_layout_with_colors:
* @drawable: the drawable on which to draw string * @drawable: the drawable on which to draw string
...@@ -970,9 +921,11 @@ gdk_draw_layout_with_colors (GdkDrawable *drawable, ...@@ -970,9 +921,11 @@ gdk_draw_layout_with_colors (GdkDrawable *drawable,
if (matrix) if (matrix)
{ {
PangoMatrix tmp_matrix; PangoMatrix tmp_matrix;
GdkRectangle rect; PangoRectangle rect;
get_rotated_layout_bounds (layout, &rect); pango_layout_get_extents (layout, NULL, &rect);
pango_matrix_transform_rectangle (matrix, &rect);
pango_extents_to_pixels (&rect, NULL);
tmp_matrix = *matrix; tmp_matrix = *matrix;
tmp_matrix.x0 += x - rect.x; tmp_matrix.x0 += x - rect.x;
......
...@@ -2042,55 +2042,6 @@ gtk_label_ensure_layout (GtkLabel *label) ...@@ -2042,55 +2042,6 @@ gtk_label_ensure_layout (GtkLabel *label)
} }
} }
/* Gets the bounds of a layout in device coordinates. Note cut-and-paste
* between here and gdkpango.c */
static void
get_rotated_layout_bounds (PangoLayout *layout,
GdkRectangle *rect)
{
PangoContext *context = pango_layout_get_context (layout);
const PangoMatrix *matrix = pango_context_get_matrix (context);
gdouble x_min = 0, x_max = 0, y_min = 0, y_max = 0; /* quiet gcc */
PangoRectangle logical_rect;
gint i, j;
pango_layout_get_extents (layout, NULL, &logical_rect);
for (i = 0; i < 2; i++)
{
gdouble x = (i == 0) ? logical_rect.x : logical_rect.x + logical_rect.width;
for (j = 0; j < 2; j++)
{
gdouble y = (j == 0) ? logical_rect.y : logical_rect.y + logical_rect.height;
gdouble xt = (x * matrix->xx + y * matrix->xy) / PANGO_SCALE + matrix->x0;
gdouble yt = (x * matrix->yx + y * matrix->yy) / PANGO_SCALE + matrix->y0;
if (i == 0 && j == 0)
{
x_min = x_max = xt;
y_min = y_max = yt;
}
else
{
if (xt < x_min)
x_min = xt;
if (yt < y_min)
y_min = yt;
if (xt > x_max)
x_max = xt;
if (yt > y_max)
y_max = yt;
}
}
}
rect->x = floor (x_min);
rect->width = ceil (x_max) - rect->x;
rect->y = floor (y_min);
rect->height = floor (y_max) - rect->y;
}
static void static void
gtk_label_size_request (GtkWidget *widget, gtk_label_size_request (GtkWidget *widget,
GtkRequisition *requisition) GtkRequisition *requisition)
...@@ -2132,9 +2083,13 @@ gtk_label_size_request (GtkWidget *widget, ...@@ -2132,9 +2083,13 @@ gtk_label_size_request (GtkWidget *widget,
if (label->have_transform) if (label->have_transform)
{ {
GdkRectangle rect; PangoRectangle rect;
PangoContext *context = pango_layout_get_context (label->layout);
const PangoMatrix *matrix = pango_context_get_matrix (context);
get_rotated_layout_bounds (label->layout, &rect); pango_layout_get_extents (label->layout, NULL, &rect);
pango_matrix_transform_rectangle (matrix, &rect);
pango_extents_to_pixels (&rect, NULL);
requisition->width = width + rect.width; requisition->width = width + rect.width;
requisition->height = height + rect.height; requisition->height = height + rect.height;
......
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