diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2008-09-11 08:41:39 +0930 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2008-09-11 08:41:39 +0930 |
commit | b56075ee51aaf570f85c1d59513e5e5116ae2b06 (patch) | |
tree | 3910ce55edf225467e3005e6ff951a4838b8285b | |
parent | c3663324fd417a281e9cd872aa1d60101ff4602b (diff) |
Enable show_glyphs inside of in user-font glyphs
-rw-r--r-- | src/cairo-pdf-surface.c | 24 | ||||
-rw-r--r-- | src/cairo-ps-surface.c | 7 | ||||
-rw-r--r-- | src/cairo-type3-glyph-surface-private.h | 8 | ||||
-rw-r--r-- | src/cairo-type3-glyph-surface.c | 53 |
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); |