mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-04 22:18:29 +02:00
Enable show_glyphs inside of in user-font glyphs
This commit is contained in:
parent
c3663324fd
commit
b56075ee51
4 changed files with 81 additions and 11 deletions
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
return CAIRO_INT_STATUS_IMAGE_FALLBACK;
|
||||
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);
|
||||
|
||||
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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue