Merge branch 'master' into color-font-foreground-color

This commit is contained in:
Adrian Johnson 2021-09-17 06:25:07 +09:30
commit 23815978cc
34 changed files with 285 additions and 304 deletions

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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>

View file

@ -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')

View file

@ -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

View file

@ -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,

View file

@ -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.
*/

View file

@ -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

View file

@ -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;

View file

@ -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;
}

View file

@ -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 */

View file

@ -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,

View file

@ -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);

View file

@ -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);

View file

@ -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) {

View file

@ -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,

View file

@ -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);
}

View file

@ -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

View file

@ -1,4 +0,0 @@
[wrap-git]
directory=libffi
url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
revision=meson

View file

@ -1,4 +0,0 @@
[wrap-git]
directory=proxy-libintl
url=https://github.com/frida/proxy-libintl.git
revision=0.1

View file

@ -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

View file

@ -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

View file

@ -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) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -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

View file

@ -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