Merge branch 'master' into color-font-foreground-color
|
|
@ -8,7 +8,7 @@ include:
|
|||
variables:
|
||||
FDO_UPSTREAM_REPO: 'cairo/cairo'
|
||||
FDO_DISTRIBUTION_VERSION: '34'
|
||||
FDO_DISTRIBUTION_TAG: '2021-07-31.0'
|
||||
FDO_DISTRIBUTION_TAG: '2021-08-26.0'
|
||||
|
||||
# TODO: should probably get its own image at some point instead of reusing the GStreamer one.
|
||||
WINDOWS_IMAGE: "registry.freedesktop.org/gstreamer/gst-ci/amd64/windows:v16-master"
|
||||
|
|
@ -62,7 +62,7 @@ fedora image:
|
|||
gcc
|
||||
g++
|
||||
zlib-devel
|
||||
expat
|
||||
expat-devel
|
||||
libpng-devel
|
||||
fontconfig-devel
|
||||
freetype-devel
|
||||
|
|
|
|||
|
|
@ -82,11 +82,8 @@ EXTRA_DIST += \
|
|||
subprojects/fontconfig.wrap \
|
||||
subprojects/freetype2.wrap \
|
||||
subprojects/glib.wrap \
|
||||
subprojects/gperf.wrap \
|
||||
subprojects/libffi.wrap \
|
||||
subprojects/libpng.wrap \
|
||||
subprojects/pixman.wrap \
|
||||
subprojects/proxy-libintl.wrap \
|
||||
subprojects/zlib.wrap \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
|||
|
|
@ -74,8 +74,13 @@
|
|||
#endif
|
||||
|
||||
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
|
||||
#define CAIRO_BOILERPLATE_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
#ifdef __MINGW32__
|
||||
#define CAIRO_BOILERPLATE_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
__attribute__((__format__(__MINGW_PRINTF_FORMAT, fmt_index, va_index)))
|
||||
#else
|
||||
#define CAIRO_BOILERPLATE_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
__attribute__((__format__(__printf__, fmt_index, va_index)))
|
||||
#endif
|
||||
#else
|
||||
#define CAIRO_BOILERPLATE_PRINTF_FORMAT(fmt_index, va_index)
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ cairo_pdf_version_to_string
|
|||
cairo_pdf_surface_set_size
|
||||
cairo_pdf_surface_add_outline
|
||||
cairo_pdf_surface_set_metadata
|
||||
cairo_pdf_surface_set_custom_metadata
|
||||
cairo_pdf_surface_set_page_label
|
||||
cairo_pdf_surface_set_thumbnail_size
|
||||
</SECTION>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
project('cairo', 'c', 'cpp',
|
||||
meson_version: '>= 0.54.0',
|
||||
meson_version: '>= 0.56.0',
|
||||
version: run_command(find_program('version.py'), check: true).stdout().strip(),
|
||||
default_options: ['warning_level=2'],
|
||||
)
|
||||
|
|
@ -964,7 +964,7 @@ subdir('src')
|
|||
if feature_conf.get('CAIRO_HAS_PNG_FUNCTIONS', 0) == 1
|
||||
subdir('boilerplate')
|
||||
else
|
||||
cairoboilerplate_dep = dependency()
|
||||
cairoboilerplate_dep = dependency('', required: false)
|
||||
endif
|
||||
|
||||
subdir('util')
|
||||
|
|
|
|||
|
|
@ -107,8 +107,13 @@
|
|||
#endif
|
||||
|
||||
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
#ifdef __MINGW32__
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
__attribute__((__format__(__MINGW_PRINTF_FORMAT, fmt_index, va_index)))
|
||||
#else
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
__attribute__((__format__(__printf__, fmt_index, va_index)))
|
||||
#endif
|
||||
#else
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index)
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -473,20 +473,6 @@ _cairo_composite_rectangles_init_for_glyphs (cairo_composite_rectangles_t *exten
|
|||
return CAIRO_INT_STATUS_NOTHING_TO_DO;
|
||||
}
|
||||
|
||||
/* Computing the exact bbox and the overlap is expensive.
|
||||
* First perform a cheap test to see if the glyphs are all clipped out.
|
||||
*/
|
||||
if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK &&
|
||||
_cairo_scaled_font_glyph_approximate_extents (scaled_font,
|
||||
glyphs, num_glyphs,
|
||||
&extents->mask))
|
||||
{
|
||||
if (! _cairo_rectangle_intersect (&extents->bounded, &extents->mask)) {
|
||||
_cairo_composite_rectangles_fini(extents);
|
||||
return CAIRO_INT_STATUS_NOTHING_TO_DO;
|
||||
}
|
||||
}
|
||||
|
||||
status = _cairo_scaled_font_glyph_device_extents (scaled_font,
|
||||
glyphs, num_glyphs,
|
||||
&extents->mask,
|
||||
|
|
|
|||
|
|
@ -93,6 +93,11 @@
|
|||
#define FT_LCD_FILTER_LEGACY 16
|
||||
#endif
|
||||
|
||||
/* FreeType version older than 2.11 does not have the FT_RENDER_MODE_SDF enum value in FT_Render_Mode */
|
||||
#if FREETYPE_MAJOR > 2 || (FREETYPE_MAJOR == 2 && FREETYPE_MINOR >= 11)
|
||||
#define HAVE_FT_RENDER_MODE_SDF 1
|
||||
#endif
|
||||
|
||||
#define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0)
|
||||
#define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0))
|
||||
#define DOUBLE_FROM_16_16(t) ((double)(t) / 65536.0)
|
||||
|
|
@ -1498,6 +1503,9 @@ _render_glyph_outline (FT_Face face,
|
|||
case FT_RENDER_MODE_LIGHT:
|
||||
case FT_RENDER_MODE_NORMAL:
|
||||
case FT_RENDER_MODE_MAX:
|
||||
#if HAVE_FT_RENDER_MODE_SDF
|
||||
case FT_RENDER_MODE_SDF:
|
||||
#endif
|
||||
default:
|
||||
format = CAIRO_FORMAT_A8;
|
||||
break;
|
||||
|
|
@ -1531,6 +1539,9 @@ _render_glyph_outline (FT_Face face,
|
|||
case FT_RENDER_MODE_LIGHT:
|
||||
case FT_RENDER_MODE_NORMAL:
|
||||
case FT_RENDER_MODE_MAX:
|
||||
#if HAVE_FT_RENDER_MODE_SDF
|
||||
case FT_RENDER_MODE_SDF:
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -3277,8 +3288,6 @@ _cairo_ft_font_face_get_implementation (void *abstract_face,
|
|||
const cairo_matrix_t *ctm,
|
||||
const cairo_font_options_t *options)
|
||||
{
|
||||
cairo_ft_font_face_t *font_face = abstract_face;
|
||||
|
||||
/* The handling of font options is different depending on how the
|
||||
* font face was created. When the user creates a font face with
|
||||
* cairo_ft_font_face_create_for_ft_face(), then the load flags
|
||||
|
|
@ -3290,6 +3299,8 @@ _cairo_ft_font_face_get_implementation (void *abstract_face,
|
|||
*/
|
||||
|
||||
#if CAIRO_HAS_FC_FONT
|
||||
cairo_ft_font_face_t *font_face = abstract_face;
|
||||
|
||||
/* If we have an unresolved pattern, resolve it and create
|
||||
* unscaled font. Otherwise, use the ones stored in font_face.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ struct _cairo_output_stream {
|
|||
cairo_output_stream_write_func_t write_func;
|
||||
cairo_output_stream_flush_func_t flush_func;
|
||||
cairo_output_stream_close_func_t close_func;
|
||||
unsigned long position;
|
||||
long long position;
|
||||
cairo_status_t status;
|
||||
cairo_bool_t closed;
|
||||
};
|
||||
|
|
@ -140,7 +140,7 @@ cairo_private void
|
|||
_cairo_output_stream_print_matrix (cairo_output_stream_t *stream,
|
||||
const cairo_matrix_t *matrix);
|
||||
|
||||
cairo_private long
|
||||
cairo_private long long
|
||||
_cairo_output_stream_get_position (cairo_output_stream_t *stream);
|
||||
|
||||
cairo_private cairo_status_t
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */
|
||||
/* cairo-output-stream.c: Output stream abstraction
|
||||
*
|
||||
* Copyright © 2005 Red Hat, Inc
|
||||
|
|
@ -382,7 +383,8 @@ _cairo_dtostr (char *buffer, size_t size, double d, cairo_bool_t limited_precisi
|
|||
}
|
||||
|
||||
enum {
|
||||
LENGTH_MODIFIER_LONG = 0x100
|
||||
LENGTH_MODIFIER_LONG = 0x100,
|
||||
LENGTH_MODIFIER_LONG_LONG = 0x200
|
||||
};
|
||||
|
||||
/* Here's a limited reimplementation of printf. The reason for doing
|
||||
|
|
@ -440,6 +442,10 @@ _cairo_output_stream_vprintf (cairo_output_stream_t *stream,
|
|||
if (*f == 'l') {
|
||||
length_modifier = LENGTH_MODIFIER_LONG;
|
||||
f++;
|
||||
if (*f == 'l') {
|
||||
length_modifier = LENGTH_MODIFIER_LONG_LONG;
|
||||
f++;
|
||||
}
|
||||
}
|
||||
|
||||
/* The only format strings exist in the cairo implementation
|
||||
|
|
@ -490,6 +496,20 @@ _cairo_output_stream_vprintf (cairo_output_stream_t *stream,
|
|||
single_fmt, va_arg (ap, long int));
|
||||
}
|
||||
break;
|
||||
case 'd' | LENGTH_MODIFIER_LONG_LONG:
|
||||
case 'u' | LENGTH_MODIFIER_LONG_LONG:
|
||||
case 'o' | LENGTH_MODIFIER_LONG_LONG:
|
||||
case 'x' | LENGTH_MODIFIER_LONG_LONG:
|
||||
case 'X' | LENGTH_MODIFIER_LONG_LONG:
|
||||
if (var_width) {
|
||||
width = va_arg (ap, int);
|
||||
snprintf (buffer, sizeof buffer,
|
||||
single_fmt, width, va_arg (ap, long long int));
|
||||
} else {
|
||||
snprintf (buffer, sizeof buffer,
|
||||
single_fmt, va_arg (ap, long long int));
|
||||
}
|
||||
break;
|
||||
case 's': {
|
||||
/* Write out strings as they may be larger than the buffer. */
|
||||
const char *s = va_arg (ap, const char *);
|
||||
|
|
@ -570,7 +590,7 @@ _cairo_output_stream_print_matrix (cairo_output_stream_t *stream,
|
|||
m.xx, m.yx, m.xy, m.yy, m.x0, m.y0);
|
||||
}
|
||||
|
||||
long
|
||||
long long
|
||||
_cairo_output_stream_get_position (cairo_output_stream_t *stream)
|
||||
{
|
||||
return stream->position;
|
||||
|
|
|
|||
|
|
@ -1169,6 +1169,9 @@ cairo_pdf_interchange_write_docinfo (cairo_pdf_surface_t *surface)
|
|||
{
|
||||
cairo_pdf_interchange_t *ic = &surface->interchange;
|
||||
cairo_int_status_t status;
|
||||
unsigned int i, num_elems;
|
||||
struct metadata *data;
|
||||
unsigned char *p;
|
||||
|
||||
surface->docinfo_res = _cairo_pdf_surface_new_object (surface);
|
||||
if (surface->docinfo_res.id == 0)
|
||||
|
|
@ -1203,6 +1206,26 @@ cairo_pdf_interchange_write_docinfo (cairo_pdf_surface_t *surface)
|
|||
if (ic->docinfo.mod_date)
|
||||
_cairo_output_stream_printf (surface->object_stream.stream, " /ModDate %s\n", ic->docinfo.mod_date);
|
||||
|
||||
num_elems = _cairo_array_num_elements (&ic->custom_metadata);
|
||||
for (i = 0; i < num_elems; i++) {
|
||||
data = _cairo_array_index (&ic->custom_metadata, i);
|
||||
if (data->value) {
|
||||
_cairo_output_stream_printf (surface->object_stream.stream, " /");
|
||||
/* The name can be any utf8 string. Use hex codes as
|
||||
* specified in section 7.3.5 of PDF reference
|
||||
*/
|
||||
p = (unsigned char *)data->name;
|
||||
while (*p) {
|
||||
if (*p < 0x21 || *p > 0x7e || *p == '#' || *p == '/')
|
||||
_cairo_output_stream_printf (surface->object_stream.stream, "#%02x", *p);
|
||||
else
|
||||
_cairo_output_stream_printf (surface->object_stream.stream, "%c", *p);
|
||||
p++;
|
||||
}
|
||||
_cairo_output_stream_printf (surface->object_stream.stream, " %s\n", data->value);
|
||||
}
|
||||
}
|
||||
|
||||
_cairo_output_stream_printf (surface->object_stream.stream,
|
||||
">>\n");
|
||||
_cairo_pdf_surface_object_end (surface);
|
||||
|
|
@ -1624,6 +1647,7 @@ _cairo_pdf_interchange_init (cairo_pdf_surface_t *surface)
|
|||
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
|
||||
|
||||
memset (&ic->docinfo, 0, sizeof (ic->docinfo));
|
||||
_cairo_array_init (&ic->custom_metadata, sizeof(struct metadata));
|
||||
_cairo_pdf_interchange_set_create_date (surface);
|
||||
status = _cairo_array_append (&ic->outline, &outline_root);
|
||||
|
||||
|
|
@ -1654,6 +1678,8 @@ void
|
|||
_cairo_pdf_interchange_fini (cairo_pdf_surface_t *surface)
|
||||
{
|
||||
cairo_pdf_interchange_t *ic = &surface->interchange;
|
||||
unsigned int i, num_elems;
|
||||
struct metadata *data;
|
||||
|
||||
_cairo_tag_stack_fini (&ic->analysis_tag_stack);
|
||||
_cairo_tag_stack_fini (&ic->render_tag_stack);
|
||||
|
|
@ -1674,6 +1700,14 @@ _cairo_pdf_interchange_fini (cairo_pdf_surface_t *surface)
|
|||
free (ic->docinfo.creator);
|
||||
free (ic->docinfo.create_date);
|
||||
free (ic->docinfo.mod_date);
|
||||
|
||||
num_elems = _cairo_array_num_elements (&ic->custom_metadata);
|
||||
for (i = 0; i < num_elems; i++) {
|
||||
data = _cairo_array_index (&ic->custom_metadata, i);
|
||||
free (data->name);
|
||||
free (data->value);
|
||||
}
|
||||
_cairo_array_fini (&ic->custom_metadata);
|
||||
}
|
||||
|
||||
cairo_int_status_t
|
||||
|
|
@ -1868,3 +1902,69 @@ _cairo_pdf_interchange_set_metadata (cairo_pdf_surface_t *surface,
|
|||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static const char *reserved_metadata_names[] = {
|
||||
"",
|
||||
"Title",
|
||||
"Author",
|
||||
"Subject",
|
||||
"Keywords",
|
||||
"Creator",
|
||||
"Producer",
|
||||
"CreationDate",
|
||||
"ModDate",
|
||||
"Trapped",
|
||||
};
|
||||
|
||||
cairo_int_status_t
|
||||
_cairo_pdf_interchange_set_custom_metadata (cairo_pdf_surface_t *surface,
|
||||
const char *name,
|
||||
const char *value)
|
||||
{
|
||||
cairo_pdf_interchange_t *ic = &surface->interchange;
|
||||
struct metadata *data;
|
||||
struct metadata new_data;
|
||||
int i, num_elems;
|
||||
cairo_int_status_t status;
|
||||
char *s = NULL;
|
||||
|
||||
if (name == NULL)
|
||||
return CAIRO_STATUS_NULL_POINTER;
|
||||
|
||||
for (i = 0; i < ARRAY_LENGTH (reserved_metadata_names); i++) {
|
||||
if (strcmp(name, reserved_metadata_names[i]) == 0)
|
||||
return CAIRO_STATUS_INVALID_STRING;
|
||||
}
|
||||
|
||||
/* First check if we already have an entry for this name. If so,
|
||||
* update the value. A NULL value means the entry has been removed
|
||||
* and will not be emitted. */
|
||||
num_elems = _cairo_array_num_elements (&ic->custom_metadata);
|
||||
for (i = 0; i < num_elems; i++) {
|
||||
data = _cairo_array_index (&ic->custom_metadata, i);
|
||||
if (strcmp(name, data->name) == 0) {
|
||||
free (data->value);
|
||||
data->value = NULL;
|
||||
if (value && strlen(value)) {
|
||||
status = _cairo_utf8_to_pdf_string (value, &s);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
data->value = s;
|
||||
}
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add new entry */
|
||||
status = CAIRO_STATUS_SUCCESS;
|
||||
if (value && strlen(value)) {
|
||||
new_data.name = strdup (name);
|
||||
status = _cairo_utf8_to_pdf_string (value, &s);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
new_data.value = s;
|
||||
status = _cairo_array_append (&ic->custom_metadata, &new_data);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -227,6 +227,11 @@ struct docinfo {
|
|||
char *mod_date;
|
||||
};
|
||||
|
||||
struct metadata {
|
||||
char *name;
|
||||
char *value;
|
||||
};
|
||||
|
||||
typedef struct _cairo_pdf_interchange {
|
||||
cairo_tag_stack_t analysis_tag_stack;
|
||||
cairo_tag_stack_t render_tag_stack;
|
||||
|
|
@ -248,6 +253,7 @@ typedef struct _cairo_pdf_interchange {
|
|||
int annot_page;
|
||||
cairo_array_t outline; /* array of pointers to cairo_pdf_outline_entry_t; */
|
||||
struct docinfo docinfo;
|
||||
cairo_array_t custom_metadata; /* array of struct metadata */
|
||||
|
||||
} cairo_pdf_interchange_t;
|
||||
|
||||
|
|
@ -302,7 +308,7 @@ struct _cairo_pdf_surface {
|
|||
cairo_bool_t active;
|
||||
cairo_pdf_resource_t self;
|
||||
cairo_pdf_resource_t length;
|
||||
long start_offset;
|
||||
long long start_offset;
|
||||
cairo_bool_t compressed;
|
||||
cairo_output_stream_t *old_output;
|
||||
} pdf_stream;
|
||||
|
|
@ -420,4 +426,9 @@ _cairo_pdf_interchange_set_metadata (cairo_pdf_surface_t *surface,
|
|||
cairo_pdf_metadata_t metadata,
|
||||
const char *utf8);
|
||||
|
||||
cairo_private cairo_int_status_t
|
||||
_cairo_pdf_interchange_set_custom_metadata (cairo_pdf_surface_t *surface,
|
||||
const char *name,
|
||||
const char *value);
|
||||
|
||||
#endif /* CAIRO_PDF_SURFACE_PRIVATE_H */
|
||||
|
|
|
|||
|
|
@ -243,7 +243,7 @@ typedef enum {
|
|||
typedef struct _cairo_pdf_object {
|
||||
cairo_pdf_object_type_t type;
|
||||
union {
|
||||
long offset; /* type == PDF_OBJECT_UNCOMPRESSED */
|
||||
long long offset; /* type == PDF_OBJECT_UNCOMPRESSED */
|
||||
struct compressed_obj { /* type == PDF_OBJECT_COMPRESSED */
|
||||
cairo_pdf_resource_t xref_stream;
|
||||
int index;
|
||||
|
|
@ -253,7 +253,7 @@ typedef struct _cairo_pdf_object {
|
|||
|
||||
typedef struct _cairo_xref_stream_object {
|
||||
cairo_pdf_resource_t resource;
|
||||
long offset;
|
||||
long long offset;
|
||||
} cairo_xref_stream_object_t;
|
||||
|
||||
typedef struct _cairo_pdf_font {
|
||||
|
|
@ -313,7 +313,7 @@ static cairo_int_status_t
|
|||
_cairo_pdf_surface_write_catalog (cairo_pdf_surface_t *surface,
|
||||
cairo_pdf_resource_t catalog);
|
||||
|
||||
static long
|
||||
static long long
|
||||
_cairo_pdf_surface_write_xref (cairo_pdf_surface_t *surface);
|
||||
|
||||
static cairo_int_status_t
|
||||
|
|
@ -321,7 +321,7 @@ _cairo_pdf_surface_write_xref_stream (cairo_pdf_surface_t *surface,
|
|||
cairo_pdf_resource_t xref_res,
|
||||
cairo_pdf_resource_t root_res,
|
||||
cairo_pdf_resource_t info_res,
|
||||
long *xref_offset);
|
||||
long long *xref_offset);
|
||||
|
||||
static cairo_int_status_t
|
||||
_cairo_pdf_surface_write_patterns_and_smask_groups (cairo_pdf_surface_t *surface,
|
||||
|
|
@ -907,6 +907,42 @@ cairo_pdf_surface_set_metadata (cairo_surface_t *surface,
|
|||
status = _cairo_surface_set_error (surface, status);
|
||||
}
|
||||
|
||||
/**
|
||||
* cairo_pdf_surface_set_custom_metadata:
|
||||
* @surface: a PDF #cairo_surface_t
|
||||
* @name: The name of the custom metadata item to set (utf8).
|
||||
* @value: The value of the metadata (utf8).
|
||||
*
|
||||
* Set custom document metadata. @name may be any string except for
|
||||
* the following names reserved by PDF: "Title", "Author", "Subject",
|
||||
* "Keywords", "Creator", "Producer", "CreationDate", "ModDate",
|
||||
* "Trapped".
|
||||
*
|
||||
* If @value is NULL or an empty string, the @name metadata will not be set.
|
||||
*
|
||||
* For example:
|
||||
* <informalexample><programlisting>
|
||||
* cairo_pdf_surface_set_custom_metadata (surface, "ISBN", "978-0123456789");
|
||||
* </programlisting></informalexample>
|
||||
*
|
||||
* Since: 1.18
|
||||
**/
|
||||
void
|
||||
cairo_pdf_surface_set_custom_metadata (cairo_surface_t *surface,
|
||||
const char *name,
|
||||
const char *value)
|
||||
{
|
||||
cairo_pdf_surface_t *pdf_surface = NULL; /* hide compiler warning */
|
||||
cairo_status_t status;
|
||||
|
||||
if (! _extract_pdf_surface (surface, &pdf_surface))
|
||||
return;
|
||||
|
||||
status = _cairo_pdf_interchange_set_custom_metadata (pdf_surface, name, value);
|
||||
if (status)
|
||||
status = _cairo_surface_set_error (surface, status);
|
||||
}
|
||||
|
||||
/**
|
||||
* cairo_pdf_surface_set_page_label:
|
||||
* @surface: a PDF #cairo_surface_t
|
||||
|
|
@ -1936,7 +1972,7 @@ static cairo_int_status_t
|
|||
_cairo_pdf_surface_close_stream (cairo_pdf_surface_t *surface)
|
||||
{
|
||||
cairo_int_status_t status;
|
||||
long length;
|
||||
long long length;
|
||||
|
||||
if (! surface->pdf_stream.active)
|
||||
return CAIRO_INT_STATUS_SUCCESS;
|
||||
|
|
@ -1966,7 +2002,7 @@ _cairo_pdf_surface_close_stream (cairo_pdf_surface_t *surface)
|
|||
surface->pdf_stream.length);
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"%d 0 obj\n"
|
||||
" %ld\n"
|
||||
" %lld\n"
|
||||
"endobj\n",
|
||||
surface->pdf_stream.length.id,
|
||||
length);
|
||||
|
|
@ -2205,7 +2241,7 @@ _cairo_pdf_surface_close_object_stream (cairo_pdf_surface_t *surface)
|
|||
{
|
||||
int i, num_objects;
|
||||
cairo_xref_stream_object_t *xref_obj;
|
||||
long start_pos, length;
|
||||
long long start_pos, length;
|
||||
cairo_output_stream_t *index_stream;
|
||||
cairo_output_stream_t *deflate_stream;
|
||||
cairo_pdf_resource_t length_res;
|
||||
|
|
@ -2230,7 +2266,7 @@ _cairo_pdf_surface_close_object_stream (cairo_pdf_surface_t *surface)
|
|||
for (i = 0; i < num_objects; i++) {
|
||||
xref_obj = _cairo_array_index (&surface->object_stream.objects, i);
|
||||
_cairo_output_stream_printf (index_stream,
|
||||
"%d %ld\n",
|
||||
"%d %lld\n",
|
||||
xref_obj->resource.id,
|
||||
xref_obj->offset);
|
||||
}
|
||||
|
|
@ -2285,7 +2321,7 @@ _cairo_pdf_surface_close_object_stream (cairo_pdf_surface_t *surface)
|
|||
length_res);
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"%d 0 obj\n"
|
||||
" %ld\n"
|
||||
" %lld\n"
|
||||
"endobj\n",
|
||||
length_res.id,
|
||||
length);
|
||||
|
|
@ -2423,7 +2459,7 @@ static cairo_status_t
|
|||
_cairo_pdf_surface_finish (void *abstract_surface)
|
||||
{
|
||||
cairo_pdf_surface_t *surface = abstract_surface;
|
||||
long offset;
|
||||
long long offset;
|
||||
cairo_pdf_resource_t catalog;
|
||||
cairo_status_t status, status2;
|
||||
int size, i;
|
||||
|
|
@ -2491,7 +2527,7 @@ _cairo_pdf_surface_finish (void *abstract_surface)
|
|||
}
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"startxref\n"
|
||||
"%ld\n"
|
||||
"%lld\n"
|
||||
"%%%%EOF\n",
|
||||
offset);
|
||||
|
||||
|
|
@ -6738,12 +6774,12 @@ _cairo_pdf_surface_write_catalog (cairo_pdf_surface_t *surface,
|
|||
return status;
|
||||
}
|
||||
|
||||
static long
|
||||
static long long
|
||||
_cairo_pdf_surface_write_xref (cairo_pdf_surface_t *surface)
|
||||
{
|
||||
cairo_pdf_object_t *object;
|
||||
int num_objects, i;
|
||||
long offset;
|
||||
long long offset;
|
||||
char buffer[11];
|
||||
|
||||
num_objects = _cairo_array_num_elements (&surface->objects);
|
||||
|
|
@ -6758,7 +6794,7 @@ _cairo_pdf_surface_write_xref (cairo_pdf_surface_t *surface)
|
|||
"0000000000 65535 f \n");
|
||||
for (i = 0; i < num_objects; i++) {
|
||||
object = _cairo_array_index (&surface->objects, i);
|
||||
snprintf (buffer, sizeof buffer, "%010ld", object->u.offset);
|
||||
snprintf (buffer, sizeof buffer, "%010lld", object->u.offset);
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"%s 00000 n \n", buffer);
|
||||
}
|
||||
|
|
@ -6771,7 +6807,7 @@ _cairo_write_xref_stream_entry (cairo_output_stream_t *stream,
|
|||
int id,
|
||||
int type,
|
||||
int field2_size,
|
||||
long field2,
|
||||
long long field2,
|
||||
int field3,
|
||||
cairo_bool_t write_as_comments)
|
||||
{
|
||||
|
|
@ -6779,7 +6815,7 @@ _cairo_write_xref_stream_entry (cairo_output_stream_t *stream,
|
|||
int i;
|
||||
|
||||
if (write_as_comments) {
|
||||
_cairo_output_stream_printf (stream, "%% %5d %2d %10ld %d\n", id, type, field2, field3);
|
||||
_cairo_output_stream_printf (stream, "%% %5d %2d %10lld %d\n", id, type, field2, field3);
|
||||
} else {
|
||||
/* Each field is big endian */
|
||||
buf[0] = type; /* field 1 */
|
||||
|
|
@ -6794,10 +6830,10 @@ _cairo_write_xref_stream_entry (cairo_output_stream_t *stream,
|
|||
}
|
||||
|
||||
static void
|
||||
_cairo_write_xref_stream_entrys (cairo_pdf_surface_t *surface,
|
||||
cairo_output_stream_t *stream,
|
||||
int field2_size,
|
||||
cairo_bool_t write_as_comments)
|
||||
_cairo_write_xref_stream_entries (cairo_pdf_surface_t *surface,
|
||||
cairo_output_stream_t *stream,
|
||||
int field2_size,
|
||||
cairo_bool_t write_as_comments)
|
||||
{
|
||||
cairo_pdf_object_t *object;
|
||||
int num_objects, i;
|
||||
|
|
@ -6847,11 +6883,11 @@ _cairo_pdf_surface_write_xref_stream (cairo_pdf_surface_t *surface,
|
|||
cairo_pdf_resource_t xref_res,
|
||||
cairo_pdf_resource_t root_res,
|
||||
cairo_pdf_resource_t info_res,
|
||||
long *xref_offset)
|
||||
long long *xref_offset)
|
||||
{
|
||||
cairo_output_stream_t *mem_stream;
|
||||
cairo_output_stream_t *xref_stream;
|
||||
long offset;
|
||||
long long offset;
|
||||
int offset_bytes;
|
||||
cairo_status_t status;
|
||||
|
||||
|
|
@ -6867,7 +6903,7 @@ _cairo_pdf_surface_write_xref_stream (cairo_pdf_surface_t *surface,
|
|||
|
||||
mem_stream = _cairo_memory_stream_create ();
|
||||
xref_stream = _cairo_deflate_stream_create (mem_stream);
|
||||
_cairo_write_xref_stream_entrys (surface, xref_stream, offset_bytes, FALSE);
|
||||
_cairo_write_xref_stream_entries (surface, xref_stream, offset_bytes, FALSE);
|
||||
|
||||
status = _cairo_output_stream_destroy (xref_stream);
|
||||
if (unlikely (status))
|
||||
|
|
@ -6900,7 +6936,7 @@ _cairo_pdf_surface_write_xref_stream (cairo_pdf_surface_t *surface,
|
|||
*/
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"%% id type offset/obj gen/index\n");
|
||||
_cairo_write_xref_stream_entrys (surface, surface->output, offset_bytes, TRUE);
|
||||
_cairo_write_xref_stream_entries (surface, surface->output, offset_bytes, TRUE);
|
||||
}
|
||||
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
|
|
|
|||
|
|
@ -143,6 +143,11 @@ cairo_pdf_surface_set_metadata (cairo_surface_t *surface,
|
|||
cairo_pdf_metadata_t metadata,
|
||||
const char *utf8);
|
||||
|
||||
cairo_public void
|
||||
cairo_pdf_surface_set_custom_metadata (cairo_surface_t *surface,
|
||||
const char *name,
|
||||
const char *value);
|
||||
|
||||
cairo_public void
|
||||
cairo_pdf_surface_set_page_label (cairo_surface_t *surface,
|
||||
const char *utf8);
|
||||
|
|
|
|||
|
|
@ -629,7 +629,7 @@ _hash_mix_bits (uint64_t hash)
|
|||
static uintptr_t
|
||||
_cairo_scaled_font_compute_hash (cairo_scaled_font_t *scaled_font)
|
||||
{
|
||||
uintptr_t hash = FNV1_64_INIT;
|
||||
uint64_t hash = FNV1_64_INIT;
|
||||
|
||||
/* We do a bytewise hash on the font matrices */
|
||||
hash = _hash_matrix_fnv (&scaled_font->font_matrix, hash);
|
||||
|
|
|
|||
|
|
@ -987,11 +987,18 @@ cairo_win32_surface_create_with_format (HDC hdc, cairo_format_t format)
|
|||
cairo_device_t *device;
|
||||
|
||||
switch (format) {
|
||||
default:
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT));
|
||||
case CAIRO_FORMAT_ARGB32:
|
||||
case CAIRO_FORMAT_RGB24:
|
||||
break;
|
||||
case CAIRO_FORMAT_INVALID:
|
||||
case CAIRO_FORMAT_A8:
|
||||
case CAIRO_FORMAT_A1:
|
||||
case CAIRO_FORMAT_RGB16_565:
|
||||
case CAIRO_FORMAT_RGB30:
|
||||
case CAIRO_FORMAT_RGB96F:
|
||||
case CAIRO_FORMAT_RGBA128F:
|
||||
default:
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT));
|
||||
case CAIRO_FORMAT_ARGB32:
|
||||
case CAIRO_FORMAT_RGB24:
|
||||
break;
|
||||
}
|
||||
|
||||
surface = _cairo_malloc (sizeof (*surface));
|
||||
|
|
@ -1102,14 +1109,19 @@ cairo_win32_surface_create_with_ddb (HDC hdc,
|
|||
HBITMAP saved_dc_bitmap;
|
||||
|
||||
switch (format) {
|
||||
default:
|
||||
/* XXX handle these eventually */
|
||||
case CAIRO_FORMAT_A8:
|
||||
case CAIRO_FORMAT_A1:
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT));
|
||||
case CAIRO_FORMAT_ARGB32:
|
||||
case CAIRO_FORMAT_RGB24:
|
||||
break;
|
||||
case CAIRO_FORMAT_INVALID:
|
||||
case CAIRO_FORMAT_A8:
|
||||
case CAIRO_FORMAT_A1:
|
||||
case CAIRO_FORMAT_RGB16_565:
|
||||
case CAIRO_FORMAT_RGB30:
|
||||
case CAIRO_FORMAT_RGB96F:
|
||||
case CAIRO_FORMAT_RGBA128F:
|
||||
default:
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT));
|
||||
case CAIRO_FORMAT_ARGB32:
|
||||
case CAIRO_FORMAT_RGB24:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!hdc) {
|
||||
|
|
|
|||
|
|
@ -650,227 +650,6 @@ _cairo_win32_scaled_font_fini (void *abstract_font)
|
|||
DeleteObject (scaled_font->unscaled_hfont);
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
_cairo_win32_scaled_font_type1_text_to_glyphs (cairo_win32_scaled_font_t *scaled_font,
|
||||
double x,
|
||||
double y,
|
||||
const char *utf8,
|
||||
cairo_glyph_t **glyphs,
|
||||
int *num_glyphs)
|
||||
{
|
||||
uint16_t *utf16;
|
||||
int n16;
|
||||
int i;
|
||||
WORD *glyph_indices = NULL;
|
||||
cairo_status_t status;
|
||||
double x_pos, y_pos;
|
||||
HDC hdc = NULL;
|
||||
cairo_matrix_t mat;
|
||||
|
||||
status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &n16);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
glyph_indices = _cairo_malloc_ab (n16 + 1, sizeof (WORD));
|
||||
if (!glyph_indices) {
|
||||
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
|
||||
goto FAIL1;
|
||||
}
|
||||
|
||||
hdc = _get_global_font_dc ();
|
||||
assert (hdc != NULL);
|
||||
|
||||
status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc);
|
||||
if (status)
|
||||
goto FAIL2;
|
||||
|
||||
if (GetGlyphIndicesW (hdc, utf16, n16, glyph_indices, 0) == GDI_ERROR) {
|
||||
status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_type1_text_to_glyphs:GetGlyphIndicesW");
|
||||
goto FAIL3;
|
||||
}
|
||||
|
||||
*num_glyphs = n16;
|
||||
*glyphs = _cairo_malloc_ab (n16, sizeof (cairo_glyph_t));
|
||||
if (!*glyphs) {
|
||||
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
|
||||
goto FAIL3;
|
||||
}
|
||||
|
||||
x_pos = x;
|
||||
y_pos = y;
|
||||
|
||||
mat = scaled_font->base.ctm;
|
||||
status = cairo_matrix_invert (&mat);
|
||||
assert (status == CAIRO_STATUS_SUCCESS);
|
||||
|
||||
_cairo_scaled_font_freeze_cache (&scaled_font->base);
|
||||
|
||||
for (i = 0; i < n16; i++) {
|
||||
cairo_scaled_glyph_t *scaled_glyph;
|
||||
|
||||
(*glyphs)[i].index = glyph_indices[i];
|
||||
(*glyphs)[i].x = x_pos;
|
||||
(*glyphs)[i].y = y_pos;
|
||||
|
||||
status = _cairo_scaled_glyph_lookup (&scaled_font->base,
|
||||
glyph_indices[i],
|
||||
CAIRO_SCALED_GLYPH_INFO_METRICS,
|
||||
NULL, /* foreground color */
|
||||
&scaled_glyph);
|
||||
if (status) {
|
||||
free (*glyphs);
|
||||
*glyphs = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
x = scaled_glyph->x_advance;
|
||||
y = scaled_glyph->y_advance;
|
||||
cairo_matrix_transform_distance (&mat, &x, &y);
|
||||
x_pos += x;
|
||||
y_pos += y;
|
||||
}
|
||||
|
||||
_cairo_scaled_font_thaw_cache (&scaled_font->base);
|
||||
|
||||
FAIL3:
|
||||
cairo_win32_scaled_font_done_font (&scaled_font->base);
|
||||
FAIL2:
|
||||
free (glyph_indices);
|
||||
FAIL1:
|
||||
free (utf16);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
_cairo_win32_scaled_font_text_to_glyphs (void *abstract_font,
|
||||
double x,
|
||||
double y,
|
||||
const char *utf8,
|
||||
cairo_glyph_t **glyphs,
|
||||
int *num_glyphs)
|
||||
{
|
||||
cairo_win32_scaled_font_t *scaled_font = abstract_font;
|
||||
uint16_t *utf16;
|
||||
int n16;
|
||||
GCP_RESULTSW gcp_results;
|
||||
unsigned int buffer_size, i;
|
||||
WCHAR *glyph_indices = NULL;
|
||||
int *dx = NULL;
|
||||
cairo_status_t status;
|
||||
double x_pos, y_pos;
|
||||
double x_incr, y_incr;
|
||||
HDC hdc = NULL;
|
||||
|
||||
/* GetCharacterPlacement() returns utf16 instead of glyph indices
|
||||
* for Type 1 fonts. Use GetGlyphIndices for Type 1 fonts. */
|
||||
if (scaled_font->is_type1)
|
||||
return _cairo_win32_scaled_font_type1_text_to_glyphs (scaled_font,
|
||||
x,
|
||||
y,
|
||||
utf8,
|
||||
glyphs,
|
||||
num_glyphs);
|
||||
|
||||
/* Compute a vector in user space along the baseline of length one logical space unit */
|
||||
x_incr = 1;
|
||||
y_incr = 0;
|
||||
cairo_matrix_transform_distance (&scaled_font->base.font_matrix, &x_incr, &y_incr);
|
||||
x_incr /= scaled_font->logical_scale;
|
||||
y_incr /= scaled_font->logical_scale;
|
||||
|
||||
status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &n16);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
gcp_results.lStructSize = sizeof (GCP_RESULTS);
|
||||
gcp_results.lpOutString = NULL;
|
||||
gcp_results.lpOrder = NULL;
|
||||
gcp_results.lpCaretPos = NULL;
|
||||
gcp_results.lpClass = NULL;
|
||||
|
||||
buffer_size = MAX (n16 * 1.2, 16); /* Initially guess number of chars plus a few */
|
||||
if (buffer_size > INT_MAX) {
|
||||
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
|
||||
goto FAIL1;
|
||||
}
|
||||
|
||||
hdc = _get_global_font_dc ();
|
||||
assert (hdc != NULL);
|
||||
|
||||
status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc);
|
||||
if (status)
|
||||
goto FAIL1;
|
||||
|
||||
while (TRUE) {
|
||||
free (glyph_indices);
|
||||
glyph_indices = NULL;
|
||||
|
||||
free (dx);
|
||||
dx = NULL;
|
||||
|
||||
glyph_indices = _cairo_malloc_ab (buffer_size, sizeof (WCHAR));
|
||||
dx = _cairo_malloc_ab (buffer_size, sizeof (int));
|
||||
if (!glyph_indices || !dx) {
|
||||
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
|
||||
goto FAIL2;
|
||||
}
|
||||
|
||||
gcp_results.nGlyphs = buffer_size;
|
||||
gcp_results.lpDx = dx;
|
||||
gcp_results.lpGlyphs = glyph_indices;
|
||||
|
||||
if (!GetCharacterPlacementW (hdc, utf16, n16,
|
||||
0,
|
||||
&gcp_results,
|
||||
GCP_DIACRITIC | GCP_LIGATE | GCP_GLYPHSHAPE | GCP_REORDER)) {
|
||||
status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_text_to_glyphs");
|
||||
goto FAIL2;
|
||||
}
|
||||
|
||||
if (gcp_results.lpDx && gcp_results.lpGlyphs)
|
||||
break;
|
||||
|
||||
/* Too small a buffer, try again */
|
||||
|
||||
buffer_size += buffer_size / 2;
|
||||
if (buffer_size > INT_MAX) {
|
||||
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
|
||||
goto FAIL2;
|
||||
}
|
||||
}
|
||||
|
||||
*num_glyphs = gcp_results.nGlyphs;
|
||||
*glyphs = _cairo_malloc_ab (gcp_results.nGlyphs, sizeof (cairo_glyph_t));
|
||||
if (!*glyphs) {
|
||||
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
|
||||
goto FAIL2;
|
||||
}
|
||||
|
||||
x_pos = x;
|
||||
y_pos = y;
|
||||
|
||||
for (i = 0; i < gcp_results.nGlyphs; i++) {
|
||||
(*glyphs)[i].index = glyph_indices[i];
|
||||
(*glyphs)[i].x = x_pos ;
|
||||
(*glyphs)[i].y = y_pos;
|
||||
|
||||
x_pos += x_incr * dx[i];
|
||||
y_pos += y_incr * dx[i];
|
||||
}
|
||||
|
||||
FAIL2:
|
||||
free (glyph_indices);
|
||||
free (dx);
|
||||
|
||||
cairo_win32_scaled_font_done_font (&scaled_font->base);
|
||||
|
||||
FAIL1:
|
||||
free (utf16);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
_cairo_win32_scaled_font_ucs4_to_index (void *abstract_font,
|
||||
uint32_t ucs4)
|
||||
|
|
@ -1845,7 +1624,7 @@ const cairo_scaled_font_backend_t _cairo_win32_scaled_font_backend = {
|
|||
CAIRO_FONT_TYPE_WIN32,
|
||||
_cairo_win32_scaled_font_fini,
|
||||
_cairo_win32_scaled_font_glyph_init,
|
||||
NULL, /* _cairo_win32_scaled_font_text_to_glyphs, FIXME */
|
||||
NULL, /* _cairo_win32_scaled_font_text_to_glyphs */
|
||||
_cairo_win32_scaled_font_ucs4_to_index,
|
||||
_cairo_win32_scaled_font_load_truetype_table,
|
||||
_cairo_win32_scaled_font_index_to_ucs4,
|
||||
|
|
|
|||
|
|
@ -167,8 +167,15 @@ _cairo_win32_printing_surface_init_language_pack (cairo_win32_printing_surface_t
|
|||
|
||||
module = GetModuleHandleW (L"GDI32.DLL");
|
||||
if (module) {
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wcast-function-type"
|
||||
#endif
|
||||
gdi_init_lang_pack = (gdi_init_lang_pack_func_t)
|
||||
GetProcAddress (module, "GdiInitializeLanguagePack");
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
if (gdi_init_lang_pack)
|
||||
gdi_init_lang_pack (0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
[wrap-git]
|
||||
directory=gperf
|
||||
url=https://gitlab.freedesktop.org/tpm/gperf.git
|
||||
push-url=https://gitlab.freedesktop.org/tpm/gperf.git
|
||||
revision=meson
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[wrap-git]
|
||||
directory=libffi
|
||||
url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
|
||||
revision=meson
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[wrap-git]
|
||||
directory=proxy-libintl
|
||||
url=https://github.com/frida/proxy-libintl.git
|
||||
revision=0.1
|
||||
|
|
@ -1508,9 +1508,13 @@ _cairo_test_context_run_for_target (cairo_test_context_t *ctx,
|
|||
if (! RUNNING_ON_VALGRIND) {
|
||||
void (* volatile old_segfault_handler)(int);
|
||||
void (* volatile old_segfpe_handler)(int);
|
||||
#ifdef SIGPIPE
|
||||
void (* volatile old_sigpipe_handler)(int);
|
||||
#endif
|
||||
void (* volatile old_sigabrt_handler)(int);
|
||||
#ifdef SIGALRM
|
||||
void (* volatile old_sigalrm_handler)(int);
|
||||
#endif
|
||||
|
||||
/* Set up a checkpoint to get back to in case of segfaults. */
|
||||
#ifdef SIGSEGV
|
||||
|
|
|
|||
|
|
@ -517,7 +517,7 @@ build_any2ppm = false
|
|||
has_multipage_surfaces = false
|
||||
add_fallback_resolution = false
|
||||
|
||||
if conf.get('HAVE_REAL_PTHREAD', 0) == 1
|
||||
if conf.get('CAIRO_HAS_REAL_PTHREAD', 0) == 1
|
||||
test_sources += test_pthread_sources
|
||||
endif
|
||||
|
||||
|
|
|
|||
|
|
@ -377,6 +377,12 @@ create_document (cairo_surface_t *surface, cairo_t *cr)
|
|||
cairo_pdf_surface_set_metadata (surface, CAIRO_PDF_METADATA_CREATE_DATE, "2016-01-01T12:34:56+10:30");
|
||||
cairo_pdf_surface_set_metadata (surface, CAIRO_PDF_METADATA_MOD_DATE, "2016-06-21T05:43:21Z");
|
||||
|
||||
cairo_pdf_surface_set_custom_metadata (surface, "DocumentNumber", "12345");
|
||||
/* Include some non ASCII characters */
|
||||
cairo_pdf_surface_set_custom_metadata (surface, "Document Name", "\xc2\xab""cairo test\xc2\xbb");
|
||||
/* Test unsetting custom metadata. "DocumentNumber" should not be emitted. */
|
||||
cairo_pdf_surface_set_custom_metadata (surface, "DocumentNumber", "");
|
||||
|
||||
cairo_tag_begin (cr, "Document", NULL);
|
||||
|
||||
draw_cover (surface, cr);
|
||||
|
|
@ -465,7 +471,9 @@ check_created_pdf(cairo_test_context_t *ctx, const char* filename)
|
|||
cairo_test_status_t result = CAIRO_TEST_SUCCESS;
|
||||
int fd;
|
||||
struct stat st;
|
||||
#ifdef HAVE_MMAP
|
||||
void *contents;
|
||||
#endif
|
||||
|
||||
fd = open(filename, O_RDONLY, 0);
|
||||
if (fd < 0) {
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 46 KiB |
BIN
test/reference/user-font-mask.quartz.ref.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
test/reference/user-font-mask.recording.ref.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
test/reference/user-font-mask.script.ref.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
test/reference/user-font-mask.xcb-render-0_0.ref.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
test/reference/user-font-mask.xcb.ref.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
test/reference/user-font-mask.xlib-render-0_0.ref.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
test/reference/user-font-mask.xlib.ref.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
|
|
@ -41,7 +41,9 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined(CAIRO_HAS_XLIB_SURFACE) || defined(CAIRO_HAS_XLIB_XRENDER_SURFACE)
|
||||
static const cairo_user_data_key_t _key;
|
||||
#endif
|
||||
|
||||
#define SINGLE_SURFACE 1
|
||||
|
||||
|
|
|
|||
|
|
@ -99,8 +99,13 @@
|
|||
#define CAIRO_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16)
|
||||
|
||||
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
#ifdef __MINGW32__
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
__attribute__((__format__(__MINGW_PRINTF_FORMAT, fmt_index, va_index)))
|
||||
#else
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
__attribute__((__format__(__printf__, fmt_index, va_index)))
|
||||
#endif
|
||||
#else
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index)
|
||||
#endif
|
||||
|
|
|
|||