mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 09:58:12 +02:00
Add code to emit type1 dicts to the pdf backend.
This commit is contained in:
parent
c36de5b7c5
commit
466d3da4ef
3 changed files with 120 additions and 4 deletions
|
|
@ -1663,6 +1663,112 @@ _cairo_pdf_surface_write_pages (cairo_pdf_surface_t *surface)
|
|||
"endobj\r\n");
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_pdf_surface_emit_type1_font_subset (cairo_pdf_surface_t *surface,
|
||||
cairo_scaled_font_subset_t *font_subset)
|
||||
{
|
||||
cairo_pdf_resource_t stream, descriptor, subset_resource;
|
||||
cairo_status_t status;
|
||||
cairo_pdf_font_t font;
|
||||
cairo_type1_subset_t subset;
|
||||
unsigned long length, compressed_length;
|
||||
char *compressed;
|
||||
int i;
|
||||
|
||||
status = _cairo_type1_subset_init (&subset, font_subset);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
/* We ignore the zero-trailer and set Length3 to 0. */
|
||||
length = subset.header_length + subset.data_length;
|
||||
compressed = compress_dup (subset.data, length, &compressed_length);
|
||||
if (compressed == NULL) {
|
||||
_cairo_type1_subset_fini (&subset);
|
||||
return CAIRO_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
stream = _cairo_pdf_surface_new_object (surface);
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"%d 0 obj\r\n"
|
||||
"<< /Filter /FlateDecode\r\n"
|
||||
" /Length %lu\r\n"
|
||||
" /Length1 %lu\r\n"
|
||||
" /Length2 %lu\r\n"
|
||||
" /Length3 0\r\n"
|
||||
">>\r\n"
|
||||
"stream\r\n",
|
||||
stream.id,
|
||||
compressed_length,
|
||||
subset.header_length,
|
||||
subset.data_length);
|
||||
_cairo_output_stream_write (surface->output, compressed, compressed_length);
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"\r\n"
|
||||
"endstream\r\n"
|
||||
"endobj\r\n");
|
||||
free (compressed);
|
||||
|
||||
descriptor = _cairo_pdf_surface_new_object (surface);
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"%d 0 obj\r\n"
|
||||
"<< /Type /FontDescriptor\r\n"
|
||||
" /FontName /%s\r\n"
|
||||
" /Flags 4\r\n"
|
||||
" /FontBBox [ %ld %ld %ld %ld ]\r\n"
|
||||
" /ItalicAngle 0\r\n"
|
||||
" /Ascent %ld\r\n"
|
||||
" /Descent %ld\r\n"
|
||||
" /CapHeight 500\r\n"
|
||||
" /StemV 80\r\n"
|
||||
" /StemH 80\r\n"
|
||||
" /FontFile %u 0 R\r\n"
|
||||
">>\r\n"
|
||||
"endobj\r\n",
|
||||
descriptor.id,
|
||||
subset.base_font,
|
||||
subset.x_min,
|
||||
subset.y_min,
|
||||
subset.x_max,
|
||||
subset.y_max,
|
||||
subset.ascent,
|
||||
subset.descent,
|
||||
stream.id);
|
||||
|
||||
subset_resource = _cairo_pdf_surface_new_object (surface);
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"%d 0 obj\r\n"
|
||||
"<< /Type /Font\r\n"
|
||||
" /Subtype /Type1\r\n"
|
||||
" /BaseFont /%s\r\n"
|
||||
" /FirstChar 0\r\n"
|
||||
" /LastChar %d\r\n"
|
||||
" /FontDescriptor %d 0 R\r\n"
|
||||
" /Widths [",
|
||||
subset_resource.id,
|
||||
subset.base_font,
|
||||
font_subset->num_glyphs,
|
||||
descriptor.id);
|
||||
|
||||
for (i = 0; i < font_subset->num_glyphs; i++)
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
" %d",
|
||||
subset.widths[i]);
|
||||
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
" ]\r\n"
|
||||
">>\r\n"
|
||||
"endobj\r\n");
|
||||
|
||||
font.font_id = font_subset->font_id;
|
||||
font.subset_id = font_subset->subset_id;
|
||||
font.subset_resource = subset_resource;
|
||||
_cairo_array_append (&surface->fonts, &font);
|
||||
|
||||
_cairo_type1_subset_fini (&subset);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_pdf_surface_emit_truetype_font_subset (cairo_pdf_surface_t *surface,
|
||||
cairo_scaled_font_subset_t *font_subset)
|
||||
|
|
@ -1919,6 +2025,10 @@ _cairo_pdf_surface_emit_font_subset (cairo_scaled_font_subset_t *font_subset,
|
|||
cairo_pdf_surface_t *surface = closure;
|
||||
cairo_status_t status;
|
||||
|
||||
status = _cairo_pdf_surface_emit_type1_font_subset (surface, font_subset);
|
||||
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
||||
return;
|
||||
|
||||
status = _cairo_pdf_surface_emit_truetype_font_subset (surface, font_subset);
|
||||
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -228,7 +228,9 @@ typedef struct _cairo_type1_subset {
|
|||
long x_min, y_min, x_max, y_max;
|
||||
long ascent, descent;
|
||||
char *data;
|
||||
unsigned long header_length;
|
||||
unsigned long data_length;
|
||||
unsigned long trailer_length;
|
||||
} cairo_type1_subset_t;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -978,8 +978,8 @@ _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset,
|
|||
if (status)
|
||||
return status;
|
||||
|
||||
for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) {
|
||||
parent_glyph = font->scaled_font_subset->glyphs[i];
|
||||
for (i = 0; i < scaled_font_subset->num_glyphs; i++) {
|
||||
parent_glyph = scaled_font_subset->glyphs[i];
|
||||
cairo_type1_font_subset_use_glyph (font, parent_glyph);
|
||||
}
|
||||
|
||||
|
|
@ -1004,14 +1004,18 @@ _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset,
|
|||
type1_subset->ascent = font->base.ascent;
|
||||
type1_subset->descent = font->base.descent;
|
||||
|
||||
length = font->contents.num_elements;
|
||||
length = font->base.header_size + font->base.data_size +
|
||||
font->base.trailer_size;
|
||||
type1_subset->data = malloc (length);
|
||||
if (type1_subset->data == NULL)
|
||||
goto fail3;
|
||||
|
||||
memcpy (type1_subset->data,
|
||||
_cairo_array_index (&font->contents, 0), length);
|
||||
type1_subset->data_length = length;
|
||||
|
||||
type1_subset->header_length = font->base.header_size;
|
||||
type1_subset->data_length = font->base.data_size;
|
||||
type1_subset->trailer_length = font->base.trailer_size;
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue