diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-12-09 08:52:59 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-12-09 08:52:59 +0000 |
commit | 0e55ebacfcc10e22f39e957c29b9946973ad3194 (patch) | |
tree | 173e33cb8550e1808279f4ffcad0bd1d5e5f0eaa /Build/source/libs/cairo/cairo-src/src | |
parent | afa67523e84af0ba0d8b5f50751d32e1a66f7c4b (diff) |
cairo 1.14.8
git-svn-id: svn://tug.org/texlive/trunk@42658 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/cairo/cairo-src/src')
8 files changed, 51 insertions, 23 deletions
diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-debug.c b/Build/source/libs/cairo/cairo-src/src/cairo-debug.c index 33d46aa3f79..e7ffe48d28c 100644 --- a/Build/source/libs/cairo/cairo-src/src/cairo-debug.c +++ b/Build/source/libs/cairo/cairo-src/src/cairo-debug.c @@ -262,7 +262,7 @@ _cairo_debug_print_path (FILE *stream, cairo_path_fixed_t *path) box.p1.x, box.p1.y, box.p2.x, box.p2.y); } - printf ("\n"); + fprintf (stream, "\n"); } void diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-pattern.c b/Build/source/libs/cairo/cairo-src/src/cairo-pattern.c index ac5d7af20a2..f0b879836df 100644 --- a/Build/source/libs/cairo/cairo-src/src/cairo-pattern.c +++ b/Build/source/libs/cairo/cairo-src/src/cairo-pattern.c @@ -4614,7 +4614,7 @@ static void _cairo_debug_print_raster_source_pattern (FILE *file, const cairo_raster_source_pattern_t *raster) { - printf (" content: %x, size %dx%d\n", raster->content, raster->extents.width, raster->extents.height); + fprintf (file, " content: %x, size %dx%d\n", raster->content, raster->extents.width, raster->extents.height); } static void diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-scaled-font.c b/Build/source/libs/cairo/cairo-src/src/cairo-scaled-font.c index ac80c97d1c5..a22b36eef19 100644 --- a/Build/source/libs/cairo/cairo-src/src/cairo-scaled-font.c +++ b/Build/source/libs/cairo/cairo-src/src/cairo-scaled-font.c @@ -818,23 +818,35 @@ _cairo_scaled_font_thaw_cache (cairo_scaled_font_t *scaled_font) void _cairo_scaled_font_reset_cache (cairo_scaled_font_t *scaled_font) { + cairo_scaled_glyph_page_t *page; + CAIRO_MUTEX_LOCK (scaled_font->mutex); assert (! scaled_font->cache_frozen); assert (! scaled_font->global_cache_frozen); CAIRO_MUTEX_LOCK (_cairo_scaled_glyph_page_cache_mutex); - while (! cairo_list_is_empty (&scaled_font->glyph_pages)) { - cairo_scaled_glyph_page_t *page = - cairo_list_first_entry (&scaled_font->glyph_pages, - cairo_scaled_glyph_page_t, - link); + cairo_list_foreach_entry (page, + cairo_scaled_glyph_page_t, + &scaled_font->glyph_pages, + link) { cairo_scaled_glyph_page_cache.size -= page->cache_entry.size; _cairo_hash_table_remove (cairo_scaled_glyph_page_cache.hash_table, (cairo_hash_entry_t *) &page->cache_entry); + } + CAIRO_MUTEX_UNLOCK (_cairo_scaled_glyph_page_cache_mutex); + + /* Destroy scaled_font's pages while holding its lock only, and not the + * global page cache lock. The destructor can cause us to recurse and + * end up back here for a different scaled_font. */ + + while (! cairo_list_is_empty (&scaled_font->glyph_pages)) { + page = cairo_list_first_entry (&scaled_font->glyph_pages, + cairo_scaled_glyph_page_t, + link); _cairo_scaled_glyph_page_destroy (scaled_font, page); } - CAIRO_MUTEX_UNLOCK (_cairo_scaled_glyph_page_cache_mutex); + CAIRO_MUTEX_UNLOCK (scaled_font->mutex); } diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-surface-observer.c b/Build/source/libs/cairo/cairo-src/src/cairo-surface-observer.c index 52b013644db..e6f78e6da6f 100644 --- a/Build/source/libs/cairo/cairo-src/src/cairo-surface-observer.c +++ b/Build/source/libs/cairo/cairo-src/src/cairo-surface-observer.c @@ -1218,8 +1218,6 @@ _cairo_surface_observer_mark_dirty (void *abstract_surface, cairo_surface_observer_t *surface = abstract_surface; cairo_status_t status; - printf ("mark-dirty (%d, %d) x (%d, %d)\n", x, y, width, height); - status = CAIRO_STATUS_SUCCESS; if (surface->target->backend->mark_dirty_rectangle) status = surface->target->backend->mark_dirty_rectangle (surface->target, diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-truetype-subset.c b/Build/source/libs/cairo/cairo-src/src/cairo-truetype-subset.c index 645a89abf21..9137ef3aa38 100644 --- a/Build/source/libs/cairo/cairo-src/src/cairo-truetype-subset.c +++ b/Build/source/libs/cairo/cairo-src/src/cairo-truetype-subset.c @@ -653,16 +653,34 @@ cairo_truetype_font_write_glyf_table (cairo_truetype_font_t *font, if (unlikely (status)) goto FAIL; - if (size != 0) { - status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + if (size > 1) { + tt_glyph_data_t *glyph_data; + int num_contours; + + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_glyf, begin, buffer, &size); if (unlikely (status)) goto FAIL; - status = cairo_truetype_font_remap_composite_glyph (font, buffer, size); - if (unlikely (status)) - goto FAIL; - } + glyph_data = (tt_glyph_data_t *) buffer; + num_contours = (int16_t)be16_to_cpu (glyph_data->num_contours); + if (num_contours < 0) { + status = cairo_truetype_font_remap_composite_glyph (font, buffer, size); + if (unlikely (status)) + goto FAIL; + } else if (num_contours == 0) { + /* num_contours == 0 is undefined in the Opentype + * spec. There are some embedded fonts that have a + * space glyph with num_contours = 0 that fails on + * some printers. The spec requires glyphs without + * contours to have a 0 size glyph entry in the loca + * table. + * + * If num_contours == 0, truncate the glyph to 0 size. + */ + _cairo_array_truncate (&font->output, _cairo_array_num_elements (&font->output) - size); + } + } } status = cairo_truetype_font_align_output (font, &next); diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-xcb-surface-render.c b/Build/source/libs/cairo/cairo-src/src/cairo-xcb-surface-render.c index 044339bce8f..139dcda827a 100644 --- a/Build/source/libs/cairo/cairo-src/src/cairo-xcb-surface-render.c +++ b/Build/source/libs/cairo/cairo-src/src/cairo-xcb-surface-render.c @@ -3399,8 +3399,6 @@ _composite_mask_clip (void *closure, } } - dst->deferred_clear = FALSE; /* assert(trap extents == extents); */ - status = _composite_traps (&info, dst, CAIRO_OPERATOR_SOURCE, mask_pattern, dst_x, dst_y, diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-xlib-surface-shm.c b/Build/source/libs/cairo/cairo-src/src/cairo-xlib-surface-shm.c index fb40699dc1d..9824eff823b 100644 --- a/Build/source/libs/cairo/cairo-src/src/cairo-xlib-surface-shm.c +++ b/Build/source/libs/cairo/cairo-src/src/cairo-xlib-surface-shm.c @@ -441,7 +441,7 @@ static void send_event(cairo_xlib_display_t *display, ev.type = display->shm->event; ev.send_event = 1; /* XXX or lie? */ - ev.serial = NextRequest (display->display); + ev.serial = XNextRequest (display->display); ev.drawable = display->shm->window; ev.major_code = display->shm->opcode; ev.minor_code = X_ShmPutImage; @@ -599,7 +599,7 @@ _cairo_xlib_shm_pool_create(cairo_xlib_display_t *display, goto cleanup; } - pool->attached = NextRequest (dpy); + pool->attached = XNextRequest (dpy); success = XShmAttach (dpy, &pool->shm); #if !IPC_RMID_DEFERRED_RELEASE XSync (dpy, FALSE); @@ -1199,7 +1199,7 @@ _cairo_xlib_shm_surface_mark_active (cairo_surface_t *_shm) cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *) _shm; cairo_xlib_display_t *display = (cairo_xlib_display_t *) _shm->device; - shm->active = NextRequest (display->display); + shm->active = XNextRequest (display->display); } void @@ -1241,7 +1241,7 @@ _cairo_xlib_shm_surface_get_obdata (cairo_surface_t *surface) cairo_xlib_display_t *display = (cairo_xlib_display_t *) surface->device; cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *) surface; - display->shm->last_event = shm->active = NextRequest (display->display); + display->shm->last_event = shm->active = XNextRequest (display->display); return &shm->info->pool->shm; } diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-xlib-surface.c b/Build/source/libs/cairo/cairo-src/src/cairo-xlib-surface.c index 029a542b946..ffea476f68f 100644 --- a/Build/source/libs/cairo/cairo-src/src/cairo-xlib-surface.c +++ b/Build/source/libs/cairo/cairo-src/src/cairo-xlib-surface.c @@ -807,6 +807,7 @@ _get_image_surface (cairo_xlib_surface_t *surface, } cairo_surface_destroy (&image->base); + image = NULL; } } @@ -1011,7 +1012,8 @@ _get_image_surface (cairo_xlib_surface_t *surface, cairo_device_release (&display->base); if (unlikely (status)) { - cairo_surface_destroy (&image->base); + if (image) + cairo_surface_destroy (&image->base); return _cairo_surface_create_in_error (status); } |