summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-01-19 07:20:55 -0500
committerMatthias Clasen <mclasen@redhat.com>2022-06-22 11:33:20 -0400
commit7930d791ce87b8b6bfeb82efdec29962db8a492b (patch)
tree73a241e43854d977be01bf6f31c013e632ac5abe
parent7c4163828a2d9a70044c9bc6c76a347a76c3fce2 (diff)
downloadpango-7930d791ce87b8b6bfeb82efdec29962db8a492b.tar.gz
Port examples to PangoSimpleLayout
-rw-r--r--examples/cairoshape.c94
-rw-r--r--examples/cairosimple.c25
-rw-r--r--examples/cairotwisted.c325
3 files changed, 223 insertions, 221 deletions
diff --git a/examples/cairoshape.c b/examples/cairoshape.c
index d288db14..4c1de86b 100644
--- a/examples/cairoshape.c
+++ b/examples/cairoshape.c
@@ -2,7 +2,7 @@
* inside a text layout, positioned by Pango. This has become possibly
* using the following API added in Pango 1.18:
*
- * pango_cairo_context_set_shape_renderer ()
+ * pango_cairo_context_set_shape_renderer ()
*
* This examples uses a small parser to convert shapes in the format of
* SVG paths to cairo instructions. You can typically extract these from
@@ -52,8 +52,8 @@ static MiniSvg GnomeFootLogo = {
static void
mini_svg_render (MiniSvg *shape,
- cairo_t *cr,
- gboolean do_path)
+ cairo_t *cr,
+ gboolean do_path)
{
double x, y;
const char *p;
@@ -68,33 +68,33 @@ mini_svg_render (MiniSvg *shape,
{
case 'M':
{
- sscanf (p, "%lf,%lf %n", &x, &y, &len); p += len;
- cairo_move_to (cr, x, y);
- break;
- }
+ sscanf (p, "%lf,%lf %n", &x, &y, &len); p += len;
+ cairo_move_to (cr, x, y);
+ break;
+ }
case 'L':
{
- sscanf (p, "%lf,%lf %n", &x, &y, &len); p += len;
- cairo_line_to (cr, x, y);
- break;
- }
+ sscanf (p, "%lf,%lf %n", &x, &y, &len); p += len;
+ cairo_line_to (cr, x, y);
+ break;
+ }
case 'C':
{
- double x1, y1, x2, y2, x3, y3;
- sscanf (p, "%lf,%lf %lf,%lf %lf,%lf %n", &x1, &y1, &x2, &y2, &x3, &y3, &len); p += len;
- cairo_curve_to (cr, x1, y1, x2, y2, x3, y3);
- break;
- }
+ double x1, y1, x2, y2, x3, y3;
+ sscanf (p, "%lf,%lf %lf,%lf %lf,%lf %n", &x1, &y1, &x2, &y2, &x3, &y3, &len); p += len;
+ cairo_curve_to (cr, x1, y1, x2, y2, x3, y3);
+ break;
+ }
case 'z':
{
- cairo_close_path (cr);
- break;
- }
+ cairo_close_path (cr);
+ break;
+ }
default:
{
- g_warning ("Invalid MiniSvg operation '%c'", *op);
- break;
- }
+ g_warning ("Invalid MiniSvg operation '%c'", *op);
+ break;
+ }
}
if (!do_path)
@@ -103,9 +103,9 @@ mini_svg_render (MiniSvg *shape,
static void
mini_svg_shape_renderer (cairo_t *cr,
- PangoAttrShape *attr,
- gboolean do_path,
- gpointer data G_GNUC_UNUSED)
+ PangoAttrShape *attr,
+ gboolean do_path,
+ gpointer data G_GNUC_UNUSED)
{
MiniSvg *shape = (MiniSvg *) attr->data;
double scale_x, scale_y;
@@ -114,30 +114,30 @@ mini_svg_shape_renderer (cairo_t *cr,
scale_y = (double) attr->ink_rect.height / (PANGO_SCALE * shape->height);
cairo_rel_move_to (cr,
- (double) attr->ink_rect.x / PANGO_SCALE,
- (double) attr->ink_rect.y / PANGO_SCALE);
+ (double) attr->ink_rect.x / PANGO_SCALE,
+ (double) attr->ink_rect.y / PANGO_SCALE);
cairo_scale (cr, scale_x, scale_y);
mini_svg_render (shape, cr, do_path);
}
-static PangoLayout *
+static PangoSimpleLayout *
get_layout (cairo_t *cr)
{
- PangoLayout *layout;
+ PangoSimpleLayout *layout;
PangoAttrList *attrs;
PangoRectangle ink_rect = {1 * PANGO_SCALE, -11 * PANGO_SCALE, 8 * PANGO_SCALE, 10 * PANGO_SCALE};
PangoRectangle logical_rect = {0 * PANGO_SCALE, -12 * PANGO_SCALE, 10 * PANGO_SCALE, 12 * PANGO_SCALE};
const char *p;
- /* Create a PangoLayout, set the font and text */
- layout = pango_cairo_create_layout (cr);
+ /* Create a PangoSimpleLayout, set the font and text */
+ layout = pango_cairo_create_simple_layout (cr);
- pango_cairo_context_set_shape_renderer (pango_layout_get_context (layout),
- mini_svg_shape_renderer, NULL, NULL);
+ pango_cairo_context_set_shape_renderer (pango_simple_layout_get_context (layout),
+ mini_svg_shape_renderer, NULL, NULL);
- pango_layout_set_text (layout, text, -1);
+ pango_simple_layout_set_text (layout, text, -1);
attrs = pango_attr_list_new ();
@@ -147,9 +147,9 @@ get_layout (cairo_t *cr)
PangoAttribute *attr;
attr = pango_attr_shape_new_with_data (&ink_rect,
- &logical_rect,
- &GnomeFootLogo,
- NULL, NULL);
+ &logical_rect,
+ &GnomeFootLogo,
+ NULL, NULL);
attr->start_index = p - text;
attr->end_index = attr->start_index + strlen (BULLET);
@@ -157,7 +157,7 @@ get_layout (cairo_t *cr)
pango_attr_list_insert (attrs, attr);
}
- pango_layout_set_attributes (layout, attrs);
+ pango_simple_layout_set_attributes (layout, attrs);
pango_attr_list_unref (attrs);
return layout;
@@ -166,22 +166,24 @@ get_layout (cairo_t *cr)
static void
draw_text (cairo_t *cr, int *width, int *height)
{
-
- PangoLayout *layout = get_layout (cr);
+ PangoSimpleLayout *layout = get_layout (cr);
+ PangoLines *lines = pango_simple_layout_get_lines (layout);
/* Adds a fixed 10-pixel margin on the sides. */
if (width || height)
{
- pango_layout_get_pixel_size (layout, width, height);
+ PangoRectangle ext;
+ pango_lines_get_extents (lines, NULL, &ext);
+ pango_extents_to_pixels (&ext, NULL);
if (width)
- *width += 20;
+ *width = ext.width + 20;
if (height)
- *height += 20;
+ *height = ext.height + 20;
}
cairo_move_to (cr, 10, 10);
- pango_cairo_show_layout (cr, layout);
+ pango_cairo_show_lines (cr, lines);
g_object_unref (layout);
}
@@ -205,7 +207,7 @@ int main (int argc, char **argv)
/* First create and use a 0x0 surface, to measure how large
* the final surface needs to be */
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- 0, 0);
+ 0, 0);
cr = cairo_create (surface);
draw_text (cr, &width, &height);
cairo_destroy (cr);
@@ -213,7 +215,7 @@ int main (int argc, char **argv)
/* Now create the final surface and draw to it. */
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- width, height);
+ width, height);
cr = cairo_create (surface);
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
diff --git a/examples/cairosimple.c b/examples/cairosimple.c
index 881bac56..3d7a5428 100644
--- a/examples/cairosimple.c
+++ b/examples/cairosimple.c
@@ -17,7 +17,8 @@ draw_text (cairo_t *cr)
*/
#define TWEAKABLE_SCALE ((double) 0.1)
- PangoLayout *layout;
+ PangoSimpleLayout *layout;
+ PangoLines *lines;
PangoFontDescription *desc;
int i;
@@ -25,23 +26,23 @@ draw_text (cairo_t *cr)
*/
cairo_translate (cr, RADIUS / TWEAKABLE_SCALE, RADIUS / TWEAKABLE_SCALE);
- /* Create a PangoLayout, set the font and text */
- layout = pango_cairo_create_layout (cr);
+ /* Create a PangoSimpleLayout, set the font and text */
+ layout = pango_cairo_create_simple_layout (cr);
- pango_layout_set_text (layout, "Test\nسَلام", -1);
+ pango_simple_layout_set_text (layout, "Test\nسَلام", -1);
desc = pango_font_description_from_string (FONT_WITH_MANUAL_SIZE);
- pango_font_description_set_absolute_size(desc, FONT_SIZE * DEVICE_DPI * PANGO_SCALE / (72.0 * TWEAKABLE_SCALE));
+ pango_font_description_set_absolute_size (desc, FONT_SIZE * DEVICE_DPI * PANGO_SCALE / (72.0 * TWEAKABLE_SCALE));
//pango_font_description_set_size(desc, 27 * PANGO_SCALE / TWEAKABLE_SCALE);
printf("PANGO_SCALE = %d\n", PANGO_SCALE);
- pango_layout_set_font_description (layout, desc);
+ pango_simple_layout_set_font_description (layout, desc);
pango_font_description_free (desc);
/* Draw the layout N_WORDS times in a circle */
for (i = 0; i < N_WORDS; i++)
{
- int width, height;
+ PangoRectangle ext;
double angle = (360. * i) / N_WORDS;
double red;
@@ -54,11 +55,13 @@ draw_text (cairo_t *cr)
cairo_rotate (cr, angle * G_PI / 180.);
/* Inform Pango to re-layout the text with the new transformation */
- pango_cairo_update_layout (cr, layout);
+ pango_cairo_update_simple_layout (cr, layout);
- pango_layout_get_size (layout, &width, &height);
- cairo_move_to (cr,( - (((double)width) / PANGO_SCALE) / 2.0) , (- RADIUS) / TWEAKABLE_SCALE);
- pango_cairo_show_layout (cr, layout);
+ lines = pango_simple_layout_get_lines (layout);
+
+ pango_lines_get_extents (lines, NULL, &ext);
+ cairo_move_to (cr,( - (((double)ext.width) / PANGO_SCALE) / 2.0) , (- RADIUS) / TWEAKABLE_SCALE);
+ pango_cairo_show_lines (cr, lines);
cairo_restore (cr);
}
diff --git a/examples/cairotwisted.c b/examples/cairotwisted.c
index f769bb29..206b7c8f 100644
--- a/examples/cairotwisted.c
+++ b/examples/cairotwisted.c
@@ -43,17 +43,17 @@ _fancy_cairo_stroke (cairo_t *cr, cairo_bool_t preserve)
switch (data->header.type) {
case CAIRO_PATH_MOVE_TO:
case CAIRO_PATH_LINE_TO:
- cairo_move_to (cr, data[1].point.x, data[1].point.y);
- break;
+ cairo_move_to (cr, data[1].point.x, data[1].point.y);
+ break;
case CAIRO_PATH_CURVE_TO:
- cairo_line_to (cr, data[1].point.x, data[1].point.y);
- cairo_move_to (cr, data[2].point.x, data[2].point.y);
- cairo_line_to (cr, data[3].point.x, data[3].point.y);
- break;
+ cairo_line_to (cr, data[1].point.x, data[1].point.y);
+ cairo_move_to (cr, data[2].point.x, data[2].point.y);
+ cairo_line_to (cr, data[3].point.x, data[3].point.y);
+ break;
case CAIRO_PATH_CLOSE_PATH:
- break;
+ break;
default:
- g_assert_not_reached ();
+ g_assert_not_reached ();
}
}
cairo_stroke (cr);
@@ -66,25 +66,25 @@ _fancy_cairo_stroke (cairo_t *cr, cairo_bool_t preserve)
data = &path->data[i];
switch (data->header.type) {
case CAIRO_PATH_MOVE_TO:
- cairo_move_to (cr, data[1].point.x, data[1].point.y);
- break;
+ cairo_move_to (cr, data[1].point.x, data[1].point.y);
+ break;
case CAIRO_PATH_LINE_TO:
- cairo_rel_line_to (cr, 0, 0);
- cairo_move_to (cr, data[1].point.x, data[1].point.y);
- break;
+ cairo_rel_line_to (cr, 0, 0);
+ cairo_move_to (cr, data[1].point.x, data[1].point.y);
+ break;
case CAIRO_PATH_CURVE_TO:
- cairo_rel_line_to (cr, 0, 0);
- cairo_move_to (cr, data[1].point.x, data[1].point.y);
- cairo_rel_line_to (cr, 0, 0);
- cairo_move_to (cr, data[2].point.x, data[2].point.y);
- cairo_rel_line_to (cr, 0, 0);
- cairo_move_to (cr, data[3].point.x, data[3].point.y);
- break;
+ cairo_rel_line_to (cr, 0, 0);
+ cairo_move_to (cr, data[1].point.x, data[1].point.y);
+ cairo_rel_line_to (cr, 0, 0);
+ cairo_move_to (cr, data[2].point.x, data[2].point.y);
+ cairo_rel_line_to (cr, 0, 0);
+ cairo_move_to (cr, data[3].point.x, data[3].point.y);
+ break;
case CAIRO_PATH_CLOSE_PATH:
- cairo_rel_line_to (cr, 0, 0);
- break;
+ cairo_rel_line_to (cr, 0, 0);
+ break;
default:
- g_assert_not_reached ();
+ g_assert_not_reached ();
}
}
cairo_rel_line_to (cr, 0, 0);
@@ -95,21 +95,21 @@ _fancy_cairo_stroke (cairo_t *cr, cairo_bool_t preserve)
data = &path->data[i];
switch (data->header.type) {
case CAIRO_PATH_MOVE_TO:
- cairo_move_to (cr, data[1].point.x, data[1].point.y);
- break;
+ cairo_move_to (cr, data[1].point.x, data[1].point.y);
+ break;
case CAIRO_PATH_LINE_TO:
- cairo_line_to (cr, data[1].point.x, data[1].point.y);
- break;
+ cairo_line_to (cr, data[1].point.x, data[1].point.y);
+ break;
case CAIRO_PATH_CURVE_TO:
- cairo_curve_to (cr, data[1].point.x, data[1].point.y,
- data[2].point.x, data[2].point.y,
- data[3].point.x, data[3].point.y);
- break;
+ cairo_curve_to (cr, data[1].point.x, data[1].point.y,
+ data[2].point.x, data[2].point.y,
+ data[3].point.x, data[3].point.y);
+ break;
case CAIRO_PATH_CLOSE_PATH:
- cairo_close_path (cr);
- break;
+ cairo_close_path (cr);
+ break;
default:
- g_assert_not_reached ();
+ g_assert_not_reached ();
}
}
cairo_stroke (cr);
@@ -160,9 +160,9 @@ two_points_distance (cairo_path_data_t *a, cairo_path_data_t *b)
*/
static double
curve_length (double x0, double y0,
- double x1, double y1,
- double x2, double y2,
- double x3, double y3)
+ double x1, double y1,
+ double x2, double y2,
+ double x3, double y3)
{
cairo_surface_t *surface;
cairo_t *cr;
@@ -185,18 +185,18 @@ curve_length (double x0, double y0,
switch (data->header.type) {
case CAIRO_PATH_MOVE_TO:
- current_point = data[1];
- break;
+ current_point = data[1];
+ break;
case CAIRO_PATH_LINE_TO:
- length += two_points_distance (&current_point, &data[1]);
- current_point = data[1];
- break;
+ length += two_points_distance (&current_point, &data[1]);
+ current_point = data[1];
+ break;
default:
case CAIRO_PATH_CURVE_TO:
case CAIRO_PATH_CLOSE_PATH:
- g_assert_not_reached ();
+ g_assert_not_reached ();
}
}
cairo_path_destroy (path);
@@ -228,32 +228,32 @@ parametrize_path (cairo_path_t *path)
parametrization[i] = 0.0;
switch (data->header.type) {
case CAIRO_PATH_MOVE_TO:
- last_move_to = data[1];
- current_point = data[1];
- break;
+ last_move_to = data[1];
+ current_point = data[1];
+ break;
case CAIRO_PATH_CLOSE_PATH:
- /* Make it look like it's a line_to to last_move_to */
- data = (&last_move_to) - 1;
+ /* Make it look like it's a line_to to last_move_to */
+ data = (&last_move_to) - 1;
G_GNUC_FALLTHROUGH;
case CAIRO_PATH_LINE_TO:
- parametrization[i] = two_points_distance (&current_point, &data[1]);
- current_point = data[1];
- break;
+ parametrization[i] = two_points_distance (&current_point, &data[1]);
+ current_point = data[1];
+ break;
case CAIRO_PATH_CURVE_TO:
- /* naive curve-length, treating bezier as three line segments:
- parametrization[i] = two_points_distance (&current_point, &data[1])
- + two_points_distance (&data[1], &data[2])
- + two_points_distance (&data[2], &data[3]);
- */
- parametrization[i] = curve_length (current_point.point.x, current_point.point.y,
- data[1].point.x, data[1].point.y,
- data[2].point.x, data[2].point.y,
- data[3].point.x, data[3].point.y);
-
- current_point = data[3];
- break;
+ /* naive curve-length, treating bezier as three line segments:
+ parametrization[i] = two_points_distance (&current_point, &data[1])
+ + two_points_distance (&data[1], &data[2])
+ + two_points_distance (&data[2], &data[3]);
+ */
+ parametrization[i] = curve_length (current_point.point.x, current_point.point.y,
+ data[1].point.x, data[1].point.y,
+ data[2].point.x, data[2].point.y,
+ data[3].point.x, data[3].point.y);
+
+ current_point = data[3];
+ break;
default:
- g_assert_not_reached ();
+ g_assert_not_reached ();
}
}
@@ -286,7 +286,7 @@ transform_path (cairo_path_t *path, transform_point_func_t f, void *closure)
case CAIRO_PATH_CLOSE_PATH:
break;
default:
- g_assert_not_reached ();
+ g_assert_not_reached ();
}
}
}
@@ -322,7 +322,7 @@ typedef struct {
*/
static void
point_on_path (parametrized_path_t *param,
- double *x, double *y)
+ double *x, double *y)
{
int i;
double ratio, the_y = *y, the_x = *x, dx, dy;
@@ -331,26 +331,26 @@ point_on_path (parametrized_path_t *param,
parametrization_t *parametrization = param->parametrization;
for (i=0; i + path->data[i].header.length < path->num_data &&
- (the_x > parametrization[i] ||
- path->data[i].header.type == CAIRO_PATH_MOVE_TO);
+ (the_x > parametrization[i] ||
+ path->data[i].header.type == CAIRO_PATH_MOVE_TO);
i += path->data[i].header.length) {
the_x -= parametrization[i];
data = &path->data[i];
switch (data->header.type) {
case CAIRO_PATH_MOVE_TO:
- current_point = data[1];
+ current_point = data[1];
last_move_to = data[1];
- break;
+ break;
case CAIRO_PATH_LINE_TO:
- current_point = data[1];
- break;
+ current_point = data[1];
+ break;
case CAIRO_PATH_CURVE_TO:
- current_point = data[3];
- break;
+ current_point = data[3];
+ break;
case CAIRO_PATH_CLOSE_PATH:
- break;
+ break;
default:
- g_assert_not_reached ();
+ g_assert_not_reached ();
}
}
data = &path->data[i];
@@ -365,74 +365,74 @@ point_on_path (parametrized_path_t *param,
G_GNUC_FALLTHROUGH;
case CAIRO_PATH_LINE_TO:
{
- ratio = the_x / parametrization[i];
- /* Line polynomial */
- *x = current_point.point.x * (1 - ratio) + data[1].point.x * ratio;
- *y = current_point.point.y * (1 - ratio) + data[1].point.y * ratio;
-
- /* Line gradient */
- dx = -(current_point.point.x - data[1].point.x);
- dy = -(current_point.point.y - data[1].point.y);
-
- /*optimization for: ratio = the_y / sqrt (dx * dx + dy * dy);*/
- ratio = the_y / parametrization[i];
- *x += -dy * ratio;
- *y += dx * ratio;
+ ratio = the_x / parametrization[i];
+ /* Line polynomial */
+ *x = current_point.point.x * (1 - ratio) + data[1].point.x * ratio;
+ *y = current_point.point.y * (1 - ratio) + data[1].point.y * ratio;
+
+ /* Line gradient */
+ dx = -(current_point.point.x - data[1].point.x);
+ dy = -(current_point.point.y - data[1].point.y);
+
+ /*optimization for: ratio = the_y / sqrt (dx * dx + dy * dy);*/
+ ratio = the_y / parametrization[i];
+ *x += -dy * ratio;
+ *y += dx * ratio;
}
break;
case CAIRO_PATH_CURVE_TO:
{
- /* FIXME the formulas here are not exactly what we want, because the
- * Bezier parametrization is not uniform. But I don't know how to do
- * better. The caller can do slightly better though, by flattening the
- * Bezier and avoiding this branch completely. That has its own cost
- * though, as large y values magnify the flattening error drastically.
- */
+ /* FIXME the formulas here are not exactly what we want, because the
+ * Bezier parametrization is not uniform. But I don't know how to do
+ * better. The caller can do slightly better though, by flattening the
+ * Bezier and avoiding this branch completely. That has its own cost
+ * though, as large y values magnify the flattening error drastically.
+ */
double ratio_1_0, ratio_0_1;
- double ratio_2_0, ratio_0_2;
- double ratio_3_0, ratio_2_1, ratio_1_2, ratio_0_3;
- double _1__4ratio_1_0_3ratio_2_0, _2ratio_1_0_3ratio_2_0;
-
- ratio = the_x / parametrization[i];
-
- ratio_1_0 = ratio;
- ratio_0_1 = 1 - ratio;
-
- ratio_2_0 = ratio_1_0 * ratio_1_0; /* ratio * ratio */
- ratio_0_2 = ratio_0_1 * ratio_0_1; /* (1 - ratio) * (1 - ratio) */
-
- ratio_3_0 = ratio_2_0 * ratio_1_0; /* ratio * ratio * ratio */
- ratio_2_1 = ratio_2_0 * ratio_0_1; /* ratio * ratio * (1 - ratio) */
- ratio_1_2 = ratio_1_0 * ratio_0_2; /* ratio * (1 - ratio) * (1 - ratio) */
- ratio_0_3 = ratio_0_1 * ratio_0_2; /* (1 - ratio) * (1 - ratio) * (1 - ratio) */
-
- _1__4ratio_1_0_3ratio_2_0 = 1 - 4 * ratio_1_0 + 3 * ratio_2_0;
- _2ratio_1_0_3ratio_2_0 = 2 * ratio_1_0 - 3 * ratio_2_0;
-
- /* Bezier polynomial */
- *x = current_point.point.x * ratio_0_3
- + 3 * data[1].point.x * ratio_1_2
- + 3 * data[2].point.x * ratio_2_1
- + data[3].point.x * ratio_3_0;
- *y = current_point.point.y * ratio_0_3
- + 3 * data[1].point.y * ratio_1_2
- + 3 * data[2].point.y * ratio_2_1
- + data[3].point.y * ratio_3_0;
-
- /* Bezier gradient */
- dx =-3 * current_point.point.x * ratio_0_2
- + 3 * data[1].point.x * _1__4ratio_1_0_3ratio_2_0
- + 3 * data[2].point.x * _2ratio_1_0_3ratio_2_0
- + 3 * data[3].point.x * ratio_2_0;
- dy =-3 * current_point.point.y * ratio_0_2
- + 3 * data[1].point.y * _1__4ratio_1_0_3ratio_2_0
- + 3 * data[2].point.y * _2ratio_1_0_3ratio_2_0
- + 3 * data[3].point.y * ratio_2_0;
-
- ratio = the_y / sqrt (dx * dx + dy * dy);
- *x += -dy * ratio;
- *y += dx * ratio;
+ double ratio_2_0, ratio_0_2;
+ double ratio_3_0, ratio_2_1, ratio_1_2, ratio_0_3;
+ double _1__4ratio_1_0_3ratio_2_0, _2ratio_1_0_3ratio_2_0;
+
+ ratio = the_x / parametrization[i];
+
+ ratio_1_0 = ratio;
+ ratio_0_1 = 1 - ratio;
+
+ ratio_2_0 = ratio_1_0 * ratio_1_0; /* ratio * ratio */
+ ratio_0_2 = ratio_0_1 * ratio_0_1; /* (1 - ratio) * (1 - ratio) */
+
+ ratio_3_0 = ratio_2_0 * ratio_1_0; /* ratio * ratio * ratio */
+ ratio_2_1 = ratio_2_0 * ratio_0_1; /* ratio * ratio * (1 - ratio) */
+ ratio_1_2 = ratio_1_0 * ratio_0_2; /* ratio * (1 - ratio) * (1 - ratio) */
+ ratio_0_3 = ratio_0_1 * ratio_0_2; /* (1 - ratio) * (1 - ratio) * (1 - ratio) */
+
+ _1__4ratio_1_0_3ratio_2_0 = 1 - 4 * ratio_1_0 + 3 * ratio_2_0;
+ _2ratio_1_0_3ratio_2_0 = 2 * ratio_1_0 - 3 * ratio_2_0;
+
+ /* Bezier polynomial */
+ *x = current_point.point.x * ratio_0_3
+ + 3 * data[1].point.x * ratio_1_2
+ + 3 * data[2].point.x * ratio_2_1
+ + data[3].point.x * ratio_3_0;
+ *y = current_point.point.y * ratio_0_3
+ + 3 * data[1].point.y * ratio_1_2
+ + 3 * data[2].point.y * ratio_2_1
+ + data[3].point.y * ratio_3_0;
+
+ /* Bezier gradient */
+ dx =-3 * current_point.point.x * ratio_0_2
+ + 3 * data[1].point.x * _1__4ratio_1_0_3ratio_2_0
+ + 3 * data[2].point.x * _2ratio_1_0_3ratio_2_0
+ + 3 * data[3].point.x * ratio_2_0;
+ dy =-3 * current_point.point.y * ratio_0_2
+ + 3 * data[1].point.y * _1__4ratio_1_0_3ratio_2_0
+ + 3 * data[2].point.y * _2ratio_1_0_3ratio_2_0
+ + 3 * data[3].point.y * ratio_2_0;
+
+ ratio = the_y / sqrt (dx * dx + dy * dy);
+ *x += -dy * ratio;
+ *y += dx * ratio;
}
break;
default:
@@ -454,7 +454,7 @@ map_path_onto (cairo_t *cr, cairo_path_t *path)
cairo_new_path (cr);
transform_path (current_path,
- (transform_point_func_t) point_on_path, &param);
+ (transform_point_func_t) point_on_path, &param);
cairo_append_path (cr, current_path);
@@ -467,13 +467,13 @@ typedef void (*draw_path_func_t) (cairo_t *cr);
static void
draw_text (cairo_t *cr,
- double x,
- double y,
- const char *font,
- const char *text)
+ double x,
+ double y,
+ const char *font,
+ const char *text)
{
- PangoLayout *layout;
- PangoLayoutLine *line;
+ PangoSimpleLayout *layout;
+ PangoLine *line;
PangoFontDescription *desc;
cairo_font_options_t *font_options;
@@ -485,31 +485,28 @@ draw_text (cairo_t *cr,
cairo_set_font_options (cr, font_options);
cairo_font_options_destroy (font_options);
- layout = pango_cairo_create_layout (cr);
+ layout = pango_cairo_create_simple_layout (cr);
desc = pango_font_description_from_string (font);
- pango_layout_set_font_description (layout, desc);
+ pango_simple_layout_set_font_description (layout, desc);
pango_font_description_free (desc);
- pango_layout_set_text (layout, text, -1);
+ pango_simple_layout_set_text (layout, text, -1);
- /* Use pango_layout_get_line() instead of pango_layout_get_line_readonly()
- * for older versions of pango
- */
- line = pango_layout_get_line_readonly (layout, 0);
+ line = pango_lines_get_line (pango_simple_layout_get_lines (layout), 0, NULL, NULL);
cairo_move_to (cr, x, y);
- pango_cairo_layout_line_path (cr, line);
+ pango_cairo_line_path (cr, line);
g_object_unref (layout);
}
static void
draw_twisted (cairo_t *cr,
- double x,
- double y,
- const char *font,
- const char *text)
+ double x,
+ double y,
+ const char *font,
+ const char *text)
{
cairo_path_t *path;
@@ -561,9 +558,9 @@ draw_dream (cairo_t *cr)
fancy_cairo_stroke_preserve (cr);
draw_twisted (cr,
- 0, 0,
- "Serif 72",
- "It was a dream... Oh Just a dream...");
+ 0, 0,
+ "Serif 72",
+ "It was a dream... Oh Just a dream...");
}
static void
@@ -580,9 +577,9 @@ draw_wow (cairo_t *cr)
fancy_cairo_stroke_preserve (cr);
draw_twisted (cr,
- -20, -150,
- "Serif 60",
- "WOW!");
+ -20, -150,
+ "Serif 60",
+ "WOW!");
}
int main (int argc, char **argv)
@@ -601,7 +598,7 @@ int main (int argc, char **argv)
filename = argv[1];
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- 1000, 800);
+ 1000, 800);
cr = cairo_create (surface);
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);