summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2008-09-11 08:41:39 +0930
committerAdrian Johnson <ajohnson@redneon.com>2008-09-11 08:41:39 +0930
commitb56075ee51aaf570f85c1d59513e5e5116ae2b06 (patch)
tree3910ce55edf225467e3005e6ff951a4838b8285b
parentc3663324fd417a281e9cd872aa1d60101ff4602b (diff)
Enable show_glyphs inside of in user-font glyphs
-rw-r--r--src/cairo-pdf-surface.c24
-rw-r--r--src/cairo-ps-surface.c7
-rw-r--r--src/cairo-type3-glyph-surface-private.h8
-rw-r--r--src/cairo-type3-glyph-surface.c53
4 files changed, 81 insertions, 11 deletions
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c
index b783b53c..96e4479c 100644
--- a/src/cairo-pdf-surface.c
+++ b/src/cairo-pdf-surface.c
@@ -3484,13 +3484,21 @@ static cairo_status_t
_cairo_pdf_surface_analyze_user_font_subset (cairo_scaled_font_subset_t *font_subset,
void *closure)
{
+ cairo_pdf_surface_t *surface = closure;
cairo_status_t status = CAIRO_STATUS_SUCCESS;
unsigned int i;
cairo_surface_t *type3_surface;
+ cairo_output_stream_t *null_stream;
+ null_stream = _cairo_null_stream_create ();
type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font,
- NULL,
- _cairo_pdf_emit_imagemask);
+ null_stream,
+ _cairo_pdf_emit_imagemask,
+ surface->font_subsets);
+ _cairo_type3_glyph_surface_set_font_subsets_callback (type3_surface,
+ _cairo_pdf_surface_add_font,
+ surface);
+
for (i = 1; i < font_subset->num_glyphs; i++) {
status = _cairo_type3_glyph_surface_analyze_glyph (type3_surface,
font_subset->glyphs[i]);
@@ -3498,6 +3506,7 @@ _cairo_pdf_surface_analyze_user_font_subset (cairo_scaled_font_subset_t *font_su
break;
}
cairo_surface_destroy (type3_surface);
+ status = _cairo_output_stream_destroy (null_stream);
return status;
}
@@ -3534,9 +3543,14 @@ _cairo_pdf_surface_emit_type3_font_subset (cairo_pdf_surface_t *surface,
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
}
+ _cairo_pdf_group_resources_clear (&surface->resources);
type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font,
NULL,
- _cairo_pdf_emit_imagemask);
+ _cairo_pdf_emit_imagemask,
+ surface->font_subsets);
+ _cairo_type3_glyph_surface_set_font_subsets_callback (type3_surface,
+ _cairo_pdf_surface_add_font,
+ surface);
for (i = 0; i < font_subset->num_glyphs; i++) {
status = _cairo_pdf_surface_open_stream (surface,
@@ -3664,6 +3678,10 @@ _cairo_pdf_surface_emit_type3_font_subset (cairo_pdf_surface_t *surface,
"]\n");
free (widths);
+ _cairo_output_stream_printf (surface->output,
+ " /Resources\n");
+ _cairo_pdf_surface_emit_group_resources (surface, &surface->resources);
+
if (to_unicode_stream.id != 0)
_cairo_output_stream_printf (surface->output,
" /ToUnicode %d 0 R\n",
diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c
index ba6e3f8a..3831f80b 100644
--- a/src/cairo-ps-surface.c
+++ b/src/cairo-ps-surface.c
@@ -445,13 +445,15 @@ static cairo_status_t
_cairo_ps_surface_analyze_user_font_subset (cairo_scaled_font_subset_t *font_subset,
void *closure)
{
+ cairo_ps_surface_t *surface = closure;
cairo_status_t status = CAIRO_STATUS_SUCCESS;
unsigned int i;
cairo_surface_t *type3_surface;
type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font,
NULL,
- _cairo_ps_emit_imagemask);
+ _cairo_ps_emit_imagemask,
+ surface->font_subsets);
for (i = 1; i < font_subset->num_glyphs; i++) {
status = _cairo_type3_glyph_surface_analyze_glyph (type3_surface,
@@ -492,7 +494,8 @@ _cairo_ps_surface_emit_type3_font_subset (cairo_ps_surface_t *surface,
type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font,
NULL,
- _cairo_ps_emit_imagemask);
+ _cairo_ps_emit_imagemask,
+ surface->font_subsets);
for (i = 1; i < font_subset->num_glyphs; i++) {
if (font_subset->glyph_names != NULL) {
diff --git a/src/cairo-type3-glyph-surface-private.h b/src/cairo-type3-glyph-surface-private.h
index 18538970..9dd6e857 100644
--- a/src/cairo-type3-glyph-surface-private.h
+++ b/src/cairo-type3-glyph-surface-private.h
@@ -60,7 +60,13 @@ typedef struct cairo_type3_glyph_surface {
cairo_private cairo_surface_t *
_cairo_type3_glyph_surface_create (cairo_scaled_font_t *scaled_font,
cairo_output_stream_t *stream,
- cairo_type3_glyph_surface_emit_image_t emit_image);
+ cairo_type3_glyph_surface_emit_image_t emit_image,
+ cairo_scaled_font_subsets_t *font_subsets);
+
+cairo_private void
+_cairo_type3_glyph_surface_set_font_subsets_callback (void *abstract_surface,
+ cairo_pdf_operators_use_font_subset_t use_font_subset,
+ void *closure);
cairo_private cairo_status_t
_cairo_type3_glyph_surface_analyze_glyph (void *abstract_surface,
diff --git a/src/cairo-type3-glyph-surface.c b/src/cairo-type3-glyph-surface.c
index aa2fda82..a7476a37 100644
--- a/src/cairo-type3-glyph-surface.c
+++ b/src/cairo-type3-glyph-surface.c
@@ -48,7 +48,8 @@ static const cairo_surface_backend_t cairo_type3_glyph_surface_backend;
cairo_surface_t *
_cairo_type3_glyph_surface_create (cairo_scaled_font_t *scaled_font,
cairo_output_stream_t *stream,
- cairo_type3_glyph_surface_emit_image_t emit_image)
+ cairo_type3_glyph_surface_emit_image_t emit_image,
+ cairo_scaled_font_subsets_t *font_subsets)
{
cairo_type3_glyph_surface_t *surface;
cairo_matrix_t invert_y_axis;
@@ -75,7 +76,7 @@ _cairo_type3_glyph_surface_create (cairo_scaled_font_t *scaled_font,
_cairo_pdf_operators_init (&surface->pdf_operators,
surface->stream,
&surface->cairo_to_pdf,
- NULL);
+ font_subsets);
return &surface->base;
}
@@ -264,10 +265,31 @@ _cairo_type3_glyph_surface_show_glyphs (void *abstract_surface,
cairo_scaled_font_t *scaled_font,
int *remaining_glyphs)
{
- /* XXX: Some refactoring is required before we can add font
- * subsets in the middle of emitting all the subsets. */
+ cairo_type3_glyph_surface_t *surface = abstract_surface;
+ cairo_int_status_t status;
+ cairo_scaled_font_t *font;
+ cairo_matrix_t ctm;
+ int i;
+
+ for (i = 0; i < num_glyphs; i++)
+ cairo_matrix_transform_point (&surface->cairo_to_pdf, &glyphs[i].x, &glyphs[i].y);
+
+ cairo_matrix_multiply (&ctm, &scaled_font->ctm, &scaled_font->scale_inverse);
+ font = cairo_scaled_font_create (scaled_font->font_face,
+ &scaled_font->font_matrix,
+ &ctm,
+ &scaled_font->options);
+
+ status = _cairo_pdf_operators_show_text_glyphs (&surface->pdf_operators,
+ NULL, 0,
+ glyphs, num_glyphs,
+ NULL, 0,
+ FALSE,
+ font);
- return CAIRO_INT_STATUS_IMAGE_FALLBACK;
+ cairo_scaled_font_destroy (font);
+
+ return status;
}
static const cairo_surface_backend_t cairo_type3_glyph_surface_backend = {
@@ -349,6 +371,18 @@ _cairo_type3_glyph_surface_emit_fallback_image (cairo_type3_glyph_surface_t *sur
return _cairo_type3_glyph_surface_emit_image (surface, image, &mat);
}
+void
+_cairo_type3_glyph_surface_set_font_subsets_callback (void *abstract_surface,
+ cairo_pdf_operators_use_font_subset_t use_font_subset,
+ void *closure)
+{
+ cairo_type3_glyph_surface_t *surface = abstract_surface;
+
+ _cairo_pdf_operators_set_font_subsets_callback (&surface->pdf_operators,
+ use_font_subset,
+ closure);
+}
+
cairo_status_t
_cairo_type3_glyph_surface_analyze_glyph (void *abstract_surface,
unsigned long glyph_index)
@@ -376,6 +410,10 @@ _cairo_type3_glyph_surface_analyze_glyph (void *abstract_surface,
status = _cairo_meta_surface_replay (scaled_glyph->meta_surface,
&surface->base);
+ status = _cairo_pdf_operators_flush (&surface->pdf_operators);
+ if (status)
+ return status;
+
if (status == CAIRO_INT_STATUS_IMAGE_FALLBACK)
status = CAIRO_STATUS_SUCCESS;
@@ -469,6 +507,11 @@ _cairo_type3_glyph_surface_emit_glyph (void *abstract_surface,
_cairo_output_stream_printf (surface->stream, "q\n");
status = _cairo_meta_surface_replay (scaled_glyph->meta_surface,
&surface->base);
+
+ status = _cairo_pdf_operators_flush (&surface->pdf_operators);
+ if (status)
+ return status;
+
_cairo_output_stream_printf (surface->stream, "Q\n");
_cairo_type3_glyph_surface_set_stream (surface, stream);