summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cairo-pdf-operators-private.h1
-rw-r--r--src/cairo-pdf-operators.c27
-rw-r--r--src/cairo-pdf-surface.c10
3 files changed, 34 insertions, 4 deletions
diff --git a/src/cairo-pdf-operators-private.h b/src/cairo-pdf-operators-private.h
index 87075915..3486d13a 100644
--- a/src/cairo-pdf-operators-private.h
+++ b/src/cairo-pdf-operators-private.h
@@ -55,6 +55,7 @@ typedef struct _cairo_pdf_operators {
cairo_scaled_font_subsets_t *font_subsets;
cairo_pdf_operators_use_font_subset_t use_font_subset;
void *use_font_subset_closure;
+ cairo_bool_t in_text;
} cairo_pdf_operators_t;
cairo_private void
diff --git a/src/cairo-pdf-operators.c b/src/cairo-pdf-operators.c
index 84363f5e..d4b9a3ce 100644
--- a/src/cairo-pdf-operators.c
+++ b/src/cairo-pdf-operators.c
@@ -47,6 +47,10 @@
#include <ctype.h>
+static cairo_int_status_t
+_cairo_pdf_operators_end_text (cairo_pdf_operators_t *pdf_operators);
+
+
void
_cairo_pdf_operators_init (cairo_pdf_operators_t *pdf_operators,
cairo_output_stream_t *stream,
@@ -58,6 +62,7 @@ _cairo_pdf_operators_init (cairo_pdf_operators_t *pdf_operators,
pdf_operators->font_subsets = font_subsets;
pdf_operators->use_font_subset = NULL;
pdf_operators->use_font_subset_closure = NULL;
+ pdf_operators->in_text = FALSE;
}
cairo_status_t
@@ -107,6 +112,9 @@ _cairo_pdf_operators_set_cairo_to_pdf_matrix (cairo_pdf_operators_t *pdf_operato
cairo_int_status_t
_cairo_pdf_operators_flush (cairo_pdf_operators_t *pdf_operators)
{
+ if (pdf_operators->in_text)
+ _cairo_pdf_operators_end_text (pdf_operators);
+
return CAIRO_STATUS_SUCCESS;
}
@@ -793,6 +801,16 @@ _cairo_pdf_operators_fill_stroke (cairo_pdf_operators_t *pdf_operators,
operator);
}
+static cairo_int_status_t
+_cairo_pdf_operators_end_text (cairo_pdf_operators_t *pdf_operators)
+{
+ _cairo_output_stream_printf (pdf_operators->stream, "\nET\n");
+
+ pdf_operators->in_text = FALSE;
+
+ return _cairo_output_stream_get_status (pdf_operators->stream);
+}
+
#define GLYPH_POSITION_TOLERANCE 0.001
cairo_int_status_t
@@ -818,8 +836,10 @@ _cairo_pdf_operators_show_glyphs (cairo_pdf_operators_t *pdf_operators,
if (status)
return _cairo_output_stream_destroy (word_wrap_stream);
- _cairo_output_stream_printf (word_wrap_stream,
- "BT\n");
+ if (pdf_operators->in_text == FALSE) {
+ _cairo_output_stream_printf (word_wrap_stream,
+ "BT\n");
+ }
if (scaled_font->scale.xy == 0.0 &&
scaled_font->scale.yx == 0.0)
@@ -988,8 +1008,7 @@ _cairo_pdf_operators_show_glyphs (cairo_pdf_operators_t *pdf_operators,
}
}
- _cairo_output_stream_printf (word_wrap_stream,
- "ET\n");
+ pdf_operators->in_text = TRUE;
status = _cairo_output_stream_destroy (word_wrap_stream);
if (status)
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c
index c36cd655..ddabc030 100644
--- a/src/cairo-pdf-surface.c
+++ b/src/cairo-pdf-surface.c
@@ -4799,6 +4799,16 @@ _cairo_pdf_surface_show_glyphs (void *abstract_surface,
if (status)
return status;
+ /* Each call to show_glyphs() with a transclucent pattern must
+ * be in a separate text object otherwise overlapping text
+ * from separate calls to show_glyphs will not composite with
+ * each other. */
+ if (! _cairo_pattern_is_opaque (source)) {
+ status = _cairo_pdf_operators_flush (&surface->pdf_operators);
+ if (status)
+ return status;
+ }
+
status = _cairo_pdf_operators_show_glyphs (&surface->pdf_operators,
glyphs,
num_glyphs,