diff options
Diffstat (limited to 'gfx')
448 files changed, 11705 insertions, 34985 deletions
diff --git a/gfx/cairo/README b/gfx/cairo/README deleted file mode 100644 index 91e2d1982..000000000 --- a/gfx/cairo/README +++ /dev/null @@ -1,256 +0,0 @@ -Snapshots of cairo and glitz for mozilla usage. - -We only include the relevant parts of each release (generally, src/*.[ch]), -as we have Makefile.in's that integrate into the Mozilla build system. For -documentation and similar, please see the official tarballs at -http://www.cairographics.org/. - -VERSIONS: - - cairo (12d521df8acc483b2daa844d4f05dc2fe2765ba6) - pixman (0.24.2) - -==== Patches ==== - -Some specific things: - -max-font-size.patch: Clamp freetype font size to 1000 to avoid overflow issues - -win32-logical-font-scale.patch: set CAIRO_WIN32_LOGICAL_FONT_SCALE to 1 - -nonfatal-assertions.patch: Make assertions non-fatal - -buggy-repeat.patch: Unconditionally turn on buggy-repeat handling to bandaid bug 413583. - -cairo-version-fixes.patch: fix up cairo-version.c/cairo-version.h for in-place builds - -win32-ddb-dib.patch: fix for bug 455513; not upstream yet pending feebdack - -win32-vertically-offset-glyph.patch: bug 454098; vertical positioning errors when drawing glyph runs including delta-y offsets on screen via GDI - -ignore-rank0.patch: bug 474886; Not redrawing the background when changing page on flickr - -win32-canvas-glyph-position.patch: bug 475092; horizontal positioning errors when drawing glyph runs with delta-y offsets to canvas through win32-font - -win32-cleartype-clipping.patch: bug 445087; some glyphs are clipped, mainly on right-hand edge, when ClearType is enabled and drawing to RGBA canvas - -on-edge.patch: reverts the in-fill semantic change. - -wrap-source_image.patch: make sure we don't free the source image until we're done with it. - -zero-sized.patch: deal with zero sized surface in ways less likely to crash. - -text-path-filling-threshold.patch: use path filling instead of platform glyph rasterization at a smaller size threshold of 256 device pixels, if the backend supports native filling (which we assume will be fast). - -zombie-face.patch: bug 486974; leak and possible crash with @font-face{src:url()}. Upstream commit: 0238fe2cafea2e1ed19bb222117bd73ee6898d4d - -win32-raster.patch: bug 498689; use scanline rasterizer on win32 - -quartz-falback.patch: try to fix Quartz fallback-to-pixman path; possiby incorrect and obsoleted by Andrea Canciani patch - -quartz-repeating-radial-gradients.patch: use Quartz to render repeating radial gradients instead of falling back - -quartz-const-globals.patch: make some Quartz color function data const globals instead of local variables - -quartz-minimze-gradient-repeat.patch: reduce the number of gradient stop repetitions we use, to improve quality of Quartz's gradient rendering - -quartz-first-stop.patch: return the first stop for negative positions on the gradient line of a nonrepeating linear gradient - -quartz-glyph-extents.patch: bug 534260; work around incorrect glyph extents returned by quartz for anomalous empty glyphs - -quartz-state.patch: bug 522859; refactor cairo-quartz-surface so that state local to a drawing operation is stored in a cairo_quartz_drawing_state_t instead of the surface - -quartz-cache-CGImageRef.patch: cache CGImageRef for a CGBitmapContext; when we reuse it, Quartz will cache stuff, improving performance - -quartz-remove-snapshot.patch: remove broken implementation of backend snapshot - -quartz-cglayers.patch: add support for cairo surfaces backed by CGLayers - -quartz-cglayers-fix-fallback.patch: Bug 572912; fix bug in fallback code in previous patch - -quartz-get-image.patch: Bug 575521; add a way to get the image surface associated with a surface - -quartz-create-for-data.patch: Bug 575521; add a way to create quartz surfaces backed with application-provided data - -premultiply-alpha-solid-gradients.patch: bug 539165; multiply the solid color by the alpha component before using it for a solid surface - -xlib-initialize-members.path: bug 548793; initialize XRender version if the server doesn't have the extension - -remove-comma: remove a comma from enum - -d2d.patch: add d2d support - -fix-zero-len-graident.patch: fix zero length gradients - -fix-clip-copy.patch: fix clip copying - -fix-clip-region-simplification.patch: fixes a bug in clip region simplifications - -expand-in-stroke-limits.patch: expand the in-stroke limits to avoid a bug - -d2d-dwrite.patch: update the d2d/dwrite stuff - -add-a-stash-of-cairo_t-s.patch: use the stash to avoid malloc/freeing cairo_t's - -bgr.patch: fix image wrapping - -disable-server-graidents.patch: disable server-side gradients - -clip-invariant.patch: make rasterization closer to being clip invariant - -fix-unnecessary-fallback.patch: avoid unnecessary fallback - -handle-a1-upload.patch: handle a1 image uploads through converter - -surface-clipper.patch: remove an incorrect optimization - -fix-win32-show-glyphs-clipping.patch: fix a clipping bug - -native-clipping.patch: Add support for a native clipping api - -quartz-is-clear.patch: Propagate the quartz is_clear flag. - -cairo-qt-compile.patch: Fix compile error, return not reached, and clone_similar interface - -dwrite-glyph-extents.patch: Add padding to extents of antialiased glyphs, to avoid unwanted clipping. (bug 568191) - -fix-ps-output.patch: PS: Add missing 'q' when resetting clip path (42b5cac7668625c9761113ff72b47af5cfd10377) - -ensure-text-flushed.patch: PDF-operators: ensure text operations flushed before emitting clip (42b5cac7668625c9761113ff72b47af5cfd10377) - -fix-xcopyarea-with-clips.patch: 5d07307b691afccccbb15f773d5231669ba44f5a - -cairo-x-visual.patch: make valid visua for cairo_xlib_surface_create_with_xrender_format (55037bfb2454a671332d961e061c712ab5471580) - -win32-transparent-surface.patch: add API so we can create a win32 surface for an HDC and indicate the surface has an alpha channel - -cairo_qt_glyphs.patch: Drop X surface from Qt surface, add support for new qt glyphs api - -empty-clip-rectangles.patch: f2fa15680ec3ac95cb68d4957557f06561a7dc55 - -empty-clip-extents.patch: b79ea8a6cab8bd28aebecf6e1e8229d5ac017264 - -clip-rects-surface-extents.patch: 108b1c7825116ed3f93aa57384bbd3290cdc9181 - -disable-previous-scaled-font-cache.patch: Disable the previous-scaled-font-cache until we figure out our ctm handling (#583035) - -copyarea-with-alpha.patch: support simple overlapping self copies in (some) color_alpha xlib surfaces. https://bugs.freedesktop.org/show_bug.cgi?id=29250 - -fix-clip-test.patch: Use y 498c10032ea3f8631a928cd7df96766f2c8ddca4 - -quartz-refactor-surface-setup.patch: Extract the surface-source setup chunk of _cairo_quartz_setup_state into its own function - -quartz-fix-PAD.patch: Treat PAD like NONE instead of REPEAT - -quartz-mask-non-OVER.patch: Don't use CGContextSetAlpha to optimize alpha masking for non-OVER operators - -quartz-layers-content.patch: Store cairo content type in CGLayer surfaces - -quartz-optimize-OVER.patch: Optimize OVER to SOURCE for opaque patterns - -quartz-check-imageSurfaceEquiv.patch: Drop cairo_quartz_surface_t's "imageSurfaceEquiv" member variable if we have problems creating it - -disable-subpixel-antialiasing.patch: Add API to disable subpixel antialiasing completely for a target surface - -tee-surfaces-pointwise.patch: Composite tee subsurfaces pointwise if possible - -pattern_get_surface-no-error.patch: Don't put a pattern into error if cairo_pattern_get_surface fails - -missing-cairo-clip-init.diff: Missing cairo_clip_init call in cairo_gstate_show_text_glyphs lead to crash - -fix-cairo-win32-print-gdi-error.diff: Don't use fwprintf with char* format. Flush stderr so that all error messages appears before exit. - -pixman-image-transform.patch: Reset the transform on pixman images when using them as destinations. - -fix-cairo-surface-wrapper-flush-build-warning.patch: Ensures that _cairo_surface_wrapper_flush always returns a status, to silence the build warning - -fixup-unbounded.patch: Hack to work around bad assumption. - -quartz-get-image-performance: Make cairo_quartz_get_image faster in the failure case by not flushing unless we are going to succeed. - -lround-c99-only.patch: Only use lround in C99 programs. - -unicode-printing.patch: Print as unicode (bug 454532) - -quartz-mark-dirty.patch: Add a quartz implementation of mark_dirty_rectangle (bug 715704) - -expose-snapshot.patch: Make functions to add snapshots public, as well as allow creating null surfaces publically. (bug 715658) - -fix-build-with-Werror=return-type.patch: Fix builds with -Werror=return-type (bug 737909) - -avoid-extend-none.patch: Avoid incorrectly using EXTEND_NONE (bug 751668) - -win32-ExtCreatePen-zero-size.patch: Don't pass zero width or dash lengths to ExtCreatePen (bug 768348) - -d2d-repeating-gradients.patch: Minimize number of gradient stops added to handle repeating with path fills (bug 768775) - -xlib-glyph-clip-region.patch: bug 709477, addressed upstream by be1ff2f45fdbc69537e513834fcffa0435e63073 - -gdi-RGB24-ARGB32.patch: bug 788794 - -dwrite-font-printing.patch: bug 468568; don't substitute a GDI font for a DWrite font if the name tables aren't equal - -d2d-gradient-ensure-stops.patch: bug 792903, ensure we don't set num_stops to 0 - -setlcdfilter_in_tree.patch: bug 790139; force cairo to use FT_Library_SetLcdFilter from our in tree library rather than picking it up from the system - -dwrite-font-match-robustness.patch: bug 717178, don't crash when _name_tables_match is passed a nil scaled-font - -handle-multi-path-clip.patch: bug 813124, handle multiple clip paths correctly - -win32-gdi-font-cache.patch: Bug 717178, cache GDI font faces to reduce usage of GDI resources - -win32-gdi-font-cache-no-HFONT.patch: Bug 717178, don't cache GDI font faces when an HFONT belonging to the caller is passed in - -fix-win32-font-assertion.patch: Bug 838617, fix assertion from bug 717178 that was in the wrong place - -xlib-flush-glyphs.patch: bug 839745, flush glyphs when necessary - -dasharray-zero-gap.patch: bug 885585, ensure strokes get painted when the gaps in a dash array are all zero length - -cairo-mask-extends-bug.patch: bug 918671, sometimes when building a mask we wouldn't clear it properly. This is fixed in cairo 1.12 - -ft-no-subpixel-if-surface-disables.patch: bug 929451, don't use subpixel aa for ft fonts on surfaces that don't support it - -win32-printing-axis-swap.patch: bug 1205854, workaround for Windows printer drivers that can't handle swapped X and Y axes - -no-pixman-image-reuse-across-threads.patch: bug 1273701, picked from 71e8a4c23019b01aa43b334fcb2784c70daae9b5 - -==== pixman patches ==== - -pixman-android-cpu-detect.patch: Add CPU detection support for Android, where we can't reliably access /proc/self/auxv. - -pixman-rename-and-endian.patch: include cairo-platform.h for renaming of external symbols and endian macros - -NOTE: we previously supported ARM assembler on MSVC, this has been removed because of the maintenance burden - -pixman-export.patch: use cairo_public for PIXMAN_EXPORT to make sure pixman symbols are not exported in libxul - -pixman-limits.patch: include limits.h for SIZE_MAX - -pixman-lowres-interp.patch: Use lower quality interpolation for more speed. - -pixman-bilinear-fastpath.patch: Bilinear fast paths for non-neon - -pixman-16-bit-pipeline.patch: 16 bit pipeline for dithering - -pixman-dither.patch: Add dithering of 16 bit gradients - -quartz-support-color-emoji-font.patch: support Apple Color Emoji font in cairo-quartz backend - -use-show-text-glyphs-if-glyph-path-fails.patch: fall back to show_text_glyphs even at huge sizes if scaled_font_glyph_path didn't work - -pixman-enable-altivec-acceleration.patch: enable building the altivec acceleration - -win32-d3dsurface9.patch: Create a win32 d3d9 surface to support LockRect - -win32-avoid-extend-pad-fallback: Avoid falling back to pixman when using EXTEND_PAD - -support-new-style-atomic-primitives.patch: Support the __atomic_* primitives for atomic operations - -==== disable printing patch ==== - -disable-printing.patch: allows us to use NS_PRINTING to disable printing. - -==== cairo clamp bounday patch ==== -cairo-clamp-boundary.patch: don't call pixman_fill with negative starts or negative sizes diff --git a/gfx/cairo/add-a-stash-of-cairo_t-s.patch b/gfx/cairo/add-a-stash-of-cairo_t-s.patch deleted file mode 100644 index c6fcdd9d8..000000000 --- a/gfx/cairo/add-a-stash-of-cairo_t-s.patch +++ /dev/null @@ -1,75 +0,0 @@ -commit dfec2c249915560cedd2b49326c6629ad8a0b0f2 -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Tue Mar 2 16:01:41 2010 -0500 - - add a stash of cairo_t's - -diff --git a/src/cairo.c b/src/cairo.c -index 3c9d892..4b27b83 100644 ---- a/src/cairo.c -+++ b/src/cairo.c -@@ -119,7 +119,63 @@ _cairo_set_error (cairo_t *cr, cairo_status_t status) - _cairo_status_set_error (&cr->status, _cairo_error (status)); - } - --#if HAS_ATOMIC_OPS -+#if defined(_MSC_VER) -+#pragma intrinsic(_BitScanForward) -+static __forceinline int -+ffs(int x) -+{ -+ unsigned long i; -+ -+ if (_BitScanForward(&i, x) != 0) -+ return i + 1; -+ -+ return 0; -+} -+#endif -+ -+ -+#if CAIRO_NO_MUTEX -+/* We keep a small stash of contexts to reduce malloc pressure */ -+#define CAIRO_STASH_SIZE 4 -+static struct { -+ cairo_t pool[CAIRO_STASH_SIZE]; -+ int occupied; -+} _context_stash; -+ -+static cairo_t * -+_context_get (void) -+{ -+ int avail, old, new; -+ -+ old = _context_stash.occupied; -+ avail = ffs (~old) - 1; -+ if (avail >= CAIRO_STASH_SIZE) -+ return malloc (sizeof (cairo_t)); -+ -+ new = old | (1 << avail); -+ _context_stash.occupied = new; -+ -+ return &_context_stash.pool[avail]; -+} -+ -+static void -+_context_put (cairo_t *cr) -+{ -+ int old, new, avail; -+ -+ if (cr < &_context_stash.pool[0] || -+ cr >= &_context_stash.pool[CAIRO_STASH_SIZE]) -+ { -+ free (cr); -+ return; -+ } -+ -+ avail = ~(1 << (cr - &_context_stash.pool[0])); -+ old = _context_stash.occupied; -+ new = old & avail; -+ _context_stash.occupied = new; -+} -+#elif HAS_ATOMIC_OPS - /* We keep a small stash of contexts to reduce malloc pressure */ - #define CAIRO_STASH_SIZE 4 - static struct { diff --git a/gfx/cairo/avoid-extend-none.patch b/gfx/cairo/avoid-extend-none.patch deleted file mode 100644 index b3606cc2e..000000000 --- a/gfx/cairo/avoid-extend-none.patch +++ /dev/null @@ -1,39 +0,0 @@ -changeset: 93076:25d0c8a38d7d -tag: none -tag: qbase -tag: qtip -tag: tip -user: Jeff Muizelaar <jmuizelaar@mozilla.com> -date: Thu May 03 15:21:52 2012 -0400 -summary: Bug 751668. Avoid incorrectly using EXTEND_NONE. r=joe - -diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c ---- a/gfx/cairo/cairo/src/cairo-image-surface.c -+++ b/gfx/cairo/cairo/src/cairo-image-surface.c -@@ -1390,25 +1390,16 @@ static pixman_image_t * - cairo_image_surface_t *source = (cairo_image_surface_t *) pattern->surface; - cairo_surface_type_t type; - - if (source->base.backend->type == CAIRO_INTERNAL_SURFACE_TYPE_SNAPSHOT) - source = (cairo_image_surface_t *) ((cairo_surface_snapshot_t *) pattern->surface)->target; - - type = source->base.backend->type; - if (type == CAIRO_SURFACE_TYPE_IMAGE) { -- if (extend != CAIRO_EXTEND_NONE && -- sample.x >= 0 && -- sample.y >= 0 && -- sample.x + sample.width <= source->width && -- sample.y + sample.height <= source->height) -- { -- extend = CAIRO_EXTEND_NONE; -- } -- - if (sample.width == 1 && sample.height == 1) { - if (sample.x < 0 || - sample.y < 0 || - sample.x >= source->width || - sample.y >= source->height) - { - if (extend == CAIRO_EXTEND_NONE) - return _pixman_transparent_image (); - diff --git a/gfx/cairo/bgr.patch b/gfx/cairo/bgr.patch deleted file mode 100644 index af72fa237..000000000 --- a/gfx/cairo/bgr.patch +++ /dev/null @@ -1,104 +0,0 @@ -commit d2120bdb06c9aacc470bb346d6bc2071c2e0749d -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Fri Mar 12 15:32:09 2010 -0500 - - BGR - -diff --git a/src/cairo-surface.c b/src/cairo-surface.c -index 332e3ab..4a1d6a0 100644 ---- a/src/cairo-surface.c -+++ b/src/cairo-surface.c -@@ -1501,7 +1501,9 @@ static void - _wrap_release_source_image (void *data) - { - struct acquire_source_image_data *acquire_data = data; -- _cairo_surface_release_source_image (acquire_data->src, acquire_data->image, acquire_data->image_extra); -+ _cairo_surface_release_source_image (acquire_data->src, -+ acquire_data->image, -+ acquire_data->image_extra); - free(data); - } - -@@ -1515,42 +1517,47 @@ _wrap_image (cairo_surface_t *src, - cairo_image_surface_t *surface; - cairo_status_t status; - -- struct acquire_source_image_data *data = malloc(sizeof(*data)); -+ struct acquire_source_image_data *data = malloc (sizeof (*data)); -+ if (unlikely (data == NULL)) -+ return _cairo_error (CAIRO_STATUS_NO_MEMORY); - data->src = src; - data->image = image; - data->image_extra = image_extra; - -- surface = (cairo_image_surface_t*)cairo_image_surface_create_for_data (image->data, -- image->format, -- image->width, -- image->height, -- image->stride); -+ surface = (cairo_image_surface_t*) -+ _cairo_image_surface_create_with_pixman_format (image->data, -+ image->pixman_format, -+ image->width, -+ image->height, -+ image->stride); - status = surface->base.status; -- if (status) -+ if (status) { -+ free (data); - return status; -+ } - - status = _cairo_user_data_array_set_data (&surface->base.user_data, -- &wrap_image_key, -- data, -- _wrap_release_source_image); -+ &wrap_image_key, -+ data, -+ _wrap_release_source_image); - if (status) { - cairo_surface_destroy (&surface->base); -+ free (data); - return status; - } --/* -- pixman_image_set_component_alpha (surface->pixman_image, -- pixman_image_get_component_alpha (image->pixman_image)); --*/ -+ -+ pixman_image_set_component_alpha ( -+ surface->pixman_image, -+ pixman_image_get_component_alpha (image->pixman_image)); -+ - *out = surface; - return CAIRO_STATUS_SUCCESS; - } - -- - /** - * _cairo_surface_clone_similar: - * @surface: a #cairo_surface_t - * @src: the source image -- * @content: target content mask - * @src_x: extent for the rectangle in src we actually care about - * @src_y: extent for the rectangle in src we actually care about - * @width: extent for the rectangle in src we actually care about -@@ -1627,12 +1634,12 @@ _cairo_surface_clone_similar (cairo_surface_t *surface, - _cairo_surface_release_source_image (src, image, image_extra); - } else { - status = -- surface->backend->clone_similar (surface, &image->base, -- src_x, src_y, -- width, height, -- clone_offset_x, -- clone_offset_y, -- clone_out); -+ surface->backend->clone_similar (surface, &image->base, -+ src_x, src_y, -+ width, height, -+ clone_offset_x, -+ clone_offset_y, -+ clone_out); - cairo_surface_destroy(&image->base); - } - } diff --git a/gfx/cairo/buggy-repeat.patch b/gfx/cairo/buggy-repeat.patch deleted file mode 100644 index 3d27b8f9b..000000000 --- a/gfx/cairo/buggy-repeat.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-xlib-display.c b/gfx/cairo/cairo/src/cairo-xlib-display.c ---- a/gfx/cairo/cairo/src/cairo-xlib-display.c -+++ b/gfx/cairo/cairo/src/cairo-xlib-display.c -@@ -216,6 +216,8 @@ _cairo_xlib_display_get (Display *dpy) - XExtCodes *codes; - int major_unused, minor_unused; - -+ static int buggy_repeat_force = -1; -+ - /* There is an apparent deadlock between this mutex and the - * mutex for the display, but it's actually safe. For the - * app to call XCloseDisplay() while any other thread is -@@ -308,6 +310,26 @@ _cairo_xlib_display_get (Display *dpy) - if (VendorRelease (dpy) <= 40500000) - display->buggy_repeat = TRUE; - } -+ -+ /* XXX workaround; see https://bugzilla.mozilla.org/show_bug.cgi?id=413583 */ -+ /* If buggy_repeat_force == -1, then initialize. -+ * - set to -2, meaning "nothing was specified", and we trust the above detection. -+ * - if MOZ_CAIRO_BUGGY_REPEAT is '0' (exactly), then force buggy repeat off -+ * - if MOZ_CAIRO_BUGGY_REPEAT is '1' (exactly), then force buggy repeat on -+ */ -+ if (buggy_repeat_force == -1) { -+ const char *flag = getenv("MOZ_CAIRO_FORCE_BUGGY_REPEAT"); -+ -+ buggy_repeat_force = -2; -+ -+ if (flag && flag[0] == '0') -+ buggy_repeat_force = 0; -+ else if (flag && flag[0] == '1') -+ buggy_repeat_force = 1; -+ } -+ -+ if (buggy_repeat_force != -2) -+ display->buggy_repeat = (buggy_repeat_force == 1); - - display->next = _cairo_xlib_display_list; - _cairo_xlib_display_list = display; diff --git a/gfx/cairo/cache-size.patch b/gfx/cairo/cache-size.patch deleted file mode 100644 index 2371046aa..000000000 --- a/gfx/cairo/cache-size.patch +++ /dev/null @@ -1,19 +0,0 @@ -commit c32b57b9ada7a57ec20648629ecb83de5688682a -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Mon Mar 23 11:28:12 2009 -0400 - - shrink cache size - -diff --git a/src/cairo-scaled-font.c b/src/cairo-scaled-font.c -index 249ab6c..aa7fc11 100644 ---- a/src/cairo-scaled-font.c -+++ b/src/cairo-scaled-font.c -@@ -63,7 +63,7 @@ - */ - - /* XXX: This number is arbitrary---we've never done any measurement of this. */ --#define MAX_GLYPH_PAGES_CACHED 512 -+#define MAX_GLYPH_PAGES_CACHED 256 - static cairo_cache_t *cairo_scaled_glyph_page_cache; - - #define CAIRO_SCALED_GLYPH_PAGE_SIZE 32 diff --git a/gfx/cairo/cairo-clamp-boundary.patch b/gfx/cairo/cairo-clamp-boundary.patch deleted file mode 100644 index 990f1161a..000000000 --- a/gfx/cairo/cairo-clamp-boundary.patch +++ /dev/null @@ -1,71 +0,0 @@ -# HG changeset patch -# User Milan Sreckovic <msreckovic@mozilla.com> -# Date 1362078121 18000 -# Node ID e9e6d97b153d8ec17ee03bb1deef1dec24c7a17c -# Parent c65d59d33aa86b7e75bc420ea3beda6201e0aceb -Bug 825721: clamp negative box starts and disallow negative sizes. r=jmuizelaar - -diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c ---- a/gfx/cairo/cairo/src/cairo-image-surface.c -+++ b/gfx/cairo/cairo/src/cairo-image-surface.c -@@ -1846,16 +1846,20 @@ static cairo_status_t - if (likely (status == CAIRO_STATUS_SUCCESS)) { - for (chunk = &clear.chunks; chunk != NULL; chunk = chunk->next) { - for (i = 0; i < chunk->count; i++) { - int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); - int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); - int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); - int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); - -+ x1 = (x1 < 0 ? 0 : x1); -+ y1 = (y1 < 0 ? 0 : y1); -+ if (x2 <= x1 || y2 <= y1) -+ continue; - pixman_fill ((uint32_t *) dst->data, dst->stride / sizeof (uint32_t), - PIXMAN_FORMAT_BPP (dst->pixman_format), - x1, y1, x2 - x1, y2 - y1, - 0); - } - } - } - -@@ -2669,16 +2673,18 @@ static cairo_status_t - const cairo_box_t *box = chunk->base; - - for (i = 0; i < chunk->count; i++) { - int x1 = _cairo_fixed_integer_ceil (box[i].p1.x); - int y1 = _cairo_fixed_integer_ceil (box[i].p1.y); - int x2 = _cairo_fixed_integer_floor (box[i].p2.x); - int y2 = _cairo_fixed_integer_floor (box[i].p2.y); - -+ x1 = (x1 < 0 ? 0 : x1); -+ y1 = (y1 < 0 ? 0 : y1); - if (x2 > x1 && y2 > y1) { - cairo_box_t b; - - pixman_fill ((uint32_t *) dst->data, - dst->stride / sizeof (uint32_t), - PIXMAN_FORMAT_BPP (dst->pixman_format), - x1, y1, x2 - x1, y2 - y1, - pixel); -@@ -2929,17 +2935,19 @@ static cairo_status_t - cairo_box_t *box = chunk->base; - - for (i = 0; i < chunk->count; i++) { - int x1 = _cairo_fixed_integer_round_down (box[i].p1.x); - int y1 = _cairo_fixed_integer_round_down (box[i].p1.y); - int x2 = _cairo_fixed_integer_round_down (box[i].p2.x); - int y2 = _cairo_fixed_integer_round_down (box[i].p2.y); - -- if (x2 == x1 || y2 == y1) -+ x1 = (x1 < 0 ? 0 : x1); -+ y1 = (y1 < 0 ? 0 : y1); -+ if (x2 <= x1 || y2 <= y1) - continue; - - pixman_fill ((uint32_t *) dst->data, dst->stride / sizeof (uint32_t), - PIXMAN_FORMAT_BPP (dst->pixman_format), - x1, y1, x2 - x1, y2 - y1, - pixel); - } - } diff --git a/gfx/cairo/cairo-mask-extends-bug.patch b/gfx/cairo/cairo-mask-extends-bug.patch deleted file mode 100644 index 325772d82..000000000 --- a/gfx/cairo/cairo-mask-extends-bug.patch +++ /dev/null @@ -1,41 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c ---- a/gfx/cairo/cairo/src/cairo-image-surface.c -+++ b/gfx/cairo/cairo/src/cairo-image-surface.c -@@ -1788,18 +1788,35 @@ static cairo_status_t - cairo_boxes_t *boxes) - { - cairo_boxes_t clear; - cairo_box_t box; - cairo_status_t status; - struct _cairo_boxes_chunk *chunk; - int i; - -- if (boxes->num_boxes < 1 && clip_region == NULL) -- return _cairo_image_surface_fixup_unbounded (dst, extents, NULL); -+ // If we have no boxes then we need to clear the entire extents -+ // because we have nothing to draw. -+ if (boxes->num_boxes < 1 && clip_region == NULL) { -+ int x = extents->unbounded.x; -+ int y = extents->unbounded.y; -+ int width = extents->unbounded.width; -+ int height = extents->unbounded.height; -+ -+ pixman_color_t color = { 0 }; -+ pixman_box32_t box = { x, y, x + width, y + height }; -+ -+ if (! pixman_image_fill_boxes (PIXMAN_OP_CLEAR, -+ dst->pixman_image, -+ &color, -+ 1, &box)) { -+ return _cairo_error (CAIRO_STATUS_NO_MEMORY); -+ } -+ return CAIRO_STATUS_SUCCESS; -+ } - - _cairo_boxes_init (&clear); - - box.p1.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); - box.p1.y = _cairo_fixed_from_int (extents->unbounded.y); - box.p2.x = _cairo_fixed_from_int (extents->unbounded.x); - box.p2.y = _cairo_fixed_from_int (extents->unbounded.y + extents->unbounded.height); - diff --git a/gfx/cairo/cairo-qt-compile.patch b/gfx/cairo/cairo-qt-compile.patch deleted file mode 100644 index f839c7988..000000000 --- a/gfx/cairo/cairo-qt-compile.patch +++ /dev/null @@ -1,21 +0,0 @@ -# HG changeset patch -# Parent 2563fa2763b0ea83394e785340afa4c564ceab57 -diff -r 2563fa2763b0 -r 9ab15e95a354 gfx/cairo/cairo/src/cairo-qt-surface.cpp ---- a/gfx/cairo/cairo/src/cairo-qt-surface.cpp Thu Apr 29 06:55:11 2010 +0300 -+++ b/gfx/cairo/cairo/src/cairo-qt-surface.cpp Thu Apr 29 06:55:51 2010 +0300 -@@ -204,6 +204,7 @@ - case CAIRO_OPERATOR_HSL_LUMINOSITY: - ASSERT_NOT_REACHED; - } -+ return QPainter::CompositionMode_Source; - } - - static bool -@@ -668,7 +669,6 @@ - static cairo_status_t - _cairo_qt_surface_clone_similar (void *abstract_surface, - cairo_surface_t *src, -- cairo_content_t content, - int src_x, - int src_y, - int width, diff --git a/gfx/cairo/cairo-region-clip.patch b/gfx/cairo/cairo-region-clip.patch deleted file mode 100644 index a0eb2d265..000000000 --- a/gfx/cairo/cairo-region-clip.patch +++ /dev/null @@ -1,34 +0,0 @@ -# HG changeset patch -# User Matt Woodrow <mwoodrow@mozilla.com> -# Date 1408674084 -43200 -# Fri Aug 22 14:21:24 2014 +1200 -# Node ID 2b819b882c3b26c02d821e8d713591a9b56f1728 -# Parent ffd1fc7e7d5a85e4823b5f2067b4a24d358a0e41 -Bug 1050788 - Fix cairo clip path region construction when the first path generates no traps. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-clip.c b/gfx/cairo/cairo/src/cairo-clip.c ---- a/gfx/cairo/cairo/src/cairo-clip.c -+++ b/gfx/cairo/cairo/src/cairo-clip.c -@@ -590,16 +590,22 @@ static cairo_int_status_t - status = _cairo_path_fixed_fill_rectilinear_to_traps (&clip_path->path, - clip_path->fill_rule, - &traps); - if (unlikely (_cairo_status_is_error (status))) - return status; - if (status == CAIRO_INT_STATUS_UNSUPPORTED) - goto UNSUPPORTED; - -+ if (unlikely (traps.num_traps == 0)) { -+ clip_path->region = cairo_region_create (); -+ clip_path->flags |= CAIRO_CLIP_PATH_HAS_REGION; -+ return CAIRO_STATUS_SUCCESS; -+ } -+ - if (traps.num_traps > ARRAY_LENGTH (stack_boxes)) { - boxes = _cairo_malloc_ab (traps.num_traps, sizeof (cairo_box_t)); - if (unlikely (boxes == NULL)) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - } - - for (n = 0; n < traps.num_traps; n++) { - boxes[n].p1.x = traps.traps[n].left.p1.x; diff --git a/gfx/cairo/cairo-version-fixes.patch b/gfx/cairo/cairo-version-fixes.patch deleted file mode 100644 index f55e85731..000000000 --- a/gfx/cairo/cairo-version-fixes.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-version.c b/gfx/cairo/cairo/src/cairo-version.c ---- a/gfx/cairo/cairo/src/cairo-version.c -+++ b/gfx/cairo/cairo/src/cairo-version.c -@@ -42,7 +42,7 @@ - - /* get the "real" version info instead of dummy cairo-version.h */ - #undef CAIRO_VERSION_H --#include "../cairo-version.h" -+#include "cairo-features.h" - - /** - * cairo_version: -diff --git a/gfx/cairo/cairo/src/cairo-version.h b/gfx/cairo/cairo/src/cairo-version.h ---- a/gfx/cairo/cairo/src/cairo-version.h -+++ b/gfx/cairo/cairo/src/cairo-version.h -@@ -7,8 +7,10 @@ - #ifndef CAIRO_VERSION_H - #define CAIRO_VERSION_H - -+#if 0 - #define CAIRO_VERSION_MAJOR USE_cairo_version_OR_cairo_version_string_INSTEAD - #define CAIRO_VERSION_MINOR USE_cairo_version_OR_cairo_version_string_INSTEAD - #define CAIRO_VERSION_MICRO USE_cairo_version_OR_cairo_version_string_INSTEAD -+#endif - - #endif diff --git a/gfx/cairo/cairo-x-visual.patch b/gfx/cairo/cairo-x-visual.patch deleted file mode 100644 index 29f6c737e..000000000 --- a/gfx/cairo/cairo-x-visual.patch +++ /dev/null @@ -1,160 +0,0 @@ -diff -r c1195334f839 gfx/cairo/cairo/src/cairo-xlib-surface.c ---- a/gfx/cairo/cairo/src/cairo-xlib-surface.c Fri May 21 17:42:55 2010 +0300 -+++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c Fri May 21 19:12:29 2010 +0300 -@@ -189,16 +189,57 @@ static const XTransform identity = { { - - #define CAIRO_SURFACE_RENDER_HAS_PDF_OPERATORS(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 11) - - #define CAIRO_SURFACE_RENDER_SUPPORTS_OPERATOR(surface, op) \ - ((op) <= CAIRO_OPERATOR_SATURATE || \ - (CAIRO_SURFACE_RENDER_HAS_PDF_OPERATORS(surface) && \ - (op) <= CAIRO_OPERATOR_HSL_LUMINOSITY)) - -+static Visual * -+_visual_for_xrender_format(Screen *screen, -+ XRenderPictFormat *xrender_format) -+{ -+ int d, v; -+ for (d = 0; d < screen->ndepths; d++) { -+ Depth *d_info = &screen->depths[d]; -+ if (d_info->depth != xrender_format->depth) -+ continue; -+ -+ for (v = 0; v < d_info->nvisuals; v++) { -+ Visual *visual = &d_info->visuals[v]; -+ -+ switch (visual->class) { -+ case TrueColor: -+ if (xrender_format->type != PictTypeDirect) -+ continue; -+ break; -+ case DirectColor: -+ /* Prefer TrueColor to DirectColor. -+ (XRenderFindVisualFormat considers both TrueColor and -+ DirectColor Visuals to match the same PictFormat.) */ -+ continue; -+ case StaticGray: -+ case GrayScale: -+ case StaticColor: -+ case PseudoColor: -+ if (xrender_format->type != PictTypeIndexed) -+ continue; -+ break; -+ } -+ -+ if (xrender_format == -+ XRenderFindVisualFormat (DisplayOfScreen(screen), visual)) -+ return visual; -+ } -+ } -+ -+ return NULL; -+} -+ - static cairo_status_t - _cairo_xlib_surface_set_clip_region (cairo_xlib_surface_t *surface, - cairo_region_t *region) - { - cairo_bool_t had_clip_rects = surface->clip_region != NULL; - - if (had_clip_rects == FALSE && region == NULL) - return CAIRO_STATUS_SUCCESS; -@@ -313,16 +354,19 @@ _cairo_xlib_surface_create_similar (void - * visual/depth etc. as possible. */ - pix = XCreatePixmap (src->dpy, src->drawable, - width <= 0 ? 1 : width, height <= 0 ? 1 : height, - xrender_format->depth); - - visual = NULL; - if (xrender_format == src->xrender_format) - visual = src->visual; -+ else -+ visual = _visual_for_xrender_format(src->screen->screen, -+ xrender_format); - - surface = (cairo_xlib_surface_t *) - _cairo_xlib_surface_create_internal (src->screen, pix, - visual, - xrender_format, - width, height, - xrender_format->depth); - } -@@ -3178,28 +3222,32 @@ cairo_xlib_surface_create_with_xrender_f - Screen *scr, - XRenderPictFormat *format, - int width, - int height) - { - cairo_xlib_screen_t *screen; - cairo_surface_t *surface; - cairo_status_t status; -+ Visual *visual; - - if (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX) - return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); - - status = _cairo_xlib_screen_get (dpy, scr, &screen); - if (unlikely (status)) - return _cairo_surface_create_in_error (status); - - X_DEBUG ((dpy, "create_with_xrender_format (drawable=%x)", (unsigned int) drawable)); - -+ if (format) -+ visual = _visual_for_xrender_format (scr, format); -+ - surface = _cairo_xlib_surface_create_internal (screen, drawable, -- NULL, format, -+ visual, format, - width, height, 0); - _cairo_xlib_screen_destroy (screen); - - return surface; - } - slim_hidden_def (cairo_xlib_surface_create_with_xrender_format); - - /** -@@ -3413,33 +3461,37 @@ cairo_xlib_surface_get_screen (cairo_sur - - return surface->screen->screen; - } - - /** - * cairo_xlib_surface_get_visual: - * @surface: a #cairo_xlib_surface_t - * -- * Get the X Visual used for underlying X Drawable. -+ * Gets the X Visual associated with @surface, suitable for use with the -+ * underlying X Drawable. If @surface was created by -+ * cairo_xlib_surface_create(), the return value is the Visual passed to that -+ * constructor. - * -- * Return value: the visual. -+ * Return value: the Visual or %NULL if there is no appropriate Visual for -+ * @surface. - * - * Since: 1.2 - **/ - Visual * --cairo_xlib_surface_get_visual (cairo_surface_t *abstract_surface) -+cairo_xlib_surface_get_visual (cairo_surface_t *surface) - { -- cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; -- -- if (! _cairo_surface_is_xlib (abstract_surface)) { -+ cairo_xlib_surface_t *xlib_surface = (cairo_xlib_surface_t *) surface; -+ -+ if (! _cairo_surface_is_xlib (surface)) { - _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); - return NULL; - } - -- return surface->visual; -+ return xlib_surface->visual; - } - - /** - * cairo_xlib_surface_get_depth: - * @surface: a #cairo_xlib_surface_t - * - * Get the number of bits used to represent each pixel value. - * diff --git a/gfx/cairo/cairo/COPYING b/gfx/cairo/cairo/COPYING index 145e62966..184e603c3 100644 --- a/gfx/cairo/cairo/COPYING +++ b/gfx/cairo/cairo/COPYING @@ -1,17 +1,11 @@ Cairo is free software. -Every source file in the implementation of cairo is available to be -redistributed and/or modified under the terms of either the GNU Lesser -General Public License (LGPL) version 2.1 or the Mozilla Public -License (MPL) version 1.1. Some files are available under more -liberal terms, but we believe that in all cases, each file may be used -under either the LGPL or the MPL. - -See the following files in this directory for the precise terms and -conditions of either license: - - COPYING-LGPL-2.1 - COPYING-MPL-1.1 - -Please see each file in the implementation for Copyright and licensing -information. +This (modified) version of the cairo implementation is available to be +redistributed and/or modified under the terms the Mozilla Public License +(MPL) version 2.0. Some files in the original cairo source code are +available under more liberal terms, but we believe that in all cases, +each file may be used under the MPL 2.0. + +Where the original code was not explicitly MPL licensed, the original +more liberal license information and copyright has been retained for +clarity of licensing and authorship. diff --git a/gfx/cairo/cairo/COPYING-LGPL-2.1 b/gfx/cairo/cairo/COPYING-LGPL-2.1 deleted file mode 100644 index b124cf581..000000000 --- a/gfx/cairo/cairo/COPYING-LGPL-2.1 +++ /dev/null @@ -1,510 +0,0 @@ - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations -below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it -becomes a de-facto standard. To achieve this, non-free programs must -be allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control -compilation and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at least - three years, to give the same user the materials specified in - Subsection 6a, above, for a charge no more than the cost of - performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply, and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License -may add an explicit geographical distribution limitation excluding those -countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms -of the ordinary General Public License). - - To apply these terms, attach the following notices to the library. -It is safest to attach them to the start of each source file to most -effectively convey the exclusion of warranty; and each file should -have at least the "copyright" line and a pointer to where the full -notice is found. - - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or -your school, if any, to sign a "copyright disclaimer" for the library, -if necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James - Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/gfx/cairo/cairo/COPYING-MPL-1.1 b/gfx/cairo/cairo/COPYING-MPL-1.1 deleted file mode 100644 index 7714141d1..000000000 --- a/gfx/cairo/cairo/COPYING-MPL-1.1 +++ /dev/null @@ -1,470 +0,0 @@ - MOZILLA PUBLIC LICENSE - Version 1.1 - - --------------- - -1. Definitions. - - 1.0.1. "Commercial Use" means distribution or otherwise making the - Covered Code available to a third party. - - 1.1. "Contributor" means each entity that creates or contributes to - the creation of Modifications. - - 1.2. "Contributor Version" means the combination of the Original - Code, prior Modifications used by a Contributor, and the Modifications - made by that particular Contributor. - - 1.3. "Covered Code" means the Original Code or Modifications or the - combination of the Original Code and Modifications, in each case - including portions thereof. - - 1.4. "Electronic Distribution Mechanism" means a mechanism generally - accepted in the software development community for the electronic - transfer of data. - - 1.5. "Executable" means Covered Code in any form other than Source - Code. - - 1.6. "Initial Developer" means the individual or entity identified - as the Initial Developer in the Source Code notice required by Exhibit - A. - - 1.7. "Larger Work" means a work which combines Covered Code or - portions thereof with code not governed by the terms of this License. - - 1.8. "License" means this document. - - 1.8.1. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed herein. - - 1.9. "Modifications" means any addition to or deletion from the - substance or structure of either the Original Code or any previous - Modifications. When Covered Code is released as a series of files, a - Modification is: - A. Any addition to or deletion from the contents of a file - containing Original Code or previous Modifications. - - B. Any new file that contains any part of the Original Code or - previous Modifications. - - 1.10. "Original Code" means Source Code of computer software code - which is described in the Source Code notice required by Exhibit A as - Original Code, and which, at the time of its release under this - License is not already Covered Code governed by this License. - - 1.10.1. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, process, - and apparatus claims, in any patent Licensable by grantor. - - 1.11. "Source Code" means the preferred form of the Covered Code for - making modifications to it, including all modules it contains, plus - any associated interface definition files, scripts used to control - compilation and installation of an Executable, or source code - differential comparisons against either the Original Code or another - well known, available Covered Code of the Contributor's choice. The - Source Code can be in a compressed or archival form, provided the - appropriate decompression or de-archiving software is widely available - for no charge. - - 1.12. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms of, this - License or a future version of this License issued under Section 6.1. - For legal entities, "You" includes any entity which controls, is - controlled by, or is under common control with You. For purposes of - this definition, "control" means (a) the power, direct or indirect, - to cause the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty percent - (50%) of the outstanding shares or beneficial ownership of such - entity. - -2. Source Code License. - - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, royalty-free, - non-exclusive license, subject to third party intellectual property - claims: - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer to use, reproduce, - modify, display, perform, sublicense and distribute the Original - Code (or portions thereof) with or without Modifications, and/or - as part of a Larger Work; and - - (b) under Patents Claims infringed by the making, using or - selling of Original Code, to make, have made, use, practice, - sell, and offer for sale, and/or otherwise dispose of the - Original Code (or portions thereof). - - (c) the licenses granted in this Section 2.1(a) and (b) are - effective on the date Initial Developer first distributes - Original Code under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: 1) for code that You delete from the Original Code; 2) - separate from the Original Code; or 3) for infringements caused - by: i) the modification of the Original Code or ii) the - combination of the Original Code with other software or devices. - - 2.2. Contributor Grant. - Subject to third party intellectual property claims, each Contributor - hereby grants You a world-wide, royalty-free, non-exclusive license - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor, to use, reproduce, modify, - display, perform, sublicense and distribute the Modifications - created by such Contributor (or portions thereof) either on an - unmodified basis, with other Modifications, as Covered Code - and/or as part of a Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either alone - and/or in combination with its Contributor Version (or portions - of such combination), to make, use, sell, offer for sale, have - made, and/or otherwise dispose of: 1) Modifications made by that - Contributor (or portions thereof); and 2) the combination of - Modifications made by that Contributor with its Contributor - Version (or portions of such combination). - - (c) the licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first makes Commercial Use of - the Covered Code. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: 1) for any code that Contributor has deleted from the - Contributor Version; 2) separate from the Contributor Version; - 3) for infringements caused by: i) third party modifications of - Contributor Version or ii) the combination of Modifications made - by that Contributor with other software (except as part of the - Contributor Version) or other devices; or 4) under Patent Claims - infringed by Covered Code in the absence of Modifications made by - that Contributor. - -3. Distribution Obligations. - - 3.1. Application of License. - The Modifications which You create or to which You contribute are - governed by the terms of this License, including without limitation - Section 2.2. The Source Code version of Covered Code may be - distributed only under the terms of this License or a future version - of this License released under Section 6.1, and You must include a - copy of this License with every copy of the Source Code You - distribute. You may not offer or impose any terms on any Source Code - version that alters or restricts the applicable version of this - License or the recipients' rights hereunder. However, You may include - an additional document offering the additional rights described in - Section 3.5. - - 3.2. Availability of Source Code. - Any Modification which You create or to which You contribute must be - made available in Source Code form under the terms of this License - either on the same media as an Executable version or via an accepted - Electronic Distribution Mechanism to anyone to whom you made an - Executable version available; and if made available via Electronic - Distribution Mechanism, must remain available for at least twelve (12) - months after the date it initially became available, or at least six - (6) months after a subsequent version of that particular Modification - has been made available to such recipients. You are responsible for - ensuring that the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a third party. - - 3.3. Description of Modifications. - You must cause all Covered Code to which You contribute to contain a - file documenting the changes You made to create that Covered Code and - the date of any change. You must include a prominent statement that - the Modification is derived, directly or indirectly, from Original - Code provided by the Initial Developer and including the name of the - Initial Developer in (a) the Source Code, and (b) in any notice in an - Executable version or related documentation in which You describe the - origin or ownership of the Covered Code. - - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If Contributor has knowledge that a license under a third party's - intellectual property rights is required to exercise the rights - granted by such Contributor under Sections 2.1 or 2.2, - Contributor must include a text file with the Source Code - distribution titled "LEGAL" which describes the claim and the - party making the claim in sufficient detail that a recipient will - know whom to contact. If Contributor obtains such knowledge after - the Modification is made available as described in Section 3.2, - Contributor shall promptly modify the LEGAL file in all copies - Contributor makes available thereafter and shall take other steps - (such as notifying appropriate mailing lists or newsgroups) - reasonably calculated to inform those who received the Covered - Code that new knowledge has been obtained. - - (b) Contributor APIs. - If Contributor's Modifications include an application programming - interface and Contributor has knowledge of patent licenses which - are reasonably necessary to implement that API, Contributor must - also include this information in the LEGAL file. - - (c) Representations. - Contributor represents that, except as disclosed pursuant to - Section 3.4(a) above, Contributor believes that Contributor's - Modifications are Contributor's original creation(s) and/or - Contributor has sufficient rights to grant the rights conveyed by - this License. - - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each file of the Source - Code. If it is not possible to put such notice in a particular Source - Code file due to its structure, then You must include such notice in a - location (such as a relevant directory) where a user would be likely - to look for such a notice. If You created one or more Modification(s) - You may add your name as a Contributor to the notice described in - Exhibit A. You must also duplicate this License in any documentation - for the Source Code where You describe recipients' rights or ownership - rights relating to Covered Code. You may choose to offer, and to - charge a fee for, warranty, support, indemnity or liability - obligations to one or more recipients of Covered Code. However, You - may do so only on Your own behalf, and not on behalf of the Initial - Developer or any Contributor. You must make it absolutely clear than - any such warranty, support, indemnity or liability obligation is - offered by You alone, and You hereby agree to indemnify the Initial - Developer and every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of warranty, - support, indemnity or liability terms You offer. - - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form only if the - requirements of Section 3.1-3.5 have been met for that Covered Code, - and if You include a notice stating that the Source Code version of - the Covered Code is available under the terms of this License, - including a description of how and where You have fulfilled the - obligations of Section 3.2. The notice must be conspicuously included - in any notice in an Executable version, related documentation or - collateral in which You describe recipients' rights relating to the - Covered Code. You may distribute the Executable version of Covered - Code or ownership rights under a license of Your choice, which may - contain terms different from this License, provided that You are in - compliance with the terms of this License and that the license for the - Executable version does not attempt to limit or alter the recipient's - rights in the Source Code version from the rights set forth in this - License. If You distribute the Executable version under a different - license You must make it absolutely clear that any terms which differ - from this License are offered by You alone, not by the Initial - Developer or any Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred by - the Initial Developer or such Contributor as a result of any such - terms You offer. - - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code with other code - not governed by the terms of this License and distribute the Larger - Work as a single product. In such a case, You must make sure the - requirements of this License are fulfilled for the Covered Code. - -4. Inability to Comply Due to Statute or Regulation. - - If it is impossible for You to comply with any of the terms of this - License with respect to some or all of the Covered Code due to - statute, judicial order, or regulation then You must: (a) comply with - the terms of this License to the maximum extent possible; and (b) - describe the limitations and the code they affect. Such description - must be included in the LEGAL file described in Section 3.4 and must - be included with all distributions of the Source Code. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Application of this License. - - This License applies to code to which the Initial Developer has - attached the notice in Exhibit A and to related Covered Code. - -6. Versions of the License. - - 6.1. New Versions. - Netscape Communications Corporation ("Netscape") may publish revised - and/or new versions of the License from time to time. Each version - will be given a distinguishing version number. - - 6.2. Effect of New Versions. - Once Covered Code has been published under a particular version of the - License, You may always continue to use it under the terms of that - version. You may also choose to use such Covered Code under the terms - of any subsequent version of the License published by Netscape. No one - other than Netscape has the right to modify the terms applicable to - Covered Code created under this License. - - 6.3. Derivative Works. - If You create or use a modified version of this License (which you may - only do in order to apply it to code which is not already Covered Code - governed by this License), You must (a) rename Your license so that - the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", - "MPL", "NPL" or any confusingly similar phrase do not appear in your - license (except to note that your license differs from this License) - and (b) otherwise make it clear that Your version of the license - contains terms which differ from the Mozilla Public License and - Netscape Public License. (Filling in the name of the Initial - Developer, Original Code or Contributor in the notice described in - Exhibit A shall not of themselves be deemed to be modifications of - this License.) - -7. DISCLAIMER OF WARRANTY. - - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF - DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. - THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE - IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, - YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE - COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER - OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -8. TERMINATION. - - 8.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to cure - such breach within 30 days of becoming aware of the breach. All - sublicenses to the Covered Code which are properly granted shall - survive any termination of this License. Provisions which, by their - nature, must remain in effect beyond the termination of this License - shall survive. - - 8.2. If You initiate litigation by asserting a patent infringement - claim (excluding declatory judgment actions) against Initial Developer - or a Contributor (the Initial Developer or Contributor against whom - You file such action is referred to as "Participant") alleging that: - - (a) such Participant's Contributor Version directly or indirectly - infringes any patent, then any and all rights granted by such - Participant to You under Sections 2.1 and/or 2.2 of this License - shall, upon 60 days notice from Participant terminate prospectively, - unless if within 60 days after receipt of notice You either: (i) - agree in writing to pay Participant a mutually agreeable reasonable - royalty for Your past and future use of Modifications made by such - Participant, or (ii) withdraw Your litigation claim with respect to - the Contributor Version against such Participant. If within 60 days - of notice, a reasonable royalty and payment arrangement are not - mutually agreed upon in writing by the parties or the litigation claim - is not withdrawn, the rights granted by Participant to You under - Sections 2.1 and/or 2.2 automatically terminate at the expiration of - the 60 day notice period specified above. - - (b) any software, hardware, or device, other than such Participant's - Contributor Version, directly or indirectly infringes any patent, then - any rights granted to You by such Participant under Sections 2.1(b) - and 2.2(b) are revoked effective as of the date You first made, used, - sold, distributed, or had made, Modifications made by that - Participant. - - 8.3. If You assert a patent infringement claim against Participant - alleging that such Participant's Contributor Version directly or - indirectly infringes any patent where such claim is resolved (such as - by license or settlement) prior to the initiation of patent - infringement litigation, then the reasonable value of the licenses - granted by such Participant under Sections 2.1 or 2.2 shall be taken - into account in determining the amount or value of any payment or - license. - - 8.4. In the event of termination under Sections 8.1 or 8.2 above, - all end user license agreements (excluding distributors and resellers) - which have been validly granted by You or any distributor hereunder - prior to termination shall survive termination. - -9. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL - DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, - OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR - ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY - CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, - WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY - RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW - PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE - EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO - THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -10. U.S. GOVERNMENT END USERS. - - The Covered Code is a "commercial item," as that term is defined in - 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer - software" and "commercial computer software documentation," as such - terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 - C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), - all U.S. Government End Users acquire Covered Code with only those - rights set forth herein. - -11. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed by - California law provisions (except to the extent applicable law, if - any, provides otherwise), excluding its conflict-of-law provisions. - With respect to disputes in which at least one party is a citizen of, - or an entity chartered or registered to do business in the United - States of America, any litigation relating to this License shall be - subject to the jurisdiction of the Federal Courts of the Northern - District of California, with venue lying in Santa Clara County, - California, with the losing party responsible for costs, including - without limitation, court costs and reasonable attorneys' fees and - expenses. The application of the United Nations Convention on - Contracts for the International Sale of Goods is expressly excluded. - Any law or regulation which provides that the language of a contract - shall be construed against the drafter shall not apply to this - License. - -12. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or indirectly, - out of its utilization of rights under this License and You agree to - work with Initial Developer and Contributors to distribute such - responsibility on an equitable basis. Nothing herein is intended or - shall be deemed to constitute any admission of liability. - -13. MULTIPLE-LICENSED CODE. - - Initial Developer may designate portions of the Covered Code as - "Multiple-Licensed". "Multiple-Licensed" means that the Initial - Developer permits you to utilize portions of the Covered Code under - Your choice of the NPL or the alternative licenses, if any, specified - by the Initial Developer in the file described in Exhibit A. - -EXHIBIT A -Mozilla Public License. - - ``The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - - The Original Code is ______________________________________. - - The Initial Developer of the Original Code is ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. - - Contributor(s): ______________________________________. - - Alternatively, the contents of this file may be used under the terms - of the _____ license (the "[___] License"), in which case the - provisions of [______] License are applicable instead of those - above. If you wish to allow use of your version of this file only - under the terms of the [____] License and not to allow others to use - your version of this file under the MPL, indicate your decision by - deleting the provisions above and replace them with the notice and - other provisions required by the [___] License. If you do not delete - the provisions above, a recipient may use your version of this file - under either the MPL or the [___] License." - - [NOTE: The text of this Exhibit A may differ slightly from the text of - the notices in the Source Code files of the Original Code. You should - use the text of this Exhibit A rather than the text found in the - Original Code Source Code for Your Modifications.] - diff --git a/gfx/cairo/cairo/INSTALL b/gfx/cairo/cairo/INSTALL deleted file mode 100644 index dfff8bebb..000000000 --- a/gfx/cairo/cairo/INSTALL +++ /dev/null @@ -1,187 +0,0 @@ -Quick-start build instructions ------------------------------- -1) Configure the package: - - ./configure - -2) Compile it: - - make - -3) Install it: - - make install - -This final step may require temporary root access (eg. with sudo) if -you don't have write permission to the directory in which cairo will -be installed. - -NOTE: If you are working with source from git/cvs rather than from a tar -file, then you should use ./autogen.sh in place of ./configure -anywhere it is mentioned in these instructions. - -More detailed build instructions --------------------------------- -1) Configure the package - - The first step in building cairo is to configure the package by - running the configure script. [Note: if you don't have a configure - script, skip down below to the Extremely detailed build - instructions.] - - The configure script attempts to automatically detect as much as - possible about your system. So, you should primarily just accept - its defaults by running: - - ./configure - - The configure script does accept a large number of options for - fine-tuning its behavior. See "./configure --help" for a complete - list. The most commonly used options are discussed here. - - --prefix=PREFIX - - This option specifies the directory under which the software - should be installed. By default configure will choose a - directory such as /usr/local. If you would like to install - cairo to some other location, pass the director to configure - with the --prefix option. For example: - - ./configure --prefix=/opt/cairo - - would install cairo into the /opt/cairo directory. You could - also choose a prefix directory within your home directory if - you don't have write access to any system-wide directory. - - After installing into a custom prefix, you will need to set - some environment variables to allow the software to be - found. Assuming the /opt/cairo prefix and assuming you are - using the bash shell, the following environment variables - should be set: - - PKG_CONFIG_PATH=/opt/cairo/lib/pkgconfig - LD_LIBRARY_PATH=/opt/cairo/lib - export PKG_CONFIG_PATH LD_LIBRARY_PATH - - (NOTE: On Mac OS X, at least, use DYLD_LIBRARY_PATH in place - of LD_LIBRARY_PATH above.) - - --enable-quartz - --enable-atsui - --enable-xcb - --enable-glitz - --enable-beos - --enable-os2 - --enable-directfb - - Some of cairo's backends are marked as experimental and will - not be built by default. If you would like to build and - experiment with these backends, you will need to pass one of - the above options to the configure script. You may need to - have certain libraries installed first as discussed in the - dependencies section of the README file. - - --disable-xlib - --disable-win32 - --disable-png - --disable-freetype - --disable-ps - --disable-pdf - --disable-svg - - Cairo's configure script detects the libraries needed to build - each stable backend, and when it finds them, enables each - backend. If you would like to override this detection and - disable a backend, (even when it would be possible to build - it), use one of the options above to disable the backend. - -2) Compile the package: - - This step is very simple. Just: - - make - - The Makefiles included with cairo are designed to work on as many - different systems as possible. - - When cairo is compiled, you can also run some automated tests of - cairo with: - - make check - - NOTE: Some versions of X servers will cause the -xlib tests to - report failures in make check even when cairo is working just - fine. If you see failures in nothing but -xlib tests, please - examine the corresponding -xlib-out.png images and compare them to - the -ref.png reference images (the -xlib-diff.png images might also - be useful). If the results seem "close enough" please do not report - a bug against cairo as the "failures" you are seeing are just due - to subtle variations in X server implementations. - -3) Install the package: - - The final step is to install the package with: - - make install - - If you are installing to a system-wide location you may need to - temporarily acquire root access in order to perform this - operation. A good way to do this is to use the sudo program: - - sudo make install - -Extremely detailed build instructions -------------------------------------- -So you want to build cairo but it didn't come with a configure -script. This is probably because you have checked out the latest -in-development code via git. If you need to be on the bleeding edge, -(for example, because you're wanting to develop some aspect of cairo -itself), then you're in the right place and should read on. - -However, if you don't need such a bleeding-edge version of cairo, then -you might prefer to start by building the latest stable cairo release: - - http://cairographics.org/releases - -or perhaps the latest (unstable) development snapshot: - - http://cairographics.org/snapshots - -There you'll find nicely packaged tar files that include a configure -script so you can go back the the simpler instructions above. - -But you're still reading, so you're someone that loves to -learn. Excellent! We hope you'll learn enough to make some excellent -contributions to cairo. Since you're not using a packaged tar file, -you're going to need some additional tools beyond just a C compiler in -order to compile cairo. Specifically, you need the following utilities: - - automake (1.8 or newer) - autoconf - libtool - -Hopefully your platform of choice has packages readily available so -that you can easily install things with your system's package -management tool, (such as "apt-get install automake" on Debian or "yum -install automake" on Fedora, etc.). Note that Mac OS X ships with it's -own utility called libtool which is not what you want, (the one you do -want goes by the name of glibtool). - -Once you have all of those packages installed, the next step is to run -the autogen.sh script. That can be as simple as: - - ./autogen.sh - -Or, if you're using Mac OS X, you'll have to let it know to use -glibtool by instead doing: - - LIBTOOLIZE=glibtoolize ./autogen.sh - -But before you run that command, note that the autogen.sh script -accepts all the same arguments as the configure script, (and in fact, -will generate the configure script and run it with the arguments you -provide). So go back up to step (1) above and see what additional -arguments you might want to pass, (such as prefix). Then continue with -the instructions, simply using ./autogen.sh in place of ./configure. - -Happy hacking! diff --git a/gfx/cairo/cairo/NEWS b/gfx/cairo/cairo/NEWS deleted file mode 100644 index 9be4062ca..000000000 --- a/gfx/cairo/cairo/NEWS +++ /dev/null @@ -1,5121 +0,0 @@ -Release 1.6.4 (2008-04-11 Carl Worth <cworth@cworth.org>) -========================================================= -The cairo community is wildly embarrassed to announce the 1.6.4 -release of the cairo graphics library. This release reverts the xlib -locking change introduced in 1.6.4, (and the application crashes that -it caused). The community would be glad to sack its current release -manager and is accepting applications for someone who could do the job -with more discipline. - -Revert 'add missing locking in cairo-xlib' ------------------------------------------- -This change was introduced in cairo 1.6.2, but also introduced a bug -which causes many cairo-xlib applications to crash, (with a -segmentation fault inside of XSetClipMask). Instead of attempting -another fix for the broken fix, the change in 1.6.2 has been -reverted. The original bug which the change was addressing has been -present since at least cairo 1.4, so it is not expected that leaving -this bug unfixed will cause any new problems for applications moving -from cairo 1.4 to cairo 1.6. - -At this point, the code of cairo 1.6.4 differs from cairo 1.6.0 only -in the fix for the PostScript-printer crashes. - -Tweak build to avoid linking with g++ -------------------------------------- -Cairo 1.6.4 avoids a quirk in automake that was causing the cairo -library to be linked with g++ and linked against libstdc++ even when -only C source files were compiled for the library. - -Release 1.6.2 (2008-04-11 Carl Worth <cworth@cworth.org>) -========================================================= -The cairo community is pleased (but somewhat sheepish) to announce the -1.6.2 release of the cairo graphics library. This is an update to -yesterday's 1.6.0 release with an important fix to prevent cairo's -PostScript output from crashing some printers. This release also -includes a locking fix for cairo's xlib backend to improve thread -safety. There are no changes beyond these two fixes. - -Fix for PostScript printer crash --------------------------------- -Adrian Johnson discovered that cairo 1.6.0 was being a bit hard on -PostScript printers, by changing the font matrix very frequently. This -causes some PostScript interpreters to allocate new font objects every -few glyphs, eventually exhausting available resources. The fix -involves leaving translational components of the font matrix as zero, -so that the PostScript interpreter sees an identical font matrix -repeatedly, and can more easily share internal font object resources. - -This fix has been tested to resolve the bugs posted here, (for both -Xerox and Dell printers): - - Printing some PDFs from evince is crashing our Xerox printer - http://bugs.freedesktop.org/show_bug.cgi?id=15348 - - Cairo-generated postscript blocks Dell 5100cn - http://bugs.freedesktop.org/show_bug.cgi?id=15445 - -Add missing locking in cairo-xlib ---------------------------------- -Chris Wilson noticed that cairo 1.6.0 was manipulating an internal -cache of GC object within cairo's Xlib backend without proper -locking. The missing locking could cause failures for multi-threaded -applications. He fixed this in 1.6.2 by adding the missing locks. - -Release 1.6.0 (2008-04-10 Carl Worth <cworth@cworth.org>) -========================================================= -The cairo community is quite pleased to announce the 1.6.0 release of -the cairo graphics library. This is a major update to cairo, with new -features and enhanced functionality which maintains compatibility for -applications written using cairo 1.4, 1.2, or 1.0. We recommend that -anybody using a previous version of cairo upgrade to cairo 1.6.0. - -The most significant new features in this release are dramatically -improved PDF and PostScript[*] output, support for arbitrary X server -visuals (including PseudoColor), a new Quartz backend, and and a new -"win32 printing" backend. See below for more details on these and -other new features. - -New dependency on external pixman library (Thanks, Søren!) ----------------------------------------------------------- -As of cairo 1.6, cairo now depends on the pixman library, for which -the latest release can be obtained alongside cairo: - - http://cairographics.org/releases/pixman-0.10.0.tar.gz - -This library provides all software rendering for cairo, (the -implementation of the image backend as well as any image fallbacks -required for other backends). This is the same code that was -previously included as part of cairo itself, but is now an external -library so that it can be shared by both cairo and by the X server, -(which is where the code originated). - -Improved PDF, PostScript, and SVG output (Thanks, Adrian!) ----------------------------------------------------------- -Users of the cairo-pdf, cairo-ps, and cairo-svg should see a dramatic -improvement from cairo 1.2/1.4 to 1.6. With this release there are now -almost no operations that will result in unnecessary rasterization in -the PDF and PostScript. Rasterized "image fallbacks" are restricted -only to minimal portions of the document where something is being -drawn with cairo that is beyond the native capabilities of the -document, (this is rare for PDF or SVG, but occurs when blending -translucent objects for PostScript). - -This means that the final output will be of higher quality, and will -also be much smaller, and therefore will print more quickly. The -machinery for doing analysis and minimal fallbacks also benefits the -win32-printing surface described below. - -In addition to doing less rasterization, the PostScript and PDF output -also has several other improvements to make the output more efficient -and more compatible with specifications. - -[*] Note: Just before this release, a bug has been reported that the -PostScript output from cairo can crash some printers, (so far the -following models have been reported as problematic Xerox Workcentre -7228 or 7328 and Dell 5100cn). We will implement a workaround as soon -as we can learn exactly what in cairo's output these printers object -to, (and we could use help from users that have access to misbehaving -printers). This bug is being tracked here: - - Printing some PDFs from evince is crashing our Xerox printer - http://bugs.freedesktop.org/show_bug.cgi?id=15348 - -New support for arbitrary X server visuals (Thanks, Keith and Behdad!) ----------------------------------------------------------------------- -As of cairo 1.6, cairo should now work with an arbitrary TrueColor or -8-bit PseudoColor X server visual. Previous versions of cairo did not -support these X servers and refused to draw anything. We're pleased to -announce that this limitation has been lifted and people stuck with -ancient display systems need no longer be stuck with ancient software -just because of cairo. - -New, supported Quartz backend for Mac OS X (Thanks, Brian and Vladimir!) ------------------------------------------------------------------------- -As of cairo 1.6, the cairo-quartz backend is now marked as "supported" -rather than "experimental" as in previous cairo releases. Its API now -has guarantees of API stability into future cairo releases, and its -output quality is comparable to other backends. There have been -significant improvements to cairo-quartz since 1.4. It now uses many -fewer image fallbacks, (meaning better performance), and has greatly -improved text rendering. - -New, "win32 printing" backend (Thanks, Adrian and Vladimir!) ------------------------------------------------------------- -A new win32-printing surface has been added with an interface very -similar to the original win32 surface, (both accept an HDC -parameter). But this new surface should only be called with a printing -DC, and will result in all drawing commands being stored into a -meta-surface and emitted after each page is complete. This allows -cairo to analyze the contents, (as it does with PDF, PostScript, and -SVG backends), and to do minimal image-based fallbacks as -necessary. The analysis keeps things as efficient as possible, while -the presence of fallbacks, (when necessary), ensure the consistent, -high-quality output expected from cairo. - -Robustness fixes (Thanks, Chris!) ---------------------------------- -There has been a tremendous number of improvements to cairo's -robustness. Areas that have been improved include: - - * Proper reporting of errors - - * Responding correctly to invalid input - - * Avoiding integer overflows - - * Avoiding memory leaks on error-recovery paths - - * Making reference counting thread safe - - * Exhaustive testing of memory allocation points - -Other fixes (Thanks, everybody!) --------------------------------- -Cairo's internal fixed-point representation has been changed from -16.16 to 24.8. This has a direct impact on applications as it allows -much larger objects to be drawn before internal limits in cairo make -the drawing not work. - -The CAIRO_EXTEND_PAD mode is now fully supported by surface -patterns. This mode allows applications to use cairo_rectangle and -cairo_fill to draw scaled images with high-quality bilinear filtering -for the internal of the image, but without any objectionably blurry -edges, (as would happen with the default EXTEND_NONE and cairo_paint). - -Rendering with CAIRO_ANTIALIAS_NONE has been fixed to be more -predictable, (previously image rendering and geometry rendering would -be slightly misaligned with respect to each other). - -The reference manual at http://cairographics.org/manual now documents -100% of the functions and types in cairo's public API. - -API additions -------------- -Several small features have been added to cairo with new API functions: - -cairo_format_stride_for_width - - Must be called to compute a properly aligned stride value before - calling cairo_image_surface_create_for_data. - -cairo_has_current_point - - Allows querying if there is a current point defined for the - current path. - -cairo_path_extents - - Allows querying for path extents, (independent of any fill or - stroke parameters). - -cairo_surface_copy_page -cairo_surface_show_page - - Allow beginning a new document page without requiring a cairo_t - object. - -cairo_ps_surface_restrict_to_level -cairo_ps_get_levels -cairo_ps_level_to_string -cairo_ps_surface_set_eps - - Allow controlling the Post PostScript level, (2 or 3), to - target, as well as to generate Encapsulated PostScript (EPS). - -cairo_quartz_font_face_create_for_cgfont - - Create a quartz-specific cairo_font_face_t from a CGFontRef. - -cairo_win32_font_face_create_for_logfontw_hfont - - Create a win32-specific cairo_font_face from a LOGFONTW and an - HFONT together. - -Thanks, Everyone! ------------------ -I've accounted for 32 distinct people with attributed code added to -cairo between 1.4.14 and 1.6.0, (their names are below). That's an -impressive number, but there are certainly dozens more that -contributed with testing, suggestions, clarifying questions, and -encouragement. I'm grateful for the friendships that have developed as -we have worked on cairo together. Thanks to everyone for making this -all so much fun! - -Adrian Johnson, Alp Toker, Antoine Azar, Behdad Esfahbod, -Benjamin Otte, Bernardo Innocenti, Bertram Felgenhauer, -Boying Lu, Brian Ewins, Carl Worth, Chris Heath, Chris Wilson, -Claudio Ciccani, Emmanuel Pacaud, Jeff Muizelaar, Jeremy Huddleston, -Jim Meyering, Jinghua Luo, Jody Goldberg, Jonathan Gramain, -Keith Packard, Ken Herron, Kouhei Sutou, Kristian Høgsberg, -Larry Ewing, Martin Ejdestig, Nis Martensen, Peter Weilbacher, -Richard Hult, Shailendra Jain, Søren Sandmann Pedersen, -Vladimir Vukicevic - -Snapshot 1.5.20 (2008-04-04 Carl Worth <cworth@cworth.org>) -=========================================================== -This is the tenth snapshot in cairo's unstable 1.5 series. It comes -just two days (and only one working day) after the 1.5.18 -snapshot. The quick snapshot is due to two embarrassing bugs (both -affecting cairo-xlib) that had been introduced in the 1.5.18 -snapshot. The fixes for these are described below along with a few -other fixes, (which hopefully aren't introducing new bugs this time). - -cairo-xlib ----------- -Revert fix from 1.5.18 to allow pattern expansion based on the filter -mode. This fix seemed so boring, (the use case it addresses is almost -never used in practice), that it didn't even get mentioned in the -1.5.18 release notes. However, the "fix" happened to break rendering -that is always used resulting in corrupt image rendering in mozilla, -evolution, and probably everything else that uses cairo. - -Fix to avoid BadMatch errors in cairo_surface_create_similar. These -were introduced, (inadvertently, of course), as part of the fix in -1.5.18 for creating similar surfaces without the Render -extension. Again, thanks to mozilla, (and Vladimir Vukicevic in -particular), for noticing our mistake. - -general -------- -Correctly handle an in-error surface in -cairo_surface_write_to_png. Previously this function would cause an -assertion failure if you gave it a finished surface. Now it cleanly -returns a CAIRO_STATUS_SURFACE_FINISHED result instead. - -Avoid potentially infinite wandering through memory inside -_cairo_hull_prev_valid. Thanks to Jonathan Watt for noticing this -problem: - - https://bugzilla.mozilla.org/show_bug.cgi?id=306649#c21 - -cairo-pdf ---------- -Fix generation of "soft" masks made by drawing to a similar surface -and then calling cairo_mask_surface() with it. - -cairo-svg ---------- -Fix for code that uses cairo_mask() on an intermediate surface which -is later passed to cairo_mask_surface(). - -Snapshot 1.5.18 (2008-04-05 Carl Worth <cworth@cworth.org>) -=========================================================== -This is the ninth snapshot in cairo's unstable 1.5 series. It comes -just 4 days after the 1.5.16 snapshot. We had hoped to not need -another snapshot before the final 1.6.0 release, but several critical -bugs were found and fixed in the last few days, so we thought it -important to let people test the fixes with this snapshot. See below -for details. - -documentation -------------- -The README now lists necessary dependencies. - -Various graphics state defaults are now documented, (source pattern is -opaque black, line width is 2.0, line join is miter, line cap is butt, -miter limit is 10.0, etc.). - -general -------- -Several cleanups have been made along many error-path returns, -(carefully propagating up the original error status values, cleaning -up memory leaks during error recovery, etc.). This is yet another in -Chris "ickle" Wilson's long series of error-handling cleanups during -the 1.5 series. - -Avoid undesired clipping when drawing scaled surface patterns with -bilinear filtering. - -cairo-pdf ---------- -Fix emission of 1-bit alpha masks in PDF output. - -Fix a bug that would cause glyphs to be misplaced along the Y axis: - - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%23474136 - - Originally, an issue about a crash, but later leading to the - misplaced glyphs issue being discovered. - -cairo-ps --------- -Fix misplaced glyphs in cairo's PostScript output. - - This issue occurs when consecutive glyphs are placed far - apart. This case is exercised by the new ft-show-glyphs-table test - case, which was originally inspired by the Debian bug #23474136 - mentioned above. - -Fix more misplaced glyphs in cairo's PostScript output: - - The issue here showed up under very particular circumstance, (when - converting a PDF file with a CFF font with CID Identity-H encoding - and using glyph 0, (defined by the CFF specification as .notdef) - as a space instead). More concretely, this problem appeared when - converting the UbuntuDesktop.pdf file mentioned in this bug - report: - - https://bugs.freedesktop.org/show_bug.cgi?id=15348#c3 - - As usual with arcane font-encoding-specific bugs like this, many - thanks to Adrian Johnson for his magical ability to dive into - specifications and emerge almost instantaneously with fixes. And - thanks to Sebastien Bacher for bringing the bug to our attention. - -cairo-xlib ----------- -Fix serious failure on X servers without the Render extension. - - Since the 1.5.14 snapshot (with support for PseudoColor visuals), - any application attempting to create a "similar" xlib surface would - fail on an X server without the Render extension. Thanks to - Frederic Crozat for pointing out that cairo's test suite was - entirely failing when run against Xvfb. - -Avoid crashing cairo-xlib applications for too-large glyphs - - Naively sending glyphs of any size to the X server will eventually - violate the X limit on maximum request sizes. We now properly - detect when a glyph would be too large and use existing fallbacks - to render the glyph rather than trying to send it to the X server. - -Enable the buggy_repeat workaround for Xorg servers < 1.4 - - We have determined that Xorg 1.3.0 (as packaged in Fedora 8 at - least) has a bug that can result in an X server crash when cairo - uses certain X Render repeat operations, (as exercised by cairo's - extend-reflect test). We avoid this crash by using fallbacks - whenever a repeating surface is needed for any Xorg server with a - version less than 1.4. This is slower, but should prevent the - crash. - - (Meanwhile, there appears to be a separate bug where some X - servers or specific X-server drivers will use random pixmap data - when asked to draw a repeating surface. The buggy_repeat - workaround would also avoid those problems, but we have not yet - characterized whether the new "version < 1.4" is a good - characterization of those problems or not.) - -cairo-quartz-font ------------------ -Implement cairo_font_extents for this backend. - -The cairo-quartz-font implementation added in the 1.5.14 snapshot was -entirely missing support for the cairo_font_extents function. Thanks to -Richard Hult for pointing out this obvious shortcoming, (and obvious -lack of coverage in our test suite): - - CGFont backend returns 0 font extents - https://bugs.freedesktop.org/show_bug.cgi?id=15319 - -Snapshot 1.5.16 (2008-04-01 Carl Worth <cworth@cworth.org>) -=========================================================== -This is the eighth snapshot in cairo's unstable 1.5 series. It comes -less than two weeks after the 1.5.14 snapshot and it really is a -legitimate snapshot, (in spite of sharing this date with that of many -bogus announcements). The major change in this snapshot is that the -cairo-quartz backend is now officially "supported", including new API -to construct a font face from a CGFontRef . Also several bug fixes -have been fixed in many backends. See below for details. - -general -------- -Cairo now depends on pixman 0.10.0 which was recently released. The -latest pixman release can always be found alongside cairo releases at: - - http://cairographics.org/releases - -Increase the precision of color stops for gradients. This fixes a -regression in gradient rendering that had been present since the -1.5.12 snapshot. - -paginated (all of ps, pdf, svg, and win32-printing) ---------------------------------------------------- -Fix assertion failure when some drawing elements are outside the page -boundaries, (this bug was noticed when using Inkscape to print a -drawing with landscape orientation to a portrait-oriented piece of -paper). - -cairo-ps --------- -Fix of bug causing incorrect glyph positioning. - -Fix handling of CAIRO_OPERATOR_SOURCE. - -cairo-pdf ---------- -More reduction of unnecessary digits of precision in PDF output. - -Fix handling of CAIRO_OPERATOR_SOURCE. - -cairo-svg ---------- -Fix bug in usage of libpng that was preventing cairo_mask from working -with the svg backend. - -Fix transformation of source pattern for cairo_stroke(). - -cairo-win32-printing --------------------- -Fix fallback resolution, (thanks again to inkscape users/developers -for helping us find this one). - -cairo-quartz ------------- -Mark the cairo-quartz backend as "supported" rather than -"experimental". This means the following: - - * The backend will now be built by default (if possible). - - * We are committing that the backend-specific API (as published in - cairo-quartz.h) are stable and will be supported in all future - cairo 1.x releases. - - * We are committing that the output quality of this backend - compares favorably with other cairo backends, (and that quality - is ensured by good results from the cairo test suite). - - * We recommend that distributions build and distribute this - backend when possible. - -Note that the cairo_quartz_image API (in cairo-quartz-image.h) is -still experimental, will not build by default, (pass ---enable-quartz-image to configure to build it), and may see API -changes before it is marked as "supported" in a future release. - -Put the CAIRO_FONT_TYPE_ATSUI name back into -cairo-deprecated.h. Without this, the cairo 1.5.14 snapshot broke all -builds for applications using the C++ cairomm bindings (and perhaps -others) which have the CAIRO_FONT_TYPE_ATSUI name in their header -files. This breakage happened even for applications not using -cairo-quartz at all. - - Note: Even though the CAIRO_FONT_TYPE_ATSUI name is provided to - avoid this build breakage, we still recommend that bindings and - applications move to the new, and more accurate, - CAIRO_FONT_TYPE_QUARTZ name. - -Replace the implementation of cairo-quartz-font to use CFFont instead -of ATSUI. The CGFont API is a better fit than ATSUI, and this new -implementation is also more correct than the old one as well. - -This also adds the following new API call: - - cairo_public cairo_font_face_t * - cairo_quartz_font_face_create_for_cgfont (CGFontRef font); - -The previous cairo_quartz_font_face_create_for_atsu_font_id function -continues to exist and is part of the supported API going -forward. (However, the old name of that same function, which was -cairo_atsui_font_face_create_for_atsu_font_id is officially -deprecated. Any source code using the old name should be updated to -use the new name.) - -Fix transformation of source pattern for cairo_stroke(). - -cairo-win32 ------------ -Avoid crash in create_similar is cairo_win32_surface_create fails. - -Snapshot 1.5.14 (2008-03-20 Carl Worth <cworth@cworth.org>) -=========================================================== -This is the seventh snapshot in cairo's unstable 1.5 series. It comes -3 weeks after the 1.5.12 snapshot. This snapshot includes support for -arbitrary X server visuals, (including PseudoColor), which was the -final remaining cairo-specific item on the cairo 1.6 roadmap. It also -includes a huge number of improvements to the cairo-quartz backend. So -this is effectively a cairo 1.6 release candidate. We expect very few -changes from now until 1.6 and only for specific bug fixes. - -API Change ----------- -Rename ATSUI font backend to Quartz font backend. This affects the -following usage: - - --enable-atsui -> --enable-quartz-font - CAIRO_HAS_ATSUI_FONT -> CAIRO_HAS_QUARTZ_FONT - CAIRO_FONT_TYPE_ATSUI -> CAIRO_FONT_TYPE_QUARTZ - - cairo_atsui_font_face_create_for_atsu_font_id -> - cairo_quartz_font_font_create_for_atsu_font_id - -This API change is justified by the cairo-quartz backend still be -marked as "experimental" rather than "supported", (though this is one -step toward making the change to "supported" before 1.6). Cairo will -still provide ABI compatibility with the old symbol name, however. - -paginated (all of ps, pdf, svg, and win32-printing) ---------------------------------------------------- -Optimize by not analyzing an image surface for transparency more than -once, (previously all images were analyzed twice). - -cairo-ps and cairo-pdf ----------------------- -Avoiding emitting a matrix into the stroke output when unnecessary, -(making output size more efficient). - -Reduce rounding error of path shapes by factoring large scale factors -out of the path matrix, (ensuring that a fixed-number of printed -digits for path coordinates contains as much information as possible). - -Reduce excess digits for text position coordinates. This makes the -output file size much smaller without making the result any less -correct. - -cairo-ps --------- -Eliminate bug causing extraneous text repetition on Linux PostScript -output in some cases. - - See: Mozilla Bug 419917 – Printed page contents are reflected - inside bordered tables (Linux-only) - - https://bugzilla.mozilla.org/show_bug.cgi?id=419917 - -Optimize output when EXTEND_PAD is used. - -cairo-pdf ---------- -Fix to not use fill-stroke operator with transparent fill, (else PDF -output doesn't match the cairo-defined correct result). See: - - https://bugs.launchpad.net/inkscape/+bug/202096 - -cairo-svg ---------- -Fix stroke of path with a non-solid-color source pattern: - - http://bugs.freedesktop.org/show_bug.cgi?id=14556 - -cairo-quartz ------------- -Fix text rendering with gradient or image source pattern. - -Handling antialiasing correctly for cairo_stroke(), cairo_clip(), and -cairo_show_text()/cairo_show_glyphs(). - -Correctly handle gradients with non-identity transformations: - - Fixes http://bugs.freedesktop.org/show_bug.cgi?id=14248 - -Add native implementation of REPEAT and REFLECT extend modes for -gradients. - -Fix implementation for the "unbounded" operators, (CAIRO_OPERATOR_OUT, -_IN, _DEST_IN, and _DEST_ATOP). - -Correctly handle endiannees in multi-architecture compiles on Mac OS -X. - -Avoid behavior which would cause Core Graphics to print warnings to -the console in some cases. - -cairo-win32 ------------ -Fix handling of miter limit. - -cairo-win32-printing --------------------- -Fix to not use a 1bpp temporary surface in some cases while printing, -(so grayscale data is preserved rather than just becoming black and -white). - -cairo-xlib ----------- -Add support for rendering to arbitrary TrueColor X server -visuals. This fixes at least the following bugs: - - cairo doesn't support 8-bit truecolor visuals - https://bugs.freedesktop.org/show_bug.cgi?id=7735 - - cairo doesn't support 655 xlib format - https://bugs.freedesktop.org/show_bug.cgi?id=9719 - -Add support for rendering to 8-bit PseudoColor X server visuals. This -fixes the following bug: - - Cairo doesn't support 8-bit pseudocolor visuals - https://bugs.freedesktop.org/show_bug.cgi?id=4945 - -Snapshot 1.5.12 (2008-02-28 Carl Worth <cworth@cworth.org>) -=========================================================== -This is the sixth snapshot in cairo's unstable 1.5 series. It comes 1 -week after the 1.5.10 snapshot. This snapshot includes the -long-awaited change from 16.16 to 24.8 fixed-point values, (see below -for why you should care). It also includes several backend-specific -bug fixes. - -24.8 fixed-point format ------------------------ -Cairo has always converted path coordinates to a fixed-point -representation very early in its processing. Historically, this has -been a 32-bit representation with 16 bits of integer for the -device-pixel grid and 16 bits of sub-pixel positioning. The choice of -16 bits for the integer coordinate space was based on the 16-bit limit -for X Window drawables. - -This 16-bit limit has proven problematic for many applications. It's -an especially vexing problem when targeting non-X backends that don't -have any 16-bit restriction. But even when targeting cairo-xlib, it's -often desirable to draw a large shape, (say a background rectangle), -that extends beyond the surface bounds and expect it to fill the -surface completely, (rather than overflowing and triggering random -behavior). - -Meanwhile, nobody has ever really needed 16 bits of sub-pixel -precision. - -With this snapshot, the fixed-point system is still in place and is -still using a 32-bit representation, (future versions of cairo might -move entirely to floating-point when targeting PDF output for -example). But the representation now provides 24 bits of pixel -addressing and only 8 bits of sub-pixel positioning. This should give -a much less stifling space to many applications. - -However, the underlying pixman library still has 16-bit limitations in -many places, (it has its roots in the X server as well). Until those -are also fixed, applications targeting cairo image surfaces, or -hitting software fallbacks when targeting other surfaces will still -encounter problems with device-space values needing more than 16 -integer bits. - -generic fixes -------------- -Add a few tests to the test suite to increase coverage. - -Cleanup a few error-handling paths, (propagate error correctly). - -cairo-ft --------- -Fix handling of font sizes smaller than 1 device pixel. - -cairo-pdf ---------- -Fix to properly save/restore clip when analyzing meta-surface -patterns, (fixing a couple of test-suite failures). - -Implement native support for CAIRO_OPERATOR_SOURCE when the source -pattern is opaque. - -Emit rectangles as PDF rectangles ("re" operator) rather than as -general paths. - -cairo-ps --------- -Fix to work properly with the 16.16->24.8 change. - -cairo-svg ---------- -Fix CAIRO_EXTEND_REFLECT by using an image fallback, (there's no -direct SVG support for reflected patterns). - -Fix the use of alpha-only masks, (such as CAIRO_FORMAT_A8). - -cairo-quartz ------------- -Add new API for efficiently using image data as a source: - - cairo_surface_t * - cairo_quartz_image_surface_create (cairo_surface_t *image_surface); - - cairo_surface_t * - cairo_quartz_image_surface_get_image (cairo_surface_t *surface); - -For full documentation, see: - - http://cairographics.org/manual/cairo-Quartz-Surfaces.html#cairo-quartz-image-surface-create - -Several fixes for cairo_mask(). - -cairo-atsui ------------ -Change default from from Monaco to Helvetica to be more consistent -with other font backends. - -Snapshot 1.5.10 (2008-02-20 Carl Worth <cworth@cworth.org>) -=========================================================== -This is the fifth snapshot in cairo's unstable 1.5 series. It comes 3 -weeks after the 1.5.8 snapshot. This snapshot adds one new API -function, (cairo_has_current_point), and the usual mix of -improvements, (more efficient PostScript/PDF output, optimized -stroking), and fixes (more robust error-handling, etc.). See below for -details. - -New API -------- -Add a new function to query if there is a current point: - - cairo_bool_t - cairo_has_current_point (cairo_t *cr); - -There is no current point immediately after cairo_create(), nor after -cairo_new_path() or cairo_new_sub_path(). There is a current point -after any of the path-creation functions, (cairo_move_to, -cairo_line_to, cairo_curve_to, etc.). - -With this new function, we also revert the change of the return type -of cairo_get_current_point from cairo 1.5.8, (it's now a void function -again). - -Optimizations -------------- -Optimize stroking code to avoid repeated calculation of redundant -values, (particularly significant for very large, offscreen paths). - -General fixes -------------- -Patch a few more potential buffer overruns, (due to integer -overflow). - -Many fixes and improvements to cairo's error-handling, (ensure that -correct error values are returned, clean up memory leaks on -error-handling paths, etc.). - -Fix a potential infinite loop when stroking a spline with a pen that -has been transformed to a line segment. - -Remove treating NULL as a synonym for a valid cairo_font_options_t* -with default values, (a change that had been introduced as of cairo -1.5.8). - -Remove the altered handling of tolerance and fallback-resolution that -had been introduced as of cairo 1.5.4. - -cairo-xlib ----------- -Pass the original Drawable, (as opposed to the root window), to -XCreatePixmap when creating a similar surface. This gives the X server -more information so that it can be clever and efficient. - -cairo-pdf ---------- -Fix the rendering of repeating and reflecting patterns. - -Ensure miter limit is always >= 1, (smaller limits are not meaningful, -but they can cause some PDF viewers to fail to display pages). - -Generate more efficient output when the same path is used for both -fill and stroke. - -cairo-ps --------- -Start sharing much of the cairo-pdf code rather than implementing very -similar code in cairo-ps. - -Implement native support for repeating and reflecting linear -gradients. - -Implement reflected surface patterns. - -Ensure miter limit is always >= 1, (smaller limits are not meaningful, -but they can cause some PostScript viewers to crash). - -Generate PostScript that will perform more efficiently and use less -memory on printers, (use currentfile instead of a giant string array -for image data, and avoid using PostScript patterns for paint() and -fill() when possible). - -cairo-svg ---------- -Avoid unnecessary rasterization when copying a "similar" surface to -another svg surface, (allow the SOURCE operator to be implemented with -all-vector operations if there are no underlying objects). - -cairo-atsui ------------ -Eliminate infinite loop when attempting to render an empty string. - -Snapshot 1.5.8 (2008-01-30 Carl Worth <cworth@cworth.org>) -========================================================== -This is the fourth snapshot in cairo's unstable 1.5 series. It comes 2 -weeks after the 1.5.6 snapshot. It adds a few new API functions. Most -notably all callers of cairo_image_surface_create_for_data should now -be calling cairo_format_stride_for_width to compute a legal stride -value. See below for more details. - -New API in cairo 1.5.8 ----------------------- -We've added a new function that should be called to compute a legal -stride value before allocating data to be used with -cairo_image_surface_create_for_data: - - int - cairo_format_stride_for_width (cairo_format_t format, - int width); - -We've also added a new cairo_path_extents function that can be used to -compute a bounding box for geometry such as a single line segment, -(contrast with cairo_path_extents and cairo_stroke_extents): - - void - cairo_path_extents (cairo_t *cr, - double *x1, double *y1, - double *x2, double *y2); - -And finally, we've added a function to allow for querying the -XRenderPictFormat of a cairo-xlib surface: - - XRenderPictFormat * - cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface); - -API changes ------------ -Fix return types of cairo_surface_show_page and -cairo_surface_copy_page. This is an API change to functions that are -new in the 1.5 series, so not an API break compared to any stable -cairo release, (1.0.x, 1.2.x, 1.4.x). - -Change the return type of cairo_get_current_point() from void to -cairo_status_t. This allows the caller to receive a -CAIRO_STATUS_NO_CURRENT_POINT value to distinguish the a current point -at the origin from no current point existing. - -Performance improvement ------------------------ -Improve performance of clipping by using an optimized code path -internally, (with the ADD operator instead of IN). - -General bug fixes ------------------ -Fix various cairo_*_extents functions to initialize the return-value -variables even in the case of a cairo_t in error. - -Treat NULL as a legitimate value for cairo_font_options_t*. [NOTE: -On discussion afterwards, we decided against this change so it has -been removed as of cairo 1.5.10.] - -Fix rendering with CAIRO_ANTIALIAS_NONE to be more predictable, (that -is, to avoid seams appearing when geometry and imagery share an -identical edge). Portions of this fix are in the pixman library and -will appear in a future release of that library. - -Avoid triggering an error for a font size of 0. - -Miscellaneous changes ---------------------- -Require pixman >= 0.9.6. - -There has been a tremendous amount improvement to cairo's -documentation. We're delighted that 100% of the public API has at -least some documentation in the API reference manual. Many thanks to -Behdad Esfahbod and Nis Martensen for leading this effort. - -cairo-pdf and cairo-ps ----------------------- -Eliminate failure when a Type 1 font is embedded with an explicit -glyph 0. - -cairo-pdf ---------- -Implement a more correct and more efficient approach for patterns with -an extend mode of CAIRO_EXTEND_REFLECT. - -cairo-ps --------- -Fix image masks to properly pack and pad mask bits. - -cairo-quartz ------------- -Take care to only use DrawTiledImage for integer-aligned images, (and -use slower paths to get the correct result in other cases). - -cairo-win32 ------------ -Fix for older versions of mingw. - -Improve the handling of the clipping with the win32 and win32-printing -surfaces. - -Fix rendering of non black/white text. - -Snapshot 1.5.6 (2008-01-15 Carl Worth <cworth@cworth.org>) -========================================================== -This is the third snapshot in cairo's unstable 1.5 series. It comes -about 6 weeks after the 1.5.4 snapshot. The only API addition compared -to 1.5.4 is very minor, (a new value CAIRO_STATUS_TEMP_FILE_ERROR). -The remainder of the changes are the usual accumulation of bug fixes -and improvements. See below for details. - -General bug fixes ------------------ -Fix handling of fonts that contain a mixture of outline and bitmapped -glyphs. There was a change in this handling in 1.5.4 that improved -some cases and also regressed other cases. Now, all cases should be -handled quite well. - -Fix alignment issues that were causing SIGBUS failures on SPARC. - -Fix a regression (which first appeared in 1.5.2) where stroking under -a large scale would sometimes incorrectly replace a miter join with a -bevel join. (Thanks to Keith Packard.) - -Fix reporting of zero-sized extents to be {0,0} rather than -{INT_MAX,INT_MIN}. This avoids several integer overflow and -allocations of massive regions in some cases. - -Fix failures of gradients with no stops, (quartz, ps, and pdf). - -Fix handling of Type 1 fonts on Windows platforms. - -Fix handling of Type 1 fonts with no specific family name in the font -itself, (generate a CairoFont-x-y name). - -Handle NULL string values in cairo_show_text, cairo_show_glyphs, and -friends. - -Many robustness improvements along error-handling paths, (thanks as -always, to Chris "ickle" Wilson). - -Various other minor fixes. - -Paginated backends (PDF/PostScript/win32-printing) --------------------------------------------------- -Avoid unnecessary rasterization when using a paginated surface as a -source, (such as drawing from one pdf surface to another). - -Fix replaying of paginated surface with more than one level of push/pop -group. - -cairo-xlib ----------- -Fix xlib backend to not consider recent X server release as having a -buggy repeat implementation in the Render extension. - -cairo-pdf ---------- -Fix PDF output to avoid triggering very slow rendering in PDF viewers, -(avoid starting and stopping the content stream for each pattern -emission). - -Support CAIRO_OPERATOR_SOURCE in cases where there is nothing below -the object being drawn. - -Fix to avoid seams appearing between multiple fallback regions. - -cairo-ps (PostScript) ---------------------- -Use correct bounding box in Type 3 fonts. - -Fix several bugs in cairo's PostScript output. These include making -the PostScript output more compatible with recent versions of -ghostscript that are more strict about Type 3 fonts, for -example. - -Fix for win32 to not attempt to create temporary files in the root -directory, (where the user may not have write permission). - -Avoid generating Level 3 PostScript if Level 2 is sufficient. Also, -add code in output documents to alert the user if Level 3 PostScript -is handed to a device that cannot handle PostScript beyond Level -2. - -cairo-directfb --------------- -Various performance optimizations. - -Fixed support for small surfaces (less than 8x8). - -Provide support for environment variables CAIRO_DIRECTFB_NO_ACCEL to -disable acceleration and CAIRO_DIRECTFB_ARGB_FONT to enable ARGB fonts -instead of A8. - -cairo-os2 ---------- -Allow OS/2 APIs instead of C library allocation functions. - -Snapshot 1.5.4 (2007-12-05 Carl Worth <cworth@cworth.org>) -========================================================== -This is the second snapshot in cairo's unstable 1.5 series. It comes -just over 1 month after the 1.5.2 snapshot. There are no API changes -or additions in 1.5.4 compared to 1.5.2, but there are several bug -fixes, and some optimizations. Most of these apply to particular -backends. See below for details. - -General improvements --------------------- -Use less memory for spline approximation calculations. - -Change how the tolerance value is interpreted with regard to -fallback-resolution. [Note: On further discussion, we decided against -this change for now. It is removed as of cairo 1.5.10.] - -Fix precision of floating-point values in vector-output backends to -avoid rounding errors with very small numbers. - -Xlib improvements ------------------ -Fix bug in glyph rendering with xlib, (due to everything being clipped -out). This was a regression in the 1.5.2 snapshot that was visible in -the GIMP, for example. See: - - cairo 1.5.2 causes font problems in GIMP 2.4 status bar and evolution 2.12.1 - https://bugs.freedesktop.org/show_bug.cgi?id=13084 - -PostScript improvements ------------------------ -Fix bug leading to invalid PostScript files when rendering -text, (need "0 0 xyshow" instead of "0 xyshow"). - -Fix many issues with Type 3 fonts, including making the resulting text -extractable. - -Quartz improvements -------------------- -Fix font metrics height value for ATSUI, (helps webkit on GTK+ OS X -layout nicely). - -Fix gradients. - -Fix EXTEND_NONE mode for patterns. - -Fix cairo_quartz_surface_create to properly clear the new surface -in cairo_quartz_surface_create. - -Fix to correctly handle 0x0 sized surfaces. - -Optimize drawing of ExtendMode::REPEAT patterns for OS X 10.5. - -Snapshot 1.5.2 (2007-10-30 Carl Worth <cworth@cworth.org>) -========================================================== -This is the first snapshot in cairo's unstable 1.5 series. It comes 4 -months after the 1.4.10 release. This snapshot includes significant -improvements to PDF and PostScript output, which is one of the things -in which we're most interested in getting feedback. There are a couple -of minor API additions, and several optimizations, (primarily in the -"print/vector" backends). And there are dozens of bug fixes and -robustness improvements. - -New dependency on external pixman library ------------------------------------------ -A significant change in this snapshot compared to all previous cairo -releases is that cairo now depends on an external "pixman" library for -its software rendering. Previously this same code was compiled -internally as part of cairo, but now the code is separate so that both -cairo and the X server can now share common code, (thanks very much to -Søren Sandmann for his work on separating pixman and maintaining it). - -So users will need to acquire and build pixman before being able to -build cairo. The current release is 0.9.6 and can be obtained from -here: - - http://cairographics.org/releases/pixman-0.9.6.tar.gz - - which can be verified with: - - http://cairographics.org/releases/pixman-0.9.6.tar.gz.sha1 - 66f01a682c64403a3d7a855ba5aa609ed93bcb9e pixman-0.9.6.tar.gz - - http://cairographics.org/releases/pixman-0.9.6.tar.gz.sha1.asc - (signed by Carl Worth) - -Major PDF/PostScript improvements ---------------------------------- -Adrian Johnson has done some long-awaited work to make cairo's PDF and -PostScript output more interesting than ever before. First, many -operations that previously triggered image fallbacks will now be -rendered as native vectors. These operations include: - - PDF: cairo_push_group, cairo_surface_create_similar, - cairo_mask, A8/A1 surface sources, repeating/reflecting linear - gradients. - - PostScript: cairo_push_group, cairo_surface_create_similar, - gradients, bilevel alpha masks, (for example, all values either 0 or - 255 for an A8 mask). - -Not only that, but when an image fallback is required, it will now be -limited to only the necessary region. For example, a tiny translucent -image overlaying a small portion of text would previously caused an -entire PostScript page to be rendered as a giant image. Now, the -majority of that page will be nice text, and there will only be a tiny -image in the output. - -Additionally, the PostScript output now carefully encodes text so that -if it is subsequently converted to PDF, the text will be -selectable. - -This is very exciting progress, and we're hoping to hear from users -during the 1.5 series about how things have improved, (for example, -inkscape users doing cairo-based PDF export: please let us know how -things look). And feel free to pass your thanks along to Adrian for his excellent work. - -NOTE: This much improved PDF output makes more sophisticated use of -functionality in the PDF specification. This means that cairo's output -will sometimes expose bugs in some free software PDF viewers, (evince, -poppler, and xpdf, for example), that are not yet ready for such PDF -files. We're working with the poppler maintainers to get these bugs -fixed as quickly as possible. In the meantime, please double-check -with other PDF viewers if cairo-generated PDF files are not being -rendered correctly. It may be due to a bug in the viewer rather than -in the PDF file that cairo has created. - -Robustness improvements ------------------------ -Chris Wilson has made the largest contribution by far to cairo 1.5.2, -(in number of commits). His more than 150 commits include a huge -number of fixes to increase cairo's robustness. These fixes make cairo -more robust against invalid and degenerate input, (NaN, empty path, -etc.), against size-0 malloc calls, against memory leaks on -error-recovery paths, and against other failures during error -handling. He also implemented atomic operations to cairo, and used -them to fix cairo's previously non-thread-safe reference counting, -again improving robustness. - -Chris has put a tremendous amount of time and effort into writing -analysis tools for this work, and in running those tools and fixing -the problems they report. We're very grateful for this work, and hope -that all cairo users appreciate the more robust implementation that -results from it. - -This work is largely thankless, so it might make sense to notice -sometime that cairo has been running quite smoothly for you, and when -you do, send a quick "thank you" off to Chris Wilson, since it -is all definitely running smoother thanks to his work. - -New API -------- -There are no major additions to cairo's core API. The only new, -generic functions are: - - void - cairo_surface_copy_page (cairo_surface_t *surface); - - void - cairo_surface_show_page (cairo_surface_t *surface); - -which can now be used much more conveniently than the existing -cairo_copy_page and cairo_show_page functions in some -situations. These functions act identically, but require only a -cairo_surface_t* and not a cairo_t*. - -All other API additions are specific to particular backends. - -New cairo-win32 API (new font face function and "win32 printing" surface) -------------------------------------------------------------------------- -There is a new function for creating a win32 font face for both a -logfontw and an hfont together. This complements the existing -functions for creating a font face from one or the other: - - cairo_font_face_t * - cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, - HFONT font); - -There is also a new "win32 printing" surface: - - cairo_surface_t * - cairo_win32_printing_surface_create (HDC hdc); - -This interface looks identical to the original -cairo_win32_surface_create, (both accept and HDC), but the behavior of -this new surface is very different. It should only be called with a -printing DC, and will result in all drawing commands being stored into -a meta-surface and emitted after each page is complete, with analysis -to do as minimal image-based fallbacks as necessary. The behavior and -implementation shares much with the PDF and PostScript backends. - -New cairo-ps API (EPS and PostScript level control) ---------------------------------------------------- -An often requested feature has been the ability to generate -Encapsulated PostScript (EPS) with cairo. We have that now with the -following very simple API. Just do cairo_ps_surface_create as usual -then call this function with a true value: - - void - cairo_ps_surface_set_eps (cairo_surface_t *surface, - cairo_bool_t eps); - -[NOTE: As always with snapshots, it's possible---though not very -likely---that the API could still be modified before a final -release. For example, this is the first public cairo function that -accepts a Boolean parameter. I'm generally opposed to Boolean -parameters, but this is probably the one case where I'm willing to -accept one, (namely a "set" function that accepts a single Boolean).] - -Also, it is now possible to control what PostScript level to target, -(either level 2 or level 3), with the following new API: - - typedef enum _cairo_ps_level { - CAIRO_PS_LEVEL_2, - CAIRO_PS_LEVEL_3 - } cairo_ps_level_t; - - void - cairo_ps_surface_restrict_to_level (cairo_surface_t *surface, - cairo_ps_level_t level); - - void - cairo_ps_get_levels (cairo_ps_level_t const **levels, - int *num_levels); - - const char * - cairo_ps_level_to_string (cairo_ps_level_t level); - -Improvement for cairo-quartz ----------------------------- -Brian Ewins had contributed several improvements to cairo-quartz. These -include an implementation of EXTEND_NONE for linear and radial -gradients, (so this extend mode will no longer trigger image fallbacks -for these gradients), as well as native surface-mask clipping, (only -on OS X 10.4+ where the CGContextClipToMask function is available). - -He also fixed a semantic mismatch between cairo and quartz for dashing -with an odd number of entries in the dash array. - -We're grateful for Brian since not many quartz-specific improvements -to cairo would be happening without him. - -Optimizations -------------- -Optimize SVG output for when the same path is both filled and stroked, -and avoid unnecessary identity matrix in SVG output. (Emmanuel Pacaud). - -Optimize PS output to take less space (Ken Herron). - -Make PS output more compliant with DSC recommendations (avoid initclip -and copy_page) (Adrian Johnson). - -Make PDF output more compact (Adrian Johnson). - -Release glyph surfaces after uploading them to the X server, (should -save some memory for many xlib-using cairo application). (Behdad -Esfahbod). - -Optimize cairo-win32 to use fewer GDI objects (Vladimir Vukicevic). - -win32-printing: Avoid falling back to images when alpha == 255 -everywhere. (Adrian Johnson). - -win32-printing: Avoid falling back for cairo_push_group and -cairo_surface_create_similar. (Adrian Johnson) - -Bug fixes ---------- -Avoid potential integer overflows when allocating large buffers -(Vladimir Vukicevic). - -Preparations to allow the 16.16 fixed-point format to change to -24.8 (Vladimir Vukicevic). - -Fix bugs for unsupported X server visuals (rgb565, rgb555, bgr888, and -abgr8888). (Carl Worth and Vladimir Vukicevic) - -Fix bugs in PDF gradients (Adrian Johnson). - -Fix cairo-xlib to build without requiring Xrender header -files (Behdad Esfahbod). - -Make cairo more resilient in the case of glyphs not being available in -the current font. (Behdad Esfahbod) - -Prevent crashes when both atsui and ft font backends are compiled in -(Brian Ewins). - -Make font subsetting code more robust against fonts that don't include -optional tables (Adrian Johnson). - -Fix CFF subsetting bug, (which manifested by generating PDF files that -Apple's Preview viewer could not read) (Adrian Johnson). - -Fixed error handling for quartz and ATSUI backends (Brian Ewins). - -Avoid rounding problems by pre-transforming to avoid integer-only -restrictions on transformation in GDI (Adrian Johnson). - -Fixed an obscure bug (#7245) computing extents for some stroked -paths (Carl Worth). - -Fix crashes due to extreme transformation of the pen, (seems to show -up in many .swf files for some reason) (Carl Worth). - -Release 1.4.10 (2007-06-27 Carl Worth <cworth@cworth.org>) -========================================================== -This is the fifth update in cairo's stable 1.4 series. It comes -roughly three weeks after the 1.4.8 release. The most significant -change in this release is a fix to avoid an X error in certain cases, -(that were causing OpenOffice.org to crash in Fedora). There is also a -semantic change to include child window contents when using an xlib -surface as a source, an optimization when drawing many rectangles, and -several minor fixes. - -Eliminate X errors that were killing OO.o (Chris Wilson) --------------------------------------------------------- -Cairo is fixed to avoid the X errors propagated when cleaning up -Render Pictures after the application had already destroyed the -Drawable they reference. (It would be nice if the X server wouldn't -complain that some cleanup work is already done, but there you have -it.) This fixes the bug causing OpenOffice.org to crash as described -here: - - XError on right click menus in OOo. - https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243811 - -Use IncludeInferiors when using xlib surface as a source (Ryan Lortie) ----------------------------------------------------------------------- -When an xlib surface is used as the source of a draw operation the -contents of child windows are now included in the source data. The -semantics of drawing to xlib surfaces are unchanged (ie: draws are -still clipped by child windows overlapping the destination window). - -Optimize drawing of many rectangles (Vladimir Vukicevic) --------------------------------------------------------- -Avoid O(N*N) loop when filling many axis-aligned rectangles, (either -many rectangles as separate sub-paths or due to dashing). - -Miscellaneous fixes -------------------- -Fix cairo-perf on Solaris by linking to librt. (Behdad Esfahbod) - -Fix make check for systems that require executable files to have a -particular extension. (Behdad Esfahbod) - -Eliminate some warnings in cairo-quartz. (Brian Ewins) - -Fix build-breaking typo for cairo-directfb. (Chris Wilson) - -Release 1.4.8 (2007-06-07 Carl Worth <cworth@cworth.org>) -========================================================= -This is the fourth update in cairo's stable 1.4 series. It comes just -over five weeks after the 1.4.6 release. This release includes a -thread-safe surface-cache for solid patterns which significantly -improves text rendering with the xlib backend. Also, dozens of error -paths in cairo have been fixed thanks to extensive fault-injection -testing by Chris Wilson. - -Surface cache for solid patterns --------------------------------- -Originally written by Jorn Baayen, the introduction of a small cache -for surfaces created for solid patterns improves performance -dramatically. For example, this reduces the volume of X requests -during text rendering to the same level as Xft. - -This cache first made its appearance in a 1.3.x snapshot, but was -removed before appearing in any previous major release due to -complications with multi-threaded programs. For example, programs like -evince that would carefully restrict usage of cairo-xlib to a single -thread were unpleasantly surprised to find that using cairo-image in a -separate thread could trigger X requests. - -Behdad Esfahbod designed a fix which was implemented by Chris -Wilson. Now, the necessary X requests are queued up until the next -time the application directly operates on an xlib surface. - -Improved error handling paths ------------------------------- -Chris Wilson continued the excellent work he started in cairo 1.4.4 to -make cairo much more robust against out-of-memory and other errors. He -applied his memory allocation fault injection cairo's main test suite, -(previously he had applied it to cairo's performance suite). - -Chris's testing found dozens of bugs which he fixed. Many of these -bugs had perhaps never been hit by any users. But at least one was -hit by the gnome-about program which resulted in dozens of duplicated -bug reports against that program: - - http://bugzilla.gnome.org/show_bug.cgi?id=431990 - -We were very pleasantly surprised to see this bug get fixed as a -side-effect of Chris's work. Well done, Chris! - -Other fixes ------------ -Cleanup of mutex declarations (Behdad Esfahbod) - -Remove unnecessary clip region from SVG output (Emmanuel Pacaud) - -Remove Xsun from the buggy_repeat blacklist (Elaine Xiong) - -ATSUI: Fix glyph measurement: faster and more correct (Brian Ewins) - -Quartz: fixed 'extend' behaviour for patterns, improved pattern performance, -and a few smaller correctness fixes. (Brian Ewins, Vladimir Vukicevic) - -Release 1.4.6 (2007-05-01 Carl Worth <cworth@cworth.org>) -========================================================= -This is the third update in cairo's stable 1.4 series. It comes a -little less than three weeks since the 1.4.4 release. This release -fixes the broken mutex initialization that made cairo 1.4.4 unusable -on win32, OS/2, and BeOS systems. This release also adds significant -improvements to cairo's PDF backend, (native gradients!), and a couple -of performance optimizations, (one of which is very significant for -users of the xlib backend). See below for more details. - -Repaired mutex initialization ------------------------------ -We apologize that cairo 1.4.4 did little more than crash on many -platforms which are less-frequently used by the most regular cairo -maintainers, (win32, OS/2, and BeOS). The mutex initialization -problems that caused those crashes should be fixed now. And to avoid -similar problems in the future, we've now started posting pre-release -snapshots to get better testing, (subscribe to cairo@cairographics.org -if you're interested in getting notified of those and testing them). - -PDF Improvements ----------------- -Thanks to Adrian Johnson, (cairo PDF hacker extraordinaire), we have -several improvements to cairo's PDF backend to announce: - -Native gradients: - - As of cairo 1.4.6, cairo will now generate native PDF gradients in - many cases, (previously, the presence of a gradient on any page - would force rasterized output for that page). Currently, only - gradients with extend types of PAD (the default) or NONE will - generate native PDF gradients---others will still trigger - rasterization, (but look for support for other extend modes in a - future release). Many thanks to Miklós Erdélyi as well, who did the - initial work for this support. - -Better compatibility with PDF viewers: - - The PDF output from cairo should now be displayed correctly by a - wider range of PDF viewers. Adrian tested cairo's PDF output against - many PDF viewers, identified a common bug in many of those viewers - (ignoring the CTM matrix in some cases), and modified cairo's output - to avoid triggering that bugs (pre-transforming coordinates and - using an identity matrix). - -Better OpenType/CFF subsetting: - - Cairo will now embed CFF and TrueType fonts as CID fonts. - -Performance optimizations -------------------------- -Faster cairo_paint_with_alpha: - - The cairo_paint_with_alpha call is used to apply a uniform alpha - mask to a pattern. For example, it can be used to gradually fade an - image out or in. Jeff Muizelaar fixed some missing/broken - optimizations within the implementation of this function resulting - in cairo_paint_with_alpha being up to 4 times faster when using - cairo's image backend. - -Optimize rendering of "off-screen" geometry: - - Something that applications often do is to ask cairo to render - things that are either partially or wholly outside the current clip - region. Since 1.4.0 the image backend has been fixed to not waste - too much time in this case. But other backends have still been - suffering. - - In particular, the xlib backend has often performed quite badly in - this situation. This is due to a bug in the implementation of - trapezoid rasterization in many X servers. - - Now, in cairo 1.4.6 there is a higher-level fix for this - situation. Cairo now eliminates or clips trapezoids that are wholly - or partially outside the clip region before handing the trapezoids - to the backend. This means that the X server's performance bug is - avoided in almost all cases. - - The net result is that doing an extreme zoom-in of vector-based - objects drawn with cairo might have previously brought the X server - to its knees as it allocated buffers large enough to fit all of the - geometry, (whether visible or not). But now the memory usage should - be bounded and performance should be dramatically better. - -Miscellaneous -------------- -Behdad contributed an impressively long series of changes that -organizes cairo's internals in several ways that will be very -beneficial to cairo developers. Thanks, Behdad! - -Behdad has also provided a utility for generating malloc statistics, -(which was used during the great malloc purges of 1.4.2 and -1.4.4). This utility isn't specific to cairo so may be of benefit to -others. It is found in cairo/util/malloc-stats.c and here are Behdad's -notes on using it: - - To build, do: - - make malloc-stats.so - - inside util/, and to use, run: - - LD_PRELOAD=malloc-stats.so some-program - - For binaries managed by libtool, eg, cairo-perf, do: - - ../libtool --mode=execute /bin/true ./cairo-perf - LD_PRELOAD="../util/malloc-stats.so" .libs/lt-cairo-perf - -Finally, the cairo-perf-diff-files utility was enhanced to allow for -generating performance reports from several runs of the same backend -while some system variables were changed. For example, this is now -being used to allow cairo-perf to measure the performance of various -different acceleration architectures and configuration options of the -X.org X server. - -Release 1.4.4 (2007-04-13 Carl Worth <cworth@cworth.org>) -========================================================= -This is the second update release in cairo's stable 1.4 series. It -comes just less than a month after 1.4.2. The changes since 1.4.2 -consist primarily of bug fixes, but also include at least one -optimization. See below for details. - -Of all the work that went into the 1.4.4 release - -There have been lots of individuals doing lots of great work on cairo, -but two efforts during the 1.4.4 series deserve particular mention: - -Internal cleanup of error handling, (Chris Wilson) --------------------------------------------------- -Chris contributed a tremendous series of patches (74 patches!) to -improve cairo's handling of out-of-memory and other errors. He began -by adding gcc's warn_unused_attribute to as many functions as -possible, and then launched into the ambitious efforts of adding -correct code to quiet the dozens of resulting warnings. - -Chris also wrote a custom valgrind skin to systematically inject -malloc failures into cairo, and did all the work necessary to verify -that cairo's performance test suite runs to completion without -crashing. - -The end result is a much more robust implementation. Previously, many -error conditions would have gone unnoticed and would have led to -assertion failures, segmentation faults, or other harder-to-diagnose -problems. Now, more than ever, cairo should cleanly let the user know -of problems through cairo_status and other similar status -functions. Well done, Chris! - -More malloc reduction, (Mathias Hasselmann) -------------------------------------------- -After 1.4.0, Behdad launched an effort to chase down excessive calls -to malloc within the implementation of cairo. He fixed a lot of -malloc-happy objects for 1.4.2, but one of the worst offenders, -(pixman regions), was left around. Mathias contributed an excellent -series of 15 patches to finish off this effort. - -The end result is a cairo that calls malloc much less often than it -did before. Compared to 1.4.2, 55% of the calls to malloc have been -eliminate, (and 60% have been eliminated compared to 1.4.0). Well -done, Mathias! - -Other improvements since 1.4.2 ------------------------------- -• Centralize mutex declarations (will reduce future build breaks), - (Mathias Hasselmann) - -• Reduce malloc by caching recently freed pattern objects (Chris - Wilson) - -• Fix some broken composite operations (David Reveman) - https://bugs.freedesktop.org/show_bug.cgi?id=5777 - -Backend-specific fixes ----------------------- -PDF: - • Use TJ operator for more compact representation of glyphs (Adrian - Johnson) - - • Fix glyph positioning bug when glyphs are not horizontal - http://lists.freedesktop.org/archives/cairo/2007-April/010337.html - -win32: - • Fix crash when rendering with bitmap fonts (Carl Worth) - https://bugzilla.mozilla.org/show_bug.cgi?id=376498 - -xlib: - • Turn metrics-hinting on by default (Behdad Esfahbod) - - • Fix edge-effect problem with transformed images drawn to xlib - (Behdad Esfahbod) - https://bugs.freedesktop.org/show_bug.cgi?id=10508 - - • Avoid dereferencing a NULL screen. (Chris Wilson) - https://bugs.freedesktop.org/show_bug.cgi?id=10517 - -Quartz/ATSUI: - • Fix scaling of glyph surfaces - (Brian Ewins) - https://bugs.freedesktop.org/show_bug.cgi?id=9568 - - • Fix compilation failure when both xlib and quartz enabled - (Brian Ewins) - - • Fix rounding bug leading to incorrectly positioned glyphs - (Robert O'Callahan) - https://bugs.freedesktop.org/show_bug.cgi?id=10531 - -Release 1.4.2 (2007-03-19 Carl Worth <cworth@cworth.org>) -========================================================= -This is the first update release in cairo's stable 1.4 series. It -comes just less than 2 weeks after 1.4.0. We hadn't anticipated an -update this early, but we've managed to collect some important fixes -that we wanted to get out to cairo users as soon as possible, (6 fixes -for crashes, 1 case where graphical elements would not be drawn at -all, a handful of backend-specific bugs, and several important build -fixes). - -There's almost nothing but bug fixes in this release, (see below one -optimization that Behdad did sneak in), so we recommend that everyone -upgrade to this release when possible. - -Thanks to the many people that worked to fix these bugs, and those -that did the work to report them and to test the fixes, (wherever -possible both names are credited below). - -Critical fixes --------------- -• Fix a crash due to a LOCK vs. UNLOCK typo (M. Drochner fixing Carl - Worth's embarrassing typo). - - http://bugs.freedesktop.org/show_bug.cgi?id=10235 - -• Fix potential buffer overflow, which on some systems with a checking - variant of snprintf would lead to a crash (Adrian Johnson, Stanislav - Brabec, and sangu). - - https://bugs.freedesktop.org/show_bug.cgi?id=10267 - https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=232576 - -• Fix a crash in cairo_stroke_extents or cairo_in_stroke when line - width is 0.0. (Carl Worth and Sebastien Bacher) - - https://bugs.freedesktop.org/show_bug.cgi?id=10231 - -• Fix a crash on certain combinations of X server/video drivers (Carl - Worth and Tomas Carnecky). - - https://bugs.freedesktop.org/show_bug.cgi?id=10250 - -• Fix a crash due to mishandling of invalid user input (Carl Worth and - Alexander Darovsky). - - https://bugs.freedesktop.org/show_bug.cgi?id=9844 - -• xlib: Cleanup server-side glyph caches on XCloseDisplay. This - eliminated a crash detected by the perf suite, (and that - applications could have run into as well). (Chris Wilson) - -Other bug fixes ---------------- -• Fix for some geometry which simply disappeared under some - transformations---a stroked line with an extreme skew in X, for - example (Carl Worth and Jonathan Watt). - - https://bugzilla.mozilla.org/show_bug.cgi?id=373632 - -• SVG: Fix radial gradients for CAIRO_EXTEND_REFLECT and when r0 > r1 - (Emmanuel Pacaud). - -• PDF: Set page group color space to DeviceRGB. - - This fixes incorrect (muddy) transparent colors when rendering cairo - PDF output in some viewers. (Adrian Johnson, Adam Goode, and - MenTaLguY). - - http://lists.freedesktop.org/archives/cairo/2006-November/008551.html - -• win32: Return correct metrics when hinting is off, and fix font - descent computation (Behdad Esfahbod). - -• quartz: Fix glyph interfaces to correctly return user-space rather - than device-space coordinates (Brian Ewins). - - https://bugs.freedesktop.org/show_bug.cgi?id=9568 - -• xcb: Fix parameter-order confusion with xcb_create_pixmap, which now - makes all tests that pass with xlib now pass with xcb (Carl Worth, - Jamey Sharp). - -• Fix some memory leaks in the perf suite (Chris Wilson). - -• Fix perf suite to consider changes in pixman/src (Mathias - Hasselmann). - -Build fixes ------------ -• Don't include pre-generated cairo-features.h file. This was causing - build failures when building with the directfb backend enabled - (Behdad Esfahbod). - - https://bugs.freedesktop.org/show_bug.cgi?id=10189 - -• Eliminate use of maintainer mode from cairo's automake/configure - script. This means that updates to files such as Makefile.am will - take effect, (by rerunning automake and friends as necessary) when - invoking make rather than being silently ignored. (Behdad Esfahbod) - -• Don't compile cairo-deflate-stream.c, which depends on zlib, unless - building the pdf backend which requires it. (Carl Worth, Tor - Lillqvist) - - https://bugs.freedesktop.org/show_bug.cgi?id=10202 - -• Don't make the ps backend link against zlib anymore, since it - doesn't require it (Carl Worth). - -• Use "find !" rather than "find -not" for better portability (Thomas - Klausner). - - https://bugs.freedesktop.org/show_bug.cgi?id=10226 - -• Don't use unsupported visibility attribute "hidden" on Solaris - (Gilles Dauphin, Thomas Klausner). - - https://bugs.freedesktop.org/show_bug.cgi?id=10227 - -Optimization ------------- -• It was Behdad that suggested we focus strictly on bug fixes now that - we shipped so many performance improvements in 1.4.0, but it was - also Behdad that got distracted by the chance to remove a lot of - mallocs from cairo. Paths, gstates, trapezoids, splines, polygons, - and gradient color stops will now use small, stack-allocated buffers - in the most common cases rather than calling malloc as - often. (Behdad Esfahbod). And look for more from Mathias Hasselmann - soon. - -Release 1.4.0 (2007-03-06 Carl Worth <cworth@cworth.org>) -========================================================= -The many people[*] who have been working hard on cairo are very -pleased to announce the long-awaited release of cairo 1.4. This -release comes 4 months after the last stable update release (1.2.6) -and 9 months since the initial release of 1.2.0. - -The release notes below are intended to capture the highlights of the -changes that have occurred from the 1.2 series to the new 1.4.0 -release. - -Performance improvements ------------------------- -Within the cairo project, the last 6 months or so has seen an intense -effort focusing on the performance of cairo itself. That effort has -paid off considerably, as can be seen in the following highlights of -some of the performance differences from cairo 1.2.6 to cairo 1.4.0. - -(Note: The performance results reported here were measured on an x86 -laptop. Many of the improvements in 1.4---particular those involving -text rendering---are even more dramatic on embedded platforms without -hardware floating-point units. Such devices played an important part -of many of the optimizations that found their way into cairo over the -last few months.) - -• Dramatic improvement when drawing objects that are mostly off-screen - with the image backend (with the xlib backend this case is still - slow due to an X server bug): - - image-rgba long-lines-uncropped-100 479.64 -> 4.98: 96.24x speedup - ███████████████████████████████████████████████▋ - -• Dramatic improvement when copying a small fraction of an image - surface to an xlib surface: - - xlib-rgba subimage_copy-512 3.93 -> 0.07: 54.52x speedup - ██████████████████████████▊ - -• Dramatic improvement to tessellation speed for complex objects: - - image-rgb tessellate-256-100 874.16 -> 34.79: 25.13x speedup - ████████████■- xlib-rgba zrusin_another_fill-415 148.40 -> 13.85: 10.72x speedup - ████▉ - xlib-rgb world_map-800 680.20 -> 345.54: 1.97x speedup - â–Œ - -• Dramatic improvement to the speed of stroking rectilinear shapes, - (such as the outline of a rectangle or "box"): - - image-rgb box-outline-stroke-100 0.18 -> 0.01: 24.22x speedup - ███████████▋ - xlib-rgb box-outline-stroke-100 0.46 -> 0.06: 8.05x speedup - ███▌ - - -• Dramatic improvements to text rendering speeds: - - xlib-rgba text_image_rgba_over-256 63.12 -> 9.61: 6.57x speedup - ██▊ - -• 3x improvements to floating-point to fixed-point conversion speeds: - - image-rgba pattern_create_radial-16 9.29 -> 3.44: 2.70x speedup - â–‰ - -• 2x improvements to linear gradient computation: - - image-rgb paint_linear_rgb_source-512 26.22 -> 11.61: 2.26x speedup - â–‹ - -• 2x improvement to a case common in PDF rendering: - - image-rgb unaligned_clip-100 0.10 -> 0.06: 1.81x speedup - â– - -• 1.3x improvement to rectangle filling speed (note: this improvement - is new since 1.3.16---previously this test case was a 1.3x slowdown - compared to 1.2.6): - - image-rgba rectangles-512 6.19 -> 4.37: 1.42x speedup - â–Ž - xlib-rgba rectangles-512 7.48 -> 5.58: 1.34x speedup - â– - -NOTE: In spite of our best efforts, there are some measurable -performance regressions in 1.4 compared to 1.2. It appears that the -primary problem is the increased overhead of the new tessellator when -drawing many, very simple shapes. The following test cases capture -some of that slowdown: - - image-rgba mosaic_tessellate_lines-800 11.03 -> 14.29: 1.30x slowdown - â– - image-rgba box-outline-fill-100 0.01 -> 0.01: 1.26x slowdown - â– - image-rgba fill_solid_rgb_over-64 0.20 -> 0.22: 1.12x slowdown - - image-rgba fill_image_rgba_over-64 0.23 -> 0.25: 1.10x slowdown - - xlib-rgb paint_image_rgba_source-256 3.24 -> 3.47: 1.07x slowdown - -We did put some special effort into eliminating this slowdown for the -very common case of drawing axis-aligned rectangles with an identity -matrix (see the box-outline-stroke and rectangles speedup numbers -above). Eliminating the rest of this slowdown will be a worthwhile -project going forward. - -Also note that the "box-outline-fill" case is a slowdown while -"box-outline-stroke" is a (huge) speedup. These two test cases -resulted from the fact that some GTK+ theme authors were filling -between two rectangles to avoid slow performance from the more natural -means of achieving the same shape by stroking a single rectangle. With -1.4 that workaround should definitely be eliminated as it will now -cause things to perform more slowly. - -Greatly improved PDF output ---------------------------- -We are very happy to be able to announce that cairo-generated PDF -output will now have text that can be selected, cut-and-pasted, and -searched with most capable PDF viewer applications. This is something -that was not ever possible with cairo 1.2. - -Also, the PDF output now has much more compact encoding of text than -before. Cairo is now much more careful to not embed multiple copies of -the same font at different sizes. It also compresses text and font -streams within the PDF output. - -API additions -------------- -There are several new functions available in 1.4 that were not -available in 1.2. Curiously, almost all of the new functions simply -allow the user to query state that has been set in cairo (many new -"get" functions) rather than providing any fundamentally new -operations. The new functionality is: - -• Getting information about the current clip region - - cairo_clip_extents - cairo_copy_clip_rectangle_list - cairo_rectangle_list_destroy - -• Getting information about the current dash setting - - cairo_get_dash_count - cairo_get_dash - -• Getting information from a pattern - - cairo_pattern_get_rgba - cairo_pattern_get_surface - cairo_pattern_get_color_stop_rgba - cairo_pattern_get_color_stop_count - cairo_pattern_get_linear_points - cairo_pattern_get_radial_circles - -• Getting the current scaled font - - cairo_get_scaled_font - -• Getting reference counts - - cairo_get_reference_count - cairo_surface_get_reference_count - cairo_pattern_get_reference_count - cairo_font_face_get_reference_count - cairo_scaled_font_get_reference_count - -• Setting/getting user data on objects - - cairo_set_user_data - cairo_get_user_data - cairo_pattern_set_user_data - cairo_pattern_get_user_data - cairo_scaled_font_set_user_data - cairo_scaled_font_get_user_data - -• New cairo-win32 functions: - - cairo_win32_surface_create_with_ddb - cairo_win32_surface_get_image - cairo_win32_scaled_font_get_logical_to_device - cairo_win32_scaled_font_get_device_to_logical - -API deprecation ---------------- -The CAIRO_FORMAT_RGB16_565 enum value has been deprecated. It never -worked as a format value for cairo_image_surface_create, and it wasn't -necessary for supporting 16-bit 565 X server visuals. - -A sampling of bug fixes in cairo 1.4 ------------------------------------- - • Fixed radial gradients - • Fixed dashing (degenerate and "leaky" cases) - • Fixed transformed images in PDF/PS output (eliminate bogus repeating) - • Eliminate errors from CAIRO_EXTEND_REFLECT and CAIRO_EXTEND_PAD - • cairo_show_page no longer needed for single-page output - • SVG: Fix bug preventing text from appearing in many viewers - • cairo-ft: Return correct metrics when hinting is off - • Eliminate crash in cairo_create_similar if nil surface is returned - • Eliminate crash after INVALID_RESTORE error - • Fix many bugs related to multi-threaded use and locking - • Fix for glyph spacing 32 times larger than desired (cairo-win32) - • Fixed several problems in cairo-atsui (assertion failures) - • Fix PDF output to avoid problems when printing from Acrobat Reader - • Fix segfault on Mac OS X (measuring a zero-length string) - • Fix text extents to not include the size of non-inked characters - • Fix for glyph cache race condition in glitz backend (Jinghua Luo) - • Fix make check to work on OPD platforms (IA64 or PPC64) - • Fix compilation problems of cairo "wideint" code on some platforms - • Many, many others... - -Experimental backends (quartz, XCB, OS/2, BeOS, directfb) ---------------------------------------------------------- -None of cairo's experimental backends are graduating to "supported" -status with 1.4.0, but two of them in particular (quartz and xcb), are -very close. - -The quartz baceknd has been entirely rewritten and is now much more -efficient. The XCB backend has been updated to track the latest XCB -API (which recently had a 1.0 release). - -We hope to see these backends become supported in a future release, -(once they are passing all the tests in cairo's test suite). - -The experimental OS/2 backend is new in cairo 1.4 compared to cairo -1.2. - -Documentation improvements --------------------------- -We have added documentation for several functions and types that -were previously undocumented, and improved documentation on other -ones. As of this release, there remain only two undocumented -symbols: cairo_filter_t and cairo_operator_t. - -[*]Thanks to everyone ---------------------- -I've accounted for 41 distinct people with attributed code added to -cairo between 1.2.6 and 1.4.0, (their names are below). That's an -impressive number, but there are certainly dozens more that -contributed with testing, suggestions, clarifying questions, and -encouragement. I'm grateful for the friendships that have developed as -we have worked on cairo together. Thanks to everyone for making this -all so much fun! - -Adrian Johnson, Alfred Peng, Alp Toker, Behdad Esfahbod, -Benjamin Otte, Brian Ewins, Carl Worth, Christian Biesinger, -Christopher (Monty) Montgomery, Daniel Amelang, Dan Williams, -Dave Yeo, David Turner, Emmanuel Pacaud, Eugeniy Meshcheryakov, -Frederic Crozat, Hans Breuer, Ian Osgood, Jamey Sharp, Jeff Muizelaar, -Jeff Smith, Jinghua Luo, Jonathan Watt, Joonas Pihlaja, Jorn Baayen, -Kalle Vahlman, Kjartan Maraas, Kristian Høgsberg, M Joonas Pihlaja, -Mathias Hasselmann, Mathieu Lacage, Michael Emmel, Nicholas Miell, -Pavel Roskin, Peter Weilbacher, Robert O'Callahan, -Soren Sandmann Pedersen, Stuart Parmenter, T Rowley, -Vladimir Vukicevic - -Snapshot 1.3.16 (2007-03-02 Carl Worth <cworth@cworth.org>) -=========================================================== -New API functions ------------------ -A few new public functions have been added to the cairo API since the -1.3.14 snapshot. These include a function to query the current scaled -font: - - cairo_get_scaled_font - -New functions to query the reference count of all cairo objects: - - cairo_get_reference_count - - cairo_surface_get_reference_count - cairo_pattern_get_reference_count - - cairo_font_face_get_reference_count - cairo_scaled_font_get_reference_count - -And new functions to allow the use of user_data with any cairo object, -(previously these were only available on cairo_surface_t and -cairo_font_face_t objects): - - cairo_set_user_data - cairo_get_user_data - - cairo_pattern_set_user_data - cairo_pattern_get_user_data - - cairo_scaled_font_set_user_data - cairo_scaled_font_get_user_data - -Usability improvement for PDF/PS/SVG generation ------------------------------------------------ -In previous versions of cairo, generating single-page output with the -cairo-pdf, cairo-ps, or cairo-svg backends required a final call to -cairo_show_page. This was often quite confusing as people would port -functional code from a non-paginated backend and be totally mystified -as to why the output was blank until they learned to add this call. - -Now that call to cairo_show_page is optional, (it will be generated -implicitly if the user does not call it). So cairo_show_page is only -needed to explicitly separate multiple pages. - -Greatly improved PDF output ---------------------------- -We are very happy to be able to announce that cairo-generated PDF -output will now have text that can be selected, cut-and-paste, and -searched with most capable PDF viewer applications. This is something -that was not ever possible with cairo 1.2. - -Also, the PDF output now has much more compact encoding of text than -before. Cairo is now much more careful to not embed multiple copies of -the same font at different sizes. It also compresses text and font -streams within the PDF output. - -Major bug fixes ---------------- - • Fixed radial gradients - - The rendering of radial gradients has been greatly improved. In - the cairo 1.2 series, there was a serious regression affecting - radial gradients---results would be very incorrect unless one of - the gradient circles had a radius of 0.0 and a center point within - the other circle. These bugs have now been fixed. - - • Fixed dashing - - Several fixes have been made to the implementation of dashed - stroking. Previously, some dashed, stroked rectangles would - mis-render and fill half of the rectangle with a large triangular - shape. This bug has now been fixed. - - • Fixed transformed images in PDF/PS output - - In previous versions of cairo, painting with an image-based source - surface pattern to the PDF or PS backends would cause many kinds - of incorrect results. One of the most common problems was that an - image would be repeated many times even when the user had - explicitly requested no repetition with CAIRO_EXTEND_NONE. These - bugs have now been fixed. - - • Eliminate errors from CAIRO_EXTEND_REFLECT and CAIRO_EXTEND_PAD - - In the 1.2 version of cairo any use of CAIRO_EXTEND_REFLECT or - CAIRO_EXTEND_PAD with a surface-based pattern resulted in an - error, (cairo would stop rendering). This bug has now been - fixed. - - Now, CAIRO_EXTEND_REFLECT should work properly with surface - patterns. - - CAIRO_EXTEND_PAD is still not working correctly, but it will now - simply behave as CAIRO_EXTEND_NONE rather than triggering the - error. - -New rewrite of quartz backend (still experimental) --------------------------------------------------- -Cairo's quartz backend has been entirely rewritten and is now much -more efficient. This backend is still marked as experimental, not -supported, but it is now much closer to becoming an officially -supported backend. (For people that used the experimental nquartz -backend in previous snapshots, that implementation has now been -renamed from "nquartz" to "quartz" and has replaced the old quartz -backend.) - -Documentation improvements --------------------------- -We have added documentation for several functions and types that -were previously undocumented, and improved documentation on other -ones. As of this release, there remain only two undocumented -symbols: cairo_filter_t and cairo_operator_t. - -Other bug fixes ---------------- - • cairo-svg: Fix bug that was preventing text from appearing in many - viewers - - • cairo-ft: Return correct metrics when hinting is off - - • Cairo 1.3.14 deadlocks in cairo_scaled_font_glyph_extents or - _cairo_ft_unscaled_font_lock_face - - https://bugs.freedesktop.org/show_bug.cgi?id=10035 - - • cairo crashes in cairo_create_similar if nil surface returned by - other->backend->create_similar - - https://bugs.freedesktop.org/show_bug.cgi?id=9844 - - • evolution crash in _cairo_gstate_backend_to_user() - https://bugs.freedesktop.org/show_bug.cgi?id=9906 - - • Fix memory leak in rectilinear stroking code - -Things not in this release --------------------------- - • Solid-surface-pattern cache: This patch had been applied during - the 1.3.x series, but it was reverted due to some inter-thread - problems it caused. The patch is interesting since it made a big - benefit for text rendering performance---so we'll work to bring a - corrected version of this patch back as soon as possible. - -Snapshot 1.3.14 (2006-02-13 Carl Worth <cworth@cworth.org>) -=========================================================== -This is the seventh development snapshot in the 1.3 series, (and there -likely won't be many more before the 1.4.0 release). It comes just -over 3 weeks after the 1.3.12 snapshot. - -Since we're so close to the 1.4.0 release, there are not a lot of new -features nor even a lot of new performance improvements in this -snapshot. Instead, there are a great number of bug fixes. Some are -long-standing bugs that we're glad to say goodbye to, and several are -fixes for regressions that were introduced as part of the optimization -efforts during the 1.3.x series. - -PDF text selection fixed ------------------------- -The inability to correctly select text in cairo-generated PDF has been -a defect ever since the initial support for the PDF backend in the -cairo 1.2.0 release. With the 1.3.14 snapshot, in most situations, and -with most PDF viewer applications, the PDF generated by cairo will -allow text to be correctly selected for copy-and-paste, (as well as -searching). - -We're very excited about this new functionality, (and very grateful to -Adrian Johnson, Behdad Esfahbod, and others that have put a lot of -work into this lately). Please test this new ability and give feedback -on the cairo@cairographics.org list. - -Many thread-safety issues fixed -------------------------------- -We've discovered that no release of cairo has ever provided safe text -rendering from a multi-threaded application. With the 1.3.14 snapshot -a huge number of the bugs in this area have been fixed, and multiple -application dvelopers have now reported success at writing -multi-threaded applications with cairo. - -Other fixes ------------ -Fixed a bug that was causing glyph spacing to be 32 times larger than -desired when using cairo-win32. - -Fixed a regression in the rendering of linear gradients that had been -present since the 1.3.8 snapshot. - -Fixed several problems in cairo-atsui that were leading to assertion -failures when rendering text. - -Fix corrupted results when rendering a transformed source image -surface to an xlib surface. This was a regression that had been -present since the 1.3.2 snapshot. - -Fixed PDF output to prevent problems printing from some versions of -Acrobat Reader, (a single glyph was being substituted for every -glyph). - -And many other fixes as well, (see the logs for details). - -Snapshot 1.3.12 (2007-01-20 Carl Worth <cworth@cworth.org>) -=========================================================== -The relentless march toward the cairo 1.4 release continues, (even if -slightly late out of the starting blocks in 2007). This is the sixth -development snapshot in the 1.3 series. It comes 4 weeks after the -1.3.10 snapshot. - -Performance ------------ -As usual, this snapshot has some fun performance improvements to show -off: - -image-rgba long-lines-uncropped-100 470.08 -> 4.95: 94.91x speedup -███████████████████████████████████████████████ -image-rgb long-lines-uncropped-100 461.60 -> 4.96: 93.02x speedup -██████████████████████████████████████████████ - -This 100x improvement, (and yes, that's 100x, not 100%), in the image -backend occurs when drawing large shapes where only a fraction of the -shape actually appears in the final result, (the rest being outside -the bounds of the destination surface). Many applications should see -speedups here, and the actual amount of speedup depends on the ratio -of non-visible to visible portions of geometry. - -[Note: There remains a similar performance bug when drawing mostly -non-visible objects with the xlib backend. This is due to a similar -bug in the X server itself, but we hope a future cairo snapshot will -workaround that bug to get a similar speedup with the xlib backend.] - -image-rgba unaligned_clip-100 0.09 -> 0.06: 1.67x speedup -â– -image-rgb unaligned_clip-100 0.09 -> 0.06: 1.66x speedup -â– - -This speedup is due to further MMX optimization by Soeren Sandmann for -a case commonly hit when rendering PDF files, (and thanks to Jeff -Muizelaar for writing code to extract the test case for us). - -There's another MMX optimization in this snapshot (without a fancy -speedup chart) by Dan Williams which improves compositing performance -specifically for the OLPC machine. - -Thanks to Adrian Johnson, cairo's PDF output is now much more -efficient in the way it encodes text output. By reducing redundant -information and adding compression to text output streams, Adrian -achieved a ~25x improvement in the efficiency of encoding text in PDF -files, (was ~45 bytes per glyph and is now ~1.6 bytes per glyph). - -Bug fixes ---------- -In addition to those performance improvements, this snapshot includes -several bug fixes: - - * A huge number of bug fixes for cairo-atsui text rendering, (for mac - OS X). These bugs affect font selection, glyph positioning, glyph - rendering, etc. One noteworthy bug fixes is that - cairo_select_font_face will no longer arbitrarily select bold nor - italic when not requested, (at least not when using a standard CSS2 - font family name such as "serif", "sans-serif", "monospace", etc.). - All these fixes are thanks to Brian Ewins who continues to do a - great job as the new cairo-atsui maintainer. - - * Fix PDF output so that images that are scaled down no longer - mysteriously repeat (Carl Worth). - - * Fix segfault on Mac OS X dues to attempt to measure extents of a - zero-length string (Behdad Esfahbod). - - * Fix text extents to not include the size of initial/trailing - non-inked characters (Behdad Esfahbod). - -API tweaks ----------- -Three functions have had API changes to improve consistency. Note that -the API functions being changed here are all functions that were -introduced as new functions during these 1.3.x snapshots. As always, -there will not be any API changes to functions included in a major -release (1.2.x, 1.4.x, etc.) of cairo. - -The changes are as follows: - - * Rename of cairo_copy_clip_rectangles to cairo_copy_clip_rectangle_list. - - * Change cairo_get_dash_count to return an int rather than accepting a - pointer to an int for the return value. - - * Change cairo_get_dash to have a void return type rather than - returning cairo_status_t. - -It's possible there will be one more round of changes to these -functions, (and perhaps cairo_get_color_stop as well), as we seek to -establish a unifying convention for returning lists of values. - -Snapshot 1.3.10 (2006-12-23 Carl Worth <cworth@cworth.org>) -=========================================================== -Santa Claus is coming just a little bit early this year, and he's -bringing a shiny new cairo snapshot for all the good little boys and -girls to play with. - -This is the fifth development snapshot in the 1.3 series. It comes 9 -days after the 1.3.8 snapshot, and still well within our goal of -having a new snapshot every week, (though don't expect one next -week---we'll all be too stuffed with sugar plums). - -Speaking of sugar plums, there's a sweet treat waiting in this cairo -snapshot---greatly improved performance for stroking rectilinear -shapes, like the ever common rectangle: - -image-rgb box-outline-stroke-100 0.18 -> 0.01: 25.58x speedup -████████████████████████▋ -image-rgba box-outline-stroke-100 0.18 -> 0.01: 25.57x speedup -████████████████████████▋ -xlib-rgb box-outline-stroke-100 0.49 -> 0.06: 8.67x speedup -███████▋ -xlib-rgba box-outline-stroke-100 0.22 -> 0.04: 5.39x speedup -████■- -In past releases of cairo, some people had noticed that using -cairo_stroke to draw rectilinear shapes could be awfully slow. Many -people had worked around this by using cairo_fill with a more complex -path and gotten a 5-15x performance benefit from that. - -If you're one of those people, please rip that workaround out, as now -the more natural use of cairo_stroke should be 1.2-2x faster than the -unnatural use of cairo_fill. - -And if you hadn't ever implemented that workaround, then you just -might get to see your stroked rectangles now get drawn 5-25x faster. - -Beyond that performance fix, there are a handful of bug fixes in this -snapshot: - - * Fix for glyph cache race condition in glitz backend (Jinghua Luo) - - * Many fixes for ATSUI text rendering (Brian Ewins) - - * Un-break recent optimization-triggered regression in rendering text - with a translation in the font matrix (Behdad Esfahbod) - - * Fix make check to work on OPD platforms (IA64 or PPC64) - (Frederic Crozat) - - * Fix a couple of character spacing issues on Windows - (Jonathan Watt) - -Have fun with that, everybody, and we'll be back for more in the new -year, (with a plan to add the last of our performance improvements in -this round, fix a few bad, lingering bugs, and then finish off a nice, -stable 1.4 release before the end of January). - --Carl - -Snapshot 1.3.8 (2006-12-14 Carl Worth <cworth@cworth.org>) -========================================================== -This is the fourth development snapshot in the 1.3 series. It comes -just slightly more than one week after the 1.3.6 snapshot. - -After the bug fixes in 1.3.6, we're back to our original program of -weekly snapshots, each one faster than the one from the week -before. Cairo 1.3.8 brings a 2x improvement in the speed of rendering -linear gradients (thanks to David Turner), and a significant reduction -in X traffic when rendering text (thanks to Xan Lopez and Behdad -Esfahbod), making cairo behave very much like Xft does. - -A few other things in the 1.3.8 snapshot worth noting include a more -forgiving image comparator in the test suite, (using the "perceptual -diff" metric and GPL implementation by Hector Yee[*]), a bug fix for -broken linking on x86_64 (thanks to M Joonas Pihlaja) and an even -better implementation of _cairo_lround, (not faster, but supporting a -more complete input range), from Daniel Amelang. - -[*] http://pdiff.sourceforge.net/ - -Snapshot 1.3.6 (2006-12-06 Carl Worth <cworth@cworth.org>) -========================================================== -This is the third development snapshot in the 1.3 series. It comes two -weeks after the 1.3.4 snapshot. - -We don't have fancy performance charts this week as the primary -changes in this snapshot are bug fixes. The performance work continues -and the next snapshot (planned for one week from today) should include -several improvements. The bug fixes in this snapshot include: - - * Fix undesirable rounding in glyph positioning (Dan Amelang) - - This bug was noticed by several users, most commonly by seeing - improper text spacing or scrambled glyphs as drawn by nautilus. For - example: - - Update to cairo-1.3.4 worsen font rendering - https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=217819 - - * Fix reduced range of valid input coordinates to tessellator - (M Joonas Pihlaja) - - This bug was causing lots of assertion failures in mozilla as - mentioned here: - - CAIRO_BO_GUARD_BITS and coordinate space? - http://lists.freedesktop.org/archives/cairo/2006-December/008743.html - - * Fix several regressions in new tessellator (M Joonas Pihlaja) - - Joonas just had a good eye for detail here. I don't think any - external cairo users had noticed any of these bugs yet. - - * Fix compilation problems of cairo "wideint" code on some platforms - (Mathieu Lacage) - - * Fix failed configure due to broken grep (Dan Amelang) - - This bug was reported here: - - AX_C_FLOAT_WORDS_BIGENDIAN doesn't work because grep doesn't - work with binary file - https://bugs.freedesktop.org/show_bug.cgi?id=9124 - - * Remove the pkg-config minimum version requirement (Behdad Esfahbod) - - Some systems ship with pkg-config 0.15 and there was really no good - reason for cairo to insist on having version 0.19 before it would - build. - -There is also one new (but inert) feature in this snapshot. There's a -new option that can be passed to cairo's configure script: - - --disable-some-floating-point - - Disable certain code paths that rely heavily on double precision - floating-point calculation. This option can improve - performance on systems without a double precision floating-point - unit, but might degrade performance on those that do. - -As of this snapshot, this option does not make any change to cairo, -but it is possible that future versions of cairo will respect this -option and change the implementation of various functions as -appropriate. - -Snapshot 1.3.4 (2006-11-22 Carl Worth <cworth@cworth.org>) -========================================================== -This is the second development snapshot in the 1.3 series. It comes -one week after the 1.3.2 snapshot. - -This snapshot has a couple of significant performance improvements, -and also adds new support for producing multi-page SVG output, (when -targeting SVG 1.2)---thanks to Emmanuel Pacaud. The details of the -performance improvements are as follows: - -1. The long-awaited "new tessellator". - - The credit for this being an improvement goes to Joonas Pihlaja. He - took my really slow code and really put it through its paces to get - the dramatic performance improvement seen below (up to 38x faster - on realistic cases, and more than 10x faster for the zrusin_another - test). - - His own writeup of the work he did is quite thorough, but more than - can be quoted here. Please see his post for the interesting details: - - http://lists.freedesktop.org/archives/cairo/2006-November/008483.html - - (Though note that this snapshot also includes some additional, - significant improvements that were only sketched out in that - email---see "Generating fewer trapezoids"). - -2. More floating-point improvements - - Daniel Amelang continues to work the magic he began in the 1.3.2 - snapshot. This time he short-circuits floating-point - transformations by identity matrices and applies the earlier - floating-to-fixed-point technique to the problem of rounding. - - The improvements here will primarily benefit text performance, and - will benefit platforms without hardware floating-point more than - those that have it, (some text tests show 20% improvement on an x86 - machine and closer to 80% improvement on arm). - -The performance chart comparing 1.3.2 to 1.3.4 really speaks for -itself, (this is on an x86 laptop). This is quite a lot of progress -for one week: - - xlib-rgb stroke_similar_rgba_over-256 74.99 1.45% -> 2.03 68.38%: 36.86x speedup -███████████████████████████████████▉ - xlib-rgb stroke_similar_rgba_source-256 78.23 1.43% -> 3.30 67.05%: 23.71x speedup -██████████████████████▊ - xlib-rgba tessellate-256-100 820.42 0.15% -> 35.06 2.84%: 23.40x speedup -██████████████████████■-image-rgba tessellate-256-100 819.55 0.32% -> 35.04 3.56%: 23.39x speedup -██████████████████████■- xlib-rgb stroke_image_rgba_over-256 78.10 1.43% -> 4.33 65.56%: 18.04x speedup -█████████████████ - xlib-rgb stroke_image_rgba_source-256 80.11 1.63% -> 5.75 63.99%: 13.94x speedup -█████████████ - xlib-rgba zrusin_another_tessellate-415 89.22 0.35% -> 8.38 5.23%: 10.65x speedup -█████████▋ -image-rgba zrusin_another_tessellate-415 87.38 0.89% -> 8.37 5.22%: 10.44x speedup -█████████■-image-rgba zrusin_another_fill-415 117.67 1.34% -> 12.88 2.77%: 9.14x speedup -████████■- xlib-rgba zrusin_another_fill-415 140.52 1.57% -> 15.79 2.88%: 8.90x speedup -███████▉ -image-rgba tessellate-64-100 9.68 3.42% -> 1.42 0.60%: 6.82x speedup -█████▉ - xlib-rgba tessellate-64-100 9.78 4.35% -> 1.45 0.83%: 6.72x speedup -█████▊ - xlib-rgb stroke_linear_rgba_over-256 46.01 2.44% -> 7.74 54.51%: 5.94x speedup -█████ - xlib-rgb stroke_linear_rgba_source-256 48.09 2.15% -> 9.14 53.00%: 5.26x speedup -████▎ - xlib-rgb stroke_radial_rgba_over-256 50.96 2.34% -> 12.46 47.99%: 4.09x speedup -███■- xlib-rgb stroke_radial_rgba_source-256 53.06 1.57% -> 13.96 46.57%: 3.80x speedup -██▊ -image-rgba paint_similar_rgba_source-256 0.12 1.57% -> 0.08 9.92%: 1.42x speedup -â– -image-rgba paint_image_rgba_source-256 0.12 2.49% -> 0.08 10.70%: 1.41x speedup -â– -image-rgba world_map-800 356.28 0.46% -> 275.72 1.15%: 1.29x speedup -â–Ž - xlib-rgba world_map-800 456.81 0.39% -> 357.95 1.39%: 1.28x speedup -â–Ž -image-rgb tessellate-16-100 0.09 0.57% -> 0.07 3.43%: 1.23x speedup -â–Ž -image-rgba tessellate-16-100 0.09 0.06% -> 0.07 2.46%: 1.23x speedup -â–Ž -image-rgba text_solid_rgb_over-256 5.39 4.01% -> 4.47 0.70%: 1.21x speedup -â–Ž -image-rgba text_solid_rgba_over-256 5.37 0.82% -> 4.45 0.75%: 1.21x speedup -â–Ž -image-rgba text_image_rgb_over-64 0.78 0.10% -> 0.65 0.74%: 1.20x speedup -â–Ž -image-rgba text_image_rgba_over-64 0.78 0.29% -> 0.65 0.68%: 1.19x speedup -â–Ž -image-rgb text_solid_rgb_over-64 0.76 2.45% -> 0.63 0.81%: 1.19x speedup -â–Ž -image-rgba text_solid_rgba_over-64 0.76 0.33% -> 0.64 0.66%: 1.19x speedup -â–Ž -image-rgba text_similar_rgba_over-256 5.99 4.72% -> 5.04 1.09%: 1.19x speedup -â–Ž - -We should point out that there is some potential for slowdown in this -snapshot. The following are the worst slowdowns reported by the cairo -performance suite when comparing 1.3.2 to 1.3.4: - -image-rgba subimage_copy-256 0.01 0.87% -> 0.01 3.61%: 1.45x slowdown -â–Œ - xlib-rgb paint_solid_rgb_over-256 0.31 10.23% -> 0.38 0.33%: 1.26x slowdown -â–Ž -image-rgba box-outline-fill-100 0.01 0.30% -> 0.01 2.52%: 1.21x slowdown -â–Ž -image-rgba fill_solid_rgb_over-64 0.20 1.22% -> 0.22 1.59%: 1.12x slowdown -â– -image-rgb fill_similar_rgb_over-64 0.21 1.04% -> 0.24 1.06%: 1.11x slowdown -â– -image-rgba fill_image_rgb_over-64 0.21 1.19% -> 0.24 0.72%: 1.11x slowdown -â– -image-rgba fill_similar_rgb_over-64 0.21 0.18% -> 0.24 0.30%: 1.11x slowdown -â– -image-rgb fill_solid_rgba_over-64 0.22 1.66% -> 0.24 1.15%: 1.11x slowdown -â– -image-rgb fill_image_rgb_over-64 0.21 0.14% -> 0.24 0.80%: 1.11x slowdown -â– -image-rgba fill_image_rgba_over-64 0.22 1.34% -> 0.25 0.20%: 1.11x slowdown -â– -image-rgba fill_solid_rgba_over-64 0.22 1.48% -> 0.24 0.95%: 1.11x slowdown -â– -image-rgb fill_similar_rgba_over-64 0.22 1.13% -> 0.25 1.25%: 1.10x slowdown -â– - -The 45% slowdown for subimage_copy is an extreme case. It's unlikely -to hit many applications unless they often use cairo_rectangle; -cairo_fill to copy a single pixel at a time. In any case, it shows a -worst-case impact of the overhead of the new tessellator. The other -slowdowns (~ 10%) are probably more realistic, and still very -concerning. - -We will work to ensure that performance regressions like these are not -present from one major release of cairo to the next, (for example, -from 1.2 to 1.4). - -But we're putting this 1.3.4 snapshot out there now, even with this -potential slowdown so that people can experiment with it. If you've -got complex geometry, we hope you will see some benefit from the new -tessellator. If you've got primarily simple geometry, we hope things -won't slowdown too much, but please let us know what slowdown you see, -if any, so we can calibrate our performance suite against real-world -impacts. - -Thanks, and have fun with cairo! - -Snapshot 1.3.2 (2006-11-14 Carl Worth <cworth@cworth.org>) -========================================================== -This is the first development snapshot since the 1.2 stable series -branched off shortly after the 1.2.4 release in August 2006. - -This snapshot includes all the bug fixes from the 1.2.6 release, -(since they originated here on the 1.3 branch first and were -cherry-picked over to 1.2). But more importantly, it contains some new -API in preparation for a future 1.4 release, and most importantly, it -contains several performance improvements. - -The bug fixes will not be reviewed here, as most of them are already -described in the 1.2.6 release notes. But details for the new API and -some performance improvements are included here. - -As with all snapshots, this is experimental code, and the new API -added here is still experimental and is not guaranteed to appear -unchanged in any future release of cairo. - -API additions -------------- -Several new API additions are available in this release. There is a -common theme among all the additions in that they allow cairo to -advertise information about its state that it was refusing to -volunteer earlier. So this isn't groundbreaking new functionality, but -it is essential for easily achieving several tasks. - -The new functions can be divided into three categories: - - Getting information about the current clip region - ------------------------------------------------- - cairo_clip_extents - cairo_copy_clip_rectangles - cairo_rectangle_list_destroy - - Getting information about the current dash setting - -------------------------------------------------- - cairo_get_dash_count - cairo_get_dash - - Getting information from a pattern - ---------------------------------- - cairo_pattern_get_rgba - cairo_pattern_get_surface - cairo_pattern_get_color_stop_rgba - cairo_pattern_get_color_stop_count - cairo_pattern_get_linear_points - cairo_pattern_get_radial_circles - -In each of these areas, we have new API for providing a list of -uniform values from cairo. The closest thing we had to this before was -cairo_copy_path, (which is rather unique in providing a list of -non-uniform data). - -The copy_clip_rectangles/rectangle_list_destroy functions follow a -style similar to that of cairo_copy_path. Meanwhile, the dash and -pattern color stop functions introduce a new style in which there is a -single call to return the number of elements available (get_dash_count -and get_color_stop_count) and then a function to be called once to get -each element (get_dash and get_color_stop_rgba). - -I'm interested in hearing feedback from users of these new API -functions, particularly from people writing language bindings. One -open question is whether the clip "getter" functionality should adopt -a style similar to that of the new dash and color_stop interfaces. - -API deprecation ---------------- -The CAIRO_FORMAT_RGB16_565 enum value has been deprecated. It never -worked as a format value for cairo_image_surface_create, and it wasn't -necessary for supporting 16-bit 565 X server visuals. - -XCB backend changes -------------------- -The XCB backend has been updated to track the latest XCB API (which -recently had a 1.0 release). - -New quartz backend ------------------- -Vladimir Vukicevic has written a new "native quartz" backend which -will eventually replace the current "image-surface wrapping" quartz -backend. For now, both backends are available, (the old one is -"quartz" and the new one is "nquartz"). But it is anticipated that the -new backend will replace the old one and take on the "quartz" name -before this backend is marked as supported in a release of cairo. - -New OS/2 backend ----------------- -Doodle and Peter Weilbacher have contributed a new, experimental -backend for using cairo on OS/2 systems. - -Performance improvements ------------------------- -Here are some highlights from cairo's performance suite showing -improvements from cairo 1.2.6 to cairo 1.3.2. The command used to -generate this data is: - - ./cairo-perf-diff 1.2.6 HEAD - -available in the perf/ directory of a recent checkout of cairo's -source, (the cairo-perf-diff script does require a git checkout and -will not work from a tar file---though ./cairo-perf can still be used -to generate a single report there and ./cairo-perf-diff-files can be -used to compare two reports). - -Results are described below both for an x86 laptop (with an old Radeon -video card, recent X.org build, XAA, free software drivers), as well -as for a Nokia 770. First the x86 results with comments on each, (all -times are reported in milliseconds). - -Copying subsets of an image surface to an xlib surface (much faster) --------------------------------------------------------------------- - xlib-rgba subimage_copy-512 10.50 -> : 53.97x speedup -█████████████████████████████████████████████████████ - -Thanks to Christopher (Monty) Montgomery for this big performance -improvement. Any application which has a large image surface and is -copying small pieces of it at a time to an xlib surface, (imagine an -application that loads a single image containing all the "sprites" for -that application), will benefit from this fix. The larger the ratio of -the image surface to the portion being copied, the larger the benefit. - -Floating-point conversion (3x faster) -------------------------------------- - xlib-rgba pattern_create_radial-16 27.75 -> 3.93 : 2.94x speedup -██ -image-rgb pattern_create_radial-16 26.06 -> 3.74 : 2.90x speedup -█▉ - -Thanks to Daniel Amelang, (and others who had contributed the idea -earlier), for this nice improvement in the speed of converting -floating-point values to fixed-point. - -Text rendering (1.3 - 2x faster) ------------------------------- - xlib-rgba text_image_rgba_source-256 319.73 -> 62.40 : 2.13x speedup -█■-image-rgb text_solid_rgba_over-64 2.85 -> 0.88 : 1.35x speedup -â– - -I don't think we've ever set out to improve text performance -specifically, but we did it a bit anyway. I believe the extra -improvement in the xlib backend is due to Monty's image copying fix -above, and the rest is due to the floating-point conversion speedup. - -Thin stroke improvements (1.5x faster) ---------------------------------------------- -image-rgb world_map-800 1641.09 -> 414.77 : 1.65x speedup -â–‹ - xlib-rgba world_map-800 1939.66 -> 529.94 : 1.52x speedup -â–Œ - -The most modest stuff to announce in this release is the 50% -improvement I made in the world_map case. This is in improvement that -should help basically anything that is doing strokes with many -straight line segments, (and the thinner the better, since that makes -tessellation dominate rasterization). The fixes here are to use a -custom quadrilateral tessellator rather than the generic tessellator -for straight line segments and the miter joins. - -Performance results from the Nokia 770 --------------------------------------- - xlib-rgba subimage_copy-512 55.88 -> 2.04 : 27.34x speedup -██████████████████████████■- xlib-rgb text_image_rgb_over-256 1487.58 -> 294.43 : 5.05x speedup -████ -image-rgb pattern_create_radial-16 187.13 -> 91.86 : 2.04x speedup -â–ˆ - xlib-rgba world_map-800 21261.41 -> 15628.02 : 1.36x speedup -â– - -Here we see that the subimage_copy improvement was only about half as -large as the corresponding improvement on my laptop, (27x faster -compared to 54x) and the floating-point conversion fix also was quite -as significant, (2x compared to 3x). Oddly the improvement to text -rendering performance was more than twice as good (5x compared to -2x). I don't know what the reason for that is, but I don't think it's -anything anybody should complain about. - -Release 1.2.6 (2006-11-02 Behdad Esfahbod <behdad@behdad.org>) -============================================================== -This is the third bug fix release in the 1.2 series, coming less than -two months after the 1.2.4 release made on August 18. - -The 1.2.4 release turned out to be a pretty solid one, except for a crasher -bug when forwarding an X connection where the client and the server have -varying byte orders, eg. from a PPC to an i686. Other than that, various -other small bugs have been fixed. - -Various improvements have been made in the testing infrastructure to prevent -false positives, and to make sure the generated cairo shared object behaves as -expected in terms of exported symbols and relocations. - -There were a total of 89 changes since 1.2.4. The following list the most -important ones: - -Common fixes ------------- -- Avoid unsigned loop control variable to eliminate infinite, - memory-scribbling loop. (#7593) -- Fix cairo_image_surface_create to report INVALID_FORMAT errors. - Previously the detected error was being lost and a nil surface was - returned that erroneously reported CAIRO_STATUS_NO_MEMORY. -- Change _cairo_color_compute_shorts to not rely on any particular - floating-point epsilon value. (#7497) -- Fix infinite-join test case (bug #8379) -- Pass correct surface to create_similar in _cairo_clip_init_deep_copy(). - -PS/PDF fixes ------------- -- Fix Type 1 embedding in PDF. -- Correct the value of /LastChar in the PDF Type 1 font dictionary. -- Improve error checking in TrueType subsetting. -- Compute right index when looking up left side bearing. (bug #8180) -- Correct an unsigned to signed conversion problem in truetype subsetting - bbox. -- Type1 subsetting: Don't put .notdef in Encoding when there are 256 glyphs. -- Add cairo version to PS header / PDF document info dictionary. -- Set CTM before path construction. - -Win32 fixes ------------ -- Get correct unhinted outlines on win32. (bug 7603) -- Make cairo as a win32 static library possible. -- Use CAIRO_FORMAT_RGB24 for BITSPIXEL==32 surfaces too. - -Build system fixes ------------------- -- Define WINVER if it's not defined. (bug 6456) -- Fix the AMD64 final link by removing SLIM from pixman. -- Misc win32 compilation fixes. -- Add Sun Pro C definition of pixman_private. -- Use pixman_private consistently as prefix not suffix. -- Added three tests check-plt.sh, check-def.sh, and check-header.sh that check - that the shared object, the .def file, and the public headers agree about - the exported symbols. -- Require pkg-config 0.19. (#8686) - - -Release 1.2.4 (2006-08-18 Carl Worth <cworth@cworth.org>) -========================================================= -This is the second bug fix release in the 1.2 series, coming less than -two weeks after the 1.2.2 release made on August 8. - -The big motivation for a quick release was that there were a log of -build system snags that people ran into with the 1.2.2 release. But, -by the time we got those all done, we found that we had a bunch of -fixes for cairo's rendering as well. So there's a lot of goodness in -here for such a short time period. - -Rendering fixes ---------------- -Fix image surfaces to not be clipped when used as a source (Vladimir Vukicevic) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=72e25648c4c4bc82ddd938aa4e05887a293f0d8b - -Fix a couple of corner cases in dashing degenerate paths (Jeff Muizelaar) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=fbb1758ba8384650157b2bbbc93d161b0c2a05f0 - -Fix support for type1 fonts on win32 (Adrian Johnson) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=da1019c9138695cb838a54f8b871bbfd0e8996d7 - -Fix assertion failure when rotating bitmap fonts (Carl Worth) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=0bfa6d4f33b8ddb5dc55bbe419c15df4af856ff9 - -Fix assertion failure when calling cairo_text_path with bitmap fonts (Carl Worth) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9878a033531e6b96b5f27e69e10e90dee7440cd9 - -Fix mis-handling of cairo_close_path in some situations (Tim Rowley, Carl Worth) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=53f74e59faf1af78f2f0741ccf1f23aa5dad4efc - -Respect font_matrix translation in _cairo_gstate_glyph_path (Behdad Esfahbod) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=f183b835b111d23e838889178aa8106ec84663b3 - -Fix vertical metrics adjustment to work with non-identity shapes (Behdad Esfahbod) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=b7bc263842a798d657a95e539e1693372448837f - -[PS] Set correct ImageMatrix in _cairo_ps_surface_emit_bitmap_glyph_data (Behdad Esfahbod) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=d47388ad759b0a1a0869655a87d9b5eb6ae2445d - -Build system fixes ------------------- -Fix xlib detection to prefer pkg-config to avoid false libXt dependency (Behdad Esfahbod) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=0e78e7144353703cbd28aae6a67cd9ca261f1d68 - -Fix typos causing win32 build problem with PS,PDF, and SVG backends (Behdad Esfahbod) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=aea83b908d020e26732753830bb3056e6702a774 - -Fix configure cache to not use stale results (Behdad Esfahbod) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6d0e3260444a2d5b6fb0cb223ac79f1c0e7b3a6e - -Fix to not pass unsupported warning options to the compiler (Jens Granseuer) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=97524a8fdb899de1ae4a3e920fb7bda6d76c5571 - -Fix to allow env. variables such as png_REQUIRES to override configure detection (Jens Granseuer) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=abd16e47d6331bd3811c908e524b4dcb6bd23bf0 - -Fix test suite to not use an old system cairo when converting svg2png (Behdad Esfahbod) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6122cc85c8f71b1ba2df3ab86907768edebe1781 - -Fix test suite to not require signal.h to be present (Behdad Esfahbod) -http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6f8cf53b1e1ccdbe1ab6a275656b19c6e5120e40 - -Code cleanups -------------- -Many useful warnings cleanups from sparse, valgrind, and careful eyes -(Kjartan Maraas, Pavel Roskin) - -Release 1.2.2 (2006-08-08 Carl Worth <cworth@cworth.org>) -========================================================= -This is the first bug fix release in the 1.2 series since the original -1.2.0 release made six weeks ago. - -There were some very serious bugs in the 1.2.0 release, (see below), -so everybody is encouraged to upgrade from 1.2.0 to 1.2.2. The 1.2.2 -release maintains source and binary compatibility with 1.2.0 and does -not make any API additions. - -Fix crashes with BGR X servers ------------------------------- -With cairo 1.2.0 many people reported problems with all cairo-using -programs, (including all GTK+ programs with GTK+ >= 2.8) immediately -crashing with a complaint about an unsupported image format. This bug -affected X servers that do not provide the Render extension and that -provide a visual with BGR rather than RGB channel order. - -report: https://bugs.freedesktop.org/show_bug.cgi?id=7294 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9ae66174e774b57f16ad791452ed44efc2770a59 - -Fix the "disappearing text" bug -------------------------------- -With cairo 1.2.0 many people reported that text would disappear from -applications, sometimes reappearing with mouse motion or -selection. The text would disappear after the first space in a string -of text. This bug was caused by an underlying bug in (very common) X -servers, and only affected text rendered without antialiasing, (either -a bitmap font or a vector font with antialiasing disabled). The bug -was also exacerbated by a KDE migration bug that caused antialiasing -to be disabled more than desired. - -report: https://bugs.freedesktop.org/show_bug.cgi?id=7494 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=456cdb3058f3b416109a9600167cd8842300ae14 -see also: -Xorg: https://bugs.freedesktop.org/show_bug.cgi?id=7681 -KDE: http://qa.mandriva.com/show_bug.cgi?id=23990 - -Fix broken image fallback scaling (aka. "broken printing") ----------------------------------------------------------- -The various "print" backends, (pdf, ps, and svg), sometimes fallback -to using image-based rendering for some operations. In cairo 1.2.0 -these image fallbacks were scaled improperly. Applications using cairo -can influence the resolution of the image fallbacks with -cairo_surface_set_fallback_resolution. With the bug, any value other -than 72.0 would lead to incorrect results, (larger values would lead -to increasingly shrunken output). - -report: https://bugs.freedesktop.org/show_bug.cgi?id=7533 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=1feb4291cf7813494355459bb547eec604c54ffb - -Fix inadvertent semantic change of font matrix translation (Behdad Esfahbod) ----------------------------------------------------------------------------- -The 1.2.0 release introduced an inadvertent change to how the -translation components of a font matrix are interpreted. In the 1.0 -series, font matrix translation could be used to offset the glyph -origin, (though glyph metrics were reported incorrectly in -1.0). However in 1.2.0, the translation was applied to the advance -values between each glyph. The 1.2.0 behavior is fairly useless in -practice, and it was not intentional to introduce a semantic -change. With 1.2.2 we return to the 1.0 semantics, with a much better -implementation that provides correct glyph metrics. - -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=84840e6bba6e72aa88fad7a0ee929e8955ba9051 - -Fix create_similar to preserve fallback resolution and font options (Behdad Esfahbod) -------------------------------------------------------------------------------------- -There has been a long-standing issue with cairo_surface_create_similar -such that font options and other settings from the original -destination surface would not be preserved to the intermediate -"similar" surface. This could result in incorrect rendering -(particularly with respect to text hinting/antialiasing) with -fallbacks, for example. - -report: https://bugs.freedesktop.org/show_bug.cgi?id=4106 -fixes: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9fcb3c32c1f16fe6ab913e27eb54d18b7d9a06b0 - http://gitweb.freedesktop.org/?p=cairo;a=commit;h=bdb4e1edadb78a2118ff70b28163f8bd4317f1ec - -xlib: Fix text performance regression from 1.0 to 1.2.0 (Vladimir Vukicevic) ----------------------------------------------------------------------------- -Several people noticed that upgrading from cairo 1.0 to cairo 1.2.0 -caused a significant performance regression when using the xlib -backend. This performance regression was particularly noticeable when -doing lots of text rendering and when using a high-latency connection -to the X server, (such as a remote X server over an ssh -connection). The slowdown was identified and fixed in 1.2.2. - -report: https://bugs.freedesktop.org/show_bug.cgi?id=7514 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=b7191885c88068dad57d68ced69a752d1162b12c - -PDF: Eliminate dependency on FreeType library dependency (Adrian Johnson) -------------------------------------------------------------------------- -The cairo 1.2 series adds a supported pdf backend to cairo. In cairo -1.2.0 this backend required the freetype library, which was an -undesirable dependency on systems such as win32, (cairo is designed to -always prefer the "native" font system). As of cairo 1.2.2 the -freetype library is not required to use the pdf backend on the win32 -platform. - -report: https://bugs.freedesktop.org/show_bug.cgi?id=7538 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=a0989f427be87c60415963dd6822b3c5c3781691 - -PDF: Fix broken output on amd64 (Adrian Johnson) ------------------------------------------------- -report: http://bugzilla.gnome.org/show_bug.cgi?id=349826 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=f4b12e497b7ac282b2f6831b8fb68deebc412e60 - -PS: Fix broken output for truetype fonts > 64k (Adrian Johnson) ---------------------------------------------------------------- -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=067d97eb1793a6b0d0dddfbd0b54117844511a94 - -PDF: Fix so that dashing doesn't get stuck on (Kent Worsnop) ------------------------------------------------------------- -Kent notices that with the PDF backend in cairo 1.2.0 as soon as a -stroke was performed with dashing, all subsequent strokes would also -be dashed. There was no way to turn dashing off again. - -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=778c4730a86296bf0a71080cf7008d7291792256 - -Fix memory leaks in failure paths in gradient creation (Alfred Peng) --------------------------------------------------------------------- -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=db06681b487873788b51a6766894fc619eb8d8f2 - -Fix memory leak in _cairo_surface_show_glyphs (Chris Wilson) ------------------------------------------------------------- -report: https://bugs.freedesktop.org/show_bug.cgi?id=7766 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=e2fddcccb43d06486d3680a19cfdd5a54963fcbd - -Solaris: Add definition of cairo_private for some Sun compilers (Alfred Peng) ------------------------------------------------------------------------------ -report: https://bugzilla.mozilla.org/show_bug.cgi?id=341874 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=04757a3aa8deeff3265719ebe01b021638990ec6 - -Solaris: Change version number of Sun's Xorg server with buggy repeat (Brian Cameron) -------------------------------------------------------------------------------------- -report: https://bugs.freedesktop.org/show_bug.cgi?id=7483 -fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=e0ad1aa995bcec4246c0b8ab0d5a5a79871ce235 - -Various memory leak fixes -------------------------- -Fix memory leak in _cairo_surface_show_glyphs (bug 7766) -Fix file handle leak in failure path (bug 7616) -Fix some memory leaks in the test cases. -Fix some memory leaks in font subsetting code used in print backends. - -Documentation improvements (Behdad Esfahbod) --------------------------------------------- -Added new documentation for several functions (cairo_show_page, -cairo_copy_page, cairo_in_stroke, cairo_in_fill). - -Fixed some syntax errors that were preventing some existing -documentation from being published. - -Fixed several minor typographical errors. - -Added an index for new symbols in 1.2. - -Release 1.2.0 (2006-06-27 Carl Worth <cworth@cworth.org>) -========================================================= -This is the culmination of the work that has gone on within the 1.1 -branch of cairo. - -There has been one API addition since the cairo 1.1.10 snapshot: - - cairo_xlib_surface_get_width - cairo_xlib_surface_get_height - -There's also a new feature without any API change: - - Dots can now be drawn by using CAIRO_LINE_CAP_ROUND with - degenerate sub-paths, (cairo_move_to() followed by either - cairo_close_path() or a cairo_line_to() to the same location). - -And at least the following bugs have been fixed: - - 6759 fontconfig option AntiAlias doesn't work in cairo 1.1.2 - 6955 Some characters aren't displayed when using xlib (cache u... - 7268 positive device_offset values don't work as source - * PDF emit_glyph function needs to support bitmapped glyphs - * PS emit_glyph function needs to support bitmapped glyphs - * SVG emit_glyph function needs to support bitmapped glyphs - * PDF: minefield page one is falling back unnecessarily - * PS/PDF: Fix broken placement for vertical glyphs - * PS: Fix to not draw BUTT-capped zero-length dash segments - * Do device offset before float->fixed conversion - http://bugzilla.gnome.org/show_bug.cgi?id=332266 - * PS: Fix source surfaces with transformations - * PS: Fix to not draw BUTT-capped degnerate sub-paths - * PS: Don't walk off end of array when printing "~>" - * Fix some memory leaks in the test suite rig - * SVG: Fix memory leak when using cairo_mask - * Fix ExtendMode::REFLECT and EXTEND_PAD to not crash (though these are - still not yet fully implemented for surface patterns). - -This has been a tremendous effort by everyone, and I'm proud to have -been a part of it. Congratulations to all contributors to cairo! - -Snapshot 1.1.10 (2006-06-16 Carl Worth <cworth@cworth.org>) -=========================================================== -This is the fifth in a series of snapshots working toward the 1.2 -release of cairo. - -The primary motivation for this snapshot is to fix a long-standing bug -that had long been silent, but as of the 1.1.8 snapshot started -causing crashes when run against 16-bit depth X servers, (often Xvnc -or Xnest). The fix for this adds a new CAIRO_FORMAT_RGB16_565 to the -API. - -This snapshot also includes a rewrite of cairo's SVG backend to -eliminate the dependency on libxml2. With this in place, cairo 1.2 -will not depend on any libraries that cairo 1.0 did not. - -As usual, there are also a few fixes for minor bugs. - -Snapshot 1.1.8 (2006-06-14 Carl Worth <cworth@cworth.org>) -========================================================== -This is the fourth in a series of snapshots working toward the 1.2 -release of cairo. At this point, all major features of the 1.2 release -are in place, leaving just a few bug fixes left. - -In particular, there well be no additional API changes between this -1.1.8 snapshot and the 1.2 release. - -The announcement for 1.1.6 mentioned several API changes being -considered. Only one of these changes was actually implemented -(set_dpi -> fallback_resolution). This change does introduce one -source-level incompatibility with respect to previous 1.1.x snapshots, -so see below for details. - -Here is an abbreviated summary of changes since the 1.1.6 snapshot: - -** API Change ** ----------------- -According to the plan mentioned in the 1.1.6 notes, one source-level -incompatible change has been implemented. The following three -functions have been removed from cairo's API: - - cairo_pdf_surface_set_dpi - cairo_ps_surface_set_dpi - cairo_svg_surface_set_dpi - -and in their place the following function has been added: - - cairo_surface_set_fallback_resolution - -The signature and semantics of the function remains the same, so it is -a simple matter of changing the name of the function when calling -it. As a transition mechanism, this snapshot will (on many systems) -build to include the old symbols so that code previously compiled will -still run. However, all source code using the old names must be -updated before it will compile. And the upcoming 1.2 release is not -anticipated to include the old symbols. - -Finally, it should be pointed out that the old symbols never existed -in the supported API of any stable release of cairo. (In the stable -1.0 releases the PDF, PS, and SVG backends were advertised as -experimental and unstable.) - -And, as always, cairo continues to maintain source and binary -compatibility between major releases. So applications compiled against -supported backends in a stable release of cairo (1.0.4 say) will -continue to compile and run without modification against new major -releases (1.2.0 say) without modification. - -API additions -------------- -The following new functions have been added to cairo's API: - - cairo_surface_get_content - cairo_debug_reset_static_data - cairo_image_surface_get_data - cairo_image_surface_get_format - cairo_image_surface_get_stride - cairo_win32_font_face_create_for_hfont - -New, backend-specific pkg-config files --------------------------------------- -In addition to the original cairo.pc file, cairo will also now install -a pkg-config files for each configured backend, (for example -cairo-pdf.pc, cairo-svg.pc, cairo-xlib.pc, cairo-win32.pc, etc.) this -also includes optional font backends (such as cairo-ft.pc) and the -optional png functionality (cairo-png.pc). - -These new pkg-config files should be very convenient for allowing -cairo-using code to easily check for the existing of optional -functionality in cairo without having to write complex rules to grub -through cairo header files or the compiled library looking for -symbols. - -Printing backend (PS, PDF, and SVG) ------------------------------------ -Improving the quality of the "printing" backends has been a priority -of the development between cairo 1.1.6 and cairo 1.1.8. - -The big improvement here is in the area of text output. Previously, at -best, text was output as paths without taking advantage of any font -support available in the output file format. - -Now, at the minimum text paths will be shared by using type3 fonts -(for PS and PDF---and similarly, defs for SVG). Also, if possible, -type3 and truetype fonts will be embedded in PostScript and PDF -output. There are still some known bugs with this, (for example, -selecting text in a cairo-generated PDF file with an embedded truetype -font does not work). So there will be some more changes in this area -before cairo 1.2, but do try test this feature out as it exists so -far. - -Many thanks to Kristian Høgsberg for the truetype and type1 font -embedding. - -win32 backend -------------- -Performance improvements by preferring GDI over pixman rendering when possible. -Fixes for text rendering. - -xlib backend ------------- -Fix potentially big performance bug by making xlib's create_similar -try harder to create a pixmap of a depth matching that of the screen. - -Bug fixes ---------- -Among various other fixes, the following bugs listed in bugzilla have -been fixed: - - Bug 2488: Patch to fix pixman samping location bug (#2488). - https://bugs.freedesktop.org/show_bug.cgi?id=2488 - - Bug 4196: undef MIN an MAX before defining to avoid duplicate definition - https://bugs.freedesktop.org/show_bug.cgi?id=4196 - - Bug 4723: configure.in: Fix m4 quoting when examining pkg-config version - https://bugs.freedesktop.org/show_bug.cgi?id=4723 - - Bug 4882: Flag Sun's X server has having buggy_repeat. - https://bugs.freedesktop.org/show_bug.cgi?id=4882 - - Bug 5306: test/pdf2png: Add missing include of stdio.h - https://bugs.freedesktop.org/show_bug.cgi?id=5306 - - Bug 7075: Fix make clean to remove cairo.def - https://bugs.freedesktop.org/show_bug.cgi?id=7075 - -(Many thanks to Behdad Esfahbod for helping us track down and fix many -of these.) - -Snapshot 1.1.6 (2006-05-04 Carl Worth <cworth@cworth.org>) -========================================================== -This is the third in a series of snapshots working toward the imminent -1.2 release of cairo. For a list of items still needing work on the -cairo 1.2 roadmap, please see: - - http://cairographics.org/ROADMAP - -As can be seen in that list, there are no longer any API additions -left on the roadmap. Instead, there is a feature (PDF type 3 fonts) a -performance optimization (X server gradients) and a list of bug -fixes. This gives us a fair amount of freedom to cut the 1.2 release -at almost any point by deciding to defer remaining bug fixes to -subsequent maintenance releases such as 1.2.2 and 1.2.4. - -Before we will do that, we must first be wiling to commit to all the -new API additions. As a heads-up, there are a couple of potential API -changes being considered. (Note that these are changes to new API -introduced during 1.1 so these will not introduce API -incompatibilities compared to the stable 1.0 series). The changes -being considered are: - - cairo_get_group_target: may acquire x and y offset return - parameters. May also be eliminated in favor of - cairo_get_target assuming its role - - cairo_pdf_surface_set_dpi: - cairo_ps_surface_set_dpi: - cairo_svg_surface_set_dpi: These functions may be removed in favor - of a new cairo_surface_set_fallback_resolution - -Additionally there is the possibility of a slight change in the -semantics of cairo_set_line_width. We believe the current behavior of the sequence: - - cairo_set_line_width; ... change CTM ...; cairo_stroke; - -is buggy. It is currently behaving the same as: - - ... change CTM ...; cairo_set_line_width; cairo_stroke; - -We are considering fixing this bug before 1.2 with the hope that -nobody is already relying on the buggy behavior described here. Do -shout if you suspect you might be in that position. - -The items included in this snapshot (since the 1.1.4 snapshot) are -described below. - -API additions -------------- -The long-awaited group-rendering support is now available with the -following function calls: - - cairo_push_group - cairo_push_group_with_content - cairo_pop_group - cairo_pop_group_to_source - cairo_get_group_target - -This API provides a much more convenient mechanism for doing rendering -to an intermediate surface without the need to manually create a -temporary cairo_surface_t and a temporary cairo_t and clean them up -afterwards. - -Add the following missing get function to complement -cairo_surface_set_device_offset: - - cairo_surface_get_device_offset - -PDF backend (API addition) --------------------------- -The PDF backend now provides for per-page size changes, (similar to -what the PostScript backend got in the 1.1.4 snapshot). The new API -is: - - cairo_pdf_surface_set_size - -Xlib backend (API additions) ----------------------------- -The following functions have been added to allow the extraction of -Xlib surface: - - cairo_xlib_surface_get_display - cairo_xlib_surface_get_drawable - cairo_xlib_surface_get_screen - cairo_xlib_surface_get_visual - cairo_xlib_surface_get_depth - -XCB backend (experimental) --------------------------- -Update backend so that it now compiles with the recent XCB 0.9 release. - -Bug fixes and memory leak cleanup ---------------------------------- -Various little things, nothing too significant though. - -Snapshot 1.1.4 (2006-05-03 Carl Worth <cworth@cworth.org>) -========================================================== -This is the second in a series of snapshots working toward the -upcoming 1.2 release of cairo. For a list of items still needing work -on the cairo 1.2 roadmap, please see: - - http://cairographics.org/ROADMAP - -The items included in this snapshot (since the 1.1.2 snapshot) are -described below. - -PostScript backend: new printing-oriented API ---------------------------------------------- -We anticipate that with cairo 1.2, toolkits will begin to use cairo -for printing on systems that use PostScript as the spool format. To -support this use case, we have added 4 new function calls that are -specific to the PostScript backend: - - cairo_ps_surface_set_size - cairo_ps_surface_dsc_comment - cairo_ps_surface_dsc_begin_setup - cairo_ps_surface_dsc_begin_page_setup - -These functions allow variation of the page size/orientation from one -page to the next in the PostScript output. They also allow the toolkit -to provide per-document and per-page printer control options in a -device-independent way, (for example, by using PPD options and -emitting them as DSC comments into the PostScript output). This should -allow toolkits to provide very fine-grained control of many options -available in printers, (media size, media type, tray selection, etc.). - -SVG backend: builds by default, version control ------------------------------------------------ -The SVG backend continues to see major improvements. It is expected -that the SVG backend will be a supported backend in the 1.2 -release. This backend will now be built by default if its dependencies -(freetype and libxml2) are met. - -Additionally, the SVG backend now has flexibility with regard to what -version of SVG it targets. It will target SVG 1.1 by default, which -will require image fallbacks for some of the "fancier" cairo -compositing operators. Or with the following new function calls: - - cairo_svg_surface_restrict_to_version - cairo_svg_get_versions - cairo_svg_version_to_string - -it can be made to target SVG 1.2 in which there is native support for -these compositing operators. - -Bug fixes ---------- -At least the following bugs have been fixed since the 1.1.2 snapshot: - -crash at XRenderAddGlyphs -https://bugs.freedesktop.org/show_bug.cgi?id=4705 - -Can't build cairo-1.1.2 on opensolaris due to " void function cannot return value" -https://bugs.freedesktop.org/show_bug.cgi?id=6792 - -Missing out-of-memory check at gfx/cairo/cairo/src/cairo-atsui-font.c:185 -https://bugzilla.mozilla.org/show_bug.cgi?id=336129 - -A couple of memory leaks. - -Snapshot 1.1.2 (2006-04-25 Carl Worth <cworth@cworth.org>) -========================================================== -This is the first in a series of snapshots working toward the upcoming -1.2 release of cairo. (Subsequent snapshot will use successive even -numbers for the third digit, 1.1.4, 1.1.6, etc.) This snapshot is -backwards-compatible with the 1.0 series---it makes a few API -additions but does not remove any API. - -PostScript and PDF backends are no longer "experimental" --------------------------------------------------------- -The major theme of the 1.2 release is improved PostScript and PDF -backends for cairo. Unlike the 1.0 series, in the 1.2 series these -backends will not be marked as experimental and will be enabled by -default. We encourage people to test this snapshot and the PS/PDF -backends in particular as much as possible. - -The PostScript and PDF output is not yet ideal. - - * One major problem with the PostScript output is that image - fallbacks are used more often than strictly necessary, and the - image fallbacks are at a lower resolution than desired, (the - cairo_ps_surface_set_dpi call is ignored). - - * The major drawback of the current PDF backend implementation is - its text support. Every glyph is represented by a filled path in - the PDF file. The causes file sizes to be much larger and - rendering to be much slower than desired. - -It is anticipated that both of these shortcomings will see some -improvements before the final 1.2 release. - -In spite of those shortcomings, we hope that the PS and PDF backends -will yield faithful results for pretty much any cairo operations you -can throw at them. Please let us know if you are getting obviously -"different" results from the PS/PDF backends than from the image or -xlib backends. - -Other new experimental backends -------------------------------- -This snapshot includes three new backends that did not exist in the -1.0 series: - - * beos backend - - * directfb backend - - * svg backend - -These are all currently marked "experimental" and are disabled by -default. But the SVG backend in particular has seen a lot of recent -development and is very close to passing the entire cairo test -suite. It is possible that this backend will become a fully supported -backend by the time of the cairo 1.2 release. - -Public API additions --------------------- -There have been a few new API functions added to cairo, including: - -New get_type functions for querying sub-types of object: - - cairo_surface_get_type - cairo_pattern_get_type - cairo_font_face_get_type - cairo_scaled_font_get_type - -More convenience in working with cairo_scaled_font_t with new getter -functions: - - cairo_scaled_font_get_font_face - cairo_scaled_font_get_font_matrix - cairo_scaled_font_get_ctm - cairo_scaled_font_get_font_options - -As well as a convenience function for setting a scaled font into a -cairo context: - - cairo_set_scaled_font - -and a function to allow text extents to be queried directly from a -scaled font, (without requiring a cairo_surface_t or a cairo_t): - - cairo_scaled_font_text_extents - -These new scaled font functions were motivated by the needs of the -pango library. - -Finally, a new path-construction function was added which clears the -current point in preparation for a new sub path. This makes cairo_arc -easier to use in some situations: - - cairo_new_sub_path - -Before the 1.2 release is final we do still plan a few more API -additions specifically motivated by the needs of Mozilla/Firefox. - -Optimizations and bug fixes ---------------------------- -Shortly after the 1.0 maintenance series branched off the mainline -there was a major rework of the cairo font internals. This should -provide some good performance benefits, but it's also another area -people should look at closely for potential regressions. - -There has not yet been any widespread, systematic optimization of -cairo, but various performance improvements have been made, (and some -of them are fairly significant). So if some things seem faster than -1.0 then things are good. If there are any performance regressions -compared to 1.0 then there is a real problem and we would like to hear -about that. - -There has been a huge number of bug fixes---too many to mention in -detail. Again, things should be better, and never worse compared to -1.0. Please let us know if your testing shows otherwise. - -Release 1.0.2 (2005-10-03 Carl Worth <cworth@cworth.org>) -========================================================= -For each bug number XXXX below, see: - - https://bugs.freedesktop.org/show_bug.cgi?id=XXXX - -for more details. - -General bug fixes ------------------ - * 4408 - Add support for dashing of stroked curves - (Carl Worth) - - * 4409 - Fix dashing so that each dash is capped on both ends - (Carl Worth) - - * 4414 - Prevent SIGILL failures (proper use of -mmmx and -msse flags) - (Sebastien Bacher, Billy Biggs) - - * 4299 - Fix crashes with text display in multi-threaded program - (Alexey Shabalin, Carl Worth) - - * 4401 - Do not use sincos function since it is buggy on some platforms) - (Tim Mooney, Carl Worth) - - * 4245 - Fix several bugs in the test suite exposed by amd64 systems - (Seemant Kulleen, Carl Worth) - - * 4321 - Add missing byteswapping on GetImage/PutImage - (Sjoerd Simons, Owen Taylor) - - * 4220 - Make the check for rectangular trapezoids simpler and more accurate - (Richard Stellingwerff, Owen Taylor) - - * 4260 - Add missing channel-order swapping for antialised fonts - (Barbie LeVile, Owen Taylor) - - * 4283 - Fix compilation failure with aggressive inlining (gcc -O3) - (Marco Manfredini, Owen Taylor) - - * 4208 - Fix some warnings from sparse - (Kjartan Maraas, Billy Biggs) - - * 4269 - Fix to not crash when compiled with -fomit-frame-pointer - (Ronald Wahl, Owen Taylor) - - * 4263 - Improve performance for vertical gradients - (Richard Stellingwerff, Owen Taylor) - - * 4231 - * 4298 - Accomodate gentoo and Mandriva versions in X server vendor string check - (Billy Biggs, Frederic Crozat, Owen Taylor) - -win32-specific fixes --------------------- - * 4599 - Fix "missing wedges" on some stroked paths (win32) - (Tim Rowley, Jonathan Watt, Bertram Felgenhauer, Carl Worth, Keith Packard) - - * 4612 - Fix disappearing text if first character out of surface (win32) - (Tim Rowley) - - * 4602 - Fix shutdown of cairo from failing intermediate, size-0 bitmaps (win32) - Aka. the "white rectangles" bug from mozilla-svg testing - (Tim Rowley) - - * Various portability improvements for win32 - (Hans Breuer, Owen Taylor, Carl Worth) - - * 4593 - Fix font sizes to match user expectations (win32) - (Tor Lillqvist, Owen Taylor) - - * 3927 - Fix to report metrics of size 0 for glyph-not-available (win32) - (Hans Breuer, Owen Taylor, Tor Lillqvist) - - * Add locking primitives for win32 - (Hans Breuer) - -xlib-specific fixes -------------------- - * Fix crash from size-0 pixmap due to empty clip region (xlib) - (Radek DoulÃk, Carl Worth) - -Release 1.0.0 (2005-08-24 Carl Worth <cworth@cworth.org>) -========================================================= -Experimental backends ---------------------- - * The Glitz, PS, PDF, Quartz, and XCB backends have been declared - experimental, and are not part of the API guarantees that accompany - this release. They are not built by default, even when the required - libraries are available, and must be enabled explicitly with - --enable-ps, --enable-pdf, --enable-quartz or --enable-xcb. - - It is very painful for us to be pushing out a major release without - these backends enabled. There has been a tremendous amount of work - put into each one and all are quite functional to some - extent. However, each also has some limitations. And none of these - backends have been tested to the level of completeness and - correctness that we expect from cairo backends. - - We do encourage people to experiment with these backends and report - success, failure, or means of improving them. - -Operator behavior ------------------ - * Prior to 0.9.0 the SOURCE, CLEAR and a number of other operators - behaved in an inconsistent and buggy fashion and could affect areas - outside the clip mask. In 0.9.0, these six "unbounded" operators - were fixed to consistently clear areas outside the shape but within - the clip mask. This is useful behavior for an operator such as IN, - but not what was expected for SOURCE and CLEAR. So, in this release - the behavior of SOURCE and CLEAR has been changed again. They now - affect areas only within both the source and shape. We can write - the new operators as: - - SOURCE: dest' = (mask IN clip) ? source : dest - CLEAR: dest' = (mask IN clip) ? 0 : dest - -Behavior and API changes ------------------------- - * Setting the filter on a gradient pattern would change the - interpolation between color stops away from the normal linear - interpolation. This dubious behavior has been removed. - - * The CAIRO_CONTENT_VALID() and CAIRO_FORMAT_VALID() macros -- - implementation details that leaked into cairo.h -- have been moved - into an internal header. - - * The cairo_show_text function now advances the current point - according to the total advance values of the string. - -API additions -------------- - * cairo_set_dash can now detect error and can set - CAIRO_STATUS_INVALID_DASH. - -Features --------- - * When compiled against recent versions of fontconfig and FreeType, - artificial bold fonts can now be turned on from fonts.conf using - the FC_EMBOLDEN fontconfig key. - -Optimization ------------- - * The compositing code from the 'xserver' code tree has now been - completely merged into libpixman. This includes MMX optimization of - common operations. - - * The image transformation code in libpixman has been improved and - now performs significantly faster. - -Bug fixes ---------- - * Several crashes related to corruption in the font caches have been - fixed. - - * All test cases now match pixel-for-pixel on x86 and PPC; this - required fixing bugs in the compositing, stroking, and pattern - rendering code. - - * Negative dash offsets have been fixed to work correctly. - - * The stroking of paths with mutiple subpaths has now been fixed to - apply caps to all subpaths rather than just the last one. - - * Many build fixes for better portability on various systems. - - * Lots of other bug fixes, but we're too tired to describe them in - more detail here. - -Release 0.9.2 (2005-08-13 Carl Worth <cworth@cworth.org>) -========================================================= -Release numbering ------------------ - * You will notice that this release jumped from 0.9.0 to 0.9.2. We've - decided to use an odd micro version number (eg. 0.9.1) to indicate - in-progress development between releases. As soon as 0.9.2 is - tagged, the version will be incremented in CVS to 0.9.3 where it - will stay until just before 0.9.4 is built, uploaded, and tagged. - - So, even-micro == a released version, odd-micro == something in-between. - -Libpixman dependency dropped ----------------------------- - * As of this release, the dependency on an external libpixman has - been dropped. Instead, the code from libpixman needed for cairo has - been incorporated into the cairo source tree. The motivation for - this change is that while cairo's API is stable and ready to be - maintained after the 1.0 release, libpixman's API is not, so we do - not want to expose it at this time. - - Also, the incorporation of libpixman into cairo also renames all - previously-public libpixman symbols in order to avoid any conflict - with a future release of libpixman - -API additions -------------- - * Macros and functions have been added so that the version of cairo - can be queried at either compile-time or at run-time. The version - is made available as both a human-readable string and as a single - integer: - - CAIRO_VERSION_STRING eg. "0.9.2" - CAIRO_VERSION eg. 000902 - - const char* - cairo_version_string (void); /* eg. "0.9.2" */ - - int - cairo_version (void); /* eg. 000902 */ - - A macro is provided to convert a three-part component version into - the encoded single-integer form: - - CAIRO_VERSION_ENCODE(X,Y,Z) - - For example, the CAIRO_VERSION value of 000902 is obtained as - CAIRO_VERSION_ENCODE(0,9,2). The intent is to make version - comparisons easy, either at compile-time: - - #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(0,9,2) - ... - #endif - - Or at run-time: - - if (cairo_version() >= CAIRO_VERSION_ENCODE(0,9,2)) { /* ... */ } - -Thread safety -------------- - * This release adds pthread-based locking (when available) to make - the caches used by cairo safe for threaded programs. Some may - remember a failed experiment with this locking between the 0.5.1 - and 0.5.2 snapshots, (where even single-threaded programs that - linked with -lpthread would deadlock). We believe that that problem - has been fixed, so we are looking forward to testing and reports - from users with threaded applications. - -Bug fixes ---------- - * The XCB and Quartz backends failed to compiled in the 0.9.0 release - due to minor syntax errors. These have now been fixed. - - * Various crashes in glitz and pixman due to size 0 glyphs have been - fixed. - -Release 0.9.0 (2005-08-08 Carl Worth <cworth@cworth.org>) -========================================================= -Soname change -------------- - * In all prior snapshots, the libtool library versioning was set to - 1:0:0. As this release is intended to mark the beginning of - backwards-compatible releases, the versioning has been incremented - to 2:0:0. You will notice that the numeric extension on the - installed library filename will change similarly. - - This change will also require all cairo-using applications to be - recompiled. We recognize that this may cause some frustration since - this release is backwards-compatible with 0.6.0 and in that sense - "shouldn't" require re-compilation. However, since all historical - snapshots have used the same 1:0:0 version in spite of incompatible - API changes between them, it was essential that the upcoming 1.0 - release series have distinct library versioning. - - All future releases will use the library versioning to properly - indicate compatibility between releases. So, any application - re-compiled now to work with the 0.9.0 will not need to be - recompiled when a compatible 1.0 release of cairo is made in the - future. - -API additions -------------- - * Add new function calls to set/get the current antialiasing mode in - the graphics state: - - cairo_set_antialias - cairo_get_antialias - - This call accepts the same modes recently added for font options - (NONE or GRAY) but affects the rendering of geometry other than - text. The intent of this call is to enable more precise control of - which pixels are affected by each operation, for example to allow - for full-scene antialiasing for seam-free rendering. It is not - expected that non-antialiased rendering will perform better than - anti-aliased rendering. - - * Three new functions were added to provide support for mixed cairo- - and non-cairo drawing to the same surface: - - cairo_surface_mark_dirty - cairo_surface_mark_dirty_rectangle - cairo_surface_flush - - * The return type of the several "reference" functions was change, - (API compatibly), from void to the same type as the argument. The - affected functions are: - - cairo_font_face_reference - cairo_scaled_font_reference - cairo_pattern_reference - cairo_surface_reference - cairo_reference - - This allows a convenient way to assign and reference in a single - statement. - -Semantic changes ----------------- - * The behavior of cairo_set_source with a pattern with a non-identity - matrix was previously not well-defined. The new behavior is as - follows: - - The pattern's transformation matrix will be locked to the - user space in effect at the time of cairo_set_source(). This means - that further modifications of the CTM will not affect the source - pattern. - -cairo-win32 ------------ - * Some portability improvements, (eg. workaround for missing stdint.h). - -cairo-ft --------- - * Updated to allow compilation with older versions of freetype. - -Bug fixes ---------- - * Fix the unbounded operators to actually produce a correct result, - (previously the results were artificially restricted to the - bounding box of whatever shape was being drawn rather than - extending out infinitely). The fixed operators are: - - CAIRO_OPERATOR_CLEAR - CAIRO_OPERATOR_SOURCE - CAIRO_OPERATOR_OUT - CAIRO_OPERATOR_IN - CAIRO_OPERATOR_DEST_IN - CAIRO_OPERATOR_DEST_ATOP - - * Fix cairo_mask and cairo_mask_surface to transform the mask by the - current transformation matrix (CTM). - - * Fix cairo_set_source to lock the CTM used to transform the pattern. - - * Workaround for X server Render bug involving repeating patterns - with a general transformation matrix. - - * cairo_get_font_face fixed to return a "nil" font face object rather - than NULL on error. - - * cairo_set_font_face fixed to not crash if given a NULL font face, - (which is the documented interface for restoring the default font - face). - - * Fix xlib glyphset caching to not try to free a NULL glyph. - -Snapshot 0.6.0 (2005-07-28 Carl Worth <cworth@cworth.org>) -========================================================== -API changes ------------ -* The prototypes of the following functions have changed: - - cairo_xlib_surface_create_with_xrender_format - cairo_xlib_surface_create_for_bitmap - - A Screen* parameter has been added to each. This allows the cairo - xlib backend to work correctly with multi-head X servers. - -* The following function has been modified: - - cairo_scaled_font_create - - to accept a cairo_font_options_t*. See below fore more details. - -* All opaque, reference-counted cairo objects have now been moved to a - standard error-handling scheme. The new objects to receive this - treatment are cairo_font_face_t, cairo_scaled_font_t, and - cairo_surface_t. (Previous snapshots already provided this scheme - for cairo_t, cairo_path_t, and cairo_pattern_t.) - - This changes two functions to have a return type of void rather than - cairo_status_t: - - cairo_scaled_font_extent - cairo_surface_finish - - And significantly, none of the create functions for any of the - objects listed above will return NULL. The pointer returned from any - function will now always be a valid pointer and should always be - passed to the corresponding destroy function when finished - - The simplest strategy for porting code is to switch from: - - object = cairo_<object>_create (); - if (object == NULL) - goto BAILOUT; - - /* act on object */ - - cairo_<object>_destroy (object); - - to: - - object = cairo_<object>_create (); - if (cairo_<object>_status (object)) - goto BAILOUT; - - /* act on object */ - - cairo_<object>_destroy (object); - - But significantly, it is not required to check for an error status - before the "act on object" portions of the code above. All - operations on an object with an error status are, by definition, - no-ops without side effect. So new code might be written in an - easier-to-read style of: - - object = cairo_<object>_create (); - - /* act on object */ - - cairo_<object>_destroy (object); - - with cairo_<object>_status checks placed only at strategic - locations. For example, passing an error object to another object, - (eg. cairo_set_source with an in-error pattern), will propagate the - error to the subsequent object (eg. the cairo_t). This means that - error checking can often be deferred even beyond the destruction of - a temporary object. - -API additions -------------- -* New functions for checking the status of objects that have been - switched to the common error-handling scheme: - - cairo_font_face_status - cairo_scaled_font_status - cairo_surface_status - -* The _cairo_error function which was added in 0.5.1 has now been made - much more useful. In 0.5.1 only errors on cairo_t objects passed - through _cairo_error. Now, an error on any object should pass - through _cairo_error making it much more reliable as a debugging - mechanism for finding when an error first occurs. - -* Added new font options support with a myriad of functions: - - cairo_font_options_create - cairo_font_options_copy - cairo_font_options_destroy - - cairo_font_options_status - - cairo_font_options_merge - cairo_font_options_equal - cairo_font_options_hash - - cairo_font_options_set_antialias - cairo_font_options_get_antialias - cairo_font_options_set_subpixel_order - cairo_font_options_get_subpixel_order - cairo_font_options_set_hint_style - cairo_font_options_get_hint_style - cairo_font_options_set_hint_metrics - cairo_font_options_get_hint_metrics - - cairo_surface_get_font_options - - cairo_ft_font_options_substitute - - cairo_set_font_options - cairo_get_font_options - - This new font options support allows the application to have much - more fine-grained control over how fonts are rendered. - Significantly, it also allows surface backends to have some - influence over the process. For example, the xlib backend now - queries existing Xft properties to set font option defaults. - -* New function: - - cairo_xlib_surface_set_drawable - - which allows the target drawable for an xlib cairo_surface_t to be - changed to another with the same format, screen, and display. This - is necessary in certain double-buffering techniques. - -New features ------------- -* Sub-pixel text antialiasing is now supported. - -Bug fixes ---------- -* Fixed assertion failure in cairo_surface_create_similar when - application commits an error by passing a cairo_format_t rather than - a cairo_content_t. - -* Avoid division by zero in various places (cairo-ft). - -* Fix infinite loop when using non-default visuals (cairo-xlib). - -* Eliminate segfault in cairo_image_surface_create_from_png_stream. - -* Prevent errant sign-extension of masks on 64-bit architectures - (cairo-xlib and cairo-xcb). - -* Other miscellaneous fixes. - -Snapshot 0.5.2 (2005-07-18 Carl Worth <cworth@cworth.org>) -========================================================== -API changes ------------ -* New functions for creating patterns of a single color: - - cairo_pattern_create_rgb - cairo_pattern_create_rgba - -* Change cairo_surface_create_similar to accept a new type of - cairo_content_t rather than cairo_format_t: - - typedef enum _cairo_content { - CAIRO_CONTENT_COLOR = 0x1000, - CAIRO_CONTENT_ALPHA = 0x2000, - CAIRO_CONTENT_COLOR_ALPHA = 0x3000 - } cairo_content_t; - -* Add new CAIRO_FORMAT_VALID and CAIRO_CONTENT_VALID macros. - -* Remove unused status value: - - CAIRO_STATUS_NO_TARGET_SURFACE - -* Add new status values: - - CAIRO_STATUS_INVALID_STATUS - -* Require libpixman >= 0.1.5 (for necessary bug fixes) - -Bug fixes ---------- -* Fix cairo_surface_write_to_png for RGB24 images. - -* Fix broken metrics and rendering for bitmap fonts. Add mostly - useless bitmap glyph transformation. - -* Fix glyph caches to not eject entries that might be immediately - needed, (fixing intermittent crashes when rendering text). - -* Fix all memory leaks found by running "make check-valgrind". - -ATSUI backend changes ---------------------- -* Allow building against < 10.3 SDK. - -* Prevent crash on empty strings. - -Glitz backend changes ---------------------- -* Require glitz >= 0.4.4. - -* Use frame buffer objects instead of pbuffers for accelerated - offscreen drawing. - -* Minor improvement to gradient pattern creation. - -PostScript backend fixes ------------------------- -* Rewrite of the PS backend to generate more interesting output that - the old big-image implementation. - -Win32 backend fixes -------------------- -* Implement glyph path support. - -* Fix swap of blue and green values in the fill_rectangles path. - -Xlib backend fixes ------------------- -* Add optimization to use XCopyArea rather than XRenderComposite when - transforming only with an integer translation, and using SOURCE - operator or OVER with a source pattern without alpha. - -Snapshot 0.5.1 (2005-06-20 Carl Worth <cworth@cworth.org>) -========================================================== -API changes ------------ -* Removed cairo_status_string(cairo_t*) and add - cairo_status_to_string(cairo_status_t) in its place. Code using - cairo_status_string can be ported forward as follows: - - cairo_status (cr); - -> - cairo_status_to_string (cairo_status (cr)); - -* Removed the BAD_NESTING restriction which means that two different - cairo_t objects can now interleave drawing to the same - cairo_surface_t without causing an error. - -* The following functions which previously had a return type of - cairo_status_t now have a return type of void: - - cairo_pattern_add_color_stop_rgba - cairo_pattern_set_matrix - cairo_pattern_get_matrix - cairo_pattern_set_extend - cairo_pattern_set_filter - - See discussion of cairo_pattern_status below for more details. - -API additions -------------- -* Improved error handling: - - cairo_status_t - cairo_pattern_status (cairo_pattern_t *pattern); - - This snapshot expands the status-based error handling scheme from - cairo_t to cairo_path_t and cairo_pattern_t. It also expands the - scheme so that object-creating functions, (cairo_create, - cairo_pattern_create_*, cairo_copy_path_*), are now guaranteed to - not return NULL. Instead, in the case of out-of-memory these - functions will return a static object with - status==CAIRO_STATUS_NO_MEMORY. The status can be checked with the - functions cairo_status and cairo_pattern_status, or by direct - inspection of the new status field in cairo_path_t. - - Please note that some objects, including cairo_surface_t and all of - the font-related objects have not been converted to this - error-handling scheme. - -* In addition to the above changes, a new private function has been added: - - _cairo_error - - This function can be used to set a breakpoint in a debugger to make - it easier to find programming error in cairo-using code. (Currently, - _cairo_error is called when any error is detected within a cairo_t - context, but is not called for non-cairo_t errors such as for - cairo_path_t and cairo_pattern_t). - -* Fixed cairo_path_data_t so that its enum is visible to C++ code, (as - cairo_path_data_type_t). - -Performance improvements ------------------------- -* Made a minor performance improvement for clipping, (restrict clip - surface to the new intersected bounds). - -* Optimize rendering of a solid source pattern with a pixel-aligned - rectangular path to use backend clipping rather than rasterization - and backend compositing. - -* Optimize cairo_paint_with_alpha to defer to cairo_paint when alpha - is 1.0. - -Bug fixes ---------- -* Fixed memory leak in cairo_copy_path. - -* A build fix for non-srcdir builds. - -PDF backend fixes ------------------ -* New support for path-based clipping. - -* Fix for text rotated to angles other than multiples of Ï€/2. - -Win32 backend fixes -------------------- -* Fix for text extents. - -Xlib backend ------------- -* Implemented a complex workaround for X server bug[*] related to - Render-based compositing with untransformed, repeating source - pictures. The workaround uses core Xlib when possible for - performance, (ie. with CAIRO_OPERATOR_SOURCE or CAIRO_OPERATOR_OVER - with an opaque source surface), and falls back to the pixman - image-based compositing otherwise. - - [*] https://bugs.freedesktop.org/show_bug.cgi?id=3566 - -* Various bug fixes, particularly in the fallback paths. - -Snapshot 0.5.0 (2005-05-17 Carl Worth <cworth@cworth.org>) -========================================================== -This is a pretty big, and fairly significant snapshot. It represents -between 2 and 3 months of solid work from a lot of people on improving -the API as much as possible. I'd like to express my appreciation and -congratulations to everyone who has worked on the big API Shakeup, -(whether in email battles over names, or fixing my silly bugs). - -This snapshot will require some effort on the part of users, since -there are a _lot_ of API changes (ie. no cairo program ever written is -safe --- they're all broken now in at least one way). But, in spite of -that, we do encourage everyone to move their code to this snapshot as -soon as possible. And we're doing everything we can think of to make -the transition as smooth as possible. - -The idea behind 0.5 is that we've tried to make every good API change -we could want now, and get them all done with. That is, between now -and the 1.0 release of cairo, we expect very few new API changes, -(though some will certainly sneak in). We will have some significant -additions, but the pain of moving code from cairo 0.4 to cairo 0.5 -should be a one time experience, and things should be much smoother as -we continue to move toward cairo 1.0. - -And with so many changes coming out for the first time in this 0.5 -release, we really do need a lot of people trying this out to make -sure the ideas are solid before we freeze the API in preparation for -the 1.0 release. - -OK, enough introduction. Here is a (not-quite-complete) description of -the API removals, changes and additions in this snapshot, (compared to -0.4.0) - -API removals -============ -The following public functions have been removed: - -- cairo_set_target_* - - This is a big change. See the description of cairo_create in - the API changes section for how to deal with this. - -- cairo_set_alpha - - Alpha blending hasn't gone away; there's just a much more - unified rendering model now. Almost all uses of - cairo_set_alpha will be trivially replaced with - cairo_set_source_rgba and a few others will be replaced just - as easily with cairo_paint_with_alpha. - -- cairo_show_surface - - Another useful function that we realized was muddling up the - rendering model. The replacement is quite easy: - cairo_set_source_surface and cairo_paint. - -- cairo_matrix_create -- cairo_matrix_destroy -- cairo_matrix_copy -- cairo_matrix_get_affine - - These functions supported an opaque cairo_matrix_t. We now - have an exposed cairo_matrix_t structure, so these can be - dropped. - -- cairo_surface_set_repeat -- cairo_surface_set_matrix -- cairo_surface_set_filter - - These properties don't belong on surfaces. If you were using - them, you'll just want to instead use - cairo_pattern_create_for_surface and then set these properties - on the pattern. - -- cairo_copy - - This was a confusing function and hopefully nobody will miss - it. But if you really don't find cairo_save/restore adequate, - let us know and we have another idea for a potential - replacement. - -And while we're on the subject of removals, we carefully tightened up -the cairo header files so they no longer gratuitously include header -files that are not strictly necessary, (stdio.h, stdint.h, pixman.h, -Xrender.h, etc. and their dependencies). This may lead to some -surprising errors, so keep your eyes open for that. - -API changes -=========== -Here are some of the API changes that have occurred: - -~ cairo_create(void) -> cairo_create(cairo_surface_t *) - - This is the big change that breaks every program. The ability - to re-target a cairo_t was not particularly useful, but it did - introduce a lot of muddy semantic questions. To eliminate - that, cairo_create now requires its target surface to be - passed in at creation time. This isn't too hard to cope with - as the typical first operation after cairo_create was often - cairo_set_target_foo. So the order of those two swap and the - application instead has cairo_foo_surface_create, then - cairo_create. - -~ cairo_current_* -> cairo_get_* - - We had a strange mixture of cairo_get and cairo_current - functions. They've all been standardized on cairo_get, (though - note one is cairo_get_current_point). - -~ CAIRO_OPERATOR_SRC -> CAIRO_OPERATOR_SOURCE -~ CAIRO_OPERATOR_OVER_REVERSE -> CAIRO_OPERATOR_DEST_OVER - - Many of the cairo_operator_t symbolic values were renamed to - reduce the amount of abbreviation. The confusing "OP_REVERSE" - naming was also changed to use "DEST_OP" instead which is - easier to read and has wider acceptance in other - libraries/languages. - -~ cairo_set_pattern -> cairo_set_source -~ cairo_set_rgb_color -> cairo_set_source_rgb - - All of the various functions that changed the source - color/pattern were unified to use cairo_set_source names to - make the relation more clear. - -~ cairo_transform_point -> cairo_user_to_device -~ cairo_transform_distance -> cairo_user_to_device_distance -~ cairo_inverse_transform_point -> cairo_device_to_user -~ cairo_inverse_transform_distance -> cairo_device_to_user_distance - - These names just seemed a lot more clear. - -~ cairo_init_clip -> cairo_reset_clip -~ cairo_concat_matrix -> cairo_transform - - More abbreviation elimination - -~ cairo_current_path -> cairo_copy_path -~ cairo_current_path_flat -> cairo_copy_path_flat - - The former mechanism for examining the current path was a - function that required 3 or 4 callbacks. This was more - complexity than warranted in most situations. The new - cairo_copy_path function copies the current path into an - exposed data structure, and the documentation provides a - convenient idiom for navigating the path data. - -API additions -------------- -+ cairo_paint - - A generalized version of the painting operators cairo_stroke - and cairo_fill. The cairo_paint call applies the source paint - everywhere within the current clip region. Very useful for - clearing a surface to a solid color, or painting an image, - (see cairo_set_source_surface). - -+ cairo_paint_with_alpha - - Like cairo_paint but applying some alpha to the source, - (making the source paint translucent, eg. to blend an image on - top of another). - -+ cairo_mask - - A more generalized version of cairo_paint_with_alpha which - allows a pattern to specify the amount of translucence at each - point rather than using a constant value everywhere. - -+ cairo_mask_surface - - A convenience function on cairo_mask for when the mask pattern - is already contained within a surface. - -+ cairo_surface_set_user_data -+ cairo_surface_get_user_data -+ cairo_font_face_set_user_data -+ cairo_font_face_get_user_data - - Associate arbitrary data with a surface or font face for later - retrieval. Get notified when a surface or font face object is - destroyed. - -+ cairo_surface_finish - - Allows the user to instruct cairo to finish all of its - operations for a given surface. This provides a safe point for - doing things such as flushing and closing files that the - surface may have had open for writing. - -+ cairo_fill_preserve -+ cairo_stroke_preserve -+ cairo_clip_preserve - - One interesting change in cairo is that the path is no longer - part of the graphics state managed by - cairo_save/restore. This allows functions to construct paths - without interfering with the graphics state. But it prevents - the traditional idiom for fill-and-stroke: - - cairo_save; cairo_fill; cairo_restore; cairo_stroke - - Instead we know have alternate versions cairo cairo_fill, - cairo_stroke, and cairo_clip that preserve the current path - rather than consuming it. So the idiom now becomes simply: - - cairo_fill_preserve; cairo_stroke - -+ cairo_surface_write_to_png -+ cairo_surface_write_to_png_stream - - In place of a single PNG backend, now a surface created - through any backend (except PDF currently) can be written out - to a PNG image. - -+ cairo_image_surface_create_from_png -+ cairo_image_surface_create_from_png_stream - - And its just as easy to load a PNG image into a surface as well. - -+ cairo_append_path - - With the new, exposed path data structure, it's now possible - to append bulk path data to the current path, (rather than - issuing a long sequence of cairo_move_to/line_to/curve_to - function calls). - -Xlib and XCB backends ---------------------- - -Any cairo_format_t and Colormap arguments have been dropped from -cairo_xlib_surface_create. There are also two new -cairo_xlib|xcb_surface_create functions: - - cairo_xlib|xcb_surface_create_for_bitmap - (Particular for creating A1 surfaces) - cairo_xlib|xcb_surface_create_with_xrender_format - (For any other surface types, not described by a Visual*) - -All of these surface create functions now accept width and height. In -addition, there are new cairo_xlib|xcb_surface_set_size functions -which must be called each time a window that is underlying a surface -changes size. - -Print backends (PS and PDF) ---------------------------- -The old FILE* based interfaces have been eliminated. In their place we -have two different functions. One accepts a simple const char -*filename. The other is a more general function which accepts a -callback write function and a void* closure. This should allow the -flexibility needed to hook up with various stream object in many -languages. - -In addition, when specifying the surface size during construction, the -units are now device-space units (ie. points) rather than inches. This -provides consistency with all the other surface types and also makes -it much easier to reason about the size of the surface when drawing to -it with the default identity matrix. - -Finally, the DPI parameters, which are only needed to control the -quality of fallbacks, have been made optional. Nothing is required -during surface_create (300 DPI is assumed) and -cairo_ps|pdf_surface_set_dpi can be used to set alternate values if -needed. - -Font system ------------ -Owen very graciously listened to feedback after the big font rework he -had done for 0.4, and came up with way to improve it even more. In 0.4 -there was a cairo_font_t that was always pre-scaled. Now, there is an -unscaled cairo_font_face_t which is easier to construct, (eg. no -scaling matrix required) and work with, (it can be scaled and -transformed after being set on the graphics state). And the font size -manipulation functions are much easier. You can set an explicit size -and read/modify/write the font matrix with: - - cairo_set_font_size - cairo_get_font_matrix - cairo_set_font_matrix - -(Previously you could only multiply in a scale factor or a matrix.) A -pleasant side effect is that we can (and do) now have a default font -size that is reasonable, as opposed to the old default height of one -device-space unit which was useless until scaled. - -Of course, the old pre-scaled font had allowed some performance -benefits when getting many metrics for a font. Those benefits are -still made available through the new cairo_scaled_font_t. And a -cairo_font_face_t can be "promoted" to a cairo_scaled_font_t by -suppling a font_matrix and the desired CTM. - -Quartz backend --------------- -Tim Rowley put in the work to bring the Quartz backend back after it -had been disabled in the 0.4.0 snapshot. He was not able to bring back -the function that allows one to create a cairo_font_t from an ATSUI -style: - - cairo_font_t * - cairo_atsui_font_create (ATSUStyle style); - -because he didn't have a test case for it. If you care about this -function, please provide a fairly minimal test and we'll try to bring -it back in an upcoming snapshot. - -Snapshot 0.4.0 (2005-03-08 Carl Worth <cworth@cworth.org>) -========================================================== -New documentation ------------------ -Owen Taylor has converted cairo's documentation system to gtk-doc and -has begun some long-needed work on the documentation, which can now be -viewed online here: - - http://cairographics.org/manual/ - -New backend: win32 ------------------- -This is the first snapshot to include a functional win32 backend, -(thanks to Owen Taylor). The interface is as follows: - - #include <cairo-win32.h> - - void - cairo_set_target_win32 (cairo_t *cr, - HDC hdc); - - cairo_surface_t * - cairo_win32_surface_create (HDC hdc); - - cairo_font_t * - cairo_win32_font_create_for_logfontw (LOGFONTW *logfont, - cairo_matrix_t *scale); - - cairo_status_t - cairo_win32_font_select_font (cairo_font_t *font, - HDC hdc); - - void - cairo_win32_font_done_font (cairo_font_t *font); - - double - cairo_win32_font_get_scale_factor (cairo_font_t *font); - -And see also the documentation at: - -http://cairographics.org/manual/cairo-Microsoft-Windows-Backend.html - -Disabled backend: quartz ------------------------- -Unfortunately, the quartz backend code is currently out of date with -respect to some recent backend interface changes. So, the quartz -backend is disabled in this snapshot. - -If the quartz backend is brought up-to-date before the next snapshot, -we would be glad to make a 0.4.1 snapshot that re-enables it, (we do -not expect many more big backend interface changes). - -API Changes ------------ -The font system has been revamped, (as Owen Taylor's work with -integrating pango and cairo gave us the first serious usage of the -non-toy font API). - -One fundamental, user-visible change is that the cairo_font_t object -now represents a font that is scaled to a particular device -resolution. Further changes are described below. - - cairo.h - ------- - Removed cairo_font_set_transform and cairo_font_current_transform. - - Added cairo_font_extents and cairo_font_glyph_extents. See - documentation for details: - - http://cairographics.org/manual/cairo-cairo-t.html#cairo-font-extents - - cairo-ft.h - ---------- - The cairo_ft_font API changed considerably. Please see the - documentation for details: - - http://cairographics.org/manual/cairo-FreeType-Fonts.html - -Performance ------------ -Make the fast-path clipping (pixel-aligned rectangles) faster. - -Add optimization for applying a constant alpha to a pattern. - -Optimize gradients that are horizontal or vertical in device space. - -Xlib: When RENDER is not available, use image surfaces for -intermediate surfaces rather than xlib surfaces. - -Backend-specific changes ------------------------- - Glitz - ----- - Major update to glitz backend. The output quality should now be just - as good as the image and xlib backends. - - Track changes to glitz 0.4.0. - - PDF - --- - Various improvements to produce more conformant output. - -Internals ---------- -David Reveman contributed a large re-work of the cairo_pattern_t -implementation, providing cleaner code and more optimization -opportunities. - - Backend interface changes - ------------------------- - Rework backend interface to accept patterns, not surfaces for source - and mask. - - Remove set_matrix, set_filter, and set_repeat functions. - - More sophisticated backend interface for image fallbacks, - ({acquire,release}_{source,dest}_image() and clone_similar). - -Bug fixes ---------- -Only install header files for backends that have been compiled. - -Fixed some rounding errors leading to incorrectly placed glyphs. - -Many other minor fixes. - -Snapshot 0.3.0 (2005-01-21 Carl Worth <cworth@cworth.org>) -========================================================== -Major API changes ------------------ -1) The public header files will no longer be directly installed into - the system include directory. They will now be installed in a - subdirectory named "cairo", (eg. in /usr/include/cairo rather than - in /usr/include). - - As always, the easiest way for applications to discover the - location of the header file is to let pkg-config generate the - necessary -I CFLAGS and -L/-l LDFLAGS. For example: - - cc `pkg-config --cflags --libs cairo` -o foo foo.c - - IMPORTANT: Users with old versions of cairo installed will need to - manually remove cairo.h and cairo-features.h from the - system include directories in order to prevent the old - headers from being used in preference to the new ones. - -2) The backend-specific portions of the old monolithic cairo.h have - been split out into individual public header files. The new files - are: - - cairo-atsui.h - cairo-ft.h - cairo-glitz.h - cairo-pdf.h - cairo-png.h - cairo-ps.h - cairo-quartz.h - cairo-xcb.h - cairo-xlib.h - - Applications will need to be modified to explicitly include the new - header files where appropriate. - -3) There are two new graphics backends in this snapshot, a PDF - backend, and a Quartz backend. There is also one new font backend, - ATSUI. - -PDF backend ------------ -Kristian Høgsberg has contributed a new backend to allow cairo-based -applications to generate PDF output. The interface for creating a PDF -surface is similar to that of the PS backend, as can be seen in -cairo-pdf.h: - - void - cairo_set_target_pdf (cairo_t *cr, - FILE *file, - double width_inches, - double height_inches, - double x_pixels_per_inch, - double y_pixels_per_inch); - - cairo_surface_t * - cairo_pdf_surface_create (FILE *file, - double width_inches, - double height_inches, - double x_pixels_per_inch, - double y_pixels_per_inch); - -Once a PDF surface has been created, applications can draw to it as -any other cairo surface. - -This code is still a bit rough around the edges, and does not yet -support clipping, surface patterns, or transparent gradients. Text -only works with TrueType fonts at this point and only black text is -supported. Also, the size of the generated PDF files is currently -quite big. - -Kristian is still actively developing this backend, so watch this -space for future progress. - -Quartz backend --------------- -Calum Robinson has contributed a new backend to allow cairo -applications to target native Mac OS X windows through the Quartz -API. Geoff Norton integrated this backend into the current -configure-based build system, while Calum also provided Xcode build -support in the separate "macosx" module available in CVS. - -The new interface, available in cairo-quartz.h, is as follows: - - void - cairo_set_target_quartz_context (cairo_t *cr, - CGContextRef context, - int width, - int height); - - cairo_surface_t * - cairo_quartz_surface_create (CGContextRef context, - int width, - int height); - -There is an example program available in CVS in cairo-demo/quartz. It -is a port of Keith Packard's fdclock program originally written for -the xlib backend. A screenshot of this program running on Mac OS X is -available here: - - http://cairographics.org/~cworth/images/fdclock-quartz.png - -ATSUI font backend ------------------- -This new font backend complements the Quartz backend by allowing -applications to use native font selection on Mac OS X. The interface -is a single new function: - - cairo_font_t * - cairo_atsui_font_create (ATSUStyle style); - -Minor API changes ------------------ -Prototype for non-existent function "cairo_ft_font_destroy" removed. - -Now depends on libpixman 0.1.2 or newer, (0.1.3 is being released -concurrently and has some useful performance improvements). - -Default paint color is now opaque black, (was opaque white). Default -background color is transparent (as before). - -Renamed "struct cairo" to "struct _cairo" to free up the word "cairo" -from the C++ identifier name space. - -Functions returning multiple return values through provided pointers, -(cairo_matrix_get_affine, cairo_current_point, and -cairo_current_color_rgb), will now accept NULL for values the user -wants to ignore. - -CAIRO_HAS_FREETYPE_FONT has now been renamed to CAIRO_HAS_FT_FONT. - -Performance improvements ------------------------- -Alexander Larsson provided some fantastic performance improvements -yielding a 10000% performance improvement in his application, (when -also including his performance work in libpixman-0.1.3). These include - - * Fixed handling of cache misses. - - * Creating intermediate clip surfaces at the minimal size required. - - * Eliminating roundtrips when creating intermediate Xlib surfaces. - -Implementation --------------- -Major re-work of font metrics system by Keith Packard. Font metrics -should now be much more reliable. - -Glitz backend -------------- -Updated for glitz-0.3.0. -Bug fixes in reference counting. - -Test suite ----------- -New tests for cache crashing, rotating text, improper filling of -complex polygons, and leaky rasterization. - -Bug fixes ---------- -Fixed assertion failure when selecting the same font multiple times in -sequence. - -Fixed reference counting so cache_destroy functions work. - -Remove unintended copyright statement from files generated with -PostScript backend. - -Fixed to eliminate new warnings from gcc 3.4 and gcc 4. - -Snapshot 0.2.0 (2004-10-27 Carl Worth <cworth@cworth.org>) -=========================================================== -New license: LGPL/MPL ---------------------- -The most significant news with this release is that the license of -cairo has changed. It is now dual-licensed under the LGPL and the -MPL. For details see the COPYING file as well as COPYING-LGPL-2.1 and -COPYING-MPL-1.1. - -I express my thanks to everyone involved in the license change process -for their patience and support! - -New font and glyph internals ----------------------------- -Graydon Hoare has put a tremendous amount of work into new internals -for handling fonts and glyphs, including caches where appropriate. -This work has no impact on the user-level API, but should result in -great performance improvements for applications using text. - -New test suite --------------- -This snapshot of cairo includes a (small) test suite in -cairo/test. The tests can be run with "make check". The test suite was -designed to make it very easy to add new tests, and we hope to see -many contributions here. As you find bugs, please try adding a minimal -test case to the suite, and submit it with the bug report to the -cairo@cairographics.org mailing list. This will make it much easier -for us to track progress in fixing bugs. - -New name for glitz backend --------------------------- -The gl backend has now been renamed to the glitz backend. This means -that the following names have changed: - - CAIRO_HAS_GL_SURFACE -> CAIRO_HAS_GLITZ_SURFACE - cairo_set_target_gl -> cairo_set_target_glitz - cairo_gl_surface_create -> cairo_glitz_surface_create - -This change obviously breaks backwards compatibility for applications -using the old gl backend. - -Up-to-date with latest glitz snapshots --------------------------------------- -This snapshot of cairo is now up to date with the latest glitz -snapshot, (currently 0.2.3). We know that the latest cairo and glitz -snapshots have been incompatible for a very long time. We've finally -fixed that now and we're determined to not let that happen again. - -Revert some tessellation regression bugs ----------------------------------------- -People that have been seeing some tessellation bugs, (eg. leaked -fills), in the CVS version of cairo may have better luck with this -release. A change since the last snapshot was identified to trigger -some of these bugs and was reverted before making the snapshot. The -behavior should be the same as the previous (0.1.23) snapshot. - -Miscellaneous changes ---------------------- -Changed CAIRO_FILTER_DEFAULT to CAIRO_FILTER_BEST to make gradients -easier. - -Track XCB API change regarding iterators. - -Various bug fixes ------------------ -Fix calculation of required number of vertices for pen. - -Fix to avoid zero-dimensioned pixmaps. - -Fix broken sort of pen vertices. - -Fix bug when cairo_show_text called with a NULL string. - -Fix clipping bugs. - -Fix bug in computing image length with XCB. - -Fix infinite loop bug in cairo_arc. - -Fix memory management interactions with libpixman. - -Snapshot 0.1.23 (2004-05-11 Carl Worth <cworth@isi.edu>) -======================================================== -Fixes for gcc 3.4 ------------------ -Fix prototype mismatches so that cairo can be built by gcc 3.4. - -Updates to track glitz ----------------------- -Various fixes to support the latest glitz snapshot (0.1.2). - -Gradient updates ----------------- -Radial gradients now support both inner and outer circles. -Transformed linear gradients are now properly handled. -Fixes for extend type reflect. - -Glitz updates -------------- -Converted shading routines to use fixed point values and introduced a -shading operator structure for more efficient shading calculations. -Support compositing with mask surface when mask is solid or -multi-texturing is available. - -PNG backend cleanups --------------------- -Fix output to properly compensate for pre-multiplied alpha format in cairo. -Add support for A8 and A1 image formats. - -Bug fixes ---------- -Avoid crash or infinite loop on null strings and degeneratively short -splines. - -New? bugs in cairo_clip ------------------------ -There are some fairly serious bugs in cairo_clip. It is sometimes -causing an incorrect result. And even when it does work, it is -sometimes so slow as to be unusable. Some of these bugs may not be -new, (indeed cairo_clip has only ever had a braindead-slow -implementation), but I think they're worth mentioning here. - -Snapshot 0.1.22 (2004-04-16 Carl Worth <cworth@isi.edu>) -======================================================== -Cairo was updated to track the changes in libpixman, and now depends -on libpixman version 0.1.1. - -Snapshot 0.1.21 (2004-04-09 David Reveman <c99drn@cs.umu.se>) -============================================================= -New OpenGL backend ------------------- -The OpenGL backend provides hardware accelerated output for -X11 and OS X. The significant new functions are: - - cairo_set_target_gl - cairo_gl_surface_create - -Automatic detection of available backends ------------------------------------------ -The configure script now automatically detect what backends are -available, (use ./configure --disable-`backend' to prevent -compilation of specific backends). - -Snapshot 0.1.20 (2004-04-06 Carl Worth <cworth@isi.edu>) -======================================================== -New pattern API ---------------- -David Reveman has contributed a new pattern API which enable linear -and radial gradient patterns in addition to the original surface-based -patterns. The significant new top-level functions are: - - cairo_pattern_create_linear - cairo_pattern_create_radial - cairo_pattern_create_for_surface - cairo_pattern_add_color_stop - cairo_set_pattern - -Any code using the old cairo_set_pattern, (which accepted a -cairo_surface_t rather than a cairo_pattern_t), will need to be -updated. - -Update to XCB backend ---------------------- -The XCB backend is now enabled by default, (use ./configure ---disable-xcb to turn it off). - -Faster clipping ---------------- -Graydon Hoare has added optimizations that make cairo_clip much faster -when the path is a pixel-aligned, rectangular region. - -Bug fixes. - -Snapshot 0.1.19 (2004-02-24 Carl Worth <cworth@isi.edu>) -======================================================== -New PNG backend ---------------- -Olivier Andrieu contributed a new PNG backend. It builds on the -existing image backend to make it easy to render "directly" to a -.png file. The user never needs to deal with the actual image -buffer. The significant new functions are: - - cairo_set_target_png - cairo_png_surface_create - -The PNG backend is not enabled by default so that by default there is -not a new dependency on libpng. Use ./configure --enable-png to enable -this backend. - -Snapshot 0.1.18 (2004-02-17 Carl Worth <cworth@isi.edu>) -======================================================== -Path query functionality ------------------------- -It's now possible to query the current path. The two new functions -are: - - cairo_current_path - cairo_current_path_flat - -Each function accepts a number of callback functions that will be -called for each element in the path (move_to, line_to, curve_to, -close_path). The cairo_current_path_flat function does not accept a -curve_to callback. Instead, all curved portions of the path will be -converted to line segments, (within the current tolerance value). This -can be handy for doing things like text-on-path without having to -manually interpolate Bézier splines. - -New XCB backend ---------------- -Jamey Sharp has contributed a second X backend that uses the new, lean -XCB library rather than Xlib. It cannot currently be compiled at the -same time as the Xlib backend. See ./configure --enable-xcb. - -Build fixes for cygwin. - -Bug fixes. - -Snapshot 0.1.17 (2003-12-16 Carl Worth <cworth@isi.edu>) -======================================================== - -Better text support -------------------- -This snapshot provides much better text support by implementing the -following four functions: - - cairo_text_extents - cairo_glyph_extents - cairo_text_path - cairo_glyph_path - -The text/glyph_extents functions can be used to determine the bounding -box (and advance) for text as if drawn by show_text/glyphs. - -The text/glyph_path objects functions place text shapes on the current -path, where they can be subsequently manipulated. For example, -following these functions with cairo_stroke allows outline text to be -drawn. Calling cairo_clip allows clipping to a text-shaped region. - -Combined dependencies ---------------------- -The cairo core now depends only on the libpixman library. This single -library replaces the three previous libraries libic, libpixregion, and -slim. Thanks to Dave Beckett <dave.beckett@bristol.ac.uk> for all of -the heavy lifting with this renaming effort. - -Conditional compilation of backends ------------------------------------ -Cairo now allows optional backends to be disabled at compile time. The -following options may now be passed to the configure script: - - --disable-xlib - --disable-ps - -Note that the first option is a change from the old --without-x option -which will no longer have any effect. - -OS X supported - several byte-order issues resolved ---------------------------------------------------- -Cairo has now been successfully compiled under OS X. Testing revealed -that there were some byte-order problems in the PostScript backend and -the PNG generation in the demos. These have now been resolved. - -2003-10 -======= -Graydon Hoare <graydon@redhat.com> implemented the first real text -support using Freetype/fontconfig, (previous versions of cairo used -Xft and could only draw text when using an X backend). - -2003-09 -======= -Graydon Hoare <graydon@redhat.com> added the first real support for -running cairo with a non-render-aware X server. - -Jamey Sharp <jamey@minilop.net> virtualized the backend font and -surface interfaces in September, 2003. - -2003-06 -======= -Xr is renamed cairo to avoid confusion since it no longer had a strict -dependence on X. - -2003-05 -======= -A new image surface backend is added to Xr. Keith Packard -<keithp@keithp.com> wrote the image compositing code in libic that is -used for the image_surface backend. This code was originally written -as the software fallback for the render extension within the X -server. - -2002-06 -======= -Carl Worth <cworth@isi.edu> wrote the first lines of Xr, after Keith -Packard <keithp@keithp.com> proposed the plan for a stateful drawing -library in C providing a PostScript-like rendering model. - - LocalWords: mutex BeOS extraordinaire diff --git a/gfx/cairo/cairo/README b/gfx/cairo/cairo/README index efca44cda..fc801fee3 100644 --- a/gfx/cairo/cairo/README +++ b/gfx/cairo/cairo/README @@ -1,3 +1,8 @@ +Important note: the source code included in this directory is a subset +of the library, insofar as is needed to supply functionality to the +UXP source. For the complete and unmodified source of Cairo, please +go to the website indicated below. + Cairo - Multi-platform 2D graphics library http://cairographics.org diff --git a/gfx/cairo/cairo/src/cairo-analysis-surface-private.h b/gfx/cairo/cairo/src/cairo-analysis-surface-private.h index c7dcb8291..81832126c 100644 --- a/gfx/cairo/cairo/src/cairo-analysis-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-analysis-surface-private.h @@ -1,36 +1,6 @@ -/* - * Copyright © 2005 Keith Packard - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Keith Packard - * - * Contributor(s): - * Keith Packard <keithp@keithp.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_ANALYSIS_SURFACE_H #define CAIRO_ANALYSIS_SURFACE_H diff --git a/gfx/cairo/cairo/src/cairo-analysis-surface.c b/gfx/cairo/cairo/src/cairo-analysis-surface.c index 96b43285d..2be419994 100644 --- a/gfx/cairo/cairo/src/cairo-analysis-surface.c +++ b/gfx/cairo/cairo/src/cairo-analysis-surface.c @@ -1,38 +1,6 @@ -/* - * Copyright © 2006 Keith Packard - * Copyright © 2007 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Keith Packard - * - * Contributor(s): - * Keith Packard <keithp@keithp.com> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-arc-private.h b/gfx/cairo/cairo/src/cairo-arc-private.h index 018a14b4a..e8dcc1394 100644 --- a/gfx/cairo/cairo/src/cairo-arc-private.h +++ b/gfx/cairo/cairo/src/cairo-arc-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_ARC_PRIVATE_H #define CAIRO_ARC_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-arc.c b/gfx/cairo/cairo/src/cairo-arc.c index 56d42f19e..54a0723d0 100644 --- a/gfx/cairo/cairo/src/cairo-arc.c +++ b/gfx/cairo/cairo/src/cairo-arc.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-array.c b/gfx/cairo/cairo/src/cairo-array.c index 2d11402a3..442540c58 100644 --- a/gfx/cairo/cairo/src/cairo-array.c +++ b/gfx/cairo/cairo/src/cairo-array.c @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-atomic-private.h b/gfx/cairo/cairo/src/cairo-atomic-private.h index af462e370..e14c5fdaf 100644 --- a/gfx/cairo/cairo/src/cairo-atomic-private.h +++ b/gfx/cairo/cairo/src/cairo-atomic-private.h @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Chris Wilson - * Copyright © 2010 Andrea Canciani - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - * Andrea Canciani <ranma42@gmail.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_ATOMIC_PRIVATE_H #define CAIRO_ATOMIC_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-atomic.c b/gfx/cairo/cairo/src/cairo-atomic.c index 2af50cd38..fd5ee930b 100644 --- a/gfx/cairo/cairo/src/cairo-atomic.c +++ b/gfx/cairo/cairo/src/cairo-atomic.c @@ -1,35 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-base64-stream.c b/gfx/cairo/cairo/src/cairo-base64-stream.c index 636431372..02ca8bd45 100644 --- a/gfx/cairo/cairo/src/cairo-base64-stream.c +++ b/gfx/cairo/cairo/src/cairo-base64-stream.c @@ -1,40 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005-2007 Emmanuel Pacaud <emmanuel.pacaud@free.fr> - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Author(s): - * Kristian Høgsberg <krh@redhat.com> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-base85-stream.c b/gfx/cairo/cairo/src/cairo-base85-stream.c index f81affb49..ba19ff4a2 100644 --- a/gfx/cairo/cairo/src/cairo-base85-stream.c +++ b/gfx/cairo/cairo/src/cairo-base85-stream.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Author(s): - * Kristian Høgsberg <krh@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-bentley-ottmann-rectangular.c b/gfx/cairo/cairo/src/cairo-bentley-ottmann-rectangular.c index 8c1d54f0c..4736f4f41 100644 --- a/gfx/cairo/cairo/src/cairo-bentley-ottmann-rectangular.c +++ b/gfx/cairo/cairo/src/cairo-bentley-ottmann-rectangular.c @@ -1,39 +1,6 @@ -/* - * Copyright © 2004 Carl Worth - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Carl Worth - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* Provide definitions for standalone compilation */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-bentley-ottmann-rectilinear.c b/gfx/cairo/cairo/src/cairo-bentley-ottmann-rectilinear.c index 1696d9367..b00d2823b 100644 --- a/gfx/cairo/cairo/src/cairo-bentley-ottmann-rectilinear.c +++ b/gfx/cairo/cairo/src/cairo-bentley-ottmann-rectilinear.c @@ -1,39 +1,6 @@ -/* - * Copyright © 2004 Carl Worth - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2008 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Carl Worth - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* Provide definitions for standalone compilation */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-bentley-ottmann.c b/gfx/cairo/cairo/src/cairo-bentley-ottmann.c index b3819f2f7..c333becaa 100644 --- a/gfx/cairo/cairo/src/cairo-bentley-ottmann.c +++ b/gfx/cairo/cairo/src/cairo-bentley-ottmann.c @@ -1,39 +1,6 @@ -/* - * Copyright © 2004 Carl Worth - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2008 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Carl Worth - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* Provide definitions for standalone compilation */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-beos-surface.cpp b/gfx/cairo/cairo/src/cairo-beos-surface.cpp index e527272e6..d52ae1513 100644 --- a/gfx/cairo/cairo/src/cairo-beos-surface.cpp +++ b/gfx/cairo/cairo/src/cairo-beos-surface.cpp @@ -1,38 +1,6 @@ -/* vim:set ts=8 sw=4 noet cin: */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Christian Biesinger <cbiesinger@web.de> - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Christian Biesinger - * <cbiesinger@web.de> - * - * Contributor(s): - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // This is a C++ file in order to use the C++ BeOS API diff --git a/gfx/cairo/cairo/src/cairo-beos.h b/gfx/cairo/cairo/src/cairo-beos.h index fdb89a6c4..375c930cc 100644 --- a/gfx/cairo/cairo/src/cairo-beos.h +++ b/gfx/cairo/cairo/src/cairo-beos.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Christian Biesinger <cbiesinger@web.de> - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Christian Biesinger - * <cbiesinger@web.de> - * - * Contributor(s): - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_BEOS_H #define CAIRO_BEOS_H diff --git a/gfx/cairo/cairo/src/cairo-botor-scan-converter.c b/gfx/cairo/cairo/src/cairo-botor-scan-converter.c index 0778a5dcd..ae060dc31 100644 --- a/gfx/cairo/cairo/src/cairo-botor-scan-converter.c +++ b/gfx/cairo/cairo/src/cairo-botor-scan-converter.c @@ -1,43 +1,6 @@ -/* - * Copyright © 2004 Carl Worth - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2007 David Turner - * Copyright © 2008 M Joonas Pihlaja - * Copyright © 2008 Chris Wilson - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Carl Worth - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* Provide definitions for standalone compilation */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-boxes-private.h b/gfx/cairo/cairo/src/cairo-boxes-private.h index 3af0fbdef..e61a64d7c 100644 --- a/gfx/cairo/cairo/src/cairo-boxes-private.h +++ b/gfx/cairo/cairo/src/cairo-boxes-private.h @@ -1,35 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_BOXES_H #define CAIRO_BOXES_H diff --git a/gfx/cairo/cairo/src/cairo-boxes.c b/gfx/cairo/cairo/src/cairo-boxes.c index 31bfc0e4e..e29dd7e13 100644 --- a/gfx/cairo/cairo/src/cairo-boxes.c +++ b/gfx/cairo/cairo/src/cairo-boxes.c @@ -1,35 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-cache-private.h b/gfx/cairo/cairo/src/cairo-cache-private.h index 927ff0c0b..06940a63a 100644 --- a/gfx/cairo/cairo/src/cairo-cache-private.h +++ b/gfx/cairo/cairo/src/cairo-cache-private.h @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc. - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Keith Packard <keithp@keithp.com> - * Graydon Hoare <graydon@redhat.com> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_CACHE_PRIVATE_H #define CAIRO_CACHE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-cache.c b/gfx/cairo/cairo/src/cairo-cache.c index 5c4e4caa3..021b012fd 100644 --- a/gfx/cairo/cairo/src/cairo-cache.c +++ b/gfx/cairo/cairo/src/cairo-cache.c @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc. - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Keith Packard <keithp@keithp.com> - * Graydon Hoare <graydon@redhat.com> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-cff-subset.c b/gfx/cairo/cairo/src/cairo-cff-subset.c index f9b036814..6a5060047 100644 --- a/gfx/cairo/cairo/src/cairo-cff-subset.c +++ b/gfx/cairo/cairo/src/cairo-cff-subset.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Adrian Johnson. - * - * Contributor(s): - * Adrian Johnson <ajohnson@redneon.com> - * Eugeniy Meshcheryakov <eugen@debian.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * Useful links: diff --git a/gfx/cairo/cairo/src/cairo-clip-private.h b/gfx/cairo/cairo/src/cairo-clip-private.h index faf486409..04d80afc7 100644 --- a/gfx/cairo/cairo/src/cairo-clip-private.h +++ b/gfx/cairo/cairo/src/cairo-clip-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_CLIP_PRIVATE_H #define CAIRO_CLIP_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-clip.c b/gfx/cairo/cairo/src/cairo-clip.c index 0ebe9b207..cbbf4d2ce 100644 --- a/gfx/cairo/cairo/src/cairo-clip.c +++ b/gfx/cairo/cairo/src/cairo-clip.c @@ -1,43 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Kristian Høgsberg <krh@redhat.com> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-clip-private.h" diff --git a/gfx/cairo/cairo/src/cairo-color.c b/gfx/cairo/cairo/src/cairo-color.c index d20fea4d2..b9dae237e 100644 --- a/gfx/cairo/cairo/src/cairo-color.c +++ b/gfx/cairo/cairo/src/cairo-color.c @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-combsort-private.h b/gfx/cairo/cairo/src/cairo-combsort-private.h index bb7abb477..3400a681c 100644 --- a/gfx/cairo/cairo/src/cairo-combsort-private.h +++ b/gfx/cairo/cairo/src/cairo-combsort-private.h @@ -1,36 +1,6 @@ -/* - * Copyright © 2008 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This fragment implements a comb sort (specifically combsort11) */ #ifndef _HAVE_CAIRO_COMBSORT_NEWGAP diff --git a/gfx/cairo/cairo/src/cairo-compiler-private.h b/gfx/cairo/cairo/src/cairo-compiler-private.h index 18dc661bd..34cfe0956 100644 --- a/gfx/cairo/cairo/src/cairo-compiler-private.h +++ b/gfx/cairo/cairo/src/cairo-compiler-private.h @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_COMPILER_PRIVATE_H #define CAIRO_COMPILER_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-composite-rectangles-private.h b/gfx/cairo/cairo/src/cairo-composite-rectangles-private.h index 8c3c5abcc..ddbe6bb1a 100644 --- a/gfx/cairo/cairo/src/cairo-composite-rectangles-private.h +++ b/gfx/cairo/cairo/src/cairo-composite-rectangles-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.u> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_COMPOSITE_RECTANGLES_PRIVATE_H #define CAIRO_COMPOSITE_RECTANGLES_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-composite-rectangles.c b/gfx/cairo/cairo/src/cairo-composite-rectangles.c index 7f6484339..a7b499cf4 100644 --- a/gfx/cairo/cairo/src/cairo-composite-rectangles.c +++ b/gfx/cairo/cairo/src/cairo-composite-rectangles.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-d2d-private.h b/gfx/cairo/cairo/src/cairo-d2d-private.h index 15810eb6d..00244b497 100644 --- a/gfx/cairo/cairo/src/cairo-d2d-private.h +++ b/gfx/cairo/cairo/src/cairo-d2d-private.h @@ -1,38 +1,7 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2010 Mozilla Foundation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is the Mozilla Foundation - * - * Contributor(s): - * Bas Schouten <bschouten@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + #ifndef CAIRO_D2D_PRIVATE_H #define CAIRO_D2D_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp index cb90245dc..6aa8a3503 100644 --- a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp +++ b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp @@ -1,38 +1,7 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2010 Mozilla Foundation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is the Mozilla Foundation - * - * Contributor(s): - * Bas Schouten <bschouten@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + #define INITGUID #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-debug.c b/gfx/cairo/cairo/src/cairo-debug.c index e9e72b6aa..49bf31594 100644 --- a/gfx/cairo/cairo/src/cairo-debug.c +++ b/gfx/cairo/cairo/src/cairo-debug.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-deflate-stream.c b/gfx/cairo/cairo/src/cairo-deflate-stream.c index ba5f18392..b6d10b12a 100644 --- a/gfx/cairo/cairo/src/cairo-deflate-stream.c +++ b/gfx/cairo/cairo/src/cairo-deflate-stream.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Adrian Johnson. - * - * Author(s): - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-deprecated.h b/gfx/cairo/cairo/src/cairo-deprecated.h index 7a56aadbf..04b5d264d 100644 --- a/gfx/cairo/cairo/src/cairo-deprecated.h +++ b/gfx/cairo/cairo/src/cairo-deprecated.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_DEPRECATED_H #define CAIRO_DEPRECATED_H diff --git a/gfx/cairo/cairo/src/cairo-device-private.h b/gfx/cairo/cairo/src/cairo-device-private.h index 6eb44f3b6..371f66714 100644 --- a/gfx/cairo/cairo/src/cairo-device-private.h +++ b/gfx/cairo/cairo/src/cairo-device-private.h @@ -1,37 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Intel Corporation. - * - * Contributors(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef _CAIRO_DEVICE_PRIVATE_H_ #define _CAIRO_DEVICE_PRIVATE_H_ diff --git a/gfx/cairo/cairo/src/cairo-device.c b/gfx/cairo/cairo/src/cairo-device.c index 15b048477..d24dba94c 100644 --- a/gfx/cairo/cairo/src/cairo-device.c +++ b/gfx/cairo/cairo/src/cairo-device.c @@ -1,37 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Intel Corporation. - * - * Contributors(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-device-private.h" diff --git a/gfx/cairo/cairo/src/cairo-directfb-surface.c b/gfx/cairo/cairo/src/cairo-directfb-surface.c index fc7509c1a..6387fee94 100644 --- a/gfx/cairo/cairo/src/cairo-directfb-surface.c +++ b/gfx/cairo/cairo/src/cairo-directfb-surface.c @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Michael Emmel <mike.emmel@gmail.com> - * Claudio Ciccani <klan@users.sf.net> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-directfb.h" diff --git a/gfx/cairo/cairo/src/cairo-directfb.h b/gfx/cairo/cairo/src/cairo-directfb.h index e3d818c66..029b43ef7 100644 --- a/gfx/cairo/cairo/src/cairo-directfb.h +++ b/gfx/cairo/cairo/src/cairo-directfb.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@isi.edu> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * Environment variables affecting the backend: diff --git a/gfx/cairo/cairo/src/cairo-drm.h b/gfx/cairo/cairo/src/cairo-drm.h index 907610dcd..bbdb28ba2 100644 --- a/gfx/cairo/cairo/src/cairo-drm.h +++ b/gfx/cairo/cairo/src/cairo-drm.h @@ -1,34 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_DRM_H #define CAIRO_DRM_H diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp index f3d45da1e..391f2e8a7 100644 --- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp +++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2010 Mozilla Foundation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is the Mozilla Foundation - * - * Contributor(s): - * Bas Schouten <bschouten@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-dwrite-private.h b/gfx/cairo/cairo/src/cairo-dwrite-private.h index 7c76abf5e..1eaa46113 100644 --- a/gfx/cairo/cairo/src/cairo-dwrite-private.h +++ b/gfx/cairo/cairo/src/cairo-dwrite-private.h @@ -1,38 +1,7 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2010 Mozilla Foundation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is the Mozilla Foundation - * - * Contributor(s): - * Bas Schouten <bschouten@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + #include <dwrite_1.h> #include <d2d1.h> diff --git a/gfx/cairo/cairo/src/cairo-eagle-context.c b/gfx/cairo/cairo/src/cairo-eagle-context.c index 23766a944..5f59f5239 100644 --- a/gfx/cairo/cairo/src/cairo-eagle-context.c +++ b/gfx/cairo/cairo/src/cairo-eagle-context.c @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Eric Anholt - * Copyright © 2009 Chris Wilson - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-error-private.h b/gfx/cairo/cairo/src/cairo-error-private.h index fc0c56438..c7a9f7098 100644 --- a/gfx/cairo/cairo/src/cairo-error-private.h +++ b/gfx/cairo/cairo/src/cairo-error-private.h @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef _CAIRO_ERROR_PRIVATE_H_ #define _CAIRO_ERROR_PRIVATE_H_ diff --git a/gfx/cairo/cairo/src/cairo-features.h.in b/gfx/cairo/cairo/src/cairo-features.h.in index ee76be9ca..9692c7cb7 100644 --- a/gfx/cairo/cairo/src/cairo-features.h.in +++ b/gfx/cairo/cairo/src/cairo-features.h.in @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_FEATURES_H #define CAIRO_FEATURES_H @@ -52,8 +20,8 @@ #endif #define CAIRO_VERSION_MAJOR 1 -#define CAIRO_VERSION_MINOR 9 -#define CAIRO_VERSION_MICRO 5 +#define CAIRO_VERSION_MINOR 10 +#define CAIRO_VERSION_MICRO 28 @PS_SURFACE_FEATURE@ diff --git a/gfx/cairo/cairo/src/cairo-fixed-private.h b/gfx/cairo/cairo/src/cairo-fixed-private.h index 9478d7d4f..a00e99cf3 100644 --- a/gfx/cairo/cairo/src/cairo-fixed-private.h +++ b/gfx/cairo/cairo/src/cairo-fixed-private.h @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Foundation - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@pobox.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_FIXED_PRIVATE_H #define CAIRO_FIXED_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-fixed-type-private.h b/gfx/cairo/cairo/src/cairo-fixed-type-private.h index 2bbd5f786..d2bf6cb66 100644 --- a/gfx/cairo/cairo/src/cairo-fixed-type-private.h +++ b/gfx/cairo/cairo/src/cairo-fixed-type-private.h @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Foundation - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@pobox.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_FIXED_TYPE_PRIVATE_H #define CAIRO_FIXED_TYPE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-fixed.c b/gfx/cairo/cairo/src/cairo-fixed.c index 03e055923..75805f3d3 100644 --- a/gfx/cairo/cairo/src/cairo-fixed.c +++ b/gfx/cairo/cairo/src/cairo-fixed.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-font-face-twin.c b/gfx/cairo/cairo/src/cairo-font-face-twin.c index 98c6dd8a9..da85cb08e 100644 --- a/gfx/cairo/cairo/src/cairo-font-face-twin.c +++ b/gfx/cairo/cairo/src/cairo-font-face-twin.c @@ -1,38 +1,6 @@ -/* - * Copyright © 2004 Keith Packard - * Copyright © 2008 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Keith Packard - * - * Contributor(s): - * Keith Packard <keithp@keithp.com> - * Behdad Esfahbod <behdad@behdad.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-font-face.c b/gfx/cairo/cairo/src/cairo-font-face.c index a66054ead..ab17a8cb2 100644 --- a/gfx/cairo/cairo/src/cairo-font-face.c +++ b/gfx/cairo/cairo/src/cairo-font-face.c @@ -1,42 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Graydon Hoare <graydon@redhat.com> - * Owen Taylor <otaylor@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-font-options.c b/gfx/cairo/cairo/src/cairo-font-options.c index 5d59fb0f2..17a892160 100644 --- a/gfx/cairo/cairo/src/cairo-font-options.c +++ b/gfx/cairo/cairo/src/cairo-font-options.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Owen Taylor <otaylor@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-fontconfig-private.h b/gfx/cairo/cairo/src/cairo-fontconfig-private.h index ea873abe7..110304b18 100644 --- a/gfx/cairo/cairo/src/cairo-fontconfig-private.h +++ b/gfx/cairo/cairo/src/cairo-fontconfig-private.h @@ -1,43 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2000 Keith Packard - * Copyright © 2005 Red Hat, Inc - * Copyright © 2010 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Graydon Hoare <graydon@redhat.com> - * Owen Taylor <otaylor@redhat.com> - * Keith Packard <keithp@keithp.com> - * Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef _CAIRO_FONTCONFIG_PRIVATE_H #define _CAIRO_FONTCONFIG_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-freed-pool-private.h b/gfx/cairo/cairo/src/cairo-freed-pool-private.h index c73e593c0..c23e5a03a 100644 --- a/gfx/cairo/cairo/src/cairo-freed-pool-private.h +++ b/gfx/cairo/cairo/src/cairo-freed-pool-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_FREED_POOL_H #define CAIRO_FREED_POOL_H diff --git a/gfx/cairo/cairo/src/cairo-freed-pool.c b/gfx/cairo/cairo/src/cairo-freed-pool.c index 5b1c4c0bb..c65f4626d 100644 --- a/gfx/cairo/cairo/src/cairo-freed-pool.c +++ b/gfx/cairo/cairo/src/cairo-freed-pool.c @@ -1,39 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-ft-font.c b/gfx/cairo/cairo/src/cairo-ft-font.c index e51923a5d..1a2799b86 100644 --- a/gfx/cairo/cairo/src/cairo-ft-font.c +++ b/gfx/cairo/cairo/src/cairo-ft-font.c @@ -1,42 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2000 Keith Packard - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Graydon Hoare <graydon@redhat.com> - * Owen Taylor <otaylor@redhat.com> - * Keith Packard <keithp@keithp.com> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define _BSD_SOURCE /* for strdup() */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-ft-private.h b/gfx/cairo/cairo/src/cairo-ft-private.h index ff6ad4e65..42a1776ed 100644 --- a/gfx/cairo/cairo/src/cairo-ft-private.h +++ b/gfx/cairo/cairo/src/cairo-ft-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Graydon Hoare <graydon@redhat.com> - * Owen Taylor <otaylor@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_FT_PRIVATE_H #define CAIRO_FT_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-ft.h b/gfx/cairo/cairo/src/cairo-ft.h index 56d48c328..2f584066f 100644 --- a/gfx/cairo/cairo/src/cairo-ft.h +++ b/gfx/cairo/cairo/src/cairo-ft.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Graydon Hoare <graydon@redhat.com> - * Owen Taylor <otaylor@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_FT_H #define CAIRO_FT_H diff --git a/gfx/cairo/cairo/src/cairo-gl-glyphs.c b/gfx/cairo/cairo/src/cairo-gl-glyphs.c index 4736e190e..883883fbf 100644 --- a/gfx/cairo/cairo/src/cairo-gl-glyphs.c +++ b/gfx/cairo/cairo/src/cairo-gl-glyphs.c @@ -1,40 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * Copyright © 2010 Intel Corporation - * Copyright © 2010 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - * - * Contributors: - * Benjamin Otte <otte@gnome.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-gl-private.h b/gfx/cairo/cairo/src/cairo-gl-private.h index 54f226f42..96a2a1b5b 100644 --- a/gfx/cairo/cairo/src/cairo-gl-private.h +++ b/gfx/cairo/cairo/src/cairo-gl-private.h @@ -1,43 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Eric Anholt - * Copyright © 2009 Chris Wilson - * Copyright © 2005,2010 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Benjamin Otte <otte@gnome.org> - * Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - * Eric Anholt <eric@anholt.net> - * T. Zachary Laine <whatwasthataddress@gmail.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_GL_PRIVATE_H #define CAIRO_GL_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-gl-shaders.c b/gfx/cairo/cairo/src/cairo-gl-shaders.c index d7773f567..d0edffa88 100644 --- a/gfx/cairo/cairo/src/cairo-gl-shaders.c +++ b/gfx/cairo/cairo/src/cairo-gl-shaders.c @@ -1,41 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 T. Zachary Laine - * Copyright © 2010 Eric Anholt - * Copyright © 2010 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is T. Zachary Laine. - * - * Contributor(s): - * Benjamin Otte <otte@gnome.org> - * Eric Anholt <eric@anholt.net> - * T. Zachary Laine <whatwasthataddress@gmail.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-gl-private.h" diff --git a/gfx/cairo/cairo/src/cairo-gl-surface.c b/gfx/cairo/cairo/src/cairo-gl-surface.c index 278e6429d..458300050 100644 --- a/gfx/cairo/cairo/src/cairo-gl-surface.c +++ b/gfx/cairo/cairo/src/cairo-gl-surface.c @@ -1,42 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Eric Anholt - * Copyright © 2009 Chris Wilson - * Copyright © 2005,2010 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Benjamin Otte <otte@gnome.org> - * Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - * Eric Anholt <eric@anholt.net> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-gl.h b/gfx/cairo/cairo/src/cairo-gl.h index 131d1148b..17c5b03f1 100644 --- a/gfx/cairo/cairo/src/cairo-gl.h +++ b/gfx/cairo/cairo/src/cairo-gl.h @@ -1,35 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Eric Anholt - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Eric Anholt. - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_GL_H #define CAIRO_GL_H diff --git a/gfx/cairo/cairo/src/cairo-glitz-private.h b/gfx/cairo/cairo/src/cairo-glitz-private.h index 8a876eeab..144eff4a5 100644 --- a/gfx/cairo/cairo/src/cairo-glitz-private.h +++ b/gfx/cairo/cairo/src/cairo-glitz-private.h @@ -1,34 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_GLITZ_PRIVATE_H #define CAIRO_GLITZ_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-glitz-surface.c b/gfx/cairo/cairo/src/cairo-glitz-surface.c index 5f97f65e8..bd176d056 100644 --- a/gfx/cairo/cairo/src/cairo-glitz-surface.c +++ b/gfx/cairo/cairo/src/cairo-glitz-surface.c @@ -1,28 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 David Reveman - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of David - * Reveman not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. David Reveman makes no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: David Reveman <davidr@novell.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-glitz.h" diff --git a/gfx/cairo/cairo/src/cairo-glitz.h b/gfx/cairo/cairo/src/cairo-glitz.h index 08519dcbd..b74e887bc 100644 --- a/gfx/cairo/cairo/src/cairo-glitz.h +++ b/gfx/cairo/cairo/src/cairo-glitz.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_GLITZ_H #define CAIRO_GLITZ_H diff --git a/gfx/cairo/cairo/src/cairo-glx-context.c b/gfx/cairo/cairo/src/cairo-glx-context.c index fa9d8be96..1ceab6cc3 100644 --- a/gfx/cairo/cairo/src/cairo-glx-context.c +++ b/gfx/cairo/cairo/src/cairo-glx-context.c @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Eric Anholt - * Copyright © 2009 Chris Wilson - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-gstate-private.h b/gfx/cairo/cairo/src/cairo-gstate-private.h index b41c7a296..e8127d770 100644 --- a/gfx/cairo/cairo/src/cairo-gstate-private.h +++ b/gfx/cairo/cairo/src/cairo-gstate-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_GSTATE_PRIVATE_H #define CAIRO_GSTATE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-gstate.c b/gfx/cairo/cairo/src/cairo-gstate.c index cb07b511f..6ba6f0b1d 100644 --- a/gfx/cairo/cairo/src/cairo-gstate.c +++ b/gfx/cairo/cairo/src/cairo-gstate.c @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-hash-private.h b/gfx/cairo/cairo/src/cairo-hash-private.h index 30e51ffe6..0c2759dbf 100644 --- a/gfx/cairo/cairo/src/cairo-hash-private.h +++ b/gfx/cairo/cairo/src/cairo-hash-private.h @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc. - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Keith Packard <keithp@keithp.com> - * Graydon Hoare <graydon@redhat.com> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_HASH_PRIVATE_H #define CAIRO_HASH_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-hash.c b/gfx/cairo/cairo/src/cairo-hash.c index 81a48a235..7e24d930d 100644 --- a/gfx/cairo/cairo/src/cairo-hash.c +++ b/gfx/cairo/cairo/src/cairo-hash.c @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc. - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Keith Packard <keithp@keithp.com> - * Graydon Hoare <graydon@redhat.com> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-hull.c b/gfx/cairo/cairo/src/cairo-hull.c index c65593327..a9cb27982 100644 --- a/gfx/cairo/cairo/src/cairo-hull.c +++ b/gfx/cairo/cairo/src/cairo-hull.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-image-info-private.h b/gfx/cairo/cairo/src/cairo-image-info-private.h index 0d9ef8498..1107fa4f9 100644 --- a/gfx/cairo/cairo/src/cairo-image-info-private.h +++ b/gfx/cairo/cairo/src/cairo-image-info-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Adrian Johnson. - * - * Contributor(s): - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_IMAGE_INFO_PRIVATE_H #define CAIRO_IMAGE_INFO_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-image-info.c b/gfx/cairo/cairo/src/cairo-image-info.c index 63201e65b..5269ce25f 100644 --- a/gfx/cairo/cairo/src/cairo-image-info.c +++ b/gfx/cairo/cairo/src/cairo-image-info.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Adrian Johnson. - * - * Contributor(s): - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-image-info-private.h" diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c index 4aaf1c159..ad0737157 100644 --- a/gfx/cairo/cairo/src/cairo-image-surface.c +++ b/gfx/cairo/cairo/src/cairo-image-surface.c @@ -1,41 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * Copyright © 2009,2010 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-list-private.h b/gfx/cairo/cairo/src/cairo-list-private.h index ddfd0a4c6..ca4e368fc 100644 --- a/gfx/cairo/cairo/src/cairo-list-private.h +++ b/gfx/cairo/cairo/src/cairo-list-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - * - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_LIST_PRIVATE_H #define CAIRO_LIST_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-lzw.c b/gfx/cairo/cairo/src/cairo-lzw.c index de7f99983..e98e613bc 100644 --- a/gfx/cairo/cairo/src/cairo-lzw.c +++ b/gfx/cairo/cairo/src/cairo-lzw.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-malloc-private.h b/gfx/cairo/cairo/src/cairo-malloc-private.h index e5776abd0..765fb65b4 100644 --- a/gfx/cairo/cairo/src/cairo-malloc-private.h +++ b/gfx/cairo/cairo/src/cairo-malloc-private.h @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Foundation - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@pobox.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_MALLOC_PRIVATE_H #define CAIRO_MALLOC_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-matrix.c b/gfx/cairo/cairo/src/cairo-matrix.c index 583a7a649..b9691b8ee 100644 --- a/gfx/cairo/cairo/src/cairo-matrix.c +++ b/gfx/cairo/cairo/src/cairo-matrix.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-meta-surface-private.h b/gfx/cairo/cairo/src/cairo-meta-surface-private.h index f0c95c19c..c1f6c40f2 100644 --- a/gfx/cairo/cairo/src/cairo-meta-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-meta-surface-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_META_SURFACE_H #define CAIRO_META_SURFACE_H diff --git a/gfx/cairo/cairo/src/cairo-misc.c b/gfx/cairo/cairo/src/cairo-misc.c index e0ed70cb6..6aa793f61 100644 --- a/gfx/cairo/cairo/src/cairo-misc.c +++ b/gfx/cairo/cairo/src/cairo-misc.c @@ -1,42 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2007 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-mutex-impl-private.h b/gfx/cairo/cairo/src/cairo-mutex-impl-private.h index 6c67f6ebb..72086036c 100644 --- a/gfx/cairo/cairo/src/cairo-mutex-impl-private.h +++ b/gfx/cairo/cairo/src/cairo-mutex-impl-private.h @@ -1,43 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005,2007 Red Hat, Inc. - * Copyright © 2007 Mathias Hasselmann - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Mathias Hasselmann <mathias.hasselmann@gmx.de> - * Behdad Esfahbod <behdad@behdad.org> - * Mark Straver <moonchild@palemoon.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_MUTEX_IMPL_PRIVATE_H #define CAIRO_MUTEX_IMPL_PRIVATE_H @@ -178,7 +141,9 @@ #elif defined(_WIN32) /******************************************************/ -#define WIN32_LEAN_AND_MEAN +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif /* We require Windows 7 features */ #if !defined(WINVER) || (WINVER < 0x0601) # define WINVER 0x0601 diff --git a/gfx/cairo/cairo/src/cairo-mutex-list-private.h b/gfx/cairo/cairo/src/cairo-mutex-list-private.h index 7d5ba0299..3f2e44119 100644 --- a/gfx/cairo/cairo/src/cairo-mutex-list-private.h +++ b/gfx/cairo/cairo/src/cairo-mutex-list-private.h @@ -1,35 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Mathias Hasselmann - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * Contributor(s): - * Mathias Hasselmann <mathias.hasselmann@gmx.de> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_FEATURES_H /* This block is to just make this header file standalone */ diff --git a/gfx/cairo/cairo/src/cairo-mutex-private.h b/gfx/cairo/cairo/src/cairo-mutex-private.h index 61a7160a0..e9359ef55 100644 --- a/gfx/cairo/cairo/src/cairo-mutex-private.h +++ b/gfx/cairo/cairo/src/cairo-mutex-private.h @@ -1,42 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005,2007 Red Hat, Inc. - * Copyright © 2007 Mathias Hasselmann - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Mathias Hasselmann <mathias.hasselmann@gmx.de> - * Behdad Esfahbod <behdad@behdad.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_MUTEX_PRIVATE_H #define CAIRO_MUTEX_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-mutex-type-private.h b/gfx/cairo/cairo/src/cairo-mutex-type-private.h index e8c493985..eac1d48e6 100644 --- a/gfx/cairo/cairo/src/cairo-mutex-type-private.h +++ b/gfx/cairo/cairo/src/cairo-mutex-type-private.h @@ -1,42 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005,2007 Red Hat, Inc. - * Copyright © 2007 Mathias Hasselmann - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Mathias Hasselmann <mathias.hasselmann@gmx.de> - * Behdad Esfahbod <behdad@behdad.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_MUTEX_TYPE_PRIVATE_H #define CAIRO_MUTEX_TYPE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-mutex.c b/gfx/cairo/cairo/src/cairo-mutex.c index 0a31dced3..d859e28d9 100644 --- a/gfx/cairo/cairo/src/cairo-mutex.c +++ b/gfx/cairo/cairo/src/cairo-mutex.c @@ -1,35 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Mathias Hasselmann - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * Contributor(s): - * Mathias Hasselmann <mathias.hasselmann@gmx.de> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-observer.c b/gfx/cairo/cairo/src/cairo-observer.c index 7c7b69c91..c8ce5eea2 100644 --- a/gfx/cairo/cairo/src/cairo-observer.c +++ b/gfx/cairo/cairo/src/cairo-observer.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2010 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Intel Corporation - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-os2-private.h b/gfx/cairo/cairo/src/cairo-os2-private.h index 829dd3c8d..e47efd316 100644 --- a/gfx/cairo/cairo/src/cairo-os2-private.h +++ b/gfx/cairo/cairo/src/cairo-os2-private.h @@ -1,39 +1,6 @@ -/* vim: set sw=4 sts=4 et cin: */ -/* cairo - a vector graphics library with display and print output - * - * Copyright (c) 2005-2006 netlabs.org - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is - * Doodle <doodle@scenergy.dfmk.hu> - * - * Contributor(s): - * Peter Weilbacher <mozilla@Weilbacher.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_OS2_PRIVATE_H #define CAIRO_OS2_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-os2-surface.c b/gfx/cairo/cairo/src/cairo-os2-surface.c index b9758281d..c0464f62b 100644 --- a/gfx/cairo/cairo/src/cairo-os2-surface.c +++ b/gfx/cairo/cairo/src/cairo-os2-surface.c @@ -1,40 +1,6 @@ -/* vim: set sw=4 sts=4 et cin: */ -/* cairo - a vector graphics library with display and print output - * - * Copyright (c) 2005-2006 netlabs.org - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is - * Doodle <doodle@scenergy.dfmk.hu> - * - * Contributor(s): - * Peter Weilbacher <mozilla@Weilbacher.org> - * Rich Walsh <dragtext@e-vertise.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-os2.h b/gfx/cairo/cairo/src/cairo-os2.h index d23f2dec4..16a4fc564 100644 --- a/gfx/cairo/cairo/src/cairo-os2.h +++ b/gfx/cairo/cairo/src/cairo-os2.h @@ -1,40 +1,6 @@ -/* vim: set sw=4 sts=4 et cin: */ -/* cairo - a vector graphics library with display and print output - * - * Copyright (c) 2005-2006 netlabs.org - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is - * Doodle <doodle@scenergy.dfmk.hu> - * - * Contributor(s): - * Peter Weilbacher <mozilla@Weilbacher.org> - * Rich Walsh <dragtext@e-vertise.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef _CAIRO_OS2_H_ #define _CAIRO_OS2_H_ diff --git a/gfx/cairo/cairo/src/cairo-output-stream-private.h b/gfx/cairo/cairo/src/cairo-output-stream-private.h index edaabbe78..8f3cb3c6b 100644 --- a/gfx/cairo/cairo/src/cairo-output-stream-private.h +++ b/gfx/cairo/cairo/src/cairo-output-stream-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Author(s): - * Kristian Høgsberg <krh@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_OUTPUT_STREAM_PRIVATE_H #define CAIRO_OUTPUT_STREAM_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-output-stream.c b/gfx/cairo/cairo/src/cairo-output-stream.c index 1aabe821a..5f8d774cd 100644 --- a/gfx/cairo/cairo/src/cairo-output-stream.c +++ b/gfx/cairo/cairo/src/cairo-output-stream.c @@ -1,37 +1,6 @@ -/* cairo-output-stream.c: Output stream abstraction - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Author(s): - * Kristian Høgsberg <krh@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define _BSD_SOURCE /* for snprintf() */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-paginated-private.h b/gfx/cairo/cairo/src/cairo-paginated-private.h index 42badbfdf..5687cf85c 100644 --- a/gfx/cairo/cairo/src/cairo-paginated-private.h +++ b/gfx/cairo/cairo/src/cairo-paginated-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PAGINATED_H #define CAIRO_PAGINATED_H diff --git a/gfx/cairo/cairo/src/cairo-paginated-surface-private.h b/gfx/cairo/cairo/src/cairo-paginated-surface-private.h index ebf4b3424..0b4e81f23 100644 --- a/gfx/cairo/cairo/src/cairo-paginated-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-paginated-surface-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PAGINATED_SURFACE_H #define CAIRO_PAGINATED_SURFACE_H diff --git a/gfx/cairo/cairo/src/cairo-paginated-surface.c b/gfx/cairo/cairo/src/cairo-paginated-surface.c index af4790e7e..febcd05fa 100644 --- a/gfx/cairo/cairo/src/cairo-paginated-surface.c +++ b/gfx/cairo/cairo/src/cairo-paginated-surface.c @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * Copyright © 2007 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - * Keith Packard <keithp@keithp.com> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* The paginated surface layer exists to provide as much code sharing * as possible for the various paginated surface backends in cairo diff --git a/gfx/cairo/cairo/src/cairo-path-bounds.c b/gfx/cairo/cairo/src/cairo-path-bounds.c index 8ca80fa13..c752fbca1 100644 --- a/gfx/cairo/cairo/src/cairo-path-bounds.c +++ b/gfx/cairo/cairo/src/cairo-path-bounds.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-path-fixed-private.h" diff --git a/gfx/cairo/cairo/src/cairo-path-fill.c b/gfx/cairo/cairo/src/cairo-path-fill.c index 24aaa3969..40d41157a 100644 --- a/gfx/cairo/cairo/src/cairo-path-fill.c +++ b/gfx/cairo/cairo/src/cairo-path-fill.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-boxes-private.h" diff --git a/gfx/cairo/cairo/src/cairo-path-fixed-private.h b/gfx/cairo/cairo/src/cairo-path-fixed-private.h index 42e64eda3..69972505a 100644 --- a/gfx/cairo/cairo/src/cairo-path-fixed-private.h +++ b/gfx/cairo/cairo/src/cairo-path-fixed-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PATH_FIXED_PRIVATE_H #define CAIRO_PATH_FIXED_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-path-fixed.c b/gfx/cairo/cairo/src/cairo-path-fixed.c index eea8630bd..3ba5f75e0 100644 --- a/gfx/cairo/cairo/src/cairo-path-fixed.c +++ b/gfx/cairo/cairo/src/cairo-path-fixed.c @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-path-in-fill.c b/gfx/cairo/cairo/src/cairo-path-in-fill.c index b344f529d..c303d8596 100644 --- a/gfx/cairo/cairo/src/cairo-path-in-fill.c +++ b/gfx/cairo/cairo/src/cairo-path-in-fill.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-path-fixed-private.h" diff --git a/gfx/cairo/cairo/src/cairo-path-private.h b/gfx/cairo/cairo/src/cairo-path-private.h index 61b4060fa..c28612a32 100644 --- a/gfx/cairo/cairo/src/cairo-path-private.h +++ b/gfx/cairo/cairo/src/cairo-path-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2006 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PATH_PRIVATE_H #define CAIRO_PATH_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-path-stroke.c b/gfx/cairo/cairo/src/cairo-path-stroke.c index 505b6ab6a..6d1d6f205 100644 --- a/gfx/cairo/cairo/src/cairo-path-stroke.c +++ b/gfx/cairo/cairo/src/cairo-path-stroke.c @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define _BSD_SOURCE /* for hypot() */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-path.c b/gfx/cairo/cairo/src/cairo-path.c index 28182c0e4..49b479a99 100644 --- a/gfx/cairo/cairo/src/cairo-path.c +++ b/gfx/cairo/cairo/src/cairo-path.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2006 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-pattern.c b/gfx/cairo/cairo/src/cairo-pattern.c index 0c51804f8..502344f3c 100644 --- a/gfx/cairo/cairo/src/cairo-pattern.c +++ b/gfx/cairo/cairo/src/cairo-pattern.c @@ -1,32 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 David Reveman - * Copyright © 2005 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of David - * Reveman not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. David Reveman makes no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: David Reveman <davidr@novell.com> - * Keith Packard <keithp@keithp.com> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-pdf-operators-private.h b/gfx/cairo/cairo/src/cairo-pdf-operators-private.h index 67d1cc233..d0051433b 100644 --- a/gfx/cairo/cairo/src/cairo-pdf-operators-private.h +++ b/gfx/cairo/cairo/src/cairo-pdf-operators-private.h @@ -1,43 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc - * Copyright © 2006 Red Hat, Inc - * Copyright © 2007 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Carl Worth <cworth@cworth.org> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PDF_OPERATORS_H #define CAIRO_PDF_OPERATORS_H diff --git a/gfx/cairo/cairo/src/cairo-pdf-operators.c b/gfx/cairo/cairo/src/cairo-pdf-operators.c index d70756b3a..4da9d573c 100644 --- a/gfx/cairo/cairo/src/cairo-pdf-operators.c +++ b/gfx/cairo/cairo/src/cairo-pdf-operators.c @@ -1,43 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc - * Copyright © 2006 Red Hat, Inc - * Copyright © 2007, 2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Carl Worth <cworth@cworth.org> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-pdf-surface-private.h b/gfx/cairo/cairo/src/cairo-pdf-surface-private.h index 221418ec9..ab5befa52 100644 --- a/gfx/cairo/cairo/src/cairo-pdf-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-pdf-surface-private.h @@ -1,43 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc - * Copyright © 2006 Red Hat, Inc - * Copyright © 2007, 2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Carl Worth <cworth@cworth.org> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PDF_SURFACE_PRIVATE_H #define CAIRO_PDF_SURFACE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-pdf-surface.c b/gfx/cairo/cairo/src/cairo-pdf-surface.c index 09bd42ea0..3dcf58859 100644 --- a/gfx/cairo/cairo/src/cairo-pdf-surface.c +++ b/gfx/cairo/cairo/src/cairo-pdf-surface.c @@ -1,43 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc - * Copyright © 2006 Red Hat, Inc - * Copyright © 2007, 2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Carl Worth <cworth@cworth.org> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define _BSD_SOURCE /* for snprintf() */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-pdf.h b/gfx/cairo/cairo/src/cairo-pdf.h index 50460ccdf..0e85e9804 100644 --- a/gfx/cairo/cairo/src/cairo-pdf.h +++ b/gfx/cairo/cairo/src/cairo-pdf.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PDF_H #define CAIRO_PDF_H diff --git a/gfx/cairo/cairo/src/cairo-pen.c b/gfx/cairo/cairo/src/cairo-pen.c index e71f7b561..751b5dc3a 100644 --- a/gfx/cairo/cairo/src/cairo-pen.c +++ b/gfx/cairo/cairo/src/cairo-pen.c @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2008 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-platform.h b/gfx/cairo/cairo/src/cairo-platform.h index bfec29f67..9d4bc4d1f 100644 --- a/gfx/cairo/cairo/src/cairo-platform.h +++ b/gfx/cairo/cairo/src/cairo-platform.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Mozilla Foundation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Stuart Parmenter <stuart@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PLATFORM_H #define CAIRO_PLATFORM_H diff --git a/gfx/cairo/cairo/src/cairo-png.c b/gfx/cairo/cairo/src/cairo-png.c index 41a33d753..bbab2c2ae 100644 --- a/gfx/cairo/cairo/src/cairo-png.c +++ b/gfx/cairo/cairo/src/cairo-png.c @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Kristian Høgsberg <krh@redhat.com> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-polygon.c b/gfx/cairo/cairo/src/cairo-polygon.c index 1b5fab02b..fd71319e9 100644 --- a/gfx/cairo/cairo/src/cairo-polygon.c +++ b/gfx/cairo/cairo/src/cairo-polygon.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-private.h b/gfx/cairo/cairo/src/cairo-private.h index 901a69a31..33b049678 100644 --- a/gfx/cairo/cairo/src/cairo-private.h +++ b/gfx/cairo/cairo/src/cairo-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PRIVATE_H #define CAIRO_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-ps-surface-private.h b/gfx/cairo/cairo/src/cairo-ps-surface-private.h index a5a8cd0da..96da53554 100644 --- a/gfx/cairo/cairo/src/cairo-ps-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-ps-surface-private.h @@ -1,42 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Kristian Høgsberg <krh@redhat.com> - * Keith Packard <keithp@keithp.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PS_SURFACE_PRIVATE_H #define CAIRO_PS_SURFACE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-ps-surface.c b/gfx/cairo/cairo/src/cairo-ps-surface.c index 4e7fb132b..5696d6cb7 100644 --- a/gfx/cairo/cairo/src/cairo-ps-surface.c +++ b/gfx/cairo/cairo/src/cairo-ps-surface.c @@ -1,45 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * Copyright © 2005 Red Hat, Inc - * Copyright © 2007,2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Kristian Høgsberg <krh@redhat.com> - * Keith Packard <keithp@keithp.com> - * Adrian Johnson <ajohnson@redneon.com> - */ - +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * Design of the PS output: diff --git a/gfx/cairo/cairo/src/cairo-ps.h b/gfx/cairo/cairo/src/cairo-ps.h index fd1d21deb..3d609c9d1 100644 --- a/gfx/cairo/cairo/src/cairo-ps.h +++ b/gfx/cairo/cairo/src/cairo-ps.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_PS_H #define CAIRO_PS_H diff --git a/gfx/cairo/cairo/src/cairo-qt-surface.cpp b/gfx/cairo/cairo/src/cairo-qt-surface.cpp index 6311c7100..9d73395b7 100644 --- a/gfx/cairo/cairo/src/cairo-qt-surface.cpp +++ b/gfx/cairo/cairo/src/cairo-qt-surface.cpp @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Corporation. - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* Get INT16_MIN etc. as per C99 */ #define __STDC_LIMIT_MACROS diff --git a/gfx/cairo/cairo/src/cairo-qt.h b/gfx/cairo/cairo/src/cairo-qt.h index c20bbb18d..9bb6cd0e3 100644 --- a/gfx/cairo/cairo/src/cairo-qt.h +++ b/gfx/cairo/cairo/src/cairo-qt.h @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Corporation. - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_QT_H #define CAIRO_QT_H diff --git a/gfx/cairo/cairo/src/cairo-quartz-font.c b/gfx/cairo/cairo/src/cairo-quartz-font.c index 2a17e77fa..e58ae0559 100644 --- a/gfx/cairo/cairo/src/cairo-quartz-font.c +++ b/gfx/cairo/cairo/src/cairo-quartz-font.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright � 2008 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Foundation. - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-quartz-image-surface.c b/gfx/cairo/cairo/src/cairo-quartz-image-surface.c index 9a18dd46e..155ec494f 100644 --- a/gfx/cairo/cairo/src/cairo-quartz-image-surface.c +++ b/gfx/cairo/cairo/src/cairo-quartz-image-surface.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright � 2008 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Foundation. - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-quartz-image.h b/gfx/cairo/cairo/src/cairo-quartz-image.h index 2d6e8fb52..fffc1ee86 100644 --- a/gfx/cairo/cairo/src/cairo-quartz-image.h +++ b/gfx/cairo/cairo/src/cairo-quartz-image.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Foundation. - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_QUARTZ_IMAGE_H #define CAIRO_QUARTZ_IMAGE_H diff --git a/gfx/cairo/cairo/src/cairo-quartz-private.h b/gfx/cairo/cairo/src/cairo-quartz-private.h index 1c8d496af..c0dcf3b91 100644 --- a/gfx/cairo/cairo/src/cairo-quartz-private.h +++ b/gfx/cairo/cairo/src/cairo-quartz-private.h @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Calum Robinson - * Copyright (C) 2006,2007 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Calum Robinson - * - * Contributor(s): - * Calum Robinson <calumr@mac.com> - * Vladimir Vukicevic <vladimir@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_QUARTZ_PRIVATE_H #define CAIRO_QUARTZ_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c index 434a28983..d5a5ffd92 100644 --- a/gfx/cairo/cairo/src/cairo-quartz-surface.c +++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright � 2006, 2007 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Foundation. - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef _GNU_SOURCE #define _GNU_SOURCE /* required for RTLD_DEFAULT */ diff --git a/gfx/cairo/cairo/src/cairo-quartz.h b/gfx/cairo/cairo/src/cairo-quartz.h index 2941a0339..699a4e7ce 100644 --- a/gfx/cairo/cairo/src/cairo-quartz.h +++ b/gfx/cairo/cairo/src/cairo-quartz.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006, 2007 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Foundation. - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_QUARTZ_H #define CAIRO_QUARTZ_H diff --git a/gfx/cairo/cairo/src/cairo-recording-surface-private.h b/gfx/cairo/cairo/src/cairo-recording-surface-private.h index 4ec5f88b4..c21a93205 100644 --- a/gfx/cairo/cairo/src/cairo-recording-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-recording-surface-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_RECORDING_SURFACE_H #define CAIRO_RECORDING_SURFACE_H diff --git a/gfx/cairo/cairo/src/cairo-recording-surface.c b/gfx/cairo/cairo/src/cairo-recording-surface.c index 0e955b83f..8230ac375 100644 --- a/gfx/cairo/cairo/src/cairo-recording-surface.c +++ b/gfx/cairo/cairo/src/cairo-recording-surface.c @@ -1,41 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * Copyright © 2007 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Carl Worth <cworth@cworth.org> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * SECTION:cairo-recording diff --git a/gfx/cairo/cairo/src/cairo-rectangle.c b/gfx/cairo/cairo/src/cairo-rectangle.c index 608da53ea..ab043c1bc 100644 --- a/gfx/cairo/cairo/src/cairo-rectangle.c +++ b/gfx/cairo/cairo/src/cairo-rectangle.c @@ -1,41 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2006 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-rectangular-scan-converter.c b/gfx/cairo/cairo/src/cairo-rectangular-scan-converter.c index dab2c151f..6c21f5fd5 100644 --- a/gfx/cairo/cairo/src/cairo-rectangular-scan-converter.c +++ b/gfx/cairo/cairo/src/cairo-rectangular-scan-converter.c @@ -1,35 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-reference-count-private.h b/gfx/cairo/cairo/src/cairo-reference-count-private.h index 0d91488ee..c05d4c910 100644 --- a/gfx/cairo/cairo/src/cairo-reference-count-private.h +++ b/gfx/cairo/cairo/src/cairo-reference-count-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_REFRENCE_COUNT_PRIVATE_H #define CAIRO_REFRENCE_COUNT_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-region-private.h b/gfx/cairo/cairo/src/cairo-region-private.h index 11070ba76..32c1e82ab 100644 --- a/gfx/cairo/cairo/src/cairo-region-private.h +++ b/gfx/cairo/cairo/src/cairo-region-private.h @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Owen Taylor <otaylor@redhat.com> - * Vladimir Vukicevic <vladimir@pobox.com> - * Søren Sandmann <sandmann@daimi.au.dk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_REGION_PRIVATE_H #define CAIRO_REGION_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-region.c b/gfx/cairo/cairo/src/cairo-region.c index 112b1d824..3e8ac1248 100644 --- a/gfx/cairo/cairo/src/cairo-region.c +++ b/gfx/cairo/cairo/src/cairo-region.c @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Owen Taylor <otaylor@redhat.com> - * Vladimir Vukicevic <vladimir@pobox.com> - * Søren Sandmann <sandmann@daimi.au.dk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-rtree-private.h b/gfx/cairo/cairo/src/cairo-rtree-private.h index 191c85871..295f48ced 100644 --- a/gfx/cairo/cairo/src/cairo-rtree-private.h +++ b/gfx/cairo/cairo/src/cairo-rtree-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - * - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_RTREE_PRIVATE_H #define CAIRO_RTREE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-rtree.c b/gfx/cairo/cairo/src/cairo-rtree.c index d6e57916a..059edff75 100644 --- a/gfx/cairo/cairo/src/cairo-rtree.c +++ b/gfx/cairo/cairo/src/cairo-rtree.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - * - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-scaled-font-private.h b/gfx/cairo/cairo/src/cairo-scaled-font-private.h index 029377b17..5d426494a 100644 --- a/gfx/cairo/cairo/src/cairo-scaled-font-private.h +++ b/gfx/cairo/cairo/src/cairo-scaled-font-private.h @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SCALED_FONT_PRIVATE_H #define CAIRO_SCALED_FONT_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-scaled-font-subsets-private.h b/gfx/cairo/cairo/src/cairo-scaled-font-subsets-private.h index b165d9aca..246dbdcfd 100644 --- a/gfx/cairo/cairo/src/cairo-scaled-font-subsets-private.h +++ b/gfx/cairo/cairo/src/cairo-scaled-font-subsets-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SCALED_FONT_SUBSETS_PRIVATE_H #define CAIRO_SCALED_FONT_SUBSETS_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-scaled-font-subsets.c b/gfx/cairo/cairo/src/cairo-scaled-font-subsets.c index 01bc05bfb..ba769d509 100644 --- a/gfx/cairo/cairo/src/cairo-scaled-font-subsets.c +++ b/gfx/cairo/cairo/src/cairo-scaled-font-subsets.c @@ -1,44 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2003 University of Southern California - * Copyright © 2005 Red Hat, Inc - * Copyright © 2006 Keith Packard - * Copyright © 2006 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Kristian Høgsberg <krh@redhat.com> - * Keith Packard <keithp@keithp.com> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define _BSD_SOURCE /* for snprintf(), strdup() */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-scaled-font.c b/gfx/cairo/cairo/src/cairo-scaled-font.c index 95db65a99..37806bc63 100644 --- a/gfx/cairo/cairo/src/cairo-scaled-font.c +++ b/gfx/cairo/cairo/src/cairo-scaled-font.c @@ -1,42 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* - * Copyright © 2005 Keith Packard - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Keith Packard - * - * Contributor(s): - * Keith Packard <keithp@keithp.com> - * Carl D. Worth <cworth@cworth.org> - * Graydon Hoare <graydon@redhat.com> - * Owen Taylor <otaylor@redhat.com> - * Behdad Esfahbod <behdad@behdad.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-script-surface.c b/gfx/cairo/cairo/src/cairo-script-surface.c index 2cb427bcb..50214aa19 100644 --- a/gfx/cairo/cairo/src/cairo-script-surface.c +++ b/gfx/cairo/cairo/src/cairo-script-surface.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* The script surface is one that records all operations performed on * it in the form of a procedural script, similar in fashion to diff --git a/gfx/cairo/cairo/src/cairo-script.h b/gfx/cairo/cairo/src/cairo-script.h index b82230f2f..a9d1540cf 100644 --- a/gfx/cairo/cairo/src/cairo-script.h +++ b/gfx/cairo/cairo/src/cairo-script.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SCRIPT_H #define CAIRO_SCRIPT_H diff --git a/gfx/cairo/cairo/src/cairo-skia.h b/gfx/cairo/cairo/src/cairo-skia.h index f62823522..89bd2713e 100644 --- a/gfx/cairo/cairo/src/cairo-skia.h +++ b/gfx/cairo/cairo/src/cairo-skia.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SKIA_H #define CAIRO_SKIA_H diff --git a/gfx/cairo/cairo/src/cairo-slope-private.h b/gfx/cairo/cairo/src/cairo-slope-private.h index 6a58c9f45..bccc955d3 100644 --- a/gfx/cairo/cairo/src/cairo-slope-private.h +++ b/gfx/cairo/cairo/src/cairo-slope-private.h @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef _CAIRO_SLOPE_PRIVATE_H #define _CAIRO_SLOPE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-slope.c b/gfx/cairo/cairo/src/cairo-slope.c index 827037f76..fe93d66f6 100644 --- a/gfx/cairo/cairo/src/cairo-slope.c +++ b/gfx/cairo/cairo/src/cairo-slope.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-spans-private.h b/gfx/cairo/cairo/src/cairo-spans-private.h index 00a4df868..aecc9b976 100644 --- a/gfx/cairo/cairo/src/cairo-spans-private.h +++ b/gfx/cairo/cairo/src/cairo-spans-private.h @@ -1,4 +1,3 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright (c) 2008 M Joonas Pihlaja diff --git a/gfx/cairo/cairo/src/cairo-spans.c b/gfx/cairo/cairo/src/cairo-spans.c index a187b8998..f556d6b2a 100644 --- a/gfx/cairo/cairo/src/cairo-spans.c +++ b/gfx/cairo/cairo/src/cairo-spans.c @@ -1,4 +1,3 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright (c) 2008 M Joonas Pihlaja diff --git a/gfx/cairo/cairo/src/cairo-spline.c b/gfx/cairo/cairo/src/cairo-spline.c index ca2e2dc64..2fc99dfcb 100644 --- a/gfx/cairo/cairo/src/cairo-spline.c +++ b/gfx/cairo/cairo/src/cairo-spline.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-stroke-style.c b/gfx/cairo/cairo/src/cairo-stroke-style.c index 1513d1f35..e068e9dec 100644 --- a/gfx/cairo/cairo/src/cairo-stroke-style.c +++ b/gfx/cairo/cairo/src/cairo-stroke-style.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-surface-clipper-private.h b/gfx/cairo/cairo/src/cairo-surface-clipper-private.h index b9ca3cb1c..d8750e642 100644 --- a/gfx/cairo/cairo/src/cairo-surface-clipper-private.h +++ b/gfx/cairo/cairo/src/cairo-surface-clipper-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.u> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SURFACE_CLIPPER_PRIVATE_H #define CAIRO_SURFACE_CLIPPER_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-surface-clipper.c b/gfx/cairo/cairo/src/cairo-surface-clipper.c index 948730047..21c6fb1d5 100644 --- a/gfx/cairo/cairo/src/cairo-surface-clipper.c +++ b/gfx/cairo/cairo/src/cairo-surface-clipper.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-surface-fallback-private.h b/gfx/cairo/cairo/src/cairo-surface-fallback-private.h index e993de62e..3c6324815 100644 --- a/gfx/cairo/cairo/src/cairo-surface-fallback-private.h +++ b/gfx/cairo/cairo/src/cairo-surface-fallback-private.h @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SURFACE_FALLBACK_PRIVATE_H #define CAIRO_SURFACE_FALLBACK_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-surface-fallback.c b/gfx/cairo/cairo/src/cairo-surface-fallback.c index 51893ee65..09ab644a7 100644 --- a/gfx/cairo/cairo/src/cairo-surface-fallback.c +++ b/gfx/cairo/cairo/src/cairo-surface-fallback.c @@ -1,42 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Joonas Pihlaja <jpihlaja@cc.helsinki.fi> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-surface-offset-private.h b/gfx/cairo/cairo/src/cairo-surface-offset-private.h index b7877b3de..94525a689 100644 --- a/gfx/cairo/cairo/src/cairo-surface-offset-private.h +++ b/gfx/cairo/cairo/src/cairo-surface-offset-private.h @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.u> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SURFACE_OFFSET_PRIVATE_H #define CAIRO_SURFACE_OFFSET_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-surface-offset.c b/gfx/cairo/cairo/src/cairo-surface-offset.c index fdbe1a124..a5070617d 100644 --- a/gfx/cairo/cairo/src/cairo-surface-offset.c +++ b/gfx/cairo/cairo/src/cairo-surface-offset.c @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * Copyright © 2007 Adrian Johnson - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-surface-private.h b/gfx/cairo/cairo/src/cairo-surface-private.h index 61acf4b05..96cd4a371 100644 --- a/gfx/cairo/cairo/src/cairo-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-surface-private.h @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SURFACE_PRIVATE_H #define CAIRO_SURFACE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-surface-snapshot-private.h b/gfx/cairo/cairo/src/cairo-surface-snapshot-private.h index bbb2bf2a0..a9520332a 100644 --- a/gfx/cairo/cairo/src/cairo-surface-snapshot-private.h +++ b/gfx/cairo/cairo/src/cairo-surface-snapshot-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Intel Corporation. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SURFACE_SNAPSHOT_PRIVATE_H #define CAIRO_SURFACE_SNAPSHOT_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-surface-snapshot.c b/gfx/cairo/cairo/src/cairo-surface-snapshot.c index 2dbf2507a..030636056 100644 --- a/gfx/cairo/cairo/src/cairo-surface-snapshot.c +++ b/gfx/cairo/cairo/src/cairo-surface-snapshot.c @@ -1,41 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-surface-subsurface-private.h b/gfx/cairo/cairo/src/cairo-surface-subsurface-private.h index 435e1eb83..3fe48f83b 100644 --- a/gfx/cairo/cairo/src/cairo-surface-subsurface-private.h +++ b/gfx/cairo/cairo/src/cairo-surface-subsurface-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Intel Corporation. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SURFACE_SUBSURFACE_PRIVATE_H #define CAIRO_SURFACE_SUBSURFACE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-surface-subsurface.c b/gfx/cairo/cairo/src/cairo-surface-subsurface.c index 178966263..b9d8eacd6 100644 --- a/gfx/cairo/cairo/src/cairo-surface-subsurface.c +++ b/gfx/cairo/cairo/src/cairo-surface-subsurface.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Intel Corporation. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-surface-wrapper-private.h b/gfx/cairo/cairo/src/cairo-surface-wrapper-private.h index a1f05d386..c6d2bbe91 100644 --- a/gfx/cairo/cairo/src/cairo-surface-wrapper-private.h +++ b/gfx/cairo/cairo/src/cairo-surface-wrapper-private.h @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.u> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SURFACE_WRAPPER_PRIVATE_H #define CAIRO_SURFACE_WRAPPER_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-surface-wrapper.c b/gfx/cairo/cairo/src/cairo-surface-wrapper.c index d3f126e18..902e717cb 100644 --- a/gfx/cairo/cairo/src/cairo-surface-wrapper.c +++ b/gfx/cairo/cairo/src/cairo-surface-wrapper.c @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * Copyright © 2007 Adrian Johnson - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c index b57b944b8..c80ea8553 100644 --- a/gfx/cairo/cairo/src/cairo-surface.c +++ b/gfx/cairo/cairo/src/cairo-surface.c @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-svg-surface-private.h b/gfx/cairo/cairo/src/cairo-svg-surface-private.h index ddbf464b1..eea51cbbf 100644 --- a/gfx/cairo/cairo/src/cairo-svg-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-svg-surface-private.h @@ -1,42 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc - * Copyright © 2005-2006 Emmanuel Pacaud <emmanuel.pacaud@free.fr> - * Copyright © 2006 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Emmanuel Pacaud <emmanuel.pacaud@univ-poitiers.fr> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SVG_SURFACE_PRIVATE_H #define CAIRO_SVG_SURFACE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-svg-surface.c b/gfx/cairo/cairo/src/cairo-svg-surface.c index fb612fadf..b18527f0c 100644 --- a/gfx/cairo/cairo/src/cairo-svg-surface.c +++ b/gfx/cairo/cairo/src/cairo-svg-surface.c @@ -1,43 +1,6 @@ -/* vim: set sw=4 sts=4: -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc - * Copyright © 2005-2007 Emmanuel Pacaud <emmanuel.pacaud@free.fr> - * Copyright © 2006 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Emmanuel Pacaud <emmanuel.pacaud@free.fr> - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define _BSD_SOURCE /* for snprintf() */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-svg.h b/gfx/cairo/cairo/src/cairo-svg.h index 0f739fc04..2c07aeedf 100644 --- a/gfx/cairo/cairo/src/cairo-svg.h +++ b/gfx/cairo/cairo/src/cairo-svg.h @@ -1,33 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * cairo-svg.h - * - * Copyright © 2005 Emmanuel Pacaud <emmanuel.pacaud@univ-poitiers.fr> - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_SVG_H #define CAIRO_SVG_H diff --git a/gfx/cairo/cairo/src/cairo-system.c b/gfx/cairo/cairo/src/cairo-system.c index 1ff4d078f..22e4934c7 100644 --- a/gfx/cairo/cairo/src/cairo-system.c +++ b/gfx/cairo/cairo/src/cairo-system.c @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Owen Taylor <otaylor@redhat.com> - * Stuart Parmenter <stuart@mozilla.com> - * Vladimir Vukicevic <vladimir@pobox.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This file should include code that is system-specific, not * feature-specific. For example, the DLL initialization/finalization diff --git a/gfx/cairo/cairo/src/cairo-tee-surface-private.h b/gfx/cairo/cairo/src/cairo-tee-surface-private.h index a83cfc959..dd8aeda4d 100644 --- a/gfx/cairo/cairo/src/cairo-tee-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-tee-surface-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_TEE_SURFACE_PRIVATE_H #define CAIRO_TEE_SURFACE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-tee-surface.c b/gfx/cairo/cairo/src/cairo-tee-surface.c index bca07716f..755a0b7ee 100644 --- a/gfx/cairo/cairo/src/cairo-tee-surface.c +++ b/gfx/cairo/cairo/src/cairo-tee-surface.c @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This surface supports redirecting all its input to multiple surfaces. */ diff --git a/gfx/cairo/cairo/src/cairo-tee.h b/gfx/cairo/cairo/src/cairo-tee.h index 9c048c6fe..c60cb5327 100644 --- a/gfx/cairo/cairo/src/cairo-tee.h +++ b/gfx/cairo/cairo/src/cairo-tee.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_TEE_H #define CAIRO_TEE_H diff --git a/gfx/cairo/cairo/src/cairo-tor-scan-converter.c b/gfx/cairo/cairo/src/cairo-tor-scan-converter.c index dc8dad1c5..0dc20fef5 100644 --- a/gfx/cairo/cairo/src/cairo-tor-scan-converter.c +++ b/gfx/cairo/cairo/src/cairo-tor-scan-converter.c @@ -1,4 +1,3 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* glitter-paths - polygon scan converter * * Copyright (c) 2008 M Joonas Pihlaja @@ -25,12 +24,14 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ + /* This is the Glitter paths scan converter incorporated into cairo. * The source is from commit 734c53237a867a773640bd5b64816249fa1730f8 * of * * http://gitweb.freedesktop.org/?p=users/joonas/glitter-paths */ + /* Glitter-paths is a stand alone polygon rasteriser derived from * David Turner's reimplementation of Tor Anderssons's 15x17 * supersampling rasteriser from the Apparition graphics library. The diff --git a/gfx/cairo/cairo/src/cairo-toy-font-face.c b/gfx/cairo/cairo/src/cairo-toy-font-face.c index 4c690da53..92045ba3e 100644 --- a/gfx/cairo/cairo/src/cairo-toy-font-face.c +++ b/gfx/cairo/cairo/src/cairo-toy-font-face.c @@ -1,43 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005,2008 Red Hat Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Graydon Hoare <graydon@redhat.com> - * Owen Taylor <otaylor@redhat.com> - * Behdad Esfahbod <behdad@behdad.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define _BSD_SOURCE /* for strdup() */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-traps.c b/gfx/cairo/cairo/src/cairo-traps.c index 2fe6684db..c3f1d2e35 100644 --- a/gfx/cairo/cairo/src/cairo-traps.c +++ b/gfx/cairo/cairo/src/cairo-traps.c @@ -1,41 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* - * Copyright © 2002 Keith Packard - * Copyright © 2007 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Keith Packard - * - * Contributor(s): - * Keith R. Packard <keithp@keithp.com> - * Carl D. Worth <cworth@cworth.org> - * - * 2002-07-15: Converted from XRenderCompositeDoublePoly to #cairo_trap_t. Carl D. Worth - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-truetype-subset-private.h b/gfx/cairo/cairo/src/cairo-truetype-subset-private.h index f0822611d..fee112b97 100644 --- a/gfx/cairo/cairo/src/cairo-truetype-subset-private.h +++ b/gfx/cairo/cairo/src/cairo-truetype-subset-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_TRUETYPE_SUBSET_PRIVATE_H #define CAIRO_TRUETYPE_SUBSET_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-truetype-subset.c b/gfx/cairo/cairo/src/cairo-truetype-subset.c index 9bf2f8ffc..219adbeb6 100644 --- a/gfx/cairo/cairo/src/cairo-truetype-subset.c +++ b/gfx/cairo/cairo/src/cairo-truetype-subset.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * Useful links: diff --git a/gfx/cairo/cairo/src/cairo-type1-fallback.c b/gfx/cairo/cairo/src/cairo-type1-fallback.c index b93c42348..cc3a26966 100644 --- a/gfx/cairo/cairo/src/cairo-type1-fallback.c +++ b/gfx/cairo/cairo/src/cairo-type1-fallback.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define _BSD_SOURCE /* for snprintf(), strdup() */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-type1-private.h b/gfx/cairo/cairo/src/cairo-type1-private.h index 1630397bc..0634b7061 100644 --- a/gfx/cairo/cairo/src/cairo-type1-private.h +++ b/gfx/cairo/cairo/src/cairo-type1-private.h @@ -1,37 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_TYPE1_PRIVATE_H #define CAIRO_TYPE1_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-type1-subset.c b/gfx/cairo/cairo/src/cairo-type1-subset.c index ffa9bfb8f..7abcb10cb 100644 --- a/gfx/cairo/cairo/src/cairo-type1-subset.c +++ b/gfx/cairo/cairo/src/cairo-type1-subset.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * Useful links: diff --git a/gfx/cairo/cairo/src/cairo-type3-glyph-surface-private.h b/gfx/cairo/cairo/src/cairo-type3-glyph-surface-private.h index b4abcf604..b101431fc 100644 --- a/gfx/cairo/cairo/src/cairo-type3-glyph-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-type3-glyph-surface-private.h @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Adrian Johnson. - * - * Contributor(s): - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_TYPE3_GLYPH_SURFACE_PRIVATE_H #define CAIRO_TYPE3_GLYPH_SURFACE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-type3-glyph-surface.c b/gfx/cairo/cairo/src/cairo-type3-glyph-surface.c index 74257d4bf..e0ad08032 100644 --- a/gfx/cairo/cairo/src/cairo-type3-glyph-surface.c +++ b/gfx/cairo/cairo/src/cairo-type3-glyph-surface.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Adrian Johnson. - * - * Contributor(s): - * Adrian Johnson <ajohnson@redneon.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-types-private.h b/gfx/cairo/cairo/src/cairo-types-private.h index 93b035d7c..00b9269c7 100644 --- a/gfx/cairo/cairo/src/cairo-types-private.h +++ b/gfx/cairo/cairo/src/cairo-types-private.h @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_TYPES_PRIVATE_H #define CAIRO_TYPES_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-unicode.c b/gfx/cairo/cairo/src/cairo-unicode.c index 88de39516..3a60ff611 100644 --- a/gfx/cairo/cairo/src/cairo-unicode.c +++ b/gfx/cairo/cairo/src/cairo-unicode.c @@ -1,44 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * The code in this file is derived from GLib's gutf8.c and - * ultimately from libunicode. It is relicensed under the - * dual LGPL/MPL with permission of the original authors. - * - * Copyright © 1999 Tom Tromey - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Tom Tromey. - * and Red Hat, Inc. - * - * Contributor(s): - * Owen Taylor <otaylor@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-error-private.h" diff --git a/gfx/cairo/cairo/src/cairo-user-font-private.h b/gfx/cairo/cairo/src/cairo-user-font-private.h index d54ef78b4..c5995978f 100644 --- a/gfx/cairo/cairo/src/cairo-user-font-private.h +++ b/gfx/cairo/cairo/src/cairo-user-font-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006, 2008 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Behdad Esfahbod <behdad@behdad.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_USER_FONT_PRIVATE_H #define CAIRO_USER_FONT_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-user-font.c b/gfx/cairo/cairo/src/cairo-user-font.c index a524d588f..9219a7301 100644 --- a/gfx/cairo/cairo/src/cairo-user-font.c +++ b/gfx/cairo/cairo/src/cairo-user-font.c @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2006, 2008 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Kristian Høgsberg <krh@redhat.com> - * Behdad Esfahbod <behdad@behdad.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-user-font-private.h" diff --git a/gfx/cairo/cairo/src/cairo-version.c b/gfx/cairo/cairo/src/cairo-version.c index b07b48b37..5b7fa6827 100644 --- a/gfx/cairo/cairo/src/cairo-version.c +++ b/gfx/cairo/cairo/src/cairo-version.c @@ -1,40 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #define CAIRO_VERSION_H 1 diff --git a/gfx/cairo/cairo/src/cairo-vg-surface.c b/gfx/cairo/cairo/src/cairo-vg-surface.c index d3ae8aa52..3a3d83e96 100644 --- a/gfx/cairo/cairo/src/cairo-vg-surface.c +++ b/gfx/cairo/cairo/src/cairo-vg-surface.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Opened Hand Ltd. - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.og/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * Contributor(s): - * Pierre Tardy <tardyp@gmail.com> - * Øyvind KolÃ¥s <pippin@gimp.org> - * Vladimi Vukicevic <vladimir@mozilla.com> (stubbed out base backend) - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-vg.h b/gfx/cairo/cairo/src/cairo-vg.h index f9a62e51c..7f1097d04 100644 --- a/gfx/cairo/cairo/src/cairo-vg.h +++ b/gfx/cairo/cairo/src/cairo-vg.h @@ -1,40 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2007 * Mozilla Corporation - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Corporation. - * - * Contributor(s): - * Vladimir Vukicevic <vladimir@mozilla.com> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_VG_H #define CAIRO_VG_H diff --git a/gfx/cairo/cairo/src/cairo-wideint-private.h b/gfx/cairo/cairo/src/cairo-wideint-private.h index b9f8dae64..a1ae4dce8 100644 --- a/gfx/cairo/cairo/src/cairo-wideint-private.h +++ b/gfx/cairo/cairo/src/cairo-wideint-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Keith Packard - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Keith Packard - * - * Contributor(s): - * Keith R. Packard <keithp@keithp.com> - * - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_WIDEINT_H #define CAIRO_WIDEINT_H diff --git a/gfx/cairo/cairo/src/cairo-wideint-type-private.h b/gfx/cairo/cairo/src/cairo-wideint-type-private.h index 9e49ad947..d7f0319a2 100644 --- a/gfx/cairo/cairo/src/cairo-wideint-type-private.h +++ b/gfx/cairo/cairo/src/cairo-wideint-type-private.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Keith Packard - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Keith Packard - * - * Contributor(s): - * Keith R. Packard <keithp@keithp.com> - * - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_WIDEINT_TYPE_H #define CAIRO_WIDEINT_TYPE_H diff --git a/gfx/cairo/cairo/src/cairo-wideint.c b/gfx/cairo/cairo/src/cairo-wideint.c index 78dedcdf0..90809c005 100644 --- a/gfx/cairo/cairo/src/cairo-wideint.c +++ b/gfx/cairo/cairo/src/cairo-wideint.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2004 Keith Packard - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Keith Packard - * - * Contributor(s): - * Keith R. Packard <keithp@keithp.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-win32-font.c b/gfx/cairo/cairo/src/cairo-win32-font.c index f0bdc8457..ccdd16187 100644 --- a/gfx/cairo/cairo/src/cairo-win32-font.c +++ b/gfx/cairo/cairo/src/cairo-win32-font.c @@ -1,45 +1,16 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#define WIN32_LEAN_AND_MEAN -/* We require Windows 2000 features such as GetGlyphIndices */ -#if !defined(WINVER) || (WINVER < 0x0500) -# define WINVER 0x0500 +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +/* We require at least Windows 7 features */ +#if !defined(WINVER) || (WINVER < 0x0601) +# define WINVER 0x0601 #endif -#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) -# define _WIN32_WINNT 0x0500 +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0601) +# define _WIN32_WINNT 0x0601 #endif #include "cairoint.h" @@ -245,18 +216,8 @@ _compute_transform (cairo_win32_scaled_font_t *scaled_font, static cairo_bool_t _have_cleartype_quality (void) { - OSVERSIONINFO version_info; - - version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); - - if (!GetVersionEx (&version_info)) { - _cairo_win32_print_gdi_error ("_have_cleartype_quality"); - return FALSE; - } - - return (version_info.dwMajorVersion > 5 || - (version_info.dwMajorVersion == 5 && - version_info.dwMinorVersion >= 1)); /* XP or newer */ + // All supported versions have cleartype + return TRUE; } BYTE diff --git a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c index a6df34ae1..56cf3242b 100644 --- a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c +++ b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c @@ -1,47 +1,16 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2007, 2008 Adrian Johnson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Adrian Johnson. - * - * Contributor(s): - * Adrian Johnson <ajohnson@redneon.com> - * Vladimir Vukicevic <vladimir@pobox.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#define WIN32_LEAN_AND_MEAN -/* We require Windows 2000 features such as ETO_PDY */ -#if !defined(WINVER) || (WINVER < 0x0500) -# define WINVER 0x0500 +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +/* We require at least Windows 7 features */ +#if !defined(WINVER) || (WINVER < 0x0601) +# define WINVER 0x0601 #endif -#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) -# define _WIN32_WINNT 0x0500 +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0601) +# define _WIN32_WINNT 0x0601 #endif #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-win32-private.h b/gfx/cairo/cairo/src/cairo-win32-private.h index 44c38535f..571b7547c 100644 --- a/gfx/cairo/cairo/src/cairo-win32-private.h +++ b/gfx/cairo/cairo/src/cairo-win32-private.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Owen Taylor <otaylor@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_WIN32_PRIVATE_H #define CAIRO_WIN32_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-win32-refptr.h b/gfx/cairo/cairo/src/cairo-win32-refptr.h index 0baf8ee7b..8c0ec3338 100644 --- a/gfx/cairo/cairo/src/cairo-win32-refptr.h +++ b/gfx/cairo/cairo/src/cairo-win32-refptr.h @@ -1,38 +1,7 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2010 Mozilla Foundation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is the Mozilla Foundation - * - * Contributor(s): - * Bas Schouten <bschouten@mozilla.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + #ifndef CAIRO_WIN32_REFPTR_H #define CAIRO_WIN32_REFPTR_H diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c index 3a3d82989..2d7395590 100644 --- a/gfx/cairo/cairo/src/cairo-win32-surface.c +++ b/gfx/cairo/cairo/src/cairo-win32-surface.c @@ -1,48 +1,16 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Owen Taylor <otaylor@redhat.com> - * Stuart Parmenter <stuart@mozilla.com> - * Vladimir Vukicevic <vladimir@pobox.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#define WIN32_LEAN_AND_MEAN -/* We require Windows 2000 features such as ETO_PDY */ -#if !defined(WINVER) || (WINVER < 0x0500) -# define WINVER 0x0500 +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +/* We require at least Windows 7 features */ +#if !defined(WINVER) || (WINVER < 0x0601) +# define WINVER 0x0601 #endif -#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) -# define _WIN32_WINNT 0x0500 +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0601) +# define _WIN32_WINNT 0x0601 #endif #include "cairoint.h" @@ -947,28 +915,14 @@ _composite_alpha_blend (cairo_win32_surface_t *dst, BLENDFUNCTION blend_function; - /* Check for AlphaBlend dynamically to allow compiling on - * MSVC 6 and use on older windows versions - */ + /* Check for AlphaBlend dynamically */ if (!alpha_blend_checked) { - OSVERSIONINFO os; - - os.dwOSVersionInfoSize = sizeof (os); - GetVersionEx (&os); - - /* If running on Win98, disable using AlphaBlend() - * to avoid Win98 AlphaBlend() bug */ - if (VER_PLATFORM_WIN32_WINDOWS != os.dwPlatformId || - os.dwMajorVersion != 4 || os.dwMinorVersion != 10) - { HMODULE msimg32_dll = LoadLibraryW (L"msimg32"); if (msimg32_dll != NULL) alpha_blend = (cairo_alpha_blend_func_t)GetProcAddress (msimg32_dll, "AlphaBlend"); - } - - alpha_blend_checked = TRUE; + alpha_blend_checked = TRUE; } if (alpha_blend == NULL) diff --git a/gfx/cairo/cairo/src/cairo-win32.h b/gfx/cairo/cairo/src/cairo-win32.h index 07f7cc8e4..a1d45c19a 100644 --- a/gfx/cairo/cairo/src/cairo-win32.h +++ b/gfx/cairo/cairo/src/cairo-win32.h @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Owen Taylor <otaylor@redhat.com> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef _CAIRO_WIN32_H_ #define _CAIRO_WIN32_H_ diff --git a/gfx/cairo/cairo/src/cairo-xcb-surface.c b/gfx/cairo/cairo/src/cairo-xcb-surface.c index da07f609f..7f53e630f 100644 --- a/gfx/cairo/cairo/src/cairo-xcb-surface.c +++ b/gfx/cairo/cairo/src/cairo-xcb-surface.c @@ -1,42 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Behdad Esfahbod <behdad@behdad.org> - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - * Karl Tomlinson <karlt+@karlt.net>, Mozilla Corporation - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-xcb-xrender.h b/gfx/cairo/cairo/src/cairo-xcb-xrender.h index 09c609738..ff81706c4 100644 --- a/gfx/cairo/cairo/src/cairo-xcb-xrender.h +++ b/gfx/cairo/cairo/src/cairo-xcb-xrender.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_XCB_XRENDER_H #define CAIRO_XCB_XRENDER_H diff --git a/gfx/cairo/cairo/src/cairo-xcb.h b/gfx/cairo/cairo/src/cairo-xcb.h index 3f64dcbdc..de72b4f04 100644 --- a/gfx/cairo/cairo/src/cairo-xcb.h +++ b/gfx/cairo/cairo/src/cairo-xcb.h @@ -1,40 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_XCB_H #define CAIRO_XCB_H diff --git a/gfx/cairo/cairo/src/cairo-xlib-display.c b/gfx/cairo/cairo/src/cairo-xlib-display.c index 139e63149..7967d6027 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-display.c +++ b/gfx/cairo/cairo/src/cairo-xlib-display.c @@ -1,37 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - * - * Contributor(s): - * Karl Tomlinson <karlt+@karlt.net>, Mozilla Corporation - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-xlib-private.h b/gfx/cairo/cairo/src/cairo-xlib-private.h index bd260bc0e..e575b2704 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-private.h +++ b/gfx/cairo/cairo/src/cairo-xlib-private.h @@ -1,38 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributors(s): - * Chris Wilson <chris@chris-wilson.co.uk> - * Karl Tomlinson <karlt+@karlt.net>, Mozilla Corporation - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_XLIB_PRIVATE_H #define CAIRO_XLIB_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-xlib-screen.c b/gfx/cairo/cairo/src/cairo-xlib-screen.c index a0c3df840..9663ddb7b 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-screen.c +++ b/gfx/cairo/cairo/src/cairo-xlib-screen.c @@ -1,35 +1,8 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Partially on code from xftdpy.c +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Partially based on code from xftdpy.c, original code licensed under: * * Copyright © 2000 Keith Packard * diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface-private.h b/gfx/cairo/cairo/src/cairo-xlib-surface-private.h index 34732b4f6..cd7e79d69 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-xlib-surface-private.h @@ -1,34 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_XLIB_SURFACE_PRIVATE_H #define CAIRO_XLIB_SURFACE_PRIVATE_H diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface.c b/gfx/cairo/cairo/src/cairo-xlib-surface.c index e24c9627a..36b696eaa 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-surface.c +++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c @@ -1,43 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - * Behdad Esfahbod <behdad@behdad.org> - * Chris Wilson <chris@chris-wilson.co.uk> - * Karl Tomlinson <karlt+@karlt.net>, Mozilla Corporation - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* Heed well the words of Owen Taylor: * "Any patch that works around a render bug, or claims to, without a diff --git a/gfx/cairo/cairo/src/cairo-xlib-visual.c b/gfx/cairo/cairo/src/cairo-xlib-visual.c index e076ed01e..f70db3a77 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-visual.c +++ b/gfx/cairo/cairo/src/cairo-xlib-visual.c @@ -1,37 +1,6 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2008 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" diff --git a/gfx/cairo/cairo/src/cairo-xlib-xrender-private.h b/gfx/cairo/cairo/src/cairo-xlib-xrender-private.h index 52f415915..6372787a0 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-xrender-private.h +++ b/gfx/cairo/cairo/src/cairo-xlib-xrender-private.h @@ -1,34 +1,8 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Part of this file is subject to a different license. See below. */ #ifndef CAIRO_XLIB_XRENDER_PRIVATE_H #define CAIRO_XLIB_XRENDER_PRIVATE_H @@ -184,7 +158,7 @@ typedef struct _XConicalGradient { /* The rest of this file is copied from various Xrender header files, with * the following copyright/license information: * - * Copyright © 2000 SuSE, Inc. + * Copyright (C) 2000 SuSE, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that diff --git a/gfx/cairo/cairo/src/cairo-xlib-xrender.h b/gfx/cairo/cairo/src/cairo-xlib-xrender.h index b34b057de..996983e4e 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-xrender.h +++ b/gfx/cairo/cairo/src/cairo-xlib-xrender.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_XLIB_XRENDER_H #define CAIRO_XLIB_XRENDER_H diff --git a/gfx/cairo/cairo/src/cairo-xlib.h b/gfx/cairo/cairo/src/cairo-xlib.h index 4ee592ce4..fdcff769c 100644 --- a/gfx/cairo/cairo/src/cairo-xlib.h +++ b/gfx/cairo/cairo/src/cairo-xlib.h @@ -1,38 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_XLIB_H #define CAIRO_XLIB_H diff --git a/gfx/cairo/cairo/src/cairo-xml-surface.c b/gfx/cairo/cairo/src/cairo-xml-surface.c index 5583829e7..f1c3c3ed6 100644 --- a/gfx/cairo/cairo/src/cairo-xml-surface.c +++ b/gfx/cairo/cairo/src/cairo-xml-surface.c @@ -1,38 +1,6 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This surface is intended to produce a verbose, hierarchical, DAG XML file * representing a single surface. It is intended to be used by debuggers, diff --git a/gfx/cairo/cairo/src/cairo-xml.h b/gfx/cairo/cairo/src/cairo-xml.h index 9ae76e90a..0367076a3 100644 --- a/gfx/cairo/cairo/src/cairo-xml.h +++ b/gfx/cairo/cairo/src/cairo-xml.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2009 Chris Wilson - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_XML_H #define CAIRO_XML_H diff --git a/gfx/cairo/cairo/src/cairo.c b/gfx/cairo/cairo/src/cairo.c index eeee0206e..e4a90b57f 100644 --- a/gfx/cairo/cairo/src/cairo.c +++ b/gfx/cairo/cairo/src/cairo.c @@ -1,40 +1,6 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cairoint.h" #include "cairo-private.h" diff --git a/gfx/cairo/cairo/src/cairo.h b/gfx/cairo/cairo/src/cairo.h index 52d062352..3a34e80bf 100644 --- a/gfx/cairo/cairo/src/cairo.h +++ b/gfx/cairo/cairo/src/cairo.h @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef CAIRO_H #define CAIRO_H diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h index be78d6d89..3627cd288 100644 --- a/gfx/cairo/cairo/src/cairoint.h +++ b/gfx/cairo/cairo/src/cairoint.h @@ -1,39 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * These definitions are solely for use by the implementation of cairo diff --git a/gfx/cairo/cairo/src/test-fallback-surface.c b/gfx/cairo/cairo/src/test-fallback-surface.c index 66399d4ab..ff07bc81e 100644 --- a/gfx/cairo/cairo/src/test-fallback-surface.c +++ b/gfx/cairo/cairo/src/test-fallback-surface.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This isn't a "real" surface, but just something to be used by the * test suite to test a mythical backend that uses nothing but diff --git a/gfx/cairo/cairo/src/test-fallback-surface.h b/gfx/cairo/cairo/src/test-fallback-surface.h index e70715113..c2534c184 100644 --- a/gfx/cairo/cairo/src/test-fallback-surface.h +++ b/gfx/cairo/cairo/src/test-fallback-surface.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef TEST_FALLBACK_SURFACE_H #define TEST_FALLBACK_SURFACE_H diff --git a/gfx/cairo/cairo/src/test-meta-surface.c b/gfx/cairo/cairo/src/test-meta-surface.c index d5e14d7d1..305174eb5 100644 --- a/gfx/cairo/cairo/src/test-meta-surface.c +++ b/gfx/cairo/cairo/src/test-meta-surface.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This isn't a "real" surface, but just something to be used by the * test suite to help exercise the meta-surface paths in cairo. diff --git a/gfx/cairo/cairo/src/test-meta-surface.h b/gfx/cairo/cairo/src/test-meta-surface.h index c036bb9c8..78b7a5752 100644 --- a/gfx/cairo/cairo/src/test-meta-surface.h +++ b/gfx/cairo/cairo/src/test-meta-surface.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef TEST_META_SURFACE_H #define TEST_META_SURFACE_H diff --git a/gfx/cairo/cairo/src/test-paginated-surface.c b/gfx/cairo/cairo/src/test-paginated-surface.c index e06cbed71..5d09308f4 100644 --- a/gfx/cairo/cairo/src/test-paginated-surface.c +++ b/gfx/cairo/cairo/src/test-paginated-surface.c @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* This isn't a "real" surface, but just something to be used by the * test suite to help exercise the paginated-surface paths in cairo. diff --git a/gfx/cairo/cairo/src/test-paginated-surface.h b/gfx/cairo/cairo/src/test-paginated-surface.h index 2bd98aa5e..5f2d1d593 100644 --- a/gfx/cairo/cairo/src/test-paginated-surface.h +++ b/gfx/cairo/cairo/src/test-paginated-surface.h @@ -1,37 +1,6 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl Worth <cworth@cworth.org> - */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef TEST_PAGINATED_SURFACE_H #define TEST_PAGINATED_SURFACE_H diff --git a/gfx/cairo/cairo_qt_a8_fallback.diff b/gfx/cairo/cairo_qt_a8_fallback.diff deleted file mode 100644 index a8388dda7..000000000 --- a/gfx/cairo/cairo_qt_a8_fallback.diff +++ /dev/null @@ -1,68 +0,0 @@ -CAIRO_FORMAT_A8 not allowed for cairo-qt image backend -diff --git a/gfx/cairo/cairo/src/cairo-qt-surface.cpp b/gfx/cairo/cairo/src/cairo-qt-surface.cpp ---- a/gfx/cairo/cairo/src/cairo-qt-surface.cpp -+++ b/gfx/cairo/cairo/src/cairo-qt-surface.cpp -@@ -459,17 +459,17 @@ _cairo_qt_surface_finish (void *abstract - { - cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; - - D(fprintf(stderr, "q[%p] finish\n", abstract_surface)); - - /* Only delete p if we created it */ - if (qs->image || qs->pixmap) - delete qs->p; -- else -+ else if (qs->p) - qs->p->restore (); - - if (qs->image_equiv) - cairo_surface_destroy (qs->image_equiv); - - _cairo_surface_clipper_reset (&qs->clipper); - - if (qs->image) -@@ -736,17 +736,17 @@ _cairo_qt_surface_set_clip_region (cairo - } - - static cairo_int_status_t - _cairo_qt_surface_set_clip (cairo_qt_surface_t *qs, - cairo_clip_t *clip) - { - cairo_int_status_t status; - -- D(fprintf(stderr, "q[%p] intersect_clip_path %s\n", abstract_surface, path ? "(path)" : "(clear)")); -+ D(fprintf(stderr, "q[%p] intersect_clip_path %s\n", qs, clip ? "(path)" : "(clear)")); - - if (clip == NULL) { - _cairo_surface_clipper_reset (&qs->clipper); - // How the clip path is reset depends on whether we own p or not - if (qs->pixmap || qs->image) { - // we own p - qs->p->setClipping (false); - } else { -@@ -1605,16 +1605,25 @@ cairo_qt_surface_create_with_qimage (cai - - _cairo_surface_init (&qs->base, - &cairo_qt_surface_backend, - _cairo_content_from_format (format)); - - _cairo_surface_clipper_init (&qs->clipper, - _cairo_qt_surface_clipper_intersect_clip_path); - -+ if (CAIRO_FORMAT_A8 == format) { -+ qs->image = NULL; -+ qs->image_equiv = cairo_image_surface_create(format, -+ width, height); -+ qs->p = NULL; -+ qs->supports_porter_duff = false; -+ qs->window = QRect(0, 0, width, height); -+ return &qs->base; -+ } - - QImage *image = new QImage (width, height, - _qimage_format_from_cairo_format (format)); - - qs->image = image; - - if (!image->isNull()) { - qs->p = new QPainter(image); diff --git a/gfx/cairo/cairo_qt_glyphs.patch b/gfx/cairo/cairo_qt_glyphs.patch deleted file mode 100644 index b12356287..000000000 --- a/gfx/cairo/cairo_qt_glyphs.patch +++ /dev/null @@ -1,256 +0,0 @@ -Bug 29092 - Fix glyphs rendering for cairo-qpainter-surface -diff --git a/src/cairo-qt-surface.cpp b/src/cairo-qt-surface.cpp -index 2ac06ef..5b61b42 100644 ---- a/src/cairo-qt-surface.cpp -+++ b/src/cairo-qt-surface.cpp -@@ -45,6 +45,7 @@ - #include "cairo-surface-clipper-private.h" - #include "cairo-types-private.h" - -+#include "cairo-ft.h" - #include "cairo-qt.h" - - #include <memory> -@@ -58,14 +59,10 @@ - #include <QtGui/QPen> - #include <QtGui/QWidget> - #include <QtGui/QX11Info> -+#include <QtCore/QVarLengthArray> - --#if CAIRO_HAS_XLIB_XRENDER_SURFACE --#include "cairo-xlib.h" --#include "cairo-xlib-xrender.h" --// I hate X --#undef Status --#undef CursorShape --#undef Bool -+#if (QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)) || defined(QT_GLYPHS_API_BACKPORT) -+extern void qt_draw_glyphs(QPainter *, const quint32 *glyphs, const QPointF *positions, int count); - #endif - - #include <sys/time.h> -@@ -118,15 +115,6 @@ struct cairo_qt_surface_t { - - cairo_bool_t supports_porter_duff; - --#if defined(Q_WS_X11) && CAIRO_HAS_XLIB_XRENDER_SURFACE -- /* temporary, so that we can share the xlib surface's glyphs code */ -- bool xlib_has_clipping; -- cairo_surface_t *xlib_equiv; -- QRect xlib_clip_bounds; -- int xlib_clip_serial; -- QPoint redir_offset; --#endif -- - QPainter *p; - - /* The pixmap/image constructors will store their objects here */ -@@ -145,11 +133,6 @@ struct cairo_qt_surface_t { - */ - static cairo_bool_t _qpixmaps_have_no_alpha = FALSE; - --#if defined(Q_WS_X11) && CAIRO_HAS_XLIB_XRENDER_SURFACE --slim_hidden_proto (cairo_xlib_surface_create); --slim_hidden_proto (cairo_xlib_surface_create_with_xrender_format); --#endif -- - /** - ** Helper methods - **/ -@@ -498,11 +481,6 @@ _cairo_qt_surface_finish (void *abstract_surface) - - _cairo_surface_clipper_reset (&qs->clipper); - --#if defined(Q_WS_X11) && CAIRO_HAS_XLIB_XRENDER_SURFACE -- if (qs->xlib_equiv) -- cairo_surface_destroy (qs->xlib_equiv); --#endif -- - if (qs->image) - delete qs->image; - -@@ -1392,33 +1370,40 @@ _cairo_qt_surface_show_glyphs (void *abstract_surface, - cairo_clip_t *clip, - int *remaining_glyphs) - { -+#if (QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)) || defined(QT_GLYPHS_API_BACKPORT) - cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; - --#if defined(Q_WS_X11) && CAIRO_HAS_XLIB_XRENDER_SURFACE -- /* If we have an equivalent X surface, let the xlib surface handle this -- * until we figure out how to do this natively with Qt. -- */ -- if (qs->xlib_equiv) { -- D(fprintf(stderr, "q[%p] show_glyphs (x11 equiv) op:%s nglyphs: %d\n", abstract_surface, _opstr(op), num_glyphs)); -- -- for (int i = 0; i < num_glyphs; i++) { -- glyphs[i].x -= qs->redir_offset.x(); -- glyphs[i].y -= qs->redir_offset.y(); -- } -- -- return (cairo_int_status_t) -- _cairo_surface_show_text_glyphs (qs->xlib_equiv, -- op, source, -- NULL, 0, -- glyphs, num_glyphs, -- NULL, 0, -- (cairo_text_cluster_flags_t) 0, -- scaled_font, -- clip); -+ // pick out the colour to use from the cairo source -+ cairo_solid_pattern_t *solid = (cairo_solid_pattern_t*) source; -+ cairo_scaled_glyph_t* glyph; -+ // documentation says you have to freeze the cache, but I don't believe it -+ _cairo_scaled_font_freeze_cache(scaled_font); -+ -+ QColor tempColour(solid->color.red * 255, solid->color.green * 255, solid->color.blue * 255); -+ QVarLengthArray<QPointF> positions(num_glyphs); -+ QVarLengthArray<unsigned int> glyphss(num_glyphs); -+ FT_Face face = cairo_ft_scaled_font_lock_face (scaled_font); -+ const FT_Size_Metrics& ftMetrics = face->size->metrics; -+ QFont font(face->family_name); -+ font.setStyleStrategy(QFont::NoFontMerging); -+ font.setBold(face->style_flags & FT_STYLE_FLAG_BOLD); -+ font.setItalic(face->style_flags & FT_STYLE_FLAG_ITALIC); -+ font.setKerning(face->face_flags & FT_FACE_FLAG_KERNING); -+ font.setPixelSize(ftMetrics.y_ppem); -+ cairo_ft_scaled_font_unlock_face(scaled_font); -+ qs->p->setFont(font); -+ qs->p->setPen(tempColour); -+ for (int currentGlyph = 0; currentGlyph < num_glyphs; currentGlyph++) { -+ positions[currentGlyph].setX(glyphs[currentGlyph].x); -+ positions[currentGlyph].setY(glyphs[currentGlyph].y); -+ glyphss[currentGlyph] = glyphs[currentGlyph].index; - } --#endif -- -+ qt_draw_glyphs(qs->p, glyphss.data(), positions.data(), num_glyphs); -+ _cairo_scaled_font_thaw_cache(scaled_font); -+ return CAIRO_INT_STATUS_SUCCESS; -+#else - return CAIRO_INT_STATUS_UNSUPPORTED; -+#endif - } - - static cairo_int_status_t -@@ -1555,24 +1540,6 @@ _cairo_qt_surface_composite (cairo_operator_t op, - } - - static cairo_status_t --_cairo_qt_surface_flush (void *abstract_surface) --{ -- cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; -- -- if (qs->p == NULL) -- return CAIRO_STATUS_SUCCESS; -- -- if (qs->image || qs->pixmap) { -- qs->p->end (); -- qs->p->begin (qs->p->device ()); -- } else { -- qs->p->restore (); -- } -- -- return CAIRO_STATUS_SUCCESS; --} -- --static cairo_status_t - _cairo_qt_surface_mark_dirty (void *abstract_surface, - int x, int y, - int width, int height) -@@ -1609,7 +1576,7 @@ static const cairo_surface_backend_t cairo_qt_surface_backend = { - _cairo_qt_surface_get_extents, - NULL, /* old_show_glyphs */ - NULL, /* get_font_options */ -- _cairo_qt_surface_flush, -+ NULL, /* flush */ - _cairo_qt_surface_mark_dirty, - NULL, /* scaled_font_fini */ - NULL, /* scaled_glyph_fini */ -@@ -1629,64 +1596,6 @@ static const cairo_surface_backend_t cairo_qt_surface_backend = { - NULL, /* show_text_glyphs */ - }; - --#if defined(Q_WS_X11) && CAIRO_HAS_XLIB_XRENDER_SURFACE --static cairo_surface_t * --_cairo_qt_create_xlib_surface (cairo_qt_surface_t *qs) --{ -- if (!qs->p) -- return NULL; -- -- QPaintDevice *pd = qs->p->device(); -- if (!pd) -- return NULL; -- -- QPoint offs; -- QPaintDevice *rpd = QPainter::redirected(pd, &offs); -- if (rpd) { -- pd = rpd; -- qs->redir_offset = offs; -- } -- -- if (pd->devType() == QInternal::Widget) { -- QWidget *w = (QWidget*) pd; -- QX11Info xinfo = w->x11Info(); -- -- return cairo_xlib_surface_create (xinfo.display(), -- (Drawable) w->handle (), -- (Visual *) xinfo.visual (), -- w->width (), w->height ()); -- } else if (pd->devType() == QInternal::Pixmap) { -- QPixmap *pixmap = (QPixmap*) pd; -- QX11Info xinfo = pixmap->x11Info (); -- XRenderPictFormat *xrender_format; -- int pict_format; -- -- switch (pixmap->depth ()) { -- case 1: -- pict_format = PictStandardA1; break; -- case 8: -- pict_format = PictStandardA8; break; -- case 24: -- pict_format = PictStandardRGB24; break; -- default: -- ASSERT_NOT_REACHED; -- case 32: -- pict_format = PictStandardARGB32; break; -- } -- xrender_format = XRenderFindStandardFormat (xinfo.display (), -- pict_format); -- -- return cairo_xlib_surface_create_with_xrender_format (xinfo.display(), -- (Drawable) pixmap->handle (), -- ScreenOfDisplay (xinfo.display (), -- xinfo.screen ()), -- xrender_format, -- pixmap->width (), pixmap->height ()); -- } else -- return NULL; --} --#endif -- - cairo_surface_t * - cairo_qt_surface_create (QPainter *painter) - { -@@ -1717,10 +1626,6 @@ cairo_qt_surface_create (QPainter *painter) - - qs->window = painter->window(); - --#if defined(Q_WS_X11) && CAIRO_HAS_XLIB_XRENDER_SURFACE -- qs->xlib_equiv = _cairo_qt_create_xlib_surface (qs); --#endif -- - D(fprintf(stderr, "qpainter_surface_create: window: [%d %d %d %d] pd:%d\n", - qs->window.x(), qs->window.y(), qs->window.width(), qs->window.height(), - qs->supports_porter_duff)); -@@ -1819,10 +1724,6 @@ cairo_qt_surface_create_with_qpixmap (cairo_content_t content, - - qs->window = QRect(0, 0, width, height); - --#if defined(Q_WS_X11) && CAIRO_HAS_XLIB_XRENDER_SURFACE -- qs->xlib_equiv = _cairo_qt_create_xlib_surface (qs); --#endif -- - D(fprintf(stderr, "qpainter_surface_create: qpixmap: [%d %d %d %d] pd:%d\n", - qs->window.x(), qs->window.y(), qs->window.width(), qs->window.height(), - qs->supports_porter_duff)); diff --git a/gfx/cairo/clip-invariant.patch b/gfx/cairo/clip-invariant.patch deleted file mode 100644 index 08ba4d4de..000000000 --- a/gfx/cairo/clip-invariant.patch +++ /dev/null @@ -1,1255 +0,0 @@ -diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c -index 2acc8b5..019249e 100644 ---- a/src/cairo-gl-surface.c -+++ b/src/cairo-gl-surface.c -@@ -2012,13 +2012,14 @@ typedef struct _cairo_gl_surface_span_renderer { - - cairo_gl_composite_setup_t setup; - -+ int xmin, xmax; -+ - cairo_operator_t op; - cairo_antialias_t antialias; - - cairo_gl_surface_t *dst; - cairo_region_t *clip; - -- cairo_composite_rectangles_t composite_rectangles; - GLuint vbo; - void *vbo_base; - unsigned int vbo_size; -@@ -2049,11 +2050,11 @@ _cairo_gl_span_renderer_flush (cairo_gl_surface_span_renderer_t *renderer) - cairo_region_get_rectangle (renderer->clip, i, &rect); - - glScissor (rect.x, rect.y, rect.width, rect.height); -- glDrawArrays (GL_LINES, 0, count); -+ glDrawArrays (GL_QUADS, 0, count); - } - glDisable (GL_SCISSOR_TEST); - } else { -- glDrawArrays (GL_LINES, 0, count); -+ glDrawArrays (GL_QUADS, 0, count); - } - } - -@@ -2134,72 +2135,87 @@ _cairo_gl_emit_span_vertex (cairo_gl_surface_span_renderer_t *renderer, - - static void - _cairo_gl_emit_span (cairo_gl_surface_span_renderer_t *renderer, -- int x1, int x2, int y, uint8_t alpha) -+ int x, int y1, int y2, -+ uint8_t alpha) - { - float *vertices = _cairo_gl_span_renderer_get_vbo (renderer, 2); - -- _cairo_gl_emit_span_vertex (renderer, x1, y, alpha, vertices); -- _cairo_gl_emit_span_vertex (renderer, x2, y, alpha, -+ _cairo_gl_emit_span_vertex (renderer, x, y1, alpha, vertices); -+ _cairo_gl_emit_span_vertex (renderer, x, y2, alpha, - vertices + renderer->vertex_size / 4); - } - --/* Emits the contents of the span renderer rows as GL_LINES with the span's -- * alpha. -- * -- * Unlike the image surface, which is compositing into a temporary, we emit -- * coverage even for alpha == 0, in case we're using an unbounded operator. -- * But it means we avoid having to do the fixup. -- */ -+static void -+_cairo_gl_emit_rectangle (cairo_gl_surface_span_renderer_t *renderer, -+ int x1, int y1, -+ int x2, int y2, -+ int coverage) -+{ -+ _cairo_gl_emit_span (renderer, x1, y1, y2, coverage); -+ _cairo_gl_emit_span (renderer, x2, y2, y1, coverage); -+} -+ - static cairo_status_t --_cairo_gl_surface_span_renderer_render_row ( -- void *abstract_renderer, -- int y, -- const cairo_half_open_span_t *spans, -- unsigned num_spans) -+_cairo_gl_render_bounded_spans (void *abstract_renderer, -+ int y, int height, -+ const cairo_half_open_span_t *spans, -+ unsigned num_spans) - { - cairo_gl_surface_span_renderer_t *renderer = abstract_renderer; -- int xmin = renderer->composite_rectangles.mask.x; -- int xmax = xmin + renderer->composite_rectangles.width; -- int prev_x = xmin; -- int prev_alpha = 0; -- unsigned i; -- int x_translate; -- -- /* Make sure we're within y-range. */ -- if (y < renderer->composite_rectangles.mask.y || -- y >= renderer->composite_rectangles.mask.y + -- renderer->composite_rectangles.height) -+ -+ if (num_spans == 0) - return CAIRO_STATUS_SUCCESS; - -- x_translate = renderer->composite_rectangles.dst.x - -- renderer->composite_rectangles.mask.x; -- y += renderer->composite_rectangles.dst.y - -- renderer->composite_rectangles.mask.y; -+ do { -+ if (spans[0].coverage) { -+ _cairo_gl_emit_rectangle (renderer, -+ spans[0].x, y, -+ spans[1].x, y + height, -+ spans[0].coverage); -+ } - -- /* Find the first span within x-range. */ -- for (i=0; i < num_spans && spans[i].x < xmin; i++) {} -- if (i>0) -- prev_alpha = spans[i-1].coverage; -+ spans++; -+ } while (--num_spans > 1); - -- /* Set the intermediate spans. */ -- for (; i < num_spans; i++) { -- int x = spans[i].x; -+ return CAIRO_STATUS_SUCCESS; -+} - -- if (x >= xmax) -- break; -+static cairo_status_t -+_cairo_gl_render_unbounded_spans (void *abstract_renderer, -+ int y, int height, -+ const cairo_half_open_span_t *spans, -+ unsigned num_spans) -+{ -+ cairo_gl_surface_span_renderer_t *renderer = abstract_renderer; - -- _cairo_gl_emit_span (renderer, -- prev_x + x_translate, x + x_translate, y, -- prev_alpha); -+ if (num_spans == 0) { -+ _cairo_gl_emit_rectangle (renderer, -+ renderer->xmin, y, -+ renderer->xmax, y + height, -+ 0); -+ return CAIRO_STATUS_SUCCESS; -+ } - -- prev_x = x; -- prev_alpha = spans[i].coverage; -+ if (spans[0].x != renderer->xmin) { -+ _cairo_gl_emit_rectangle (renderer, -+ renderer->xmin, y, -+ spans[0].x, y + height, -+ 0); - } - -- if (prev_x < xmax) { -- _cairo_gl_emit_span (renderer, -- prev_x + x_translate, xmax + x_translate, y, -- prev_alpha); -+ do { -+ _cairo_gl_emit_rectangle (renderer, -+ spans[0].x, y, -+ spans[1].x, y + height, -+ spans[0].coverage); -+ spans++; -+ } while (--num_spans > 1); -+ -+ if (spans[0].x != renderer->xmax) { -+ _cairo_gl_emit_rectangle (renderer, -+ spans[0].x, y, -+ renderer->xmax, y + height, -+ 0); - } - - return CAIRO_STATUS_SUCCESS; -@@ -2274,8 +2290,6 @@ _cairo_gl_surface_create_span_renderer (cairo_operator_t op, - cairo_gl_surface_t *dst = abstract_dst; - cairo_gl_surface_span_renderer_t *renderer; - cairo_status_t status; -- int width = rects->width; -- int height = rects->height; - cairo_surface_attributes_t *src_attributes; - GLenum err; - -diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c -index 48d8013..d52979d 100644 ---- a/src/cairo-image-surface.c -+++ b/src/cairo-image-surface.c -@@ -1390,11 +1390,13 @@ typedef struct _cairo_image_surface_span_renderer { - const cairo_pattern_t *pattern; - cairo_antialias_t antialias; - -+ uint8_t *mask_data; -+ uint32_t mask_stride; -+ - cairo_image_surface_t *src; - cairo_surface_attributes_t src_attributes; - cairo_image_surface_t *mask; - cairo_image_surface_t *dst; -- - cairo_composite_rectangles_t composite_rectangles; - } cairo_image_surface_span_renderer_t; - -@@ -1403,66 +1405,46 @@ _cairo_image_surface_span_render_row ( - int y, - const cairo_half_open_span_t *spans, - unsigned num_spans, -- cairo_image_surface_t *mask, -- const cairo_composite_rectangles_t *rects) -+ uint8_t *data, -+ uint32_t stride) - { -- int xmin = rects->mask.x; -- int xmax = xmin + rects->width; - uint8_t *row; -- int prev_x = xmin; -- int prev_alpha = 0; - unsigned i; - -- /* Make sure we're within y-range. */ -- y -= rects->mask.y; -- if (y < 0 || y >= rects->height) -+ if (num_spans == 0) - return; - -- row = (uint8_t*)(mask->data) + y*(size_t)mask->stride - xmin; -- -- /* Find the first span within x-range. */ -- for (i=0; i < num_spans && spans[i].x < xmin; i++) {} -- if (i>0) -- prev_alpha = spans[i-1].coverage; -- -- /* Set the intermediate spans. */ -- for (; i < num_spans; i++) { -- int x = spans[i].x; -- -- if (x >= xmax) -- break; -- -- if (prev_alpha != 0) { -- /* We implement setting rendering the most common single -- * pixel wide span case to avoid the overhead of a memset -- * call. Open coding setting longer spans didn't show a -- * noticeable improvement over memset. */ -- if (x == prev_x + 1) { -- row[prev_x] = prev_alpha; -- } -- else { -- memset(row + prev_x, prev_alpha, x - prev_x); -- } -+ row = data + y * stride; -+ for (i = 0; i < num_spans - 1; i++) { -+ if (! spans[i].coverage) -+ continue; -+ -+ /* We implement setting the most common single pixel wide -+ * span case to avoid the overhead of a memset call. -+ * Open coding setting longer spans didn't show a -+ * noticeable improvement over memset. -+ */ -+ if (spans[i+1].x == spans[i].x + 1) { -+ row[spans[i].x] = spans[i].coverage; -+ } else { -+ memset (row + spans[i].x, -+ spans[i].coverage, -+ spans[i+1].x - spans[i].x); - } -- -- prev_x = x; -- prev_alpha = spans[i].coverage; -- } -- -- if (prev_alpha != 0 && prev_x < xmax) { -- memset(row + prev_x, prev_alpha, xmax - prev_x); - } - } - - static cairo_status_t --_cairo_image_surface_span_renderer_render_row ( -+_cairo_image_surface_span_renderer_render_rows ( - void *abstract_renderer, - int y, -+ int height, - const cairo_half_open_span_t *spans, - unsigned num_spans) - { - cairo_image_surface_span_renderer_t *renderer = abstract_renderer; -- _cairo_image_surface_span_render_row (y, spans, num_spans, renderer->mask, &renderer->composite_rectangles); -+ while (height--) -+ _cairo_image_surface_span_render_row (y++, spans, num_spans, renderer->mask_data, renderer->mask_stride); - return CAIRO_STATUS_SUCCESS; - } - -@@ -1517,11 +1499,11 @@ _cairo_image_surface_span_renderer_finish (void *abstract_renderer) - &dst->base, - src_attributes, - src->width, src->height, -- rects->width, rects->height, -+ width, height, - rects->src.x, rects->src.y, - 0, 0, /* mask.x, mask.y */ - rects->dst.x, rects->dst.y, -- rects->width, rects->height, -+ width, height, - dst->clip_region); - } - } -@@ -1567,7 +1549,7 @@ _cairo_image_surface_create_span_renderer (cairo_operator_t op, - - renderer->base.destroy = _cairo_image_surface_span_renderer_destroy; - renderer->base.finish = _cairo_image_surface_span_renderer_finish; -- renderer->base.render_row = _cairo_image_surface_span_renderer_render_row; -+ renderer->base.render_rows = _cairo_image_surface_span_renderer_render_rows; - renderer->op = op; - renderer->pattern = pattern; - renderer->antialias = antialias; -@@ -1604,6 +1586,9 @@ _cairo_image_surface_create_span_renderer (cairo_operator_t op, - _cairo_image_surface_span_renderer_destroy (renderer); - return _cairo_span_renderer_create_in_error (status); - } -+ -+ renderer->mask_data = renderer->mask->data - rects->mask.x - rects->mask.y * renderer->mask->stride; -+ renderer->mask_stride = renderer->mask->stride; - return &renderer->base; - } - -diff --git a/src/cairo-spans-private.h b/src/cairo-spans-private.h -index e29a567..af3b38c 100644 ---- a/src/cairo-spans-private.h -+++ b/src/cairo-spans-private.h -@@ -47,26 +47,24 @@ typedef struct _cairo_half_open_span { - * surfaces if they want to composite spans instead of trapezoids. */ - typedef struct _cairo_span_renderer cairo_span_renderer_t; - struct _cairo_span_renderer { -+ /* Private status variable. */ -+ cairo_status_t status; -+ - /* Called to destroy the renderer. */ - cairo_destroy_func_t destroy; - -- /* Render the spans on row y of the source by whatever compositing -- * method is required. The function should ignore spans outside -- * the bounding box set by the init() function. */ -- cairo_status_t (*render_row)( -- void *abstract_renderer, -- int y, -- const cairo_half_open_span_t *coverages, -- unsigned num_coverages); -+ /* Render the spans on row y of the destination by whatever compositing -+ * method is required. */ -+ cairo_warn cairo_status_t -+ (*render_rows) (void *abstract_renderer, -+ int y, int height, -+ const cairo_half_open_span_t *coverages, -+ unsigned num_coverages); - - /* Called after all rows have been rendered to perform whatever - * final rendering step is required. This function is called just - * once before the renderer is destroyed. */ -- cairo_status_t (*finish)( -- void *abstract_renderer); -- -- /* Private status variable. */ -- cairo_status_t status; -+ cairo_status_t (*finish) (void *abstract_renderer); - }; - - /* Scan converter interface. */ -diff --git a/src/cairo-spans.c b/src/cairo-spans.c -index af3b85f..69894c1 100644 ---- a/src/cairo-spans.c -+++ b/src/cairo-spans.c -@@ -275,13 +275,15 @@ _cairo_scan_converter_create_in_error (cairo_status_t status) - } - - static cairo_status_t --_cairo_nil_span_renderer_render_row ( -+_cairo_nil_span_renderer_render_rows ( - void *abstract_renderer, - int y, -+ int height, - const cairo_half_open_span_t *coverages, - unsigned num_coverages) - { - (void) y; -+ (void) height; - (void) coverages; - (void) num_coverages; - return _cairo_span_renderer_status (abstract_renderer); -@@ -310,7 +312,7 @@ _cairo_span_renderer_set_error ( - ASSERT_NOT_REACHED; - } - if (renderer->status == CAIRO_STATUS_SUCCESS) { -- renderer->render_row = _cairo_nil_span_renderer_render_row; -+ renderer->render_rows = _cairo_nil_span_renderer_render_rows; - renderer->finish = _cairo_nil_span_renderer_finish; - renderer->status = error; - } -diff --git a/src/cairo-tor-scan-converter.c b/src/cairo-tor-scan-converter.c -index 29262c2..2b9fb1b 100644 ---- a/src/cairo-tor-scan-converter.c -+++ b/src/cairo-tor-scan-converter.c -@@ -128,27 +128,29 @@ blit_with_span_renderer( - cairo_span_renderer_t *span_renderer, - struct pool *span_pool, - int y, -+ int height, - int xmin, - int xmax); - - static glitter_status_t --blit_empty_with_span_renderer (cairo_span_renderer_t *renderer, int y); -+blit_empty_with_span_renderer (cairo_span_renderer_t *renderer, int y, int height); - - #define GLITTER_BLIT_COVERAGES_ARGS \ - cairo_span_renderer_t *span_renderer, \ - struct pool *span_pool - --#define GLITTER_BLIT_COVERAGES(cells, y, xmin, xmax) do { \ -+#define GLITTER_BLIT_COVERAGES(cells, y, height,xmin, xmax) do { \ - cairo_status_t status = blit_with_span_renderer (cells, \ - span_renderer, \ - span_pool, \ -- y, xmin, xmax); \ -+ y, height, \ -+ xmin, xmax); \ - if (unlikely (status)) \ - return status; \ - } while (0) - --#define GLITTER_BLIT_COVERAGES_EMPTY(y, xmin, xmax) do { \ -- cairo_status_t status = blit_empty_with_span_renderer (span_renderer, y); \ -+#define GLITTER_BLIT_COVERAGES_EMPTY(y, height, xmin, xmax) do { \ -+ cairo_status_t status = blit_empty_with_span_renderer (span_renderer, y, height); \ - if (unlikely (status)) \ - return status; \ - } while (0) -@@ -309,8 +311,8 @@ typedef int grid_area_t; - #define UNROLL3(x) x x x - - struct quorem { -- int quo; -- int rem; -+ int32_t quo; -+ int32_t rem; - }; - - /* Header for a chunk of memory in a memory pool. */ -@@ -382,6 +384,7 @@ struct edge { - /* Original sign of the edge: +1 for downwards, -1 for upwards - * edges. */ - int dir; -+ int vertical; - }; - - /* Number of subsample rows per y-bucket. Must be GRID_Y. */ -@@ -389,18 +392,28 @@ struct edge { - - #define EDGE_Y_BUCKET_INDEX(y, ymin) (((y) - (ymin))/EDGE_Y_BUCKET_HEIGHT) - -+struct bucket { -+ /* Unsorted list of edges starting within this bucket. */ -+ struct edge *edges; -+ -+ /* Set to non-zero if there are edges starting strictly within the -+ * bucket. */ -+ unsigned have_inside_edges; -+}; -+ - /* A collection of sorted and vertically clipped edges of the polygon. - * Edges are moved from the polygon to an active list while scan - * converting. */ - struct polygon { -- /* The vertical clip extents. */ -+ /* The clip extents. */ -+ grid_scaled_x_t xmin, xmax; - grid_scaled_y_t ymin, ymax; - - /* Array of edges all starting in the same bucket. An edge is put - * into bucket EDGE_BUCKET_INDEX(edge->ytop, polygon->ymin) when - * it is added to the polygon. */ -- struct edge **y_buckets; -- struct edge *y_buckets_embedded[64]; -+ struct bucket *y_buckets; -+ struct bucket y_buckets_embedded[64]; - - struct { - struct pool base[1]; -@@ -702,7 +715,6 @@ static void - cell_list_fini(struct cell_list *cells) - { - pool_fini (cells->cell_pool.base); -- cell_list_init (cells); - } - - /* Empty the cell list. This is called at the start of every pixel -@@ -715,6 +727,26 @@ cell_list_reset (struct cell_list *cells) - pool_reset (cells->cell_pool.base); - } - -+static struct cell * -+cell_list_alloc (struct cell_list *cells, -+ struct cell **cursor, -+ struct cell *tail, -+ int x) -+{ -+ struct cell *cell; -+ -+ cell = pool_alloc (cells->cell_pool.base, sizeof (struct cell)); -+ if (unlikely (NULL == cell)) -+ return NULL; -+ -+ *cursor = cell; -+ cell->next = tail; -+ cell->x = x; -+ cell->uncovered_area = 0; -+ cell->covered_height = 0; -+ return cell; -+} -+ - /* Find a cell at the given x-coordinate. Returns %NULL if a new cell - * needed to be allocated but couldn't be. Cells must be found with - * non-decreasing x-coordinate until the cell list is rewound using -@@ -737,22 +769,10 @@ cell_list_find (struct cell_list *cells, int x) - } - cells->cursor = cursor; - -- if (tail->x == x) { -+ if (tail->x == x) - return tail; -- } else { -- struct cell *cell; -- -- cell = pool_alloc (cells->cell_pool.base, sizeof (struct cell)); -- if (unlikely (NULL == cell)) -- return NULL; - -- *cursor = cell; -- cell->next = tail; -- cell->x = x; -- cell->uncovered_area = 0; -- cell->covered_height = 0; -- return cell; -- } -+ return cell_list_alloc (cells, cursor, tail, x); - } - - /* Find two cells at x1 and x2. This is exactly equivalent -@@ -832,9 +852,8 @@ cell_list_find_pair(struct cell_list *cells, int x1, int x2) - /* Add an unbounded subpixel span covering subpixels >= x to the - * coverage cells. */ - static glitter_status_t --cell_list_add_unbounded_subspan( -- struct cell_list *cells, -- grid_scaled_x_t x) -+cell_list_add_unbounded_subspan (struct cell_list *cells, -+ grid_scaled_x_t x) - { - struct cell *cell; - int ix, fx; -@@ -907,20 +926,24 @@ cell_list_render_edge( - struct edge *edge, - int sign) - { -- struct quorem x1 = edge->x; -- struct quorem x2 = x1; - grid_scaled_y_t y1, y2, dy; - grid_scaled_x_t dx; - int ix1, ix2; - grid_scaled_x_t fx1, fx2; - -- x2.quo += edge->dxdy_full.quo; -- x2.rem += edge->dxdy_full.rem; -- if (x2.rem >= 0) { -- ++x2.quo; -- x2.rem -= edge->dy; -+ struct quorem x1 = edge->x; -+ struct quorem x2 = x1; -+ -+ if (! edge->vertical) { -+ x2.quo += edge->dxdy_full.quo; -+ x2.rem += edge->dxdy_full.rem; -+ if (x2.rem >= 0) { -+ ++x2.quo; -+ x2.rem -= edge->dy; -+ } -+ -+ edge->x = x2; - } -- edge->x = x2; - - GRID_X_TO_INT_FRAC(x1.quo, ix1, fx1); - GRID_X_TO_INT_FRAC(x2.quo, ix2, fx2); -@@ -1026,6 +1049,7 @@ static void - polygon_init (struct polygon *polygon) - { - polygon->ymin = polygon->ymax = 0; -+ polygon->xmin = polygon->xmax = 0; - polygon->y_buckets = polygon->y_buckets_embedded; - pool_init (polygon->edge_pool.base, - 8192 - sizeof (struct _pool_chunk), -@@ -1045,10 +1069,11 @@ polygon_fini (struct polygon *polygon) - * receive new edges and clip them to the vertical range - * [ymin,ymax). */ - static glitter_status_t --polygon_reset( -- struct polygon *polygon, -- grid_scaled_y_t ymin, -- grid_scaled_y_t ymax) -+polygon_reset (struct polygon *polygon, -+ grid_scaled_x_t xmin, -+ grid_scaled_x_t xmax, -+ grid_scaled_y_t ymin, -+ grid_scaled_y_t ymax) - { - unsigned h = ymax - ymin; - unsigned num_buckets = EDGE_Y_BUCKET_INDEX(ymax + EDGE_Y_BUCKET_HEIGHT-1, -@@ -1065,14 +1090,16 @@ polygon_reset( - polygon->y_buckets = polygon->y_buckets_embedded; - if (num_buckets > ARRAY_LENGTH (polygon->y_buckets_embedded)) { - polygon->y_buckets = _cairo_malloc_ab (num_buckets, -- sizeof (struct edge *)); -+ sizeof (struct bucket)); - if (unlikely (NULL == polygon->y_buckets)) - goto bail_no_mem; - } -- memset (polygon->y_buckets, 0, num_buckets * sizeof (struct edge *)); -+ memset (polygon->y_buckets, 0, num_buckets * sizeof (struct bucket)); - - polygon->ymin = ymin; - polygon->ymax = ymax; -+ polygon->xmin = xmin; -+ polygon->xmax = xmax; - return GLITTER_STATUS_SUCCESS; - - bail_no_mem: -@@ -1086,10 +1113,13 @@ _polygon_insert_edge_into_its_y_bucket( - struct polygon *polygon, - struct edge *e) - { -- unsigned ix = EDGE_Y_BUCKET_INDEX(e->ytop, polygon->ymin); -- struct edge **ptail = &polygon->y_buckets[ix]; -+ unsigned j = e->ytop - polygon->ymin; -+ unsigned ix = j / EDGE_Y_BUCKET_HEIGHT; -+ unsigned offset = j % EDGE_Y_BUCKET_HEIGHT; -+ struct edge **ptail = &polygon->y_buckets[ix].edges; - e->next = *ptail; - *ptail = e; -+ polygon->y_buckets[ix].have_inside_edges |= offset; - } - - inline static glitter_status_t -@@ -1115,30 +1145,53 @@ polygon_add_edge (struct polygon *polygon, - dx = edge->line.p2.x - edge->line.p1.x; - dy = edge->line.p2.y - edge->line.p1.y; - e->dy = dy; -- e->dxdy = floored_divrem (dx, dy); -- -- if (ymin <= edge->top) -- ytop = edge->top; -- else -- ytop = ymin; -- if (ytop == edge->line.p1.y) { -- e->x.quo = edge->line.p1.x; -- e->x.rem = 0; -- } else { -- e->x = floored_muldivrem (ytop - edge->line.p1.y, dx, dy); -- e->x.quo += edge->line.p1.x; -- } -- - e->dir = edge->dir; -+ -+ ytop = edge->top >= ymin ? edge->top : ymin; -+ ybot = edge->bottom <= ymax ? edge->bottom : ymax; - e->ytop = ytop; -- ybot = edge->bottom < ymax ? edge->bottom : ymax; - e->height_left = ybot - ytop; - -- if (e->height_left >= GRID_Y) { -- e->dxdy_full = floored_muldivrem (GRID_Y, dx, dy); -- } else { -+ if (dx == 0) { -+ e->vertical = TRUE; -+ e->x.quo = edge->line.p1.x; -+ e->x.rem = 0; -+ e->dxdy.quo = 0; -+ e->dxdy.rem = 0; - e->dxdy_full.quo = 0; - e->dxdy_full.rem = 0; -+ -+ /* Drop edges to the right of the clip extents. */ -+ if (e->x.quo >= polygon->xmax) -+ return GLITTER_STATUS_SUCCESS; -+ -+ /* Offset vertical edges at the left side of the clip extents -+ * to just shy of the left side. We depend on this when -+ * checking for possible intersections within the clip -+ * rectangle. */ -+ if (e->x.quo <= polygon->xmin) { -+ e->x.quo = polygon->xmin - 1; -+ } -+ } else { -+ e->vertical = FALSE; -+ e->dxdy = floored_divrem (dx, dy); -+ if (ytop == edge->line.p1.y) { -+ e->x.quo = edge->line.p1.x; -+ e->x.rem = 0; -+ } else { -+ e->x = floored_muldivrem (ytop - edge->line.p1.y, dx, dy); -+ e->x.quo += edge->line.p1.x; -+ } -+ -+ if (e->x.quo >= polygon->xmax && e->dxdy.quo >= 0) -+ return GLITTER_STATUS_SUCCESS; -+ -+ if (e->height_left >= GRID_Y) { -+ e->dxdy_full = floored_muldivrem (GRID_Y, dx, dy); -+ } else { -+ e->dxdy_full.quo = 0; -+ e->dxdy_full.rem = 0; -+ } - } - - _polygon_insert_edge_into_its_y_bucket (polygon, e); -@@ -1161,31 +1214,30 @@ active_list_init(struct active_list *active) - active_list_reset(active); - } - --static void --active_list_fini( -- struct active_list *active) --{ -- active_list_reset(active); --} -- - /* Merge the edges in an unsorted list of edges into a sorted - * list. The sort order is edges ascending by edge->x.quo. Returns - * the new head of the sorted list. */ - static struct edge * - merge_unsorted_edges(struct edge *sorted_head, struct edge *unsorted_head) - { -- struct edge *head = unsorted_head; - struct edge **cursor = &sorted_head; - int x; - -- while (NULL != head) { -+ if (sorted_head == NULL) { -+ sorted_head = unsorted_head; -+ unsorted_head = unsorted_head->next; -+ sorted_head->next = NULL; -+ if (unsorted_head == NULL) -+ return sorted_head; -+ } -+ -+ do { -+ struct edge *next = unsorted_head->next; - struct edge *prev = *cursor; -- struct edge *next = head->next; -- x = head->x.quo; - -- if (NULL == prev || x < prev->x.quo) { -+ x = unsorted_head->x.quo; -+ if (x < prev->x.quo) - cursor = &sorted_head; -- } - - while (1) { - UNROLL3({ -@@ -1196,26 +1248,29 @@ merge_unsorted_edges(struct edge *sorted_head, struct edge *unsorted_head) - }); - } - -- head->next = *cursor; -- *cursor = head; -+ unsorted_head->next = *cursor; -+ *cursor = unsorted_head; -+ unsorted_head = next; -+ } while (unsorted_head != NULL); - -- head = next; -- } - return sorted_head; - } - - /* Test if the edges on the active list can be safely advanced by a - * full row without intersections or any edges ending. */ - inline static int --active_list_can_step_full_row( -- struct active_list *active) -+active_list_can_step_full_row (struct active_list *active, -+ grid_scaled_x_t xmin) - { -+ const struct edge *e; -+ grid_scaled_x_t prev_x = INT_MIN; -+ - /* Recomputes the minimum height of all edges on the active - * list if we have been dropping edges. */ - if (active->min_height <= 0) { -- struct edge *e = active->head; - int min_height = INT_MAX; - -+ e = active->head; - while (NULL != e) { - if (e->height_left < min_height) - min_height = e->height_left; -@@ -1225,27 +1280,38 @@ active_list_can_step_full_row( - active->min_height = min_height; - } - -- /* Check for intersections only if no edges end during the next -- * row. */ -- if (active->min_height >= GRID_Y) { -- grid_scaled_x_t prev_x = INT_MIN; -- struct edge *e = active->head; -- while (NULL != e) { -- struct quorem x = e->x; -+ if (active->min_height < GRID_Y) -+ return 0; - -+ /* Check for intersections as no edges end during the next row. */ -+ e = active->head; -+ while (NULL != e) { -+ struct quorem x = e->x; -+ -+ if (! e->vertical) { - x.quo += e->dxdy_full.quo; - x.rem += e->dxdy_full.rem; - if (x.rem >= 0) - ++x.quo; -+ } - -- if (x.quo <= prev_x) -+ /* There's may be an intersection if the edge sort order might -+ * change. */ -+ if (x.quo <= prev_x) { -+ /* Ignore intersections to the left of the clip extents. -+ * This assumes that all vertical edges on or at the left -+ * side of the clip rectangle have been shifted slightly -+ * to the left in polygon_add_edge(). */ -+ if (prev_x >= xmin || x.quo >= xmin || e->x.quo >= xmin) - return 0; -+ } -+ else { - prev_x = x.quo; -- e = e->next; - } -- return 1; -+ e = e->next; - } -- return 0; -+ -+ return 1; - } - - /* Merges edges on the given subpixel row from the polygon to the -@@ -1261,7 +1327,7 @@ active_list_merge_edges_from_polygon( - unsigned ix = EDGE_Y_BUCKET_INDEX(y, polygon->ymin); - int min_height = active->min_height; - struct edge *subrow_edges = NULL; -- struct edge **ptail = &polygon->y_buckets[ix]; -+ struct edge **ptail = &polygon->y_buckets[ix].edges; - - while (1) { - struct edge *tail = *ptail; -@@ -1277,8 +1343,10 @@ active_list_merge_edges_from_polygon( - ptail = &tail->next; - } - } -- active->head = merge_unsorted_edges(active->head, subrow_edges); -- active->min_height = min_height; -+ if (subrow_edges) { -+ active->head = merge_unsorted_edges(active->head, subrow_edges); -+ active->min_height = min_height; -+ } - } - - /* Advance the edges on the active list by one subsample row by -@@ -1439,11 +1507,13 @@ apply_nonzero_fill_rule_and_step_edges (struct active_list *active, - } - } - -- right_edge->x.quo += right_edge->dxdy_full.quo; -- right_edge->x.rem += right_edge->dxdy_full.rem; -- if (right_edge->x.rem >= 0) { -- ++right_edge->x.quo; -- right_edge->x.rem -= right_edge->dy; -+ if (! right_edge->vertical) { -+ right_edge->x.quo += right_edge->dxdy_full.quo; -+ right_edge->x.rem += right_edge->dxdy_full.rem; -+ if (right_edge->x.rem >= 0) { -+ ++right_edge->x.quo; -+ right_edge->x.rem -= right_edge->dy; -+ } - } - } - -@@ -1472,6 +1542,7 @@ apply_evenodd_fill_rule_and_step_edges (struct active_list *active, - left_edge = *cursor; - while (NULL != left_edge) { - struct edge *right_edge; -+ int winding = left_edge->dir; - - left_edge->height_left -= GRID_Y; - if (left_edge->height_left) -@@ -1490,17 +1561,22 @@ apply_evenodd_fill_rule_and_step_edges (struct active_list *active, - else - *cursor = right_edge->next; - -+ winding += right_edge->dir; -+ if ((winding & 1) == 0) { - if (right_edge->next == NULL || - right_edge->next->x.quo != right_edge->x.quo) - { - break; - } -+ } - -- right_edge->x.quo += right_edge->dxdy_full.quo; -- right_edge->x.rem += right_edge->dxdy_full.rem; -- if (right_edge->x.rem >= 0) { -- ++right_edge->x.quo; -- right_edge->x.rem -= right_edge->dy; -+ if (! right_edge->vertical) { -+ right_edge->x.quo += right_edge->dxdy_full.quo; -+ right_edge->x.rem += right_edge->dxdy_full.rem; -+ if (right_edge->x.rem >= 0) { -+ ++right_edge->x.quo; -+ right_edge->x.rem -= right_edge->dy; -+ } - } - } - -@@ -1537,8 +1613,14 @@ blit_span( - } - } - --#define GLITTER_BLIT_COVERAGES(coverages, y, xmin, xmax) \ -- blit_cells(coverages, raster_pixels + (y)*raster_stride, xmin, xmax) -+#define GLITTER_BLIT_COVERAGES(coverages, y, height, xmin, xmax) \ -+ do { \ -+ int __y = y; \ -+ int __h = height; \ -+ do { \ -+ blit_cells(coverages, raster_pixels + (__y)*raster_stride, xmin, xmax); \ -+ } while (--__h); \ -+ } while (0) - - static void - blit_cells( -@@ -1597,7 +1679,6 @@ static void - _glitter_scan_converter_fini(glitter_scan_converter_t *converter) - { - polygon_fini(converter->polygon); -- active_list_fini(converter->active); - cell_list_fini(converter->coverages); - converter->xmin=0; - converter->ymin=0; -@@ -1641,7 +1722,7 @@ glitter_scan_converter_reset( - - active_list_reset(converter->active); - cell_list_reset(converter->coverages); -- status = polygon_reset(converter->polygon, ymin, ymax); -+ status = polygon_reset(converter->polygon, xmin, xmax, ymin, ymax); - if (status) - return status; - -@@ -1711,19 +1792,48 @@ glitter_scan_converter_add_edge (glitter_scan_converter_t *converter, - #endif - - #ifndef GLITTER_BLIT_COVERAGES_EMPTY --# define GLITTER_BLIT_COVERAGES_EMPTY(y, xmin, xmax) -+# define GLITTER_BLIT_COVERAGES_EMPTY(y0, y1, xmin, xmax) - #endif - -+static cairo_bool_t -+active_list_is_vertical (struct active_list *active) -+{ -+ struct edge *e; -+ -+ for (e = active->head; e != NULL; e = e->next) { -+ if (! e->vertical) -+ return FALSE; -+ } -+ -+ return TRUE; -+} -+ -+static void -+step_edges (struct active_list *active, int count) -+{ -+ struct edge **cursor = &active->head; -+ struct edge *edge; -+ -+ for (edge = *cursor; edge != NULL; edge = *cursor) { -+ edge->height_left -= GRID_Y * count; -+ if (edge->height_left) -+ cursor = &edge->next; -+ else -+ *cursor = edge->next; -+ } -+} -+ - I glitter_status_t - glitter_scan_converter_render( - glitter_scan_converter_t *converter, - int nonzero_fill, - GLITTER_BLIT_COVERAGES_ARGS) - { -- int i; -+ int i, j; - int ymax_i = converter->ymax / GRID_Y; - int ymin_i = converter->ymin / GRID_Y; - int xmin_i, xmax_i; -+ grid_scaled_x_t xmin = converter->xmin; - int h = ymax_i - ymin_i; - struct polygon *polygon = converter->polygon; - struct cell_list *coverages = converter->coverages; -@@ -1738,22 +1848,28 @@ glitter_scan_converter_render( - GLITTER_BLIT_COVERAGES_BEGIN; - - /* Render each pixel row. */ -- for (i=0; i<h; i++) { -+ for (i = 0; i < h; i = j) { - int do_full_step = 0; - glitter_status_t status = 0; - -+ j = i + 1; -+ - /* Determine if we can ignore this row or use the full pixel - * stepper. */ -- if (GRID_Y == EDGE_Y_BUCKET_HEIGHT && ! polygon->y_buckets[i]) { -+ if (polygon->y_buckets[i].edges == NULL) { - if (! active->head) { -- GLITTER_BLIT_COVERAGES_EMPTY (i+ymin_i, xmin_i, xmax_i); -+ for (; j < h && ! polygon->y_buckets[j].edges; j++) -+ ; -+ GLITTER_BLIT_COVERAGES_EMPTY (i+ymin_i, j-i, xmin_i, xmax_i); - continue; - } -- -- do_full_step = active_list_can_step_full_row (active); -+ do_full_step = active_list_can_step_full_row (active, xmin); -+ } -+ else if (! polygon->y_buckets[i].have_inside_edges) { -+ grid_scaled_y_t y = (i+ymin_i)*GRID_Y; -+ active_list_merge_edges_from_polygon (active, y, polygon); -+ do_full_step = active_list_can_step_full_row (active, xmin); - } -- -- cell_list_reset (coverages); - - if (do_full_step) { - /* Step by a full pixel row's worth. */ -@@ -1764,8 +1880,20 @@ glitter_scan_converter_render( - status = apply_evenodd_fill_rule_and_step_edges (active, - coverages); - } -+ -+ if (active_list_is_vertical (active)) { -+ while (j < h && -+ polygon->y_buckets[j].edges == NULL && -+ active->min_height >= 2*GRID_Y) -+ { -+ active->min_height -= GRID_Y; -+ j++; -+ } -+ if (j != i + 1) -+ step_edges (active, j - (i + 1)); -+ } - } else { -- /* Subsample this row. */ -+ /* Supersample this row. */ - grid_scaled_y_t suby; - for (suby = 0; suby < GRID_Y; suby++) { - grid_scaled_y_t y = (i+ymin_i)*GRID_Y + suby; -@@ -1787,13 +1915,13 @@ glitter_scan_converter_render( - if (unlikely (status)) - return status; - -- GLITTER_BLIT_COVERAGES(coverages, i+ymin_i, xmin_i, xmax_i); -+ GLITTER_BLIT_COVERAGES(coverages, i+ymin_i, j-i, xmin_i, xmax_i); -+ cell_list_reset (coverages); - -- if (! active->head) { -+ if (! active->head) - active->min_height = INT_MAX; -- } else { -+ else - active->min_height -= GRID_Y; -- } - } - - /* Clean up the coverage blitter. */ -@@ -1807,21 +1935,20 @@ glitter_scan_converter_render( - * scan converter subclass. */ - - static glitter_status_t --blit_with_span_renderer( -- struct cell_list *cells, -- cairo_span_renderer_t *renderer, -- struct pool *span_pool, -- int y, -- int xmin, -- int xmax) -+blit_with_span_renderer (struct cell_list *cells, -+ cairo_span_renderer_t *renderer, -+ struct pool *span_pool, -+ int y, int height, -+ int xmin, int xmax) - { - struct cell *cell = cells->head; - int prev_x = xmin; - int cover = 0; - cairo_half_open_span_t *spans; - unsigned num_spans; -+ - if (cell == NULL) -- return CAIRO_STATUS_SUCCESS; -+ return blit_empty_with_span_renderer (renderer, y, height); - - /* Skip cells to the left of the clip region. */ - while (cell != NULL && cell->x < xmin) { -@@ -1833,12 +1960,12 @@ blit_with_span_renderer( - /* Count number of cells remaining. */ - { - struct cell *next = cell; -- num_spans = 0; -- while (next) { -+ num_spans = 1; -+ while (next != NULL) { - next = next->next; - ++num_spans; - } -- num_spans = 2*num_spans + 1; -+ num_spans = 2*num_spans; - } - - /* Allocate enough spans for the row. */ -@@ -1853,6 +1980,7 @@ blit_with_span_renderer( - for (; cell != NULL; cell = cell->next) { - int x = cell->x; - int area; -+ - if (x >= xmax) - break; - -@@ -1872,20 +2000,26 @@ blit_with_span_renderer( - prev_x = x+1; - } - -- if (prev_x < xmax) { -+ if (prev_x <= xmax) { - spans[num_spans].x = prev_x; - spans[num_spans].coverage = GRID_AREA_TO_ALPHA (cover); - ++num_spans; - } - -+ if (prev_x < xmax && cover) { -+ spans[num_spans].x = xmax; -+ spans[num_spans].coverage = 0; -+ ++num_spans; -+ } -+ - /* Dump them into the renderer. */ -- return renderer->render_row (renderer, y, spans, num_spans); -+ return renderer->render_rows (renderer, y, height, spans, num_spans); - } - - static glitter_status_t --blit_empty_with_span_renderer (cairo_span_renderer_t *renderer, int y) -+blit_empty_with_span_renderer (cairo_span_renderer_t *renderer, int y, int height) - { -- return renderer->render_row (renderer, y, NULL, 0); -+ return renderer->render_rows (renderer, y, height, NULL, 0); - } - - struct _cairo_tor_scan_converter { -diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c -index 82d1cf5..d4575a3 100644 ---- a/src/cairo-win32-surface.c -+++ b/src/cairo-win32-surface.c -@@ -1954,6 +1954,9 @@ typedef struct _cairo_win32_surface_span_renderer { - const cairo_pattern_t *pattern; - cairo_antialias_t antialias; - -+ uint8_t *mask_data; -+ uint32_t mask_stride; -+ - cairo_image_surface_t *mask; - cairo_win32_surface_t *dst; - cairo_region_t *clip_region; -@@ -1962,14 +1965,16 @@ typedef struct _cairo_win32_surface_span_renderer { - } cairo_win32_surface_span_renderer_t; - - static cairo_status_t --_cairo_win32_surface_span_renderer_render_row ( -+_cairo_win32_surface_span_renderer_render_rows ( - void *abstract_renderer, - int y, -+ int height, - const cairo_half_open_span_t *spans, - unsigned num_spans) - { - cairo_win32_surface_span_renderer_t *renderer = abstract_renderer; -- _cairo_image_surface_span_render_row (y, spans, num_spans, renderer->mask, &renderer->composite_rectangles); -+ while (height--) -+ _cairo_image_surface_span_render_row (y++, spans, num_spans, renderer->mask_data, renderer->mask_stride); - return CAIRO_STATUS_SUCCESS; - } - -@@ -2066,8 +2071,7 @@ _cairo_win32_surface_create_span_renderer (cairo_operator_t op, - - renderer->base.destroy = _cairo_win32_surface_span_renderer_destroy; - renderer->base.finish = _cairo_win32_surface_span_renderer_finish; -- renderer->base.render_row = -- _cairo_win32_surface_span_renderer_render_row; -+ renderer->base.render_rows = _cairo_win32_surface_span_renderer_render_rows; - renderer->op = op; - renderer->pattern = pattern; - renderer->antialias = antialias; -@@ -2088,6 +2092,9 @@ _cairo_win32_surface_create_span_renderer (cairo_operator_t op, - _cairo_win32_surface_span_renderer_destroy (renderer); - return _cairo_span_renderer_create_in_error (status); - } -+ -+ renderer->mask_data = renderer->mask->data - rects->mask.x - rects->mask.y * renderer->mask->stride; -+ renderer->mask_stride = renderer->mask->stride; - return &renderer->base; - } - -diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c -index a7a40b8..566d9fb 100644 ---- a/src/cairo-xlib-display.c -+++ b/src/cairo-xlib-display.c -@@ -407,6 +407,10 @@ _cairo_xlib_display_get (Display *dpy, - display->buggy_pad_reflect = TRUE; - } - -+ /* gradients don't seem to work */ -+ display->buggy_gradients = TRUE; -+ -+ - /* XXX workaround; see https://bugzilla.mozilla.org/show_bug.cgi?id=413583 */ - /* If buggy_repeat_force == -1, then initialize. - * - set to -2, meaning "nothing was specified", and we trust the above detection. -diff --git a/src/cairoint.h b/src/cairoint.h -index 58850ab..1cdf6ff 100644 ---- a/src/cairoint.h -+++ b/src/cairoint.h -@@ -2257,8 +2257,8 @@ cairo_private void - _cairo_image_surface_span_render_row (int y, - const cairo_half_open_span_t *spans, - unsigned num_spans, -- cairo_image_surface_t *mask, -- const cairo_composite_rectangles_t *rects); -+ uint8_t *data, -+ uint32_t stride); - - cairo_private cairo_image_transparency_t - _cairo_image_analyze_transparency (cairo_image_surface_t *image); diff --git a/gfx/cairo/clip-rects-surface-extents.patch b/gfx/cairo/clip-rects-surface-extents.patch deleted file mode 100644 index 1a9972aa7..000000000 --- a/gfx/cairo/clip-rects-surface-extents.patch +++ /dev/null @@ -1,163 +0,0 @@ -From 108b1c7825116ed3f93aa57384bbd3290cdc9181 Mon Sep 17 00:00:00 2001 -From: Karl Tomlinson <karlt+@karlt.net> -Date: Sat, 17 Jul 2010 01:08:53 +0000 -Subject: clip: consider gstate target extents in _cairo_gstate_copy_clip_rectangle_list - -Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29125 - -To be consistent with _cairo_gstate_clip_extents, the context's clip -should be intersected with the target surface extents (instead of only -using them when there is no clip). - -Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> ---- -diff --git a/src/cairo-clip.c b/src/cairo-clip.c -index 77d8214..d5a2fab 100644 ---- a/src/cairo-clip.c -+++ b/src/cairo-clip.c -@@ -1495,7 +1495,7 @@ _cairo_rectangle_list_create_in_error (cairo_status_t status) - cairo_rectangle_list_t * - _cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate) - { --#define ERROR_LIST(S) _cairo_rectangle_list_create_in_error (_cairo_error (S)); -+#define ERROR_LIST(S) _cairo_rectangle_list_create_in_error (_cairo_error (S)) - - cairo_rectangle_list_t *list; - cairo_rectangle_t *rectangles = NULL; -@@ -1507,57 +1507,37 @@ _cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate) - if (clip->all_clipped) - goto DONE; - -- if (clip->path != NULL) { -- status = _cairo_clip_get_region (clip, ®ion); -- if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { -- goto DONE; -- } else if (status == CAIRO_INT_STATUS_UNSUPPORTED) { -- return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE) -- } else if (unlikely (status)) { -- return ERROR_LIST (status); -- } -- } -- -- if (region != NULL) { -- n_rects = cairo_region_num_rectangles (region); -- if (n_rects) { -- rectangles = _cairo_malloc_ab (n_rects, sizeof (cairo_rectangle_t)); -- if (unlikely (rectangles == NULL)) { -- return ERROR_LIST (CAIRO_STATUS_NO_MEMORY); -- } -+ if (!clip->path) -+ return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); - -- for (i = 0; i < n_rects; ++i) { -- cairo_rectangle_int_t clip_rect; -- -- cairo_region_get_rectangle (region, i, &clip_rect); -+ status = _cairo_clip_get_region (clip, ®ion); -+ if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { -+ goto DONE; -+ } else if (status == CAIRO_INT_STATUS_UNSUPPORTED) { -+ return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); -+ } else if (unlikely (status)) { -+ return ERROR_LIST (status); -+ } - -- if (! _cairo_clip_int_rect_to_user (gstate, -- &clip_rect, -- &rectangles[i])) -- { -- free (rectangles); -- return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); -- } -- } -+ n_rects = cairo_region_num_rectangles (region); -+ if (n_rects) { -+ rectangles = _cairo_malloc_ab (n_rects, sizeof (cairo_rectangle_t)); -+ if (unlikely (rectangles == NULL)) { -+ return ERROR_LIST (CAIRO_STATUS_NO_MEMORY); - } -- } else { -- cairo_rectangle_int_t extents; - -- if (! _cairo_surface_get_extents (_cairo_gstate_get_target (gstate), -- &extents)) -- { -- /* unbounded surface -> unclipped */ -- goto DONE; -- } -+ for (i = 0; i < n_rects; ++i) { -+ cairo_rectangle_int_t clip_rect; - -- n_rects = 1; -- rectangles = malloc(sizeof (cairo_rectangle_t)); -- if (unlikely (rectangles == NULL)) -- return ERROR_LIST (CAIRO_STATUS_NO_MEMORY); -+ cairo_region_get_rectangle (region, i, &clip_rect); - -- if (! _cairo_clip_int_rect_to_user (gstate, &extents, rectangles)) { -- free (rectangles); -- return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); -+ if (! _cairo_clip_int_rect_to_user (gstate, -+ &clip_rect, -+ &rectangles[i])) -+ { -+ free (rectangles); -+ return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); -+ } - } - } - -diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c -index baf6145..7caf624 100644 ---- a/src/cairo-gstate.c -+++ b/src/cairo-gstate.c -@@ -1555,7 +1555,19 @@ _cairo_gstate_clip_extents (cairo_gstate_t *gstate, - cairo_rectangle_list_t* - _cairo_gstate_copy_clip_rectangle_list (cairo_gstate_t *gstate) - { -- return _cairo_clip_copy_rectangle_list (&gstate->clip, gstate); -+ cairo_clip_t clip; -+ cairo_rectangle_int_t extents; -+ cairo_rectangle_list_t *list; -+ -+ _cairo_clip_init_copy (&clip, &gstate->clip); -+ -+ if (_cairo_surface_get_extents (gstate->target, &extents)) -+ _cairo_clip_rectangle (&clip, &extents); -+ -+ list = _cairo_clip_copy_rectangle_list (&clip, gstate); -+ _cairo_clip_fini (&clip); -+ -+ return list; - } - - static void -diff --git a/test/get-clip.c b/test/get-clip.c -index f0477a1..f97db3f 100644 ---- a/test/get-clip.c -+++ b/test/get-clip.c -@@ -120,6 +120,22 @@ preamble (cairo_test_context_t *ctx) - } - cairo_rectangle_list_destroy (rectangle_list); - -+ /* We should get the same results after applying a clip that contains the -+ existing clip. */ -+ phase = "Clip beyond surface extents"; -+ cairo_save (cr); -+ cairo_rectangle (cr, -10, -10, SIZE + 20 , SIZE + 20); -+ cairo_clip (cr); -+ rectangle_list = cairo_copy_clip_rectangle_list (cr); -+ if (! check_count (ctx, phase, rectangle_list, 1) || -+ ! check_clip_extents (ctx, phase, cr, 0, 0, SIZE, SIZE) || -+ ! check_rectangles_contain (ctx, phase, rectangle_list, 0, 0, SIZE, SIZE)) -+ { -+ goto FAIL; -+ } -+ cairo_rectangle_list_destroy (rectangle_list); -+ cairo_restore (cr); -+ - /* Test simple clip rect. */ - phase = "Simple clip rect"; - cairo_save (cr); --- -cgit v0.8.3-6-g21f6 diff --git a/gfx/cairo/copyarea-with-alpha.patch b/gfx/cairo/copyarea-with-alpha.patch deleted file mode 100644 index c6765105e..000000000 --- a/gfx/cairo/copyarea-with-alpha.patch +++ /dev/null @@ -1,110 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface.c b/gfx/cairo/cairo/src/cairo-xlib-surface.c ---- a/gfx/cairo/cairo/src/cairo-xlib-surface.c -+++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c -@@ -1722,30 +1722,31 @@ _surface_has_alpha (cairo_xlib_surface_t - else - return FALSE; - } else { - /* In the no-render case, we never have alpha */ - return FALSE; - } - } - --/* Returns true if the given operator and source-alpha combination -- * requires alpha compositing to complete. -+/* Returns true if the given operator and alpha combination requires alpha -+ * compositing to complete on source and destination surfaces with the same -+ * format. i.e. if a simple bitwise copy is not appropriate. - */ - static cairo_bool_t - _operator_needs_alpha_composite (cairo_operator_t op, -- cairo_bool_t destination_has_alpha, -- cairo_bool_t source_has_alpha) -+ cairo_bool_t surfaces_have_alpha) - { -- if (op == CAIRO_OPERATOR_SOURCE || -- (! source_has_alpha && -- (op == CAIRO_OPERATOR_OVER || -- op == CAIRO_OPERATOR_ATOP || -- op == CAIRO_OPERATOR_IN))) -- return destination_has_alpha; -+ if (op == CAIRO_OPERATOR_SOURCE) -+ return FALSE; -+ -+ if (op == CAIRO_OPERATOR_OVER || -+ op == CAIRO_OPERATOR_IN || -+ op == CAIRO_OPERATOR_ATOP) -+ return surfaces_have_alpha; - - return TRUE; - } - - /* There is a bug in most older X servers with compositing using a - * untransformed repeating source pattern when the source is in off-screen - * video memory, and another with repeated transformed images using a - * general transform matrix. When these bugs could be triggered, we need a -@@ -1843,24 +1844,24 @@ _categorize_composite_operation (cairo_x - */ - static composite_operation_t - _recategorize_composite_operation (cairo_xlib_surface_t *dst, - cairo_operator_t op, - cairo_xlib_surface_t *src, - cairo_surface_attributes_t *src_attr, - cairo_bool_t have_mask) - { -- /* Can we use the core protocol? */ -+ /* Can we use the core protocol? (If _surfaces_compatible, then src and -+ * dst have the same format and _surface_has_alpha is the same for each.) -+ */ - if (! have_mask && - src->owns_pixmap && -- src->depth == dst->depth && -+ _surfaces_compatible (src, dst) && - _cairo_matrix_is_integer_translation (&src_attr->matrix, NULL, NULL) && -- ! _operator_needs_alpha_composite (op, -- _surface_has_alpha (dst), -- _surface_has_alpha (src))) -+ ! _operator_needs_alpha_composite (op, _surface_has_alpha (dst))) - { - if (src_attr->extend == CAIRO_EXTEND_NONE) - return DO_XCOPYAREA; - - if (dst->buggy_repeat && src_attr->extend == CAIRO_EXTEND_REPEAT) - return DO_XTILE; - } - -@@ -2211,34 +2212,28 @@ _cairo_xlib_surface_composite (cairo_ope - cairo_surface_attributes_t src_attr, mask_attr; - cairo_xlib_surface_t *dst = abstract_dst; - cairo_xlib_surface_t *src; - cairo_xlib_surface_t *mask; - cairo_int_status_t status; - composite_operation_t operation; - int itx, ity; - cairo_bool_t is_integer_translation; -- cairo_bool_t needs_alpha_composite; - GC gc; - - if (mask_pattern != NULL && ! CAIRO_SURFACE_RENDER_HAS_COMPOSITE (dst)) - return UNSUPPORTED ("no support for masks"); - - operation = _categorize_composite_operation (dst, op, src_pattern, - mask_pattern != NULL); - if (operation == DO_UNSUPPORTED) - return UNSUPPORTED ("unsupported operation"); - - X_DEBUG ((dst->dpy, "composite (dst=%x)", (unsigned int) dst->drawable)); - -- needs_alpha_composite = -- _operator_needs_alpha_composite (op, -- _surface_has_alpha (dst), -- ! _cairo_pattern_is_opaque (src_pattern)); -- - _cairo_xlib_display_notify (dst->display); - - status = - _cairo_xlib_surface_acquire_pattern_surfaces (dst, - src_pattern, mask_pattern, - src_x, src_y, - mask_x, mask_y, - width, height, diff --git a/gfx/cairo/d2d-gradient-ensure-stops.patch b/gfx/cairo/d2d-gradient-ensure-stops.patch deleted file mode 100644 index 2f7bb9334..000000000 --- a/gfx/cairo/d2d-gradient-ensure-stops.patch +++ /dev/null @@ -1,32 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1348618772 -43200 -# Node ID 55ccbc8d52e69b020f2ba493e92ad2e214388df0 -# Parent e0d69219dd2b3b2826d186dc99c673b879409ea6 -Bug 792903. Prevent num_stops from being set to zero. r=bas - -diff --git a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp ---- a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp -+++ b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp -@@ -1641,17 +1641,20 @@ static RefPtr<ID2D1Brush> - min_dist = MIN(_cairo_d2d_dot_product(u, _cairo_d2d_subtract_point(top_left, p1)), - _cairo_d2d_dot_product(u, _cairo_d2d_subtract_point(top_right, p1))); - min_dist = MIN(min_dist, _cairo_d2d_dot_product(u, _cairo_d2d_subtract_point(bottom_left, p1))); - min_dist = MIN(min_dist, _cairo_d2d_dot_product(u, _cairo_d2d_subtract_point(bottom_right, p1))); - - min_dist = MAX(-min_dist, 0); - - // Repeats after gradient start. -- int after_repeat = (int)ceil(max_dist / gradient_length); -+ // It's possible for max_dist and min_dist to both be zero, in which case -+ // we'll set num_stops to 0 and crash D2D. Let's just ensure after_repeat -+ // is at least 1. -+ int after_repeat = MAX((int)ceil(max_dist / gradient_length), 1); - int before_repeat = (int)ceil(min_dist / gradient_length); - num_stops *= (after_repeat + before_repeat); - - p2.x = p1.x + u.x * after_repeat * gradient_length; - p2.y = p1.y + u.y * after_repeat * gradient_length; - p1.x = p1.x - u.x * before_repeat * gradient_length; - p1.y = p1.y - u.y * before_repeat * gradient_length; - diff --git a/gfx/cairo/d2d-repeating-gradients.patch b/gfx/cairo/d2d-repeating-gradients.patch deleted file mode 100644 index 993695bf0..000000000 --- a/gfx/cairo/d2d-repeating-gradients.patch +++ /dev/null @@ -1,271 +0,0 @@ -From: Robert O'Callahan <robert@ocallahan.org> -Bug 768775. Improve the precision of the calculation of the number of stops that need to be added to handle 'repeat' and 'reflect', when we're filling a path. r=bas - -diff --git a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp ---- a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp -+++ b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp -@@ -1411,17 +1411,17 @@ static RefPtr<ID2D1Brush> - - gradient_center.x = _cairo_fixed_to_float(source_pattern->c1.x); - gradient_center.y = _cairo_fixed_to_float(source_pattern->c1.y); - - // Transform surface corners into pattern coordinates. - cairo_matrix_transform_point(&source_pattern->base.base.matrix, &top_left.x, &top_left.y); - cairo_matrix_transform_point(&source_pattern->base.base.matrix, &top_right.x, &top_right.y); - cairo_matrix_transform_point(&source_pattern->base.base.matrix, &bottom_left.x, &bottom_left.y); -- cairo_matrix_transform_point(&source_pattern->base.base.matrix, &bottom_right.x, &top_left.y); -+ cairo_matrix_transform_point(&source_pattern->base.base.matrix, &bottom_right.x, &bottom_right.y); - - // Find the corner furthest away from the gradient center in pattern space. - double largest = MAX(_cairo_d2d_point_dist(top_left, gradient_center), _cairo_d2d_point_dist(top_right, gradient_center)); - largest = MAX(largest, _cairo_d2d_point_dist(bottom_left, gradient_center)); - largest = MAX(largest, _cairo_d2d_point_dist(bottom_right, gradient_center)); - - unsigned int minSize = (unsigned int)ceil(largest); - -@@ -1531,16 +1531,17 @@ static RefPtr<ID2D1Brush> - stopCollection, - &brush); - delete [] stops; - return brush; - } - - static RefPtr<ID2D1Brush> - _cairo_d2d_create_linear_gradient_brush(cairo_d2d_surface_t *d2dsurf, -+ cairo_path_fixed_t *fill_path, - cairo_linear_pattern_t *source_pattern) - { - if (source_pattern->p1.x == source_pattern->p2.x && - source_pattern->p1.y == source_pattern->p2.y) { - // Cairo behavior in this situation is to draw a solid color the size of the last stop. - RefPtr<ID2D1SolidColorBrush> brush; - d2dsurf->rt->CreateSolidColorBrush( - _cairo_d2d_color_from_cairo_color_stop(source_pattern->base.stops[source_pattern->base.n_stops - 1].color), -@@ -1564,35 +1565,46 @@ static RefPtr<ID2D1Brush> - p1.x = _cairo_fixed_to_float(source_pattern->p1.x); - p1.y = _cairo_fixed_to_float(source_pattern->p1.y); - p2.x = _cairo_fixed_to_float(source_pattern->p2.x); - p2.y = _cairo_fixed_to_float(source_pattern->p2.y); - - D2D1_GRADIENT_STOP *stops; - int num_stops = source_pattern->base.n_stops; - if (source_pattern->base.base.extend == CAIRO_EXTEND_REPEAT || source_pattern->base.base.extend == CAIRO_EXTEND_REFLECT) { -- -- RefPtr<IDXGISurface> surf; -- d2dsurf->surface->QueryInterface(&surf); -- DXGI_SURFACE_DESC desc; -- surf->GetDesc(&desc); -- - // Get this when the points are not transformed yet. - double gradient_length = _cairo_d2d_point_dist(p1, p2); -- -- // Calculate the repeat count needed; -- cairo_point_double_t top_left, top_right, bottom_left, bottom_right; -- top_left.x = bottom_left.x = top_left.y = top_right.y = 0; -- top_right.x = bottom_right.x = desc.Width; -- bottom_right.y = bottom_left.y = desc.Height; -+ cairo_point_double_t top_left, top_right, bottom_left, bottom_right; -+ -+ if (fill_path) { -+ // Calculate the repeat count needed; -+ cairo_box_t fill_extents; -+ _cairo_path_fixed_extents (fill_path, &fill_extents); -+ -+ top_left.x = bottom_left.x = _cairo_fixed_to_double (fill_extents.p1.x); -+ top_left.y = top_right.y = _cairo_fixed_to_double (fill_extents.p1.y); -+ top_right.x = bottom_right.x = _cairo_fixed_to_double (fill_extents.p2.x); -+ bottom_right.y = bottom_left.y = _cairo_fixed_to_double (fill_extents.p2.y); -+ } else { -+ RefPtr<IDXGISurface> surf; -+ d2dsurf->surface->QueryInterface(&surf); -+ DXGI_SURFACE_DESC desc; -+ surf->GetDesc(&desc); -+ -+ top_left.x = bottom_left.x = 0; -+ top_left.y = top_right.y = 0; -+ top_right.x = bottom_right.x = desc.Width; -+ bottom_right.y = bottom_left.y = desc.Height; -+ } -+ - // Transform the corners of our surface to pattern space. - cairo_matrix_transform_point(&source_pattern->base.base.matrix, &top_left.x, &top_left.y); - cairo_matrix_transform_point(&source_pattern->base.base.matrix, &top_right.x, &top_right.y); - cairo_matrix_transform_point(&source_pattern->base.base.matrix, &bottom_left.x, &bottom_left.y); -- cairo_matrix_transform_point(&source_pattern->base.base.matrix, &bottom_right.x, &top_left.y); -+ cairo_matrix_transform_point(&source_pattern->base.base.matrix, &bottom_right.x, &bottom_right.y); - - cairo_point_double_t u; - // Unit vector of the gradient direction. - u = _cairo_d2d_subtract_point(p2, p1); - _cairo_d2d_normalize_point(&u); - - // (corner - p1) . u = |corner - p1| cos(a) where a is the angle between the two vectors. - // Coincidentally |corner - p1| cos(a) is actually also the distance our gradient needs to cover since -@@ -1701,17 +1713,18 @@ static RefPtr<ID2D1Brush> - * \param d2dsurf Surface to create a brush for - * \param pattern The pattern to create a brush for - * \param unique We cache the bitmap/color brush for speed. If this - * needs a brush that is unique (i.e. when more than one is needed), - * this will make the function return a seperate brush. - * \return A brush object - */ - static RefPtr<ID2D1Brush> --_cairo_d2d_create_brush_for_pattern(cairo_d2d_surface_t *d2dsurf, -+_cairo_d2d_create_brush_for_pattern(cairo_d2d_surface_t *d2dsurf, -+ cairo_path_fixed_t *fill_path, - const cairo_pattern_t *pattern, - bool unique = false) - { - HRESULT hr; - - if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { - cairo_solid_pattern_t *sourcePattern = - (cairo_solid_pattern_t*)pattern; -@@ -1729,17 +1742,17 @@ static RefPtr<ID2D1Brush> - d2dsurf->solidColorBrush->SetColor(color); - } - return d2dsurf->solidColorBrush; - } - - } else if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) { - cairo_linear_pattern_t *source_pattern = - (cairo_linear_pattern_t*)pattern; -- return _cairo_d2d_create_linear_gradient_brush(d2dsurf, source_pattern); -+ return _cairo_d2d_create_linear_gradient_brush(d2dsurf, fill_path, source_pattern); - } else if (pattern->type == CAIRO_PATTERN_TYPE_RADIAL) { - cairo_radial_pattern_t *source_pattern = - (cairo_radial_pattern_t*)pattern; - return _cairo_d2d_create_radial_gradient_brush(d2dsurf, source_pattern); - } else if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { - cairo_matrix_t mat = pattern->matrix; - cairo_matrix_invert(&mat); - -@@ -3228,17 +3241,17 @@ static cairo_int_status_t - - if (unlikely(status)) - return status; - } - #endif - - target_rt->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED); - -- RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(d2dsurf, -+ RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(d2dsurf, NULL, - source); - - if (!brush) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - D2D1_SIZE_F size = target_rt->GetSize(); - target_rt->FillRectangle(D2D1::RectF((FLOAT)0, -@@ -3349,17 +3362,17 @@ static cairo_int_status_t - source->filter, - solidAlphaValue); - if (rv != CAIRO_INT_STATUS_UNSUPPORTED) { - return rv; - } - } - } - -- RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(d2dsurf, source); -+ RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(d2dsurf, NULL, source); - if (!brush) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - RefPtr<ID2D1RenderTarget> target_rt = d2dsurf->rt; - #ifndef ALWAYS_MANUAL_COMPOSITE - if (op != CAIRO_OPERATOR_OVER) { - #endif -@@ -3389,17 +3402,17 @@ static cairo_int_status_t - brush->SetOpacity(1.0); - - if (target_rt.get() != d2dsurf->rt.get()) { - return _cairo_d2d_blend_temp_surface(d2dsurf, op, target_rt, clip); - } - return CAIRO_INT_STATUS_SUCCESS; - } - -- RefPtr<ID2D1Brush> opacityBrush = _cairo_d2d_create_brush_for_pattern(d2dsurf, mask, true); -+ RefPtr<ID2D1Brush> opacityBrush = _cairo_d2d_create_brush_for_pattern(d2dsurf, NULL, mask, true); - if (!opacityBrush) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - if (!d2dsurf->maskLayer) { - d2dsurf->rt->CreateLayer(&d2dsurf->maskLayer); - } - target_rt->PushLayer(D2D1::LayerParameters(D2D1::InfiniteRect(), -@@ -3475,17 +3488,17 @@ static cairo_int_status_t - D2D1_FIGURE_BEGIN_FILLED); - - bool transformed = true; - - if (_cairo_matrix_is_identity(ctm)) { - transformed = false; - } - -- RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(d2dsurf, -+ RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(d2dsurf, NULL, - source); - if (!brush) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - D2D1::Matrix3x2F mat; - if (transformed) { - // If we are transformed we will draw the geometry multiplied by the -@@ -3602,31 +3615,31 @@ static cairo_int_status_t - } - - if (is_box) { - float x1 = _cairo_fixed_to_float(box.p1.x); - float y1 = _cairo_fixed_to_float(box.p1.y); - float x2 = _cairo_fixed_to_float(box.p2.x); - float y2 = _cairo_fixed_to_float(box.p2.y); - RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(d2dsurf, -- source); -+ path, source); - if (!brush) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - target_rt->FillRectangle(D2D1::RectF(x1, - y1, - x2, - y2), - brush); - } else { - RefPtr<ID2D1Geometry> d2dpath = _cairo_d2d_create_path_geometry_for_path(path, fill_rule, D2D1_FIGURE_BEGIN_FILLED); - - RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(d2dsurf, -- source); -+ path, source); - if (!brush) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - target_rt->FillGeometry(d2dpath, brush); - } - - if (target_rt.get() != d2dsurf->rt.get()) { - double x1, y1, x2, y2; -@@ -4138,17 +4151,17 @@ static cairo_int_status_t - DWRITE_TEXTURE_ALIASED_1x1 : DWRITE_TEXTURE_CLEARTYPE_3x1, - &bounds); - fontArea.x = bounds.left; - fontArea.y = bounds.top; - fontArea.width = bounds.right - bounds.left; - fontArea.height = bounds.bottom - bounds.top; - } - -- RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(dst, -+ RefPtr<ID2D1Brush> brush = _cairo_d2d_create_brush_for_pattern(dst, NULL, - source); - - if (!brush) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - if (transform) { - D2D1::Matrix3x2F mat_inverse = _cairo_d2d_matrix_from_matrix(&dwritesf->mat_inverse); diff --git a/gfx/cairo/d2d.patch b/gfx/cairo/d2d.patch deleted file mode 100644 index b8dd155e7..000000000 --- a/gfx/cairo/d2d.patch +++ /dev/null @@ -1,465 +0,0 @@ -commit 4a412c0b144ed1fdde668e0e91241bac8bedd579 -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Sun Jan 24 14:04:33 2010 -0500 - - d2d - -diff --git a/src/cairo-fixed-private.h b/src/cairo-fixed-private.h -index c299def..a37ca6a 100644 ---- a/src/cairo-fixed-private.h -+++ b/src/cairo-fixed-private.h -@@ -50,6 +50,7 @@ - - #define CAIRO_FIXED_ONE ((cairo_fixed_t)(1 << CAIRO_FIXED_FRAC_BITS)) - #define CAIRO_FIXED_ONE_DOUBLE ((double)(1 << CAIRO_FIXED_FRAC_BITS)) -+#define CAIRO_FIXED_ONE_FLOAT ((float)(1 << CAIRO_FIXED_FRAC_BITS)) - #define CAIRO_FIXED_EPSILON ((cairo_fixed_t)(1)) - - #define CAIRO_FIXED_FRAC_MASK (((cairo_fixed_unsigned_t)(-1)) >> (CAIRO_FIXED_BITS - CAIRO_FIXED_FRAC_BITS)) -@@ -141,6 +142,12 @@ _cairo_fixed_to_double (cairo_fixed_t f) - return ((double) f) / CAIRO_FIXED_ONE_DOUBLE; - } - -+static inline float -+_cairo_fixed_to_float (cairo_fixed_t f) -+{ -+ return ((float) f) / CAIRO_FIXED_ONE_FLOAT; -+} -+ - static inline int - _cairo_fixed_is_integer (cairo_fixed_t f) - { -diff --git a/src/cairo-win32-private.h b/src/cairo-win32-private.h -index b9926bb..ba57595 100644 ---- a/src/cairo-win32-private.h -+++ b/src/cairo-win32-private.h -@@ -231,4 +231,19 @@ inline BOOL ModifyWorldTransform(HDC hdc, CONST XFORM * lpxf, DWORD mode) { retu - - #endif - -+#ifdef CAIRO_HAS_DWRITE_FONT -+CAIRO_BEGIN_DECLS -+ -+cairo_public cairo_int_status_t -+cairo_dwrite_show_glyphs_on_surface(void *surface, -+ cairo_operator_t op, -+ const cairo_pattern_t *source, -+ cairo_glyph_t *glyphs, -+ int num_glyphs, -+ cairo_scaled_font_t *scaled_font, -+ cairo_rectangle_int_t *extents); -+ -+ -+CAIRO_END_DECLS -+#endif /* CAIRO_HAS_DWRITE_FONT */ - #endif /* CAIRO_WIN32_PRIVATE_H */ -diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c -index 0dc5e76..bee00b1 100644 ---- a/src/cairo-win32-surface.c -+++ b/src/cairo-win32-surface.c -@@ -1547,152 +1547,158 @@ _cairo_win32_surface_show_glyphs (void *surface, - int *remaining_glyphs) - { - #if defined(CAIRO_HAS_WIN32_FONT) && !defined(WINCE) -- cairo_win32_surface_t *dst = surface; -- -- WORD glyph_buf_stack[STACK_GLYPH_SIZE]; -- WORD *glyph_buf = glyph_buf_stack; -- int dxy_buf_stack[2 * STACK_GLYPH_SIZE]; -- int *dxy_buf = dxy_buf_stack; -- -- BOOL win_result = 0; -- int i, j; -+ if (scaled_font->backend->type == CAIRO_FONT_TYPE_DWRITE) { -+#ifdef CAIRO_HAS_DWRITE_FONT -+ return cairo_dwrite_show_glyphs_on_surface(surface, op, source, glyphs, num_glyphs, scaled_font, clip); -+#endif -+ } else { -+ cairo_win32_surface_t *dst = surface; -+ -+ WORD glyph_buf_stack[STACK_GLYPH_SIZE]; -+ WORD *glyph_buf = glyph_buf_stack; -+ int dxy_buf_stack[2 * STACK_GLYPH_SIZE]; -+ int *dxy_buf = dxy_buf_stack; - -- cairo_solid_pattern_t *solid_pattern; -- COLORREF color; -+ BOOL win_result = 0; -+ int i, j; - -- cairo_matrix_t device_to_logical; -+ cairo_solid_pattern_t *solid_pattern; -+ COLORREF color; - -- int start_x, start_y; -- double user_x, user_y; -- int logical_x, logical_y; -- unsigned int glyph_index_option; -+ cairo_matrix_t device_to_logical; - -- /* We can only handle win32 fonts */ -- if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_WIN32) -- return CAIRO_INT_STATUS_UNSUPPORTED; -+ int start_x, start_y; -+ double user_x, user_y; -+ int logical_x, logical_y; -+ unsigned int glyph_index_option; - -- /* We can only handle opaque solid color sources */ -- if (!_cairo_pattern_is_opaque_solid(source)) -- return CAIRO_INT_STATUS_UNSUPPORTED; -+ /* We can only handle win32 fonts */ -+ if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_WIN32) -+ return CAIRO_INT_STATUS_UNSUPPORTED; - -- /* We can only handle operator SOURCE or OVER with the destination -- * having no alpha */ -- if ((op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_OVER) || -- (dst->format != CAIRO_FORMAT_RGB24)) -- return CAIRO_INT_STATUS_UNSUPPORTED; -+ /* We can only handle opaque solid color sources */ -+ if (!_cairo_pattern_is_opaque_solid(source)) -+ return CAIRO_INT_STATUS_UNSUPPORTED; - -- /* If we have a fallback mask clip set on the dst, we have -- * to go through the fallback path, but only if we're not -- * doing this for printing */ -- if (clip != NULL) { -- if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) == 0) { -- cairo_region_t *clip_region; -- cairo_status_t status; -+ /* We can only handle operator SOURCE or OVER with the destination -+ * having no alpha */ -+ if ((op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_OVER) || -+ (dst->format != CAIRO_FORMAT_RGB24)) -+ return CAIRO_INT_STATUS_UNSUPPORTED; - -- status = _cairo_clip_get_region (clip, &clip_region); -- assert (status != CAIRO_INT_STATUS_NOTHING_TO_DO); -- if (status) -- return status; -+ /* If we have a fallback mask clip set on the dst, we have -+ * to go through the fallback path, but only if we're not -+ * doing this for printing */ -+ if (clip != NULL) { -+ if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) == 0) { -+ cairo_region_t *clip_region; -+ cairo_status_t status; -+ -+ status = _cairo_clip_get_region (clip, &clip_region); -+ assert (status != CAIRO_INT_STATUS_NOTHING_TO_DO); -+ if (status) -+ return status; - -- _cairo_win32_surface_set_clip_region (surface, clip_region); -+ _cairo_win32_surface_set_clip_region (surface, clip_region); -+ } - } -- } - -- solid_pattern = (cairo_solid_pattern_t *)source; -- color = RGB(((int)solid_pattern->color.red_short) >> 8, -- ((int)solid_pattern->color.green_short) >> 8, -- ((int)solid_pattern->color.blue_short) >> 8); -+ solid_pattern = (cairo_solid_pattern_t *)source; -+ color = RGB(((int)solid_pattern->color.red_short) >> 8, -+ ((int)solid_pattern->color.green_short) >> 8, -+ ((int)solid_pattern->color.blue_short) >> 8); - -- cairo_win32_scaled_font_get_device_to_logical(scaled_font, &device_to_logical); -+ cairo_win32_scaled_font_get_device_to_logical(scaled_font, &device_to_logical); - -- SaveDC(dst->dc); -+ SaveDC(dst->dc); - -- cairo_win32_scaled_font_select_font(scaled_font, dst->dc); -- SetTextColor(dst->dc, color); -- SetTextAlign(dst->dc, TA_BASELINE | TA_LEFT); -- SetBkMode(dst->dc, TRANSPARENT); -+ cairo_win32_scaled_font_select_font(scaled_font, dst->dc); -+ SetTextColor(dst->dc, color); -+ SetTextAlign(dst->dc, TA_BASELINE | TA_LEFT); -+ SetBkMode(dst->dc, TRANSPARENT); - -- if (num_glyphs > STACK_GLYPH_SIZE) { -- glyph_buf = (WORD *) _cairo_malloc_ab (num_glyphs, sizeof(WORD)); -- dxy_buf = (int *) _cairo_malloc_abc (num_glyphs, sizeof(int), 2); -- } -+ if (num_glyphs > STACK_GLYPH_SIZE) { -+ glyph_buf = (WORD *) _cairo_malloc_ab (num_glyphs, sizeof(WORD)); -+ dxy_buf = (int *) _cairo_malloc_abc (num_glyphs, sizeof(int), 2); -+ } - -- /* It is vital that dx values for dxy_buf are calculated from the delta of -- * _logical_ x coordinates (not user x coordinates) or else the sum of all -- * previous dx values may start to diverge from the current glyph's x -- * coordinate due to accumulated rounding error. As a result strings could -- * be painted shorter or longer than expected. */ -+ /* It is vital that dx values for dxy_buf are calculated from the delta of -+ * _logical_ x coordinates (not user x coordinates) or else the sum of all -+ * previous dx values may start to diverge from the current glyph's x -+ * coordinate due to accumulated rounding error. As a result strings could -+ * be painted shorter or longer than expected. */ - -- user_x = glyphs[0].x; -- user_y = glyphs[0].y; -+ user_x = glyphs[0].x; -+ user_y = glyphs[0].y; - -- cairo_matrix_transform_point(&device_to_logical, -- &user_x, &user_y); -+ cairo_matrix_transform_point(&device_to_logical, -+ &user_x, &user_y); - -- logical_x = _cairo_lround (user_x); -- logical_y = _cairo_lround (user_y); -+ logical_x = _cairo_lround (user_x); -+ logical_y = _cairo_lround (user_y); - -- start_x = logical_x; -- start_y = logical_y; -+ start_x = logical_x; -+ start_y = logical_y; - -- for (i = 0, j = 0; i < num_glyphs; ++i, j = 2 * i) { -- glyph_buf[i] = (WORD) glyphs[i].index; -- if (i == num_glyphs - 1) { -- dxy_buf[j] = 0; -- dxy_buf[j+1] = 0; -- } else { -- double next_user_x = glyphs[i+1].x; -- double next_user_y = glyphs[i+1].y; -- int next_logical_x, next_logical_y; -+ for (i = 0, j = 0; i < num_glyphs; ++i, j = 2 * i) { -+ glyph_buf[i] = (WORD) glyphs[i].index; -+ if (i == num_glyphs - 1) { -+ dxy_buf[j] = 0; -+ dxy_buf[j+1] = 0; -+ } else { -+ double next_user_x = glyphs[i+1].x; -+ double next_user_y = glyphs[i+1].y; -+ int next_logical_x, next_logical_y; - -- cairo_matrix_transform_point(&device_to_logical, -- &next_user_x, &next_user_y); -+ cairo_matrix_transform_point(&device_to_logical, -+ &next_user_x, &next_user_y); - -- next_logical_x = _cairo_lround (next_user_x); -- next_logical_y = _cairo_lround (next_user_y); -+ next_logical_x = _cairo_lround (next_user_x); -+ next_logical_y = _cairo_lround (next_user_y); - -- dxy_buf[j] = _cairo_lround (next_logical_x - logical_x); -- dxy_buf[j+1] = _cairo_lround (logical_y - next_logical_y); -- /* note that GDI coordinate system is inverted */ -+ dxy_buf[j] = _cairo_lround (next_logical_x - logical_x); -+ dxy_buf[j+1] = _cairo_lround (logical_y - next_logical_y); -+ /* note that GDI coordinate system is inverted */ - -- logical_x = next_logical_x; -- logical_y = next_logical_y; -- } -- } -+ logical_x = next_logical_x; -+ logical_y = next_logical_y; -+ } -+ } - -- /* Using glyph indices for a Type 1 font does not work on a -- * printer DC. The win32 printing surface will convert the the -- * glyph indices of Type 1 fonts to the unicode values. -- */ -- if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) && -- _cairo_win32_scaled_font_is_type1 (scaled_font)) -- { -- glyph_index_option = 0; -- } -- else -- { -- glyph_index_option = ETO_GLYPH_INDEX; -- } -+ /* Using glyph indices for a Type 1 font does not work on a -+ * printer DC. The win32 printing surface will convert the the -+ * glyph indices of Type 1 fonts to the unicode values. -+ */ -+ if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) && -+ _cairo_win32_scaled_font_is_type1 (scaled_font)) -+ { -+ glyph_index_option = 0; -+ } -+ else -+ { -+ glyph_index_option = ETO_GLYPH_INDEX; -+ } - -- win_result = ExtTextOutW(dst->dc, -- start_x, -- start_y, -- glyph_index_option | ETO_PDY, -- NULL, -- glyph_buf, -- num_glyphs, -- dxy_buf); -- if (!win_result) { -- _cairo_win32_print_gdi_error("_cairo_win32_surface_show_glyphs(ExtTextOutW failed)"); -- } -+ win_result = ExtTextOutW(dst->dc, -+ start_x, -+ start_y, -+ glyph_index_option | ETO_PDY, -+ NULL, -+ glyph_buf, -+ num_glyphs, -+ dxy_buf); -+ if (!win_result) { -+ _cairo_win32_print_gdi_error("_cairo_win32_surface_show_glyphs(ExtTextOutW failed)"); -+ } - -- RestoreDC(dst->dc, -1); -+ RestoreDC(dst->dc, -1); - -- if (glyph_buf != glyph_buf_stack) { -- free(glyph_buf); -- free(dxy_buf); -+ if (glyph_buf != glyph_buf_stack) { -+ free(glyph_buf); -+ free(dxy_buf); -+ } -+ return (win_result) ? CAIRO_STATUS_SUCCESS : CAIRO_INT_STATUS_UNSUPPORTED; - } -- return (win_result) ? CAIRO_STATUS_SUCCESS : CAIRO_INT_STATUS_UNSUPPORTED; - #else - return CAIRO_INT_STATUS_UNSUPPORTED; - #endif -diff --git a/src/cairo-win32.h b/src/cairo-win32.h -index 6b86d4e..fcf20b8 100644 ---- a/src/cairo-win32.h -+++ b/src/cairo-win32.h -@@ -109,6 +109,63 @@ cairo_win32_scaled_font_get_device_to_logical (cairo_scaled_font_t *scaled_font, - - #endif /* CAIRO_HAS_WIN32_FONT */ - -+#if CAIRO_HAS_DWRITE_FONT -+ -+/* -+ * Win32 DirectWrite font support -+ */ -+cairo_public cairo_font_face_t * -+cairo_dwrite_font_face_create_for_dwrite_fontface(void *dwrite_font, void *dwrite_font_face); -+ -+#endif /* CAIRO_HAS_DWRITE_FONT */ -+ -+#if CAIRO_HAS_D2D_SURFACE -+ -+/** -+ * Create a D2D surface for an HWND -+ * -+ * \param wnd Handle for the window -+ * \return New cairo surface -+ */ -+cairo_public cairo_surface_t * -+cairo_d2d_surface_create_for_hwnd(HWND wnd); -+ -+/** -+ * Create a D2D surface of a certain size. -+ * -+ * \param format Cairo format of the surface -+ * \param width Width of the surface -+ * \param height Height of the surface -+ * \return New cairo surface -+ */ -+cairo_public cairo_surface_t * -+cairo_d2d_surface_create(cairo_format_t format, -+ int width, -+ int height); -+ -+/** -+ * Present the backbuffer for a surface create for an HWND. This needs -+ * to be called when the owner of the original window surface wants to -+ * actually present the executed drawing operations to the screen. -+ * -+ * \param surface D2D surface. -+ */ -+void cairo_d2d_present_backbuffer(cairo_surface_t *surface); -+ -+/** -+ * Scroll the surface, this only moves the surface graphics, it does not -+ * actually scroll child windows or anything like that. Nor does it invalidate -+ * that area of the window. -+ * -+ * \param surface The d2d surface this operation should apply to. -+ * \param x The x delta for the movement -+ * \param y The y delta for the movement -+ * \param clip The clip rectangle, the is the 'part' of the surface that needs -+ * scrolling. -+ */ -+void cairo_d2d_scroll(cairo_surface_t *surface, int x, int y, cairo_rectangle_t *clip); -+#endif -+ - CAIRO_END_DECLS - - #else /* CAIRO_HAS_WIN32_SURFACE */ -diff --git a/src/cairo.h b/src/cairo.h -index 3a8b8a6..21827aa 100644 ---- a/src/cairo.h -+++ b/src/cairo.h -@@ -1370,7 +1370,8 @@ typedef enum _cairo_font_type { - CAIRO_FONT_TYPE_FT, - CAIRO_FONT_TYPE_WIN32, - CAIRO_FONT_TYPE_QUARTZ, -- CAIRO_FONT_TYPE_USER -+ CAIRO_FONT_TYPE_USER, -+ CAIRO_FONT_TYPE_DWRITE - } cairo_font_type_t; - - cairo_public cairo_font_type_t -@@ -2009,7 +2010,7 @@ typedef enum _cairo_surface_type { - CAIRO_SURFACE_TYPE_TEE, - CAIRO_SURFACE_TYPE_XML, - CAIRO_SURFACE_TYPE_SKIA, -- CAIRO_SURFACE_TYPE_DDRAW -+ CAIRO_SURFACE_TYPE_D2D - } cairo_surface_type_t; - - cairo_public cairo_surface_type_t -diff --git a/src/cairoint.h b/src/cairoint.h -index b942b4b..58850ab 100644 ---- a/src/cairoint.h -+++ b/src/cairoint.h -@@ -587,6 +587,12 @@ extern const cairo_private struct _cairo_font_face_backend _cairo_win32_font_fac - - #endif - -+#if CAIRO_HAS_DWRITE_FONT -+ -+extern const cairo_private struct _cairo_font_face_backend _cairo_dwrite_font_face_backend; -+ -+#endif -+ - #if CAIRO_HAS_QUARTZ_FONT - - extern const cairo_private struct _cairo_font_face_backend _cairo_quartz_font_face_backend; -@@ -932,7 +938,12 @@ typedef struct _cairo_traps { - #define CAIRO_FT_FONT_FAMILY_DEFAULT "" - #define CAIRO_USER_FONT_FAMILY_DEFAULT "@cairo:" - --#if CAIRO_HAS_WIN32_FONT -+#if CAIRO_HAS_DWRITE_FONT -+ -+#define CAIRO_FONT_FAMILY_DEFAULT CAIRO_WIN32_FONT_FAMILY_DEFAULT -+#define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_dwrite_font_face_backend -+ -+#elif CAIRO_HAS_WIN32_FONT - - #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_WIN32_FONT_FAMILY_DEFAULT - #define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_win32_font_face_backend -@@ -2617,7 +2628,7 @@ cairo_private int - _cairo_ucs4_to_utf8 (uint32_t unicode, - char *utf8); - --#if CAIRO_HAS_WIN32_FONT || CAIRO_HAS_QUARTZ_FONT || CAIRO_HAS_PDF_OPERATORS -+#if CAIRO_HAS_WIN32_FONT || CAIRO_HAS_QUARTZ_FONT || CAIRO_HAS_PDF_OPERATORS || CAIRO_HAS_DW_FONT - # define CAIRO_HAS_UTF8_TO_UTF16 1 - #endif - #if CAIRO_HAS_UTF8_TO_UTF16 diff --git a/gfx/cairo/dasharray-zero-gap.patch b/gfx/cairo/dasharray-zero-gap.patch deleted file mode 100644 index e26580ae1..000000000 --- a/gfx/cairo/dasharray-zero-gap.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -2573,29 +2573,43 @@ static cairo_int_status_t - - if (style->dash && style->num_dashes) { - #define STATIC_DASH 32 - cairo_quartz_float_t sdash[STATIC_DASH]; - cairo_quartz_float_t *fdash = sdash; - unsigned int max_dashes = style->num_dashes; - unsigned int k; - -- if (style->num_dashes%2) -- max_dashes *= 2; -- if (max_dashes > STATIC_DASH) -- fdash = _cairo_malloc_ab (max_dashes, sizeof (cairo_quartz_float_t)); -- if (fdash == NULL) -- return _cairo_error (CAIRO_STATUS_NO_MEMORY); -- -- for (k = 0; k < max_dashes; k++) -- fdash[k] = (cairo_quartz_float_t) style->dash[k % style->num_dashes]; -- -- CGContextSetLineDash (surface->cgContext, style->dash_offset, fdash, max_dashes); -- if (fdash != sdash) -- free (fdash); -+ bool set_line_dash = false; -+ if (style->num_dashes % 2 == 0) { -+ for (k = 1; k < max_dashes; k++) { -+ if (style->dash[k]) { -+ set_line_dash = true; -+ break; -+ } -+ } -+ } else -+ set_line_dash = true; -+ -+ if (set_line_dash) { -+ if (style->num_dashes%2) -+ max_dashes *= 2; -+ if (max_dashes > STATIC_DASH) -+ fdash = _cairo_malloc_ab (max_dashes, sizeof (cairo_quartz_float_t)); -+ if (fdash == NULL) -+ return _cairo_error (CAIRO_STATUS_NO_MEMORY); -+ -+ for (k = 0; k < max_dashes; k++) -+ fdash[k] = (cairo_quartz_float_t) style->dash[k % style->num_dashes]; -+ -+ CGContextSetLineDash (surface->cgContext, style->dash_offset, fdash, max_dashes); -+ if (fdash != sdash) -+ free (fdash); -+ } else -+ CGContextSetLineDash (state.context, 0, NULL, 0); - } else - CGContextSetLineDash (state.context, 0, NULL, 0); - - - _cairo_quartz_cairo_path_to_quartz_context (path, state.context); - - _cairo_quartz_cairo_matrix_to_quartz (ctm, &strokeTransform); - CGContextConcatCTM (state.context, strokeTransform); diff --git a/gfx/cairo/disable-previous-scaled-font-cache.patch b/gfx/cairo/disable-previous-scaled-font-cache.patch deleted file mode 100644 index afeac5ec8..000000000 --- a/gfx/cairo/disable-previous-scaled-font-cache.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo.c b/gfx/cairo/cairo/src/cairo.c ---- a/gfx/cairo/cairo/src/cairo.c -+++ b/gfx/cairo/cairo/src/cairo.c -@@ -3201,8 +3201,12 @@ cairo_set_scaled_font (cairo_t - - _cairo_gstate_set_font_options (cr->gstate, &scaled_font->options); - -+ /* XXX: Mozilla code assumes that the ctm of a scaled font doesn't need to -+ * match the context ctm. This assumption breaks the previous_scaled_font -+ * cache. So we avoid using the cache for now. - if (was_previous) - cr->gstate->scaled_font = cairo_scaled_font_reference ((cairo_scaled_font_t *) scaled_font); -+ */ - - return; - diff --git a/gfx/cairo/disable-printing.patch b/gfx/cairo/disable-printing.patch deleted file mode 100644 index c1006d819..000000000 --- a/gfx/cairo/disable-printing.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -1892,21 +1892,22 @@ cairo_win32_surface_get_dc (cairo_surfac - return winsurf->dc; - } - - if (_cairo_surface_is_paginated (surface)) { - cairo_surface_t *target; - - target = _cairo_paginated_surface_get_target (surface); - -+#ifndef CAIRO_OMIT_WIN32_PRINTING - if (_cairo_surface_is_win32_printing (target)) { - winsurf = (cairo_win32_surface_t *) target; -- - return winsurf->dc; - } -+#endif - } - - return NULL; - } - - /** - * cairo_win32_surface_get_image - * @surface: a #cairo_surface_t diff --git a/gfx/cairo/disable-server-gradients.patch b/gfx/cairo/disable-server-gradients.patch deleted file mode 100644 index 2d8fb5b6d..000000000 --- a/gfx/cairo/disable-server-gradients.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 31579379422b75c3fe01b75d363e03f9b1e85604 -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Fri Mar 12 16:07:59 2010 -0500 - - xlib bugs - -diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c -index a7a40b8..566d9fb 100644 ---- a/src/cairo-xlib-display.c -+++ b/src/cairo-xlib-display.c -@@ -407,6 +407,10 @@ _cairo_xlib_display_get (Display *dpy, - display->buggy_pad_reflect = TRUE; - } - -+ /* gradients don't seem to work */ -+ display->buggy_gradients = TRUE; -+ -+ - /* XXX workaround; see https://bugzilla.mozilla.org/show_bug.cgi?id=413583 */ - /* If buggy_repeat_force == -1, then initialize. - * - set to -2, meaning "nothing was specified", and we trust the above detection. diff --git a/gfx/cairo/disable-subpixel-antialiasing.patch b/gfx/cairo/disable-subpixel-antialiasing.patch deleted file mode 100644 index 7a0eb3a06..000000000 --- a/gfx/cairo/disable-subpixel-antialiasing.patch +++ /dev/null @@ -1,519 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1294019288 -46800 -# Node ID 8857392e37aea7475ed6d8ee4b45023e1233bcec -# Parent c53f60831c43cca397dfed8adf8d350aeec7d3ca -Bug 363861. Part 2: Introduce cairo_surface_get/set_subpixel_antialiasing. r=jrmuizel,sr=vlad,a=blocking - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -2473,16 +2473,17 @@ _cairo_quartz_surface_show_glyphs (void - cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; - cairo_quartz_drawing_state_t state; - float xprev, yprev; - int i; - CGFontRef cgfref = NULL; - - cairo_bool_t isClipping = FALSE; - cairo_bool_t didForceFontSmoothing = FALSE; -+ cairo_antialias_t effective_antialiasing; - - if (IS_EMPTY(surface)) - return CAIRO_STATUS_SUCCESS; - - if (num_glyphs <= 0) - return CAIRO_STATUS_SUCCESS; - - if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_QUARTZ) -@@ -2514,16 +2515,22 @@ _cairo_quartz_surface_show_glyphs (void - goto BAIL; - } - - /* this doesn't addref */ - cgfref = _cairo_quartz_scaled_font_get_cg_font_ref (scaled_font); - CGContextSetFont (state.context, cgfref); - CGContextSetFontSize (state.context, 1.0); - -+ effective_antialiasing = scaled_font->options.antialias; -+ if (effective_antialiasing == CAIRO_ANTIALIAS_SUBPIXEL && -+ !surface->base.permit_subpixel_antialiasing) { -+ effective_antialiasing = CAIRO_ANTIALIAS_GRAY; -+ } -+ - switch (scaled_font->options.antialias) { - case CAIRO_ANTIALIAS_SUBPIXEL: - CGContextSetShouldAntialias (state.context, TRUE); - CGContextSetShouldSmoothFonts (state.context, TRUE); - if (CGContextSetAllowsFontSmoothingPtr && - !CGContextGetAllowsFontSmoothingPtr (state.context)) - { - didForceFontSmoothing = TRUE; -diff --git a/gfx/cairo/cairo/src/cairo-surface-private.h b/gfx/cairo/cairo/src/cairo-surface-private.h ---- a/gfx/cairo/cairo/src/cairo-surface-private.h -+++ b/gfx/cairo/cairo/src/cairo-surface-private.h -@@ -58,16 +58,17 @@ struct _cairo_surface { - - cairo_reference_count_t ref_count; - cairo_status_t status; - unsigned int unique_id; - - unsigned finished : 1; - unsigned is_clear : 1; - unsigned has_font_options : 1; -+ unsigned permit_subpixel_antialiasing : 1; - - cairo_user_data_array_t user_data; - cairo_user_data_array_t mime_data; - - cairo_matrix_t device_transform; - cairo_matrix_t device_transform_inverse; - - /* The actual resolution of the device, in dots per inch. */ -diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c ---- a/gfx/cairo/cairo/src/cairo-surface.c -+++ b/gfx/cairo/cairo/src/cairo-surface.c -@@ -49,17 +49,18 @@ const cairo_surface_t name = { \ - NULL, /* backend */ \ - CAIRO_SURFACE_TYPE_IMAGE, /* type */ \ - CAIRO_CONTENT_COLOR, /* content */ \ - CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ \ - status, /* status */ \ - 0, /* unique id */ \ - FALSE, /* finished */ \ - TRUE, /* is_clear */ \ -- FALSE, /* has_font_options */ \ -+ FALSE, /* has_font_options */ \ -+ FALSE, /* permit_subpixel_antialiasing */ \ - { 0, 0, 0, NULL, }, /* user_data */ \ - { 0, 0, 0, NULL, }, /* mime_data */ \ - { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, /* device_transform */ \ - { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, /* device_transform_inverse */ \ - 0.0, /* x_resolution */ \ - 0.0, /* y_resolution */ \ - 0.0, /* x_fallback_resolution */ \ - 0.0, /* y_fallback_resolution */ \ -@@ -342,46 +343,48 @@ _cairo_surface_init (cairo_surface_t * - surface->content = content; - surface->type = backend->type; - - CAIRO_REFERENCE_COUNT_INIT (&surface->ref_count, 1); - surface->status = CAIRO_STATUS_SUCCESS; - surface->unique_id = _cairo_surface_allocate_unique_id (); - surface->finished = FALSE; - surface->is_clear = FALSE; -+ surface->has_font_options = FALSE; -+ surface->permit_subpixel_antialiasing = TRUE; - - _cairo_user_data_array_init (&surface->user_data); - _cairo_user_data_array_init (&surface->mime_data); - - cairo_matrix_init_identity (&surface->device_transform); - cairo_matrix_init_identity (&surface->device_transform_inverse); - - surface->x_resolution = CAIRO_SURFACE_RESOLUTION_DEFAULT; - surface->y_resolution = CAIRO_SURFACE_RESOLUTION_DEFAULT; - - surface->x_fallback_resolution = CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT; - surface->y_fallback_resolution = CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT; - - _cairo_array_init (&surface->snapshots, sizeof (cairo_surface_t *)); - surface->snapshot_of = NULL; -- -- surface->has_font_options = FALSE; - } - - static void - _cairo_surface_copy_similar_properties (cairo_surface_t *surface, - cairo_surface_t *other) - { - if (other->has_font_options || other->backend != surface->backend) { - cairo_font_options_t options; - - cairo_surface_get_font_options (other, &options); - _cairo_surface_set_font_options (surface, &options); - } - -+ surface->permit_subpixel_antialiasing = other->permit_subpixel_antialiasing; -+ - cairo_surface_set_fallback_resolution (surface, - other->x_fallback_resolution, - other->y_fallback_resolution); - } - - cairo_surface_t * - _cairo_surface_create_similar_scratch (cairo_surface_t *other, - cairo_content_t content, -@@ -2482,16 +2485,67 @@ cairo_surface_has_show_text_glyphs (cair - - if (surface->backend->has_show_text_glyphs) - return surface->backend->has_show_text_glyphs (surface); - else - return surface->backend->show_text_glyphs != NULL; - } - slim_hidden_def (cairo_surface_has_show_text_glyphs); - -+/** -+ * cairo_surface_set_subpixel_antialiasing: -+ * @surface: a #cairo_surface_t -+ * -+ * Sets whether the surface permits subpixel antialiasing. By default, -+ * surfaces permit subpixel antialiasing. -+ * -+ * Enabling subpixel antialiasing for CONTENT_COLOR_ALPHA surfaces generally -+ * requires that the pixels in the areas under a subpixel antialiasing -+ * operation already be opaque. -+ * -+ * Since: 1.12 -+ **/ -+void -+cairo_surface_set_subpixel_antialiasing (cairo_surface_t *surface, -+ cairo_subpixel_antialiasing_t enabled) -+{ -+ if (surface->status) -+ return; -+ -+ if (surface->finished) { -+ _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); -+ return; -+ } -+ -+ surface->permit_subpixel_antialiasing = -+ enabled == CAIRO_SUBPIXEL_ANTIALIASING_ENABLED; -+} -+slim_hidden_def (cairo_surface_set_subpixel_antialiasing); -+ -+/** -+ * cairo_surface_get_subpixel_antialiasing: -+ * @surface: a #cairo_surface_t -+ * -+ * Gets whether the surface supports subpixel antialiasing. By default, -+ * CAIRO_CONTENT_COLOR surfaces support subpixel antialiasing but other -+ * surfaces do not. -+ * -+ * Since: 1.12 -+ **/ -+cairo_subpixel_antialiasing_t -+cairo_surface_get_subpixel_antialiasing (cairo_surface_t *surface) -+{ -+ if (surface->status) -+ return CAIRO_SUBPIXEL_ANTIALIASING_DISABLED; -+ -+ return surface->permit_subpixel_antialiasing ? -+ CAIRO_SUBPIXEL_ANTIALIASING_ENABLED : CAIRO_SUBPIXEL_ANTIALIASING_DISABLED; -+} -+slim_hidden_def (cairo_surface_get_subpixel_antialiasing); -+ - /* Note: the backends may modify the contents of the glyph array as long as - * they do not return %CAIRO_INT_STATUS_UNSUPPORTED. This makes it possible to - * avoid copying the array again and again, and edit it in-place. - * Backends are in fact free to use the array as a generic buffer as they - * see fit. - * - * For show_glyphs backend method, and NOT for show_text_glyphs method, - * when they do return UNSUPPORTED, they may adjust remaining_glyphs to notify -diff --git a/gfx/cairo/cairo/src/cairo-win32-font.c b/gfx/cairo/cairo/src/cairo-win32-font.c ---- a/gfx/cairo/cairo/src/cairo-win32-font.c -+++ b/gfx/cairo/cairo/src/cairo-win32-font.c -@@ -1380,16 +1380,17 @@ _cairo_win32_scaled_font_show_glyphs (vo - cairo_win32_surface_t *surface = (cairo_win32_surface_t *)generic_surface; - cairo_status_t status; - - if (width == 0 || height == 0) - return CAIRO_STATUS_SUCCESS; - - if (_cairo_surface_is_win32 (generic_surface) && - surface->format == CAIRO_FORMAT_RGB24 && -+ (generic_surface->permit_subpixel_antialiasing || scaled_font->quality != CLEARTYPE_QUALITY) && - op == CAIRO_OPERATOR_OVER && - _cairo_pattern_is_opaque_solid (pattern)) { - - cairo_solid_pattern_t *solid_pattern = (cairo_solid_pattern_t *)pattern; - - /* When compositing OVER on a GDI-understood surface, with a - * solid opaque color, we can just call ExtTextOut directly. - */ -@@ -1411,16 +1412,18 @@ _cairo_win32_scaled_font_show_glyphs (vo - * surface by drawing the the glyphs onto a DIB, black-on-white then - * inverting. GDI outputs gamma-corrected images so inverted black-on-white - * is very different from white-on-black. We favor the more common - * case where the final output is dark-on-light. - */ - cairo_win32_surface_t *tmp_surface; - cairo_surface_t *mask_surface; - cairo_surface_pattern_t mask; -+ cairo_bool_t use_subpixel_antialiasing = -+ scaled_font->quality == CLEARTYPE_QUALITY && generic_surface->permit_subpixel_antialiasing; - RECT r; - - tmp_surface = (cairo_win32_surface_t *)cairo_win32_surface_create_with_dib (CAIRO_FORMAT_ARGB32, width, height); - if (tmp_surface->base.status) - return tmp_surface->base.status; - - r.left = 0; - r.top = 0; -@@ -1432,17 +1435,17 @@ _cairo_win32_scaled_font_show_glyphs (vo - scaled_font, RGB (0, 0, 0), - dest_x, dest_y, - glyphs, num_glyphs); - if (status) { - cairo_surface_destroy (&tmp_surface->base); - return status; - } - -- if (scaled_font->quality == CLEARTYPE_QUALITY) { -+ if (use_subpixel_antialiasing) { - /* For ClearType, we need a 4-channel mask. If we are compositing on - * a surface with alpha, we need to compute the alpha channel of - * the mask (we just copy the green channel). But for a destination - * surface without alpha the alpha channel of the mask is ignored - */ - - if (surface->format != CAIRO_FORMAT_RGB24) - _compute_argb32_mask_alpha (tmp_surface); -@@ -1460,17 +1463,17 @@ _cairo_win32_scaled_font_show_glyphs (vo - - /* For op == OVER, no-cleartype, a possible optimization here is to - * draw onto an intermediate ARGB32 surface and alpha-blend that with the - * destination - */ - _cairo_pattern_init_for_surface (&mask, mask_surface); - cairo_surface_destroy (mask_surface); - -- if (scaled_font->quality == CLEARTYPE_QUALITY) -+ if (use_subpixel_antialiasing) - mask.base.has_component_alpha = TRUE; - - status = _cairo_surface_composite (op, pattern, - &mask.base, - &surface->base, - source_x, source_y, - 0, 0, - dest_x, dest_y, -diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface.c b/gfx/cairo/cairo/src/cairo-xlib-surface.c ---- a/gfx/cairo/cairo/src/cairo-xlib-surface.c -+++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c -@@ -3570,16 +3570,17 @@ typedef struct _cairo_xlib_font_glyphset - GlyphSet glyphset; - cairo_format_t format; - XRenderPictFormat *xrender_format; - cairo_xlib_font_glyphset_free_glyphs_t *pending_free_glyphs; - } cairo_xlib_font_glyphset_info_t; - - typedef struct _cairo_xlib_surface_font_private { - cairo_scaled_font_t *scaled_font; -+ cairo_scaled_font_t *grayscale_font; - cairo_xlib_hook_t close_display_hook; - cairo_xlib_display_t *display; - cairo_xlib_font_glyphset_info_t glyphset_info[NUM_GLYPHSETS]; - } cairo_xlib_surface_font_private_t; - - /* callback from CloseDisplay */ - static void - _cairo_xlib_surface_remove_scaled_font (cairo_xlib_display_t *display, -@@ -3599,16 +3600,20 @@ _cairo_xlib_surface_remove_scaled_font ( - - _cairo_scaled_font_reset_cache (scaled_font); - CAIRO_MUTEX_UNLOCK (scaled_font->mutex); - - if (font_private != NULL) { - Display *dpy; - int i; - -+ if (font_private->grayscale_font) { -+ cairo_scaled_font_destroy (font_private->grayscale_font); -+ } -+ - dpy = _cairo_xlib_display_get_dpy (display); - for (i = 0; i < NUM_GLYPHSETS; i++) { - cairo_xlib_font_glyphset_info_t *glyphset_info; - - glyphset_info = &font_private->glyphset_info[i]; - if (glyphset_info->glyphset) - XRenderFreeGlyphSet (dpy, glyphset_info->glyphset); - -@@ -3629,16 +3634,17 @@ _cairo_xlib_surface_font_init (Display - cairo_status_t status; - int i; - - font_private = malloc (sizeof (cairo_xlib_surface_font_private_t)); - if (unlikely (font_private == NULL)) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - - font_private->scaled_font = scaled_font; -+ font_private->grayscale_font = NULL; - status = _cairo_xlib_display_get (dpy, &font_private->display); - if (unlikely (status)) { - free (font_private); - return status; - } - - /* initialize and hook into the CloseDisplay callback */ - font_private->close_display_hook.func = -@@ -3671,16 +3677,20 @@ _cairo_xlib_surface_scaled_font_fini (ca - { - cairo_xlib_surface_font_private_t *font_private; - - font_private = scaled_font->surface_private; - if (font_private != NULL) { - cairo_xlib_display_t *display; - int i; - -+ if (font_private->grayscale_font) { -+ cairo_scaled_font_destroy (font_private->grayscale_font); -+ } -+ - display = font_private->display; - _cairo_xlib_remove_close_display_hook (display, - &font_private->close_display_hook); - - for (i = 0; i < NUM_GLYPHSETS; i++) { - cairo_xlib_font_glyphset_info_t *glyphset_info; - - glyphset_info = &font_private->glyphset_info[i]; -@@ -4417,16 +4427,62 @@ _cairo_xlib_surface_owns_font (cairo_xli - (font_private != NULL && font_private->display != dst->display)) - { - return FALSE; - } - - return TRUE; - } - -+/* Gets a grayscale version of scaled_font. The grayscale version is cached -+ * in our surface_private data. -+ */ -+static cairo_scaled_font_t * -+_cairo_xlib_get_grayscale_font (cairo_xlib_surface_t *dst, -+ cairo_scaled_font_t *scaled_font) -+{ -+ cairo_xlib_surface_font_private_t *font_private = scaled_font->surface_private; -+ cairo_bool_t needs_font; -+ -+ if (font_private == NULL) { -+ cairo_status_t status = _cairo_xlib_surface_font_init (dst->dpy, scaled_font); -+ if (unlikely (status)) -+ return _cairo_scaled_font_create_in_error (status); -+ font_private = scaled_font->surface_private; -+ } -+ -+ CAIRO_MUTEX_LOCK (scaled_font->mutex); -+ needs_font = !font_private->grayscale_font; -+ CAIRO_MUTEX_UNLOCK (scaled_font->mutex); -+ -+ if (needs_font) { -+ cairo_font_options_t options; -+ cairo_scaled_font_t *new_font; -+ -+ options = scaled_font->options; -+ options.antialias = CAIRO_ANTIALIAS_GRAY; -+ new_font = cairo_scaled_font_create (scaled_font->font_face, -+ &scaled_font->font_matrix, -+ &scaled_font->ctm, &options); -+ -+ CAIRO_MUTEX_LOCK (scaled_font->mutex); -+ if (!font_private->grayscale_font) { -+ font_private->grayscale_font = new_font; -+ new_font = NULL; -+ } -+ CAIRO_MUTEX_UNLOCK (scaled_font->mutex); -+ -+ if (new_font) { -+ cairo_scaled_font_destroy (new_font); -+ } -+ } -+ -+ return font_private->grayscale_font; -+} -+ - static cairo_int_status_t - _cairo_xlib_surface_show_glyphs (void *abstract_dst, - cairo_operator_t op, - const cairo_pattern_t *src_pattern, - cairo_glyph_t *glyphs, - int num_glyphs, - cairo_scaled_font_t *scaled_font, - cairo_clip_t *clip, -@@ -4475,16 +4531,21 @@ _cairo_xlib_surface_show_glyphs (void - - operation = _categorize_composite_operation (dst, op, src_pattern, TRUE); - if (operation == DO_UNSUPPORTED) - return UNSUPPORTED ("unsupported op"); - - if (! _cairo_xlib_surface_owns_font (dst, scaled_font)) - return UNSUPPORTED ("unowned font"); - -+ if (!dst->base.permit_subpixel_antialiasing && -+ scaled_font->options.antialias == CAIRO_ANTIALIAS_SUBPIXEL) { -+ scaled_font = _cairo_xlib_get_grayscale_font (dst, scaled_font); -+ } -+ - X_DEBUG ((dst->dpy, "show_glyphs (dst=%x)", (unsigned int) dst->drawable)); - - if (clip_region != NULL && - cairo_region_num_rectangles (clip_region) == 1) - { - cairo_rectangle_int_t glyph_extents; - const cairo_rectangle_int_t *clip_extents; - -diff --git a/gfx/cairo/cairo/src/cairo.h b/gfx/cairo/cairo/src/cairo.h ---- a/gfx/cairo/cairo/src/cairo.h -+++ b/gfx/cairo/cairo/src/cairo.h -@@ -2101,16 +2101,35 @@ cairo_public void - cairo_surface_copy_page (cairo_surface_t *surface); - - cairo_public void - cairo_surface_show_page (cairo_surface_t *surface); - - cairo_public cairo_bool_t - cairo_surface_has_show_text_glyphs (cairo_surface_t *surface); - -+/** -+ * _cairo_subpixel_antialiasing_t: -+ * @CAIRO_SUBPIXEL_ANTIALIASING_ENABLED: subpixel antialiasing is enabled -+ * for this surface. -+ * @CAIRO_SUBPIXEL_ANTIALIASING_DISABLED: subpixel antialiasing is disabled -+ * for this surface. -+ */ -+typedef enum _cairo_subpixel_antialiasing_t { -+ CAIRO_SUBPIXEL_ANTIALIASING_ENABLED, -+ CAIRO_SUBPIXEL_ANTIALIASING_DISABLED -+} cairo_subpixel_antialiasing_t; -+ -+cairo_public void -+cairo_surface_set_subpixel_antialiasing (cairo_surface_t *surface, -+ cairo_subpixel_antialiasing_t enabled); -+ -+cairo_public cairo_subpixel_antialiasing_t -+cairo_surface_get_subpixel_antialiasing (cairo_surface_t *surface); -+ - /* Image-surface functions */ - - /** - * cairo_format_t: - * @CAIRO_FORMAT_ARGB32: each pixel is a 32-bit quantity, with - * alpha in the upper 8 bits, then red, then green, then blue. - * The 32-bit quantities are stored native-endian. Pre-multiplied - * alpha is used. (That is, 50% transparent red is 0x80800000, -diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h ---- a/gfx/cairo/cairo/src/cairoint.h -+++ b/gfx/cairo/cairo/src/cairoint.h -@@ -2750,16 +2750,18 @@ slim_hidden_proto (cairo_surface_destroy - slim_hidden_proto (cairo_surface_finish); - slim_hidden_proto (cairo_surface_flush); - slim_hidden_proto (cairo_surface_get_content); - slim_hidden_proto (cairo_surface_get_device_offset); - slim_hidden_proto (cairo_surface_get_font_options); - slim_hidden_proto (cairo_surface_get_mime_data); - slim_hidden_proto (cairo_surface_get_type); - slim_hidden_proto (cairo_surface_has_show_text_glyphs); -+slim_hidden_proto (cairo_surface_set_subpixel_antialiasing); -+slim_hidden_proto (cairo_surface_get_subpixel_antialiasing); - slim_hidden_proto (cairo_surface_mark_dirty_rectangle); - slim_hidden_proto_no_warn (cairo_surface_reference); - slim_hidden_proto (cairo_surface_set_device_offset); - slim_hidden_proto (cairo_surface_set_fallback_resolution); - slim_hidden_proto (cairo_surface_set_mime_data); - slim_hidden_proto (cairo_surface_show_page); - slim_hidden_proto (cairo_surface_status); - slim_hidden_proto (cairo_text_cluster_allocate); diff --git a/gfx/cairo/dwrite-font-match-robustness.patch b/gfx/cairo/dwrite-font-match-robustness.patch deleted file mode 100644 index eadcce3bd..000000000 --- a/gfx/cairo/dwrite-font-match-robustness.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: Robert O'Callahan <robert@ocallahan.org> -Bug 717178. Part 1: Don't crash when passing a nil scaled-font to _name_tables_match. r=jfkthame - -diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp ---- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp -+++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp -@@ -1489,17 +1489,18 @@ static cairo_bool_t - unsigned long size1; - unsigned long size2; - cairo_int_status_t status1; - cairo_int_status_t status2; - unsigned char *buffer1; - unsigned char *buffer2; - cairo_bool_t result = false; - -- if (!font1->backend->load_truetype_table || -+ if (!font1->backend || !font2->backend || -+ !font1->backend->load_truetype_table || - !font2->backend->load_truetype_table) - return false; - - status1 = font1->backend->load_truetype_table (font1, - TT_TAG_name, 0, NULL, &size1); - status2 = font2->backend->load_truetype_table (font2, - TT_TAG_name, 0, NULL, &size2); - if (status1 || status2) diff --git a/gfx/cairo/dwrite-font-printing.patch b/gfx/cairo/dwrite-font-printing.patch deleted file mode 100644 index 837e19f6c..000000000 --- a/gfx/cairo/dwrite-font-printing.patch +++ /dev/null @@ -1,157 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp ---- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp -+++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp -@@ -37,16 +37,17 @@ - #include "cairoint.h" - - #include "cairo-win32-private.h" - #include "cairo-surface-private.h" - #include "cairo-clip-private.h" - - #include "cairo-d2d-private.h" - #include "cairo-dwrite-private.h" -+#include "cairo-truetype-subset-private.h" - #include <float.h> - - typedef HRESULT (WINAPI*D2D1CreateFactoryFunc)( - D2D1_FACTORY_TYPE factoryType, - REFIID iid, - CONST D2D1_FACTORY_OPTIONS *pFactoryOptions, - void **factory - ); -@@ -1036,17 +1037,17 @@ cairo_int_status_t - { - cairo_dwrite_scaled_font_t *dwritesf = static_cast<cairo_dwrite_scaled_font_t*>(scaled_font); - cairo_dwrite_font_face_t *face = reinterpret_cast<cairo_dwrite_font_face_t*>(dwritesf->base.font_face); - - const void *data; - UINT32 size; - void *tableContext; - BOOL exists; -- face->dwriteface->TryGetFontTable(tag, -+ face->dwriteface->TryGetFontTable(be32_to_cpu (tag), - &data, - &size, - &tableContext, - &exists); - - if (!exists) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } -@@ -1476,16 +1477,59 @@ DWriteFactory::CreateRenderingParams() - Instance()->CreateCustomRenderingParams(gamma, contrast, clearTypeLevel, - pixelGeometry, renderingMode, - &mCustomClearTypeRenderingParams); - Instance()->CreateCustomRenderingParams(gamma, contrast, clearTypeLevel, - pixelGeometry, DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC, - &mForceGDIClassicRenderingParams); - } - -+static cairo_bool_t -+_name_tables_match (cairo_scaled_font_t *font1, -+ cairo_scaled_font_t *font2) -+{ -+ unsigned long size1; -+ unsigned long size2; -+ cairo_int_status_t status1; -+ cairo_int_status_t status2; -+ unsigned char *buffer1; -+ unsigned char *buffer2; -+ cairo_bool_t result = false; -+ -+ if (!font1->backend->load_truetype_table || -+ !font2->backend->load_truetype_table) -+ return false; -+ -+ status1 = font1->backend->load_truetype_table (font1, -+ TT_TAG_name, 0, NULL, &size1); -+ status2 = font2->backend->load_truetype_table (font2, -+ TT_TAG_name, 0, NULL, &size2); -+ if (status1 || status2) -+ return false; -+ if (size1 != size2) -+ return false; -+ -+ buffer1 = (unsigned char*)malloc (size1); -+ buffer2 = (unsigned char*)malloc (size2); -+ -+ if (buffer1 && buffer2) { -+ status1 = font1->backend->load_truetype_table (font1, -+ TT_TAG_name, 0, buffer1, &size1); -+ status2 = font2->backend->load_truetype_table (font2, -+ TT_TAG_name, 0, buffer2, &size2); -+ if (!status1 && !status2) { -+ result = memcmp (buffer1, buffer2, size1) == 0; -+ } -+ } -+ -+ free (buffer1); -+ free (buffer2); -+ return result; -+} -+ - // Helper for _cairo_win32_printing_surface_show_glyphs to create a win32 equivalent - // of a dwrite scaled_font so that we can print using ExtTextOut instead of drawing - // paths or blitting glyph bitmaps. - cairo_int_status_t - _cairo_dwrite_scaled_font_create_win32_scaled_font (cairo_scaled_font_t *scaled_font, - cairo_scaled_font_t **new_font) - { - if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_DWRITE) { -@@ -1528,19 +1572,18 @@ cairo_int_status_t - &ctm, - &options); - cairo_font_face_destroy (win32_face); - - if (!font) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - -- if (_cairo_win32_scaled_font_is_type1 (font) || _cairo_win32_scaled_font_is_bitmap (font)) { -- // If we somehow got a Type1 or bitmap font, it can't be the same physical font -- // as directwrite was using, so glyph IDs will not match; best we can do is to -- // throw it away and fall back on rendering paths or blitting bitmaps instead. -+ if (!_name_tables_match (font, scaled_font)) { -+ // If the font name tables aren't equal, then GDI may have failed to -+ // find the right font and substituted a different font. - cairo_scaled_font_destroy (font); - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - *new_font = font; - return CAIRO_INT_STATUS_SUCCESS; - } -diff --git a/gfx/cairo/cairo/src/cairo-truetype-subset-private.h b/gfx/cairo/cairo/src/cairo-truetype-subset-private.h ---- a/gfx/cairo/cairo/src/cairo-truetype-subset-private.h -+++ b/gfx/cairo/cairo/src/cairo-truetype-subset-private.h -@@ -34,16 +34,18 @@ - * Adrian Johnson <ajohnson@redneon.com> - */ - - #ifndef CAIRO_TRUETYPE_SUBSET_PRIVATE_H - #define CAIRO_TRUETYPE_SUBSET_PRIVATE_H - - #include "cairoint.h" - -+CAIRO_BEGIN_DECLS -+ - #if CAIRO_HAS_FONT_SUBSET - - /* The structs defined here should strictly follow the TrueType - * specification and not be padded. We use only 16-bit integer - * in their definition to guarantee that. The fields of type - * "FIXED" in the TT spec are broken into two *_1 and *_2 16-bit - * parts, and 64-bit members are broken into four. - * -@@ -191,9 +193,11 @@ typedef struct _tt_composite_glyph { - typedef struct _tt_glyph_data { - int16_t num_contours; - int8_t data[8]; - tt_composite_glyph_t glyph; - } tt_glyph_data_t; - - #endif /* CAIRO_HAS_FONT_SUBSET */ - -+CAIRO_END_DECLS -+ - #endif /* CAIRO_TRUETYPE_SUBSET_PRIVATE_H */ diff --git a/gfx/cairo/dwrite-glyph-extents.patch b/gfx/cairo/dwrite-glyph-extents.patch deleted file mode 100644 index d3625e198..000000000 --- a/gfx/cairo/dwrite-glyph-extents.patch +++ /dev/null @@ -1,44 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp ---- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp -+++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp -@@ -582,22 +582,37 @@ _cairo_dwrite_scaled_font_init_glyph_met - DWRITE_FONT_METRICS fontMetrics; - font_face->dwriteface->GetMetrics(&fontMetrics); - HRESULT hr = font_face->dwriteface->GetDesignGlyphMetrics(&charIndex, 1, &metrics); - if (FAILED(hr)) { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - // TODO: Treat swap_xy. -- extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / fontMetrics.designUnitsPerEm; -- extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / fontMetrics.designUnitsPerEm; -+ extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / -+ fontMetrics.designUnitsPerEm; -+ extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / -+ fontMetrics.designUnitsPerEm; - extents.x_advance = (FLOAT)metrics.advanceWidth / fontMetrics.designUnitsPerEm; - extents.x_bearing = (FLOAT)metrics.leftSideBearing / fontMetrics.designUnitsPerEm; - extents.y_advance = 0.0; -- extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / fontMetrics.designUnitsPerEm; -+ extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / -+ fontMetrics.designUnitsPerEm; -+ -+ // We pad the extents here because GetDesignGlyphMetrics returns "ideal" metrics -+ // for the glyph outline, without accounting for hinting/gridfitting/antialiasing, -+ // and therefore it does not always cover all pixels that will actually be touched. -+ if (scaled_font->base.options.antialias != CAIRO_ANTIALIAS_NONE && -+ extents.width > 0 && extents.height > 0) { -+ extents.width += scaled_font->mat_inverse.xx * 2; -+ extents.x_bearing -= scaled_font->mat_inverse.xx; -+ extents.height += scaled_font->mat_inverse.yy * 2; -+ extents.y_bearing -= scaled_font->mat_inverse.yy; -+ } -+ - _cairo_scaled_glyph_set_metrics (scaled_glyph, - &scaled_font->base, - &extents); - return CAIRO_INT_STATUS_SUCCESS; - } - - /** - * Stack-based helper implementing IDWriteGeometrySink. diff --git a/gfx/cairo/empty-clip-extents.patch b/gfx/cairo/empty-clip-extents.patch deleted file mode 100644 index 306a61ad6..000000000 --- a/gfx/cairo/empty-clip-extents.patch +++ /dev/null @@ -1,59 +0,0 @@ -From b79ea8a6cab8bd28aebecf6e1e8229d5ac017264 Mon Sep 17 00:00:00 2001 -From: Karl Tomlinson <karlt+@karlt.net> -Date: Fri, 16 Jul 2010 23:46:25 +0000 -Subject: clip: consider all_clipped in _cairo_clip_get_extents - -If the gstate clip in _cairo_gstate_int_clip_extents() has all_clipped -set (and path NULL), then it returns the gstate target extents instead of -an empty rectangle. If the target is infinite, then it says the clip is -unbounded. - -Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29124 -Tested-by test/get-clip - -Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> ---- -diff --git a/src/cairo-clip.c b/src/cairo-clip.c -index f6173c6..77d8214 100644 ---- a/src/cairo-clip.c -+++ b/src/cairo-clip.c -@@ -1264,9 +1264,14 @@ _cairo_clip_combine_with_surface (cairo_clip_t *clip, - return CAIRO_STATUS_SUCCESS; - } - -+static const cairo_rectangle_int_t _cairo_empty_rectangle_int = { 0, 0, 0, 0 }; -+ - const cairo_rectangle_int_t * - _cairo_clip_get_extents (const cairo_clip_t *clip) - { -+ if (clip->all_clipped) -+ return &_cairo_empty_rectangle_int; -+ - if (clip->path == NULL) - return NULL; - -diff --git a/test/get-clip.c b/test/get-clip.c -index 9d6e796..f0477a1 100644 ---- a/test/get-clip.c -+++ b/test/get-clip.c -@@ -83,6 +83,8 @@ check_clip_extents (const cairo_test_context_t *ctx, - cairo_clip_extents (cr, &ext_x1, &ext_y1, &ext_x2, &ext_y2); - if (ext_x1 == x && ext_y1 == y && ext_x2 == x + width && ext_y2 == y + height) - return 1; -+ if (width == 0.0 && height == 0.0 && ext_x1 == ext_x2 && ext_y1 == ext_y2) -+ return 1; - cairo_test_log (ctx, "Error: %s; clip extents %f,%f,%f,%f should be %f,%f,%f,%f\n", - message, ext_x1, ext_y1, ext_x2 - ext_x1, ext_y2 - ext_y1, - x, y, width, height); -@@ -138,7 +140,8 @@ preamble (cairo_test_context_t *ctx) - cairo_save (cr); - cairo_clip (cr); - rectangle_list = cairo_copy_clip_rectangle_list (cr); -- if (! check_count (ctx, phase, rectangle_list, 0)) -+ if (! check_count (ctx, phase, rectangle_list, 0) || -+ ! check_clip_extents (ctx, phase, cr, 0, 0, 0, 0)) - { - goto FAIL; - } --- -cgit v0.8.3-6-g21f6 diff --git a/gfx/cairo/empty-clip-rectangles.patch b/gfx/cairo/empty-clip-rectangles.patch deleted file mode 100644 index c9aa558a2..000000000 --- a/gfx/cairo/empty-clip-rectangles.patch +++ /dev/null @@ -1,28 +0,0 @@ -From f2fa15680ec3ac95cb68d4957557f06561a7dc55 Mon Sep 17 00:00:00 2001 -From: Karl Tomlinson <karlt+@karlt.net> -Date: Fri, 16 Jul 2010 22:39:50 +0000 -Subject: clip: return empty clip from _cairo_clip_copy_rectangle_list when all_clipped - -Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29122 -Tested by test/get-clip - -Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> ---- -diff --git a/src/cairo-clip.c b/src/cairo-clip.c -index 12dc04d..f6173c6 100644 ---- a/src/cairo-clip.c -+++ b/src/cairo-clip.c -@@ -1499,7 +1499,10 @@ _cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate) - int n_rects = 0; - int i; - -- if (clip != NULL && clip->path != NULL) { -+ if (clip->all_clipped) -+ goto DONE; -+ -+ if (clip->path != NULL) { - status = _cairo_clip_get_region (clip, ®ion); - if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { - goto DONE; --- -cgit v0.8.3-6-g21f6 diff --git a/gfx/cairo/ensure-text-flushed.patch b/gfx/cairo/ensure-text-flushed.patch deleted file mode 100644 index 5ec578fe5..000000000 --- a/gfx/cairo/ensure-text-flushed.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-pdf-operators.c b/gfx/cairo/cairo/src/cairo-pdf-operators.c ---- a/gfx/cairo/cairo/src/cairo-pdf-operators.c -+++ b/gfx/cairo/cairo/src/cairo-pdf-operators.c -@@ -480,6 +480,12 @@ _cairo_pdf_operators_clip (cairo_pdf_ope - const char *pdf_operator; - cairo_status_t status; - -+ if (pdf_operators->in_text_object) { -+ status = _cairo_pdf_operators_end_text (pdf_operators); -+ if (unlikely (status)) -+ return status; -+ } -+ - if (! path->has_current_point) { - /* construct an empty path */ - _cairo_output_stream_printf (pdf_operators->stream, "0 0 m "); diff --git a/gfx/cairo/expose-snapshot.patch b/gfx/cairo/expose-snapshot.patch deleted file mode 100644 index 879b1fc90..000000000 --- a/gfx/cairo/expose-snapshot.patch +++ /dev/null @@ -1,528 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-analysis-surface-private.h b/gfx/cairo/cairo/src/cairo-analysis-surface-private.h ---- a/gfx/cairo/cairo/src/cairo-analysis-surface-private.h -+++ b/gfx/cairo/cairo/src/cairo-analysis-surface-private.h -@@ -65,14 +65,11 @@ _cairo_analysis_surface_has_unsupported - cairo_private void - _cairo_analysis_surface_get_bounding_box (cairo_surface_t *surface, - cairo_box_t *bbox); - - cairo_private cairo_int_status_t - _cairo_analysis_surface_merge_status (cairo_int_status_t status_a, - cairo_int_status_t status_b); - --cairo_private cairo_surface_t * --_cairo_null_surface_create (cairo_content_t content); -- - CAIRO_END_DECLS - - #endif /* CAIRO_ANALYSIS_SURFACE_H */ -diff --git a/gfx/cairo/cairo/src/cairo-analysis-surface.c b/gfx/cairo/cairo/src/cairo-analysis-surface.c ---- a/gfx/cairo/cairo/src/cairo-analysis-surface.c -+++ b/gfx/cairo/cairo/src/cairo-analysis-surface.c -@@ -902,17 +902,17 @@ static const cairo_surface_backend_t cai - NULL, /* fill_stroke */ - NULL, /* create_solid_pattern_surface */ - NULL, /* can_repaint_solid_pattern_surface */ - NULL, /* has_show_text_glyphs */ - NULL /* show_text_glyphs */ - }; - - cairo_surface_t * --_cairo_null_surface_create (cairo_content_t content) -+cairo_null_surface_create (cairo_content_t content) - { - cairo_surface_t *surface; - - surface = malloc (sizeof (cairo_surface_t)); - if (unlikely (surface == NULL)) { - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); - } - -diff --git a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp ---- a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp -+++ b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp -@@ -1951,24 +1951,24 @@ _cairo_d2d_create_brush_for_pattern(cair - rect = D2D1::RectU(1, 1, srcSurf->width + 1, srcSurf->height + 1); - } else { - rect = D2D1::RectU(0, 0, srcSurf->width, srcSurf->height); - } - sourceBitmap->CopyFromMemory(&rect, - srcSurf->data, - srcSurf->stride); - cairo_surface_t *nullSurf = -- _cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); -+ cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); - cachebitmap->refs++; - cachebitmap->dirty = false; - cairo_surface_set_user_data(nullSurf, - &bitmap_key_snapshot, - cachebitmap, - NULL); -- _cairo_surface_attach_snapshot(surfacePattern->surface, -+ cairo_surface_attach_snapshot(surfacePattern->surface, - nullSurf, - _d2d_snapshot_detached); - } - } else { - if (pattern->extend != CAIRO_EXTEND_NONE) { - d2dsurf->rt->CreateBitmap(D2D1::SizeU(width, height), - data + yoffset * stride + xoffset * Bpp, - stride, -@@ -2015,22 +2015,22 @@ _cairo_d2d_create_brush_for_pattern(cair - * and one more in the user data structure. - */ - cachebitmap->refs = 2; - cairo_surface_set_user_data(surfacePattern->surface, - key, - cachebitmap, - _d2d_release_bitmap); - cairo_surface_t *nullSurf = -- _cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); -+ cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); - cairo_surface_set_user_data(nullSurf, - &bitmap_key_snapshot, - cachebitmap, - NULL); -- _cairo_surface_attach_snapshot(surfacePattern->surface, -+ cairo_surface_attach_snapshot(surfacePattern->surface, - nullSurf, - _d2d_snapshot_detached); - cache_usage += _d2d_compute_bitmap_mem_size(sourceBitmap); - } - if (pix_image) { - pixman_image_unref(pix_image); - } - } -diff --git a/gfx/cairo/cairo/src/cairo-recording-surface.c b/gfx/cairo/cairo/src/cairo-recording-surface.c ---- a/gfx/cairo/cairo/src/cairo-recording-surface.c -+++ b/gfx/cairo/cairo/src/cairo-recording-surface.c -@@ -276,17 +276,17 @@ _cairo_recording_surface_acquire_source_ - -surface->extents.y); - - status = _cairo_recording_surface_replay (&surface->base, image); - if (unlikely (status)) { - cairo_surface_destroy (image); - return status; - } - -- _cairo_surface_attach_snapshot (&surface->base, image, NULL); -+ cairo_surface_attach_snapshot (&surface->base, image, NULL); - - *image_out = (cairo_image_surface_t *) image; - *image_extra = NULL; - return CAIRO_STATUS_SUCCESS; - } - - static void - _cairo_recording_surface_release_source_image (void *abstract_surface, -@@ -1046,17 +1046,17 @@ static cairo_status_t - _recording_surface_get_ink_bbox (cairo_recording_surface_t *surface, - cairo_box_t *bbox, - const cairo_matrix_t *transform) - { - cairo_surface_t *null_surface; - cairo_surface_t *analysis_surface; - cairo_status_t status; - -- null_surface = _cairo_null_surface_create (surface->content); -+ null_surface = cairo_null_surface_create (surface->content); - analysis_surface = _cairo_analysis_surface_create (null_surface); - cairo_surface_destroy (null_surface); - - status = analysis_surface->status; - if (unlikely (status)) - return status; - - if (transform != NULL) -diff --git a/gfx/cairo/cairo/src/cairo-surface-private.h b/gfx/cairo/cairo/src/cairo-surface-private.h ---- a/gfx/cairo/cairo/src/cairo-surface-private.h -+++ b/gfx/cairo/cairo/src/cairo-surface-private.h -@@ -40,18 +40,16 @@ - - #include "cairo.h" - - #include "cairo-types-private.h" - #include "cairo-list-private.h" - #include "cairo-reference-count-private.h" - #include "cairo-clip-private.h" - --typedef void (*cairo_surface_func_t) (cairo_surface_t *); -- - struct _cairo_surface { - const cairo_surface_backend_t *backend; - cairo_device_t *device; - - /* We allow surfaces to override the backend->type by shoving something - * else into surface->type. This is for "wrapper" surfaces that want to - * hide their internal type from the user-level API. */ - cairo_surface_type_t type; -diff --git a/gfx/cairo/cairo/src/cairo-surface-snapshot.c b/gfx/cairo/cairo/src/cairo-surface-snapshot.c ---- a/gfx/cairo/cairo/src/cairo-surface-snapshot.c -+++ b/gfx/cairo/cairo/src/cairo-surface-snapshot.c -@@ -209,17 +209,17 @@ _cairo_surface_snapshot (cairo_surface_t - if (unlikely (status)) { - cairo_surface_destroy (snap); - return _cairo_surface_create_in_error (status); - } - - snap->device_transform = surface->device_transform; - snap->device_transform_inverse = surface->device_transform_inverse; - -- _cairo_surface_attach_snapshot (surface, snap, NULL); -+ cairo_surface_attach_snapshot (surface, snap, NULL); - - return snap; - } - } - - snapshot = (cairo_surface_snapshot_t *) - _cairo_surface_has_snapshot (surface, &_cairo_surface_snapshot_backend); - if (snapshot != NULL) -@@ -242,14 +242,14 @@ _cairo_surface_snapshot (cairo_surface_t - if (unlikely (status)) { - cairo_surface_destroy (&snapshot->base); - return _cairo_surface_create_in_error (status); - } - - snapshot->base.device_transform = surface->device_transform; - snapshot->base.device_transform_inverse = surface->device_transform_inverse; - -- _cairo_surface_attach_snapshot (surface, -+ cairo_surface_attach_snapshot (surface, - &snapshot->base, - _cairo_surface_snapshot_copy_on_write); - - return &snapshot->base; - } -diff --git a/gfx/cairo/cairo/src/cairo-surface-subsurface.c b/gfx/cairo/cairo/src/cairo-surface-subsurface.c ---- a/gfx/cairo/cairo/src/cairo-surface-subsurface.c -+++ b/gfx/cairo/cairo/src/cairo-surface-subsurface.c -@@ -326,17 +326,17 @@ _cairo_surface_subsurface_acquire_source - _cairo_image_surface_create_with_content (meta->content, - surface->extents.width, - surface->extents.height); - if (unlikely (image->base.status)) - return image->base.status; - - cairo_surface_paint_to_target (&image->base, surface); - -- _cairo_surface_attach_snapshot (&surface->base, &image->base, NULL); -+ cairo_surface_attach_snapshot (&surface->base, &image->base, NULL); - - *image_out = image; - *extra_out = NULL; - return CAIRO_STATUS_SUCCESS; - } - } - - extra = malloc (sizeof (struct extra)); -diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c ---- a/gfx/cairo/cairo/src/cairo-surface.c -+++ b/gfx/cairo/cairo/src/cairo-surface.c -@@ -305,51 +305,51 @@ _cairo_surface_detach_mime_data (cairo_s - if (! _cairo_surface_has_mime_data (surface)) - return; - - _cairo_user_data_array_fini (&surface->mime_data); - _cairo_user_data_array_init (&surface->mime_data); - } - - static void --_cairo_surface_detach_snapshots (cairo_surface_t *surface) -+cairo_surface_detach_snapshots (cairo_surface_t *surface) - { - while (_cairo_surface_has_snapshots (surface)) { -- _cairo_surface_detach_snapshot (cairo_list_first_entry (&surface->snapshots, -+ cairo_surface_detach_snapshot (cairo_list_first_entry (&surface->snapshots, - cairo_surface_t, - snapshot)); - } - } - - void --_cairo_surface_detach_snapshot (cairo_surface_t *snapshot) -+cairo_surface_detach_snapshot (cairo_surface_t *snapshot) - { - assert (snapshot->snapshot_of != NULL); - - snapshot->snapshot_of = NULL; - cairo_list_del (&snapshot->snapshot); - - if (snapshot->snapshot_detach != NULL) - snapshot->snapshot_detach (snapshot); - - cairo_surface_destroy (snapshot); - } - - void --_cairo_surface_attach_snapshot (cairo_surface_t *surface, -+cairo_surface_attach_snapshot (cairo_surface_t *surface, - cairo_surface_t *snapshot, - cairo_surface_func_t detach_func) - { - assert (surface != snapshot); - assert (snapshot->snapshot_of != surface); - - cairo_surface_reference (snapshot); - - if (snapshot->snapshot_of != NULL) -- _cairo_surface_detach_snapshot (snapshot); -+ cairo_surface_detach_snapshot (snapshot); - - snapshot->snapshot_of = surface; - snapshot->snapshot_detach = detach_func; - - cairo_list_add (&snapshot->snapshot, &surface->snapshots); - - assert (_cairo_surface_has_snapshot (surface, snapshot->backend) == snapshot); - } -@@ -382,17 +382,17 @@ _cairo_surface_is_writable (cairo_surfac - - static void - _cairo_surface_begin_modification (cairo_surface_t *surface) - { - assert (surface->status == CAIRO_STATUS_SUCCESS); - assert (! surface->finished); - assert (surface->snapshot_of == NULL); - -- _cairo_surface_detach_snapshots (surface); -+ cairo_surface_detach_snapshots (surface); - _cairo_surface_detach_mime_data (surface); - } - - void - _cairo_surface_init (cairo_surface_t *surface, - const cairo_surface_backend_t *backend, - cairo_device_t *device, - cairo_content_t content) -@@ -711,19 +711,19 @@ cairo_surface_finish (cairo_surface_t *s - - if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) - return; - - if (surface->finished) - return; - - /* update the snapshots *before* we declare the surface as finished */ -- _cairo_surface_detach_snapshots (surface); -+ cairo_surface_detach_snapshots (surface); - if (surface->snapshot_of != NULL) -- _cairo_surface_detach_snapshot (surface); -+ cairo_surface_detach_snapshot (surface); - - cairo_surface_flush (surface); - surface->finished = TRUE; - - /* call finish even if in error mode */ - if (surface->backend->finish) { - status = surface->backend->finish (surface); - if (unlikely (status)) -@@ -1106,17 +1106,17 @@ cairo_surface_flush (cairo_surface_t *su - - if (surface->status) - return; - - if (surface->finished) - return; - - /* update the current snapshots *before* the user updates the surface */ -- _cairo_surface_detach_snapshots (surface); -+ cairo_surface_detach_snapshots (surface); - - if (surface->backend->flush) { - status = surface->backend->flush (surface); - if (unlikely (status)) - status = _cairo_surface_set_error (surface, status); - } - } - slim_hidden_def (cairo_surface_flush); -@@ -1628,17 +1628,17 @@ _cairo_recording_surface_clone_similar ( - return similar->status; - - status = _cairo_recording_surface_replay (src, similar); - if (unlikely (status)) { - cairo_surface_destroy (similar); - return status; - } - -- _cairo_surface_attach_snapshot (src, similar, NULL); -+ cairo_surface_attach_snapshot (src, similar, NULL); - - src_x = src_y = 0; - } - - *clone_out = similar; - *clone_offset_x = src_x; - *clone_offset_y = src_y; - return CAIRO_STATUS_SUCCESS; -diff --git a/gfx/cairo/cairo/src/cairo-vg-surface.c b/gfx/cairo/cairo/src/cairo-vg-surface.c ---- a/gfx/cairo/cairo/src/cairo-vg-surface.c -+++ b/gfx/cairo/cairo/src/cairo-vg-surface.c -@@ -977,17 +977,17 @@ _vg_setup_surface_source (cairo_vg_conte - status = _cairo_cache_insert (&context->snapshot_cache, - &clone->snapshot_cache_entry); - if (unlikely (status)) { - clone->snapshot_cache_entry.hash = 0; - cairo_surface_destroy (&clone->base); - return status; - } - -- _cairo_surface_attach_snapshot (spat->surface, &clone->base, -+ cairo_surface_attach_snapshot (spat->surface, &clone->base, - _vg_surface_remove_from_cache); - - DONE: - cairo_surface_destroy (&context->source->base); - context->source = clone; - - vgSetParameteri (context->paint, VG_PAINT_TYPE, VG_PAINT_TYPE_PATTERN); - -diff --git a/gfx/cairo/cairo/src/cairo-xcb-surface.c b/gfx/cairo/cairo/src/cairo-xcb-surface.c ---- a/gfx/cairo/cairo/src/cairo-xcb-surface.c -+++ b/gfx/cairo/cairo/src/cairo-xcb-surface.c -@@ -560,17 +560,17 @@ _cairo_xcb_surface_acquire_source_image - image = (cairo_image_surface_t *) cairo_surface_reference (&image->base); - goto DONE; - } - - status = _get_image (surface, FALSE, &image); - if (unlikely (status)) - return status; - -- _cairo_surface_attach_snapshot (&surface->base, &image->base, NULL); -+ cairo_surface_attach_snapshot (&surface->base, &image->base, NULL); - - DONE: - *image_out = image; - *image_extra = NULL; - return CAIRO_STATUS_SUCCESS; - } - - static void -@@ -713,17 +713,17 @@ _cairo_xcb_surface_flush (void *abstract - status = cairo_surface_status (surface->fallback); - - if (status == CAIRO_STATUS_SUCCESS) { - status = _put_image (surface, - (cairo_image_surface_t *) surface->fallback); - } - - if (status == CAIRO_STATUS_SUCCESS) { -- _cairo_surface_attach_snapshot (&surface->base, -+ cairo_surface_attach_snapshot (&surface->base, - surface->fallback, - cairo_surface_finish); - } - } - - cairo_surface_destroy (surface->fallback); - surface->fallback = NULL; - -diff --git a/gfx/cairo/cairo/src/cairo.h b/gfx/cairo/cairo/src/cairo.h ---- a/gfx/cairo/cairo/src/cairo.h -+++ b/gfx/cairo/cairo/src/cairo.h -@@ -214,16 +214,25 @@ typedef struct _cairo_pattern cairo_patt - * - * #cairo_destroy_func_t the type of function which is called when a - * data element is destroyed. It is passed the pointer to the data - * element and should free any memory and resources allocated for it. - **/ - typedef void (*cairo_destroy_func_t) (void *data); - - /** -+ * cairo_surface_func_t: -+ * @surface: The surface being referred to. -+ * -+ * #cairo_surface_func_t the type of function which is used for callback -+ * when a surface needs to be apssed as a parameter. -+ */ -+typedef void (*cairo_surface_func_t) (cairo_surface_t *surface); -+ -+/** - * cairo_user_data_key_t: - * @unused: not used; ignore. - * - * #cairo_user_data_key_t is used for attaching user data to cairo - * data structures. The actual contents of the struct is never used, - * and there is no need to initialize the object; only the unique - * address of a #cairo_data_key_t object is used. Typically, you - * would just use the address of a static #cairo_data_key_t object. -@@ -2150,16 +2159,24 @@ cairo_surface_get_user_data (cairo_surfa - const cairo_user_data_key_t *key); - - cairo_public cairo_status_t - cairo_surface_set_user_data (cairo_surface_t *surface, - const cairo_user_data_key_t *key, - void *user_data, - cairo_destroy_func_t destroy); - -+cairo_public void -+cairo_surface_attach_snapshot (cairo_surface_t *surface, -+ cairo_surface_t *snapshot, -+ cairo_surface_func_t detach_func); -+ -+cairo_public void -+cairo_surface_detach_snapshot (cairo_surface_t *snapshot); -+ - #define CAIRO_MIME_TYPE_JPEG "image/jpeg" - #define CAIRO_MIME_TYPE_PNG "image/png" - #define CAIRO_MIME_TYPE_JP2 "image/jp2" - #define CAIRO_MIME_TYPE_URI "text/x-uri" - - cairo_public void - cairo_surface_get_mime_data (cairo_surface_t *surface, - const char *mime_type, -@@ -2328,16 +2345,21 @@ cairo_recording_surface_create (cairo_co - - cairo_public void - cairo_recording_surface_ink_extents (cairo_surface_t *surface, - double *x0, - double *y0, - double *width, - double *height); - -+/* Null-surface functions */ -+ -+cairo_public cairo_surface_t * -+cairo_null_surface_create (cairo_content_t content); -+ - /* Pattern creation functions */ - - cairo_public cairo_pattern_t * - cairo_pattern_create_rgb (double red, double green, double blue); - - cairo_public cairo_pattern_t * - cairo_pattern_create_rgba (double red, double green, double blue, - double alpha); -diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h ---- a/gfx/cairo/cairo/src/cairoint.h -+++ b/gfx/cairo/cairo/src/cairoint.h -@@ -1770,27 +1770,19 @@ _cairo_surface_clone_similar (cairo_surf - int height, - int *clone_offset_x, - int *clone_offset_y, - cairo_surface_t **clone_out); - - cairo_private cairo_surface_t * - _cairo_surface_snapshot (cairo_surface_t *surface); - --cairo_private void --_cairo_surface_attach_snapshot (cairo_surface_t *surface, -- cairo_surface_t *snapshot, -- cairo_surface_func_t detach_func); -- - cairo_private cairo_surface_t * - _cairo_surface_has_snapshot (cairo_surface_t *surface, -- const cairo_surface_backend_t *backend); -- --cairo_private void --_cairo_surface_detach_snapshot (cairo_surface_t *snapshot); -+ const cairo_surface_backend_t *backend); - - cairo_private cairo_bool_t - _cairo_surface_is_similar (cairo_surface_t *surface_a, - cairo_surface_t *surface_b); - - cairo_private cairo_bool_t - _cairo_surface_get_extents (cairo_surface_t *surface, - cairo_rectangle_int_t *extents); diff --git a/gfx/cairo/fix-build-with-Werror=return-type.patch b/gfx/cairo/fix-build-with-Werror=return-type.patch deleted file mode 100644 index 7cd77a597..000000000 --- a/gfx/cairo/fix-build-with-Werror=return-type.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -436,16 +436,17 @@ _cairo_quartz_cairo_operator_to_quartz_c - case CAIRO_OPERATOR_DIFFERENCE: - case CAIRO_OPERATOR_EXCLUSION: - case CAIRO_OPERATOR_HSL_HUE: - case CAIRO_OPERATOR_HSL_SATURATION: - case CAIRO_OPERATOR_HSL_COLOR: - case CAIRO_OPERATOR_HSL_LUMINOSITY: - default: - assert (0); -+ return kPrivateCGCompositeClear; - } - } - - static cairo_int_status_t - _cairo_quartz_surface_set_cairo_operator (cairo_quartz_surface_t *surface, cairo_operator_t op) - { - ND((stderr, "%p _cairo_quartz_surface_set_cairo_operator %d\n", surface, op)); - diff --git a/gfx/cairo/fix-cairo-surface-wrapper-flush-build-warning.patch b/gfx/cairo/fix-cairo-surface-wrapper-flush-build-warning.patch deleted file mode 100644 index 0e7c0b973..000000000 --- a/gfx/cairo/fix-cairo-surface-wrapper-flush-build-warning.patch +++ /dev/null @@ -1,19 +0,0 @@ -# HG changeset patch -# Parent 5479a346b95b82162c72419a95cbb4022cbbfe4d -# User Ed Morley <bmo@edmorley.co.uk> -Bug 631155 - undefined return value in function '_cairo_surface_wrapper_flush'; r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-surface-wrapper.c b/gfx/cairo/cairo/src/cairo-surface-wrapper.c ---- a/gfx/cairo/cairo/src/cairo-surface-wrapper.c -+++ b/gfx/cairo/cairo/src/cairo-surface-wrapper.c -@@ -712,9 +712,10 @@ _cairo_surface_wrapper_fini (cairo_surfa - } - - cairo_status_t - _cairo_surface_wrapper_flush (cairo_surface_wrapper_t *wrapper) - { - if (wrapper->target->backend->flush) { - return wrapper->target->backend->flush(wrapper->target); - } -+ return CAIRO_STATUS_SUCCESS; - } diff --git a/gfx/cairo/fix-cairo-win32-print-gdi-error.diff b/gfx/cairo/fix-cairo-win32-print-gdi-error.diff deleted file mode 100644 index 9387a87af..000000000 --- a/gfx/cairo/fix-cairo-win32-print-gdi-error.diff +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -95,20 +95,21 @@ _cairo_win32_print_gdi_error (const char - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - last_error, - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPSTR) &lpMsgBuf, - 0, NULL)) { - fprintf (stderr, "%s: Unknown GDI error", context); - } else { -- fwprintf (stderr, "%S: %s", context, (char *)lpMsgBuf); -+ fprintf (stderr, "%s: %S", context, (char *)lpMsgBuf); - - LocalFree (lpMsgBuf); - } -+ fflush(stderr); - - /* We should switch off of last_status, but we'd either return - * CAIRO_STATUS_NO_MEMORY or CAIRO_STATUS_UNKNOWN_ERROR and there - * is no CAIRO_STATUS_UNKNOWN_ERROR. - */ - - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - } diff --git a/gfx/cairo/fix-clip-copy.patch b/gfx/cairo/fix-clip-copy.patch deleted file mode 100644 index c2c3b2fc8..000000000 --- a/gfx/cairo/fix-clip-copy.patch +++ /dev/null @@ -1,30 +0,0 @@ -commit f49a9740350d2f0d69ed59e913f0263a899cfb2a -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Fri Jan 29 14:39:24 2010 -0500 - - Fix clip copy - -diff --git a/src/cairo-clip.c b/src/cairo-clip.c -index 8d66a5f..6acbcff 100644 ---- a/src/cairo-clip.c -+++ b/src/cairo-clip.c -@@ -280,13 +280,12 @@ cairo_clip_t * - _cairo_clip_init_copy (cairo_clip_t *clip, cairo_clip_t *other) - { - if (other != NULL) { -- if (other->path == NULL) { -- _cairo_clip_init (clip); -- clip = NULL; -- } else { -- clip->all_clipped = other->all_clipped; -- clip->path = _cairo_clip_path_reference (other->path); -- } -+ clip->all_clipped = other->all_clipped; -+ clip->path = _cairo_clip_path_reference (other->path); -+ -+ /* this guy is here because of the weird return semantics of _cairo_clip_init_copy */ -+ if (!other->path) -+ return NULL; - } else { - _cairo_clip_init (clip); - } diff --git a/gfx/cairo/fix-clip-region-simplification.patch b/gfx/cairo/fix-clip-region-simplification.patch deleted file mode 100644 index 825130a2e..000000000 --- a/gfx/cairo/fix-clip-region-simplification.patch +++ /dev/null @@ -1 +0,0 @@ -stg show: fix-clip-region-simplication: Unknown patch or revision name diff --git a/gfx/cairo/fix-clip-test.patch b/gfx/cairo/fix-clip-test.patch deleted file mode 100644 index 9987b48bf..000000000 --- a/gfx/cairo/fix-clip-test.patch +++ /dev/null @@ -1,15 +0,0 @@ -Fix a clip test to test the right coordinate. - -Fixed upstream by 498c10032ea3f8631a928cd7df96766f2c8ddca4 -diff --git a/gfx/cairo/cairo/src/cairo-clip.c b/gfx/cairo/cairo/src/cairo-clip.c ---- a/gfx/cairo/cairo/src/cairo-clip.c -+++ b/gfx/cairo/cairo/src/cairo-clip.c -@@ -408,7 +408,7 @@ _cairo_clip_rectangle (cairo_clip_t - /* if a smaller clip has already been set, ignore the new path */ - if (clip->path != NULL) { - if (rectangle->x <= clip->path->extents.x && -- rectangle->y <= clip->path->extents.x && -+ rectangle->y <= clip->path->extents.y && - rectangle->x + rectangle->width >= clip->path->extents.x + clip->path->extents.width && - rectangle->y + rectangle->height >= clip->path->extents.y + clip->path->extents.height) - { diff --git a/gfx/cairo/fix-ps-output.patch b/gfx/cairo/fix-ps-output.patch deleted file mode 100644 index b325f0bc5..000000000 --- a/gfx/cairo/fix-ps-output.patch +++ /dev/null @@ -1,19 +0,0 @@ -# HG changeset patch -# User Jeff Muizelaar <jmuizelaar@mozilla.com> -# Date 1276629019 14400 -# Node ID b5eb246c152dedb895d3010eb7192f88cce51146 -# Parent 792cd3e8aa59b24c333f2c90f938beda361b3336 -cairo: PS: Add missing 'q' when resetting clip path - -diff --git a/gfx/cairo/cairo/src/cairo-ps-surface.c b/gfx/cairo/cairo/src/cairo-ps-surface.c ---- a/gfx/cairo/cairo/src/cairo-ps-surface.c -+++ b/gfx/cairo/cairo/src/cairo-ps-surface.c -@@ -3696,7 +3696,7 @@ _cairo_ps_surface_set_paginated_mode (vo - if (surface->clipper.clip.path != NULL) { - status = _cairo_pdf_operators_flush (&surface->pdf_operators); - -- _cairo_output_stream_printf (surface->stream, "Q\n"); -+ _cairo_output_stream_printf (surface->stream, "Q q\n"); - _cairo_surface_clipper_reset (&surface->clipper); - } - } diff --git a/gfx/cairo/fix-unnecessary-fallback.patch b/gfx/cairo/fix-unnecessary-fallback.patch deleted file mode 100644 index 468801623..000000000 --- a/gfx/cairo/fix-unnecessary-fallback.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c -index 353cbcd..1a053d0 100644 ---- a/src/cairo-xlib-surface.c -+++ b/src/cairo-xlib-surface.c -@@ -1818,7 +1817,8 @@ _recategorize_composite_operation (cairo_xlib_surface_t *dst, - return DO_XTILE; - } - -- if (dst->buggy_repeat && src_attr->extend == CAIRO_EXTEND_REPEAT) -+ if (dst->buggy_repeat && src_attr->extend == CAIRO_EXTEND_REPEAT && -+ (src->width != 1 || src->height != 1)) - return DO_UNSUPPORTED; - - if (! CAIRO_SURFACE_RENDER_HAS_COMPOSITE (src)) diff --git a/gfx/cairo/fix-win32-font-assertion.patch b/gfx/cairo/fix-win32-font-assertion.patch deleted file mode 100644 index 23cc5474b..000000000 --- a/gfx/cairo/fix-win32-font-assertion.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Jonathan Kew <jkew@mozilla.com> -bug 838617 - don't assert equality with the key's hash unless it was actually initialized. r=roc - -diff --git a/gfx/cairo/cairo/src/cairo-win32-font.c b/gfx/cairo/cairo/src/cairo-win32-font.c ---- a/gfx/cairo/cairo/src/cairo-win32-font.c -+++ b/gfx/cairo/cairo/src/cairo-win32-font.c -@@ -2104,19 +2104,19 @@ cairo_win32_font_face_create_for_logfont - font_face = malloc (sizeof (cairo_win32_font_face_t)); - if (!font_face) { - _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); - goto FAIL; - } - - _cairo_win32_font_face_init_key (font_face, logfont, font); - _cairo_font_face_init (&font_face->base, &_cairo_win32_font_face_backend); -- assert (font_face->base.hash_entry.hash == key.base.hash_entry.hash); - - if (!font) { -+ assert (font_face->base.hash_entry.hash == key.base.hash_entry.hash); - status = _cairo_hash_table_insert (hash_table, - &font_face->base.hash_entry); - if (unlikely (status)) - goto FAIL; - } - - DONE: - if (!font) { diff --git a/gfx/cairo/fix-win32-show-glyphs-clipping.patch b/gfx/cairo/fix-win32-show-glyphs-clipping.patch deleted file mode 100644 index 91c5de2e1..000000000 --- a/gfx/cairo/fix-win32-show-glyphs-clipping.patch +++ /dev/null @@ -1,19 +0,0 @@ -commit 25fb70d4dc1e67553dba5973a79902e4cf81341f -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Wed Apr 21 11:23:27 2010 -0400 - - fix show glyphs clipping - -diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c -index c10e134..ff823a3 100644 ---- a/src/cairo-win32-surface.c -+++ b/src/cairo-win32-surface.c -@@ -1603,6 +1603,8 @@ _cairo_win32_surface_show_glyphs (void *surface, - - _cairo_win32_surface_set_clip_region (surface, clip_region); - } -+ } else { -+ _cairo_win32_surface_set_clip_region (surface, NULL); - } - - solid_pattern = (cairo_solid_pattern_t *)source; diff --git a/gfx/cairo/fix-xcopyarea-with-clips.patch b/gfx/cairo/fix-xcopyarea-with-clips.patch deleted file mode 100644 index 6bf3320b6..000000000 --- a/gfx/cairo/fix-xcopyarea-with-clips.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Benjamin Otte <otte@redhat.com> -Date: Thu, 29 Apr 2010 16:20:59 +0000 -Subject: xlib: Don't modify variables that are needed later - -In the XCopyArea region code, don't modify src_x/y when they are later -used in the unbounded fixup code. - -Exposed by composite-integer-translate-source test. ---- -diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c -index bedc3fd..30c08d3 100644 ---- a/gfx/cairo/cairo/src/cairo-xlib-surface.c -+++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c -@@ -2322,10 +2322,10 @@ _cairo_xlib_surface_composite (cairo_operator_t op, - width, height, - dst_x, dst_y); - } else { -- int n, num_rects; -+ int n, num_rects, x, y; - -- src_x += src_attr.x_offset + itx - dst_x; -- src_y += src_attr.y_offset + ity - dst_y; -+ x = src_x + src_attr.x_offset + itx - dst_x; -+ y = src_y + src_attr.y_offset + ity - dst_y; - - num_rects = cairo_region_num_rectangles (clip_region); - for (n = 0; n < num_rects; n++) { -@@ -2333,7 +2333,7 @@ _cairo_xlib_surface_composite (cairo_operator_t op, - - cairo_region_get_rectangle (clip_region, n, &rect); - XCopyArea (dst->dpy, src->drawable, dst->drawable, gc, -- rect.x + src_x, rect.y + src_y, -+ rect.x + x, rect.y + y, - rect.width, rect.height, - rect.x, rect.y); - } --- -cgit v0.8.3-6-g21f6 diff --git a/gfx/cairo/fix-zero-length-gradient.patch b/gfx/cairo/fix-zero-length-gradient.patch deleted file mode 100644 index a920d76e9..000000000 --- a/gfx/cairo/fix-zero-length-gradient.patch +++ /dev/null @@ -1 +0,0 @@ -stg show: fix-zero-len-graident: Unknown patch or revision name diff --git a/gfx/cairo/fixup-unbounded.patch b/gfx/cairo/fixup-unbounded.patch deleted file mode 100644 index 09b3a9069..000000000 --- a/gfx/cairo/fixup-unbounded.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c ---- a/gfx/cairo/cairo/src/cairo-image-surface.c -+++ b/gfx/cairo/cairo/src/cairo-image-surface.c -@@ -1797,17 +1797,17 @@ _cairo_image_surface_fixup_unbounded_box - cairo_boxes_t *boxes) - { - cairo_boxes_t clear; - cairo_box_t box; - cairo_status_t status; - struct _cairo_boxes_chunk *chunk; - int i; - -- if (boxes->num_boxes <= 1 && clip_region == NULL) -+ if (boxes->num_boxes < 1 && clip_region == NULL) - return _cairo_image_surface_fixup_unbounded (dst, extents, NULL); - - _cairo_boxes_init (&clear); - - box.p1.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); - box.p1.y = _cairo_fixed_from_int (extents->unbounded.y); - box.p2.x = _cairo_fixed_from_int (extents->unbounded.x); - box.p2.y = _cairo_fixed_from_int (extents->unbounded.y + extents->unbounded.height); diff --git a/gfx/cairo/ft-no-subpixel-if-surface-disables.patch b/gfx/cairo/ft-no-subpixel-if-surface-disables.patch deleted file mode 100644 index a53e5de2b..000000000 --- a/gfx/cairo/ft-no-subpixel-if-surface-disables.patch +++ /dev/null @@ -1,46 +0,0 @@ -# HG changeset patch -# Parent 31c7eac3de3de324cb5c93bd19c4e16a693f1101 -# User Karl Tomlinson <karlt+@karlt.net> -b=929451 don't use subpixel aa for ft fonts on surfaces that don't support it r?roc - -Also: -* Prefer subpixel order provided by the surface over that from the font face. -* Allow font face options to turn off subpixel aa. - -diff --git a/gfx/cairo/cairo/src/cairo-ft-font.c b/gfx/cairo/cairo/src/cairo-ft-font.c ---- a/gfx/cairo/cairo/src/cairo-ft-font.c -+++ b/gfx/cairo/cairo/src/cairo-ft-font.c -@@ -1759,23 +1759,26 @@ static void - - if (load_flags & FT_LOAD_NO_HINTING) - other->base.hint_style = CAIRO_HINT_STYLE_NONE; - - if (other->base.antialias == CAIRO_ANTIALIAS_NONE || - options->base.antialias == CAIRO_ANTIALIAS_NONE) { - options->base.antialias = CAIRO_ANTIALIAS_NONE; - options->base.subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; -- } -- -- if (other->base.antialias == CAIRO_ANTIALIAS_SUBPIXEL && -- (options->base.antialias == CAIRO_ANTIALIAS_DEFAULT || -- options->base.antialias == CAIRO_ANTIALIAS_GRAY)) { -- options->base.antialias = CAIRO_ANTIALIAS_SUBPIXEL; -- options->base.subpixel_order = other->base.subpixel_order; -+ } else if (options->base.antialias != CAIRO_ANTIALIAS_GRAY) { -+ /* The surface supports subpixel aa, so let the font face options -+ * choose whether to use subpixel aa. If the surface has -+ * CAIRO_ANTIALIAS_GRAY (e.g. PS, PDF, SVG, translucent part of a -+ * CONTENT_COLOR_ALPHA surface), then don't accept subpixel aa. */ -+ if (other->base.antialias != CAIRO_ANTIALIAS_DEFAULT) -+ options->base.antialias = other->base.antialias; -+ /* If the surface knows the subpixel order then use that. */ -+ if (options->base.subpixel_order == CAIRO_SUBPIXEL_ORDER_DEFAULT) -+ options->base.subpixel_order = other->base.subpixel_order; - } - - if (options->base.hint_style == CAIRO_HINT_STYLE_DEFAULT) - options->base.hint_style = other->base.hint_style; - - if (other->base.hint_style == CAIRO_HINT_STYLE_NONE) - options->base.hint_style = CAIRO_HINT_STYLE_NONE; - diff --git a/gfx/cairo/gdi-RGB24-ARGB32.patch b/gfx/cairo/gdi-RGB24-ARGB32.patch deleted file mode 100644 index 1df95f9ac..000000000 --- a/gfx/cairo/gdi-RGB24-ARGB32.patch +++ /dev/null @@ -1,141 +0,0 @@ -changeset: 106848:28db6dbdd9ea -tag: gdi-patch -tag: qbase -tag: qtip -tag: tip -user: Jeff Muizelaar <jmuizelaar@mozilla.com> -date: Wed Sep 12 22:52:06 2012 -0400 -summary: Bug 788794. Use BitBlt to do SOURCE and OVER from RGB24 to ARGB32. r=nical - -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -884,16 +884,28 @@ static cairo_int_status_t - src_x, src_y, - src_w, src_h, - blend_function)) - return _cairo_win32_print_gdi_error ("_cairo_win32_surface_composite(AlphaBlend)"); - - return CAIRO_STATUS_SUCCESS; - } - -+/* makes the alpha channel in a RGB24 surface 0xff */ -+static void -+make_opaque (cairo_image_surface_t *image, cairo_rectangle_int_t src_r) -+{ -+ int x; int y; -+ for (y = src_r.y; y < src_r.height; y++) { -+ for (x = src_r.x; x < src_r.width; x++) { -+ image->data[y * image->stride + x*4 + 3] = 0xff; -+ } -+ } -+} -+ - static cairo_int_status_t - _cairo_win32_surface_composite_inner (cairo_win32_surface_t *src, - cairo_image_surface_t *src_image, - cairo_win32_surface_t *dst, - cairo_rectangle_int_t src_extents, - cairo_rectangle_int_t src_r, - cairo_rectangle_int_t dst_r, - int alpha, -@@ -935,16 +947,24 @@ static cairo_int_status_t - src_r.width, - (int) src_r.height, - src_image->data, - &bi, - DIB_RGB_COLORS, - SRCCOPY)) - return _cairo_win32_print_gdi_error ("_cairo_win32_surface_composite(StretchDIBits)"); - } - } else if (!needs_alpha) { -+ if (src->format == CAIRO_FORMAT_RGB24 && dst->format == CAIRO_FORMAT_ARGB32) { -+ /* Because we store RGB24 & ARGB32 in the same way GDI has no way -+ * to ignore the alpha channel from a RGB24 source. Therefore, we set -+ * the alpha channel in our RGB24 source to opaque so that we can treat -+ * it like ARGB32. */ -+ GdiFlush(); -+ make_opaque(src->image, src_r); -+ } - /* BitBlt or StretchBlt? */ - if (!needs_scale && (dst->flags & CAIRO_WIN32_SURFACE_CAN_BITBLT)) { - if (!BitBlt (dst->dc, - dst_r.x, dst_r.y, - dst_r.width, dst_r.height, - src->dc, - src_r.x, src_r.y, - SRCCOPY)) -@@ -1184,28 +1204,36 @@ static cairo_int_status_t - } - } else { - needs_repeat = TRUE; - } - - /* - * Operations that we can do: - * -+ * AlphaBlend uses the following formula for alpha when not use the per-pixel alpha (AlphaFormat = 0) -+ * Dst.Alpha = Src.Alpha * (SCA/255.0) + Dst.Alpha * (1.0 - (SCA/255.0)) -+ * This turns into Dst.Alpha = Src.Alpha when SCA = 255. -+ * (http://msdn.microsoft.com/en-us/library/aa921335.aspx) -+ * - * RGB OVER RGB -> BitBlt (same as SOURCE) -- * RGB OVER ARGB -> UNSUPPORTED (AlphaBlend treats this as a BitBlt, even with SCA 255 and no AC_SRC_ALPHA) -+ * RGB OVER ARGB -> Partially supported, We convert this operation into a ARGB SOURCE ARGB -+ * by setting the alpha values of the source to 255. - * ARGB OVER ARGB -> AlphaBlend, with AC_SRC_ALPHA - * ARGB OVER RGB -> AlphaBlend, with AC_SRC_ALPHA; we'll have junk in the dst A byte - * - * RGB OVER RGB + mask -> AlphaBlend, no AC_SRC_ALPHA -- * RGB OVER ARGB + mask -> UNSUPPORTED -+ * RGB OVER ARGB + mask -> Partially supported, We convert this operation into a ARGB OVER ARGB + mask -+ * by setting the alpha values of the source to 255. - * ARGB OVER ARGB + mask -> AlphaBlend, with AC_SRC_ALPHA - * ARGB OVER RGB + mask -> AlphaBlend, with AC_SRC_ALPHA; junk in the dst A byte - * - * RGB SOURCE RGB -> BitBlt -- * RGB SOURCE ARGB -> UNSUPPORTED (AlphaBlend treats this as a BitBlt, even with SCA 255 and no AC_SRC_ALPHA) -+ * RGB SOURCE ARGB -> Partially supported, We convert this operation into a ARGB SOURCE ARGB -+ * by setting the alpha values of the source to 255. - * ARGB SOURCE ARGB -> BitBlt - * ARGB SOURCE RGB -> BitBlt - * - * RGB SOURCE RGB + mask -> unsupported - * RGB SOURCE ARGB + mask -> unsupported - * ARGB SOURCE ARGB + mask -> unsupported - * ARGB SOURCE RGB + mask -> unsupported - */ -@@ -1222,22 +1250,32 @@ static cairo_int_status_t - needs_alpha = FALSE; - } else { - needs_alpha = TRUE; - } - } else if (src_format == CAIRO_FORMAT_ARGB32 && - dst->format == CAIRO_FORMAT_RGB24) - { - needs_alpha = TRUE; -+ } else if (src_format == CAIRO_FORMAT_RGB24 && -+ dst->format == CAIRO_FORMAT_ARGB32 && -+ src->image) -+ { -+ if (alpha == 255) { -+ needs_alpha = FALSE; -+ } else { -+ needs_alpha = TRUE; -+ } - } else { - goto UNSUPPORTED; - } - } else if (alpha == 255 && op == CAIRO_OPERATOR_SOURCE) { - if ((src_format == dst->format) || -- (src_format == CAIRO_FORMAT_ARGB32 && dst->format == CAIRO_FORMAT_RGB24)) -+ (src_format == CAIRO_FORMAT_ARGB32 && dst->format == CAIRO_FORMAT_RGB24) || -+ (src_format == CAIRO_FORMAT_RGB24 && dst->format == CAIRO_FORMAT_ARGB32 && src->image)) - { - needs_alpha = FALSE; - } else { - goto UNSUPPORTED; - } - } else { - goto UNSUPPORTED; - } - diff --git a/gfx/cairo/handle-a1.patch b/gfx/cairo/handle-a1.patch deleted file mode 100644 index eaad3d69e..000000000 --- a/gfx/cairo/handle-a1.patch +++ /dev/null @@ -1,25 +0,0 @@ -commit 82aab44a9005047743538d52e9fbc27fd6ce408a -Author: Chris Wilson <chris@chris-wilson.co.uk> -Date: Fri Mar 19 17:23:20 2010 -0400 - - commit f07195860620959c27d43080a7b987e28222735a - - xlib: Handle a1 image uploads through converter - - Fixes test/large-source [xlib] - -diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c -index 1a053d0..8f773b0 100644 ---- a/src/cairo-xlib-surface.c -+++ b/src/cairo-xlib-surface.c -@@ -1155,7 +1155,9 @@ _draw_image_surface (cairo_xlib_surface_t *surface, - int dither_adjustment = dither_row[x_off]; - int a, r, g, b; - -- if (image_masks.bpp <= 8) -+ if (image_masks.bpp == 1) -+ in_pixel = !! (((uint8_t*)row)[x/8] & (1 << (x & 7))); -+ else if (image_masks.bpp <= 8) - in_pixel = ((uint8_t*)row)[x]; - else if (image_masks.bpp <= 16) - in_pixel = ((uint16_t*)row)[x]; diff --git a/gfx/cairo/handle-multi-path-clip.patch b/gfx/cairo/handle-multi-path-clip.patch deleted file mode 100644 index fe4268885..000000000 --- a/gfx/cairo/handle-multi-path-clip.patch +++ /dev/null @@ -1,57 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c ---- a/gfx/cairo/cairo/src/cairo-image-surface.c -+++ b/gfx/cairo/cairo/src/cairo-image-surface.c -@@ -2885,16 +2885,18 @@ static cairo_status_t - cairo_bool_t need_clip_mask = FALSE; - cairo_status_t status; - struct _cairo_boxes_chunk *chunk; - uint32_t pixel; - int i; - - if (clip != NULL) { - status = _cairo_clip_get_region (clip, &clip_region); -+ if (unlikely (status == CAIRO_INT_STATUS_NOTHING_TO_DO)) -+ return CAIRO_STATUS_SUCCESS; - need_clip_mask = status == CAIRO_INT_STATUS_UNSUPPORTED; - if (need_clip_mask && - (op == CAIRO_OPERATOR_SOURCE || ! extents->is_bounded)) - { - return CAIRO_INT_STATUS_UNSUPPORTED; - } - - if (clip_region != NULL && cairo_region_num_rectangles (clip_region) == 1) -@@ -3200,30 +3202,20 @@ static cairo_status_t - return _clip_and_composite (dst, op, src, - _composite_traps, &info, - extents, clip); - } - - static cairo_clip_path_t * - _clip_get_single_path (cairo_clip_t *clip) - { -- cairo_clip_path_t *iter = clip->path; -- cairo_clip_path_t *path = NULL; -- -- do { -- if ((iter->flags & CAIRO_CLIP_PATH_IS_BOX) == 0) { -- if (path != NULL) -- return FALSE; -- -- path = iter; -- } -- iter = iter->prev; -- } while (iter != NULL); -- -- return path; -+ if (clip->path->prev == NULL) -+ return clip->path; -+ -+ return NULL; - } - - /* high level image interface */ - - static cairo_int_status_t - _cairo_image_surface_paint (void *abstract_surface, - cairo_operator_t op, - const cairo_pattern_t *source, diff --git a/gfx/cairo/ignore-rank0.patch b/gfx/cairo/ignore-rank0.patch deleted file mode 100644 index 7e20f66fb..000000000 --- a/gfx/cairo/ignore-rank0.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-gstate.c b/gfx/cairo/cairo/src/cairo-gstate.c -index 0439bcf..32a5c4b 100644 ---- a/gfx/cairo/cairo/src/cairo-gstate.c -+++ b/gfx/cairo/cairo/src/cairo-gstate.c -@@ -1271,8 +1271,13 @@ _cairo_gstate_set_font_matrix (cairo_gstate_t *gstate, - if (memcmp (matrix, &gstate->font_matrix, sizeof (cairo_matrix_t)) == 0) - return CAIRO_STATUS_SUCCESS; - -- if (! _cairo_matrix_is_invertible (matrix)) -- return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); -+ if (! _cairo_matrix_is_invertible (matrix)) { -+ /* rank 0 matrices are ok even though they are not invertible */ -+ if (!(matrix->xx == 0. && matrix->xy == 0. && -+ matrix->yx == 0. && matrix->yy == 0.)) { -+ return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); -+ } -+ } - - _cairo_gstate_unset_scaled_font (gstate); - diff --git a/gfx/cairo/libpixman/AUTHORS b/gfx/cairo/libpixman/AUTHORS index e69de29bb..a7798bdf1 100644 --- a/gfx/cairo/libpixman/AUTHORS +++ b/gfx/cairo/libpixman/AUTHORS @@ -0,0 +1,18 @@ +Richard D. Worth +Red Hat, Inc. +USC, Information Sciences Institute +David Reveman +Novell, Inc. +David Reveman, Peter Nilsson +Keith Packard, member of The XFree86 Project, Inc. +Lars Knoll & Zack Rusin, Trolltech +Keith Packard +Nicholas Miell +Trolltech AS +SuSE, Inc. +Carl Worth +The Open Group +Digital Equipment Corporation, Maynard, Massachusetts. +Keith Packard +Richard Henderson +Mark Straver diff --git a/gfx/cairo/libpixman/COPYING b/gfx/cairo/libpixman/COPYING index e69de29bb..47c05f154 100644 --- a/gfx/cairo/libpixman/COPYING +++ b/gfx/cairo/libpixman/COPYING @@ -0,0 +1,37 @@ +Libpixman is free software. + +This (modified) version of the libpixman implementation is available to +be redistributed and/or modified under the terms of the following license[1]. + +Please see the headers of individual files for the respective copyright +holder(s) to the original code. +For all files it should be assumed that some modifications have been made +to adapt the code to surrounding requirements of the UXP source, and +the authors listed are only authors of the original code, not this modified +version. +The contributors to this code are not always listed, so for all files should +be assumed: + +Contributors: Mozilla, Pale Moon and UXP contributors. + +[1] License follows: +Copyright (C) <date> <copyright holder> + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without +fee, provided that the above copyright notice appear in all copies +and that both that copyright notice and this permission notice +appear in supporting documentation, and that the name of +<copyright holder> not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +<copyright holder> makes no representations about the suitability of this +software for any purpose. It is provided "as is" without express or +implied warranty. + +<COPYRIGHT HOLDER> DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOFTWARE
\ No newline at end of file diff --git a/gfx/cairo/lround-c99-only.patch b/gfx/cairo/lround-c99-only.patch deleted file mode 100644 index 9002235f0..000000000 --- a/gfx/cairo/lround-c99-only.patch +++ /dev/null @@ -1,46 +0,0 @@ -Only use lround in C99 programs. - -diff --git a/gfx/cairo/cairo/src/cairo-misc.c b/gfx/cairo/cairo/src/cairo-misc.c ---- a/gfx/cairo/cairo/src/cairo-misc.c -+++ b/gfx/cairo/cairo/src/cairo-misc.c -@@ -478,17 +478,17 @@ _cairo_operator_bounded_by_either (cairo - case CAIRO_OPERATOR_IN: - case CAIRO_OPERATOR_DEST_IN: - case CAIRO_OPERATOR_DEST_ATOP: - return 0; - } - - } - --#if DISABLE_SOME_FLOATING_POINT -+#if DISABLE_SOME_FLOATING_POINT || __STDC_VERSION__ < 199901L - /* This function is identical to the C99 function lround(), except that it - * performs arithmetic rounding (floor(d + .5) instead of away-from-zero rounding) and - * has a valid input range of (INT_MIN, INT_MAX] instead of - * [INT_MIN, INT_MAX]. It is much faster on both x86 and FPU-less systems - * than other commonly used methods for rounding (lround, round, rint, lrint - * or float (d + 0.5)). - * - * The reason why this function is much faster on x86 than other -diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h ---- a/gfx/cairo/cairo/src/cairoint.h -+++ b/gfx/cairo/cairo/src/cairoint.h -@@ -969,17 +969,17 @@ _cairo_restrict_value (double value, dou - * away from 0. _cairo_round rounds halfway cases toward negative infinity. - * This matches the rounding behaviour of _cairo_lround. */ - static inline double cairo_const - _cairo_round (double r) - { - return floor (r + .5); - } - --#if DISABLE_SOME_FLOATING_POINT -+#if DISABLE_SOME_FLOATING_POINT || __STDC_VERSION__ < 199901L - cairo_private int - _cairo_lround (double d) cairo_const; - #else - #define _cairo_lround lround - #endif - - cairo_private uint16_t - _cairo_half_from_float (float f) cairo_const; diff --git a/gfx/cairo/max-font-size.patch b/gfx/cairo/max-font-size.patch deleted file mode 100644 index 99be23906..000000000 --- a/gfx/cairo/max-font-size.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-ft-font.c b/gfx/cairo/cairo/src/cairo-ft-font.c ---- a/gfx/cairo/cairo/src/cairo-ft-font.c -+++ b/gfx/cairo/cairo/src/cairo-ft-font.c -@@ -63,6 +63,10 @@ - /* This is the max number of FT_face objects we keep open at once - */ - #define MAX_OPEN_FACES 10 -+ -+/* This is the maximum font size we allow to be passed to FT_Set_Char_Size -+ */ -+#define MAX_FONT_SIZE 1000 - - /* - * The simple 2x2 matrix is converted into separate scale and shape -@@ -682,9 +686,11 @@ _cairo_ft_unscaled_font_set_scale (cairo - FT_Set_Transform(unscaled->face, &mat, NULL); - - if ((unscaled->face->face_flags & FT_FACE_FLAG_SCALABLE) != 0) { -+ double x_scale = MIN(sf.x_scale, MAX_FONT_SIZE); -+ double y_scale = MIN(sf.y_scale, MAX_FONT_SIZE); - error = FT_Set_Char_Size (unscaled->face, -- sf.x_scale * 64.0 + .5, -- sf.y_scale * 64.0 + .5, -+ x_scale * 64.0 + .5, -+ y_scale * 64.0 + .5, - 0, 0); - if (error) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); diff --git a/gfx/cairo/missing-cairo-clip-init.diff b/gfx/cairo/missing-cairo-clip-init.diff deleted file mode 100644 index a3f46771f..000000000 --- a/gfx/cairo/missing-cairo-clip-init.diff +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-gstate.c b/gfx/cairo/cairo/src/cairo-gstate.c ---- a/gfx/cairo/cairo/src/cairo-gstate.c -+++ b/gfx/cairo/cairo/src/cairo-gstate.c -@@ -1841,16 +1841,17 @@ _cairo_gstate_show_text_glyphs (cairo_gs - transformed_glyphs, - &num_glyphs, - transformed_clusters); - - if (status || num_glyphs == 0) - goto CLEANUP_GLYPHS; - - _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); -+ _cairo_clip_init(&clip); - - /* For really huge font sizes, we can just do path;fill instead of - * show_glyphs, as show_glyphs would put excess pressure on the cache, - * not all components below us correctly handle huge font sizes, and - * path filling can be cheaper since parts of glyphs are likely to be - * clipped out. 256 seems like a good limit. But alas, seems like cairo's - * rasterizer is something like ten times slower than freetype's for huge - * sizes. So, no win just yet when we're using cairo's rasterizer. diff --git a/gfx/cairo/native-clipping.patch b/gfx/cairo/native-clipping.patch deleted file mode 100644 index 171998fe7..000000000 --- a/gfx/cairo/native-clipping.patch +++ /dev/null @@ -1,189 +0,0 @@ -commit 857df0583365228150b3319475efc43b22077d06 -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Tue Apr 20 15:43:54 2010 -0400 - - native clipping - -diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c -index df063bf..819e53e 100644 ---- a/src/cairo-quartz-surface.c -+++ b/src/cairo-quartz-surface.c -@@ -39,6 +39,8 @@ - - #include "cairo-quartz-private.h" - #include "cairo-surface-clipper-private.h" -+#include "cairo-gstate-private.h" -+#include "cairo-private.h" - - #include <dlfcn.h> - -@@ -3095,6 +3097,61 @@ cairo_quartz_surface_get_cg_context (cairo_surface_t *surface) - return quartz->cgContext; - } - -+CGContextRef -+cairo_quartz_get_cg_context_with_clip (cairo_t *cr) -+{ -+ -+ cairo_surface_t *surface = cr->gstate->target; -+ cairo_clip_t *clip = &cr->gstate->clip; -+ cairo_status_t status; -+ -+ cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t*)surface; -+ -+ if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_QUARTZ) -+ return NULL; -+ -+ if (!clip->path) { -+ if (clip->all_clipped) { -+ /* Save the state before we set an empty clip rect so that -+ * our previous clip will be restored */ -+ CGContextSaveGState (quartz->cgContext); -+ -+ /* _cairo_surface_clipper_set_clip doesn't deal with -+ * clip->all_clipped because drawing is normally discarded earlier */ -+ CGRect empty = {{0,0}, {0,0}}; -+ CGContextClipToRect (quartz->cgContext, empty); -+ -+ return quartz->cgContext; -+ } -+ -+ /* an empty clip is represented by NULL */ -+ clip = NULL; -+ } -+ -+ status = _cairo_surface_clipper_set_clip (&quartz->clipper, clip); -+ -+ /* Save the state after we set the clip so that it persists -+ * after we restore */ -+ CGContextSaveGState (quartz->cgContext); -+ -+ if (unlikely (status)) -+ return NULL; -+ -+ return quartz->cgContext; -+} -+ -+void -+cairo_quartz_finish_cg_context_with_clip (cairo_t *cr) -+{ -+ cairo_surface_t *surface = cr->gstate->target; -+ -+ cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t*)surface; -+ -+ if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_QUARTZ) -+ return; -+ -+ CGContextRestoreGState (quartz->cgContext); -+} - - /* Debug stuff */ - -diff --git a/src/cairo-quartz.h b/src/cairo-quartz.h -index e8b71ba..aa1cdd2 100644 ---- a/src/cairo-quartz.h -+++ b/src/cairo-quartz.h -@@ -57,6 +57,12 @@ cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, - cairo_public CGContextRef - cairo_quartz_surface_get_cg_context (cairo_surface_t *surface); - -+cairo_public CGContextRef -+cairo_quartz_get_cg_context_with_clip (cairo_t *cr); -+ -+cairo_public void -+cairo_quartz_finish_cg_context_with_clip (cairo_t *cr); -+ - #if CAIRO_HAS_QUARTZ_FONT - - /* -diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c -index d4575a3..c10e134 100644 ---- a/src/cairo-win32-surface.c -+++ b/src/cairo-win32-surface.c -@@ -52,7 +52,9 @@ - #include "cairo-win32-private.h" - #include "cairo-scaled-font-subsets-private.h" - #include "cairo-surface-fallback-private.h" -- -+#include "cairo-surface-clipper-private.h" -+#include "cairo-gstate-private.h" -+#include "cairo-private.h" - #include <wchar.h> - #include <windows.h> - -@@ -1914,6 +1916,61 @@ cairo_win32_surface_get_dc (cairo_surface_t *surface) - return NULL; - } - -+ -+HDC -+cairo_win32_get_dc_with_clip (cairo_t *cr) -+{ -+ cairo_surface_t *surface = cr->gstate->target; -+ cairo_clip_t clip; -+ _cairo_clip_init_copy(&clip, &cr->gstate->clip); -+ -+ if (_cairo_surface_is_win32 (surface)){ -+ cairo_win32_surface_t *winsurf = (cairo_win32_surface_t *) surface; -+ cairo_region_t *clip_region = NULL; -+ cairo_status_t status; -+ -+ if (clip.path) { -+ status = _cairo_clip_get_region (&clip, &clip_region); -+ assert (status != CAIRO_INT_STATUS_NOTHING_TO_DO); -+ if (status) { -+ _cairo_clip_fini(&clip); -+ return NULL; -+ } -+ } -+ _cairo_win32_surface_set_clip_region (winsurf, clip_region); -+ -+ _cairo_clip_fini(&clip); -+ return winsurf->dc; -+ } -+ -+ if (_cairo_surface_is_paginated (surface)) { -+ cairo_surface_t *target; -+ -+ target = _cairo_paginated_surface_get_target (surface); -+ -+#ifndef CAIRO_OMIT_WIN32_PRINTING -+ if (_cairo_surface_is_win32_printing (target)) { -+ cairo_status_t status; -+ cairo_win32_surface_t *winsurf = (cairo_win32_surface_t *) target; -+ -+ status = _cairo_surface_clipper_set_clip (&winsurf->clipper, &clip); -+ -+ _cairo_clip_fini(&clip); -+ -+ if (status) -+ return NULL; -+ -+ return winsurf->dc; -+ } -+#endif -+ } -+ -+ _cairo_clip_fini(&clip); -+ return NULL; -+} -+ -+ -+ - /** - * cairo_win32_surface_get_image - * @surface: a #cairo_surface_t -diff --git a/src/cairo-win32.h b/src/cairo-win32.h -index 7d04d2a..c304f92 100644 ---- a/src/cairo-win32.h -+++ b/src/cairo-win32.h -@@ -65,6 +65,9 @@ cairo_win32_surface_create_with_dib (cairo_format_t format, - cairo_public HDC - cairo_win32_surface_get_dc (cairo_surface_t *surface); - -+cairo_public HDC -+cairo_win32_get_dc_with_clip (cairo_t *cr); -+ - cairo_public cairo_surface_t * - cairo_win32_surface_get_image (cairo_surface_t *surface); - diff --git a/gfx/cairo/no-pixman-image-reuse-across-threads.patch b/gfx/cairo/no-pixman-image-reuse-across-threads.patch deleted file mode 100644 index ccaf5a5e6..000000000 --- a/gfx/cairo/no-pixman-image-reuse-across-threads.patch +++ /dev/null @@ -1,242 +0,0 @@ -From -https://cgit.freedesktop.org/cairo/commit/?id=71e8a4c23019b01aa43b334fcb2784c70daae9b5 -https://bugs.freedesktop.org/show_bug.cgi?id=34177 - -diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c ---- a/gfx/cairo/cairo/src/cairo-image-surface.c -+++ b/gfx/cairo/cairo/src/cairo-image-surface.c -@@ -870,17 +870,17 @@ static cairo_bool_t - *ty = _pixman_nearest_sample (*ty); - } else { - if (*tx != floor (*tx) || *ty != floor (*ty)) - return FALSE; - } - return fabs (*tx) < PIXMAN_MAX_INT && fabs (*ty) < PIXMAN_MAX_INT; - } - --#if HAS_ATOMIC_OPS -+#if PIXMAN_HAS_ATOMIC_OPS - static pixman_image_t *__pixman_transparent_image; - static pixman_image_t *__pixman_black_image; - static pixman_image_t *__pixman_white_image; - - static pixman_image_t * - _pixman_transparent_image (void) - { - pixman_image_t *image; -@@ -964,56 +964,59 @@ static pixman_image_t * - pixman_image_ref (image); - } - } else { - pixman_image_ref (image); - } - - return image; - } --#else --static pixman_image_t * --_pixman_transparent_image (void) --{ -- return _pixman_image_for_solid (&_cairo_pattern_clear); --} --static pixman_image_t * --_pixman_black_image (void) --{ -- return _pixman_image_for_solid (&_cairo_pattern_black); --} --static pixman_image_t * --_pixman_white_image (void) --{ -- return _pixman_image_for_solid (&_cairo_pattern_white); --} --#endif - - static uint32_t - hars_petruska_f54_1_random (void) - { - #define rol(x,k) ((x << k) | (x >> (32-k))) - static uint32_t x; - return x = (x ^ rol (x, 5) ^ rol (x, 24)) + 0x37798849; - #undef rol - } - - static struct { - cairo_color_t color; - pixman_image_t *image; - } cache[16]; - static int n_cached; - -+#else /* !PIXMAN_HAS_ATOMIC_OPS */ -+static pixman_image_t * -+_pixman_transparent_image (void) -+{ -+ return _pixman_image_for_solid (&_cairo_pattern_clear); -+} -+ -+static pixman_image_t * -+_pixman_black_image (void) -+{ -+ return _pixman_image_for_solid (&_cairo_pattern_black); -+} -+ -+static pixman_image_t * -+_pixman_white_image (void) -+{ -+ return _pixman_image_for_solid (&_cairo_pattern_white); -+} -+#endif /* !PIXMAN_HAS_ATOMIC_OPS */ -+ - void - _cairo_image_reset_static_data (void) - { -+#if PIXMAN_HAS_ATOMIC_OPS - while (n_cached) - pixman_image_unref (cache[--n_cached].image); - --#if HAS_ATOMIC_OPS - if (__pixman_transparent_image) { - pixman_image_unref (__pixman_transparent_image); - __pixman_transparent_image = NULL; - } - - if (__pixman_black_image) { - pixman_image_unref (__pixman_black_image); - __pixman_black_image = NULL; -@@ -1026,19 +1029,20 @@ void - #endif - } - - static pixman_image_t * - _pixman_image_for_solid (const cairo_solid_pattern_t *pattern) - { - pixman_color_t color; - pixman_image_t *image; -+ -+#if PIXMAN_HAS_ATOMIC_OPS - int i; - --#if HAS_ATOMIC_OPS - if (pattern->color.alpha_short <= 0x00ff) - return _pixman_transparent_image (); - - if (pattern->color.alpha_short >= 0xff00) { - if (pattern->color.red_short <= 0x00ff && - pattern->color.green_short <= 0x00ff && - pattern->color.blue_short <= 0x00ff) - { -@@ -1047,46 +1051,48 @@ static pixman_image_t * - - if (pattern->color.red_short >= 0xff00 && - pattern->color.green_short >= 0xff00 && - pattern->color.blue_short >= 0xff00) - { - return _pixman_white_image (); - } - } --#endif - - CAIRO_MUTEX_LOCK (_cairo_image_solid_cache_mutex); - for (i = 0; i < n_cached; i++) { - if (_cairo_color_equal (&cache[i].color, &pattern->color)) { - image = pixman_image_ref (cache[i].image); - goto UNLOCK; - } - } -+#endif - - color.red = pattern->color.red_short; - color.green = pattern->color.green_short; - color.blue = pattern->color.blue_short; - color.alpha = pattern->color.alpha_short; - - image = pixman_image_create_solid_fill (&color); -+#if PIXMAN_HAS_ATOMIC_OPS - if (image == NULL) - goto UNLOCK; - - if (n_cached < ARRAY_LENGTH (cache)) { - i = n_cached++; - } else { - i = hars_petruska_f54_1_random () % ARRAY_LENGTH (cache); - pixman_image_unref (cache[i].image); - } - cache[i].image = pixman_image_ref (image); - cache[i].color = pattern->color; - - UNLOCK: - CAIRO_MUTEX_UNLOCK (_cairo_image_solid_cache_mutex); -+#endif - return image; - } - - static double - clamp (double val, double min, double max) - { - return val < min ? min : (val > max ? max : val); - } -@@ -1423,25 +1429,27 @@ static pixman_image_t * - return _pixman_transparent_image (); - } - else - { - return _pixel_to_solid (source, sample.x, sample.y); - } - } - -+#if PIXMAN_HAS_ATOMIC_OPS - /* avoid allocating a 'pattern' image if we can reuse the original */ - if (extend == CAIRO_EXTEND_NONE && - _cairo_matrix_is_translation (&pattern->base.matrix) && - _nearest_sample (filter, &tx, &ty)) - { - *ix = tx; - *iy = ty; - return pixman_image_ref (source->pixman_image); - } -+#endif - - pixman_image = pixman_image_create_bits (source->pixman_format, - source->width, - source->height, - (uint32_t *) source->data, - source->stride); - if (unlikely (pixman_image == NULL)) - return NULL; -@@ -1466,31 +1474,36 @@ static pixman_image_t * - sub->extents.x + sample.x, - sub->extents.y + sample.y); - } else { - if (extend == CAIRO_EXTEND_NONE) - return _pixman_transparent_image (); - } - } - -+#if PIXMAN_HAS_ATOMIC_OPS - if (is_contained && - _cairo_matrix_is_translation (&pattern->base.matrix) && - _nearest_sample (filter, &tx, &ty)) - { - *ix = tx + sub->extents.x; - *iy = ty + sub->extents.y; - return pixman_image_ref (source->pixman_image); - } -+#endif - - /* Avoid sub-byte offsets, force a copy in that case. */ - if (PIXMAN_FORMAT_BPP (source->pixman_format) >= 8) { -+ void *data = source->data -+ + sub->extents.x * PIXMAN_FORMAT_BPP(source->pixman_format)/8 -+ + sub->extents.y * source->stride; - pixman_image = pixman_image_create_bits (source->pixman_format, - sub->extents.width, - sub->extents.height, -- (uint32_t *) (source->data + sub->extents.x * PIXMAN_FORMAT_BPP(source->pixman_format)/8 + sub->extents.y * source->stride), -+ data, - source->stride); - if (unlikely (pixman_image == NULL)) - return NULL; - } - } - } - - if (pixman_image == NULL) { diff --git a/gfx/cairo/nonfatal-assertions.patch b/gfx/cairo/nonfatal-assertions.patch deleted file mode 100644 index dcbb904ab..000000000 --- a/gfx/cairo/nonfatal-assertions.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff -r b79d47dad1ea gfx/cairo/cairo/src/cairoint.h ---- a/gfx/cairo/cairo/src/cairoint.h Fri Jun 08 18:09:53 2007 -0700 -+++ b/gfx/cairo/cairo/src/cairoint.h Fri Jun 29 09:18:02 2007 +0200 -@@ -159,6 +159,13 @@ CAIRO_BEGIN_DECLS - - #ifndef M_PI - #define M_PI 3.14159265358979323846 -+#endif -+ -+#ifndef NDEBUG -+#undef assert -+#define assert(expr) \ -+ do { if (!(expr)) fprintf(stderr, "Assertion failed at %s:%d: %s\n", \ -+ __FILE__, __LINE__, #expr); } while (0) - #endif - - #undef ARRAY_LENGTH diff --git a/gfx/cairo/on-edge.patch b/gfx/cairo/on-edge.patch deleted file mode 100644 index 85e328ad8..000000000 --- a/gfx/cairo/on-edge.patch +++ /dev/null @@ -1,70 +0,0 @@ -commit a26655b3144ed273940486fc15ccdac12b0562ec -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Tue Mar 17 15:08:50 2009 -0400 - - Jeff Muizelaar noted that the treatment of edges differed with firefox's - canvas definition, which considers a point on any edge as inside. The - current implementation has a similar definition to that of flash, for - which the top and right edges are outside. Arguably, firefox has the more - intuitive definition here... - -diff --git a/src/cairo-path-in-fill.c b/src/cairo-path-in-fill.c -index 21cd0bd..e641654 100644 ---- a/src/cairo-path-in-fill.c -+++ b/src/cairo-path-in-fill.c -@@ -41,6 +41,7 @@ typedef struct cairo_in_fill { - int winding; - - cairo_fixed_t x, y; -+ cairo_bool_t on_edge; - - cairo_bool_t has_current_point; - cairo_point_t current_point; -@@ -58,6 +59,7 @@ _cairo_in_fill_init (cairo_in_fill_t *in_fill, - - in_fill->x = _cairo_fixed_from_double (x); - in_fill->y = _cairo_fixed_from_double (y); -+ in_fill->on_edge = FALSE; - - in_fill->has_current_point = FALSE; - in_fill->current_point.x = 0; -@@ -103,6 +105,9 @@ _cairo_in_fill_add_edge (cairo_in_fill_t *in_fill, - { - int dir; - -+ if (in_fill->on_edge) -+ return; -+ - /* count the number of edge crossing to -∞ */ - - dir = 1; -@@ -116,6 +121,18 @@ _cairo_in_fill_add_edge (cairo_in_fill_t *in_fill, - dir = -1; - } - -+ /* First check whether the query is on an edge */ -+ if ((p1->x == in_fill->x && p1->x == in_fill->y) || -+ (p2->x == in_fill->x && p2->x == in_fill->y) || -+ (! (p2->y < in_fill->y || p1->y > in_fill->y) && -+ ! (p1->x > in_fill->x && p2->x > in_fill->x) && -+ ! (p1->x < in_fill->x && p2->x < in_fill->x) && -+ edge_compare_for_y_against_x (p1, p2, in_fill->y, in_fill->x) == 0)) -+ { -+ in_fill->on_edge = TRUE; -+ return; -+ } -+ - /* edge is entirely above or below, note the shortening rule */ - if (p2->y <= in_fill->y || p1->y > in_fill->y) - return; -@@ -246,7 +263,9 @@ _cairo_path_fixed_in_fill (cairo_path_fixed_t *path, - - _cairo_in_fill_close_path (&in_fill); - -- switch (fill_rule) { -+ if (in_fill.on_edge) { -+ *is_inside = TRUE; -+ } else switch (fill_rule) { - case CAIRO_FILL_RULE_EVEN_ODD: - *is_inside = in_fill.winding & 1; - break; diff --git a/gfx/cairo/pattern_get_surface-no-error.patch b/gfx/cairo/pattern_get_surface-no-error.patch deleted file mode 100644 index 93f08512d..000000000 --- a/gfx/cairo/pattern_get_surface-no-error.patch +++ /dev/null @@ -1,29 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1294019288 -46800 -# Node ID e427b4ea7e2ff980769e1acd92f4730c5ed3654f -# Parent bacc54d452a9fddb5a0d6a1442ec7be4de81ffa7 -Bug 593604. Part 2.5: cairo_pattern_get_surface should not call cairo_error. r=jrmuizel,a=blocking - -diff --git a/gfx/cairo/cairo/src/cairo-pattern.c b/gfx/cairo/cairo/src/cairo-pattern.c ---- a/gfx/cairo/cairo/src/cairo-pattern.c -+++ b/gfx/cairo/cairo/src/cairo-pattern.c -@@ -2940,17 +2940,17 @@ cairo_pattern_get_surface (cairo_pattern - cairo_surface_t **surface) - { - cairo_surface_pattern_t *spat = (cairo_surface_pattern_t*) pattern; - - if (pattern->status) - return pattern->status; - - if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) -- return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); -+ return CAIRO_STATUS_PATTERN_TYPE_MISMATCH; - - if (surface) - *surface = spat->surface; - - return CAIRO_STATUS_SUCCESS; - } - - /** diff --git a/gfx/cairo/pixman-16-bit-pipeline.patch b/gfx/cairo/pixman-16-bit-pipeline.patch deleted file mode 100644 index 8a7878ca2..000000000 --- a/gfx/cairo/pixman-16-bit-pipeline.patch +++ /dev/null @@ -1,1242 +0,0 @@ -diff --git a/gfx/cairo/libpixman/src/pixman-access.c b/gfx/cairo/libpixman/src/pixman-access.c ---- a/gfx/cairo/libpixman/src/pixman-access.c -+++ b/gfx/cairo/libpixman/src/pixman-access.c -@@ -933,16 +933,54 @@ store_scanline_x2b10g10r10 (bits_image_t - { - WRITE (image, pixel++, - ((values[i] >> 38) & 0x3ff) | - ((values[i] >> 12) & 0xffc00) | - ((values[i] << 14) & 0x3ff00000)); - } - } - -+static void -+store_scanline_16 (bits_image_t * image, -+ int x, -+ int y, -+ int width, -+ const uint32_t *v) -+{ -+ uint16_t *bits = (uint16_t*)(image->bits + image->rowstride * y); -+ uint16_t *values = (uint16_t *)v; -+ uint16_t *pixel = bits + x; -+ int i; -+ -+ for (i = 0; i < width; ++i) -+ { -+ WRITE (image, pixel++, values[i]); -+ } -+} -+ -+static void -+fetch_scanline_16 (pixman_image_t *image, -+ int x, -+ int y, -+ int width, -+ uint32_t * b, -+ const uint32_t *mask) -+{ -+ const uint16_t *bits = (uint16_t*)(image->bits.bits + y * image->bits.rowstride); -+ const uint16_t *pixel = bits + x; -+ int i; -+ uint16_t *buffer = (uint16_t *)b; -+ -+ for (i = 0; i < width; ++i) -+ { -+ *buffer++ = READ (image, pixel++); -+ } -+} -+ -+ - /* - * Contracts a 64bpp image to 32bpp and then stores it using a regular 32-bit - * store proc. Despite the type, this function expects a uint64_t buffer. - */ - static void - store_scanline_generic_64 (bits_image_t * image, - int x, - int y, -@@ -1044,32 +1082,47 @@ fetch_pixel_generic_lossy_32 (bits_image - pixman_contract (&result, &pixel64, 1); - - return result; - } - - typedef struct - { - pixman_format_code_t format; -+ fetch_scanline_t fetch_scanline_16; - fetch_scanline_t fetch_scanline_32; - fetch_scanline_t fetch_scanline_64; - fetch_pixel_32_t fetch_pixel_32; - fetch_pixel_64_t fetch_pixel_64; -+ store_scanline_t store_scanline_16; - store_scanline_t store_scanline_32; - store_scanline_t store_scanline_64; - } format_info_t; - - #define FORMAT_INFO(format) \ - { \ - PIXMAN_ ## format, \ -+ NULL, \ - fetch_scanline_ ## format, \ - fetch_scanline_generic_64, \ - fetch_pixel_ ## format, fetch_pixel_generic_64, \ -+ NULL, \ - store_scanline_ ## format, store_scanline_generic_64 \ - } -+#define FORMAT_INFO16(format) \ -+ { \ -+ PIXMAN_ ## format, \ -+ fetch_scanline_16, \ -+ fetch_scanline_ ## format, \ -+ fetch_scanline_generic_64, \ -+ fetch_pixel_ ## format, fetch_pixel_generic_64, \ -+ store_scanline_16, \ -+ store_scanline_ ## format, store_scanline_generic_64 \ -+ } -+ - - static const format_info_t accessors[] = - { - /* 32 bpp formats */ - FORMAT_INFO (a8r8g8b8), - FORMAT_INFO (x8r8g8b8), - FORMAT_INFO (a8b8g8r8), - FORMAT_INFO (x8b8g8r8), -@@ -1079,18 +1132,18 @@ static const format_info_t accessors[] = - FORMAT_INFO (r8g8b8x8), - FORMAT_INFO (x14r6g6b6), - - /* 24bpp formats */ - FORMAT_INFO (r8g8b8), - FORMAT_INFO (b8g8r8), - - /* 16bpp formats */ -- FORMAT_INFO (r5g6b5), -- FORMAT_INFO (b5g6r5), -+ FORMAT_INFO16 (r5g6b5), -+ FORMAT_INFO16 (b5g6r5), - - FORMAT_INFO (a1r5g5b5), - FORMAT_INFO (x1r5g5b5), - FORMAT_INFO (a1b5g5r5), - FORMAT_INFO (x1b5g5r5), - FORMAT_INFO (a4r4g4b4), - FORMAT_INFO (x4r4g4b4), - FORMAT_INFO (a4b4g4r4), -@@ -1132,62 +1185,64 @@ static const format_info_t accessors[] = - - /* 1bpp formats */ - FORMAT_INFO (a1), - FORMAT_INFO (g1), - - /* Wide formats */ - - { PIXMAN_a2r10g10b10, -- NULL, fetch_scanline_a2r10g10b10, -+ NULL, NULL, fetch_scanline_a2r10g10b10, - fetch_pixel_generic_lossy_32, fetch_pixel_a2r10g10b10, - NULL, store_scanline_a2r10g10b10 }, - - { PIXMAN_x2r10g10b10, -- NULL, fetch_scanline_x2r10g10b10, -+ NULL, NULL, fetch_scanline_x2r10g10b10, - fetch_pixel_generic_lossy_32, fetch_pixel_x2r10g10b10, - NULL, store_scanline_x2r10g10b10 }, - - { PIXMAN_a2b10g10r10, -- NULL, fetch_scanline_a2b10g10r10, -+ NULL, NULL, fetch_scanline_a2b10g10r10, - fetch_pixel_generic_lossy_32, fetch_pixel_a2b10g10r10, - NULL, store_scanline_a2b10g10r10 }, - - { PIXMAN_x2b10g10r10, -- NULL, fetch_scanline_x2b10g10r10, -+ NULL, NULL, fetch_scanline_x2b10g10r10, - fetch_pixel_generic_lossy_32, fetch_pixel_x2b10g10r10, - NULL, store_scanline_x2b10g10r10 }, - - /* YUV formats */ - { PIXMAN_yuy2, -- fetch_scanline_yuy2, fetch_scanline_generic_64, -+ NULL, fetch_scanline_yuy2, fetch_scanline_generic_64, - fetch_pixel_yuy2, fetch_pixel_generic_64, - NULL, NULL }, - - { PIXMAN_yv12, -- fetch_scanline_yv12, fetch_scanline_generic_64, -+ NULL, fetch_scanline_yv12, fetch_scanline_generic_64, - fetch_pixel_yv12, fetch_pixel_generic_64, - NULL, NULL }, - - { PIXMAN_null }, - }; - - static void - setup_accessors (bits_image_t *image) - { - const format_info_t *info = accessors; - - while (info->format != PIXMAN_null) - { - if (info->format == image->format) - { -+ image->fetch_scanline_16 = info->fetch_scanline_16; - image->fetch_scanline_32 = info->fetch_scanline_32; - image->fetch_scanline_64 = info->fetch_scanline_64; - image->fetch_pixel_32 = info->fetch_pixel_32; - image->fetch_pixel_64 = info->fetch_pixel_64; -+ image->store_scanline_16 = info->store_scanline_16; - image->store_scanline_32 = info->store_scanline_32; - image->store_scanline_64 = info->store_scanline_64; - - return; - } - - info++; - } -diff --git a/gfx/cairo/libpixman/src/pixman-bits-image.c b/gfx/cairo/libpixman/src/pixman-bits-image.c ---- a/gfx/cairo/libpixman/src/pixman-bits-image.c -+++ b/gfx/cairo/libpixman/src/pixman-bits-image.c -@@ -1247,16 +1247,31 @@ src_get_scanline_wide (pixman_iter_t *it - - void - _pixman_bits_image_src_iter_init (pixman_image_t *image, pixman_iter_t *iter) - { - if (iter->flags & ITER_NARROW) - iter->get_scanline = src_get_scanline_narrow; - else - iter->get_scanline = src_get_scanline_wide; -+ -+} -+ -+static uint32_t * -+dest_get_scanline_16 (pixman_iter_t *iter, const uint32_t *mask) -+{ -+ pixman_image_t *image = iter->image; -+ int x = iter->x; -+ int y = iter->y; -+ int width = iter->width; -+ uint32_t * buffer = iter->buffer; -+ -+ image->bits.fetch_scanline_16 (image, x, y, width, buffer, mask); -+ -+ return iter->buffer; - } - - static uint32_t * - dest_get_scanline_narrow (pixman_iter_t *iter, const uint32_t *mask) - { - pixman_image_t *image = iter->image; - int x = iter->x; - int y = iter->y; -@@ -1327,16 +1342,30 @@ dest_get_scanline_wide (pixman_iter_t *i - free (alpha); - } - } - - return iter->buffer; - } - - static void -+dest_write_back_16 (pixman_iter_t *iter) -+{ -+ bits_image_t * image = &iter->image->bits; -+ int x = iter->x; -+ int y = iter->y; -+ int width = iter->width; -+ const uint32_t *buffer = iter->buffer; -+ -+ image->store_scanline_16 (image, x, y, width, buffer); -+ -+ iter->y++; -+} -+ -+static void - dest_write_back_narrow (pixman_iter_t *iter) - { - bits_image_t * image = &iter->image->bits; - int x = iter->x; - int y = iter->y; - int width = iter->width; - const uint32_t *buffer = iter->buffer; - -@@ -1375,28 +1404,41 @@ dest_write_back_wide (pixman_iter_t *ite - } - - iter->y++; - } - - void - _pixman_bits_image_dest_iter_init (pixman_image_t *image, pixman_iter_t *iter) - { -- if (iter->flags & ITER_NARROW) -+ if (iter->flags & ITER_16) -+ { -+ if ((iter->flags & (ITER_IGNORE_RGB | ITER_IGNORE_ALPHA)) == -+ (ITER_IGNORE_RGB | ITER_IGNORE_ALPHA)) -+ { -+ iter->get_scanline = _pixman_iter_get_scanline_noop; -+ } -+ else -+ { -+ iter->get_scanline = dest_get_scanline_16; -+ } -+ iter->write_back = dest_write_back_16; -+ } -+ else if (iter->flags & ITER_NARROW) - { - if ((iter->flags & (ITER_IGNORE_RGB | ITER_IGNORE_ALPHA)) == - (ITER_IGNORE_RGB | ITER_IGNORE_ALPHA)) - { - iter->get_scanline = _pixman_iter_get_scanline_noop; - } - else - { - iter->get_scanline = dest_get_scanline_narrow; - } -- -+ - iter->write_back = dest_write_back_narrow; - } - else - { - iter->get_scanline = dest_get_scanline_wide; - iter->write_back = dest_write_back_wide; - } - } -diff --git a/gfx/cairo/libpixman/src/pixman-combine16.c b/gfx/cairo/libpixman/src/pixman-combine16.c -new file mode 100644 ---- /dev/null -+++ b/gfx/cairo/libpixman/src/pixman-combine16.c -@@ -0,0 +1,124 @@ -+#ifdef HAVE_CONFIG_H -+#include <config.h> -+#endif -+ -+#include <math.h> -+#include <string.h> -+ -+#include "pixman-private.h" -+ -+#include "pixman-combine32.h" -+ -+static force_inline uint32_t -+combine_mask (const uint32_t src, const uint32_t mask) -+{ -+ uint32_t s, m; -+ -+ m = mask >> A_SHIFT; -+ -+ if (!m) -+ return 0; -+ s = src; -+ -+ UN8x4_MUL_UN8 (s, m); -+ -+ return s; -+} -+ -+static inline uint32_t convert_0565_to_8888(uint16_t color) -+{ -+ return CONVERT_0565_TO_8888(color); -+} -+ -+static inline uint16_t convert_8888_to_0565(uint32_t color) -+{ -+ return CONVERT_8888_TO_0565(color); -+} -+ -+static void -+combine_src_u (pixman_implementation_t *imp, -+ pixman_op_t op, -+ uint32_t * dest, -+ const uint32_t * src, -+ const uint32_t * mask, -+ int width) -+{ -+ int i; -+ -+ if (!mask) -+ memcpy (dest, src, width * sizeof (uint16_t)); -+ else -+ { -+ uint16_t *d = (uint16_t*)dest; -+ uint16_t *src16 = (uint16_t*)src; -+ for (i = 0; i < width; ++i) -+ { -+ if ((*mask & 0xff000000) == 0xff000000) { -+ // it's likely worth special casing -+ // fully opaque because it avoids -+ // the cost of conversion as well the multiplication -+ *(d + i) = *src16; -+ } else { -+ // the mask is still 32bits -+ uint32_t s = combine_mask (convert_0565_to_8888(*src16), *mask); -+ *(d + i) = convert_8888_to_0565(s); -+ } -+ mask++; -+ src16++; -+ } -+ } -+ -+} -+ -+static void -+combine_over_u (pixman_implementation_t *imp, -+ pixman_op_t op, -+ uint32_t * dest, -+ const uint32_t * src, -+ const uint32_t * mask, -+ int width) -+{ -+ int i; -+ -+ if (!mask) -+ memcpy (dest, src, width * sizeof (uint16_t)); -+ else -+ { -+ uint16_t *d = (uint16_t*)dest; -+ uint16_t *src16 = (uint16_t*)src; -+ for (i = 0; i < width; ++i) -+ { -+ if ((*mask & 0xff000000) == 0xff000000) { -+ // it's likely worth special casing -+ // fully opaque because it avoids -+ // the cost of conversion as well the multiplication -+ *(d + i) = *src16; -+ } else if ((*mask & 0xff000000) == 0x00000000) { -+ // keep the dest the same -+ } else { -+ // the mask is still 32bits -+ uint32_t s = combine_mask (convert_0565_to_8888(*src16), *mask); -+ uint32_t ia = ALPHA_8 (~s); -+ uint32_t d32 = convert_0565_to_8888(*(d + i)); -+ UN8x4_MUL_UN8_ADD_UN8x4 (d32, ia, s); -+ *(d + i) = convert_8888_to_0565(d32); -+ } -+ mask++; -+ src16++; -+ } -+ } -+ -+} -+ -+ -+void -+_pixman_setup_combiner_functions_16 (pixman_implementation_t *imp) -+{ -+ int i; -+ for (i = 0; i < PIXMAN_N_OPERATORS; i++) { -+ imp->combine_16[i] = NULL; -+ } -+ imp->combine_16[PIXMAN_OP_SRC] = combine_src_u; -+ imp->combine_16[PIXMAN_OP_OVER] = combine_over_u; -+} -+ -diff --git a/gfx/cairo/libpixman/src/pixman-general.c b/gfx/cairo/libpixman/src/pixman-general.c ---- a/gfx/cairo/libpixman/src/pixman-general.c -+++ b/gfx/cairo/libpixman/src/pixman-general.c -@@ -106,46 +106,61 @@ general_composite_rect (pixman_implemen - PIXMAN_COMPOSITE_ARGS (info); - uint64_t stack_scanline_buffer[(SCANLINE_BUFFER_LENGTH * 3 + 7) / 8]; - uint8_t *scanline_buffer = (uint8_t *) stack_scanline_buffer; - uint8_t *src_buffer, *mask_buffer, *dest_buffer; - pixman_iter_t src_iter, mask_iter, dest_iter; - pixman_combine_32_func_t compose; - pixman_bool_t component_alpha; - iter_flags_t narrow, src_flags; -+ iter_flags_t rgb16; - int Bpp; - int i; - - if ((src_image->common.flags & FAST_PATH_NARROW_FORMAT) && - (!mask_image || mask_image->common.flags & FAST_PATH_NARROW_FORMAT) && - (dest_image->common.flags & FAST_PATH_NARROW_FORMAT)) - { - narrow = ITER_NARROW; - Bpp = 4; - } - else - { - narrow = 0; - Bpp = 8; - } - -+ // XXX: This special casing is bad. Ideally, we'd keep the general code general perhaps -+ // by having it deal more specifically with different intermediate formats -+ if ( -+ (dest_image->common.flags & FAST_PATH_16_FORMAT && (src_image->type == LINEAR || src_image->type == RADIAL)) && -+ ( op == PIXMAN_OP_SRC || -+ (op == PIXMAN_OP_OVER && (src_image->common.flags & FAST_PATH_IS_OPAQUE)) -+ ) -+ ) { -+ rgb16 = ITER_16; -+ } else { -+ rgb16 = 0; -+ } -+ -+ - if (width * Bpp > SCANLINE_BUFFER_LENGTH) - { - scanline_buffer = pixman_malloc_abc (width, 3, Bpp); - - if (!scanline_buffer) - return; - } - - src_buffer = scanline_buffer; - mask_buffer = src_buffer + width * Bpp; - dest_buffer = mask_buffer + width * Bpp; - - /* src iter */ -- src_flags = narrow | op_flags[op].src; -+ src_flags = narrow | op_flags[op].src | rgb16; - - _pixman_implementation_src_iter_init (imp->toplevel, &src_iter, src_image, - src_x, src_y, width, height, - src_buffer, src_flags); - - /* mask iter */ - if ((src_flags & (ITER_IGNORE_ALPHA | ITER_IGNORE_RGB)) == - (ITER_IGNORE_ALPHA | ITER_IGNORE_RGB)) -@@ -164,20 +179,20 @@ general_composite_rect (pixman_implemen - - _pixman_implementation_src_iter_init ( - imp->toplevel, &mask_iter, mask_image, mask_x, mask_y, width, height, - mask_buffer, narrow | (component_alpha? 0 : ITER_IGNORE_RGB)); - - /* dest iter */ - _pixman_implementation_dest_iter_init ( - imp->toplevel, &dest_iter, dest_image, dest_x, dest_y, width, height, -- dest_buffer, narrow | op_flags[op].dst); -+ dest_buffer, narrow | op_flags[op].dst | rgb16); - - compose = _pixman_implementation_lookup_combiner ( -- imp->toplevel, op, component_alpha, narrow); -+ imp->toplevel, op, component_alpha, narrow, !!rgb16); - - if (!compose) - return; - - for (i = 0; i < height; ++i) - { - uint32_t *s, *m, *d; - -@@ -234,16 +249,17 @@ general_fill (pixman_implementation_t *i - return FALSE; - } - - pixman_implementation_t * - _pixman_implementation_create_general (void) - { - pixman_implementation_t *imp = _pixman_implementation_create (NULL, general_fast_path); - -+ _pixman_setup_combiner_functions_16 (imp); - _pixman_setup_combiner_functions_32 (imp); - _pixman_setup_combiner_functions_64 (imp); - - imp->blt = general_blt; - imp->fill = general_fill; - imp->src_iter_init = general_src_iter_init; - imp->dest_iter_init = general_dest_iter_init; - -diff --git a/gfx/cairo/libpixman/src/pixman-image.c b/gfx/cairo/libpixman/src/pixman-image.c ---- a/gfx/cairo/libpixman/src/pixman-image.c -+++ b/gfx/cairo/libpixman/src/pixman-image.c -@@ -451,16 +451,20 @@ compute_image_info (pixman_image_t *imag - flags |= FAST_PATH_IS_OPAQUE; - } - - if (image->bits.read_func || image->bits.write_func) - flags &= ~FAST_PATH_NO_ACCESSORS; - - if (PIXMAN_FORMAT_IS_WIDE (image->bits.format)) - flags &= ~FAST_PATH_NARROW_FORMAT; -+ -+ if (image->bits.format == PIXMAN_r5g6b5) -+ flags |= FAST_PATH_16_FORMAT; -+ - break; - - case RADIAL: - code = PIXMAN_unknown; - - /* - * As explained in pixman-radial-gradient.c, every point of - * the plane has a valid associated radius (and thus will be -diff --git a/gfx/cairo/libpixman/src/pixman-implementation.c b/gfx/cairo/libpixman/src/pixman-implementation.c ---- a/gfx/cairo/libpixman/src/pixman-implementation.c -+++ b/gfx/cairo/libpixman/src/pixman-implementation.c -@@ -101,45 +101,51 @@ pixman_implementation_t * - imp->fill = delegate_fill; - imp->src_iter_init = delegate_src_iter_init; - imp->dest_iter_init = delegate_dest_iter_init; - - imp->fast_paths = fast_paths; - - for (i = 0; i < PIXMAN_N_OPERATORS; ++i) - { -+ imp->combine_16[i] = NULL; - imp->combine_32[i] = NULL; - imp->combine_64[i] = NULL; - imp->combine_32_ca[i] = NULL; - imp->combine_64_ca[i] = NULL; - } - - return imp; - } - - pixman_combine_32_func_t - _pixman_implementation_lookup_combiner (pixman_implementation_t *imp, - pixman_op_t op, - pixman_bool_t component_alpha, -- pixman_bool_t narrow) -+ pixman_bool_t narrow, -+ pixman_bool_t rgb16) - { - pixman_combine_32_func_t f; - - do - { - pixman_combine_32_func_t (*combiners[]) = - { - (pixman_combine_32_func_t *)imp->combine_64, - (pixman_combine_32_func_t *)imp->combine_64_ca, - imp->combine_32, - imp->combine_32_ca, -+ (pixman_combine_32_func_t *)imp->combine_16, -+ NULL, - }; -- -- f = combiners[component_alpha | (narrow << 1)][op]; -- -+ if (rgb16) { -+ f = combiners[4][op]; -+ } else { -+ f = combiners[component_alpha + (narrow << 1)][op]; -+ } - imp = imp->delegate; - } - while (!f); - - return f; - } - - pixman_bool_t -diff --git a/gfx/cairo/libpixman/src/pixman-linear-gradient.c b/gfx/cairo/libpixman/src/pixman-linear-gradient.c ---- a/gfx/cairo/libpixman/src/pixman-linear-gradient.c -+++ b/gfx/cairo/libpixman/src/pixman-linear-gradient.c -@@ -217,42 +217,185 @@ linear_get_scanline_narrow (pixman_iter_ - } - } - - iter->y++; - - return iter->buffer; - } - -+static uint16_t convert_8888_to_0565(uint32_t color) -+{ -+ return CONVERT_8888_TO_0565(color); -+} -+ -+static uint32_t * -+linear_get_scanline_16 (pixman_iter_t *iter, -+ const uint32_t *mask) -+{ -+ pixman_image_t *image = iter->image; -+ int x = iter->x; -+ int y = iter->y; -+ int width = iter->width; -+ uint16_t * buffer = (uint16_t*)iter->buffer; -+ -+ pixman_vector_t v, unit; -+ pixman_fixed_32_32_t l; -+ pixman_fixed_48_16_t dx, dy; -+ gradient_t *gradient = (gradient_t *)image; -+ linear_gradient_t *linear = (linear_gradient_t *)image; -+ uint16_t *end = buffer + width; -+ pixman_gradient_walker_t walker; -+ -+ _pixman_gradient_walker_init (&walker, gradient, image->common.repeat); -+ -+ /* reference point is the center of the pixel */ -+ v.vector[0] = pixman_int_to_fixed (x) + pixman_fixed_1 / 2; -+ v.vector[1] = pixman_int_to_fixed (y) + pixman_fixed_1 / 2; -+ v.vector[2] = pixman_fixed_1; -+ -+ if (image->common.transform) -+ { -+ if (!pixman_transform_point_3d (image->common.transform, &v)) -+ return iter->buffer; -+ -+ unit.vector[0] = image->common.transform->matrix[0][0]; -+ unit.vector[1] = image->common.transform->matrix[1][0]; -+ unit.vector[2] = image->common.transform->matrix[2][0]; -+ } -+ else -+ { -+ unit.vector[0] = pixman_fixed_1; -+ unit.vector[1] = 0; -+ unit.vector[2] = 0; -+ } -+ -+ dx = linear->p2.x - linear->p1.x; -+ dy = linear->p2.y - linear->p1.y; -+ -+ l = dx * dx + dy * dy; -+ -+ if (l == 0 || unit.vector[2] == 0) -+ { -+ /* affine transformation only */ -+ pixman_fixed_32_32_t t, next_inc; -+ double inc; -+ -+ if (l == 0 || v.vector[2] == 0) -+ { -+ t = 0; -+ inc = 0; -+ } -+ else -+ { -+ double invden, v2; -+ -+ invden = pixman_fixed_1 * (double) pixman_fixed_1 / -+ (l * (double) v.vector[2]); -+ v2 = v.vector[2] * (1. / pixman_fixed_1); -+ t = ((dx * v.vector[0] + dy * v.vector[1]) - -+ (dx * linear->p1.x + dy * linear->p1.y) * v2) * invden; -+ inc = (dx * unit.vector[0] + dy * unit.vector[1]) * invden; -+ } -+ next_inc = 0; -+ -+ if (((pixman_fixed_32_32_t )(inc * width)) == 0) -+ { -+ register uint16_t color; -+ -+ color = convert_8888_to_0565(_pixman_gradient_walker_pixel (&walker, t)); -+ while (buffer < end) -+ *buffer++ = color; -+ } -+ else -+ { -+ int i; -+ -+ i = 0; -+ while (buffer < end) -+ { -+ if (!mask || *mask++) -+ { -+ *buffer = convert_8888_to_0565(_pixman_gradient_walker_pixel (&walker, -+ t + next_inc)); -+ } -+ i++; -+ next_inc = inc * i; -+ buffer++; -+ } -+ } -+ } -+ else -+ { -+ /* projective transformation */ -+ double t; -+ -+ t = 0; -+ -+ while (buffer < end) -+ { -+ if (!mask || *mask++) -+ { -+ if (v.vector[2] != 0) -+ { -+ double invden, v2; -+ -+ invden = pixman_fixed_1 * (double) pixman_fixed_1 / -+ (l * (double) v.vector[2]); -+ v2 = v.vector[2] * (1. / pixman_fixed_1); -+ t = ((dx * v.vector[0] + dy * v.vector[1]) - -+ (dx * linear->p1.x + dy * linear->p1.y) * v2) * invden; -+ } -+ -+ *buffer = convert_8888_to_0565(_pixman_gradient_walker_pixel (&walker, t)); -+ } -+ -+ ++buffer; -+ -+ v.vector[0] += unit.vector[0]; -+ v.vector[1] += unit.vector[1]; -+ v.vector[2] += unit.vector[2]; -+ } -+ } -+ -+ iter->y++; -+ -+ return iter->buffer; -+} -+ - static uint32_t * - linear_get_scanline_wide (pixman_iter_t *iter, const uint32_t *mask) - { - uint32_t *buffer = linear_get_scanline_narrow (iter, NULL); - - pixman_expand ((uint64_t *)buffer, buffer, PIXMAN_a8r8g8b8, iter->width); - - return buffer; - } - - void - _pixman_linear_gradient_iter_init (pixman_image_t *image, pixman_iter_t *iter) - { - if (linear_gradient_is_horizontal ( - iter->image, iter->x, iter->y, iter->width, iter->height)) - { -- if (iter->flags & ITER_NARROW) -+ if (iter->flags & ITER_16) -+ linear_get_scanline_16 (iter, NULL); -+ else if (iter->flags & ITER_NARROW) - linear_get_scanline_narrow (iter, NULL); - else - linear_get_scanline_wide (iter, NULL); - - iter->get_scanline = _pixman_iter_get_scanline_noop; - } - else - { -- if (iter->flags & ITER_NARROW) -+ if (iter->flags & ITER_16) -+ iter->get_scanline = linear_get_scanline_16; -+ else if (iter->flags & ITER_NARROW) - iter->get_scanline = linear_get_scanline_narrow; - else - iter->get_scanline = linear_get_scanline_wide; - } - } - - PIXMAN_EXPORT pixman_image_t * - pixman_image_create_linear_gradient (pixman_point_fixed_t * p1, -diff --git a/gfx/cairo/libpixman/src/pixman-private.h b/gfx/cairo/libpixman/src/pixman-private.h ---- a/gfx/cairo/libpixman/src/pixman-private.h -+++ b/gfx/cairo/libpixman/src/pixman-private.h -@@ -152,24 +152,28 @@ struct bits_image - int height; - uint32_t * bits; - uint32_t * free_me; - int rowstride; /* in number of uint32_t's */ - - fetch_scanline_t get_scanline_32; - fetch_scanline_t get_scanline_64; - -+ fetch_scanline_t fetch_scanline_16; -+ - fetch_scanline_t fetch_scanline_32; - fetch_pixel_32_t fetch_pixel_32; - store_scanline_t store_scanline_32; - - fetch_scanline_t fetch_scanline_64; - fetch_pixel_64_t fetch_pixel_64; - store_scanline_t store_scanline_64; - -+ store_scanline_t store_scanline_16; -+ - /* Used for indirect access to the bits */ - pixman_read_memory_func_t read_func; - pixman_write_memory_func_t write_func; - }; - - union pixman_image - { - image_type_t type; -@@ -202,17 +206,24 @@ typedef enum - * destination. - * - * When he destination is xRGB, this is useful knowledge, because then - * we can treat it as if it were ARGB, which means in some cases we can - * avoid copying it to a temporary buffer. - */ - ITER_LOCALIZED_ALPHA = (1 << 1), - ITER_IGNORE_ALPHA = (1 << 2), -- ITER_IGNORE_RGB = (1 << 3) -+ ITER_IGNORE_RGB = (1 << 3), -+ -+ /* With the addition of ITER_16 we now have two flags that to represent -+ * 3 pipelines. This means that there can be an invalid state when -+ * both ITER_NARROW and ITER_16 are set. In this case -+ * ITER_16 overrides NARROW and we should use the 16 bit pipeline. -+ * Note: ITER_16 still has a 32 bit mask, which is a bit weird. */ -+ ITER_16 = (1 << 4) - } iter_flags_t; - - struct pixman_iter_t - { - /* These are initialized by _pixman_implementation_{src,dest}_init */ - pixman_image_t * image; - uint32_t * buffer; - int x, y; -@@ -429,16 +440,17 @@ typedef pixman_bool_t (*pixman_fill_func - int x, - int y, - int width, - int height, - uint32_t xor); - typedef void (*pixman_iter_init_func_t) (pixman_implementation_t *imp, - pixman_iter_t *iter); - -+void _pixman_setup_combiner_functions_16 (pixman_implementation_t *imp); - void _pixman_setup_combiner_functions_32 (pixman_implementation_t *imp); - void _pixman_setup_combiner_functions_64 (pixman_implementation_t *imp); - - typedef struct - { - pixman_op_t op; - pixman_format_code_t src_format; - uint32_t src_flags; -@@ -459,32 +471,34 @@ struct pixman_implementation_t - pixman_fill_func_t fill; - pixman_iter_init_func_t src_iter_init; - pixman_iter_init_func_t dest_iter_init; - - pixman_combine_32_func_t combine_32[PIXMAN_N_OPERATORS]; - pixman_combine_32_func_t combine_32_ca[PIXMAN_N_OPERATORS]; - pixman_combine_64_func_t combine_64[PIXMAN_N_OPERATORS]; - pixman_combine_64_func_t combine_64_ca[PIXMAN_N_OPERATORS]; -+ pixman_combine_64_func_t combine_16[PIXMAN_N_OPERATORS]; - }; - - uint32_t - _pixman_image_get_solid (pixman_implementation_t *imp, - pixman_image_t * image, - pixman_format_code_t format); - - pixman_implementation_t * - _pixman_implementation_create (pixman_implementation_t *delegate, - const pixman_fast_path_t *fast_paths); - - pixman_combine_32_func_t - _pixman_implementation_lookup_combiner (pixman_implementation_t *imp, - pixman_op_t op, - pixman_bool_t component_alpha, -- pixman_bool_t wide); -+ pixman_bool_t wide, -+ pixman_bool_t rgb16); - - pixman_bool_t - _pixman_implementation_blt (pixman_implementation_t *imp, - uint32_t * src_bits, - uint32_t * dst_bits, - int src_stride, - int dst_stride, - int src_bpp, -@@ -613,16 +627,17 @@ uint32_t * - #define FAST_PATH_Y_UNIT_ZERO (1 << 18) - #define FAST_PATH_BILINEAR_FILTER (1 << 19) - #define FAST_PATH_ROTATE_90_TRANSFORM (1 << 20) - #define FAST_PATH_ROTATE_180_TRANSFORM (1 << 21) - #define FAST_PATH_ROTATE_270_TRANSFORM (1 << 22) - #define FAST_PATH_SAMPLES_COVER_CLIP_NEAREST (1 << 23) - #define FAST_PATH_SAMPLES_COVER_CLIP_BILINEAR (1 << 24) - #define FAST_PATH_BITS_IMAGE (1 << 25) -+#define FAST_PATH_16_FORMAT (1 << 26) - - #define FAST_PATH_PAD_REPEAT \ - (FAST_PATH_NO_NONE_REPEAT | \ - FAST_PATH_NO_NORMAL_REPEAT | \ - FAST_PATH_NO_REFLECT_REPEAT) - - #define FAST_PATH_NORMAL_REPEAT \ - (FAST_PATH_NO_NONE_REPEAT | \ -diff --git a/gfx/cairo/libpixman/src/pixman-radial-gradient.c b/gfx/cairo/libpixman/src/pixman-radial-gradient.c ---- a/gfx/cairo/libpixman/src/pixman-radial-gradient.c -+++ b/gfx/cairo/libpixman/src/pixman-radial-gradient.c -@@ -395,35 +395,289 @@ radial_get_scanline_narrow (pixman_iter_ - v.vector[2] += unit.vector[2]; - } - } - - iter->y++; - return iter->buffer; - } - -+static uint16_t convert_8888_to_0565(uint32_t color) -+{ -+ return CONVERT_8888_TO_0565(color); -+} -+ -+static uint32_t * -+radial_get_scanline_16 (pixman_iter_t *iter, const uint32_t *mask) -+{ -+ /* -+ * Implementation of radial gradients following the PDF specification. -+ * See section 8.7.4.5.4 Type 3 (Radial) Shadings of the PDF Reference -+ * Manual (PDF 32000-1:2008 at the time of this writing). -+ * -+ * In the radial gradient problem we are given two circles (câ‚,râ‚) and -+ * (câ‚‚,râ‚‚) that define the gradient itself. -+ * -+ * Mathematically the gradient can be defined as the family of circles -+ * -+ * ((1-t)·câ‚ + t·(câ‚‚), (1-t)·râ‚ + t·râ‚‚) -+ * -+ * excluding those circles whose radius would be < 0. When a point -+ * belongs to more than one circle, the one with a bigger t is the only -+ * one that contributes to its color. When a point does not belong -+ * to any of the circles, it is transparent black, i.e. RGBA (0, 0, 0, 0). -+ * Further limitations on the range of values for t are imposed when -+ * the gradient is not repeated, namely t must belong to [0,1]. -+ * -+ * The graphical result is the same as drawing the valid (radius > 0) -+ * circles with increasing t in [-inf, +inf] (or in [0,1] if the gradient -+ * is not repeated) using SOURCE operator composition. -+ * -+ * It looks like a cone pointing towards the viewer if the ending circle -+ * is smaller than the starting one, a cone pointing inside the page if -+ * the starting circle is the smaller one and like a cylinder if they -+ * have the same radius. -+ * -+ * What we actually do is, given the point whose color we are interested -+ * in, compute the t values for that point, solving for t in: -+ * -+ * length((1-t)·câ‚ + t·(câ‚‚) - p) = (1-t)·râ‚ + t·râ‚‚ -+ * -+ * Let's rewrite it in a simpler way, by defining some auxiliary -+ * variables: -+ * -+ * cd = câ‚‚ - câ‚ -+ * pd = p - câ‚ -+ * dr = râ‚‚ - râ‚ -+ * length(t·cd - pd) = râ‚ + t·dr -+ * -+ * which actually means -+ * -+ * hypot(t·cdx - pdx, t·cdy - pdy) = râ‚ + t·dr -+ * -+ * or -+ * -+ * ⎷((t·cdx - pdx)² + (t·cdy - pdy)²) = râ‚ + t·dr. -+ * -+ * If we impose (as stated earlier) that râ‚ + t·dr >= 0, it becomes: -+ * -+ * (t·cdx - pdx)² + (t·cdy - pdy)² = (râ‚ + t·dr)² -+ * -+ * where we can actually expand the squares and solve for t: -+ * -+ * t²cdx² - 2t·cdx·pdx + pdx² + t²cdy² - 2t·cdy·pdy + pdy² = -+ * = r₲ + 2·râ‚·t·dr + t²·dr² -+ * -+ * (cdx² + cdy² - dr²)t² - 2(cdx·pdx + cdy·pdy + râ‚·dr)t + -+ * (pdx² + pdy² - r₲) = 0 -+ * -+ * A = cdx² + cdy² - dr² -+ * B = pdx·cdx + pdy·cdy + râ‚·dr -+ * C = pdx² + pdy² - r₲ -+ * At² - 2Bt + C = 0 -+ * -+ * The solutions (unless the equation degenerates because of A = 0) are: -+ * -+ * t = (B ± ⎷(B² - A·C)) / A -+ * -+ * The solution we are going to prefer is the bigger one, unless the -+ * radius associated to it is negative (or it falls outside the valid t -+ * range). -+ * -+ * Additional observations (useful for optimizations): -+ * A does not depend on p -+ * -+ * A < 0 <=> one of the two circles completely contains the other one -+ * <=> for every p, the radiuses associated with the two t solutions -+ * have opposite sign -+ */ -+ pixman_image_t *image = iter->image; -+ int x = iter->x; -+ int y = iter->y; -+ int width = iter->width; -+ uint16_t *buffer = iter->buffer; -+ -+ gradient_t *gradient = (gradient_t *)image; -+ radial_gradient_t *radial = (radial_gradient_t *)image; -+ uint16_t *end = buffer + width; -+ pixman_gradient_walker_t walker; -+ pixman_vector_t v, unit; -+ -+ /* reference point is the center of the pixel */ -+ v.vector[0] = pixman_int_to_fixed (x) + pixman_fixed_1 / 2; -+ v.vector[1] = pixman_int_to_fixed (y) + pixman_fixed_1 / 2; -+ v.vector[2] = pixman_fixed_1; -+ -+ _pixman_gradient_walker_init (&walker, gradient, image->common.repeat); -+ -+ if (image->common.transform) -+ { -+ if (!pixman_transform_point_3d (image->common.transform, &v)) -+ return iter->buffer; -+ -+ unit.vector[0] = image->common.transform->matrix[0][0]; -+ unit.vector[1] = image->common.transform->matrix[1][0]; -+ unit.vector[2] = image->common.transform->matrix[2][0]; -+ } -+ else -+ { -+ unit.vector[0] = pixman_fixed_1; -+ unit.vector[1] = 0; -+ unit.vector[2] = 0; -+ } -+ -+ if (unit.vector[2] == 0 && v.vector[2] == pixman_fixed_1) -+ { -+ /* -+ * Given: -+ * -+ * t = (B ± ⎷(B² - A·C)) / A -+ * -+ * where -+ * -+ * A = cdx² + cdy² - dr² -+ * B = pdx·cdx + pdy·cdy + râ‚·dr -+ * C = pdx² + pdy² - r₲ -+ * det = B² - A·C -+ * -+ * Since we have an affine transformation, we know that (pdx, pdy) -+ * increase linearly with each pixel, -+ * -+ * pdx = pdxâ‚€ + n·ux, -+ * pdy = pdyâ‚€ + n·uy, -+ * -+ * we can then express B, C and det through multiple differentiation. -+ */ -+ pixman_fixed_32_32_t b, db, c, dc, ddc; -+ -+ /* warning: this computation may overflow */ -+ v.vector[0] -= radial->c1.x; -+ v.vector[1] -= radial->c1.y; -+ -+ /* -+ * B and C are computed and updated exactly. -+ * If fdot was used instead of dot, in the worst case it would -+ * lose 11 bits of precision in each of the multiplication and -+ * summing up would zero out all the bit that were preserved, -+ * thus making the result 0 instead of the correct one. -+ * This would mean a worst case of unbound relative error or -+ * about 2^10 absolute error -+ */ -+ b = dot (v.vector[0], v.vector[1], radial->c1.radius, -+ radial->delta.x, radial->delta.y, radial->delta.radius); -+ db = dot (unit.vector[0], unit.vector[1], 0, -+ radial->delta.x, radial->delta.y, 0); -+ -+ c = dot (v.vector[0], v.vector[1], -+ -((pixman_fixed_48_16_t) radial->c1.radius), -+ v.vector[0], v.vector[1], radial->c1.radius); -+ dc = dot (2 * (pixman_fixed_48_16_t) v.vector[0] + unit.vector[0], -+ 2 * (pixman_fixed_48_16_t) v.vector[1] + unit.vector[1], -+ 0, -+ unit.vector[0], unit.vector[1], 0); -+ ddc = 2 * dot (unit.vector[0], unit.vector[1], 0, -+ unit.vector[0], unit.vector[1], 0); -+ -+ while (buffer < end) -+ { -+ if (!mask || *mask++) -+ { -+ *buffer = convert_8888_to_0565( -+ radial_compute_color (radial->a, b, c, -+ radial->inva, -+ radial->delta.radius, -+ radial->mindr, -+ &walker, -+ image->common.repeat)); -+ } -+ -+ b += db; -+ c += dc; -+ dc += ddc; -+ ++buffer; -+ } -+ } -+ else -+ { -+ /* projective */ -+ /* Warning: -+ * error propagation guarantees are much looser than in the affine case -+ */ -+ while (buffer < end) -+ { -+ if (!mask || *mask++) -+ { -+ if (v.vector[2] != 0) -+ { -+ double pdx, pdy, invv2, b, c; -+ -+ invv2 = 1. * pixman_fixed_1 / v.vector[2]; -+ -+ pdx = v.vector[0] * invv2 - radial->c1.x; -+ /* / pixman_fixed_1 */ -+ -+ pdy = v.vector[1] * invv2 - radial->c1.y; -+ /* / pixman_fixed_1 */ -+ -+ b = fdot (pdx, pdy, radial->c1.radius, -+ radial->delta.x, radial->delta.y, -+ radial->delta.radius); -+ /* / pixman_fixed_1 / pixman_fixed_1 */ -+ -+ c = fdot (pdx, pdy, -radial->c1.radius, -+ pdx, pdy, radial->c1.radius); -+ /* / pixman_fixed_1 / pixman_fixed_1 */ -+ -+ *buffer = convert_8888_to_0565 ( -+ radial_compute_color (radial->a, b, c, -+ radial->inva, -+ radial->delta.radius, -+ radial->mindr, -+ &walker, -+ image->common.repeat)); -+ } -+ else -+ { -+ *buffer = 0; -+ } -+ } -+ -+ ++buffer; -+ -+ v.vector[0] += unit.vector[0]; -+ v.vector[1] += unit.vector[1]; -+ v.vector[2] += unit.vector[2]; -+ } -+ } -+ -+ iter->y++; -+ return iter->buffer; -+} - static uint32_t * - radial_get_scanline_wide (pixman_iter_t *iter, const uint32_t *mask) - { - uint32_t *buffer = radial_get_scanline_narrow (iter, NULL); - - pixman_expand ((uint64_t *)buffer, buffer, PIXMAN_a8r8g8b8, iter->width); - - return buffer; - } - - void - _pixman_radial_gradient_iter_init (pixman_image_t *image, pixman_iter_t *iter) - { -- if (iter->flags & ITER_NARROW) -+ if (iter->flags & ITER_16) -+ iter->get_scanline = radial_get_scanline_16; -+ else if (iter->flags & ITER_NARROW) - iter->get_scanline = radial_get_scanline_narrow; - else - iter->get_scanline = radial_get_scanline_wide; - } - -+ - PIXMAN_EXPORT pixman_image_t * - pixman_image_create_radial_gradient (pixman_point_fixed_t * inner, - pixman_point_fixed_t * outer, - pixman_fixed_t inner_radius, - pixman_fixed_t outer_radius, - const pixman_gradient_stop_t *stops, - int n_stops) - { diff --git a/gfx/cairo/pixman-8888-over-565.patch b/gfx/cairo/pixman-8888-over-565.patch deleted file mode 100644 index d6ab4618f..000000000 --- a/gfx/cairo/pixman-8888-over-565.patch +++ /dev/null @@ -1,712 +0,0 @@ -changeset: 96613:3e003f0b8026 -tag: 2pass -tag: qbase -tag: qtip -tag: tip -user: Jeff Muizelaar <jmuizelaar@mozilla.com> -date: Thu May 17 19:23:53 2012 -0400 -summary: Bug 757878. Add a fast path for 8888_over_565 with NEON. r=bgirard,joe - -diff --git a/gfx/cairo/libpixman/src/pixman-arm-common.h b/gfx/cairo/libpixman/src/pixman-arm-common.h ---- a/gfx/cairo/libpixman/src/pixman-arm-common.h -+++ b/gfx/cairo/libpixman/src/pixman-arm-common.h -@@ -355,26 +355,26 @@ scaled_bilinear_scanline_##cputype##_##n - if ((flags & SKIP_ZERO_SRC) && zero_src) \ - return; \ - pixman_scaled_bilinear_scanline_##name##_##op##_asm_##cputype ( \ - dst, src_top, src_bottom, wt, wb, vx, unit_x, w); \ - } \ - \ - FAST_BILINEAR_MAINLOOP_COMMON (cputype##_##name##_cover_##op, \ - scaled_bilinear_scanline_##cputype##_##name##_##op, \ -- src_type, uint32_t, dst_type, COVER, FLAG_NONE) \ -+ NULL, src_type, uint32_t, dst_type, COVER, FLAG_NONE) \ - FAST_BILINEAR_MAINLOOP_COMMON (cputype##_##name##_none_##op, \ - scaled_bilinear_scanline_##cputype##_##name##_##op, \ -- src_type, uint32_t, dst_type, NONE, FLAG_NONE) \ -+ NULL, src_type, uint32_t, dst_type, NONE, FLAG_NONE) \ - FAST_BILINEAR_MAINLOOP_COMMON (cputype##_##name##_pad_##op, \ - scaled_bilinear_scanline_##cputype##_##name##_##op, \ -- src_type, uint32_t, dst_type, PAD, FLAG_NONE) \ -+ NULL, src_type, uint32_t, dst_type, PAD, FLAG_NONE) \ - FAST_BILINEAR_MAINLOOP_COMMON (cputype##_##name##_normal_##op, \ - scaled_bilinear_scanline_##cputype##_##name##_##op, \ -- src_type, uint32_t, dst_type, NORMAL, \ -+ NULL, src_type, uint32_t, dst_type, NORMAL, \ - FLAG_NONE) - - - #define PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST(flags, cputype, name, op, \ - src_type, dst_type) \ - void \ - pixman_scaled_bilinear_scanline_##name##_##op##_asm_##cputype ( \ - dst_type * dst, \ -@@ -404,25 +404,25 @@ scaled_bilinear_scanline_##cputype##_##n - if ((flags & SKIP_ZERO_SRC) && zero_src) \ - return; \ - pixman_scaled_bilinear_scanline_##name##_##op##_asm_##cputype ( \ - dst, mask, src_top, src_bottom, wt, wb, vx, unit_x, w); \ - } \ - \ - FAST_BILINEAR_MAINLOOP_COMMON (cputype##_##name##_cover_##op, \ - scaled_bilinear_scanline_##cputype##_##name##_##op, \ -- src_type, uint8_t, dst_type, COVER, \ -+ NULL, src_type, uint8_t, dst_type, COVER, \ - FLAG_HAVE_NON_SOLID_MASK) \ - FAST_BILINEAR_MAINLOOP_COMMON (cputype##_##name##_none_##op, \ - scaled_bilinear_scanline_##cputype##_##name##_##op, \ -- src_type, uint8_t, dst_type, NONE, \ -+ NULL, src_type, uint8_t, dst_type, NONE, \ - FLAG_HAVE_NON_SOLID_MASK) \ - FAST_BILINEAR_MAINLOOP_COMMON (cputype##_##name##_pad_##op, \ - scaled_bilinear_scanline_##cputype##_##name##_##op, \ -- src_type, uint8_t, dst_type, PAD, \ -+ NULL, src_type, uint8_t, dst_type, PAD, \ - FLAG_HAVE_NON_SOLID_MASK) \ - FAST_BILINEAR_MAINLOOP_COMMON (cputype##_##name##_normal_##op, \ - scaled_bilinear_scanline_##cputype##_##name##_##op, \ -- src_type, uint8_t, dst_type, NORMAL, \ -+ NULL, src_type, uint8_t, dst_type, NORMAL, \ - FLAG_HAVE_NON_SOLID_MASK) - - - #endif -diff --git a/gfx/cairo/libpixman/src/pixman-arm-neon.c b/gfx/cairo/libpixman/src/pixman-arm-neon.c ---- a/gfx/cairo/libpixman/src/pixman-arm-neon.c -+++ b/gfx/cairo/libpixman/src/pixman-arm-neon.c -@@ -140,16 +140,33 @@ PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST - PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 8888_0565, SRC, - uint32_t, uint16_t) - PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 0565_x888, SRC, - uint16_t, uint32_t) - PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 0565_0565, SRC, - uint16_t, uint16_t) - PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (SKIP_ZERO_SRC, neon, 8888_8888, OVER, - uint32_t, uint32_t) -+static force_inline void -+pixman_scaled_bilinear_scanline_8888_8888_SRC ( -+ uint32_t * dst, -+ const uint32_t * mask, -+ const uint32_t * src_top, -+ const uint32_t * src_bottom, -+ int32_t w, -+ int wt, -+ int wb, -+ pixman_fixed_t vx, -+ pixman_fixed_t unit_x, -+ pixman_fixed_t max_vx, -+ pixman_bool_t zero_src) -+{ -+ pixman_scaled_bilinear_scanline_8888_8888_SRC_asm_neon (dst, src_top, src_bottom, wt, wb, vx, unit_x, w); -+} -+ - PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (SKIP_ZERO_SRC, neon, 8888_8888, ADD, - uint32_t, uint32_t) - - PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 8888_8_8888, SRC, - uint32_t, uint32_t) - PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 8888_8_0565, SRC, - uint32_t, uint16_t) - PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 0565_8_x888, SRC, -@@ -261,16 +278,38 @@ pixman_blt_neon (uint32_t *src_bits, - (uint32_t *)(((char *) src_bits) + - src_y * src_stride * 4 + src_x * 4), src_stride); - return TRUE; - default: - return FALSE; - } - } - -+static inline void op_bilinear_over_8888_0565(uint16_t *dst, const uint32_t *mask, const uint32_t *src, int width) -+{ -+ pixman_composite_over_8888_0565_asm_neon (width, 1, dst, 0, src, 0); -+} -+ -+FAST_BILINEAR_MAINLOOP_COMMON (neon_8888_0565_cover_OVER, -+ pixman_scaled_bilinear_scanline_8888_8888_SRC, op_bilinear_over_8888_0565, -+ uint32_t, uint32_t, uint16_t, -+ COVER, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (neon_8888_0565_pad_OVER, -+ pixman_scaled_bilinear_scanline_8888_8888_SRC, op_bilinear_over_8888_0565, -+ uint32_t, uint32_t, uint16_t, -+ PAD, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (neon_8888_0565_none_OVER, -+ pixman_scaled_bilinear_scanline_8888_8888_SRC, op_bilinear_over_8888_0565, -+ uint32_t, uint32_t, uint16_t, -+ NONE, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (neon_8888_0565_normal_OVER, -+ pixman_scaled_bilinear_scanline_8888_8888_SRC, op_bilinear_over_8888_0565, -+ uint32_t, uint32_t, uint16_t, -+ NORMAL, FLAG_NONE) -+ - static const pixman_fast_path_t arm_neon_fast_paths[] = - { - PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, r5g6b5, neon_composite_src_0565_0565), - PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, b5g6r5, neon_composite_src_0565_0565), - PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, r5g6b5, neon_composite_src_8888_0565), - PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, r5g6b5, neon_composite_src_8888_0565), - PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, b5g6r5, neon_composite_src_8888_0565), - PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, b5g6r5, neon_composite_src_8888_0565), -@@ -414,16 +453,18 @@ static const pixman_fast_path_t arm_neon - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, r5g6b5, r5g6b5, neon_0565_8_0565), - - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8_8888), - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8_8888), - - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, neon_8888_8_8888), - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (ADD, a8r8g8b8, x8r8g8b8, neon_8888_8_8888), - -+ SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, r5g6b5, neon_8888_0565), -+ - { PIXMAN_OP_NONE }, - }; - - static pixman_bool_t - arm_neon_blt (pixman_implementation_t *imp, - uint32_t * src_bits, - uint32_t * dst_bits, - int src_stride, -diff --git a/gfx/cairo/libpixman/src/pixman-fast-path.c b/gfx/cairo/libpixman/src/pixman-fast-path.c ---- a/gfx/cairo/libpixman/src/pixman-fast-path.c -+++ b/gfx/cairo/libpixman/src/pixman-fast-path.c -@@ -1356,63 +1356,63 @@ scaled_bilinear_scanline_565_565_SRC (ui - vx += unit_x; - *dst++ = d; - } - } - - #endif - - FAST_BILINEAR_MAINLOOP_COMMON (565_565_cover_SRC, -- scaled_bilinear_scanline_565_565_SRC, -+ scaled_bilinear_scanline_565_565_SRC, NULL, - uint16_t, uint32_t, uint16_t, - COVER, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (565_565_pad_SRC, -- scaled_bilinear_scanline_565_565_SRC, -+ scaled_bilinear_scanline_565_565_SRC, NULL, - uint16_t, uint32_t, uint16_t, - PAD, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (565_565_none_SRC, -- scaled_bilinear_scanline_565_565_SRC, -+ scaled_bilinear_scanline_565_565_SRC, NULL, - uint16_t, uint32_t, uint16_t, - NONE, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (565_565_normal_SRC, -- scaled_bilinear_scanline_565_565_SRC, -+ scaled_bilinear_scanline_565_565_SRC, NULL, - uint16_t, uint32_t, uint16_t, - NORMAL, FLAG_NONE) - - FAST_BILINEAR_MAINLOOP_COMMON (8888_565_cover_OVER, -- scaled_bilinear_scanline_8888_565_OVER, -+ scaled_bilinear_scanline_8888_565_OVER, NULL, - uint32_t, uint32_t, uint16_t, - COVER, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (8888_565_pad_OVER, -- scaled_bilinear_scanline_8888_565_OVER, -+ scaled_bilinear_scanline_8888_565_OVER, NULL, - uint32_t, uint32_t, uint16_t, - PAD, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (8888_565_none_OVER, -- scaled_bilinear_scanline_8888_565_OVER, -+ scaled_bilinear_scanline_8888_565_OVER, NULL, - uint32_t, uint32_t, uint16_t, - NONE, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (8888_565_normal_OVER, -- scaled_bilinear_scanline_8888_565_OVER, -+ scaled_bilinear_scanline_8888_565_OVER, NULL, - uint32_t, uint32_t, uint16_t, - NORMAL, FLAG_NONE) - - FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_cover_OVER, -- scaled_bilinear_scanline_8888_8888_OVER, -+ scaled_bilinear_scanline_8888_8888_OVER, NULL, - uint32_t, uint32_t, uint32_t, - COVER, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_pad_OVER, -- scaled_bilinear_scanline_8888_8888_OVER, -+ scaled_bilinear_scanline_8888_8888_OVER, NULL, - uint32_t, uint32_t, uint32_t, - PAD, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_none_OVER, -- scaled_bilinear_scanline_8888_8888_OVER, -+ scaled_bilinear_scanline_8888_8888_OVER, NULL, - uint32_t, uint32_t, uint32_t, - NONE, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_normal_OVER, -- scaled_bilinear_scanline_8888_8888_OVER, -+ scaled_bilinear_scanline_8888_8888_OVER, NULL, - uint32_t, uint32_t, uint32_t, - NORMAL, FLAG_NONE) - - #define REPEAT_MIN_WIDTH 32 - - static void - fast_composite_tiled_repeat (pixman_implementation_t *imp, - pixman_composite_info_t *info) -diff --git a/gfx/cairo/libpixman/src/pixman-inlines.h b/gfx/cairo/libpixman/src/pixman-inlines.h ---- a/gfx/cairo/libpixman/src/pixman-inlines.h -+++ b/gfx/cairo/libpixman/src/pixman-inlines.h -@@ -816,18 +816,48 @@ bilinear_pad_repeat_get_scanline_bounds - * - * Note: normally the sum of 'weight_top' and 'weight_bottom' is equal to 256, - * but sometimes it may be less than that for NONE repeat when handling - * fuzzy antialiased top or bottom image edges. Also both top and - * bottom weight variables are guaranteed to have value in 0-255 - * range and can fit into unsigned byte or be used with 8-bit SIMD - * multiplication instructions. - */ --#define FAST_BILINEAR_MAINLOOP_INT(scale_func_name, scanline_func, src_type_t, mask_type_t, \ -- dst_type_t, repeat_mode, flags) \ -+ -+/* Replace a single "scanline_func" with "fetch_func" & "op_func" to allow optional -+ * two stage processing (bilinear fetch to a temp buffer, followed by unscaled -+ * combine), "op_func" may be NULL, in this case we keep old behavior. -+ * This is ugly and gcc issues some warnings, but works. -+ * -+ * An advice: clang has much better error reporting than gcc for deeply nested macros. -+ */ -+ -+#define scanline_func(dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buf, mask, src_top, src_bottom, width, \ -+ weight_top, weight_bottom, vx, unit_x, max_vx, zero_src) \ -+ do { \ -+ if (op_func != NULL) \ -+ { \ -+ fetch_func ((void *)scanline_buf, (mask), (src_top), (src_bottom), (width), \ -+ (weight_top), (weight_bottom), (vx), (unit_x), (max_vx), (zero_src)); \ -+ ((void (*)(dst_type_t *, const mask_type_t *, const src_type_t *, int)) op_func)\ -+ ((dst), (mask), (src_type_t *)scanline_buf, (width)); \ -+ } \ -+ else \ -+ { \ -+ fetch_func ((void*)(dst), (mask), (src_top), (src_bottom), (width), (weight_top), \ -+ (weight_bottom), (vx), (unit_x), (max_vx), (zero_src)); \ -+ } \ -+ } while (0) -+ -+ -+#define SCANLINE_BUFFER_LENGTH 3072 -+ -+#define FAST_BILINEAR_MAINLOOP_INT(scale_func_name, fetch_func, op_func, src_type_t, \ -+ mask_type_t, dst_type_t, repeat_mode, flags) \ - static void \ - fast_composite_scaled_bilinear ## scale_func_name (pixman_implementation_t *imp, \ - pixman_composite_info_t *info) \ - { \ - PIXMAN_COMPOSITE_ARGS (info); \ - dst_type_t *dst_line; \ - mask_type_t *mask_line; \ - src_type_t *src_first_line; \ -@@ -842,16 +872,19 @@ fast_composite_scaled_bilinear ## scale_ - mask_type_t solid_mask; \ - const mask_type_t *mask = &solid_mask; \ - int src_stride, mask_stride, dst_stride; \ - \ - int src_width; \ - pixman_fixed_t src_width_fixed; \ - int max_x; \ - pixman_bool_t need_src_extension; \ -+ \ -+ uint64_t stack_scanline_buffer[SCANLINE_BUFFER_LENGTH]; \ -+ uint8_t *scanline_buffer = (uint8_t *) stack_scanline_buffer; \ - \ - PIXMAN_IMAGE_GET_LINE (dest_image, dest_x, dest_y, dst_type_t, dst_stride, dst_line, 1); \ - if (flags & FLAG_HAVE_SOLID_MASK) \ - { \ - solid_mask = _pixman_image_get_solid (imp, mask_image, dest_image->bits.format); \ - mask_stride = 0; \ - } \ - else if (flags & FLAG_HAVE_NON_SOLID_MASK) \ -@@ -914,16 +947,24 @@ fast_composite_scaled_bilinear ## scale_ - else \ - { \ - src_width = src_image->bits.width; \ - need_src_extension = FALSE; \ - } \ - \ - src_width_fixed = pixman_int_to_fixed (src_width); \ - } \ -+ \ -+ if (op_func != NULL && width * sizeof(src_type_t) > sizeof(stack_scanline_buffer)) \ -+ { \ -+ scanline_buffer = pixman_malloc_ab (width, sizeof(src_type_t)); \ -+ \ -+ if (!scanline_buffer) \ -+ return; \ -+ } \ - \ - while (--height >= 0) \ - { \ - int weight1, weight2; \ - dst = dst_line; \ - dst_line += dst_stride; \ - vx = v.vector[0]; \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ -@@ -956,36 +997,39 @@ fast_composite_scaled_bilinear ## scale_ - repeat (PIXMAN_REPEAT_PAD, &y2, src_image->bits.height); \ - src1 = src_first_line + src_stride * y1; \ - src2 = src_first_line + src_stride * y2; \ - \ - if (left_pad > 0) \ - { \ - buf1[0] = buf1[1] = src1[0]; \ - buf2[0] = buf2[1] = src2[0]; \ -- scanline_func (dst, mask, \ -- buf1, buf2, left_pad, weight1, weight2, 0, 0, 0, FALSE); \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, buf1, buf2, left_pad, weight1, weight2, \ -+ 0, 0, 0, FALSE); \ - dst += left_pad; \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ - mask += left_pad; \ - } \ - if (width > 0) \ - { \ -- scanline_func (dst, mask, \ -- src1, src2, width, weight1, weight2, vx, unit_x, 0, FALSE); \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, src1, src2, width, weight1, weight2, \ -+ vx, unit_x, 0, FALSE); \ - dst += width; \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ - mask += width; \ - } \ - if (right_pad > 0) \ - { \ - buf1[0] = buf1[1] = src1[src_image->bits.width - 1]; \ - buf2[0] = buf2[1] = src2[src_image->bits.width - 1]; \ -- scanline_func (dst, mask, \ -- buf1, buf2, right_pad, weight1, weight2, 0, 0, 0, FALSE); \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, buf1, buf2, right_pad, weight1, weight2, \ -+ 0, 0, 0, FALSE); \ - } \ - } \ - else if (PIXMAN_REPEAT_ ## repeat_mode == PIXMAN_REPEAT_NONE) \ - { \ - src_type_t *src1, *src2; \ - src_type_t buf1[2]; \ - src_type_t buf2[2]; \ - /* handle top/bottom zero padding by just setting weights to 0 if needed */ \ -@@ -1011,64 +1055,67 @@ fast_composite_scaled_bilinear ## scale_ - } \ - src1 = src_first_line + src_stride * y1; \ - src2 = src_first_line + src_stride * y2; \ - \ - if (left_pad > 0) \ - { \ - buf1[0] = buf1[1] = 0; \ - buf2[0] = buf2[1] = 0; \ -- scanline_func (dst, mask, \ -- buf1, buf2, left_pad, weight1, weight2, 0, 0, 0, TRUE); \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, buf1, buf2, left_pad, weight1, weight2, \ -+ 0, 0, 0, TRUE); \ - dst += left_pad; \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ - mask += left_pad; \ - } \ - if (left_tz > 0) \ - { \ - buf1[0] = 0; \ - buf1[1] = src1[0]; \ - buf2[0] = 0; \ - buf2[1] = src2[0]; \ -- scanline_func (dst, mask, \ -- buf1, buf2, left_tz, weight1, weight2, \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, buf1, buf2, left_tz, weight1, weight2, \ - pixman_fixed_frac (vx), unit_x, 0, FALSE); \ - dst += left_tz; \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ - mask += left_tz; \ - vx += left_tz * unit_x; \ - } \ - if (width > 0) \ - { \ -- scanline_func (dst, mask, \ -- src1, src2, width, weight1, weight2, vx, unit_x, 0, FALSE); \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, src1, src2, width, weight1, weight2, \ -+ vx, unit_x, 0, FALSE); \ - dst += width; \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ - mask += width; \ - vx += width * unit_x; \ - } \ - if (right_tz > 0) \ - { \ - buf1[0] = src1[src_image->bits.width - 1]; \ - buf1[1] = 0; \ - buf2[0] = src2[src_image->bits.width - 1]; \ - buf2[1] = 0; \ -- scanline_func (dst, mask, \ -- buf1, buf2, right_tz, weight1, weight2, \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, buf1, buf2, right_tz, weight1, weight2, \ - pixman_fixed_frac (vx), unit_x, 0, FALSE); \ - dst += right_tz; \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ - mask += right_tz; \ - } \ - if (right_pad > 0) \ - { \ - buf1[0] = buf1[1] = 0; \ - buf2[0] = buf2[1] = 0; \ -- scanline_func (dst, mask, \ -- buf1, buf2, right_pad, weight1, weight2, 0, 0, 0, TRUE); \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, buf1, buf2, right_pad, weight1, weight2, \ -+ 0, 0, 0, TRUE); \ - } \ - } \ - else if (PIXMAN_REPEAT_ ## repeat_mode == PIXMAN_REPEAT_NORMAL) \ - { \ - int32_t num_pixels; \ - int32_t width_remain; \ - src_type_t * src_line_top; \ - src_type_t * src_line_bottom; \ -@@ -1120,17 +1167,18 @@ fast_composite_scaled_bilinear ## scale_ - * vx is in range [0, src_width_fixed - pixman_fixed_e] \ - * So we are safe from overflow. \ - */ \ - num_pixels = ((src_width_fixed - vx - pixman_fixed_e) / unit_x) + 1; \ - \ - if (num_pixels > width_remain) \ - num_pixels = width_remain; \ - \ -- scanline_func (dst, mask, buf1, buf2, num_pixels, \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, \ -+ dst, scanline_buffer, mask, buf1, buf2, num_pixels, \ - weight1, weight2, pixman_fixed_frac(vx), \ - unit_x, src_width_fixed, FALSE); \ - \ - width_remain -= num_pixels; \ - vx += num_pixels * unit_x; \ - dst += num_pixels; \ - \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ -@@ -1149,41 +1197,47 @@ fast_composite_scaled_bilinear ## scale_ - * So we are safe from overflow here. \ - */ \ - num_pixels = ((src_width_fixed - pixman_fixed_1 - vx - pixman_fixed_e) \ - / unit_x) + 1; \ - \ - if (num_pixels > width_remain) \ - num_pixels = width_remain; \ - \ -- scanline_func (dst, mask, src_line_top, src_line_bottom, num_pixels, \ -- weight1, weight2, vx, unit_x, src_width_fixed, FALSE); \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, \ -+ dst, scanline_buffer, mask, src_line_top, src_line_bottom, \ -+ num_pixels, weight1, weight2, vx, unit_x, src_width_fixed, \ -+ FALSE); \ - \ - width_remain -= num_pixels; \ - vx += num_pixels * unit_x; \ - dst += num_pixels; \ - \ - if (flags & FLAG_HAVE_NON_SOLID_MASK) \ - mask += num_pixels; \ - } \ - } \ - } \ - else \ - { \ -- scanline_func (dst, mask, src_first_line + src_stride * y1, \ -+ scanline_func (dst_type_t, mask_type_t, src_type_t, fetch_func, op_func, dst, \ -+ scanline_buffer, mask, \ -+ src_first_line + src_stride * y1, \ - src_first_line + src_stride * y2, width, \ - weight1, weight2, vx, unit_x, max_vx, FALSE); \ - } \ - } \ -+ if (scanline_buffer != (uint8_t *) stack_scanline_buffer) \ -+ free (scanline_buffer); \ - } - - /* A workaround for old sun studio, see: https://bugs.freedesktop.org/show_bug.cgi?id=32764 */ --#define FAST_BILINEAR_MAINLOOP_COMMON(scale_func_name, scanline_func, src_type_t, mask_type_t, \ -+#define FAST_BILINEAR_MAINLOOP_COMMON(scale_func_name, fetch_func, op_func, src_type_t, mask_type_t,\ - dst_type_t, repeat_mode, flags) \ -- FAST_BILINEAR_MAINLOOP_INT(_ ## scale_func_name, scanline_func, src_type_t, mask_type_t,\ -+ FAST_BILINEAR_MAINLOOP_INT(_ ## scale_func_name, fetch_func, op_func, src_type_t, mask_type_t,\ - dst_type_t, repeat_mode, flags) - - #define SCALED_BILINEAR_FLAGS \ - (FAST_PATH_SCALE_TRANSFORM | \ - FAST_PATH_NO_ALPHA_MAP | \ - FAST_PATH_BILINEAR_FILTER | \ - FAST_PATH_NO_ACCESSORS | \ - FAST_PATH_NARROW_FORMAT) -diff --git a/gfx/cairo/libpixman/src/pixman-sse2.c b/gfx/cairo/libpixman/src/pixman-sse2.c ---- a/gfx/cairo/libpixman/src/pixman-sse2.c -+++ b/gfx/cairo/libpixman/src/pixman-sse2.c -@@ -5404,30 +5404,33 @@ scaled_bilinear_scanline_sse2_8888_8888_ - if (w & 1) - { - BILINEAR_INTERPOLATE_ONE_PIXEL (pix1); - *dst = pix1; - } - - } - -+/* Add extra NULL argument to the existing bilinear fast paths to indicate -+ * that we don't need two-pass processing */ -+ - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8888_cover_SRC, -- scaled_bilinear_scanline_sse2_8888_8888_SRC, -+ scaled_bilinear_scanline_sse2_8888_8888_SRC, NULL, - uint32_t, uint32_t, uint32_t, - COVER, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8888_pad_SRC, -- scaled_bilinear_scanline_sse2_8888_8888_SRC, -+ scaled_bilinear_scanline_sse2_8888_8888_SRC, NULL, - uint32_t, uint32_t, uint32_t, - PAD, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8888_none_SRC, -- scaled_bilinear_scanline_sse2_8888_8888_SRC, -+ scaled_bilinear_scanline_sse2_8888_8888_SRC, NULL, - uint32_t, uint32_t, uint32_t, - NONE, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8888_normal_SRC, -- scaled_bilinear_scanline_sse2_8888_8888_SRC, -+ scaled_bilinear_scanline_sse2_8888_8888_SRC, NULL, - uint32_t, uint32_t, uint32_t, - NORMAL, FLAG_NONE) - - static force_inline void - scaled_bilinear_scanline_sse2_8888_8888_OVER (uint32_t * dst, - const uint32_t * mask, - const uint32_t * src_top, - const uint32_t * src_bottom, -@@ -5505,32 +5508,66 @@ scaled_bilinear_scanline_sse2_8888_8888_ - } - - w--; - dst++; - } - } - - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8888_cover_OVER, -- scaled_bilinear_scanline_sse2_8888_8888_OVER, -+ scaled_bilinear_scanline_sse2_8888_8888_OVER, NULL, - uint32_t, uint32_t, uint32_t, - COVER, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8888_pad_OVER, -- scaled_bilinear_scanline_sse2_8888_8888_OVER, -+ scaled_bilinear_scanline_sse2_8888_8888_OVER, NULL, - uint32_t, uint32_t, uint32_t, - PAD, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8888_none_OVER, -- scaled_bilinear_scanline_sse2_8888_8888_OVER, -+ scaled_bilinear_scanline_sse2_8888_8888_OVER, NULL, - uint32_t, uint32_t, uint32_t, - NONE, FLAG_NONE) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8888_normal_OVER, -- scaled_bilinear_scanline_sse2_8888_8888_OVER, -+ scaled_bilinear_scanline_sse2_8888_8888_OVER, NULL, - uint32_t, uint32_t, uint32_t, - NORMAL, FLAG_NONE) - -+ -+/* An example of SSE2 two-stage bilinear_over_8888_0565 fast path, which is implemented -+ as scaled_bilinear_scanline_sse2_8888_8888_SRC + op_bilinear_over_8888_0565 */ -+ -+void op_bilinear_over_8888_0565(uint16_t *dst, const uint32_t *mask, const uint32_t *src, int width) -+{ -+ /* Note: this is not really fast and should be based on 8 pixel loop from sse2_composite_over_8888_0565 */ -+ while (--width >= 0) -+ { -+ *dst = composite_over_8888_0565pixel (*src, *dst); -+ src++; -+ dst++; -+ } -+} -+ -+FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_0565_cover_OVER, -+ scaled_bilinear_scanline_sse2_8888_8888_SRC, op_bilinear_over_8888_0565, -+ uint32_t, uint32_t, uint16_t, -+ COVER, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_0565_pad_OVER, -+ scaled_bilinear_scanline_sse2_8888_8888_SRC, op_bilinear_over_8888_0565, -+ uint32_t, uint32_t, uint16_t, -+ PAD, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_0565_none_OVER, -+ scaled_bilinear_scanline_sse2_8888_8888_SRC, op_bilinear_over_8888_0565, -+ uint32_t, uint32_t, uint16_t, -+ NONE, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_0565_normal_OVER, -+ scaled_bilinear_scanline_sse2_8888_8888_SRC, op_bilinear_over_8888_0565, -+ uint32_t, uint32_t, uint16_t, -+ NORMAL, FLAG_NONE) -+ -+/*****************************/ -+ - static force_inline void - scaled_bilinear_scanline_sse2_8888_8_8888_OVER (uint32_t * dst, - const uint8_t * mask, - const uint32_t * src_top, - const uint32_t * src_bottom, - int32_t w, - int wt, - int wb, -@@ -5669,29 +5706,29 @@ scaled_bilinear_scanline_sse2_8888_8_888 - } - - w--; - dst++; - } - } - - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8_8888_cover_OVER, -- scaled_bilinear_scanline_sse2_8888_8_8888_OVER, -+ scaled_bilinear_scanline_sse2_8888_8_8888_OVER, NULL, - uint32_t, uint8_t, uint32_t, - COVER, FLAG_HAVE_NON_SOLID_MASK) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8_8888_pad_OVER, -- scaled_bilinear_scanline_sse2_8888_8_8888_OVER, -+ scaled_bilinear_scanline_sse2_8888_8_8888_OVER, NULL, - uint32_t, uint8_t, uint32_t, - PAD, FLAG_HAVE_NON_SOLID_MASK) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8_8888_none_OVER, -- scaled_bilinear_scanline_sse2_8888_8_8888_OVER, -+ scaled_bilinear_scanline_sse2_8888_8_8888_OVER, NULL, - uint32_t, uint8_t, uint32_t, - NONE, FLAG_HAVE_NON_SOLID_MASK) - FAST_BILINEAR_MAINLOOP_COMMON (sse2_8888_8_8888_normal_OVER, -- scaled_bilinear_scanline_sse2_8888_8_8888_OVER, -+ scaled_bilinear_scanline_sse2_8888_8_8888_OVER, NULL, - uint32_t, uint8_t, uint32_t, - NORMAL, FLAG_HAVE_NON_SOLID_MASK) - - static const pixman_fast_path_t sse2_fast_paths[] = - { - /* PIXMAN_OP_OVER */ - PIXMAN_STD_FAST_PATH (OVER, solid, a8, r5g6b5, sse2_composite_over_n_8_0565), - PIXMAN_STD_FAST_PATH (OVER, solid, a8, b5g6r5, sse2_composite_over_n_8_0565), -@@ -5808,16 +5845,21 @@ static const pixman_fast_path_t sse2_fas - SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_8888), - SIMPLE_BILINEAR_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_8888), - - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, sse2_8888_8_8888), - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, sse2_8888_8_8888), - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_8_8888), - SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_8_8888), - -+ /* and here the needed entries are added to the fast path table */ -+ -+ SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, r5g6b5, sse2_8888_0565), -+ SIMPLE_BILINEAR_FAST_PATH (OVER, a8b8g8r8, b5g6r5, sse2_8888_0565), -+ - { PIXMAN_OP_NONE }, - }; - - static pixman_bool_t - sse2_blt (pixman_implementation_t *imp, - uint32_t * src_bits, - uint32_t * dst_bits, - int src_stride, - diff --git a/gfx/cairo/pixman-android-cpu-detect.patch b/gfx/cairo/pixman-android-cpu-detect.patch deleted file mode 100644 index 130af5130..000000000 --- a/gfx/cairo/pixman-android-cpu-detect.patch +++ /dev/null @@ -1,29 +0,0 @@ -diff --git a/gfx/cairo/libpixman/src/pixman-cpu.c b/gfx/cairo/libpixman/src/pixman-cpu.c ---- a/gfx/cairo/libpixman/src/pixman-cpu.c -+++ b/gfx/cairo/libpixman/src/pixman-cpu.c -@@ -257,19 +257,22 @@ pixman_arm_read_auxv() - arm_tests_initialized = TRUE; - return; - } - - fread(buf, sizeof(char), 1024, f); - fclose(f); - pos = strstr(buf, ver_token); - if (pos) { -- int ver = *(pos + strlen(ver_token)) - '0'; -- arm_has_v7 = ver >= 7; -- arm_has_v6 = ver >= 6; -+ char vchar = *(pos + strlen(ver_token)); -+ if (vchar >= '0' && vchar <= '9') { -+ int ver = vchar - '0'; -+ arm_has_v7 = ver >= 7; -+ arm_has_v6 = ver >= 6; -+ } - } - arm_has_neon = strstr(buf, "neon") != NULL; - arm_has_vfp = strstr(buf, "vfp") != NULL; - arm_has_iwmmxt = strstr(buf, "iwmmxt") != NULL; - arm_tests_initialized = TRUE; - } - - #else diff --git a/gfx/cairo/pixman-bilinear-fastpath.patch b/gfx/cairo/pixman-bilinear-fastpath.patch deleted file mode 100644 index b2c5f270c..000000000 --- a/gfx/cairo/pixman-bilinear-fastpath.patch +++ /dev/null @@ -1,287 +0,0 @@ -changeset: 94061:73a9b24d863a -tag: bilin -tag: qbase -tag: qtip -tag: tip -user: Jeff Muizelaar <jmuizelaar@mozilla.com> -date: Tue May 15 18:26:16 2012 -0400 -summary: Bug 754364. Add bilinear non-repeat and repeat fast paths. r=joe - -diff --git a/gfx/cairo/libpixman/src/pixman-fast-path.c b/gfx/cairo/libpixman/src/pixman-fast-path.c ---- a/gfx/cairo/libpixman/src/pixman-fast-path.c -+++ b/gfx/cairo/libpixman/src/pixman-fast-path.c -@@ -1186,16 +1186,228 @@ FAST_NEAREST (8888_565_none, 8888, 0565, - FAST_NEAREST (8888_565_pad, 8888, 0565, uint32_t, uint16_t, SRC, PAD) - FAST_NEAREST (8888_565_normal, 8888, 0565, uint32_t, uint16_t, SRC, NORMAL) - FAST_NEAREST (565_565_normal, 0565, 0565, uint16_t, uint16_t, SRC, NORMAL) - FAST_NEAREST (8888_565_cover, 8888, 0565, uint32_t, uint16_t, OVER, COVER) - FAST_NEAREST (8888_565_none, 8888, 0565, uint32_t, uint16_t, OVER, NONE) - FAST_NEAREST (8888_565_pad, 8888, 0565, uint32_t, uint16_t, OVER, PAD) - FAST_NEAREST (8888_565_normal, 8888, 0565, uint32_t, uint16_t, OVER, NORMAL) - -+static force_inline void -+scaled_bilinear_scanline_8888_565_OVER (uint16_t * dst, -+ const uint32_t * mask, -+ const uint32_t * src_top, -+ const uint32_t * src_bottom, -+ int32_t w, -+ int wt, -+ int wb, -+ pixman_fixed_t vx, -+ pixman_fixed_t unit_x, -+ pixman_fixed_t max_vx, -+ pixman_bool_t zero_src) -+{ -+ while ((w -= 1) >= 0) -+ { -+ uint32_t tl = src_top [pixman_fixed_to_int (vx)]; -+ uint32_t tr = src_top [pixman_fixed_to_int (vx) + 1]; -+ uint32_t bl = src_bottom [pixman_fixed_to_int (vx)]; -+ uint32_t br = src_bottom [pixman_fixed_to_int (vx) + 1]; -+ uint32_t src, result; -+ uint16_t d; -+ d = *dst; -+ src = bilinear_interpolation (tl, tr, -+ bl, br, -+ interpolation_coord(vx), -+ wb >> (8 - INTERPOLATION_PRECISION_BITS)); -+ vx += unit_x; -+ result = over (src, CONVERT_0565_TO_0888 (d)); -+ *dst++ = CONVERT_8888_TO_0565(result); -+ } -+} -+ -+static force_inline void -+scaled_bilinear_scanline_8888_8888_OVER (uint32_t * dst, -+ const uint32_t * mask, -+ const uint32_t * src_top, -+ const uint32_t * src_bottom, -+ int32_t w, -+ int wt, -+ int wb, -+ pixman_fixed_t vx, -+ pixman_fixed_t unit_x, -+ pixman_fixed_t max_vx, -+ pixman_bool_t zero_src) -+{ -+ while ((w -= 1) >= 0) -+ { -+ uint32_t tl = src_top [pixman_fixed_to_int (vx)]; -+ uint32_t tr = src_top [pixman_fixed_to_int (vx) + 1]; -+ uint32_t bl = src_bottom [pixman_fixed_to_int (vx)]; -+ uint32_t br = src_bottom [pixman_fixed_to_int (vx) + 1]; -+ uint32_t src; -+ uint32_t d; -+ uint32_t result; -+ d = *dst; -+ src = bilinear_interpolation (tl, tr, -+ bl, br, -+ interpolation_coord(vx), -+ wb >> (8 - INTERPOLATION_PRECISION_BITS)); -+ vx += unit_x; -+ *dst++ = over (src, d); -+ } -+} -+ -+#if 1 -+ -+static force_inline void -+scaled_bilinear_scanline_565_565_SRC (uint16_t * dst, -+ const uint32_t * mask, -+ const uint16_t * src_top, -+ const uint16_t * src_bottom, -+ int32_t w, -+ int wt, -+ int wb, -+ pixman_fixed_t vx, -+ pixman_fixed_t unit_x, -+ pixman_fixed_t max_vx, -+ pixman_bool_t zero_src) -+{ -+ while ((w -= 1) >= 0) -+ { -+ uint16_t tl = src_top [pixman_fixed_to_int (vx)]; -+ uint16_t tr = src_top [pixman_fixed_to_int (vx) + 1]; -+ uint16_t bl = src_bottom [pixman_fixed_to_int (vx)]; -+ uint16_t br = src_bottom [pixman_fixed_to_int (vx) + 1]; -+ uint32_t d; -+ d = bilinear_interpolation(CONVERT_0565_TO_8888(tl), -+ CONVERT_0565_TO_8888(tr), -+ CONVERT_0565_TO_8888(bl), -+ CONVERT_0565_TO_8888(br), -+ interpolation_coord(vx), -+ wb >> (8 - INTERPOLATION_PRECISION_BITS)); -+ vx += unit_x; -+ *dst++ = CONVERT_8888_TO_0565(d); -+ } -+} -+ -+#else -+ -+#define SK_G16_MASK_IN_PLACE 0xfc0 -+ -+static inline uint32_t SkExpand_rgb_16(uint16_t c) { -+ -+ return ((c & SK_G16_MASK_IN_PLACE) << 16) | (c & ~SK_G16_MASK_IN_PLACE); -+} -+ -+/** Compress an expanded value (from SkExpand_rgb_16) back down to a 16bit -+ color value. The computation yields only 16bits of valid data, but we claim -+ to return 32bits, so that the compiler won't generate extra instructions to -+ "clean" the top 16bits. However, the top 16 can contain garbage, so it is -+ up to the caller to safely ignore them. -+*/ -+static inline uint16_t SkCompact_rgb_16(uint32_t c) { -+ return ((c >> 16) & SK_G16_MASK_IN_PLACE) | (c & ~SK_G16_MASK_IN_PLACE); -+} -+// returns expanded * 5bits -+static inline uint32_t Filter_565_Expanded(unsigned x, unsigned y, -+ uint32_t a00, uint32_t a01, -+ uint32_t a10, uint32_t a11) { -+ a00 = SkExpand_rgb_16(a00); -+ a01 = SkExpand_rgb_16(a01); -+ a10 = SkExpand_rgb_16(a10); -+ a11 = SkExpand_rgb_16(a11); -+ -+ int xy = x * y >> 3; -+ return a00 * (32 - 2*y - 2*x + xy) + -+ a01 * (2*x - xy) + -+ a10 * (2*y - xy) + -+ a11 * xy; -+} -+ -+ -+ -+static force_inline void -+scaled_bilinear_scanline_565_565_SRC (uint16_t * dst, -+ const uint32_t * mask, -+ const uint16_t * src_top, -+ const uint16_t * src_bottom, -+ int32_t w, -+ int wt, -+ int wb, -+ pixman_fixed_t vx, -+ pixman_fixed_t unit_x, -+ pixman_fixed_t max_vx, -+ pixman_bool_t zero_src) -+{ -+ while ((w -= 1) >= 0) -+ { -+ uint16_t tl = src_top [pixman_fixed_to_int (vx)]; -+ uint16_t tr = src_top [pixman_fixed_to_int (vx) + 1]; -+ uint16_t bl = src_bottom [pixman_fixed_to_int (vx)]; -+ uint16_t br = src_bottom [pixman_fixed_to_int (vx) + 1]; -+ -+ uint32_t tmp = Filter_565_Expanded((vx>>12)&0xf, wb>>4, tl, tr, bl, br); -+ vx += unit_x; -+ *dst++ = SkCompact_rgb_16((tmp) >> 5); -+ } -+} -+ -+ -+#endif -+FAST_BILINEAR_MAINLOOP_COMMON (565_565_cover_SRC, -+ scaled_bilinear_scanline_565_565_SRC, -+ uint16_t, uint32_t, uint16_t, -+ COVER, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (565_565_pad_SRC, -+ scaled_bilinear_scanline_565_565_SRC, -+ uint16_t, uint32_t, uint16_t, -+ PAD, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (565_565_none_SRC, -+ scaled_bilinear_scanline_565_565_SRC, -+ uint16_t, uint32_t, uint16_t, -+ NONE, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (565_565_normal_SRC, -+ scaled_bilinear_scanline_565_565_SRC, -+ uint16_t, uint32_t, uint16_t, -+ NORMAL, FLAG_NONE) -+ -+FAST_BILINEAR_MAINLOOP_COMMON (8888_565_cover_OVER, -+ scaled_bilinear_scanline_8888_565_OVER, -+ uint32_t, uint32_t, uint16_t, -+ COVER, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (8888_565_pad_OVER, -+ scaled_bilinear_scanline_8888_565_OVER, -+ uint32_t, uint32_t, uint16_t, -+ PAD, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (8888_565_none_OVER, -+ scaled_bilinear_scanline_8888_565_OVER, -+ uint32_t, uint32_t, uint16_t, -+ NONE, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (8888_565_normal_OVER, -+ scaled_bilinear_scanline_8888_565_OVER, -+ uint32_t, uint32_t, uint16_t, -+ NORMAL, FLAG_NONE) -+ -+FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_cover_OVER, -+ scaled_bilinear_scanline_8888_8888_OVER, -+ uint32_t, uint32_t, uint32_t, -+ COVER, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_pad_OVER, -+ scaled_bilinear_scanline_8888_8888_OVER, -+ uint32_t, uint32_t, uint32_t, -+ PAD, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_none_OVER, -+ scaled_bilinear_scanline_8888_8888_OVER, -+ uint32_t, uint32_t, uint32_t, -+ NONE, FLAG_NONE) -+FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_normal_OVER, -+ scaled_bilinear_scanline_8888_8888_OVER, -+ uint32_t, uint32_t, uint32_t, -+ NORMAL, FLAG_NONE) -+ - #define REPEAT_MIN_WIDTH 32 - - static void - fast_composite_tiled_repeat (pixman_implementation_t *imp, - pixman_composite_info_t *info) - { - PIXMAN_COMPOSITE_ARGS (info); - pixman_composite_func_t func; -@@ -1960,16 +2172,20 @@ static const pixman_fast_path_t c_fast_p - PIXMAN_any, - (FAST_PATH_STANDARD_FLAGS | FAST_PATH_ID_TRANSFORM | FAST_PATH_BITS_IMAGE | - FAST_PATH_NORMAL_REPEAT), - PIXMAN_any, 0, - PIXMAN_any, FAST_PATH_STD_DEST_FLAGS, - fast_composite_tiled_repeat - }, - -+ SIMPLE_BILINEAR_FAST_PATH (SRC, r5g6b5, r5g6b5, 565_565), -+ SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, r5g6b5, 8888_565), -+ SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, 8888_8888), -+ - { PIXMAN_OP_NONE }, - }; - - #ifdef WORDS_BIGENDIAN - #define A1_FILL_MASK(n, offs) (((1U << (n)) - 1) << (32 - (offs) - (n))) - #else - #define A1_FILL_MASK(n, offs) (((1U << (n)) - 1) << (offs)) - #endif -diff --git a/gfx/cairo/libpixman/src/pixman-inlines.h b/gfx/cairo/libpixman/src/pixman-inlines.h ---- a/gfx/cairo/libpixman/src/pixman-inlines.h -+++ b/gfx/cairo/libpixman/src/pixman-inlines.h -@@ -80,16 +80,21 @@ repeat (pixman_repeat_t repeat, int *c, - } - return TRUE; - } - - #ifdef MOZ_GFX_OPTIMIZE_MOBILE - #define LOW_QUALITY_INTERPOLATION - #endif - -+#ifdef LOW_QUALITY_INTERPOLATION -+#define INTERPOLATION_PRECISION_BITS 4 -+#else -+#define INTERPOLATION_PRECISION_BITS 8 -+#endif - static force_inline int32_t - interpolation_coord(pixman_fixed_t t) - { - #ifdef LOW_QUALITY_INTERPOLATION - return (t >> 12) & 0xf; - #else - return (t >> 8) & 0xff; - #endif diff --git a/gfx/cairo/pixman-component-alpha.patch b/gfx/cairo/pixman-component-alpha.patch deleted file mode 100644 index f6a6f4a95..000000000 --- a/gfx/cairo/pixman-component-alpha.patch +++ /dev/null @@ -1,34 +0,0 @@ -commit d14b8c688f4cbe6c9289955d9ce7257c07869f9e -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Wed May 6 10:19:04 2009 -0400 - - create getter for component alpha - -diff --git a/gfx/cairo/libpixman/src/pixman-image.c b/gfx/cairo/libpixman/src/pixman-image.c -index e80c479..2c49f92 100644 ---- a/gfx/cairo/libpixman/src/pixman-image.c -+++ b/gfx/cairo/libpixman/src/pixman-image.c -@@ -563,6 +563,11 @@ pixman_image_set_component_alpha (pixman_image_t *image, - image->common.component_alpha = component_alpha; - } - -+PIXMAN_EXPORT pixman_bool_t -+pixman_image_get_component_alpha (pixman_image_t *image) -+{ -+ return image->common.component_alpha; -+} - - PIXMAN_EXPORT void - pixman_image_set_accessors (pixman_image_t *image, -diff --git a/gfx/cairo/libpixman/src/pixman.h b/gfx/cairo/libpixman/src/pixman.h -index 49c39d5..522a866 100644 ---- a/gfx/cairo/libpixman/src/pixman.h -+++ b/gfx/cairo/libpixman/src/pixman.h -@@ -767,6 +767,7 @@ void pixman_image_set_alpha_map (pixman_image_t - int16_t y); - void pixman_image_set_component_alpha (pixman_image_t *image, - pixman_bool_t component_alpha); -+pixman_bool_t pixman_image_get_component_alpha (pixman_image_t *image); - void pixman_image_set_accessors (pixman_image_t *image, - pixman_read_memory_func_t read_func, - pixman_write_memory_func_t write_func); diff --git a/gfx/cairo/pixman-dither.patch b/gfx/cairo/pixman-dither.patch deleted file mode 100644 index 633a8d728..000000000 --- a/gfx/cairo/pixman-dither.patch +++ /dev/null @@ -1,310 +0,0 @@ -diff --git a/gfx/cairo/libpixman/src/pixman-dither.h b/gfx/cairo/libpixman/src/pixman-dither.h -new file mode 100644 ---- /dev/null -+++ b/gfx/cairo/libpixman/src/pixman-dither.h -@@ -0,0 +1,51 @@ -+#define R16_BITS 5 -+#define G16_BITS 6 -+#define B16_BITS 5 -+ -+#define R16_SHIFT (B16_BITS + G16_BITS) -+#define G16_SHIFT (B16_BITS) -+#define B16_SHIFT 0 -+ -+#define MASK 0xff -+#define ONE_HALF 0x80 -+ -+#define A_SHIFT 8 * 3 -+#define R_SHIFT 8 * 2 -+#define G_SHIFT 8 -+#define A_MASK 0xff000000 -+#define R_MASK 0xff0000 -+#define G_MASK 0xff00 -+ -+#define RB_MASK 0xff00ff -+#define AG_MASK 0xff00ff00 -+#define RB_ONE_HALF 0x800080 -+#define RB_MASK_PLUS_ONE 0x10000100 -+ -+#define ALPHA_8(x) ((x) >> A_SHIFT) -+#define RED_8(x) (((x) >> R_SHIFT) & MASK) -+#define GREEN_8(x) (((x) >> G_SHIFT) & MASK) -+#define BLUE_8(x) ((x) & MASK) -+ -+// This uses the same dithering technique that Skia does. -+// It is essentially preturbing the lower bit based on the -+// high bit -+static inline uint16_t dither_32_to_16(uint32_t c) -+{ -+ uint8_t b = BLUE_8(c); -+ uint8_t g = GREEN_8(c); -+ uint8_t r = RED_8(c); -+ r = ((r << 1) - ((r >> (8 - R16_BITS) << (8 - R16_BITS)) | (r >> R16_BITS))) >> (8 - R16_BITS); -+ g = ((g << 1) - ((g >> (8 - G16_BITS) << (8 - G16_BITS)) | (g >> G16_BITS))) >> (8 - G16_BITS); -+ b = ((b << 1) - ((b >> (8 - B16_BITS) << (8 - B16_BITS)) | (b >> B16_BITS))) >> (8 - B16_BITS); -+ return ((r << R16_SHIFT) | (g << G16_SHIFT) | (b << B16_SHIFT)); -+} -+ -+static inline uint16_t dither_8888_to_0565(uint32_t color, pixman_bool_t toggle) -+{ -+ // alternate between a preturbed truncation and a regular truncation -+ if (toggle) { -+ return dither_32_to_16(color); -+ } else { -+ return CONVERT_8888_TO_0565(color); -+ } -+} -diff --git a/gfx/cairo/libpixman/src/pixman-linear-gradient.c b/gfx/cairo/libpixman/src/pixman-linear-gradient.c ---- a/gfx/cairo/libpixman/src/pixman-linear-gradient.c -+++ b/gfx/cairo/libpixman/src/pixman-linear-gradient.c -@@ -26,16 +26,18 @@ - */ - - #ifdef HAVE_CONFIG_H - #include <config.h> - #endif - #include <stdlib.h> - #include "pixman-private.h" - -+#include "pixman-dither.h" -+ - static pixman_bool_t - linear_gradient_is_horizontal (pixman_image_t *image, - int x, - int y, - int width, - int height) - { - linear_gradient_t *linear = (linear_gradient_t *)image; -@@ -222,25 +224,28 @@ linear_get_scanline_narrow (pixman_iter_ - return iter->buffer; - } - - static uint16_t convert_8888_to_0565(uint32_t color) - { - return CONVERT_8888_TO_0565(color); - } - -+ -+ - static uint32_t * - linear_get_scanline_16 (pixman_iter_t *iter, - const uint32_t *mask) - { - pixman_image_t *image = iter->image; - int x = iter->x; - int y = iter->y; - int width = iter->width; - uint16_t * buffer = (uint16_t*)iter->buffer; -+ pixman_bool_t toggle = ((x ^ y) & 1); - - pixman_vector_t v, unit; - pixman_fixed_32_32_t l; - pixman_fixed_48_16_t dx, dy; - gradient_t *gradient = (gradient_t *)image; - linear_gradient_t *linear = (linear_gradient_t *)image; - uint16_t *end = buffer + width; - pixman_gradient_walker_t walker; -@@ -294,34 +299,47 @@ linear_get_scanline_16 (pixman_iter_t * - t = ((dx * v.vector[0] + dy * v.vector[1]) - - (dx * linear->p1.x + dy * linear->p1.y) * v2) * invden; - inc = (dx * unit.vector[0] + dy * unit.vector[1]) * invden; - } - next_inc = 0; - - if (((pixman_fixed_32_32_t )(inc * width)) == 0) - { -- register uint16_t color; -+ register uint32_t color; -+ uint16_t dither_diff; -+ uint16_t color16; -+ uint16_t color16b; - -- color = convert_8888_to_0565(_pixman_gradient_walker_pixel (&walker, t)); -- while (buffer < end) -- *buffer++ = color; -+ color = _pixman_gradient_walker_pixel (&walker, t); -+ color16 = dither_8888_to_0565(color, toggle); -+ color16b = dither_8888_to_0565(color, toggle^1); -+ // compute the difference -+ dither_diff = color16 ^ color16b; -+ while (buffer < end) { -+ *buffer++ = color16; -+ // use dither_diff to toggle between color16 and color16b -+ color16 ^= dither_diff; -+ toggle ^= 1; -+ } - } - else - { - int i; - - i = 0; - while (buffer < end) - { - if (!mask || *mask++) - { -- *buffer = convert_8888_to_0565(_pixman_gradient_walker_pixel (&walker, -- t + next_inc)); -+ *buffer = dither_8888_to_0565(_pixman_gradient_walker_pixel (&walker, -+ t + next_inc), -+ toggle); - } -+ toggle ^= 1; - i++; - next_inc = inc * i; - buffer++; - } - } - } - else - { -@@ -340,18 +358,20 @@ linear_get_scanline_16 (pixman_iter_t * - - invden = pixman_fixed_1 * (double) pixman_fixed_1 / - (l * (double) v.vector[2]); - v2 = v.vector[2] * (1. / pixman_fixed_1); - t = ((dx * v.vector[0] + dy * v.vector[1]) - - (dx * linear->p1.x + dy * linear->p1.y) * v2) * invden; - } - -- *buffer = convert_8888_to_0565(_pixman_gradient_walker_pixel (&walker, t)); -+ *buffer = dither_8888_to_0565(_pixman_gradient_walker_pixel (&walker, t), -+ toggle); - } -+ toggle ^= 1; - - ++buffer; - - v.vector[0] += unit.vector[0]; - v.vector[1] += unit.vector[1]; - v.vector[2] += unit.vector[2]; - } - } -@@ -369,17 +389,18 @@ linear_get_scanline_wide (pixman_iter_t - pixman_expand ((uint64_t *)buffer, buffer, PIXMAN_a8r8g8b8, iter->width); - - return buffer; - } - - void - _pixman_linear_gradient_iter_init (pixman_image_t *image, pixman_iter_t *iter) - { -- if (linear_gradient_is_horizontal ( -+ // XXX: we can't use this optimization when dithering -+ if (0 && linear_gradient_is_horizontal ( - iter->image, iter->x, iter->y, iter->width, iter->height)) - { - if (iter->flags & ITER_16) - linear_get_scanline_16 (iter, NULL); - else if (iter->flags & ITER_NARROW) - linear_get_scanline_narrow (iter, NULL); - else - linear_get_scanline_wide (iter, NULL); -diff --git a/gfx/cairo/libpixman/src/pixman-radial-gradient.c b/gfx/cairo/libpixman/src/pixman-radial-gradient.c ---- a/gfx/cairo/libpixman/src/pixman-radial-gradient.c -+++ b/gfx/cairo/libpixman/src/pixman-radial-gradient.c -@@ -29,16 +29,18 @@ - - #ifdef HAVE_CONFIG_H - #include <config.h> - #endif - #include <stdlib.h> - #include <math.h> - #include "pixman-private.h" - -+#include "pixman-dither.h" -+ - static inline pixman_fixed_32_32_t - dot (pixman_fixed_48_16_t x1, - pixman_fixed_48_16_t y1, - pixman_fixed_48_16_t z1, - pixman_fixed_48_16_t x2, - pixman_fixed_48_16_t y2, - pixman_fixed_48_16_t z2) - { -@@ -489,16 +491,17 @@ radial_get_scanline_16 (pixman_iter_t *i - * <=> for every p, the radiuses associated with the two t solutions - * have opposite sign - */ - pixman_image_t *image = iter->image; - int x = iter->x; - int y = iter->y; - int width = iter->width; - uint16_t *buffer = iter->buffer; -+ pixman_bool_t toggle = ((x ^ y) & 1); - - gradient_t *gradient = (gradient_t *)image; - radial_gradient_t *radial = (radial_gradient_t *)image; - uint16_t *end = buffer + width; - pixman_gradient_walker_t walker; - pixman_vector_t v, unit; - - /* reference point is the center of the pixel */ -@@ -575,25 +578,27 @@ radial_get_scanline_16 (pixman_iter_t *i - unit.vector[0], unit.vector[1], 0); - ddc = 2 * dot (unit.vector[0], unit.vector[1], 0, - unit.vector[0], unit.vector[1], 0); - - while (buffer < end) - { - if (!mask || *mask++) - { -- *buffer = convert_8888_to_0565( -+ *buffer = dither_8888_to_0565( - radial_compute_color (radial->a, b, c, - radial->inva, - radial->delta.radius, - radial->mindr, - &walker, -- image->common.repeat)); -+ image->common.repeat), -+ toggle); - } - -+ toggle ^= 1; - b += db; - c += dc; - dc += ddc; - ++buffer; - } - } - else - { -@@ -621,31 +626,33 @@ radial_get_scanline_16 (pixman_iter_t *i - radial->delta.x, radial->delta.y, - radial->delta.radius); - /* / pixman_fixed_1 / pixman_fixed_1 */ - - c = fdot (pdx, pdy, -radial->c1.radius, - pdx, pdy, radial->c1.radius); - /* / pixman_fixed_1 / pixman_fixed_1 */ - -- *buffer = convert_8888_to_0565 ( -+ *buffer = dither_8888_to_0565 ( - radial_compute_color (radial->a, b, c, - radial->inva, - radial->delta.radius, - radial->mindr, - &walker, -- image->common.repeat)); -+ image->common.repeat), -+ toggle); - } - else - { - *buffer = 0; - } - } - - ++buffer; -+ toggle ^= 1; - - v.vector[0] += unit.vector[0]; - v.vector[1] += unit.vector[1]; - v.vector[2] += unit.vector[2]; - } - } - - iter->y++; - diff --git a/gfx/cairo/pixman-enable-altivec-acceleration.patch b/gfx/cairo/pixman-enable-altivec-acceleration.patch deleted file mode 100644 index d0685cce1..000000000 --- a/gfx/cairo/pixman-enable-altivec-acceleration.patch +++ /dev/null @@ -1,38 +0,0 @@ -# HG changeset patch -# Parent d0b3d7af190b3c62397ece2bc33b429d903e455d - -diff -r d0b3d7af190b gfx/cairo/libpixman/src/Makefile.in ---- a/gfx/cairo/libpixman/src/Makefile.in Sat Nov 24 14:26:11 2012 +0100 -+++ b/gfx/cairo/libpixman/src/Makefile.in Thu Nov 29 22:20:59 2012 +0100 -@@ -42,6 +42,10 @@ - endif - - ifdef GNU_CC -+ifeq (ppc,$(findstring ppc,$(OS_TEST))) -+USE_VMX=1 -+VMX_CFLAGS=-maltivec -+endif - ifeq (86,$(findstring 86,$(OS_TEST))) - USE_MMX=1 - MMX_CFLAGS=-mmmx -Winline -@@ -156,3 +160,6 @@ - pixman-sse2.$(OBJ_SUFFIX): COMPILE_CFLAGS += $(SSE2_CFLAGS) - - pixman-arm-neon.$(OBJ_SUFFIX): COMPILE_CFLAGS += $(ARM_NEON_CFLAGS) -+ -+pixman-vmx.$(OBJ_SUFFIX): COMPILE_CFLAGS += $(VMX_CFLAGS) -+ -diff -r d0b3d7af190b gfx/cairo/libpixman/src/pixman-vmx.c ---- a/gfx/cairo/libpixman/src/pixman-vmx.c Sat Nov 24 14:26:11 2012 +0100 -+++ b/gfx/cairo/libpixman/src/pixman-vmx.c Thu Nov 29 22:20:59 2012 +0100 -@@ -25,7 +25,10 @@ - * Based on fbmmx.c by Owen Taylor, Søren Sandmann and Nicholas Miell - */ - -+#ifdef HAVE_CONFIG_H - #include <config.h> -+#endif -+ - #include "pixman-private.h" - #include "pixman-combine32.h" - #include <altivec.h> diff --git a/gfx/cairo/pixman-export.patch b/gfx/cairo/pixman-export.patch deleted file mode 100644 index 78ca8c669..000000000 --- a/gfx/cairo/pixman-export.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/gfx/cairo/libpixman/src/pixman-compiler.h b/gfx/cairo/libpixman/src/pixman-compiler.h ---- a/gfx/cairo/libpixman/src/pixman-compiler.h -+++ b/gfx/cairo/libpixman/src/pixman-compiler.h -@@ -59,26 +59,33 @@ - # ifndef force_inline - # define force_inline inline - # endif - # ifndef noinline - # define noinline - # endif - #endif - -+/* In libxul builds we don't ever want to export pixman symbols */ -+#if 1 -+# define PIXMAN_EXPORT cairo_public -+#else -+ - /* GCC visibility */ - #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(_WIN32) - # define PIXMAN_EXPORT __attribute__ ((visibility("default"))) - /* Sun Studio 8 visibility */ - #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) - # define PIXMAN_EXPORT __global - #else - # define PIXMAN_EXPORT - #endif - -+#endif -+ - /* TLS */ - #if defined(PIXMAN_NO_TLS) - - # define PIXMAN_DEFINE_THREAD_LOCAL(type, name) \ - static type name - # define PIXMAN_GET_THREAD_LOCAL(name) \ - (&name) - diff --git a/gfx/cairo/pixman-image-transform.patch b/gfx/cairo/pixman-image-transform.patch deleted file mode 100644 index 2f93d315a..000000000 --- a/gfx/cairo/pixman-image-transform.patch +++ /dev/null @@ -1,52 +0,0 @@ -# HG changeset patch -# User Jeff Muizelaar <jmuizelaar@mozilla.com> -# Date 1299543337 18000 -# Node ID 57f411f16517fa3abc31b6b081dd31420c4d9b45 -# Parent e56ecd8b3a68c158025207c5fd081d043e28f5ce -Bug 637828. Reset the transform on the dest image. r=joe - -We can get into a situation where the destination image has a transform -because we use it as source. The transform set when the image is a source -sticks around and when we use it as a destination pixman gets confused. - -It seems like the code at fault here is really pixman. I think that pixman -should probably not be using a transformed fetch on the destination image under -any circumstances. - -For example, in this case we're fetching destination pixels from a different -part of the image than we're storing them to. I can't see any reason for -wanting this behaviour. - -However, reseting the transform seemed like the easiest solution. - -diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c ---- a/gfx/cairo/cairo/src/cairo-image-surface.c -+++ b/gfx/cairo/cairo/src/cairo-image-surface.c -@@ -1138,16 +1138,27 @@ _cairo_image_surface_composite (cairo_op - return status; - - status = _cairo_image_surface_set_attributes (src, &src_attr, - dst_x + width / 2., - dst_y + height / 2.); - if (unlikely (status)) - goto CLEANUP_SURFACES; - -+ /* we sometimes get destinations with transforms. -+ * we're not equiped to deal with this */ -+ { -+ static const pixman_transform_t id = { -+ {{ pixman_fixed_1, 0, 0 }, -+ { 0, pixman_fixed_1, 0 }, -+ { 0, 0, pixman_fixed_1 }} -+ }; -+ pixman_image_set_transform (dst->pixman_image, &id); -+ } -+ - if (mask) { - status = _cairo_image_surface_set_attributes (mask, &mask_attr, - dst_x + width / 2., - dst_y + height / 2.); - if (unlikely (status)) - goto CLEANUP_SURFACES; - - pixman_image_composite (_pixman_operator (op), diff --git a/gfx/cairo/pixman-limits.patch b/gfx/cairo/pixman-limits.patch deleted file mode 100644 index bc820e673..000000000 --- a/gfx/cairo/pixman-limits.patch +++ /dev/null @@ -1,18 +0,0 @@ -commit 3c275c75e381184fb3fa0537c4bfce50b44690e7 -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Fri Apr 20 00:12:32 2012 -0400 - - limits - -diff --git a/pixman/pixman-utils.c b/pixman/pixman-utils.c -index 2ec2594..de05c0e 100644 ---- a/pixman/pixman-utils.c -+++ b/pixman/pixman-utils.c -@@ -27,6 +27,7 @@ - #endif - #include <stdio.h> - #include <stdlib.h> -+#include <limits.h> - - #include "pixman-private.h" - diff --git a/gfx/cairo/pixman-lowres-interp.patch b/gfx/cairo/pixman-lowres-interp.patch deleted file mode 100644 index e2572f000..000000000 --- a/gfx/cairo/pixman-lowres-interp.patch +++ /dev/null @@ -1,222 +0,0 @@ -summary: Bug 689707. Use lower precision bilinear interpolation. r=joe - -diff --git a/gfx/cairo/libpixman/src/pixman-bits-image.c b/gfx/cairo/libpixman/src/pixman-bits-image.c ---- a/gfx/cairo/libpixman/src/pixman-bits-image.c -+++ b/gfx/cairo/libpixman/src/pixman-bits-image.c -@@ -124,18 +124,18 @@ bits_image_fetch_pixel_bilinear (bits_im - int height = image->height; - int x1, y1, x2, y2; - uint32_t tl, tr, bl, br; - int32_t distx, disty; - - x1 = x - pixman_fixed_1 / 2; - y1 = y - pixman_fixed_1 / 2; - -- distx = (x1 >> 8) & 0xff; -- disty = (y1 >> 8) & 0xff; -+ distx = interpolation_coord(x1); -+ disty = interpolation_coord(y1); - - x1 = pixman_fixed_to_int (x1); - y1 = pixman_fixed_to_int (y1); - x2 = x1 + 1; - y2 = y1 + 1; - - if (repeat_mode != PIXMAN_REPEAT_NONE) - { -@@ -190,17 +190,17 @@ bits_image_fetch_bilinear_no_repeat_8888 - - if (!pixman_transform_point_3d (bits->common.transform, &v)) - return; - - ux = ux_top = ux_bottom = bits->common.transform->matrix[0][0]; - x = x_top = x_bottom = v.vector[0] - pixman_fixed_1/2; - - y = v.vector[1] - pixman_fixed_1/2; -- disty = (y >> 8) & 0xff; -+ disty = interpolation_coord(y); - - /* Load the pointers to the first and second lines from the source - * image that bilinear code must read. - * - * The main trick in this code is about the check if any line are - * outside of the image; - * - * When I realize that a line (any one) is outside, I change -@@ -299,17 +299,17 @@ bits_image_fetch_bilinear_no_repeat_8888 - while (buffer < end && x < 0) - { - uint32_t tr, br; - int32_t distx; - - tr = top_row[pixman_fixed_to_int (x_top) + 1] | top_mask; - br = bottom_row[pixman_fixed_to_int (x_bottom) + 1] | bottom_mask; - -- distx = (x >> 8) & 0xff; -+ distx = interpolation_coord(x); - - *buffer++ = bilinear_interpolation (0, tr, 0, br, distx, disty); - - x += ux; - x_top += ux_top; - x_bottom += ux_bottom; - mask += mask_inc; - } -@@ -324,17 +324,17 @@ bits_image_fetch_bilinear_no_repeat_8888 - uint32_t tl, tr, bl, br; - int32_t distx; - - tl = top_row [pixman_fixed_to_int (x_top)] | top_mask; - tr = top_row [pixman_fixed_to_int (x_top) + 1] | top_mask; - bl = bottom_row [pixman_fixed_to_int (x_bottom)] | bottom_mask; - br = bottom_row [pixman_fixed_to_int (x_bottom) + 1] | bottom_mask; - -- distx = (x >> 8) & 0xff; -+ distx = interpolation_coord(x); - - *buffer = bilinear_interpolation (tl, tr, bl, br, distx, disty); - } - - buffer++; - x += ux; - x_top += ux_top; - x_bottom += ux_bottom; -@@ -348,17 +348,17 @@ bits_image_fetch_bilinear_no_repeat_8888 - if (*mask) - { - uint32_t tl, bl; - int32_t distx; - - tl = top_row [pixman_fixed_to_int (x_top)] | top_mask; - bl = bottom_row [pixman_fixed_to_int (x_bottom)] | bottom_mask; - -- distx = (x >> 8) & 0xff; -+ distx = interpolation_coord(x); - - *buffer = bilinear_interpolation (tl, 0, bl, 0, distx, disty); - } - - buffer++; - x += ux; - x_top += ux_top; - x_bottom += ux_bottom; -@@ -675,18 +675,18 @@ bits_image_fetch_bilinear_affine (pixman - const uint8_t *row2; - - if (mask && !mask[i]) - goto next; - - x1 = x - pixman_fixed_1 / 2; - y1 = y - pixman_fixed_1 / 2; - -- distx = (x1 >> 8) & 0xff; -- disty = (y1 >> 8) & 0xff; -+ distx = interpolation_coord(x1); -+ disty = interpolation_coord(y1); - - y1 = pixman_fixed_to_int (y1); - y2 = y1 + 1; - x1 = pixman_fixed_to_int (x1); - x2 = x1 + 1; - - if (repeat_mode != PIXMAN_REPEAT_NONE) - { -diff --git a/gfx/cairo/libpixman/src/pixman-inlines.h b/gfx/cairo/libpixman/src/pixman-inlines.h ---- a/gfx/cairo/libpixman/src/pixman-inlines.h -+++ b/gfx/cairo/libpixman/src/pixman-inlines.h -@@ -76,16 +76,31 @@ repeat (pixman_repeat_t repeat, int *c, - { - *c = MOD (*c, size * 2); - if (*c >= size) - *c = size * 2 - *c - 1; - } - return TRUE; - } - -+#ifdef MOZ_GFX_OPTIMIZE_MOBILE -+#define LOW_QUALITY_INTERPOLATION -+#endif -+ -+static force_inline int32_t -+interpolation_coord(pixman_fixed_t t) -+{ -+#ifdef LOW_QUALITY_INTERPOLATION -+ return (t >> 12) & 0xf; -+#else -+ return (t >> 8) & 0xff; -+#endif -+} -+ -+ - #if SIZEOF_LONG > 4 - - static force_inline uint32_t - bilinear_interpolation (uint32_t tl, uint32_t tr, - uint32_t bl, uint32_t br, - int distx, int disty) - { - uint64_t distxy, distxiy, distixy, distixiy; -@@ -122,16 +137,44 @@ bilinear_interpolation (uint32_t tl, uin - f = tl64 * distixiy + tr64 * distxiy + bl64 * distixy + br64 * distxy; - r |= ((f >> 16) & 0x000000ff00000000ull) | (f & 0xff000000ull); - - return (uint32_t)(r >> 16); - } - - #else - -+#ifdef LOW_QUALITY_INTERPOLATION -+/* Based on Filter_32_opaque_portable from Skia */ -+static force_inline uint32_t -+bilinear_interpolation(uint32_t a00, uint32_t a01, -+ uint32_t a10, uint32_t a11, -+ int x, int y) -+{ -+ int xy = x * y; -+ static const uint32_t mask = 0xff00ff; -+ -+ int scale = 256 - 16*y - 16*x + xy; -+ uint32_t lo = (a00 & mask) * scale; -+ uint32_t hi = ((a00 >> 8) & mask) * scale; -+ -+ scale = 16*x - xy; -+ lo += (a01 & mask) * scale; -+ hi += ((a01 >> 8) & mask) * scale; -+ -+ scale = 16*y - xy; -+ lo += (a10 & mask) * scale; -+ hi += ((a10 >> 8) & mask) * scale; -+ -+ lo += (a11 & mask) * xy; -+ hi += ((a11 >> 8) & mask) * xy; -+ -+ return ((lo >> 8) & mask) | (hi & ~mask); -+} -+#else - static force_inline uint32_t - bilinear_interpolation (uint32_t tl, uint32_t tr, - uint32_t bl, uint32_t br, - int distx, int disty) - { - int distxy, distxiy, distixy, distixiy; - uint32_t f, r; - -@@ -164,17 +207,17 @@ bilinear_interpolation (uint32_t tl, uin - - /* Alpha */ - f = (tl & 0x0000ff00) * distixiy + (tr & 0x0000ff00) * distxiy - + (bl & 0x0000ff00) * distixy + (br & 0x0000ff00) * distxy; - r |= f & 0xff000000; - - return r; - } -- -+#endif - #endif - - /* - * For each scanline fetched from source image with PAD repeat: - * - calculate how many pixels need to be padded on the left side - * - calculate how many pixels need to be padded on the right side - * - update width to only count pixels which are fetched from the image - * All this information is returned via 'width', 'left_pad', 'right_pad' diff --git a/gfx/cairo/pixman-rename-and-endian.patch b/gfx/cairo/pixman-rename-and-endian.patch deleted file mode 100644 index 41006695f..000000000 --- a/gfx/cairo/pixman-rename-and-endian.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/gfx/cairo/libpixman/src/pixman.h b/gfx/cairo/libpixman/src/pixman.h ---- a/gfx/cairo/libpixman/src/pixman.h -+++ b/gfx/cairo/libpixman/src/pixman.h -@@ -64,16 +64,18 @@ SOFTWARE. - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - - #ifndef PIXMAN_H__ - #define PIXMAN_H__ - -+#include "cairo-platform.h" -+ - #include <pixman-version.h> - - /* - * Standard integers - */ - #if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || defined (_sgi) || defined (__sun) || defined (sun) || defined (__digital__) - # include <inttypes.h> - #elif defined (_MSC_VER) diff --git a/gfx/cairo/pixman-xp-dll-workaround b/gfx/cairo/pixman-xp-dll-workaround deleted file mode 100644 index e5d1fcbf8..000000000 --- a/gfx/cairo/pixman-xp-dll-workaround +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/gfx/cairo/libpixman/src/pixman-compiler.h b/gfx/cairo/libpixman/src/pixman-compiler.h ---- a/gfx/cairo/libpixman/src/pixman-compiler.h -+++ b/gfx/cairo/libpixman/src/pixman-compiler.h -@@ -114,20 +114,22 @@ - - #elif defined(TLS) - - # define PIXMAN_DEFINE_THREAD_LOCAL(type, name) \ - static TLS type name - # define PIXMAN_GET_THREAD_LOCAL(name) \ - (&name) - --#elif defined(__MINGW32__) -+#elif defined(__MINGW32__) || defined(PIXMAN_USE_XP_DLL_TLS_WORKAROUND) - - # define _NO_W32_PSEUDO_MODIFIERS - # include <windows.h> -+#undef IN -+#undef OUT - - # define PIXMAN_DEFINE_THREAD_LOCAL(type, name) \ - static volatile int tls_ ## name ## _initialized = 0; \ - static void *tls_ ## name ## _mutex = NULL; \ - static unsigned tls_ ## name ## _index; \ - \ - static type * \ - tls_ ## name ## _alloc (void) \ diff --git a/gfx/cairo/premultiply-alpha-solid-gradients.patch b/gfx/cairo/premultiply-alpha-solid-gradients.patch deleted file mode 100644 index 665f64969..000000000 --- a/gfx/cairo/premultiply-alpha-solid-gradients.patch +++ /dev/null @@ -1,46 +0,0 @@ -Fix single and multi-stop solid gradients by multiplying by the alpha component. r=roc - -This cairo commit that caused the problem: 2d790daa957471670f4ae0d3b22da89e4ee7111f. -It was merged into mozilla-central with 1effb72d30cf - -diff --git a/gfx/cairo/cairo/src/cairo-pattern.c b/gfx/cairo/cairo/src/cairo-pattern.c ---- a/gfx/cairo/cairo/src/cairo-pattern.c -+++ b/gfx/cairo/cairo/src/cairo-pattern.c -@@ -2262,8 +2262,17 @@ _cairo_pattern_acquire_surface (const ca - - if (src->n_stops) - { -+ cairo_color_t color; -+ -+ /* multiply by alpha */ -+ _cairo_color_init_rgba (&color, -+ src->stops->color.red, -+ src->stops->color.green, -+ src->stops->color.blue, -+ src->stops->color.alpha); -+ - _cairo_pattern_init_solid (&solid, -- &src->stops->color, -+ &color, - CAIRO_CONTENT_COLOR_ALPHA); - } - else -@@ -2295,9 +2304,17 @@ _cairo_pattern_acquire_surface (const ca - } - if (i == src->n_stops) { - cairo_solid_pattern_t solid; -+ cairo_color_t color; -+ -+ /* multiply by alpha */ -+ _cairo_color_init_rgba (&color, -+ src->stops->color.red, -+ src->stops->color.green, -+ src->stops->color.blue, -+ src->stops->color.alpha); - - _cairo_pattern_init_solid (&solid, -- &src->stops->color, -+ &color, - CAIRO_CONTENT_COLOR_ALPHA); - - status = diff --git a/gfx/cairo/quartz-cache-CGImageRef.patch b/gfx/cairo/quartz-cache-CGImageRef.patch deleted file mode 100644 index f27f03081..000000000 --- a/gfx/cairo/quartz-cache-CGImageRef.patch +++ /dev/null @@ -1,173 +0,0 @@ -changeset: 42954:7881873b2b5d -user: Robert O'Callahan <robert@ocallahan.org> -date: Tue Jun 01 11:19:45 2010 +1200 -summary: Bug 552537. Cache the CGImageRef that we create for a CGBitmapContext so that we can take advantage of Quartz caching optimizations. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-private.h b/gfx/cairo/cairo/src/cairo-quartz-private.h ---- a/gfx/cairo/cairo/src/cairo-quartz-private.h -+++ b/gfx/cairo/cairo/src/cairo-quartz-private.h -@@ -49,16 +49,24 @@ typedef struct cairo_quartz_surface { - - CGContextRef cgContext; - CGAffineTransform cgContextBaseCTM; - - void *imageData; - cairo_surface_t *imageSurfaceEquiv; - - cairo_surface_clipper_t clipper; -+ -+ /** -+ * If non-null, this is a CGImage representing the contents of the surface. -+ * We clear this out before any painting into the surface, so that we -+ * don't force a copy to be created. -+ */ -+ CGImageRef bitmapContextImage; -+ - cairo_rectangle_int_t extents; - } cairo_quartz_surface_t; - - typedef struct cairo_quartz_image_surface { - cairo_surface_t base; - - cairo_rectangle_int_t extents; - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1134,19 +1134,24 @@ _cairo_surface_to_cgimage (cairo_surface - if (stype == CAIRO_SURFACE_TYPE_QUARTZ) { - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) source; - if (IS_EMPTY(surface)) { - *image_out = NULL; - return CAIRO_STATUS_SUCCESS; - } - - if (_cairo_quartz_is_cgcontext_bitmap_context (surface->cgContext)) { -- *image_out = CGBitmapContextCreateImage (surface->cgContext); -- if (*image_out) -- return CAIRO_STATUS_SUCCESS; -+ if (!surface->bitmapContextImage) { -+ surface->bitmapContextImage = -+ CGBitmapContextCreateImage (surface->cgContext); -+ } -+ if (surface->bitmapContextImage) { -+ *image_out = CGImageRetain (surface->bitmapContextImage); -+ return CAIRO_STATUS_SUCCESS; -+ } - } - } - - if (stype != CAIRO_SURFACE_TYPE_IMAGE) { - status = _cairo_surface_acquire_source_image (source, - &isurf, &image_extra); - if (status) - return status; -@@ -1589,16 +1594,29 @@ _cairo_quartz_setup_radial_source (cairo - - CGColorSpaceRelease(rgb); - CGFunctionRelease(gradFunc); - - state->action = DO_SHADING; - } - - /** -+ * Call this before any operation that can modify the contents of a -+ * cairo_quartz_surface_t. -+ */ -+static void -+_cairo_quartz_surface_will_change (cairo_quartz_surface_t *surface) -+{ -+ if (surface->bitmapContextImage) { -+ CGImageRelease (surface->bitmapContextImage); -+ surface->bitmapContextImage = NULL; -+ } -+} -+ -+/** - * Sets up internal state to be used to draw the source mask, stored in - * cairo_quartz_state_t. Guarantees to call CGContextSaveGState on - * surface->cgContext. - */ - static cairo_quartz_drawing_state_t - _cairo_quartz_setup_state (cairo_quartz_surface_t *surface, - const cairo_pattern_t *source, - cairo_operator_t op, -@@ -1609,16 +1627,18 @@ _cairo_quartz_setup_state (cairo_quartz_ - cairo_status_t status; - - state.context = context; - state.image = NULL; - state.imageSurface = NULL; - state.shading = NULL; - state.pattern = NULL; - -+ _cairo_quartz_surface_will_change (surface); -+ - // Save before we change the pattern, colorspace, etc. so that - // we can restore and make sure that quartz releases our - // pattern (which may be stack allocated) - CGContextSaveGState(context); - - CGContextSetInterpolationQuality (context, _cairo_quartz_filter_to_quartz (source->filter)); - - status = _cairo_quartz_surface_set_cairo_operator (surface, op); -@@ -1936,16 +1956,21 @@ _cairo_quartz_surface_finish (void *abst - /* Restore our saved gstate that we use to reset clipping */ - CGContextRestoreGState (surface->cgContext); - _cairo_surface_clipper_reset (&surface->clipper); - - CGContextRelease (surface->cgContext); - - surface->cgContext = NULL; - -+ if (surface->bitmapContextImage) { -+ CGImageRelease (surface->bitmapContextImage); -+ surface->bitmapContextImage = NULL; -+ } -+ - if (surface->imageSurfaceEquiv) { - cairo_surface_destroy (surface->imageSurfaceEquiv); - surface->imageSurfaceEquiv = NULL; - } - - if (surface->imageData) { - free (surface->imageData); - surface->imageData = NULL; -@@ -2006,16 +2031,18 @@ _cairo_quartz_surface_acquire_dest_image - cairo_rectangle_int_t *image_rect, - void **image_extra) - { - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - cairo_int_status_t status; - - ND((stderr, "%p _cairo_quartz_surface_acquire_dest_image\n", surface)); - -+ _cairo_quartz_surface_will_change (surface); -+ - status = _cairo_quartz_get_image (surface, image_out); - if (status) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - - *image_rect = surface->extents; - *image_extra = NULL; - - return CAIRO_STATUS_SUCCESS; -@@ -2939,16 +2966,17 @@ _cairo_quartz_surface_create_internal (C - */ - CGContextSaveGState (cgContext); - - surface->cgContext = cgContext; - surface->cgContextBaseCTM = CGContextGetCTM (cgContext); - - surface->imageData = NULL; - surface->imageSurfaceEquiv = NULL; -+ surface->bitmapContextImage = NULL; - - return surface; - } - - /** - * cairo_quartz_surface_create_for_cg_context - * @cgContext: the existing CGContext for which to create the surface - * @width: width of the surface, in pixels - diff --git a/gfx/cairo/quartz-cg-layers-fix-fallback.patch b/gfx/cairo/quartz-cg-layers-fix-fallback.patch deleted file mode 100644 index bcebab350..000000000 --- a/gfx/cairo/quartz-cg-layers-fix-fallback.patch +++ /dev/null @@ -1,42 +0,0 @@ -Bug 572912. Fix surface type passed to cairo_quartz_surface_create during fallback for CGLayers. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -2026,17 +2026,17 @@ _cairo_quartz_surface_acquire_image (voi - - /* ND((stderr, "%p _cairo_quartz_surface_acquire_image\n", surface)); */ - - status = _cairo_quartz_get_image (surface, image_out); - - if (status == CAIRO_INT_STATUS_UNSUPPORTED && surface->cgLayer) { - /* copy the layer into a Quartz bitmap context so we can get the data */ - cairo_surface_t *tmp = -- cairo_quartz_surface_create (CAIRO_CONTENT_COLOR_ALPHA, -+ cairo_quartz_surface_create (CAIRO_FORMAT_ARGB32, - surface->extents.width, - surface->extents.height); - cairo_quartz_surface_t *tmp_surface = (cairo_quartz_surface_t *) tmp; - - /* if surface creation failed, we won't have a Quartz surface here */ - if (cairo_surface_get_type (tmp) == CAIRO_SURFACE_TYPE_QUARTZ && - tmp_surface->imageSurfaceEquiv) { - CGContextSaveGState (tmp_surface->cgContext); -@@ -2049,16 +2049,17 @@ _cairo_quartz_surface_acquire_image (voi - CGContextDrawLayerAtPoint (tmp_surface->cgContext, - CGPointMake (0.0, 0.0), - surface->cgLayer); - CGContextRestoreGState (tmp_surface->cgContext); - - *image_out = (cairo_image_surface_t*) - cairo_surface_reference(tmp_surface->imageSurfaceEquiv); - *image_extra = tmp; -+ status = CAIRO_STATUS_SUCCESS; - } else { - cairo_surface_destroy (tmp); - } - } - - if (status) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - diff --git a/gfx/cairo/quartz-cglayers.patch b/gfx/cairo/quartz-cglayers.patch deleted file mode 100644 index bb3d44d9e..000000000 --- a/gfx/cairo/quartz-cglayers.patch +++ /dev/null @@ -1,715 +0,0 @@ -changeset: 42959:e1964291f8ff -user: Robert O'Callahan <robert@ocallahan.org> -date: Tue Jun 01 11:33:23 2010 +1200 -summary: Bug 568189. Implement CGLayer-backed cairo-quartz surfaces. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-private.h b/gfx/cairo/cairo/src/cairo-quartz-private.h ---- a/gfx/cairo/cairo/src/cairo-quartz-private.h -+++ b/gfx/cairo/cairo/src/cairo-quartz-private.h -@@ -57,16 +57,21 @@ typedef struct cairo_quartz_surface { - - /** - * If non-null, this is a CGImage representing the contents of the surface. - * We clear this out before any painting into the surface, so that we - * don't force a copy to be created. - */ - CGImageRef bitmapContextImage; - -+ /** -+ * If non-null, this is the CGLayer for the surface. -+ */ -+ CGLayerRef cgLayer; -+ - cairo_rectangle_int_t extents; - } cairo_quartz_surface_t; - - typedef struct cairo_quartz_image_surface { - cairo_surface_t base; - - cairo_rectangle_int_t extents; - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1110,18 +1110,17 @@ CreateRepeatingRadialGradientFunction (c - static void - DataProviderReleaseCallback (void *info, const void *data, size_t size) - { - cairo_surface_t *surface = (cairo_surface_t *) info; - cairo_surface_destroy (surface); - } - - static cairo_status_t --_cairo_surface_to_cgimage (cairo_surface_t *target, -- cairo_surface_t *source, -+_cairo_surface_to_cgimage (cairo_surface_t *source, - CGImageRef *image_out) - { - cairo_status_t status = CAIRO_STATUS_SUCCESS; - cairo_surface_type_t stype = cairo_surface_get_type (source); - cairo_image_surface_t *isurf; - CGImageRef image; - void *image_extra; - -@@ -1267,17 +1266,17 @@ _cairo_quartz_cairo_repeating_surface_pa - return CAIRO_INT_STATUS_UNSUPPORTED; - - spattern = (cairo_surface_pattern_t *) apattern; - pat_surf = spattern->surface; - - is_bounded = _cairo_surface_get_extents (pat_surf, &extents); - assert (is_bounded); - -- status = _cairo_surface_to_cgimage ((cairo_surface_t*) dest, pat_surf, &image); -+ status = _cairo_surface_to_cgimage (pat_surf, &image); - if (status) - return status; - if (image == NULL) - return CAIRO_INT_STATUS_NOTHING_TO_DO; - - info = malloc(sizeof(SurfacePatternDrawInfo)); - if (!info) - return CAIRO_STATUS_NO_MEMORY; -@@ -1339,33 +1338,39 @@ _cairo_quartz_cairo_repeating_surface_pa - } - - typedef enum { - DO_SOLID, - DO_SHADING, - DO_PATTERN, - DO_IMAGE, - DO_TILED_IMAGE, -+ DO_LAYER, - DO_UNSUPPORTED, - DO_NOTHING - } cairo_quartz_action_t; - - /* State used during a drawing operation. */ - typedef struct { - CGContextRef context; - cairo_quartz_action_t action; - -- // Used with DO_SHADING, DO_IMAGE and DO_TILED_IMAGE -+ // Used with DO_SHADING, DO_IMAGE, DO_TILED_IMAGE and DO_LAYER - CGAffineTransform transform; - - // Used with DO_IMAGE and DO_TILED_IMAGE - CGImageRef image; - cairo_surface_t *imageSurface; -+ -+ // Used with DO_IMAGE, DO_TILED_IMAGE and DO_LAYER - CGRect imageRect; - -+ // Used with DO_LAYER -+ CGLayerRef layer; -+ - // Used with DO_SHADING - CGShadingRef shading; - - // Used with DO_PATTERN - CGPatternRef pattern; - } cairo_quartz_drawing_state_t; - - static void -@@ -1423,17 +1428,17 @@ _cairo_quartz_setup_fallback_source (cai - _cairo_pattern_transform (&pattern.base, - &fallback->device_transform_inverse); - status = _cairo_surface_paint (fallback, - CAIRO_OPERATOR_SOURCE, - &pattern.base, NULL); - } - #endif - -- status = _cairo_surface_to_cgimage (&surface->base, fallback, &img); -+ status = _cairo_surface_to_cgimage (fallback, &img); - if (status) { - state->action = DO_UNSUPPORTED; - return; - } - if (img == NULL) { - state->action = DO_NOTHING; - return; - } -@@ -1624,16 +1629,17 @@ _cairo_quartz_setup_state (cairo_quartz_ - { - CGContextRef context = surface->cgContext; - cairo_quartz_drawing_state_t state; - cairo_status_t status; - - state.context = context; - state.image = NULL; - state.imageSurface = NULL; -+ state.layer = NULL; - state.shading = NULL; - state.pattern = NULL; - - _cairo_quartz_surface_will_change (surface); - - // Save before we change the pattern, colorspace, etc. so that - // we can restore and make sure that quartz releases our - // pattern (which may be stack allocated) -@@ -1689,33 +1695,43 @@ _cairo_quartz_setup_state (cairo_quartz_ - CGImageRef img; - cairo_matrix_t m = spat->base.matrix; - cairo_rectangle_int_t extents; - CGAffineTransform xform; - CGRect srcRect; - cairo_fixed_t fw, fh; - cairo_bool_t is_bounded; - -- status = _cairo_surface_to_cgimage ((cairo_surface_t *) surface, pat_surf, &img); -+ cairo_matrix_invert(&m); -+ _cairo_quartz_cairo_matrix_to_quartz (&m, &state.transform); -+ -+ if (cairo_surface_get_type (pat_surf) == CAIRO_SURFACE_TYPE_QUARTZ) { -+ cairo_quartz_surface_t *quartz_surf = (cairo_quartz_surface_t *) pat_surf; -+ if (quartz_surf->cgLayer && source->extend == CAIRO_EXTEND_NONE) { -+ state.imageRect = CGRectMake (0, 0, quartz_surf->extents.width, quartz_surf->extents.height); -+ state.layer = quartz_surf->cgLayer; -+ state.action = DO_LAYER; -+ return state; -+ } -+ } -+ -+ status = _cairo_surface_to_cgimage (pat_surf, &img); - if (status) { - state.action = DO_UNSUPPORTED; - return state; - } - if (img == NULL) { - state.action = DO_NOTHING; - return state; - } - - CGContextSetRGBFillColor (surface->cgContext, 0, 0, 0, 1); - - state.image = img; - -- cairo_matrix_invert(&m); -- _cairo_quartz_cairo_matrix_to_quartz (&m, &state.transform); -- - is_bounded = _cairo_surface_get_extents (pat_surf, &extents); - assert (is_bounded); - - if (source->extend == CAIRO_EXTEND_NONE) { - state.imageRect = CGRectMake (0, 0, extents.width, extents.height); - state.action = DO_IMAGE; - return state; - } -@@ -1820,33 +1836,48 @@ _cairo_quartz_teardown_state (cairo_quar - - CGContextRestoreGState(state->context); - } - - - static void - _cairo_quartz_draw_image (cairo_quartz_drawing_state_t *state, cairo_operator_t op) - { -- assert (state && state->image && (state->action == DO_IMAGE || state->action == DO_TILED_IMAGE)); -+ assert (state && -+ ((state->image && (state->action == DO_IMAGE || state->action == DO_TILED_IMAGE)) || -+ (state->layer && state->action == DO_LAYER))); - - CGContextConcatCTM (state->context, state->transform); - CGContextTranslateCTM (state->context, 0, state->imageRect.size.height); - CGContextScaleCTM (state->context, 1, -1); - -- if (state->action == DO_IMAGE) { -- CGContextDrawImage (state->context, state->imageRect, state->image); -+ if (state->action == DO_TILED_IMAGE) { -+ CGContextDrawTiledImagePtr (state->context, state->imageRect, state->image); -+ /* no need to worry about unbounded operators, since tiled images -+ fill the entire clip region */ -+ } else { -+ if (state->action == DO_LAYER) { -+ /* Note that according to Apple docs it's completely legal -+ * to draw a CGLayer to any CGContext, even one it wasn't -+ * created for. -+ */ -+ CGContextDrawLayerAtPoint (state->context, state->imageRect.origin, -+ state->layer); -+ } else { -+ CGContextDrawImage (state->context, state->imageRect, state->image); -+ } -+ - if (!_cairo_operator_bounded_by_source (op)) { - CGContextBeginPath (state->context); - CGContextAddRect (state->context, state->imageRect); - CGContextAddRect (state->context, CGContextGetClipBoundingBox (state->context)); - CGContextSetRGBFillColor (state->context, 0, 0, 0, 0); - CGContextEOFillPath (state->context); - } -- } else -- CGContextDrawTiledImagePtr (state->context, state->imageRect, state->image); -+ } - } - - - /* - * get source/dest image implementation - */ - - /* Read the image from the surface's front buffer */ -@@ -1971,95 +2002,153 @@ _cairo_quartz_surface_finish (void *abst - surface->imageSurfaceEquiv = NULL; - } - - if (surface->imageData) { - free (surface->imageData); - surface->imageData = NULL; - } - -+ if (surface->cgLayer) { -+ CGLayerRelease (surface->cgLayer); -+ } -+ - return CAIRO_STATUS_SUCCESS; - } - - static cairo_status_t --_cairo_quartz_surface_acquire_source_image (void *abstract_surface, -- cairo_image_surface_t **image_out, -- void **image_extra) -+_cairo_quartz_surface_acquire_image (void *abstract_surface, -+ cairo_image_surface_t **image_out, -+ void **image_extra) - { - cairo_int_status_t status; - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - -- //ND((stderr, "%p _cairo_quartz_surface_acquire_source_image\n", surface)); -+ *image_extra = NULL; -+ -+ /* ND((stderr, "%p _cairo_quartz_surface_acquire_image\n", surface)); */ - - status = _cairo_quartz_get_image (surface, image_out); -+ -+ if (status == CAIRO_INT_STATUS_UNSUPPORTED && surface->cgLayer) { -+ /* copy the layer into a Quartz bitmap context so we can get the data */ -+ cairo_surface_t *tmp = -+ cairo_quartz_surface_create (CAIRO_CONTENT_COLOR_ALPHA, -+ surface->extents.width, -+ surface->extents.height); -+ cairo_quartz_surface_t *tmp_surface = (cairo_quartz_surface_t *) tmp; -+ -+ /* if surface creation failed, we won't have a Quartz surface here */ -+ if (cairo_surface_get_type (tmp) == CAIRO_SURFACE_TYPE_QUARTZ && -+ tmp_surface->imageSurfaceEquiv) { -+ CGContextSaveGState (tmp_surface->cgContext); -+ CGContextTranslateCTM (tmp_surface->cgContext, 0, surface->extents.height); -+ CGContextScaleCTM (tmp_surface->cgContext, 1, -1); -+ /* Note that according to Apple docs it's completely legal -+ * to draw a CGLayer to any CGContext, even one it wasn't -+ * created for. -+ */ -+ CGContextDrawLayerAtPoint (tmp_surface->cgContext, -+ CGPointMake (0.0, 0.0), -+ surface->cgLayer); -+ CGContextRestoreGState (tmp_surface->cgContext); -+ -+ *image_out = (cairo_image_surface_t*) -+ cairo_surface_reference(tmp_surface->imageSurfaceEquiv); -+ *image_extra = tmp; -+ } else { -+ cairo_surface_destroy (tmp); -+ } -+ } -+ - if (status) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - -- *image_extra = NULL; -- - return CAIRO_STATUS_SUCCESS; - } - - static void - _cairo_quartz_surface_release_source_image (void *abstract_surface, - cairo_image_surface_t *image, - void *image_extra) - { - cairo_surface_destroy ((cairo_surface_t *) image); -+ -+ if (image_extra) { -+ cairo_surface_destroy ((cairo_surface_t *) image_extra); -+ } - } - - - static cairo_status_t - _cairo_quartz_surface_acquire_dest_image (void *abstract_surface, - cairo_rectangle_int_t *interest_rect, - cairo_image_surface_t **image_out, - cairo_rectangle_int_t *image_rect, - void **image_extra) - { - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; -- cairo_int_status_t status; - - ND((stderr, "%p _cairo_quartz_surface_acquire_dest_image\n", surface)); - -- _cairo_quartz_surface_will_change (surface); -- -- status = _cairo_quartz_get_image (surface, image_out); -- if (status) -- return _cairo_error (CAIRO_STATUS_NO_MEMORY); -- - *image_rect = surface->extents; - *image_extra = NULL; - -- return CAIRO_STATUS_SUCCESS; -+ _cairo_quartz_surface_will_change (surface); -+ -+ return _cairo_quartz_surface_acquire_image (abstract_surface, -+ image_out, image_extra); - } - - static void - _cairo_quartz_surface_release_dest_image (void *abstract_surface, - cairo_rectangle_int_t *interest_rect, - cairo_image_surface_t *image, - cairo_rectangle_int_t *image_rect, - void *image_extra) - { -- //cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; -- -- //ND((stderr, "%p _cairo_quartz_surface_release_dest_image\n", surface)); -+ /* ND((stderr, "%p _cairo_quartz_surface_release_dest_image\n", surface)); */ - - cairo_surface_destroy ((cairo_surface_t *) image); -+ -+ if (image_extra) { -+ /* we need to write the data from the temp surface back to the layer */ -+ cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; -+ cairo_quartz_surface_t *tmp_surface = (cairo_quartz_surface_t *) image_extra; -+ CGImageRef img; -+ cairo_status_t status = _cairo_surface_to_cgimage (&tmp_surface->base, &img); -+ if (status) { -+ cairo_surface_destroy (&tmp_surface->base); -+ return; -+ } -+ -+ CGContextSaveGState (surface->cgContext); -+ CGContextTranslateCTM (surface->cgContext, 0, surface->extents.height); -+ CGContextScaleCTM (surface->cgContext, 1, -1); -+ CGContextDrawImage (surface->cgContext, -+ CGRectMake (0.0, 0.0, surface->extents.width, surface->extents.height), -+ img); -+ CGContextRestoreGState (surface->cgContext); -+ -+ cairo_surface_destroy (&tmp_surface->base); -+ } - } - - static cairo_surface_t * - _cairo_quartz_surface_create_similar (void *abstract_surface, - cairo_content_t content, - int width, - int height) - { -- /*cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface;*/ -- -+ cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - cairo_format_t format; - -+ if (surface->cgLayer) -+ return cairo_quartz_surface_create_cg_layer (abstract_surface, width, height); -+ - if (content == CAIRO_CONTENT_COLOR_ALPHA) - format = CAIRO_FORMAT_ARGB32; - else if (content == CAIRO_CONTENT_COLOR) - format = CAIRO_FORMAT_RGB24; - else if (content == CAIRO_CONTENT_ALPHA) - format = CAIRO_FORMAT_A8; - else - return NULL; -@@ -2113,17 +2202,17 @@ _cairo_quartz_surface_clone_similar (voi - _cairo_quartz_surface_create_internal (NULL, CAIRO_CONTENT_COLOR_ALPHA, - qsurf->extents.width, qsurf->extents.height); - *clone_offset_x = 0; - *clone_offset_y = 0; - return CAIRO_STATUS_SUCCESS; - } - } - -- status = _cairo_surface_to_cgimage ((cairo_surface_t*) abstract_surface, src, &quartz_image); -+ status = _cairo_surface_to_cgimage (src, &quartz_image); - if (status) - return CAIRO_INT_STATUS_UNSUPPORTED; - - new_format = CAIRO_FORMAT_ARGB32; /* assumed */ - if (_cairo_surface_is_image (src)) { - new_format = ((cairo_image_surface_t *) src)->format; - } - -@@ -2194,17 +2283,18 @@ _cairo_quartz_surface_paint (void *abstr - if (state.action == DO_SOLID || state.action == DO_PATTERN) { - CGContextFillRect (state.context, CGRectMake(surface->extents.x, - surface->extents.y, - surface->extents.width, - surface->extents.height)); - } else if (state.action == DO_SHADING) { - CGContextConcatCTM (state.context, state.transform); - CGContextDrawShading (state.context, state.shading); -- } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE) { -+ } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE || -+ state.action == DO_LAYER) { - _cairo_quartz_draw_image (&state, op); - } else if (state.action != DO_NOTHING) { - rv = CAIRO_INT_STATUS_UNSUPPORTED; - } - - _cairo_quartz_teardown_state (&state); - - ND((stderr, "-- paint\n")); -@@ -2291,17 +2381,18 @@ _cairo_quartz_surface_fill (void *abstra - // with the shading - if (fill_rule == CAIRO_FILL_RULE_WINDING) - CGContextClip (state.context); - else - CGContextEOClip (state.context); - - CGContextConcatCTM (state.context, state.transform); - CGContextDrawShading (state.context, state.shading); -- } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE) { -+ } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE || -+ state.action == DO_LAYER) { - if (fill_rule == CAIRO_FILL_RULE_WINDING) - CGContextClip (state.context); - else - CGContextEOClip (state.context); - - _cairo_quartz_draw_image (&state, op); - } else if (state.action != DO_NOTHING) { - rv = CAIRO_INT_STATUS_UNSUPPORTED; -@@ -2416,17 +2507,18 @@ _cairo_quartz_surface_stroke (void *abst - if (rv) - goto BAIL; - - if (!_cairo_operator_bounded_by_mask (op) && CGContextCopyPathPtr) - path_for_unbounded = CGContextCopyPathPtr (state.context); - - if (state.action == DO_SOLID || state.action == DO_PATTERN) { - CGContextStrokePath (state.context); -- } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE) { -+ } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE || -+ state.action == DO_LAYER) { - CGContextReplacePathWithStrokedPath (state.context); - CGContextClip (state.context); - - CGContextSetCTM (state.context, origCTM); - _cairo_quartz_draw_image (&state, op); - } else if (state.action == DO_SHADING) { - CGContextReplacePathWithStrokedPath (state.context); - CGContextClip (state.context); -@@ -2511,17 +2603,18 @@ _cairo_quartz_surface_show_glyphs (void - &glyph_extents, NULL); - state = _cairo_quartz_setup_state (surface, source, op, &glyph_extents); - } else { - state = _cairo_quartz_setup_state (surface, source, op, NULL); - } - - if (state.action == DO_SOLID || state.action == DO_PATTERN) { - CGContextSetTextDrawingMode (state.context, kCGTextFill); -- } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE || state.action == DO_SHADING) { -+ } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE || -+ state.action == DO_SHADING || state.action == DO_LAYER) { - CGContextSetTextDrawingMode (state.context, kCGTextClip); - isClipping = TRUE; - } else { - if (state.action != DO_NOTHING) - rv = CAIRO_INT_STATUS_UNSUPPORTED; - goto BAIL; - } - -@@ -2622,17 +2715,18 @@ _cairo_quartz_surface_show_glyphs (void - - CGContextShowGlyphsWithAdvances (state.context, - cg_glyphs, - cg_advances, - num_glyphs); - - CGContextSetCTM (state.context, ctm); - -- if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE) { -+ if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE || -+ state.action == DO_LAYER) { - _cairo_quartz_draw_image (&state, op); - } else if (state.action == DO_SHADING) { - CGContextConcatCTM (state.context, state.transform); - CGContextDrawShading (state.context, state.shading); - } - - BAIL: - if (didForceFontSmoothing) -@@ -2679,17 +2773,17 @@ _cairo_quartz_surface_mask_with_surface - cairo_clip_t *clip) - { - CGRect rect; - CGImageRef img; - cairo_surface_t *pat_surf = mask->surface; - cairo_status_t status = CAIRO_STATUS_SUCCESS; - CGAffineTransform ctm, mask_matrix; - -- status = _cairo_surface_to_cgimage ((cairo_surface_t *) surface, pat_surf, &img); -+ status = _cairo_surface_to_cgimage (pat_surf, &img); - if (status) - return status; - if (img == NULL) { - if (!_cairo_operator_bounded_by_mask (op)) - CGContextClearRect (surface->cgContext, CGContextGetClipBoundingBox (surface->cgContext)); - return CAIRO_STATUS_SUCCESS; - } - -@@ -2869,17 +2963,17 @@ _cairo_quartz_surface_clipper_intersect_ - } - - // XXXtodo implement show_page; need to figure out how to handle begin/end - - static const struct _cairo_surface_backend cairo_quartz_surface_backend = { - CAIRO_SURFACE_TYPE_QUARTZ, - _cairo_quartz_surface_create_similar, - _cairo_quartz_surface_finish, -- _cairo_quartz_surface_acquire_source_image, -+ _cairo_quartz_surface_acquire_image, - _cairo_quartz_surface_release_source_image, - _cairo_quartz_surface_acquire_dest_image, - _cairo_quartz_surface_release_dest_image, - _cairo_quartz_surface_clone_similar, - NULL, /* composite */ - NULL, /* fill_rectangles */ - NULL, /* composite_trapezoids */ - NULL, /* create_span_renderer */ -@@ -2950,16 +3044,17 @@ _cairo_quartz_surface_create_internal (C - CGContextSaveGState (cgContext); - - surface->cgContext = cgContext; - surface->cgContextBaseCTM = CGContextGetCTM (cgContext); - - surface->imageData = NULL; - surface->imageSurfaceEquiv = NULL; - surface->bitmapContextImage = NULL; -+ surface->cgLayer = NULL; - - return surface; - } - - /** - * cairo_quartz_surface_create_for_cg_context - * @cgContext: the existing CGContext for which to create the surface - * @width: width of the surface, in pixels -@@ -3002,16 +3097,88 @@ cairo_quartz_surface_create_for_cg_conte - // create_internal will have set an error - return (cairo_surface_t*) surf; - } - - return (cairo_surface_t *) surf; - } - - /** -+ * cairo_quartz_cglayer_surface_create_similar -+ * @surface: The returned surface can be efficiently drawn into this -+ * destination surface (if tiling is not used)." -+ * @width: width of the surface, in pixels -+ * @height: height of the surface, in pixels -+ * -+ * Creates a Quartz surface backed by a CGLayer, if the given surface -+ * is a Quartz surface; the CGLayer is created to match the surface's -+ * Quartz context. Otherwise just calls cairo_surface_create_similar -+ * with CAIRO_CONTENT_COLOR_ALPHA. -+ * The returned surface can be efficiently blitted to the given surface, -+ * but tiling and 'extend' modes other than NONE are not so efficient. -+ * -+ * Return value: the newly created surface. -+ * -+ * Since: 1.10 -+ **/ -+cairo_surface_t * -+cairo_quartz_surface_create_cg_layer (cairo_surface_t *surface, -+ unsigned int width, -+ unsigned int height) -+{ -+ cairo_quartz_surface_t *surf; -+ CGLayerRef layer; -+ CGContextRef ctx; -+ CGContextRef cgContext; -+ -+ cgContext = cairo_quartz_surface_get_cg_context (surface); -+ if (!cgContext) -+ return cairo_surface_create_similar (surface, CAIRO_CONTENT_COLOR_ALPHA, -+ width, height); -+ -+ if (!_cairo_quartz_verify_surface_size(width, height)) -+ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); -+ -+ /* If we pass zero width or height into CGLayerCreateWithContext below, -+ * it will fail. -+ */ -+ if (width == 0 || height == 0) { -+ return (cairo_surface_t*) -+ _cairo_quartz_surface_create_internal (NULL, CAIRO_CONTENT_COLOR_ALPHA, -+ width, height); -+ } -+ -+ layer = CGLayerCreateWithContext (cgContext, -+ CGSizeMake (width, height), -+ NULL); -+ if (!layer) -+ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); -+ -+ ctx = CGLayerGetContext (layer); -+ /* Flip it when we draw into it, so that when we finally composite it -+ * to a flipped target, the directions match and Quartz will optimize -+ * the composition properly -+ */ -+ CGContextTranslateCTM (ctx, 0, height); -+ CGContextScaleCTM (ctx, 1, -1); -+ -+ CGContextRetain (ctx); -+ surf = _cairo_quartz_surface_create_internal (ctx, CAIRO_CONTENT_COLOR_ALPHA, -+ width, height); -+ if (surf->base.status) { -+ CGLayerRelease (layer); -+ // create_internal will have set an error -+ return (cairo_surface_t*) surf; -+ } -+ surf->cgLayer = layer; -+ -+ return (cairo_surface_t *) surf; -+} -+ -+/** - * cairo_quartz_surface_create - * @format: format of pixels in the surface to create - * @width: width of the surface, in pixels - * @height: height of the surface, in pixels - * - * Creates a Quartz surface backed by a CGBitmap. The surface is - * created using the Device RGB (or Device Gray, for A8) color space. - * All Cairo operations, including those that require software -diff --git a/gfx/cairo/cairo/src/cairo-quartz.h b/gfx/cairo/cairo/src/cairo-quartz.h ---- a/gfx/cairo/cairo/src/cairo-quartz.h -+++ b/gfx/cairo/cairo/src/cairo-quartz.h -@@ -45,16 +45,21 @@ - CAIRO_BEGIN_DECLS - - cairo_public cairo_surface_t * - cairo_quartz_surface_create (cairo_format_t format, - unsigned int width, - unsigned int height); - - cairo_public cairo_surface_t * -+cairo_quartz_surface_create_cg_layer (cairo_surface_t *surface, -+ unsigned int width, -+ unsigned int height); -+ -+cairo_public cairo_surface_t * - cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, - unsigned int width, - unsigned int height); - - cairo_public CGContextRef - cairo_quartz_surface_get_cg_context (cairo_surface_t *surface); - - cairo_public CGContextRef - diff --git a/gfx/cairo/quartz-check-imageSurfaceEquiv.patch b/gfx/cairo/quartz-check-imageSurfaceEquiv.patch deleted file mode 100644 index 1d84ab27e..000000000 --- a/gfx/cairo/quartz-check-imageSurfaceEquiv.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: Daniel Holbert <dholbert@cs.stanford.edu> -Bug 612662 patch 3: Drop cairo_quartz_surface_t's "imageSurfaceEquiv" member if we fail to create it. r=roc a=blocking-final+ - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -3152,17 +3152,28 @@ cairo_quartz_surface_create (cairo_forma - if (surf->base.status) { - CGContextRelease (cgc); - free (imageData); - // create_internal will have set an error - return (cairo_surface_t*) surf; - } - - surf->imageData = imageData; -- surf->imageSurfaceEquiv = cairo_image_surface_create_for_data (imageData, format, width, height, stride); -+ -+ cairo_surface_t* tmpImageSurfaceEquiv = -+ cairo_image_surface_create_for_data (imageData, format, -+ width, height, stride); -+ -+ if (cairo_surface_status (tmpImageSurfaceEquiv)) { -+ // Tried & failed to create an imageSurfaceEquiv! -+ cairo_surface_destroy (tmpImageSurfaceEquiv); -+ surf->imageSurfaceEquiv = NULL; -+ } else { -+ surf->imageSurfaceEquiv = tmpImageSurfaceEquiv; -+ } - - return (cairo_surface_t *) surf; - } - - /** - * cairo_quartz_surface_get_cg_context - * @surface: the Cairo Quartz surface - * diff --git a/gfx/cairo/quartz-const-globals.patch b/gfx/cairo/quartz-const-globals.patch deleted file mode 100644 index 8db32270a..000000000 --- a/gfx/cairo/quartz-const-globals.patch +++ /dev/null @@ -1,134 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1249558626 -43200 -# Node ID 963b9451ad305924738d05d997a640698cd3af91 -# Parent e564f3ab4ea6e3b5dd9c4e9e6042d3a84c229dde -Bug 508730. Clean up Quartz gradient code by moving some local variables to static const globals. r=jmuizelaar - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -684,51 +684,50 @@ ComputeGradientValue (void *info, const - grad->stops[i-1].color.blue * ap + - grad->stops[i].color.blue * bp; - out[3] = - grad->stops[i-1].color.alpha * ap + - grad->stops[i].color.alpha * bp; - } - } - -+static const float gradient_output_value_ranges[8] = { -+ 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f -+}; -+static const CGFunctionCallbacks gradient_callbacks = { -+ 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy -+}; -+ - static CGFunctionRef - CreateGradientFunction (const cairo_gradient_pattern_t *gpat) - { - cairo_pattern_t *pat; - float input_value_range[2] = { 0.f, 1.f }; -- float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f }; -- CGFunctionCallbacks callbacks = { -- 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy -- }; - - if (_cairo_pattern_create_copy (&pat, &gpat->base)) - /* quartz doesn't deal very well with malloc failing, so there's - * not much point in us trying either */ - return NULL; - - return CGFunctionCreate (pat, - 1, - input_value_range, - 4, -- output_value_ranges, -- &callbacks); -+ gradient_output_value_ranges, -+ &gradient_callbacks); - } - - static CGFunctionRef - CreateRepeatingLinearGradientFunction (cairo_quartz_surface_t *surface, - const cairo_gradient_pattern_t *gpat, - CGPoint *start, CGPoint *end, - CGAffineTransform matrix) - { - cairo_pattern_t *pat; - float input_value_range[2]; -- float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f }; -- CGFunctionCallbacks callbacks = { -- 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy -- }; - - CGPoint mstart, mend; - - double dx, dy; - int x_rep_start = 0, x_rep_end = 0; - int y_rep_start = 0, y_rep_end = 0; - - int rep_start, rep_end; -@@ -787,18 +786,18 @@ CreateRepeatingLinearGradientFunction (c - /* quartz doesn't deal very well with malloc failing, so there's - * not much point in us trying either */ - return NULL; - - return CGFunctionCreate (pat, - 1, - input_value_range, - 4, -- output_value_ranges, -- &callbacks); -+ gradient_output_value_ranges, -+ &gradient_callbacks); - } - - static void - UpdateRadialParameterToIncludePoint(double *max_t, CGPoint *center, - double dr, double dx, double dy, - double x, double y) - { - /* Compute a parameter t such that a circle centered at -@@ -847,20 +846,16 @@ CreateRepeatingRadialGradientFunction (c - const cairo_gradient_pattern_t *gpat, - CGPoint *start, double *start_radius, - CGPoint *end, double *end_radius) - { - CGRect clip = CGContextGetClipBoundingBox (surface->cgContext); - CGAffineTransform transform; - cairo_pattern_t *pat; - float input_value_range[2]; -- float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f }; -- CGFunctionCallbacks callbacks = { -- 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy -- }; - CGPoint *inner; - double *inner_radius; - CGPoint *outer; - double *outer_radius; - /* minimum and maximum t-parameter values that will make our gradient - cover the clipBox */ - double t_min, t_max, t_temp; - /* outer minus inner */ -@@ -927,18 +922,18 @@ CreateRepeatingRadialGradientFunction (c - /* quartz doesn't deal very well with malloc failing, so there's - * not much point in us trying either */ - return NULL; - - return CGFunctionCreate (pat, - 1, - input_value_range, - 4, -- output_value_ranges, -- &callbacks); -+ gradient_output_value_ranges, -+ &gradient_callbacks); - } - - /* Obtain a CGImageRef from a #cairo_surface_t * */ - - static void - DataProviderReleaseCallback (void *info, const void *data, size_t size) - { - cairo_surface_t *surface = (cairo_surface_t *) info; diff --git a/gfx/cairo/quartz-create-for-data.patch b/gfx/cairo/quartz-create-for-data.patch deleted file mode 100644 index ae374fafe..000000000 --- a/gfx/cairo/quartz-create-for-data.patch +++ /dev/null @@ -1,309 +0,0 @@ -diff --git a/gfx/cairo/README b/gfx/cairo/README ---- a/gfx/cairo/README -+++ b/gfx/cairo/README -@@ -71,16 +71,18 @@ quartz-cache-CGImageRef.patch: cache CGI - quartz-remove-snapshot.patch: remove broken implementation of backend snapshot - - quartz-cglayers.patch: add support for cairo surfaces backed by CGLayers - - quartz-cglayers-fix-fallback.patch: Bug 572912; fix bug in fallback code in previous patch - - quartz-get-image.patch: Bug 575521; add a way to get the image surface associated with a surface - -+quartz-create-for-data.patch: Bug 575521; add a way to create quartz surfaces backed with application-provided data -+ - premultiply-alpha-solid-gradients.patch: bug 539165; multiply the solid color by the alpha component before using it for a solid surface - - xlib-initialize-members.path: bug 548793; initialize XRender version if the server doesn't have the extension - - remove-comma: remove a comma from enum - - d2d.patch: add d2d support - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-private.h b/gfx/cairo/cairo/src/cairo-quartz-private.h ---- a/gfx/cairo/cairo/src/cairo-quartz-private.h -+++ b/gfx/cairo/cairo/src/cairo-quartz-private.h -@@ -63,16 +63,18 @@ typedef struct cairo_quartz_surface { - CGImageRef bitmapContextImage; - - /** - * If non-null, this is the CGLayer for the surface. - */ - CGLayerRef cgLayer; - - cairo_rectangle_int_t extents; -+ -+ cairo_bool_t ownsData; - } cairo_quartz_surface_t; - - typedef struct cairo_quartz_image_surface { - cairo_surface_t base; - - cairo_rectangle_int_t extents; - - CGImageRef image; -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1880,20 +1880,21 @@ _cairo_quartz_surface_finish (void *abst - surface->cgContext = NULL; - - if (surface->bitmapContextImage) { - CGImageRelease (surface->bitmapContextImage); - surface->bitmapContextImage = NULL; - } - - if (surface->imageSurfaceEquiv) { -- _cairo_image_surface_assume_ownership_of_data (surface->imageSurfaceEquiv); -+ if (surface->ownsData) -+ _cairo_image_surface_assume_ownership_of_data (surface->imageSurfaceEquiv); - cairo_surface_destroy (surface->imageSurfaceEquiv); - surface->imageSurfaceEquiv = NULL; -- } else if (surface->imageData) { -+ } else if (surface->imageData && surface->ownsData) { - free (surface->imageData); - } - - surface->imageData = NULL; - - if (surface->cgLayer) { - CGLayerRelease (surface->cgLayer); - } -@@ -2888,16 +2889,17 @@ _cairo_quartz_surface_create_internal (C - - surface->cgContext = cgContext; - surface->cgContextBaseCTM = CGContextGetCTM (cgContext); - - surface->imageData = NULL; - surface->imageSurfaceEquiv = NULL; - surface->bitmapContextImage = NULL; - surface->cgLayer = NULL; -+ surface->ownsData = TRUE; - - return surface; - } - - /** - * cairo_quartz_surface_create_for_cg_context - * @cgContext: the existing CGContext for which to create the surface - * @width: width of the surface, in pixels -@@ -3031,23 +3033,103 @@ cairo_quartz_surface_create_cg_layer (ca - * - * Since: 1.4 - **/ - cairo_surface_t * - cairo_quartz_surface_create (cairo_format_t format, - unsigned int width, - unsigned int height) - { -+ int stride; -+ unsigned char *data; -+ -+ if (!_cairo_quartz_verify_surface_size(width, height)) -+ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); -+ -+ if (width == 0 || height == 0) { -+ return (cairo_surface_t*) _cairo_quartz_surface_create_internal (NULL, _cairo_content_from_format (format), -+ width, height); -+ } -+ -+ if (format == CAIRO_FORMAT_ARGB32 || -+ format == CAIRO_FORMAT_RGB24) -+ { -+ stride = width * 4; -+ } else if (format == CAIRO_FORMAT_A8) { -+ stride = width; -+ } else if (format == CAIRO_FORMAT_A1) { -+ /* I don't think we can usefully support this, as defined by -+ * cairo_format_t -- these are 1-bit pixels stored in 32-bit -+ * quantities. -+ */ -+ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); -+ } else { -+ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); -+ } -+ -+ /* The Apple docs say that for best performance, the stride and the data -+ * pointer should be 16-byte aligned. malloc already aligns to 16-bytes, -+ * so we don't have to anything special on allocation. -+ */ -+ stride = (stride + 15) & ~15; -+ -+ data = _cairo_malloc_ab (height, stride); -+ if (!data) { -+ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); -+ } -+ -+ /* zero the memory to match the image surface behaviour */ -+ memset (data, 0, height * stride); -+ -+ cairo_quartz_surface_t *surf; -+ surf = (cairo_quartz_surface_t *) cairo_quartz_surface_create_for_data -+ (data, format, width, height, stride); -+ if (surf->base.status) { -+ free (data); -+ return (cairo_surface_t *) surf; -+ } -+ -+ // We created this data, so we can delete it. -+ surf->ownsData = TRUE; -+ -+ return (cairo_surface_t *) surf; -+} -+ -+/** -+ * cairo_quartz_surface_create_for_data -+ * @data: a pointer to a buffer supplied by the application in which -+ * to write contents. This pointer must be suitably aligned for any -+ * kind of variable, (for example, a pointer returned by malloc). -+ * @format: format of pixels in the surface to create -+ * @width: width of the surface, in pixels -+ * @height: height of the surface, in pixels -+ * -+ * Creates a Quartz surface backed by a CGBitmap. The surface is -+ * created using the Device RGB (or Device Gray, for A8) color space. -+ * All Cairo operations, including those that require software -+ * rendering, will succeed on this surface. -+ * -+ * Return value: the newly created surface. -+ * -+ * Since: 1.12 -+ **/ -+cairo_surface_t * -+cairo_quartz_surface_create_for_data (unsigned char *data, -+ cairo_format_t format, -+ unsigned int width, -+ unsigned int height, -+ unsigned int stride) -+{ - cairo_quartz_surface_t *surf; - CGContextRef cgc; - CGColorSpaceRef cgColorspace; - CGBitmapInfo bitinfo; -- void *imageData; -- int stride; -+ void *imageData = data; - int bitsPerComponent; -+ unsigned int i; - - // verify width and height of surface - if (!_cairo_quartz_verify_surface_size(width, height)) - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); - - if (width == 0 || height == 0) { - return (cairo_surface_t*) _cairo_quartz_surface_create_internal (NULL, _cairo_content_from_format (format), - width, height); -@@ -3058,47 +3140,30 @@ cairo_quartz_surface_create (cairo_forma - { - cgColorspace = CGColorSpaceCreateDeviceRGB(); - bitinfo = kCGBitmapByteOrder32Host; - if (format == CAIRO_FORMAT_ARGB32) - bitinfo |= kCGImageAlphaPremultipliedFirst; - else - bitinfo |= kCGImageAlphaNoneSkipFirst; - bitsPerComponent = 8; -- stride = width * 4; - } else if (format == CAIRO_FORMAT_A8) { - cgColorspace = NULL; -- stride = width; - bitinfo = kCGImageAlphaOnly; - bitsPerComponent = 8; - } else if (format == CAIRO_FORMAT_A1) { - /* I don't think we can usefully support this, as defined by - * cairo_format_t -- these are 1-bit pixels stored in 32-bit - * quantities. - */ - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); - } else { - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); - } - -- /* The Apple docs say that for best performance, the stride and the data -- * pointer should be 16-byte aligned. malloc already aligns to 16-bytes, -- * so we don't have to anything special on allocation. -- */ -- stride = (stride + 15) & ~15; -- -- imageData = _cairo_malloc_ab (height, stride); -- if (!imageData) { -- CGColorSpaceRelease (cgColorspace); -- return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); -- } -- -- /* zero the memory to match the image surface behaviour */ -- memset (imageData, 0, height * stride); -- - cgc = CGBitmapContextCreate (imageData, - width, - height, - bitsPerComponent, - stride, - cgColorspace, - bitinfo); - CGColorSpaceRelease (cgColorspace); -@@ -3118,16 +3183,17 @@ cairo_quartz_surface_create (cairo_forma - CGContextRelease (cgc); - free (imageData); - // create_internal will have set an error - return (cairo_surface_t*) surf; - } - - surf->imageData = imageData; - surf->imageSurfaceEquiv = cairo_image_surface_create_for_data (imageData, format, width, height, stride); -+ surf->ownsData = FALSE; - - return (cairo_surface_t *) surf; - } - - /** - * cairo_quartz_surface_get_cg_context - * @surface: the Cairo Quartz surface - * -diff --git a/gfx/cairo/cairo/src/cairo-quartz.h b/gfx/cairo/cairo/src/cairo-quartz.h ---- a/gfx/cairo/cairo/src/cairo-quartz.h -+++ b/gfx/cairo/cairo/src/cairo-quartz.h -@@ -45,16 +45,23 @@ - CAIRO_BEGIN_DECLS - - cairo_public cairo_surface_t * - cairo_quartz_surface_create (cairo_format_t format, - unsigned int width, - unsigned int height); - - cairo_public cairo_surface_t * -+cairo_quartz_surface_create_for_data (unsigned char *data, -+ cairo_format_t format, -+ unsigned int width, -+ unsigned int height, -+ unsigned int stride); -+ -+cairo_public cairo_surface_t * - cairo_quartz_surface_create_cg_layer (cairo_surface_t *surface, - unsigned int width, - unsigned int height); - - cairo_public cairo_surface_t * - cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, - unsigned int width, - unsigned int height); -diff --git a/gfx/cairo/cairo/src/cairo-rename.h b/gfx/cairo/cairo/src/cairo-rename.h ---- a/gfx/cairo/cairo/src/cairo-rename.h -+++ b/gfx/cairo/cairo/src/cairo-rename.h -@@ -176,16 +176,17 @@ - #define cairo_qpainter_surface_get_image _moz_cairo_qpainter_surface_get_image - #define cairo_qpainter_surface_get_qimage _moz_cairo_qpainter_surface_get_qimage - #define cairo_qpainter_surface_get_qpainter _moz_cairo_qpainter_surface_get_qpainter - #define cairo_quartz_font_face_create_for_atsu_font_id _moz_cairo_quartz_font_face_create_for_atsu_font_id - #define cairo_quartz_font_face_create_for_cgfont _moz_cairo_quartz_font_face_create_for_cgfont - #define cairo_quartz_image_surface_create _moz_cairo_quartz_image_surface_create - #define cairo_quartz_image_surface_get_image _moz_cairo_quartz_image_surface_get_image - #define cairo_quartz_surface_create _moz_cairo_quartz_surface_create -+#define cairo_quartz_surface_create_for_data _moz_cairo_quartz_surface_create_for_data - #define cairo_quartz_surface_create_for_cg_context _moz_cairo_quartz_surface_create_for_cg_context - #define cairo_quartz_surface_get_cg_context _moz_cairo_quartz_surface_get_cg_context - #define cairo_quartz_surface_get_image _moz_cairo_quartz_surface_get_image - #define cairo_rectangle _moz_cairo_rectangle - #define cairo_rectangle_list_destroy _moz_cairo_rectangle_list_destroy - #define cairo_reference _moz_cairo_reference - #define cairo_rel_curve_to _moz_cairo_rel_curve_to - #define cairo_rel_line_to _moz_cairo_rel_line_to diff --git a/gfx/cairo/quartz-fallback.patch b/gfx/cairo/quartz-fallback.patch deleted file mode 100644 index ca41b6e1f..000000000 --- a/gfx/cairo/quartz-fallback.patch +++ /dev/null @@ -1,70 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1250204857 -43200 -# Node ID cc6bebbd93bb9d8606fe06b997f890acc17996fb -# Parent caea8b548962f0df38e8e9032e9f57ef0fd099ec -Bug 507939 - Remove erroneous clip rect fixup which caused repainting errors with repeating radial gradients on Mac. r=jmuizelaar - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1033,38 +1033,29 @@ typedef enum { - DO_TILED_IMAGE - } cairo_quartz_action_t; - - static cairo_quartz_action_t - _cairo_quartz_setup_fallback_source (cairo_quartz_surface_t *surface, - const cairo_pattern_t *source) - { - CGRect clipBox = CGContextGetClipBoundingBox (surface->cgContext); -- CGAffineTransform ctm; - double x0, y0, w, h; - - cairo_surface_t *fallback; - cairo_t *fallback_cr; - CGImageRef img; - cairo_pattern_t *source_copy; - - cairo_status_t status; - - if (clipBox.size.width == 0.0f || - clipBox.size.height == 0.0f) - return DO_NOTHING; - -- // the clipBox is in userspace, so: -- ctm = CGContextGetCTM (surface->cgContext); -- ctm = CGAffineTransformInvert (ctm); -- clipBox = CGRectApplyAffineTransform (clipBox, ctm); -- -- // get the Y flip right -- the CTM will always have a Y flip in place -- clipBox.origin.y = surface->extents.height - (clipBox.origin.y + clipBox.size.height); -- - x0 = floor(clipBox.origin.x); - y0 = floor(clipBox.origin.y); - w = ceil(clipBox.origin.x + clipBox.size.width) - x0; - h = ceil(clipBox.origin.y + clipBox.size.height) - y0; - - /* Create a temporary the size of the clip surface, and position - * it so that the device origin coincides with the original surface */ - fallback = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, (int) w, (int) h); -@@ -1717,18 +1708,20 @@ _cairo_quartz_surface_paint (void *abstr - action = _cairo_quartz_setup_source (surface, source); - - if (action == DO_SOLID || action == DO_PATTERN) { - CGContextFillRect (surface->cgContext, CGRectMake(surface->extents.x, - surface->extents.y, - surface->extents.width, - surface->extents.height)); - } else if (action == DO_SHADING) { -+ CGContextSaveGState (surface->cgContext); - CGContextConcatCTM (surface->cgContext, surface->sourceTransform); - CGContextDrawShading (surface->cgContext, surface->sourceShading); -+ CGContextRestoreGState (surface->cgContext); - } else if (action == DO_IMAGE || action == DO_TILED_IMAGE) { - CGContextSaveGState (surface->cgContext); - - CGContextConcatCTM (surface->cgContext, surface->sourceTransform); - CGContextTranslateCTM (surface->cgContext, 0, surface->sourceImageRect.size.height); - CGContextScaleCTM (surface->cgContext, 1, -1); - - if (action == DO_IMAGE) diff --git a/gfx/cairo/quartz-first-stop.patch b/gfx/cairo/quartz-first-stop.patch deleted file mode 100644 index 5ea4b916c..000000000 --- a/gfx/cairo/quartz-first-stop.patch +++ /dev/null @@ -1,57 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -690,31 +690,51 @@ ComputeGradientValue (void *info, const - } - - static const float gradient_output_value_ranges[8] = { - 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f - }; - static const CGFunctionCallbacks gradient_callbacks = { - 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy - }; -+/* Quartz will clamp input values to the input range. -+ -+ Our stops are all in the range 0.0 to 1.0. However, the color before the -+ beginning of the gradient line is obtained by Quartz computing a negative -+ position on the gradient line, clamping it to the input range we specified -+ for our color function, and then calling our color function (actually it -+ pre-samples the color function into an array, but that doesn't matter just -+ here). Therefore if we set the lower bound to 0.0, a negative position -+ on the gradient line will pass 0.0 to ComputeGradientValue, which will -+ select the last color stop with position 0, although it should select -+ the first color stop (this matters when there are multiple color stops with -+ position 0). -+ -+ Therefore we pass a small negative number as the lower bound of the input -+ range, so this value gets passed into ComputeGradientValue, which will -+ return the color of the first stop. The number should be small because -+ as far as I can tell, Quartz pre-samples the entire input range of the color -+ function into an array of fixed size, so if the input range is larger -+ than needed, the resolution of the gradient will be unnecessarily low. -+*/ -+static const float nonrepeating_gradient_input_value_range[2] = { -0.001f, 1.f }; - - static CGFunctionRef - CreateGradientFunction (const cairo_gradient_pattern_t *gpat) - { - cairo_pattern_t *pat; -- float input_value_range[2] = { 0.f, 1.f }; - - if (_cairo_pattern_create_copy (&pat, &gpat->base)) - /* quartz doesn't deal very well with malloc failing, so there's - * not much point in us trying either */ - return NULL; - - return CGFunctionCreate (pat, - 1, -- input_value_range, -+ nonrepeating_gradient_input_value_range, - 4, - gradient_output_value_ranges, - &gradient_callbacks); - } - - static void - UpdateLinearParametersToIncludePoint(double *min_t, double *max_t, CGPoint *start, - double dx, double dy, diff --git a/gfx/cairo/quartz-fix-PAD.patch b/gfx/cairo/quartz-fix-PAD.patch deleted file mode 100644 index 0e5ed3107..000000000 --- a/gfx/cairo/quartz-fix-PAD.patch +++ /dev/null @@ -1,64 +0,0 @@ -From: Robert O'Callahan <robert@ocallahan.org> -Bug 593270. Part 2: Treat EXTEND_PAD like EXTEND_NONE when painting. r=jrmuizel,a=joe - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1464,35 +1464,35 @@ static void - _cairo_quartz_setup_surface_source (cairo_quartz_surface_t *surface, - const cairo_surface_pattern_t *spat, - cairo_rectangle_int_t *extents, - cairo_quartz_drawing_state_t *state) - { - const cairo_pattern_t *source = &spat->base; - CGContextRef context = state->context; - -- if (source->extend == CAIRO_EXTEND_NONE || -+ if (source->extend == CAIRO_EXTEND_NONE || source->extend == CAIRO_EXTEND_PAD || - (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT)) - { - cairo_surface_t *pat_surf = spat->surface; - CGImageRef img; - cairo_matrix_t m = spat->base.matrix; - cairo_rectangle_int_t extents; - CGAffineTransform xform; - CGRect srcRect; - cairo_fixed_t fw, fh; - cairo_bool_t is_bounded; -+ cairo_bool_t repeat = source->extend == CAIRO_EXTEND_REPEAT; - cairo_status_t status; - - cairo_matrix_invert(&m); - _cairo_quartz_cairo_matrix_to_quartz (&m, &state->transform); - - /* Draw nonrepeating CGLayer surface using DO_LAYER */ -- if (source->extend == CAIRO_EXTEND_NONE || -- (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT)) -+ if (!repeat && cairo_surface_get_type (pat_surf) == CAIRO_SURFACE_TYPE_QUARTZ) { - cairo_quartz_surface_t *quartz_surf = (cairo_quartz_surface_t *) pat_surf; - if (quartz_surf->cgLayer) { - state->imageRect = CGRectMake (0, 0, quartz_surf->extents.width, quartz_surf->extents.height); - state->layer = quartz_surf->cgLayer; - state->action = DO_LAYER; - return; - } - } -@@ -1510,17 +1510,17 @@ _cairo_quartz_setup_surface_source (cair - /* XXXroc what is this for? */ - CGContextSetRGBFillColor (surface->cgContext, 0, 0, 0, 1); - - state->image = img; - - is_bounded = _cairo_surface_get_extents (pat_surf, &extents); - assert (is_bounded); - -- if (source->extend == CAIRO_EXTEND_NONE) { -+ if (!repeat) { - state->imageRect = CGRectMake (0, 0, extents.width, extents.height); - state->action = DO_IMAGE; - return; - } - - /* Quartz seems to tile images at pixel-aligned regions only -- this - * leads to seams if the image doesn't end up scaling to fill the - * space exactly. The CGPattern tiling approach doesn't have this diff --git a/gfx/cairo/quartz-get-image-performance.patch b/gfx/cairo/quartz-get-image-performance.patch deleted file mode 100644 index ff3618cf8..000000000 --- a/gfx/cairo/quartz-get-image-performance.patch +++ /dev/null @@ -1,43 +0,0 @@ -# HG changeset patch -# User Matt Woodrow <mwoodrow@mozilla.com> -# Date 1314162877 -43200 -# Node ID 87458c4670dcd16be5a5715d741ee2ca4cf18d0f -# Parent 95eb700a64591cda694c284a9f8ad08c11e3dd97 -Bug 675837 - Only flush Quartz surfaces on the success paths during cairo_quartz_get_image. r=roc - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1909,30 +1909,30 @@ _cairo_quartz_get_image (cairo_quartz_su - unsigned char *imageData; - cairo_image_surface_t *isurf; - - if (IS_EMPTY(surface)) { - *image_out = (cairo_image_surface_t*) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0); - return CAIRO_STATUS_SUCCESS; - } - -- CGContextFlush(surface->cgContext); -- - if (surface->imageSurfaceEquiv) { -+ CGContextFlush(surface->cgContext); - *image_out = (cairo_image_surface_t*) cairo_surface_reference(surface->imageSurfaceEquiv); - return CAIRO_STATUS_SUCCESS; - } - - if (_cairo_quartz_is_cgcontext_bitmap_context(surface->cgContext)) { - unsigned int stride; - unsigned int bitinfo; - unsigned int bpc, bpp; - CGColorSpaceRef colorspace; - unsigned int color_comps; - -+ CGContextFlush(surface->cgContext); - imageData = (unsigned char *) CGBitmapContextGetData(surface->cgContext); - - #ifdef USE_10_3_WORKAROUNDS - bitinfo = CGBitmapContextGetAlphaInfo (surface->cgContext); - #else - bitinfo = CGBitmapContextGetBitmapInfo (surface->cgContext); - #endif - stride = CGBitmapContextGetBytesPerRow (surface->cgContext); diff --git a/gfx/cairo/quartz-get-image.patch b/gfx/cairo/quartz-get-image.patch deleted file mode 100644 index e95d82d54..000000000 --- a/gfx/cairo/quartz-get-image.patch +++ /dev/null @@ -1,127 +0,0 @@ -diff --git a/gfx/cairo/README b/gfx/cairo/README ---- a/gfx/cairo/README -+++ b/gfx/cairo/README -@@ -69,16 +69,18 @@ quartz-state.patch: bug 522859; refactor - quartz-cache-CGImageRef.patch: cache CGImageRef for a CGBitmapContext; when we reuse it, Quartz will cache stuff, improving performance - - quartz-remove-snapshot.patch: remove broken implementation of backend snapshot - - quartz-cglayers.patch: add support for cairo surfaces backed by CGLayers - - quartz-cglayers-fix-fallback.patch: Bug 572912; fix bug in fallback code in previous patch - -+quartz-get-image.patch: Bug 575521; add a way to get the image surface associated with a surface -+ - premultiply-alpha-solid-gradients.patch: bug 539165; multiply the solid color by the alpha component before using it for a solid surface - - xlib-initialize-members.path: bug 548793; initialize XRender version if the server doesn't have the extension - - remove-comma: remove a comma from enum - - d2d.patch: add d2d support - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1880,24 +1880,24 @@ _cairo_quartz_surface_finish (void *abst - surface->cgContext = NULL; - - if (surface->bitmapContextImage) { - CGImageRelease (surface->bitmapContextImage); - surface->bitmapContextImage = NULL; - } - - if (surface->imageSurfaceEquiv) { -+ _cairo_image_surface_assume_ownership_of_data (surface->imageSurfaceEquiv); - cairo_surface_destroy (surface->imageSurfaceEquiv); - surface->imageSurfaceEquiv = NULL; -+ } else if (surface->imageData) { -+ free (surface->imageData); - } - -- if (surface->imageData) { -- free (surface->imageData); -- surface->imageData = NULL; -- } -+ surface->imageData = NULL; - - if (surface->cgLayer) { - CGLayerRelease (surface->cgLayer); - } - - return CAIRO_STATUS_SUCCESS; - } - -@@ -3200,16 +3200,28 @@ cairo_quartz_finish_cg_context_with_clip - cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t*)surface; - - if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_QUARTZ) - return; - - CGContextRestoreGState (quartz->cgContext); - } - -+cairo_surface_t * -+cairo_quartz_surface_get_image (cairo_surface_t *surface) -+{ -+ cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t *)surface; -+ cairo_image_surface_t *image; -+ -+ if (_cairo_quartz_get_image(quartz, &image)) -+ return NULL; -+ -+ return (cairo_surface_t *)image; -+} -+ - /* Debug stuff */ - - #ifdef QUARTZ_DEBUG - - #include <Movies.h> - - void ExportCGImageToPNGFile(CGImageRef inImageRef, char* dest) - { -diff --git a/gfx/cairo/cairo/src/cairo-quartz.h b/gfx/cairo/cairo/src/cairo-quartz.h ---- a/gfx/cairo/cairo/src/cairo-quartz.h -+++ b/gfx/cairo/cairo/src/cairo-quartz.h -@@ -63,16 +63,19 @@ cairo_public CGContextRef - cairo_quartz_surface_get_cg_context (cairo_surface_t *surface); - - cairo_public CGContextRef - cairo_quartz_get_cg_context_with_clip (cairo_t *cr); - - cairo_public void - cairo_quartz_finish_cg_context_with_clip (cairo_t *cr); - -+cairo_public cairo_surface_t * -+cairo_quartz_surface_get_image (cairo_surface_t *surface); -+ - #if CAIRO_HAS_QUARTZ_FONT - - /* - * Quartz font support - */ - - cairo_public cairo_font_face_t * - cairo_quartz_font_face_create_for_cgfont (CGFontRef font); -diff --git a/gfx/cairo/cairo/src/cairo-rename.h b/gfx/cairo/cairo/src/cairo-rename.h ---- a/gfx/cairo/cairo/src/cairo-rename.h -+++ b/gfx/cairo/cairo/src/cairo-rename.h -@@ -178,16 +178,17 @@ - #define cairo_qpainter_surface_get_qpainter _moz_cairo_qpainter_surface_get_qpainter - #define cairo_quartz_font_face_create_for_atsu_font_id _moz_cairo_quartz_font_face_create_for_atsu_font_id - #define cairo_quartz_font_face_create_for_cgfont _moz_cairo_quartz_font_face_create_for_cgfont - #define cairo_quartz_image_surface_create _moz_cairo_quartz_image_surface_create - #define cairo_quartz_image_surface_get_image _moz_cairo_quartz_image_surface_get_image - #define cairo_quartz_surface_create _moz_cairo_quartz_surface_create - #define cairo_quartz_surface_create_for_cg_context _moz_cairo_quartz_surface_create_for_cg_context - #define cairo_quartz_surface_get_cg_context _moz_cairo_quartz_surface_get_cg_context -+#define cairo_quartz_surface_get_image _moz_cairo_quartz_surface_get_image - #define cairo_rectangle _moz_cairo_rectangle - #define cairo_rectangle_list_destroy _moz_cairo_rectangle_list_destroy - #define cairo_reference _moz_cairo_reference - #define cairo_rel_curve_to _moz_cairo_rel_curve_to - #define cairo_rel_line_to _moz_cairo_rel_line_to - #define cairo_rel_move_to _moz_cairo_rel_move_to - #define cairo_reset_clip _moz_cairo_reset_clip - #define cairo_restore _moz_cairo_restore diff --git a/gfx/cairo/quartz-glyph-extents.patch b/gfx/cairo/quartz-glyph-extents.patch deleted file mode 100644 index 311404292..000000000 --- a/gfx/cairo/quartz-glyph-extents.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/gfx/cairo/cairo/src/cairo-quartz-font.c Wed Dec 23 14:17:44 2009 -0500 -+++ b/gfx/cairo/cairo/src/cairo-quartz-font.c Wed Dec 23 20:45:00 2009 +0000 -@@ -420,6 +420,16 @@ _cairo_quartz_init_glyph_metrics (cairo_ - !CGFontGetGlyphBBoxesPtr (font_face->cgFont, &glyph, 1, &bbox)) - goto FAIL; - -+ /* broken fonts like Al Bayan return incorrect bounds for some null characters, -+ see https://bugzilla.mozilla.org/show_bug.cgi?id=534260 */ -+ if (unlikely (bbox.origin.x == -32767 && -+ bbox.origin.y == -32767 && -+ bbox.size.width == 65534 && -+ bbox.size.height == 65534)) { -+ bbox.origin.x = bbox.origin.y = 0; -+ bbox.size.width = bbox.size.height = 0; -+ } -+ - status = _cairo_matrix_compute_basis_scale_factors (&font->base.scale, - &xscale, &yscale, 1); - if (status) diff --git a/gfx/cairo/quartz-is-clear.patch b/gfx/cairo/quartz-is-clear.patch deleted file mode 100644 index 714951b44..000000000 --- a/gfx/cairo/quartz-is-clear.patch +++ /dev/null @@ -1,28 +0,0 @@ -commit df2b22c8c6677d531194579c82a55e855adff706 -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Thu Apr 8 15:43:41 2010 -0400 - - Propagate is_clear flag to quartz_image_surface - -diff --git a/src/cairo-quartz-image-surface.c b/src/cairo-quartz-image-surface.c -index 5a624eb..b8809d5 100644 ---- a/src/cairo-quartz-image-surface.c -+++ b/src/cairo-quartz-image-surface.c -@@ -146,6 +146,8 @@ _cairo_quartz_image_surface_flush (void *asurface) - surface->image = newImage; - CGImageRelease (oldImage); - -+ surface->base.is_clear = surface->imageSurface->base.is_clear; -+ - return CAIRO_STATUS_SUCCESS; - } - -@@ -267,6 +269,8 @@ cairo_quartz_image_surface_create (cairo_surface_t *surface) - qisurf->image = image; - qisurf->imageSurface = image_surface; - -+ qisurf->base.is_clear = image_surface->base.is_clear; -+ - return &qisurf->base; - } - diff --git a/gfx/cairo/quartz-layers-content.patch b/gfx/cairo/quartz-layers-content.patch deleted file mode 100644 index 243d1f017..000000000 --- a/gfx/cairo/quartz-layers-content.patch +++ /dev/null @@ -1,125 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -2040,17 +2040,18 @@ _cairo_quartz_surface_create_similar (vo - cairo_content_t content, - int width, - int height) - { - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - cairo_format_t format; - - if (surface->cgLayer) -- return cairo_quartz_surface_create_cg_layer (abstract_surface, width, height); -+ return cairo_quartz_surface_create_cg_layer (abstract_surface, content, -+ width, height); - - if (content == CAIRO_CONTENT_COLOR_ALPHA) - format = CAIRO_FORMAT_ARGB32; - else if (content == CAIRO_CONTENT_COLOR) - format = CAIRO_FORMAT_RGB24; - else if (content == CAIRO_CONTENT_ALPHA) - format = CAIRO_FORMAT_A8; - else -@@ -2960,54 +2961,55 @@ cairo_quartz_surface_create_for_cg_conte - - return (cairo_surface_t *) surf; - } - - /** - * cairo_quartz_cglayer_surface_create_similar - * @surface: The returned surface can be efficiently drawn into this - * destination surface (if tiling is not used)." -+ * @content: the content type of the surface - * @width: width of the surface, in pixels - * @height: height of the surface, in pixels - * - * Creates a Quartz surface backed by a CGLayer, if the given surface - * is a Quartz surface; the CGLayer is created to match the surface's -- * Quartz context. Otherwise just calls cairo_surface_create_similar -- * with CAIRO_CONTENT_COLOR_ALPHA. -+ * Quartz context. Otherwise just calls cairo_surface_create_similar. - * The returned surface can be efficiently blitted to the given surface, - * but tiling and 'extend' modes other than NONE are not so efficient. - * - * Return value: the newly created surface. - * - * Since: 1.10 - **/ - cairo_surface_t * - cairo_quartz_surface_create_cg_layer (cairo_surface_t *surface, -+ cairo_content_t content, - unsigned int width, - unsigned int height) - { - cairo_quartz_surface_t *surf; - CGLayerRef layer; - CGContextRef ctx; - CGContextRef cgContext; - - cgContext = cairo_quartz_surface_get_cg_context (surface); - if (!cgContext) -- return cairo_surface_create_similar (surface, CAIRO_CONTENT_COLOR_ALPHA, -+ return cairo_surface_create_similar (surface, content, - width, height); - - if (!_cairo_quartz_verify_surface_size(width, height)) - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); - - /* If we pass zero width or height into CGLayerCreateWithContext below, - * it will fail. - */ - if (width == 0 || height == 0) { - return (cairo_surface_t*) -- _cairo_quartz_surface_create_internal (NULL, CAIRO_CONTENT_COLOR_ALPHA, -+ _cairo_quartz_surface_create_internal (NULL, content, - width, height); - } - - layer = CGLayerCreateWithContext (cgContext, - CGSizeMake (width, height), - NULL); - if (!layer) - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); -@@ -3016,18 +3018,18 @@ cairo_quartz_surface_create_cg_layer (ca - /* Flip it when we draw into it, so that when we finally composite it - * to a flipped target, the directions match and Quartz will optimize - * the composition properly - */ - CGContextTranslateCTM (ctx, 0, height); - CGContextScaleCTM (ctx, 1, -1); - - CGContextRetain (ctx); -- surf = _cairo_quartz_surface_create_internal (ctx, CAIRO_CONTENT_COLOR_ALPHA, -- width, height); -+ surf = _cairo_quartz_surface_create_internal (ctx, content, -+ width, height); - if (surf->base.status) { - CGLayerRelease (layer); - // create_internal will have set an error - return (cairo_surface_t*) surf; - } - surf->cgLayer = layer; - - return (cairo_surface_t *) surf; -diff --git a/gfx/cairo/cairo/src/cairo-quartz.h b/gfx/cairo/cairo/src/cairo-quartz.h ---- a/gfx/cairo/cairo/src/cairo-quartz.h -+++ b/gfx/cairo/cairo/src/cairo-quartz.h -@@ -46,16 +46,17 @@ CAIRO_BEGIN_DECLS - - cairo_public cairo_surface_t * - cairo_quartz_surface_create (cairo_format_t format, - unsigned int width, - unsigned int height); - - cairo_public cairo_surface_t * - cairo_quartz_surface_create_cg_layer (cairo_surface_t *surface, -+ cairo_content_t content, - unsigned int width, - unsigned int height); - - cairo_public cairo_surface_t * - cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, - unsigned int width, - unsigned int height); - diff --git a/gfx/cairo/quartz-mark-dirty.patch b/gfx/cairo/quartz-mark-dirty.patch deleted file mode 100644 index ddaaf94e8..000000000 --- a/gfx/cairo/quartz-mark-dirty.patch +++ /dev/null @@ -1,56 +0,0 @@ -Date: Thu Jan 5 18:40:01 2012 -0500 - -Bug 715704. Add a quartz implementation of mark_dirty_rectangle. r=roc - -We need to drop our CGImage cache when the surface has been changed by outside users. - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -3116,16 +3116,27 @@ _cairo_quartz_surface_clipper_intersect_ - CGContextEOClip (surface->cgContext); - } - - ND((stderr, "-- intersect_clip_path\n")); - - return CAIRO_STATUS_SUCCESS; - } - -+static cairo_status_t -+_cairo_quartz_surface_mark_dirty_rectangle (void *abstract_surface, -+ int x, int y, -+ int width, int height) -+{ -+ cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; -+ _cairo_quartz_surface_will_change (surface); -+ return CAIRO_STATUS_SUCCESS; -+} -+ -+ - // XXXtodo implement show_page; need to figure out how to handle begin/end - - static const struct _cairo_surface_backend cairo_quartz_surface_backend = { - CAIRO_SURFACE_TYPE_QUARTZ, - _cairo_quartz_surface_create_similar, - _cairo_quartz_surface_finish, - _cairo_quartz_surface_acquire_image, - _cairo_quartz_surface_release_source_image, -@@ -3138,17 +3149,17 @@ static const struct _cairo_surface_backe - NULL, /* create_span_renderer */ - NULL, /* check_span_renderer */ - NULL, /* copy_page */ - NULL, /* show_page */ - _cairo_quartz_surface_get_extents, - NULL, /* old_show_glyphs */ - NULL, /* get_font_options */ - NULL, /* flush */ -- NULL, /* mark_dirty_rectangle */ -+ _cairo_quartz_surface_mark_dirty_rectangle, - NULL, /* scaled_font_fini */ - NULL, /* scaled_glyph_fini */ - - _cairo_quartz_surface_paint, - _cairo_quartz_surface_mask, - _cairo_quartz_surface_stroke, - _cairo_quartz_surface_fill, - _cairo_quartz_surface_show_glyphs, diff --git a/gfx/cairo/quartz-mask-non-OVER.patch b/gfx/cairo/quartz-mask-non-OVER.patch deleted file mode 100644 index a6d94be12..000000000 --- a/gfx/cairo/quartz-mask-non-OVER.patch +++ /dev/null @@ -1,80 +0,0 @@ -From: Robert O'Callahan <robert@ocallahan.org> -Bug 579985. Using CGContextSetAlpha to implement mask alpha doesn't work for some operators. r=jrmuizel,a=blocking - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -2734,17 +2734,19 @@ _cairo_quartz_surface_mask (void *abstra - - if (IS_EMPTY(surface)) - return CAIRO_STATUS_SUCCESS; - - rv = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (unlikely (rv)) - return rv; - -- if (mask->type == CAIRO_PATTERN_TYPE_SOLID) { -+ /* Using CGContextSetAlpha to implement mask alpha doesn't work for all operators. */ -+ if (mask->type == CAIRO_PATTERN_TYPE_SOLID && -+ op == CAIRO_OPERATOR_OVER) { - /* This is easy; we just need to paint with the alpha. */ - cairo_solid_pattern_t *solid_mask = (cairo_solid_pattern_t *) mask; - - CGContextSetAlpha (surface->cgContext, solid_mask->color.alpha); - rv = _cairo_quartz_surface_paint (surface, op, source, clip); - CGContextSetAlpha (surface->cgContext, 1.0); - - return rv; -diff --git a/layout/reftests/bugs/579985-1-ref.html b/layout/reftests/bugs/579985-1-ref.html -new file mode 100644 ---- /dev/null -+++ b/layout/reftests/bugs/579985-1-ref.html -@@ -0,0 +1,6 @@ -+<!DOCTYPE HTML> -+<html> -+<body> -+<div style="width:100px; height:100px; background:blue; opacity:0.5;">Hello</div> -+</body> -+</html> -diff --git a/layout/reftests/bugs/579985-1.html b/layout/reftests/bugs/579985-1.html -new file mode 100644 ---- /dev/null -+++ b/layout/reftests/bugs/579985-1.html -@@ -0,0 +1,16 @@ -+<!DOCTYPE HTML> -+<html class="reftest-wait"> -+<head> -+<script> -+function doTest() { -+ var d = document.getElementById("d"); -+ d.style.opacity = 0.75; -+ document.documentElement.removeAttribute("class"); -+} -+window.addEventListener("MozReftestInvalidate", doTest, false); -+</script> -+</head> -+<body> -+<div id="d" style="width:100px; height:100px; background:blue;">Hello</div> -+</body> -+</html> -diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list ---- a/layout/reftests/bugs/reftest.list -+++ b/layout/reftests/bugs/reftest.list -@@ -1499,16 +1499,17 @@ random-if(layersGPUAccelerated) == 56499 - == 571347-3.html 571347-3-ref.html - == 572598-1.html 572598-ref.html - == 574898-1.html 574898-ref.html - == 579655-1.html 579655-1-ref.html - == 577838-1.html 577838-1-ref.html - == 577838-2.html 577838-2-ref.html - random-if(layersGPUAccelerated) == 579323-1.html 579323-1-ref.html - == 579349-1.html 579349-1-ref.html -+== 579985-1.html 579985-1-ref.html - == 580160-1.html 580160-1-ref.html - HTTP(..) == 580863-1.html 580863-1-ref.html - random-if(layersGPUAccelerated) == 581317-1.html 581317-1-ref.html - == 581579-1.html 581579-1-ref.html - == 582037-1a.html 582037-1-ref.html - == 582037-1b.html 582037-1-ref.html - == 582037-2a.html 582037-2-ref.html - == 582037-2b.html 582037-2-ref.html diff --git a/gfx/cairo/quartz-minimize-gradient-repeat.patch b/gfx/cairo/quartz-minimize-gradient-repeat.patch deleted file mode 100644 index 9782bef11..000000000 --- a/gfx/cairo/quartz-minimize-gradient-repeat.patch +++ /dev/null @@ -1,561 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1249558989 -43200 -# Node ID 0bac4c903d2bb1d5c0d5426209001fc2a77cc105 -# Parent 963b9451ad305924738d05d997a640698cd3af91 -Bug 508730. Don't repeat a Quartz gradient more times than necessary, to avoid Quartz quality problems when there are lots of repeated color stops. r=jmuizelaar - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -710,82 +710,100 @@ CreateGradientFunction (const cairo_grad - return CGFunctionCreate (pat, - 1, - input_value_range, - 4, - gradient_output_value_ranges, - &gradient_callbacks); - } - -+static void -+UpdateLinearParametersToIncludePoint(double *min_t, double *max_t, CGPoint *start, -+ double dx, double dy, -+ double x, double y) -+{ -+ /* Compute a parameter t such that a line perpendicular to the (dx,dy) -+ vector, passing through (start->x + dx*t, start->y + dy*t), also -+ passes through (x,y). -+ -+ Let px = x - start->x, py = y - start->y. -+ t is given by -+ (px - dx*t)*dx + (py - dy*t)*dy = 0 -+ -+ Solving for t we get -+ numerator = dx*px + dy*py -+ denominator = dx^2 + dy^2 -+ t = numerator/denominator -+ -+ In CreateRepeatingLinearGradientFunction we know the length of (dx,dy) -+ is not zero. (This is checked in _cairo_quartz_setup_linear_source.) -+ */ -+ double px = x - start->x; -+ double py = y - start->y; -+ double numerator = dx*px + dy*py; -+ double denominator = dx*dx + dy*dy; -+ double t = numerator/denominator; -+ -+ if (*min_t > t) { -+ *min_t = t; -+ } -+ if (*max_t < t) { -+ *max_t = t; -+ } -+} -+ - static CGFunctionRef - CreateRepeatingLinearGradientFunction (cairo_quartz_surface_t *surface, - const cairo_gradient_pattern_t *gpat, - CGPoint *start, CGPoint *end, -- CGAffineTransform matrix) -+ cairo_rectangle_int_t *extents) - { - cairo_pattern_t *pat; - float input_value_range[2]; -+ double t_min = 0.; -+ double t_max = 0.; -+ double dx = end->x - start->x; -+ double dy = end->y - start->y; -+ double bounds_x1, bounds_x2, bounds_y1, bounds_y2; - -- CGPoint mstart, mend; -+ if (!extents) { -+ extents = &surface->extents; -+ } -+ bounds_x1 = extents->x; -+ bounds_y1 = extents->y; -+ bounds_x2 = extents->x + extents->width; -+ bounds_y2 = extents->y + extents->height; -+ _cairo_matrix_transform_bounding_box (&gpat->base.matrix, -+ &bounds_x1, &bounds_y1, -+ &bounds_x2, &bounds_y2, -+ NULL); - -- double dx, dy; -- int x_rep_start = 0, x_rep_end = 0; -- int y_rep_start = 0, y_rep_end = 0; -+ UpdateLinearParametersToIncludePoint(&t_min, &t_max, start, dx, dy, -+ bounds_x1, bounds_y1); -+ UpdateLinearParametersToIncludePoint(&t_min, &t_max, start, dx, dy, -+ bounds_x2, bounds_y1); -+ UpdateLinearParametersToIncludePoint(&t_min, &t_max, start, dx, dy, -+ bounds_x2, bounds_y2); -+ UpdateLinearParametersToIncludePoint(&t_min, &t_max, start, dx, dy, -+ bounds_x1, bounds_y2); - -- int rep_start, rep_end; -- -- // figure out how many times we'd need to repeat the gradient pattern -- // to cover the whole (transformed) surface area -- mstart = CGPointApplyAffineTransform (*start, matrix); -- mend = CGPointApplyAffineTransform (*end, matrix); -- -- dx = fabs (mend.x - mstart.x); -- dy = fabs (mend.y - mstart.y); -- -- if (dx > 1e-6) { -- x_rep_start = (int) ceil(MIN(mstart.x, mend.x) / dx); -- x_rep_end = (int) ceil((surface->extents.width - MAX(mstart.x, mend.x)) / dx); -- -- if (mend.x < mstart.x) { -- int swap = x_rep_end; -- x_rep_end = x_rep_start; -- x_rep_start = swap; -- } -- } -- -- if (dy > 1e-6) { -- y_rep_start = (int) ceil(MIN(mstart.y, mend.y) / dy); -- y_rep_end = (int) ceil((surface->extents.width - MAX(mstart.y, mend.y)) / dy); -- -- if (mend.y < mstart.y) { -- int swap = y_rep_end; -- y_rep_end = y_rep_start; -- y_rep_start = swap; -- } -- } -- -- rep_start = MAX(x_rep_start, y_rep_start); -- rep_end = MAX(x_rep_end, y_rep_end); -- -- // extend the line between start and end by rep_start times from the start -- // and rep_end times from the end -- -- dx = end->x - start->x; -- dy = end->y - start->y; -- -- start->x = start->x - dx * rep_start; -- start->y = start->y - dy * rep_start; -- -- end->x = end->x + dx * rep_end; -- end->y = end->y + dy * rep_end; -+ /* Move t_min and t_max to the nearest usable integer to try to avoid -+ subtle variations due to numerical instability, especially accidentally -+ cutting off a pixel. Extending the gradient repetitions is always safe. */ -+ t_min = floor (t_min); -+ t_max = ceil (t_max); -+ end->x = start->x + dx*t_max; -+ end->y = start->y + dy*t_max; -+ start->x = start->x + dx*t_min; -+ start->y = start->y + dy*t_min; - - // set the input range for the function -- the function knows how to - // map values outside of 0.0 .. 1.0 to that range for REPEAT/REFLECT. -- input_value_range[0] = 0.0 - 1.0 * rep_start; -- input_value_range[1] = 1.0 + 1.0 * rep_end; -+ input_value_range[0] = t_min; -+ input_value_range[1] = t_max; - - if (_cairo_pattern_create_copy (&pat, &gpat->base)) - /* quartz doesn't deal very well with malloc failing, so there's - * not much point in us trying either */ - return NULL; - - return CGFunctionCreate (pat, - 1, -@@ -840,35 +858,43 @@ UpdateRadialParameterToIncludePoint(doub - } - } - - /* This must only be called when one of the circles properly contains the other */ - static CGFunctionRef - CreateRepeatingRadialGradientFunction (cairo_quartz_surface_t *surface, - const cairo_gradient_pattern_t *gpat, - CGPoint *start, double *start_radius, -- CGPoint *end, double *end_radius) -+ CGPoint *end, double *end_radius, -+ cairo_rectangle_int_t *extents) - { -- CGRect clip = CGContextGetClipBoundingBox (surface->cgContext); -- CGAffineTransform transform; - cairo_pattern_t *pat; - float input_value_range[2]; - CGPoint *inner; - double *inner_radius; - CGPoint *outer; - double *outer_radius; - /* minimum and maximum t-parameter values that will make our gradient - cover the clipBox */ - double t_min, t_max, t_temp; - /* outer minus inner */ - double dr, dx, dy; -+ double bounds_x1, bounds_x2, bounds_y1, bounds_y2; - -- _cairo_quartz_cairo_matrix_to_quartz (&gpat->base.matrix, &transform); -- /* clip is in cairo device coordinates; get it into cairo user space */ -- clip = CGRectApplyAffineTransform (clip, transform); -+ if (!extents) { -+ extents = &surface->extents; -+ } -+ bounds_x1 = extents->x; -+ bounds_y1 = extents->y; -+ bounds_x2 = extents->x + extents->width; -+ bounds_y2 = extents->y + extents->height; -+ _cairo_matrix_transform_bounding_box (&gpat->base.matrix, -+ &bounds_x1, &bounds_y1, -+ &bounds_x2, &bounds_y2, -+ NULL); - - if (*start_radius < *end_radius) { - /* end circle contains start circle */ - inner = start; - outer = end; - inner_radius = start_radius; - outer_radius = end_radius; - } else { -@@ -878,36 +904,37 @@ CreateRepeatingRadialGradientFunction (c - inner_radius = end_radius; - outer_radius = start_radius; - } - - dr = *outer_radius - *inner_radius; - dx = outer->x - inner->x; - dy = outer->y - inner->y; - -+ /* We can't round or fudge t_min here, it has to be as accurate as possible. */ - t_min = -(*inner_radius/dr); - inner->x += t_min*dx; - inner->y += t_min*dy; - *inner_radius = 0.; - - t_temp = 0.; - UpdateRadialParameterToIncludePoint(&t_temp, inner, dr, dx, dy, -- clip.origin.x, clip.origin.y); -+ bounds_x1, bounds_y1); - UpdateRadialParameterToIncludePoint(&t_temp, inner, dr, dx, dy, -- clip.origin.x + clip.size.width, clip.origin.y); -+ bounds_x2, bounds_y1); - UpdateRadialParameterToIncludePoint(&t_temp, inner, dr, dx, dy, -- clip.origin.x + clip.size.width, clip.origin.y + clip.size.height); -+ bounds_x2, bounds_y2); - UpdateRadialParameterToIncludePoint(&t_temp, inner, dr, dx, dy, -- clip.origin.x, clip.origin.y + clip.size.height); -+ bounds_x1, bounds_y2); - /* UpdateRadialParameterToIncludePoint assumes t=0 means radius 0. - But for the parameter values we use with Quartz, t_min means radius 0. -- Also, add a small fudge factor to avoid rounding issues. Since the -- circles are alway expanding and containing the earlier circles, this is -- OK. */ -- t_temp += 1e-6; -+ Since the circles are alway expanding and contain the earlier circles, -+ it's safe to extend t_max/t_temp as much as we want, so round t_temp up -+ to the nearest integer. This may help us give stable results. */ -+ t_temp = ceil (t_temp); - t_max = t_min + t_temp; - outer->x = inner->x + t_temp*dx; - outer->y = inner->y + t_temp*dy; - *outer_radius = t_temp*dr; - - /* set the input range for the function -- the function knows how to - map values outside of 0.0 .. 1.0 to that range for REPEAT/REFLECT. */ - if (*start_radius < *end_radius) { -@@ -1218,33 +1245,57 @@ _cairo_quartz_setup_fallback_source (cai - surface->sourceImageRect = CGRectMake (0.0, 0.0, w, h); - surface->sourceImage = img; - surface->sourceImageSurface = fallback; - surface->sourceTransform = CGAffineTransformMakeTranslation (x0, y0); - - return DO_IMAGE; - } - -+/* -+Quartz does not support repeating radients. We handle repeating gradients -+by manually extending the gradient and repeating color stops. We need to -+minimize the number of repetitions since Quartz seems to sample our color -+function across the entire range, even if part of that range is not needed -+for the visible area of the gradient, and it samples with some fixed resolution, -+so if the gradient range is too large it samples with very low resolution and -+the gradient is very coarse. CreateRepeatingLinearGradientFunction and -+CreateRepeatingRadialGradientFunction compute the number of repetitions needed -+based on the extents of the object (the clip region cannot be used here since -+we don't want the rasterization of the entire gradient to depend on the -+clip region). -+*/ - static cairo_quartz_action_t - _cairo_quartz_setup_linear_source (cairo_quartz_surface_t *surface, -- const cairo_linear_pattern_t *lpat) -+ const cairo_linear_pattern_t *lpat, -+ cairo_rectangle_int_t *extents) - { - const cairo_pattern_t *abspat = &lpat->base.base; - cairo_matrix_t mat; - CGPoint start, end; - CGFunctionRef gradFunc; - CGColorSpaceRef rgb; - bool extend = abspat->extend == CAIRO_EXTEND_PAD; - - if (lpat->base.n_stops == 0) { - CGContextSetRGBStrokeColor (surface->cgContext, 0., 0., 0., 0.); - CGContextSetRGBFillColor (surface->cgContext, 0., 0., 0., 0.); - return DO_SOLID; - } - -+ if (lpat->p1.x == lpat->p2.x && -+ lpat->p1.y == lpat->p2.y) { -+ /* Quartz handles cases where the vector has no length very -+ * differently from pixman. -+ * Whatever the correct behaviour is, let's at least have only pixman's -+ * implementation to worry about. -+ */ -+ return _cairo_quartz_setup_fallback_source (surface, abspat); -+ } -+ - mat = abspat->matrix; - cairo_matrix_invert (&mat); - _cairo_quartz_cairo_matrix_to_quartz (&mat, &surface->sourceTransform); - - rgb = CGColorSpaceCreateDeviceRGB(); - - start = CGPointMake (_cairo_fixed_to_double (lpat->p1.x), - _cairo_fixed_to_double (lpat->p1.y)); -@@ -1254,33 +1305,34 @@ _cairo_quartz_setup_linear_source (cairo - if (abspat->extend == CAIRO_EXTEND_NONE || - abspat->extend == CAIRO_EXTEND_PAD) - { - gradFunc = CreateGradientFunction (&lpat->base); - } else { - gradFunc = CreateRepeatingLinearGradientFunction (surface, - &lpat->base, - &start, &end, -- surface->sourceTransform); -+ extents); - } - - surface->sourceShading = CGShadingCreateAxial (rgb, - start, end, - gradFunc, - extend, extend); - - CGColorSpaceRelease(rgb); - CGFunctionRelease(gradFunc); - - return DO_SHADING; - } - - static cairo_quartz_action_t - _cairo_quartz_setup_radial_source (cairo_quartz_surface_t *surface, -- const cairo_radial_pattern_t *rpat) -+ const cairo_radial_pattern_t *rpat, -+ cairo_rectangle_int_t *extents) - { - const cairo_pattern_t *abspat = &rpat->base.base; - cairo_matrix_t mat; - CGPoint start, end; - CGFunctionRef gradFunc; - CGColorSpaceRef rgb; - bool extend = abspat->extend == CAIRO_EXTEND_PAD; - double c1x = _cairo_fixed_to_double (rpat->c1.x); -@@ -1322,17 +1374,18 @@ _cairo_quartz_setup_radial_source (cairo - if (abspat->extend == CAIRO_EXTEND_NONE || - abspat->extend == CAIRO_EXTEND_PAD) - { - gradFunc = CreateGradientFunction (&rpat->base); - } else { - gradFunc = CreateRepeatingRadialGradientFunction (surface, - &rpat->base, - &start, &r1, -- &end, &r2); -+ &end, &r2, -+ extents); - } - - surface->sourceShading = CGShadingCreateRadial (rgb, - start, - r1, - end, - r2, - gradFunc, -@@ -1341,17 +1394,18 @@ _cairo_quartz_setup_radial_source (cairo - CGColorSpaceRelease(rgb); - CGFunctionRelease(gradFunc); - - return DO_SHADING; - } - - static cairo_quartz_action_t - _cairo_quartz_setup_source (cairo_quartz_surface_t *surface, -- const cairo_pattern_t *source) -+ const cairo_pattern_t *source, -+ cairo_rectangle_int_t *extents) - { - assert (!(surface->sourceImage || surface->sourceShading || surface->sourcePattern)); - - surface->oldInterpolationQuality = CGContextGetInterpolationQuality (surface->cgContext); - CGContextSetInterpolationQuality (surface->cgContext, _cairo_quartz_filter_to_quartz (source->filter)); - - if (source->type == CAIRO_PATTERN_TYPE_SOLID) { - cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; -@@ -1367,24 +1421,22 @@ _cairo_quartz_setup_source (cairo_quartz - solid->color.blue, - solid->color.alpha); - - return DO_SOLID; - } - - if (source->type == CAIRO_PATTERN_TYPE_LINEAR) { - const cairo_linear_pattern_t *lpat = (const cairo_linear_pattern_t *)source; -- return _cairo_quartz_setup_linear_source (surface, lpat); -- -+ return _cairo_quartz_setup_linear_source (surface, lpat, extents); - } - - if (source->type == CAIRO_PATTERN_TYPE_RADIAL) { - const cairo_radial_pattern_t *rpat = (const cairo_radial_pattern_t *)source; -- return _cairo_quartz_setup_radial_source (surface, rpat); -- -+ return _cairo_quartz_setup_radial_source (surface, rpat, extents); - } - - if (source->type == CAIRO_PATTERN_TYPE_SURFACE && - (source->extend == CAIRO_EXTEND_NONE || (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT))) - { - const cairo_surface_pattern_t *spat = (const cairo_surface_pattern_t *) source; - cairo_surface_t *pat_surf = spat->surface; - CGImageRef img; -@@ -1852,17 +1904,17 @@ _cairo_quartz_surface_paint (void *abstr - if (IS_EMPTY(surface)) - return CAIRO_STATUS_SUCCESS; - - if (op == CAIRO_OPERATOR_DEST) - return CAIRO_STATUS_SUCCESS; - - CGContextSetCompositeOperation (surface->cgContext, _cairo_quartz_cairo_operator_to_quartz (op)); - -- action = _cairo_quartz_setup_source (surface, source); -+ action = _cairo_quartz_setup_source (surface, source, NULL); - - if (action == DO_SOLID || action == DO_PATTERN) { - CGContextFillRect (surface->cgContext, CGRectMake(surface->extents.x, - surface->extents.y, - surface->extents.width, - surface->extents.height)); - } else if (action == DO_SHADING) { - CGContextSaveGState (surface->cgContext); -@@ -1886,16 +1938,35 @@ _cairo_quartz_surface_paint (void *abstr - } - - _cairo_quartz_teardown_source (surface, source); - - ND((stderr, "-- paint\n")); - return rv; - } - -+static cairo_bool_t -+_cairo_quartz_source_needs_extents (const cairo_pattern_t *source) -+{ -+ /* For repeating gradients we need to manually extend the gradient and -+ repeat stops, since Quartz doesn't support repeating gradients natively. -+ We need to minimze the number of repeated stops, and since rasterization -+ depends on the number of repetitions we use (even if some of the -+ repetitions go beyond the extents of the object or outside the clip -+ region), it's important to use the same number of repetitions when -+ rendering an object no matter what the clip region is. So the -+ computation of the repetition count cannot depended on the clip region, -+ and should only depend on the object extents, so we need to compute -+ the object extents for repeating gradients. */ -+ return (source->type == CAIRO_PATTERN_TYPE_LINEAR || -+ source->type == CAIRO_PATTERN_TYPE_RADIAL) && -+ (source->extend == CAIRO_EXTEND_REPEAT || -+ source->extend == CAIRO_EXTEND_REFLECT); -+} -+ - static cairo_int_status_t - _cairo_quartz_surface_fill (void *abstract_surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_path_fixed_t *path, - cairo_fill_rule_t fill_rule, - double tolerance, - cairo_antialias_t antialias, -@@ -1926,17 +1997,27 @@ _cairo_quartz_surface_fill (void *abstra - return CAIRO_STATUS_SUCCESS; - } - - CGContextSaveGState (surface->cgContext); - - CGContextSetShouldAntialias (surface->cgContext, (antialias != CAIRO_ANTIALIAS_NONE)); - CGContextSetCompositeOperation (surface->cgContext, _cairo_quartz_cairo_operator_to_quartz (op)); - -- action = _cairo_quartz_setup_source (surface, source); -+ if (_cairo_quartz_source_needs_extents (source)) -+ { -+ /* We don't need precise extents since these are only used to -+ compute the number of gradient reptitions needed to cover the -+ object. */ -+ cairo_rectangle_int_t path_extents; -+ _cairo_path_fixed_approximate_fill_extents (path, &path_extents); -+ action = _cairo_quartz_setup_source (surface, source, &path_extents); -+ } else { -+ action = _cairo_quartz_setup_source (surface, source, NULL); -+ } - - CGContextBeginPath (surface->cgContext); - - stroke.cgContext = surface->cgContext; - stroke.ctm_inverse = NULL; - rv = _cairo_quartz_cairo_path_to_quartz_context (path, &stroke); - if (rv) - goto BAIL; -@@ -2059,17 +2140,24 @@ _cairo_quartz_surface_stroke (void *abst - - CGContextSetLineDash (surface->cgContext, style->dash_offset, fdash, max_dashes); - if (fdash != sdash) - free (fdash); - } - - CGContextSetCompositeOperation (surface->cgContext, _cairo_quartz_cairo_operator_to_quartz (op)); - -- action = _cairo_quartz_setup_source (surface, source); -+ if (_cairo_quartz_source_needs_extents (source)) -+ { -+ cairo_rectangle_int_t path_extents; -+ _cairo_path_fixed_approximate_stroke_extents (path, style, ctm, &path_extents); -+ action = _cairo_quartz_setup_source (surface, source, &path_extents); -+ } else { -+ action = _cairo_quartz_setup_source (surface, source, NULL); -+ } - - CGContextBeginPath (surface->cgContext); - - stroke.cgContext = surface->cgContext; - stroke.ctm_inverse = ctm_inverse; - rv = _cairo_quartz_cairo_path_to_quartz_context (path, &stroke); - if (rv) - goto BAIL; -@@ -2180,17 +2268,26 @@ _cairo_quartz_surface_show_glyphs (void - if (op == CAIRO_OPERATOR_DEST) - return CAIRO_STATUS_SUCCESS; - - if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_QUARTZ) - return CAIRO_INT_STATUS_UNSUPPORTED; - - CGContextSaveGState (surface->cgContext); - -- action = _cairo_quartz_setup_source (surface, source); -+ if (_cairo_quartz_source_needs_extents (source)) -+ { -+ cairo_rectangle_int_t glyph_extents; -+ _cairo_scaled_font_glyph_device_extents (scaled_font, glyphs, num_glyphs, -+ &glyph_extents); -+ action = _cairo_quartz_setup_source (surface, source, &glyph_extents); -+ } else { -+ action = _cairo_quartz_setup_source (surface, source, NULL); -+ } -+ - if (action == DO_SOLID || action == DO_PATTERN) { - CGContextSetTextDrawingMode (surface->cgContext, kCGTextFill); - } else if (action == DO_IMAGE || action == DO_TILED_IMAGE || action == DO_SHADING) { - CGContextSetTextDrawingMode (surface->cgContext, kCGTextClip); - isClipping = TRUE; - } else { - if (action != DO_NOTHING) - rv = CAIRO_INT_STATUS_UNSUPPORTED; diff --git a/gfx/cairo/quartz-optimize-OVER.patch b/gfx/cairo/quartz-optimize-OVER.patch deleted file mode 100644 index 2c587459b..000000000 --- a/gfx/cairo/quartz-optimize-OVER.patch +++ /dev/null @@ -1,71 +0,0 @@ -From: Robert O'Callahan <robert@ocallahan.org> -Bug 579885. Part 4: Paint opaque surfaces using kPrivateCGCompositeCopy when possible. r=jrmuizel,a=blocking - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -122,16 +122,17 @@ static void (*CGContextClipToMaskPtr) (C - static void (*CGContextDrawTiledImagePtr) (CGContextRef, CGRect, CGImageRef) = NULL; - static unsigned int (*CGContextGetTypePtr) (CGContextRef) = NULL; - static void (*CGContextSetShouldAntialiasFontsPtr) (CGContextRef, bool) = NULL; - static bool (*CGContextGetShouldAntialiasFontsPtr) (CGContextRef) = NULL; - static bool (*CGContextGetShouldSmoothFontsPtr) (CGContextRef) = NULL; - static void (*CGContextSetAllowsFontSmoothingPtr) (CGContextRef, bool) = NULL; - static bool (*CGContextGetAllowsFontSmoothingPtr) (CGContextRef) = NULL; - static void (*CGContextReplacePathWithClipPathPtr) (CGContextRef) = NULL; -+static CGFloat (*CGContextGetAlphaPtr) (CGContextRef) = NULL; - - static SInt32 _cairo_quartz_osx_version = 0x0; - - static cairo_bool_t _cairo_quartz_symbol_lookup_done = FALSE; - - /* - * Utility functions - */ -@@ -157,16 +158,17 @@ static void quartz_ensure_symbols(void) - CGContextDrawTiledImagePtr = dlsym(RTLD_DEFAULT, "CGContextDrawTiledImage"); - CGContextGetTypePtr = dlsym(RTLD_DEFAULT, "CGContextGetType"); - CGContextSetShouldAntialiasFontsPtr = dlsym(RTLD_DEFAULT, "CGContextSetShouldAntialiasFonts"); - CGContextGetShouldAntialiasFontsPtr = dlsym(RTLD_DEFAULT, "CGContextGetShouldAntialiasFonts"); - CGContextGetShouldSmoothFontsPtr = dlsym(RTLD_DEFAULT, "CGContextGetShouldSmoothFonts"); - CGContextReplacePathWithClipPathPtr = dlsym(RTLD_DEFAULT, "CGContextReplacePathWithClipPath"); - CGContextGetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextGetAllowsFontSmoothing"); - CGContextSetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextSetAllowsFontSmoothing"); -+ CGContextGetAlphaPtr = dlsym(RTLD_DEFAULT, "CGContextGetAlpha"); - - if (Gestalt(gestaltSystemVersion, &_cairo_quartz_osx_version) != noErr) { - // assume 10.4 - _cairo_quartz_osx_version = 0x1040; - } - - _cairo_quartz_symbol_lookup_done = TRUE; - } -@@ -1698,16 +1700,28 @@ _cairo_quartz_setup_state (cairo_quartz_ - - if (source->type == CAIRO_PATTERN_TYPE_RADIAL) { - const cairo_radial_pattern_t *rpat = (const cairo_radial_pattern_t *)source; - _cairo_quartz_setup_radial_source (surface, rpat, extents, &state); - return state; - } - - if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { -+ if (op == CAIRO_OPERATOR_OVER && _cairo_pattern_is_opaque (source) && -+ CGContextGetAlphaPtr && -+ CGContextGetAlphaPtr (surface->cgContext) == 1.0) { -+ // Quartz won't touch pixels outside the bounds of the -+ // source surface, so we can just go ahead and use Copy here -+ // to accelerate things. -+ // Quartz won't necessarily be able to do this optimization internally; -+ // for CGLayer surfaces, we can know all the pixels are opaque -+ // (because it's CONTENT_COLOR), but Quartz won't know. -+ CGContextSetCompositeOperation (context, kPrivateCGCompositeCopy); -+ } -+ - const cairo_surface_pattern_t *spat = (const cairo_surface_pattern_t *) source; - _cairo_quartz_setup_surface_source (surface, spat, extents, &state); - return state; - } - - state.action = DO_UNSUPPORTED; - return state; - } diff --git a/gfx/cairo/quartz-refactor-surface-setup.patch b/gfx/cairo/quartz-refactor-surface-setup.patch deleted file mode 100644 index 22e2d0ee1..000000000 --- a/gfx/cairo/quartz-refactor-surface-setup.patch +++ /dev/null @@ -1,290 +0,0 @@ -From: Robert O'Callahan <robert@ocallahan.org> -Bug 593270. Part 1: Move surface setup code to a helper function. r=jrmuizel,a=joe - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1455,16 +1455,147 @@ _cairo_quartz_setup_radial_source (cairo - extend, extend); - - CGColorSpaceRelease(rgb); - CGFunctionRelease(gradFunc); - - state->action = DO_SHADING; - } - -+static void -+_cairo_quartz_setup_surface_source (cairo_quartz_surface_t *surface, -+ const cairo_surface_pattern_t *spat, -+ cairo_rectangle_int_t *extents, -+ cairo_quartz_drawing_state_t *state) -+{ -+ const cairo_pattern_t *source = &spat->base; -+ CGContextRef context = state->context; -+ -+ if (source->extend == CAIRO_EXTEND_NONE || -+ (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT)) -+ { -+ cairo_surface_t *pat_surf = spat->surface; -+ CGImageRef img; -+ cairo_matrix_t m = spat->base.matrix; -+ cairo_rectangle_int_t extents; -+ CGAffineTransform xform; -+ CGRect srcRect; -+ cairo_fixed_t fw, fh; -+ cairo_bool_t is_bounded; -+ cairo_status_t status; -+ -+ cairo_matrix_invert(&m); -+ _cairo_quartz_cairo_matrix_to_quartz (&m, &state->transform); -+ -+ /* Draw nonrepeating CGLayer surface using DO_LAYER */ -+ if (source->extend == CAIRO_EXTEND_NONE || -+ (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT)) -+ cairo_quartz_surface_t *quartz_surf = (cairo_quartz_surface_t *) pat_surf; -+ if (quartz_surf->cgLayer) { -+ state->imageRect = CGRectMake (0, 0, quartz_surf->extents.width, quartz_surf->extents.height); -+ state->layer = quartz_surf->cgLayer; -+ state->action = DO_LAYER; -+ return; -+ } -+ } -+ -+ status = _cairo_surface_to_cgimage (pat_surf, &img); -+ if (status) { -+ state->action = DO_UNSUPPORTED; -+ return; -+ } -+ if (img == NULL) { -+ state->action = DO_NOTHING; -+ return; -+ } -+ -+ /* XXXroc what is this for? */ -+ CGContextSetRGBFillColor (surface->cgContext, 0, 0, 0, 1); -+ -+ state->image = img; -+ -+ is_bounded = _cairo_surface_get_extents (pat_surf, &extents); -+ assert (is_bounded); -+ -+ if (source->extend == CAIRO_EXTEND_NONE) { -+ state->imageRect = CGRectMake (0, 0, extents.width, extents.height); -+ state->action = DO_IMAGE; -+ return; -+ } -+ -+ /* Quartz seems to tile images at pixel-aligned regions only -- this -+ * leads to seams if the image doesn't end up scaling to fill the -+ * space exactly. The CGPattern tiling approach doesn't have this -+ * problem. Check if we're going to fill up the space (within some -+ * epsilon), and if not, fall back to the CGPattern type. -+ */ -+ -+ xform = CGAffineTransformConcat (CGContextGetCTM (context), -+ state->transform); -+ -+ srcRect = CGRectMake (0, 0, extents.width, extents.height); -+ srcRect = CGRectApplyAffineTransform (srcRect, xform); -+ -+ fw = _cairo_fixed_from_double (srcRect.size.width); -+ fh = _cairo_fixed_from_double (srcRect.size.height); -+ -+ if ((fw & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON && -+ (fh & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON) -+ { -+ /* We're good to use DrawTiledImage, but ensure that -+ * the math works out */ -+ -+ srcRect.size.width = round(srcRect.size.width); -+ srcRect.size.height = round(srcRect.size.height); -+ -+ xform = CGAffineTransformInvert (xform); -+ -+ srcRect = CGRectApplyAffineTransform (srcRect, xform); -+ -+ state->imageRect = srcRect; -+ state->action = DO_TILED_IMAGE; -+ return; -+ } -+ -+ /* Fall through to generic SURFACE case */ -+ } -+ -+ CGFloat patternAlpha = 1.0f; -+ CGColorSpaceRef patternSpace; -+ CGPatternRef pattern; -+ cairo_int_status_t status; -+ -+ status = _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (surface, source, &pattern); -+ if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { -+ state->action = DO_NOTHING; -+ return; -+ } -+ if (status) { -+ state->action = DO_UNSUPPORTED; -+ return; -+ } -+ -+ patternSpace = CGColorSpaceCreatePattern (NULL); -+ CGContextSetFillColorSpace (context, patternSpace); -+ CGContextSetFillPattern (context, pattern, &patternAlpha); -+ CGContextSetStrokeColorSpace (context, patternSpace); -+ CGContextSetStrokePattern (context, pattern, &patternAlpha); -+ CGColorSpaceRelease (patternSpace); -+ -+ /* Quartz likes to munge the pattern phase (as yet unexplained -+ * why); force it to 0,0 as we've already baked in the correct -+ * pattern translation into the pattern matrix -+ */ -+ CGContextSetPatternPhase (context, CGSizeMake(0,0)); -+ -+ state->pattern = pattern; -+ state->action = DO_PATTERN; -+ return; -+} -+ - /** - * Call this before any operation that can modify the contents of a - * cairo_quartz_surface_t. - */ - static void - _cairo_quartz_surface_will_change (cairo_quartz_surface_t *surface) - { - if (surface->bitmapContextImage) { -@@ -1566,133 +1697,19 @@ _cairo_quartz_setup_state (cairo_quartz_ - } - - if (source->type == CAIRO_PATTERN_TYPE_RADIAL) { - const cairo_radial_pattern_t *rpat = (const cairo_radial_pattern_t *)source; - _cairo_quartz_setup_radial_source (surface, rpat, extents, &state); - return state; - } - -- if (source->type == CAIRO_PATTERN_TYPE_SURFACE && -- (source->extend == CAIRO_EXTEND_NONE || (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT))) -- { -+ if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { - const cairo_surface_pattern_t *spat = (const cairo_surface_pattern_t *) source; -- cairo_surface_t *pat_surf = spat->surface; -- CGImageRef img; -- cairo_matrix_t m = spat->base.matrix; -- cairo_rectangle_int_t extents; -- CGAffineTransform xform; -- CGRect srcRect; -- cairo_fixed_t fw, fh; -- cairo_bool_t is_bounded; -- -- cairo_matrix_invert(&m); -- _cairo_quartz_cairo_matrix_to_quartz (&m, &state.transform); -- -- if (cairo_surface_get_type (pat_surf) == CAIRO_SURFACE_TYPE_QUARTZ) { -- cairo_quartz_surface_t *quartz_surf = (cairo_quartz_surface_t *) pat_surf; -- if (quartz_surf->cgLayer && source->extend == CAIRO_EXTEND_NONE) { -- state.imageRect = CGRectMake (0, 0, quartz_surf->extents.width, quartz_surf->extents.height); -- state.layer = quartz_surf->cgLayer; -- state.action = DO_LAYER; -- return state; -- } -- } -- -- status = _cairo_surface_to_cgimage (pat_surf, &img); -- if (status) { -- state.action = DO_UNSUPPORTED; -- return state; -- } -- if (img == NULL) { -- state.action = DO_NOTHING; -- return state; -- } -- -- CGContextSetRGBFillColor (surface->cgContext, 0, 0, 0, 1); -- -- state.image = img; -- -- is_bounded = _cairo_surface_get_extents (pat_surf, &extents); -- assert (is_bounded); -- -- if (source->extend == CAIRO_EXTEND_NONE) { -- state.imageRect = CGRectMake (0, 0, extents.width, extents.height); -- state.action = DO_IMAGE; -- return state; -- } -- -- /* Quartz seems to tile images at pixel-aligned regions only -- this -- * leads to seams if the image doesn't end up scaling to fill the -- * space exactly. The CGPattern tiling approach doesn't have this -- * problem. Check if we're going to fill up the space (within some -- * epsilon), and if not, fall back to the CGPattern type. -- */ -- -- xform = CGAffineTransformConcat (CGContextGetCTM (context), -- state.transform); -- -- srcRect = CGRectMake (0, 0, extents.width, extents.height); -- srcRect = CGRectApplyAffineTransform (srcRect, xform); -- -- fw = _cairo_fixed_from_double (srcRect.size.width); -- fh = _cairo_fixed_from_double (srcRect.size.height); -- -- if ((fw & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON && -- (fh & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON) -- { -- /* We're good to use DrawTiledImage, but ensure that -- * the math works out */ -- -- srcRect.size.width = round(srcRect.size.width); -- srcRect.size.height = round(srcRect.size.height); -- -- xform = CGAffineTransformInvert (xform); -- -- srcRect = CGRectApplyAffineTransform (srcRect, xform); -- -- state.imageRect = srcRect; -- state.action = DO_TILED_IMAGE; -- return state; -- } -- -- /* Fall through to generic SURFACE case */ -- } -- -- if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { -- CGFloat patternAlpha = 1.0f; -- CGColorSpaceRef patternSpace; -- CGPatternRef pattern; -- cairo_int_status_t status; -- -- status = _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (surface, source, &pattern); -- if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { -- state.action = DO_NOTHING; -- return state; -- } -- if (status) { -- state.action = DO_UNSUPPORTED; -- return state; -- } -- -- patternSpace = CGColorSpaceCreatePattern (NULL); -- CGContextSetFillColorSpace (context, patternSpace); -- CGContextSetFillPattern (context, pattern, &patternAlpha); -- CGContextSetStrokeColorSpace (context, patternSpace); -- CGContextSetStrokePattern (context, pattern, &patternAlpha); -- CGColorSpaceRelease (patternSpace); -- -- /* Quartz likes to munge the pattern phase (as yet unexplained -- * why); force it to 0,0 as we've already baked in the correct -- * pattern translation into the pattern matrix -- */ -- CGContextSetPatternPhase (context, CGSizeMake(0,0)); -- -- state.pattern = pattern; -- state.action = DO_PATTERN; -+ _cairo_quartz_setup_surface_source (surface, spat, extents, &state); - return state; - } - - state.action = DO_UNSUPPORTED; - return state; - } - - /** diff --git a/gfx/cairo/quartz-remove-snapshot.patch b/gfx/cairo/quartz-remove-snapshot.patch deleted file mode 100644 index 5cc2cddb4..000000000 --- a/gfx/cairo/quartz-remove-snapshot.patch +++ /dev/null @@ -1,62 +0,0 @@ -changeset: 42958:dd0f1f0a96b3 -user: Robert O'Callahan <robert@ocallahan.org> -date: Tue Jun 01 11:33:05 2010 +1200 -summary: Bug 568189. Part 3: Remove snapshot backend function since it doesn't work and we may as well just fall back. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1993,33 +1993,16 @@ _cairo_quartz_surface_acquire_source_ima - if (status) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - - *image_extra = NULL; - - return CAIRO_STATUS_SUCCESS; - } - --static cairo_surface_t * --_cairo_quartz_surface_snapshot (void *abstract_surface) --{ -- cairo_int_status_t status; -- cairo_quartz_surface_t *surface = abstract_surface; -- cairo_image_surface_t *image; -- -- if (surface->imageSurfaceEquiv) -- return NULL; -- -- status = _cairo_quartz_get_image (surface, &image); -- if (unlikely (status)) -- return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); -- -- return &image->base; --} -- - static void - _cairo_quartz_surface_release_source_image (void *abstract_surface, - cairo_image_surface_t *image, - void *image_extra) - { - cairo_surface_destroy ((cairo_surface_t *) image); - } - -@@ -2916,17 +2899,17 @@ static const struct _cairo_surface_backe - _cairo_quartz_surface_stroke, - _cairo_quartz_surface_fill, - #if CAIRO_HAS_QUARTZ_FONT - _cairo_quartz_surface_show_glyphs, - #else - NULL, /* show_glyphs */ - #endif - -- _cairo_quartz_surface_snapshot, -+ NULL, /* snapshot */ - NULL, /* is_similar */ - NULL /* fill_stroke */ - }; - - cairo_quartz_surface_t * - _cairo_quartz_surface_create_internal (CGContextRef cgContext, - cairo_content_t content, - unsigned int width, - diff --git a/gfx/cairo/quartz-repeating-radial-gradients.patch b/gfx/cairo/quartz-repeating-radial-gradients.patch deleted file mode 100644 index 67fca30d0..000000000 --- a/gfx/cairo/quartz-repeating-radial-gradients.patch +++ /dev/null @@ -1,305 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1249558156 -43200 -# Node ID e564f3ab4ea6e3b5dd9c4e9e6042d3a84c229dde -# Parent 6ef9993a30bf2f983c9d64d7441d2e3b6b935de1 -Bug 508227. Don't fallback to Quartz for repeating radial gradients. r=jmuizelaar - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -708,20 +708,20 @@ CreateGradientFunction (const cairo_grad - 1, - input_value_range, - 4, - output_value_ranges, - &callbacks); - } - - static CGFunctionRef --CreateRepeatingGradientFunction (cairo_quartz_surface_t *surface, -- const cairo_gradient_pattern_t *gpat, -- CGPoint *start, CGPoint *end, -- CGAffineTransform matrix) -+CreateRepeatingLinearGradientFunction (cairo_quartz_surface_t *surface, -+ const cairo_gradient_pattern_t *gpat, -+ CGPoint *start, CGPoint *end, -+ CGAffineTransform matrix) - { - cairo_pattern_t *pat; - float input_value_range[2]; - float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f }; - CGFunctionCallbacks callbacks = { - 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy - }; - -@@ -791,16 +791,156 @@ CreateRepeatingGradientFunction (cairo_q - return CGFunctionCreate (pat, - 1, - input_value_range, - 4, - output_value_ranges, - &callbacks); - } - -+static void -+UpdateRadialParameterToIncludePoint(double *max_t, CGPoint *center, -+ double dr, double dx, double dy, -+ double x, double y) -+{ -+ /* Compute a parameter t such that a circle centered at -+ (center->x + dx*t, center->y + dy*t) with radius dr*t contains the -+ point (x,y). -+ -+ Let px = x - center->x, py = y - center->y. -+ Parameter values for which t is on the circle are given by -+ (px - dx*t)^2 + (py - dy*t)^2 = (t*dr)^2 -+ -+ Solving for t using the quadratic formula, and simplifying, we get -+ numerator = dx*px + dy*py +- -+ sqrt( dr^2*(px^2 + py^2) - (dx*py - dy*px)^2 ) -+ denominator = dx^2 + dy^2 - dr^2 -+ t = numerator/denominator -+ -+ In CreateRepeatingRadialGradientFunction we know the outer circle -+ contains the inner circle. Therefore the distance between the circle -+ centers plus the radius of the inner circle is less than the radius of -+ the outer circle. (This is checked in _cairo_quartz_setup_radial_source.) -+ Therefore -+ dx^2 + dy^2 < dr^2 -+ So the denominator is negative and the larger solution for t is given by -+ numerator = dx*px + dy*py - -+ sqrt( dr^2*(px^2 + py^2) - (dx*py - dy*px)^2 ) -+ denominator = dx^2 + dy^2 - dr^2 -+ t = numerator/denominator -+ dx^2 + dy^2 < dr^2 also ensures that the operand of sqrt is positive. -+ */ -+ double px = x - center->x; -+ double py = y - center->y; -+ double dx_py_minus_dy_px = dx*py - dy*px; -+ double numerator = dx*px + dy*py - -+ sqrt (dr*dr*(px*px + py*py) - dx_py_minus_dy_px*dx_py_minus_dy_px); -+ double denominator = dx*dx + dy*dy - dr*dr; -+ double t = numerator/denominator; -+ -+ if (*max_t < t) { -+ *max_t = t; -+ } -+} -+ -+/* This must only be called when one of the circles properly contains the other */ -+static CGFunctionRef -+CreateRepeatingRadialGradientFunction (cairo_quartz_surface_t *surface, -+ const cairo_gradient_pattern_t *gpat, -+ CGPoint *start, double *start_radius, -+ CGPoint *end, double *end_radius) -+{ -+ CGRect clip = CGContextGetClipBoundingBox (surface->cgContext); -+ CGAffineTransform transform; -+ cairo_pattern_t *pat; -+ float input_value_range[2]; -+ float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f }; -+ CGFunctionCallbacks callbacks = { -+ 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy -+ }; -+ CGPoint *inner; -+ double *inner_radius; -+ CGPoint *outer; -+ double *outer_radius; -+ /* minimum and maximum t-parameter values that will make our gradient -+ cover the clipBox */ -+ double t_min, t_max, t_temp; -+ /* outer minus inner */ -+ double dr, dx, dy; -+ -+ _cairo_quartz_cairo_matrix_to_quartz (&gpat->base.matrix, &transform); -+ /* clip is in cairo device coordinates; get it into cairo user space */ -+ clip = CGRectApplyAffineTransform (clip, transform); -+ -+ if (*start_radius < *end_radius) { -+ /* end circle contains start circle */ -+ inner = start; -+ outer = end; -+ inner_radius = start_radius; -+ outer_radius = end_radius; -+ } else { -+ /* start circle contains end circle */ -+ inner = end; -+ outer = start; -+ inner_radius = end_radius; -+ outer_radius = start_radius; -+ } -+ -+ dr = *outer_radius - *inner_radius; -+ dx = outer->x - inner->x; -+ dy = outer->y - inner->y; -+ -+ t_min = -(*inner_radius/dr); -+ inner->x += t_min*dx; -+ inner->y += t_min*dy; -+ *inner_radius = 0.; -+ -+ t_temp = 0.; -+ UpdateRadialParameterToIncludePoint(&t_temp, inner, dr, dx, dy, -+ clip.origin.x, clip.origin.y); -+ UpdateRadialParameterToIncludePoint(&t_temp, inner, dr, dx, dy, -+ clip.origin.x + clip.size.width, clip.origin.y); -+ UpdateRadialParameterToIncludePoint(&t_temp, inner, dr, dx, dy, -+ clip.origin.x + clip.size.width, clip.origin.y + clip.size.height); -+ UpdateRadialParameterToIncludePoint(&t_temp, inner, dr, dx, dy, -+ clip.origin.x, clip.origin.y + clip.size.height); -+ /* UpdateRadialParameterToIncludePoint assumes t=0 means radius 0. -+ But for the parameter values we use with Quartz, t_min means radius 0. -+ Also, add a small fudge factor to avoid rounding issues. Since the -+ circles are alway expanding and containing the earlier circles, this is -+ OK. */ -+ t_temp += 1e-6; -+ t_max = t_min + t_temp; -+ outer->x = inner->x + t_temp*dx; -+ outer->y = inner->y + t_temp*dy; -+ *outer_radius = t_temp*dr; -+ -+ /* set the input range for the function -- the function knows how to -+ map values outside of 0.0 .. 1.0 to that range for REPEAT/REFLECT. */ -+ if (*start_radius < *end_radius) { -+ input_value_range[0] = t_min; -+ input_value_range[1] = t_max; -+ } else { -+ input_value_range[0] = -t_max; -+ input_value_range[1] = -t_min; -+ } -+ -+ if (_cairo_pattern_create_copy (&pat, &gpat->base)) -+ /* quartz doesn't deal very well with malloc failing, so there's -+ * not much point in us trying either */ -+ return NULL; -+ -+ return CGFunctionCreate (pat, -+ 1, -+ input_value_range, -+ 4, -+ output_value_ranges, -+ &callbacks); -+} -+ - /* Obtain a CGImageRef from a #cairo_surface_t * */ - - static void - DataProviderReleaseCallback (void *info, const void *data, size_t size) - { - cairo_surface_t *surface = (cairo_surface_t *) info; - cairo_surface_destroy (surface); - } -@@ -1112,23 +1252,24 @@ _cairo_quartz_setup_linear_source (cairo - rgb = CGColorSpaceCreateDeviceRGB(); - - start = CGPointMake (_cairo_fixed_to_double (lpat->p1.x), - _cairo_fixed_to_double (lpat->p1.y)); - end = CGPointMake (_cairo_fixed_to_double (lpat->p2.x), - _cairo_fixed_to_double (lpat->p2.y)); - - if (abspat->extend == CAIRO_EXTEND_NONE || -- abspat->extend == CAIRO_EXTEND_PAD) -+ abspat->extend == CAIRO_EXTEND_PAD) - { - gradFunc = CreateGradientFunction (&lpat->base); - } else { -- gradFunc = CreateRepeatingGradientFunction (surface, -- &lpat->base, -- &start, &end, surface->sourceTransform); -+ gradFunc = CreateRepeatingLinearGradientFunction (surface, -+ &lpat->base, -+ &start, &end, -+ surface->sourceTransform); - } - - surface->sourceShading = CGShadingCreateAxial (rgb, - start, end, - gradFunc, - extend, extend); - - CGColorSpaceRelease(rgb); -@@ -1142,52 +1283,68 @@ _cairo_quartz_setup_radial_source (cairo - const cairo_radial_pattern_t *rpat) - { - const cairo_pattern_t *abspat = &rpat->base.base; - cairo_matrix_t mat; - CGPoint start, end; - CGFunctionRef gradFunc; - CGColorSpaceRef rgb; - bool extend = abspat->extend == CAIRO_EXTEND_PAD; -+ double c1x = _cairo_fixed_to_double (rpat->c1.x); -+ double c1y = _cairo_fixed_to_double (rpat->c1.y); -+ double c2x = _cairo_fixed_to_double (rpat->c2.x); -+ double c2y = _cairo_fixed_to_double (rpat->c2.y); -+ double r1 = _cairo_fixed_to_double (rpat->r1); -+ double r2 = _cairo_fixed_to_double (rpat->r2); -+ double dx = c1x - c2x; -+ double dy = c1y - c2y; -+ double centerDistance = sqrt (dx*dx + dy*dy); - - if (rpat->base.n_stops == 0) { - CGContextSetRGBStrokeColor (surface->cgContext, 0., 0., 0., 0.); - CGContextSetRGBFillColor (surface->cgContext, 0., 0., 0., 0.); - return DO_SOLID; - } - -- if (abspat->extend == CAIRO_EXTEND_REPEAT || -- abspat->extend == CAIRO_EXTEND_REFLECT) -- { -- /* I started trying to map these to Quartz, but it's much harder -- * then the linear case (I think it would involve doing multiple -- * Radial shadings). So, instead, let's just render an image -- * for pixman to draw the shading into, and use that. -+ if (r2 <= centerDistance + r1 + 1e-6 && /* circle 2 doesn't contain circle 1 */ -+ r1 <= centerDistance + r2 + 1e-6) { /* circle 1 doesn't contain circle 2 */ -+ /* Quartz handles cases where neither circle contains the other very -+ * differently from pixman. -+ * Whatever the correct behaviour is, let's at least have only pixman's -+ * implementation to worry about. -+ * Note that this also catches the cases where r1 == r2. - */ -- return _cairo_quartz_setup_fallback_source (surface, &rpat->base.base); -+ return _cairo_quartz_setup_fallback_source (surface, abspat); - } - - mat = abspat->matrix; - cairo_matrix_invert (&mat); - _cairo_quartz_cairo_matrix_to_quartz (&mat, &surface->sourceTransform); - - rgb = CGColorSpaceCreateDeviceRGB(); - -- start = CGPointMake (_cairo_fixed_to_double (rpat->c1.x), -- _cairo_fixed_to_double (rpat->c1.y)); -- end = CGPointMake (_cairo_fixed_to_double (rpat->c2.x), -- _cairo_fixed_to_double (rpat->c2.y)); -+ start = CGPointMake (c1x, c1y); -+ end = CGPointMake (c2x, c2y); - -- gradFunc = CreateGradientFunction (&rpat->base); -+ if (abspat->extend == CAIRO_EXTEND_NONE || -+ abspat->extend == CAIRO_EXTEND_PAD) -+ { -+ gradFunc = CreateGradientFunction (&rpat->base); -+ } else { -+ gradFunc = CreateRepeatingRadialGradientFunction (surface, -+ &rpat->base, -+ &start, &r1, -+ &end, &r2); -+ } - - surface->sourceShading = CGShadingCreateRadial (rgb, - start, -- _cairo_fixed_to_double (rpat->r1), -+ r1, - end, -- _cairo_fixed_to_double (rpat->r2), -+ r2, - gradFunc, - extend, extend); - - CGColorSpaceRelease(rgb); - CGFunctionRelease(gradFunc); - - return DO_SHADING; - } diff --git a/gfx/cairo/quartz-state.patch b/gfx/cairo/quartz-state.patch deleted file mode 100644 index d4c04f706..000000000 --- a/gfx/cairo/quartz-state.patch +++ /dev/null @@ -1,1190 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-quartz-private.h b/gfx/cairo/cairo/src/cairo-quartz-private.h ---- a/gfx/cairo/cairo/src/cairo-quartz-private.h -+++ b/gfx/cairo/cairo/src/cairo-quartz-private.h -@@ -50,30 +50,16 @@ typedef struct cairo_quartz_surface { - CGContextRef cgContext; - CGAffineTransform cgContextBaseCTM; - - void *imageData; - cairo_surface_t *imageSurfaceEquiv; - - cairo_surface_clipper_t clipper; - cairo_rectangle_int_t extents; -- -- /* These are stored while drawing operations are in place, set up -- * by quartz_setup_source() and quartz_finish_source() -- */ -- CGAffineTransform sourceTransform; -- -- CGImageRef sourceImage; -- cairo_surface_t *sourceImageSurface; -- CGRect sourceImageRect; -- -- CGShadingRef sourceShading; -- CGPatternRef sourcePattern; -- -- CGInterpolationQuality oldInterpolationQuality; - } cairo_quartz_surface_t; - - typedef struct cairo_quartz_image_surface { - cairo_surface_t base; - - cairo_rectangle_int_t extents; - - CGImageRef image; -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -1333,36 +1333,59 @@ _cairo_quartz_cairo_repeating_surface_pa - return CAIRO_STATUS_SUCCESS; - } - - typedef enum { - DO_SOLID, - DO_SHADING, - DO_PATTERN, - DO_IMAGE, -+ DO_TILED_IMAGE, - DO_UNSUPPORTED, -- DO_NOTHING, -- DO_TILED_IMAGE -+ DO_NOTHING - } cairo_quartz_action_t; - --static cairo_quartz_action_t -+/* State used during a drawing operation. */ -+typedef struct { -+ CGContextRef context; -+ cairo_quartz_action_t action; -+ -+ // Used with DO_SHADING, DO_IMAGE and DO_TILED_IMAGE -+ CGAffineTransform transform; -+ -+ // Used with DO_IMAGE and DO_TILED_IMAGE -+ CGImageRef image; -+ cairo_surface_t *imageSurface; -+ CGRect imageRect; -+ -+ // Used with DO_SHADING -+ CGShadingRef shading; -+ -+ // Used with DO_PATTERN -+ CGPatternRef pattern; -+} cairo_quartz_drawing_state_t; -+ -+static void - _cairo_quartz_setup_fallback_source (cairo_quartz_surface_t *surface, -- const cairo_pattern_t *source) -+ const cairo_pattern_t *source, -+ cairo_quartz_drawing_state_t *state) - { -- CGRect clipBox = CGContextGetClipBoundingBox (surface->cgContext); -+ CGRect clipBox = CGContextGetClipBoundingBox (state->context); - double x0, y0, w, h; - - cairo_surface_t *fallback; - CGImageRef img; - - cairo_status_t status; - - if (clipBox.size.width == 0.0f || -- clipBox.size.height == 0.0f) -- return DO_NOTHING; -+ clipBox.size.height == 0.0f) { -+ state->action = DO_NOTHING; -+ return; -+ } - - x0 = floor(clipBox.origin.x); - y0 = floor(clipBox.origin.y); - w = ceil(clipBox.origin.x + clipBox.size.width) - x0; - h = ceil(clipBox.origin.y + clipBox.size.height) - y0; - - /* Create a temporary the size of the clip surface, and position - * it so that the device origin coincides with the original surface */ -@@ -1396,73 +1419,79 @@ _cairo_quartz_setup_fallback_source (cai - &fallback->device_transform_inverse); - status = _cairo_surface_paint (fallback, - CAIRO_OPERATOR_SOURCE, - &pattern.base, NULL); - } - #endif - - status = _cairo_surface_to_cgimage (&surface->base, fallback, &img); -- if (status) -- return DO_UNSUPPORTED; -- if (img == NULL) -- return DO_NOTHING; -- -- surface->sourceImageRect = CGRectMake (0.0, 0.0, w, h); -- surface->sourceImage = img; -- surface->sourceImageSurface = fallback; -- surface->sourceTransform = CGAffineTransformMakeTranslation (x0, y0); -- -- return DO_IMAGE; -+ if (status) { -+ state->action = DO_UNSUPPORTED; -+ return; -+ } -+ if (img == NULL) { -+ state->action = DO_NOTHING; -+ return; -+ } -+ -+ state->imageRect = CGRectMake (0.0, 0.0, w, h); -+ state->image = img; -+ state->imageSurface = fallback; -+ state->transform = CGAffineTransformMakeTranslation (x0, y0); -+ state->action = DO_IMAGE; - } - - /* - Quartz does not support repeating radients. We handle repeating gradients - by manually extending the gradient and repeating color stops. We need to - minimize the number of repetitions since Quartz seems to sample our color - function across the entire range, even if part of that range is not needed - for the visible area of the gradient, and it samples with some fixed resolution, - so if the gradient range is too large it samples with very low resolution and - the gradient is very coarse. CreateRepeatingLinearGradientFunction and - CreateRepeatingRadialGradientFunction compute the number of repetitions needed - based on the extents of the object (the clip region cannot be used here since - we don't want the rasterization of the entire gradient to depend on the - clip region). - */ --static cairo_quartz_action_t -+static void - _cairo_quartz_setup_linear_source (cairo_quartz_surface_t *surface, - const cairo_linear_pattern_t *lpat, -- cairo_rectangle_int_t *extents) -+ cairo_rectangle_int_t *extents, -+ cairo_quartz_drawing_state_t *state) - { - const cairo_pattern_t *abspat = &lpat->base.base; - cairo_matrix_t mat; - CGPoint start, end; - CGFunctionRef gradFunc; - CGColorSpaceRef rgb; - bool extend = abspat->extend == CAIRO_EXTEND_PAD; - - if (lpat->base.n_stops == 0) { -- CGContextSetRGBStrokeColor (surface->cgContext, 0., 0., 0., 0.); -- CGContextSetRGBFillColor (surface->cgContext, 0., 0., 0., 0.); -- return DO_SOLID; -+ CGContextSetRGBStrokeColor (state->context, 0., 0., 0., 0.); -+ CGContextSetRGBFillColor (state->context, 0., 0., 0., 0.); -+ state->action = DO_SOLID; -+ return; - } - - if (lpat->p1.x == lpat->p2.x && - lpat->p1.y == lpat->p2.y) { - /* Quartz handles cases where the vector has no length very - * differently from pixman. - * Whatever the correct behaviour is, let's at least have only pixman's - * implementation to worry about. - */ -- return _cairo_quartz_setup_fallback_source (surface, abspat); -+ _cairo_quartz_setup_fallback_source (surface, abspat, state); -+ return; - } - - mat = abspat->matrix; - cairo_matrix_invert (&mat); -- _cairo_quartz_cairo_matrix_to_quartz (&mat, &surface->sourceTransform); -+ _cairo_quartz_cairo_matrix_to_quartz (&mat, &state->transform); - - rgb = CGColorSpaceCreateDeviceRGB(); - - start = CGPointMake (_cairo_fixed_to_double (lpat->p1.x), - _cairo_fixed_to_double (lpat->p1.y)); - end = CGPointMake (_cairo_fixed_to_double (lpat->p2.x), - _cairo_fixed_to_double (lpat->p2.y)); - -@@ -1472,31 +1501,32 @@ _cairo_quartz_setup_linear_source (cairo - gradFunc = CreateGradientFunction (&lpat->base); - } else { - gradFunc = CreateRepeatingLinearGradientFunction (surface, - &lpat->base, - &start, &end, - extents); - } - -- surface->sourceShading = CGShadingCreateAxial (rgb, -- start, end, -- gradFunc, -- extend, extend); -+ state->shading = CGShadingCreateAxial (rgb, -+ start, end, -+ gradFunc, -+ extend, extend); - - CGColorSpaceRelease(rgb); - CGFunctionRelease(gradFunc); - -- return DO_SHADING; -+ state->action = DO_SHADING; - } - --static cairo_quartz_action_t -+static void - _cairo_quartz_setup_radial_source (cairo_quartz_surface_t *surface, - const cairo_radial_pattern_t *rpat, -- cairo_rectangle_int_t *extents) -+ cairo_rectangle_int_t *extents, -+ cairo_quartz_drawing_state_t *state) - { - const cairo_pattern_t *abspat = &rpat->base.base; - cairo_matrix_t mat; - CGPoint start, end; - CGFunctionRef gradFunc; - CGColorSpaceRef rgb; - bool extend = abspat->extend == CAIRO_EXTEND_PAD; - double c1x = _cairo_fixed_to_double (rpat->c1.x); -@@ -1505,35 +1535,37 @@ _cairo_quartz_setup_radial_source (cairo - double c2y = _cairo_fixed_to_double (rpat->c2.y); - double r1 = _cairo_fixed_to_double (rpat->r1); - double r2 = _cairo_fixed_to_double (rpat->r2); - double dx = c1x - c2x; - double dy = c1y - c2y; - double centerDistance = sqrt (dx*dx + dy*dy); - - if (rpat->base.n_stops == 0) { -- CGContextSetRGBStrokeColor (surface->cgContext, 0., 0., 0., 0.); -- CGContextSetRGBFillColor (surface->cgContext, 0., 0., 0., 0.); -- return DO_SOLID; -+ CGContextSetRGBStrokeColor (state->context, 0., 0., 0., 0.); -+ CGContextSetRGBFillColor (state->context, 0., 0., 0., 0.); -+ state->action = DO_SOLID; -+ return; - } - - if (r2 <= centerDistance + r1 + 1e-6 && /* circle 2 doesn't contain circle 1 */ - r1 <= centerDistance + r2 + 1e-6) { /* circle 1 doesn't contain circle 2 */ - /* Quartz handles cases where neither circle contains the other very - * differently from pixman. - * Whatever the correct behaviour is, let's at least have only pixman's - * implementation to worry about. - * Note that this also catches the cases where r1 == r2. - */ -- return _cairo_quartz_setup_fallback_source (surface, abspat); -+ _cairo_quartz_setup_fallback_source (surface, abspat, state); -+ return; - } - - mat = abspat->matrix; - cairo_matrix_invert (&mat); -- _cairo_quartz_cairo_matrix_to_quartz (&mat, &surface->sourceTransform); -+ _cairo_quartz_cairo_matrix_to_quartz (&mat, &state->transform); - - rgb = CGColorSpaceCreateDeviceRGB(); - - start = CGPointMake (c1x, c1y); - end = CGPointMake (c2x, c2y); - - if (abspat->extend == CAIRO_EXTEND_NONE || - abspat->extend == CAIRO_EXTEND_PAD) -@@ -1542,111 +1574,146 @@ _cairo_quartz_setup_radial_source (cairo - } else { - gradFunc = CreateRepeatingRadialGradientFunction (surface, - &rpat->base, - &start, &r1, - &end, &r2, - extents); - } - -- surface->sourceShading = CGShadingCreateRadial (rgb, -- start, -- r1, -- end, -- r2, -- gradFunc, -- extend, extend); -+ state->shading = CGShadingCreateRadial (rgb, -+ start, -+ r1, -+ end, -+ r2, -+ gradFunc, -+ extend, extend); - - CGColorSpaceRelease(rgb); - CGFunctionRelease(gradFunc); - -- return DO_SHADING; -+ state->action = DO_SHADING; - } - --static cairo_quartz_action_t --_cairo_quartz_setup_source (cairo_quartz_surface_t *surface, -- const cairo_pattern_t *source, -- cairo_rectangle_int_t *extents) -+/** -+ * Sets up internal state to be used to draw the source mask, stored in -+ * cairo_quartz_state_t. Guarantees to call CGContextSaveGState on -+ * surface->cgContext. -+ */ -+static cairo_quartz_drawing_state_t -+_cairo_quartz_setup_state (cairo_quartz_surface_t *surface, -+ const cairo_pattern_t *source, -+ cairo_operator_t op, -+ cairo_rectangle_int_t *extents) - { -- assert (!(surface->sourceImage || surface->sourceShading || surface->sourcePattern)); -- -- surface->oldInterpolationQuality = CGContextGetInterpolationQuality (surface->cgContext); -- CGContextSetInterpolationQuality (surface->cgContext, _cairo_quartz_filter_to_quartz (source->filter)); -+ CGContextRef context = surface->cgContext; -+ cairo_quartz_drawing_state_t state; -+ cairo_status_t status; -+ -+ state.context = context; -+ state.image = NULL; -+ state.imageSurface = NULL; -+ state.shading = NULL; -+ state.pattern = NULL; -+ -+ // Save before we change the pattern, colorspace, etc. so that -+ // we can restore and make sure that quartz releases our -+ // pattern (which may be stack allocated) -+ CGContextSaveGState(context); -+ -+ CGContextSetInterpolationQuality (context, _cairo_quartz_filter_to_quartz (source->filter)); -+ -+ status = _cairo_quartz_surface_set_cairo_operator (surface, op); -+ if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { -+ state.action = DO_NOTHING; -+ return state; -+ } -+ if (status) { -+ state.action = DO_UNSUPPORTED; -+ return state; -+ } - - if (source->type == CAIRO_PATTERN_TYPE_SOLID) { - cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; - -- CGContextSetRGBStrokeColor (surface->cgContext, -+ CGContextSetRGBStrokeColor (context, - solid->color.red, - solid->color.green, - solid->color.blue, - solid->color.alpha); -- CGContextSetRGBFillColor (surface->cgContext, -+ CGContextSetRGBFillColor (context, - solid->color.red, - solid->color.green, - solid->color.blue, - solid->color.alpha); - -- return DO_SOLID; -+ state.action = DO_SOLID; -+ return state; - } - - if (source->type == CAIRO_PATTERN_TYPE_LINEAR) { - const cairo_linear_pattern_t *lpat = (const cairo_linear_pattern_t *)source; -- return _cairo_quartz_setup_linear_source (surface, lpat, extents); -+ _cairo_quartz_setup_linear_source (surface, lpat, extents, &state); -+ return state; - } - - if (source->type == CAIRO_PATTERN_TYPE_RADIAL) { - const cairo_radial_pattern_t *rpat = (const cairo_radial_pattern_t *)source; -- return _cairo_quartz_setup_radial_source (surface, rpat, extents); -+ _cairo_quartz_setup_radial_source (surface, rpat, extents, &state); -+ return state; - } - - if (source->type == CAIRO_PATTERN_TYPE_SURFACE && - (source->extend == CAIRO_EXTEND_NONE || (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT))) - { - const cairo_surface_pattern_t *spat = (const cairo_surface_pattern_t *) source; - cairo_surface_t *pat_surf = spat->surface; - CGImageRef img; - cairo_matrix_t m = spat->base.matrix; - cairo_rectangle_int_t extents; -- cairo_status_t status; - CGAffineTransform xform; - CGRect srcRect; - cairo_fixed_t fw, fh; - cairo_bool_t is_bounded; - - status = _cairo_surface_to_cgimage ((cairo_surface_t *) surface, pat_surf, &img); -- if (status) -- return DO_UNSUPPORTED; -- if (img == NULL) -- return DO_NOTHING; -+ if (status) { -+ state.action = DO_UNSUPPORTED; -+ return state; -+ } -+ if (img == NULL) { -+ state.action = DO_NOTHING; -+ return state; -+ } - - CGContextSetRGBFillColor (surface->cgContext, 0, 0, 0, 1); - -- surface->sourceImage = img; -+ state.image = img; - - cairo_matrix_invert(&m); -- _cairo_quartz_cairo_matrix_to_quartz (&m, &surface->sourceTransform); -+ _cairo_quartz_cairo_matrix_to_quartz (&m, &state.transform); - - is_bounded = _cairo_surface_get_extents (pat_surf, &extents); - assert (is_bounded); - - if (source->extend == CAIRO_EXTEND_NONE) { -- surface->sourceImageRect = CGRectMake (0, 0, extents.width, extents.height); -- return DO_IMAGE; -+ state.imageRect = CGRectMake (0, 0, extents.width, extents.height); -+ state.action = DO_IMAGE; -+ return state; - } - - /* Quartz seems to tile images at pixel-aligned regions only -- this - * leads to seams if the image doesn't end up scaling to fill the - * space exactly. The CGPattern tiling approach doesn't have this - * problem. Check if we're going to fill up the space (within some - * epsilon), and if not, fall back to the CGPattern type. - */ - -- xform = CGAffineTransformConcat (CGContextGetCTM (surface->cgContext), -- surface->sourceTransform); -+ xform = CGAffineTransformConcat (CGContextGetCTM (context), -+ state.transform); - - srcRect = CGRectMake (0, 0, extents.width, extents.height); - srcRect = CGRectApplyAffineTransform (srcRect, xform); - - fw = _cairo_fixed_from_double (srcRect.size.width); - fh = _cairo_fixed_from_double (srcRect.size.height); - - if ((fw & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON && -@@ -1657,111 +1724,109 @@ _cairo_quartz_setup_source (cairo_quartz - - srcRect.size.width = round(srcRect.size.width); - srcRect.size.height = round(srcRect.size.height); - - xform = CGAffineTransformInvert (xform); - - srcRect = CGRectApplyAffineTransform (srcRect, xform); - -- surface->sourceImageRect = srcRect; -- -- return DO_TILED_IMAGE; -+ state.imageRect = srcRect; -+ state.action = DO_TILED_IMAGE; -+ return state; - } - - /* Fall through to generic SURFACE case */ - } - - if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { - CGFloat patternAlpha = 1.0f; - CGColorSpaceRef patternSpace; - CGPatternRef pattern; - cairo_int_status_t status; - - status = _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (surface, source, &pattern); -- if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) -- return DO_NOTHING; -- if (status) -- return DO_UNSUPPORTED; -- -- // Save before we change the pattern, colorspace, etc. so that -- // we can restore and make sure that quartz releases our -- // pattern (which may be stack allocated) -- CGContextSaveGState(surface->cgContext); -- -- patternSpace = CGColorSpaceCreatePattern(NULL); -- CGContextSetFillColorSpace (surface->cgContext, patternSpace); -- CGContextSetFillPattern (surface->cgContext, pattern, &patternAlpha); -- CGContextSetStrokeColorSpace (surface->cgContext, patternSpace); -- CGContextSetStrokePattern (surface->cgContext, pattern, &patternAlpha); -+ if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { -+ state.action = DO_NOTHING; -+ return state; -+ } -+ if (status) { -+ state.action = DO_UNSUPPORTED; -+ return state; -+ } -+ -+ patternSpace = CGColorSpaceCreatePattern (NULL); -+ CGContextSetFillColorSpace (context, patternSpace); -+ CGContextSetFillPattern (context, pattern, &patternAlpha); -+ CGContextSetStrokeColorSpace (context, patternSpace); -+ CGContextSetStrokePattern (context, pattern, &patternAlpha); - CGColorSpaceRelease (patternSpace); - - /* Quartz likes to munge the pattern phase (as yet unexplained - * why); force it to 0,0 as we've already baked in the correct - * pattern translation into the pattern matrix - */ -- CGContextSetPatternPhase (surface->cgContext, CGSizeMake(0,0)); -- -- surface->sourcePattern = pattern; -- -- return DO_PATTERN; -+ CGContextSetPatternPhase (context, CGSizeMake(0,0)); -+ -+ state.pattern = pattern; -+ state.action = DO_PATTERN; -+ return state; - } - -- return DO_UNSUPPORTED; -+ state.action = DO_UNSUPPORTED; -+ return state; - } - -+/** -+ * 1) Tears down internal state used to draw the source -+ * 2) Does CGContextRestoreGState(state->context) -+ */ - static void --_cairo_quartz_teardown_source (cairo_quartz_surface_t *surface, -- const cairo_pattern_t *source) -+_cairo_quartz_teardown_state (cairo_quartz_drawing_state_t *state) - { -- CGContextSetInterpolationQuality (surface->cgContext, surface->oldInterpolationQuality); -- -- if (surface->sourceImage) { -- CGImageRelease(surface->sourceImage); -- surface->sourceImage = NULL; -- -- cairo_surface_destroy(surface->sourceImageSurface); -- surface->sourceImageSurface = NULL; -+ if (state->image) { -+ CGImageRelease(state->image); - } - -- if (surface->sourceShading) { -- CGShadingRelease(surface->sourceShading); -- surface->sourceShading = NULL; -+ if (state->imageSurface) { -+ cairo_surface_destroy(state->imageSurface); - } - -- if (surface->sourcePattern) { -- CGPatternRelease(surface->sourcePattern); -- // To tear down the pattern and colorspace -- CGContextRestoreGState(surface->cgContext); -- -- surface->sourcePattern = NULL; -+ if (state->shading) { -+ CGShadingRelease(state->shading); - } -+ -+ if (state->pattern) { -+ CGPatternRelease(state->pattern); -+ } -+ -+ CGContextRestoreGState(state->context); - } - - - static void --_cairo_quartz_draw_image (cairo_quartz_surface_t *surface, cairo_operator_t op, cairo_quartz_action_t action) -+_cairo_quartz_draw_image (cairo_quartz_drawing_state_t *state, cairo_operator_t op) - { -- assert (surface && surface->sourceImage && (action == DO_IMAGE || action == DO_TILED_IMAGE)); -- -- CGContextConcatCTM (surface->cgContext, surface->sourceTransform); -- CGContextTranslateCTM (surface->cgContext, 0, surface->sourceImageRect.size.height); -- CGContextScaleCTM (surface->cgContext, 1, -1); -- -- if (action == DO_IMAGE) { -- CGContextDrawImage (surface->cgContext, surface->sourceImageRect, surface->sourceImage); -- if (!_cairo_operator_bounded_by_source(op)) { -- CGContextBeginPath (surface->cgContext); -- CGContextAddRect (surface->cgContext, surface->sourceImageRect); -- CGContextAddRect (surface->cgContext, CGContextGetClipBoundingBox (surface->cgContext)); -- CGContextSetRGBFillColor (surface->cgContext, 0, 0, 0, 0); -- CGContextEOFillPath (surface->cgContext); -+ assert (state && state->image && (state->action == DO_IMAGE || state->action == DO_TILED_IMAGE)); -+ -+ CGContextConcatCTM (state->context, state->transform); -+ CGContextTranslateCTM (state->context, 0, state->imageRect.size.height); -+ CGContextScaleCTM (state->context, 1, -1); -+ -+ if (state->action == DO_IMAGE) { -+ CGContextDrawImage (state->context, state->imageRect, state->image); -+ if (!_cairo_operator_bounded_by_source (op)) { -+ CGContextBeginPath (state->context); -+ CGContextAddRect (state->context, state->imageRect); -+ CGContextAddRect (state->context, CGContextGetClipBoundingBox (state->context)); -+ CGContextSetRGBFillColor (state->context, 0, 0, 0, 0); -+ CGContextEOFillPath (state->context); - } - } else -- CGContextDrawTiledImagePtr (surface->cgContext, surface->sourceImageRect, surface->sourceImage); -+ CGContextDrawTiledImagePtr (state->context, state->imageRect, state->image); - } - - - /* - * get source/dest image implementation - */ - - /* Read the image from the surface's front buffer */ -@@ -2098,52 +2163,44 @@ _cairo_quartz_surface_get_extents (void - static cairo_int_status_t - _cairo_quartz_surface_paint (void *abstract_surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_clip_t *clip) - { - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; -- cairo_quartz_action_t action; -+ cairo_quartz_drawing_state_t state; - - ND((stderr, "%p _cairo_quartz_surface_paint op %d source->type %d\n", surface, op, source->type)); - - if (IS_EMPTY(surface)) - return CAIRO_STATUS_SUCCESS; - - rv = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (unlikely (rv)) - return rv; - -- rv = _cairo_quartz_surface_set_cairo_operator (surface, op); -- if (unlikely (rv)) -- return rv == CAIRO_INT_STATUS_NOTHING_TO_DO ? CAIRO_STATUS_SUCCESS : rv; -- -- action = _cairo_quartz_setup_source (surface, source, NULL); -- -- if (action == DO_SOLID || action == DO_PATTERN) { -- CGContextFillRect (surface->cgContext, CGRectMake(surface->extents.x, -- surface->extents.y, -- surface->extents.width, -- surface->extents.height)); -- } else if (action == DO_SHADING) { -- CGContextSaveGState (surface->cgContext); -- CGContextConcatCTM (surface->cgContext, surface->sourceTransform); -- CGContextDrawShading (surface->cgContext, surface->sourceShading); -- CGContextRestoreGState (surface->cgContext); -- } else if (action == DO_IMAGE || action == DO_TILED_IMAGE) { -- CGContextSaveGState (surface->cgContext); -- _cairo_quartz_draw_image (surface, op, action); -- CGContextRestoreGState (surface->cgContext); -- } else if (action != DO_NOTHING) { -+ state = _cairo_quartz_setup_state (surface, source, op, NULL); -+ -+ if (state.action == DO_SOLID || state.action == DO_PATTERN) { -+ CGContextFillRect (state.context, CGRectMake(surface->extents.x, -+ surface->extents.y, -+ surface->extents.width, -+ surface->extents.height)); -+ } else if (state.action == DO_SHADING) { -+ CGContextConcatCTM (state.context, state.transform); -+ CGContextDrawShading (state.context, state.shading); -+ } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE) { -+ _cairo_quartz_draw_image (&state, op); -+ } else if (state.action != DO_NOTHING) { - rv = CAIRO_INT_STATUS_UNSUPPORTED; - } - -- _cairo_quartz_teardown_source (surface, source); -+ _cairo_quartz_teardown_state (&state); - - ND((stderr, "-- paint\n")); - return rv; - } - - static cairo_bool_t - _cairo_quartz_source_needs_extents (const cairo_pattern_t *source) - { -@@ -2170,91 +2227,83 @@ _cairo_quartz_surface_fill (void *abstra - cairo_path_fixed_t *path, - cairo_fill_rule_t fill_rule, - double tolerance, - cairo_antialias_t antialias, - cairo_clip_t *clip) - { - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; -- cairo_quartz_action_t action; -+ cairo_quartz_drawing_state_t state; - quartz_stroke_t stroke; - CGPathRef path_for_unbounded = NULL; - - ND((stderr, "%p _cairo_quartz_surface_fill op %d source->type %d\n", surface, op, source->type)); - - if (IS_EMPTY(surface)) - return CAIRO_STATUS_SUCCESS; - - rv = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (unlikely (rv)) - return rv; - -- rv = _cairo_quartz_surface_set_cairo_operator (surface, op); -- if (unlikely (rv)) -- return rv == CAIRO_INT_STATUS_NOTHING_TO_DO ? CAIRO_STATUS_SUCCESS : rv; -- -- CGContextSaveGState (surface->cgContext); -- -- CGContextSetShouldAntialias (surface->cgContext, (antialias != CAIRO_ANTIALIAS_NONE)); -- - if (_cairo_quartz_source_needs_extents (source)) - { - /* We don't need precise extents since these are only used to - compute the number of gradient reptitions needed to cover the - object. */ - cairo_rectangle_int_t path_extents; - _cairo_path_fixed_approximate_fill_extents (path, &path_extents); -- action = _cairo_quartz_setup_source (surface, source, &path_extents); -+ state = _cairo_quartz_setup_state (surface, source, op, &path_extents); - } else { -- action = _cairo_quartz_setup_source (surface, source, NULL); -+ state = _cairo_quartz_setup_state (surface, source, op, NULL); - } - -- CGContextBeginPath (surface->cgContext); -- -- stroke.cgContext = surface->cgContext; -+ CGContextSetShouldAntialias (state.context, (antialias != CAIRO_ANTIALIAS_NONE)); -+ -+ CGContextBeginPath (state.context); -+ -+ stroke.cgContext = state.context; - stroke.ctm_inverse = NULL; - rv = _cairo_quartz_cairo_path_to_quartz_context (path, &stroke); - if (rv) - goto BAIL; - - if (!_cairo_operator_bounded_by_mask(op) && CGContextCopyPathPtr) -- path_for_unbounded = CGContextCopyPathPtr (surface->cgContext); -- -- if (action == DO_SOLID || action == DO_PATTERN) { -+ path_for_unbounded = CGContextCopyPathPtr (state.context); -+ -+ if (state.action == DO_SOLID || state.action == DO_PATTERN) { - if (fill_rule == CAIRO_FILL_RULE_WINDING) -- CGContextFillPath (surface->cgContext); -+ CGContextFillPath (state.context); - else -- CGContextEOFillPath (surface->cgContext); -- } else if (action == DO_SHADING) { -+ CGContextEOFillPath (state.context); -+ } else if (state.action == DO_SHADING) { - - // we have to clip and then paint the shading; we can't fill - // with the shading - if (fill_rule == CAIRO_FILL_RULE_WINDING) -- CGContextClip (surface->cgContext); -+ CGContextClip (state.context); - else -- CGContextEOClip (surface->cgContext); -- -- CGContextConcatCTM (surface->cgContext, surface->sourceTransform); -- CGContextDrawShading (surface->cgContext, surface->sourceShading); -- } else if (action == DO_IMAGE || action == DO_TILED_IMAGE) { -+ CGContextEOClip (state.context); -+ -+ CGContextConcatCTM (state.context, state.transform); -+ CGContextDrawShading (state.context, state.shading); -+ } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE) { - if (fill_rule == CAIRO_FILL_RULE_WINDING) -- CGContextClip (surface->cgContext); -+ CGContextClip (state.context); - else -- CGContextEOClip (surface->cgContext); -- -- _cairo_quartz_draw_image (surface, op, action); -- } else if (action != DO_NOTHING) { -+ CGContextEOClip (state.context); -+ -+ _cairo_quartz_draw_image (&state, op); -+ } else if (state.action != DO_NOTHING) { - rv = CAIRO_INT_STATUS_UNSUPPORTED; - } - - BAIL: -- _cairo_quartz_teardown_source (surface, source); -- -- CGContextRestoreGState (surface->cgContext); -+ _cairo_quartz_teardown_state (&state); - - if (path_for_unbounded) { - unbounded_op_data_t ub; - ub.op = UNBOUNDED_STROKE_FILL; - ub.u.stroke_fill.cgPath = path_for_unbounded; - ub.u.stroke_fill.fill_rule = fill_rule; - - _cairo_quartz_fixup_unbounded_operation (surface, &ub, antialias); -@@ -2274,44 +2323,49 @@ _cairo_quartz_surface_stroke (void *abst - cairo_matrix_t *ctm, - cairo_matrix_t *ctm_inverse, - double tolerance, - cairo_antialias_t antialias, - cairo_clip_t *clip) - { - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; -- cairo_quartz_action_t action; -+ cairo_quartz_drawing_state_t state; - quartz_stroke_t stroke; - CGAffineTransform origCTM, strokeTransform; - CGPathRef path_for_unbounded = NULL; - - ND((stderr, "%p _cairo_quartz_surface_stroke op %d source->type %d\n", surface, op, source->type)); - - if (IS_EMPTY(surface)) - return CAIRO_STATUS_SUCCESS; - - rv = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (unlikely (rv)) - return rv; - -- rv = _cairo_quartz_surface_set_cairo_operator (surface, op); -- if (unlikely (rv)) -- return rv == CAIRO_INT_STATUS_NOTHING_TO_DO ? CAIRO_STATUS_SUCCESS : rv; -+ if (_cairo_quartz_source_needs_extents (source)) -+ { -+ cairo_rectangle_int_t path_extents; -+ _cairo_path_fixed_approximate_stroke_extents (path, style, ctm, &path_extents); -+ state = _cairo_quartz_setup_state (surface, source, op, &path_extents); -+ } else { -+ state = _cairo_quartz_setup_state (surface, source, op, NULL); -+ } - - // Turning antialiasing off used to cause misrendering with - // single-pixel lines (e.g. 20,10.5 -> 21,10.5 end up being rendered as 2 pixels). - // That's been since fixed in at least 10.5, and in the latest 10.4 dot releases. -- CGContextSetShouldAntialias (surface->cgContext, (antialias != CAIRO_ANTIALIAS_NONE)); -- CGContextSetLineWidth (surface->cgContext, style->line_width); -- CGContextSetLineCap (surface->cgContext, _cairo_quartz_cairo_line_cap_to_quartz (style->line_cap)); -- CGContextSetLineJoin (surface->cgContext, _cairo_quartz_cairo_line_join_to_quartz (style->line_join)); -- CGContextSetMiterLimit (surface->cgContext, style->miter_limit); -- -- origCTM = CGContextGetCTM (surface->cgContext); -+ CGContextSetShouldAntialias (state.context, (antialias != CAIRO_ANTIALIAS_NONE)); -+ CGContextSetLineWidth (state.context, style->line_width); -+ CGContextSetLineCap (state.context, _cairo_quartz_cairo_line_cap_to_quartz (style->line_cap)); -+ CGContextSetLineJoin (state.context, _cairo_quartz_cairo_line_join_to_quartz (style->line_join)); -+ CGContextSetMiterLimit (state.context, style->miter_limit); -+ -+ origCTM = CGContextGetCTM (state.context); - - if (style->dash && style->num_dashes) { - #define STATIC_DASH 32 - CGFloat sdash[STATIC_DASH]; - CGFloat *fdash = sdash; - double offset = style->dash_offset; - unsigned int max_dashes = style->num_dashes; - unsigned int k; -@@ -2330,90 +2384,75 @@ _cairo_quartz_surface_stroke (void *abst - if (max_dashes > STATIC_DASH) - fdash = _cairo_malloc_ab (max_dashes, sizeof (CGFloat)); - if (fdash == NULL) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - - for (k = 0; k < max_dashes; k++) - fdash[k] = (CGFloat) style->dash[k % style->num_dashes]; - } -- CGContextSetLineDash (surface->cgContext, offset, fdash, max_dashes); -+ CGContextSetLineDash (state.context, offset, fdash, max_dashes); - if (fdash != sdash) - free (fdash); - } else -- CGContextSetLineDash (surface->cgContext, 0, NULL, 0); -- -- CGContextSaveGState (surface->cgContext); -- -- -- if (_cairo_quartz_source_needs_extents (source)) -- { -- cairo_rectangle_int_t path_extents; -- _cairo_path_fixed_approximate_stroke_extents (path, style, ctm, &path_extents); -- action = _cairo_quartz_setup_source (surface, source, &path_extents); -- } else { -- action = _cairo_quartz_setup_source (surface, source, NULL); -- } -+ CGContextSetLineDash (state.context, 0, NULL, 0); - - _cairo_quartz_cairo_matrix_to_quartz (ctm, &strokeTransform); -- CGContextConcatCTM (surface->cgContext, strokeTransform); -- -- CGContextBeginPath (surface->cgContext); -- -- stroke.cgContext = surface->cgContext; -+ CGContextConcatCTM (state.context, strokeTransform); -+ -+ CGContextBeginPath (state.context); -+ -+ stroke.cgContext = state.context; - stroke.ctm_inverse = ctm_inverse; - rv = _cairo_quartz_cairo_path_to_quartz_context (path, &stroke); - if (rv) - goto BAIL; - - if (!_cairo_operator_bounded_by_mask (op) && CGContextCopyPathPtr) -- path_for_unbounded = CGContextCopyPathPtr (surface->cgContext); -- -- if (action == DO_SOLID || action == DO_PATTERN) { -- CGContextStrokePath (surface->cgContext); -- } else if (action == DO_IMAGE || action == DO_TILED_IMAGE) { -- CGContextReplacePathWithStrokedPath (surface->cgContext); -- CGContextClip (surface->cgContext); -- -- CGContextSetCTM (surface->cgContext, origCTM); -- _cairo_quartz_draw_image (surface, op, action); -- } else if (action == DO_SHADING) { -- CGContextReplacePathWithStrokedPath (surface->cgContext); -- CGContextClip (surface->cgContext); -- -- CGContextSetCTM (surface->cgContext, origCTM); -- -- CGContextConcatCTM (surface->cgContext, surface->sourceTransform); -- CGContextDrawShading (surface->cgContext, surface->sourceShading); -- } else if (action != DO_NOTHING) { -+ path_for_unbounded = CGContextCopyPathPtr (state.context); -+ -+ if (state.action == DO_SOLID || state.action == DO_PATTERN) { -+ CGContextStrokePath (state.context); -+ } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE) { -+ CGContextReplacePathWithStrokedPath (state.context); -+ CGContextClip (state.context); -+ -+ CGContextSetCTM (state.context, origCTM); -+ _cairo_quartz_draw_image (&state, op); -+ } else if (state.action == DO_SHADING) { -+ CGContextReplacePathWithStrokedPath (state.context); -+ CGContextClip (state.context); -+ -+ CGContextSetCTM (state.context, origCTM); -+ -+ CGContextConcatCTM (state.context, state.transform); -+ CGContextDrawShading (state.context, state.shading); -+ } else if (state.action != DO_NOTHING) { - rv = CAIRO_INT_STATUS_UNSUPPORTED; -+ goto BAIL; - } - -+ if (path_for_unbounded) { -+ CGContextSetCTM (state.context, origCTM); -+ CGContextConcatCTM (state.context, strokeTransform); -+ -+ CGContextBeginPath (state.context); -+ CGContextAddPath (state.context, path_for_unbounded); -+ CGPathRelease (path_for_unbounded); -+ -+ CGContextReplacePathWithStrokedPath (state.context); -+ -+ CGContextAddRect (state.context, CGContextGetClipBoundingBox (state.context)); -+ -+ CGContextSetRGBFillColor (state.context, 0., 0., 0., 0.); -+ CGContextEOFillPath (state.context); -+ } -+ - BAIL: -- _cairo_quartz_teardown_source (surface, source); -- -- CGContextRestoreGState (surface->cgContext); -- -- if (path_for_unbounded) { -- CGContextSaveGState (surface->cgContext); -- CGContextConcatCTM (surface->cgContext, strokeTransform); -- -- CGContextBeginPath (surface->cgContext); -- CGContextAddPath (surface->cgContext, path_for_unbounded); -- CGPathRelease (path_for_unbounded); -- -- CGContextReplacePathWithStrokedPath (surface->cgContext); -- -- CGContextAddRect (surface->cgContext, CGContextGetClipBoundingBox (surface->cgContext)); -- -- CGContextSetRGBFillColor (surface->cgContext, 0., 0., 0., 0.); -- CGContextEOFillPath (surface->cgContext); -- -- CGContextRestoreGState (surface->cgContext); -- } -+ _cairo_quartz_teardown_state (&state); - - ND((stderr, "-- stroke\n")); - return rv; - } - - #if CAIRO_HAS_QUARTZ_FONT - static cairo_int_status_t - _cairo_quartz_surface_show_glyphs (void *abstract_surface, -@@ -2429,17 +2468,17 @@ _cairo_quartz_surface_show_glyphs (void - #define STATIC_BUF_SIZE 64 - CGGlyph glyphs_static[STATIC_BUF_SIZE]; - CGSize cg_advances_static[STATIC_BUF_SIZE]; - CGGlyph *cg_glyphs = &glyphs_static[0]; - CGSize *cg_advances = &cg_advances_static[0]; - - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; -- cairo_quartz_action_t action; -+ cairo_quartz_drawing_state_t state; - float xprev, yprev; - int i; - CGFontRef cgfref = NULL; - - cairo_bool_t isClipping = FALSE; - cairo_bool_t didForceFontSmoothing = FALSE; - - if (IS_EMPTY(surface)) -@@ -2450,65 +2489,59 @@ _cairo_quartz_surface_show_glyphs (void - - if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_QUARTZ) - return CAIRO_INT_STATUS_UNSUPPORTED; - - rv = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (unlikely (rv)) - return rv; - -- rv = _cairo_quartz_surface_set_cairo_operator (surface, op); -- if (unlikely (rv)) -- return rv == CAIRO_INT_STATUS_NOTHING_TO_DO ? CAIRO_STATUS_SUCCESS : rv; -- -- CGContextSaveGState (surface->cgContext); -- - if (_cairo_quartz_source_needs_extents (source)) - { - cairo_rectangle_int_t glyph_extents; - _cairo_scaled_font_glyph_device_extents (scaled_font, glyphs, num_glyphs, - &glyph_extents, NULL); -- action = _cairo_quartz_setup_source (surface, source, &glyph_extents); -+ state = _cairo_quartz_setup_state (surface, source, op, &glyph_extents); - } else { -- action = _cairo_quartz_setup_source (surface, source, NULL); -+ state = _cairo_quartz_setup_state (surface, source, op, NULL); - } - -- if (action == DO_SOLID || action == DO_PATTERN) { -- CGContextSetTextDrawingMode (surface->cgContext, kCGTextFill); -- } else if (action == DO_IMAGE || action == DO_TILED_IMAGE || action == DO_SHADING) { -- CGContextSetTextDrawingMode (surface->cgContext, kCGTextClip); -+ if (state.action == DO_SOLID || state.action == DO_PATTERN) { -+ CGContextSetTextDrawingMode (state.context, kCGTextFill); -+ } else if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE || state.action == DO_SHADING) { -+ CGContextSetTextDrawingMode (state.context, kCGTextClip); - isClipping = TRUE; - } else { -- if (action != DO_NOTHING) -+ if (state.action != DO_NOTHING) - rv = CAIRO_INT_STATUS_UNSUPPORTED; - goto BAIL; - } - - /* this doesn't addref */ - cgfref = _cairo_quartz_scaled_font_get_cg_font_ref (scaled_font); -- CGContextSetFont (surface->cgContext, cgfref); -- CGContextSetFontSize (surface->cgContext, 1.0); -+ CGContextSetFont (state.context, cgfref); -+ CGContextSetFontSize (state.context, 1.0); - - switch (scaled_font->options.antialias) { - case CAIRO_ANTIALIAS_SUBPIXEL: -- CGContextSetShouldAntialias (surface->cgContext, TRUE); -- CGContextSetShouldSmoothFonts (surface->cgContext, TRUE); -+ CGContextSetShouldAntialias (state.context, TRUE); -+ CGContextSetShouldSmoothFonts (state.context, TRUE); - if (CGContextSetAllowsFontSmoothingPtr && -- !CGContextGetAllowsFontSmoothingPtr (surface->cgContext)) -+ !CGContextGetAllowsFontSmoothingPtr (state.context)) - { - didForceFontSmoothing = TRUE; -- CGContextSetAllowsFontSmoothingPtr (surface->cgContext, TRUE); -+ CGContextSetAllowsFontSmoothingPtr (state.context, TRUE); - } - break; - case CAIRO_ANTIALIAS_NONE: -- CGContextSetShouldAntialias (surface->cgContext, FALSE); -+ CGContextSetShouldAntialias (state.context, FALSE); - break; - case CAIRO_ANTIALIAS_GRAY: -- CGContextSetShouldAntialias (surface->cgContext, TRUE); -- CGContextSetShouldSmoothFonts (surface->cgContext, FALSE); -+ CGContextSetShouldAntialias (state.context, TRUE); -+ CGContextSetShouldSmoothFonts (state.context, FALSE); - break; - case CAIRO_ANTIALIAS_DEFAULT: - /* Don't do anything */ - break; - } - - if (num_glyphs > STATIC_BUF_SIZE) { - cg_glyphs = (CGGlyph*) _cairo_malloc_ab (num_glyphs, sizeof(CGGlyph)); -@@ -2532,17 +2565,17 @@ _cairo_quartz_surface_show_glyphs (void - textTransform = CGAffineTransformScale (textTransform, 1.0, -1.0); - textTransform = CGAffineTransformConcat (CGAffineTransformMake(scaled_font->ctm.xx, - -scaled_font->ctm.yx, - -scaled_font->ctm.xy, - scaled_font->ctm.yy, - 0., 0.), - textTransform); - -- CGContextSetTextMatrix (surface->cgContext, textTransform); -+ CGContextSetTextMatrix (state.context, textTransform); - - /* Convert our glyph positions to glyph advances. We need n-1 advances, - * since the advance at index 0 is applied after glyph 0. */ - xprev = glyphs[0].x; - yprev = glyphs[0].y; - - cg_glyphs[0] = glyphs[0].index; - -@@ -2569,40 +2602,38 @@ _cairo_quartz_surface_show_glyphs (void - - #if 0 - for (i = 0; i < num_glyphs; i++) { - ND((stderr, "[%d: %d %f,%f]\n", i, cg_glyphs[i], cg_advances[i].width, cg_advances[i].height)); - } - #endif - - /* Translate to the first glyph's position before drawing */ -- ctm = CGContextGetCTM (surface->cgContext); -- CGContextTranslateCTM (surface->cgContext, glyphs[0].x, glyphs[0].y); -- -- CGContextShowGlyphsWithAdvances (surface->cgContext, -+ ctm = CGContextGetCTM (state.context); -+ CGContextTranslateCTM (state.context, glyphs[0].x, glyphs[0].y); -+ -+ CGContextShowGlyphsWithAdvances (state.context, - cg_glyphs, - cg_advances, - num_glyphs); - -- CGContextSetCTM (surface->cgContext, ctm); -- -- if (action == DO_IMAGE || action == DO_TILED_IMAGE) { -- _cairo_quartz_draw_image (surface, op, action); -- } else if (action == DO_SHADING) { -- CGContextConcatCTM (surface->cgContext, surface->sourceTransform); -- CGContextDrawShading (surface->cgContext, surface->sourceShading); -+ CGContextSetCTM (state.context, ctm); -+ -+ if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE) { -+ _cairo_quartz_draw_image (&state, op); -+ } else if (state.action == DO_SHADING) { -+ CGContextConcatCTM (state.context, state.transform); -+ CGContextDrawShading (state.context, state.shading); - } - - BAIL: -- _cairo_quartz_teardown_source (surface, source); -- - if (didForceFontSmoothing) -- CGContextSetAllowsFontSmoothingPtr (surface->cgContext, FALSE); -- -- CGContextRestoreGState (surface->cgContext); -+ CGContextSetAllowsFontSmoothingPtr (state.context, FALSE); -+ -+ _cairo_quartz_teardown_state (&state); - - if (rv == CAIRO_STATUS_SUCCESS && - cgfref && - !_cairo_operator_bounded_by_mask (op)) - { - unbounded_op_data_t ub; - ub.op = UNBOUNDED_SHOW_GLYPHS; - diff --git a/gfx/cairo/quartz-support-color-emoji-font.patch b/gfx/cairo/quartz-support-color-emoji-font.patch deleted file mode 100644 index 5fb88b271..000000000 --- a/gfx/cairo/quartz-support-color-emoji-font.patch +++ /dev/null @@ -1,432 +0,0 @@ -From: Jonathan Kew <jkew@mozilla.com> -bug 715798 pt 1 - support Apple Color Emoji font in cairo-quartz backend. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-quartz-font.c b/gfx/cairo/cairo/src/cairo-quartz-font.c ---- a/gfx/cairo/cairo/src/cairo-quartz-font.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-font.c -@@ -85,16 +85,20 @@ typedef struct { - int descent; - int leading; - } quartz_CGFontMetrics; - static quartz_CGFontMetrics* (*CGFontGetHMetricsPtr) (CGFontRef fontRef) = NULL; - static int (*CGFontGetAscentPtr) (CGFontRef fontRef) = NULL; - static int (*CGFontGetDescentPtr) (CGFontRef fontRef) = NULL; - static int (*CGFontGetLeadingPtr) (CGFontRef fontRef) = NULL; - -+/* CTFontCreateWithGraphicsFont is not public until 10.5. */ -+typedef const struct __CTFontDescriptor *CTFontDescriptorRef; -+static CTFontRef (*CTFontCreateWithGraphicsFontPtr) (CGFontRef, CGFloat, const CGAffineTransform *, CTFontDescriptorRef) = NULL; -+ - static cairo_bool_t _cairo_quartz_font_symbol_lookup_done = FALSE; - static cairo_bool_t _cairo_quartz_font_symbols_present = FALSE; - - static void - quartz_font_ensure_symbols(void) - { - if (_cairo_quartz_font_symbol_lookup_done) - return; -@@ -122,16 +126,18 @@ quartz_font_ensure_symbols(void) - CGFontGetHMetricsPtr = dlsym(RTLD_DEFAULT, "CGFontGetHMetrics"); - CGFontGetAscentPtr = dlsym(RTLD_DEFAULT, "CGFontGetAscent"); - CGFontGetDescentPtr = dlsym(RTLD_DEFAULT, "CGFontGetDescent"); - CGFontGetLeadingPtr = dlsym(RTLD_DEFAULT, "CGFontGetLeading"); - - CGContextGetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextGetAllowsFontSmoothing"); - CGContextSetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextSetAllowsFontSmoothing"); - -+ CTFontCreateWithGraphicsFontPtr = dlsym(RTLD_DEFAULT, "CTFontCreateWithGraphicsFont"); -+ - if ((CGFontCreateWithFontNamePtr || CGFontCreateWithNamePtr) && - CGFontGetGlyphBBoxesPtr && - CGFontGetGlyphsForUnicharsPtr && - CGFontGetUnitsPerEmPtr && - CGFontGetGlyphAdvancesPtr && - CGFontGetGlyphPathPtr && - (CGFontGetHMetricsPtr || (CGFontGetAscentPtr && CGFontGetDescentPtr && CGFontGetLeadingPtr))) - _cairo_quartz_font_symbols_present = TRUE; -@@ -145,16 +151,17 @@ typedef struct _cairo_quartz_scaled_font - struct _cairo_quartz_scaled_font { - cairo_scaled_font_t base; - }; - - struct _cairo_quartz_font_face { - cairo_font_face_t base; - - CGFontRef cgFont; -+ CTFontRef ctFont; - }; - - /* - * font face backend - */ - - static cairo_status_t - _cairo_quartz_font_face_create_for_toy (cairo_toy_font_face_t *toy_face, -@@ -229,16 +236,20 @@ static cairo_status_t - return CAIRO_STATUS_SUCCESS; - } - - static void - _cairo_quartz_font_face_destroy (void *abstract_face) - { - cairo_quartz_font_face_t *font_face = (cairo_quartz_font_face_t*) abstract_face; - -+ if (font_face->ctFont) { -+ CFRelease (font_face->ctFont); -+ } -+ - CGFontRelease (font_face->cgFont); - } - - static const cairo_scaled_font_backend_t _cairo_quartz_scaled_font_backend; - - static cairo_status_t - _cairo_quartz_font_face_scaled_font_create (void *abstract_face, - const cairo_matrix_t *font_matrix, -@@ -353,16 +364,22 @@ cairo_quartz_font_face_create_for_cgfont - if (!font_face) { - cairo_status_t ignore_status; - ignore_status = _cairo_error (CAIRO_STATUS_NO_MEMORY); - return (cairo_font_face_t *)&_cairo_font_face_nil; - } - - font_face->cgFont = CGFontRetain (font); - -+ if (CTFontCreateWithGraphicsFontPtr) { -+ font_face->ctFont = CTFontCreateWithGraphicsFontPtr (font, 1.0, NULL, NULL); -+ } else { -+ font_face->ctFont = NULL; -+ } -+ - _cairo_font_face_init (&font_face->base, &_cairo_quartz_font_face_backend); - - return &font_face->base; - } - - /* - * scaled font backend - */ -@@ -772,16 +789,24 @@ static const cairo_scaled_font_backend_t - CGFontRef - _cairo_quartz_scaled_font_get_cg_font_ref (cairo_scaled_font_t *abstract_font) - { - cairo_quartz_font_face_t *ffont = _cairo_quartz_scaled_to_face(abstract_font); - - return ffont->cgFont; - } - -+CTFontRef -+_cairo_quartz_scaled_font_get_ct_font_ref (cairo_scaled_font_t *abstract_font) -+{ -+ cairo_quartz_font_face_t *ffont = _cairo_quartz_scaled_to_face(abstract_font); -+ -+ return ffont->ctFont; -+} -+ - #ifndef __LP64__ - /* - * compat with old ATSUI backend - */ - - /** - * cairo_quartz_font_face_create_for_atsu_font_id - * @font_id: an ATSUFontID for the font. -diff --git a/gfx/cairo/cairo/src/cairo-quartz-private.h b/gfx/cairo/cairo/src/cairo-quartz-private.h ---- a/gfx/cairo/cairo/src/cairo-quartz-private.h -+++ b/gfx/cairo/cairo/src/cairo-quartz-private.h -@@ -45,16 +45,19 @@ - #include "cairo-surface-clipper-private.h" - - #ifdef CGFLOAT_DEFINED - typedef CGFloat cairo_quartz_float_t; - #else - typedef float cairo_quartz_float_t; - #endif - -+/* define CTFontRef for pre-10.5 SDKs */ -+typedef const struct __CTFont *CTFontRef; -+ - typedef struct cairo_quartz_surface { - cairo_surface_t base; - - CGContextRef cgContext; - CGAffineTransform cgContextBaseCTM; - - void *imageData; - cairo_surface_t *imageSurfaceEquiv; -@@ -99,15 +102,18 @@ CGImageRef - cairo_bool_t interpolate, - CGColorSpaceRef colorSpaceOverride, - CGDataProviderReleaseDataCallback releaseCallback, - void *releaseInfo); - - CGFontRef - _cairo_quartz_scaled_font_get_cg_font_ref (cairo_scaled_font_t *sfont); - -+CTFontRef -+_cairo_quartz_scaled_font_get_ct_font_ref (cairo_scaled_font_t *sfont); -+ - #else - - # error Cairo was not compiled with support for the quartz backend - - #endif /* CAIRO_HAS_QUARTZ_SURFACE */ - - #endif /* CAIRO_QUARTZ_PRIVATE_H */ -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -130,16 +130,19 @@ static void (*CGContextClipToMaskPtr) (C - static void (*CGContextDrawTiledImagePtr) (CGContextRef, CGRect, CGImageRef) = NULL; - static unsigned int (*CGContextGetTypePtr) (CGContextRef) = NULL; - static void (*CGContextSetShouldAntialiasFontsPtr) (CGContextRef, bool) = NULL; - static void (*CGContextSetAllowsFontSmoothingPtr) (CGContextRef, bool) = NULL; - static bool (*CGContextGetAllowsFontSmoothingPtr) (CGContextRef) = NULL; - static CGPathRef (*CGContextCopyPathPtr) (CGContextRef) = NULL; - static CGFloat (*CGContextGetAlphaPtr) (CGContextRef) = NULL; - -+/* CTFontDrawGlyphs is not available until 10.7 */ -+static void (*CTFontDrawGlyphsPtr) (CTFontRef, const CGGlyph[], const CGPoint[], size_t, CGContextRef) = NULL; -+ - static SInt32 _cairo_quartz_osx_version = 0x0; - - static cairo_bool_t _cairo_quartz_symbol_lookup_done = FALSE; - - /* - * Utility functions - */ - -@@ -167,16 +170,18 @@ static void quartz_ensure_symbols(void) - CGContextDrawTiledImagePtr = dlsym(RTLD_DEFAULT, "CGContextDrawTiledImage"); - CGContextGetTypePtr = dlsym(RTLD_DEFAULT, "CGContextGetType"); - CGContextSetShouldAntialiasFontsPtr = dlsym(RTLD_DEFAULT, "CGContextSetShouldAntialiasFonts"); - CGContextCopyPathPtr = dlsym(RTLD_DEFAULT, "CGContextCopyPath"); - CGContextGetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextGetAllowsFontSmoothing"); - CGContextSetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextSetAllowsFontSmoothing"); - CGContextGetAlphaPtr = dlsym(RTLD_DEFAULT, "CGContextGetAlpha"); - -+ CTFontDrawGlyphsPtr = dlsym(RTLD_DEFAULT, "CTFontDrawGlyphs"); -+ - if (Gestalt(gestaltSystemVersion, &_cairo_quartz_osx_version) != noErr) { - // assume 10.5 - _cairo_quartz_osx_version = 0x1050; - } - - _cairo_quartz_symbol_lookup_done = TRUE; - } - -@@ -605,20 +610,23 @@ static inline void - dst->d = src->yy; - dst->tx = src->x0; - dst->ty = src->y0; - } - - typedef struct { - bool isClipping; - CGGlyph *cg_glyphs; -- CGSize *cg_advances; -+ union { -+ CGSize *cg_advances; -+ CGPoint *cg_positions; -+ } u; - size_t nglyphs; - CGAffineTransform textTransform; -- CGFontRef font; -+ cairo_scaled_font_t *scaled_font; - CGPoint origin; - } unbounded_show_glyphs_t; - - typedef struct { - CGPathRef cgPath; - cairo_fill_rule_t fill_rule; - } unbounded_stroke_fill_t; - -@@ -686,36 +694,43 @@ static void - CGContextBeginPath (cgc); - CGContextAddPath (cgc, op->u.stroke_fill.cgPath); - - if (op->u.stroke_fill.fill_rule == CAIRO_FILL_RULE_WINDING) - CGContextFillPath (cgc); - else - CGContextEOFillPath (cgc); - } else if (op->op == UNBOUNDED_SHOW_GLYPHS) { -- CGContextSetFont (cgc, op->u.show_glyphs.font); -- CGContextSetFontSize (cgc, 1.0); -- CGContextSetTextMatrix (cgc, CGAffineTransformIdentity); -- CGContextTranslateCTM (cgc, op->u.show_glyphs.origin.x, op->u.show_glyphs.origin.y); -- CGContextConcatCTM (cgc, op->u.show_glyphs.textTransform); -- - if (op->u.show_glyphs.isClipping) { - /* Note that the comment in show_glyphs about kCGTextClip - * and the text transform still applies here; however, the - * cg_advances we have were already transformed, so we - * don't have to do anything. */ - CGContextSetTextDrawingMode (cgc, kCGTextClip); - CGContextSaveGState (cgc); - } -- -- CGContextShowGlyphsWithAdvances (cgc, -- op->u.show_glyphs.cg_glyphs, -- op->u.show_glyphs.cg_advances, -- op->u.show_glyphs.nglyphs); -- -+ CGContextTranslateCTM (cgc, op->u.show_glyphs.origin.x, op->u.show_glyphs.origin.y); -+ CGContextConcatCTM (cgc, op->u.show_glyphs.textTransform); -+ if (CTFontDrawGlyphsPtr) { -+ CTFontDrawGlyphsPtr (_cairo_quartz_scaled_font_get_ct_font_ref (op->u.show_glyphs.scaled_font), -+ op->u.show_glyphs.cg_glyphs, -+ op->u.show_glyphs.u.cg_positions, -+ op->u.show_glyphs.nglyphs, -+ cgc); -+ } else { -+ CGContextSetFont (cgc, _cairo_quartz_scaled_font_get_cg_font_ref (op->u.show_glyphs.scaled_font)); -+ CGContextSetFontSize (cgc, 1.0); -+ CGContextSetTextMatrix (cgc, CGAffineTransformIdentity); -+ -+ CGContextShowGlyphsWithAdvances (cgc, -+ op->u.show_glyphs.cg_glyphs, -+ op->u.show_glyphs.u.cg_advances, -+ op->u.show_glyphs.nglyphs); -+ -+ } - if (op->u.show_glyphs.isClipping) { - CGContextClearRect (cgc, clipBoxRound); - CGContextRestoreGState (cgc); - } - } else if (op->op == UNBOUNDED_MASK) { - CGAffineTransform ctm = CGContextGetCTM (cgc); - CGContextSaveGState (cgc); - CGContextConcatCTM (cgc, op->u.mask.maskTransform); -@@ -2684,16 +2699,19 @@ static cairo_int_status_t - cairo_clip_t *clip, - int *remaining_glyphs) - { - CGAffineTransform textTransform, ctm, invTextTransform; - #define STATIC_BUF_SIZE 64 - CGGlyph glyphs_static[STATIC_BUF_SIZE]; - CGSize cg_advances_static[STATIC_BUF_SIZE]; - CGGlyph *cg_glyphs = &glyphs_static[0]; -+ /* We'll use the cg_advances array for either advances or positions, -+ depending which API we're using to actually draw. The types involved -+ have the same size, so this is safe. */ - CGSize *cg_advances = &cg_advances_static[0]; - - cairo_rectangle_int_t glyph_extents; - cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; - cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; - cairo_quartz_drawing_state_t state; - cairo_quartz_float_t xprev, yprev; - int i; -@@ -2796,41 +2814,62 @@ static cairo_int_status_t - invTextTransform = CGAffineTransformMake (scaled_font->scale_inverse.xx, - -scaled_font->scale_inverse.yx, - scaled_font->scale_inverse.xy, - -scaled_font->scale_inverse.yy, - 0.0, 0.0); - - CGContextSetTextMatrix (state.context, CGAffineTransformIdentity); - -- /* Convert our glyph positions to glyph advances. We need n-1 advances, -- * since the advance at index 0 is applied after glyph 0. */ -- xprev = glyphs[0].x; -- yprev = glyphs[0].y; -- -- cg_glyphs[0] = glyphs[0].index; -- -- for (i = 1; i < num_glyphs; i++) { -- cairo_quartz_float_t xf = glyphs[i].x; -- cairo_quartz_float_t yf = glyphs[i].y; -- cg_glyphs[i] = glyphs[i].index; -- cg_advances[i - 1] = CGSizeApplyAffineTransform(CGSizeMake (xf - xprev, yf - yprev), invTextTransform); -- xprev = xf; -- yprev = yf; -- } -- - /* Translate to the first glyph's position before drawing */ - ctm = CGContextGetCTM (state.context); - CGContextTranslateCTM (state.context, glyphs[0].x, glyphs[0].y); - CGContextConcatCTM (state.context, textTransform); - -- CGContextShowGlyphsWithAdvances (state.context, -- cg_glyphs, -- cg_advances, -- num_glyphs); -+ if (CTFontDrawGlyphsPtr) { -+ /* If CTFontDrawGlyphs is available (i.e. OS X 10.7 or later), we want to use -+ * that in preference to CGContextShowGlyphsWithAdvances so that colored-bitmap -+ * fonts like Apple Color Emoji will render properly. -+ * For this, we need to convert our glyph positions to Core Graphics's CGPoint. -+ * We borrow the cg_advances array, as CGPoint and CGSize are the same size. */ -+ -+ CGPoint *cg_positions = (CGPoint*) cg_advances; -+ cairo_quartz_float_t origin_x = glyphs[0].x; -+ cairo_quartz_float_t origin_y = glyphs[0].y; -+ -+ for (i = 0; i < num_glyphs; i++) { -+ CGPoint pt = CGPointMake (glyphs[i].x - origin_x, glyphs[i].y - origin_y); -+ cg_positions[i] = CGPointApplyAffineTransform (pt, invTextTransform); -+ cg_glyphs[i] = glyphs[i].index; -+ } -+ -+ CTFontDrawGlyphsPtr (_cairo_quartz_scaled_font_get_ct_font_ref (scaled_font), -+ cg_glyphs, cg_positions, num_glyphs, state.context); -+ } else { -+ /* Convert our glyph positions to glyph advances. We need n-1 advances, -+ * since the advance at index 0 is applied after glyph 0. */ -+ xprev = glyphs[0].x; -+ yprev = glyphs[0].y; -+ -+ cg_glyphs[0] = glyphs[0].index; -+ -+ for (i = 1; i < num_glyphs; i++) { -+ cairo_quartz_float_t xf = glyphs[i].x; -+ cairo_quartz_float_t yf = glyphs[i].y; -+ cg_glyphs[i] = glyphs[i].index; -+ cg_advances[i - 1] = CGSizeApplyAffineTransform(CGSizeMake (xf - xprev, yf - yprev), invTextTransform); -+ xprev = xf; -+ yprev = yf; -+ } -+ -+ CGContextShowGlyphsWithAdvances (state.context, -+ cg_glyphs, -+ cg_advances, -+ num_glyphs); -+ } - - CGContextSetCTM (state.context, ctm); - - if (state.action == DO_IMAGE || state.action == DO_TILED_IMAGE || - state.action == DO_LAYER) { - _cairo_quartz_draw_image (&state, op); - } else if (state.action == DO_SHADING) { - CGContextConcatCTM (state.context, state.transform); -@@ -2847,20 +2886,27 @@ BAIL: - cgfref && - !_cairo_operator_bounded_by_mask (op)) - { - unbounded_op_data_t ub; - ub.op = UNBOUNDED_SHOW_GLYPHS; - - ub.u.show_glyphs.isClipping = isClipping; - ub.u.show_glyphs.cg_glyphs = cg_glyphs; -- ub.u.show_glyphs.cg_advances = cg_advances; -+ if (CTFontDrawGlyphsPtr) { -+ /* we're using Core Text API: the cg_advances array was -+ reused (above) for glyph positions */ -+ CGPoint *cg_positions = (CGPoint*) cg_advances; -+ ub.u.show_glyphs.u.cg_positions = cg_positions; -+ } else { -+ ub.u.show_glyphs.u.cg_advances = cg_advances; -+ } - ub.u.show_glyphs.nglyphs = num_glyphs; - ub.u.show_glyphs.textTransform = textTransform; -- ub.u.show_glyphs.font = cgfref; -+ ub.u.show_glyphs.scaled_font = scaled_font; - ub.u.show_glyphs.origin = CGPointMake (glyphs[0].x, glyphs[0].y); - - _cairo_quartz_fixup_unbounded_operation (surface, &ub, scaled_font->options.antialias); - } - - - if (cg_advances != &cg_advances_static[0]) { - free (cg_advances); diff --git a/gfx/cairo/quartz-surface-mask-patch b/gfx/cairo/quartz-surface-mask-patch deleted file mode 100644 index d5ee7d8be..000000000 --- a/gfx/cairo/quartz-surface-mask-patch +++ /dev/null @@ -1,79 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c ---- a/gfx/cairo/cairo/src/cairo-quartz-surface.c -+++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c -@@ -128,20 +128,22 @@ CG_EXTERN CGImageRef CGBitmapContextCrea - */ - static void (*CGContextClipToMaskPtr) (CGContextRef, CGRect, CGImageRef) = NULL; - static void (*CGContextDrawTiledImagePtr) (CGContextRef, CGRect, CGImageRef) = NULL; - static unsigned int (*CGContextGetTypePtr) (CGContextRef) = NULL; - static void (*CGContextSetShouldAntialiasFontsPtr) (CGContextRef, bool) = NULL; - static void (*CGContextSetAllowsFontSmoothingPtr) (CGContextRef, bool) = NULL; - static bool (*CGContextGetAllowsFontSmoothingPtr) (CGContextRef) = NULL; - static CGPathRef (*CGContextCopyPathPtr) (CGContextRef) = NULL; - static CGFloat (*CGContextGetAlphaPtr) (CGContextRef) = NULL; - -+static SInt32 _cairo_quartz_osx_version = 0x0; -+ - static cairo_bool_t _cairo_quartz_symbol_lookup_done = FALSE; - - /* - * Utility functions - */ - - #ifdef QUARTZ_DEBUG - static void quartz_surface_to_png (cairo_quartz_surface_t *nq, char *dest); - static void quartz_image_to_png (CGImageRef, char *dest); - #endif -@@ -163,20 +165,25 @@ static void quartz_ensure_symbols(void) - - CGContextClipToMaskPtr = dlsym(RTLD_DEFAULT, "CGContextClipToMask"); - CGContextDrawTiledImagePtr = dlsym(RTLD_DEFAULT, "CGContextDrawTiledImage"); - CGContextGetTypePtr = dlsym(RTLD_DEFAULT, "CGContextGetType"); - CGContextSetShouldAntialiasFontsPtr = dlsym(RTLD_DEFAULT, "CGContextSetShouldAntialiasFonts"); - CGContextCopyPathPtr = dlsym(RTLD_DEFAULT, "CGContextCopyPath"); - CGContextGetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextGetAllowsFontSmoothing"); - CGContextSetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextSetAllowsFontSmoothing"); - CGContextGetAlphaPtr = dlsym(RTLD_DEFAULT, "CGContextGetAlpha"); - -+ if (Gestalt(gestaltSystemVersion, &_cairo_quartz_osx_version) != noErr) { -+ // assume 10.5 -+ _cairo_quartz_osx_version = 0x1050; -+ } -+ - _cairo_quartz_symbol_lookup_done = TRUE; - } - - CGImageRef - _cairo_quartz_create_cgimage (cairo_format_t format, - unsigned int width, - unsigned int height, - unsigned int stride, - void *data, - cairo_bool_t interpolate, -@@ -3028,22 +3035,25 @@ static cairo_int_status_t - CGContextSetAlpha (surface->cgContext, solid_mask->color.alpha); - rv = _cairo_quartz_surface_paint_cg (surface, op, source, clip); - CGContextSetAlpha (surface->cgContext, 1.0); - - return rv; - } - - /* If we have CGContextClipToMask, we can do more complex masks */ - if (CGContextClipToMaskPtr) { - /* For these, we can skip creating a temporary surface, since we already have one */ -- if (mask->type == CAIRO_PATTERN_TYPE_SURFACE && mask->extend == CAIRO_EXTEND_NONE) -+ /* For some reason this doesn't work reliably on OS X 10.5. See bug 721663. */ -+ if (_cairo_quartz_osx_version >= 0x1060 && mask->type == CAIRO_PATTERN_TYPE_SURFACE && -+ mask->extend == CAIRO_EXTEND_NONE) { - return _cairo_quartz_surface_mask_with_surface (surface, op, source, (cairo_surface_pattern_t *) mask, clip); -+ } - - return _cairo_quartz_surface_mask_with_generic (surface, op, source, mask, clip); - } - - /* So, CGContextClipToMask is not present in 10.3.9, so we're - * doomed; if we have imageData, we can do fallback, otherwise - * just pretend success. - */ - if (surface->imageData) - return CAIRO_INT_STATUS_UNSUPPORTED; diff --git a/gfx/cairo/setlcdfilter_in_tree.patch b/gfx/cairo/setlcdfilter_in_tree.patch deleted file mode 100644 index 5a9470cc2..000000000 --- a/gfx/cairo/setlcdfilter_in_tree.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-ft-font.c b/gfx/cairo/cairo/src/cairo-ft-font.c ---- a/gfx/cairo/cairo/src/cairo-ft-font.c -+++ b/gfx/cairo/cairo/src/cairo-ft-font.c -@@ -1361,21 +1361,25 @@ static cairo_status_t - case FT_RENDER_MODE_MONO: - case FT_RENDER_MODE_LIGHT: - case FT_RENDER_MODE_NORMAL: - case FT_RENDER_MODE_MAX: - default: - break; - } - - if (!initialized_setLcdFilter) { - initialized_setLcdFilter = 1; -+#ifdef HAVE_FT_LIBRARY_SETLCDFILTER -+ setLcdFilter = &FT_Library_SetLcdFilter; -+#else - setLcdFilter = (setLcdFilterFunc) dlsym(RTLD_DEFAULT, "FT_Library_SetLcdFilter"); -+#endif - } - - if (setLcdFilter) - setLcdFilter (library, lcd_filter); - - fterror = FT_Render_Glyph (face->glyph, render_mode); - - if (setLcdFilter) - setLcdFilter (library, FT_LCD_FILTER_NONE); - - diff --git a/gfx/cairo/support-new-style-atomic-primitives.patch b/gfx/cairo/support-new-style-atomic-primitives.patch deleted file mode 100644 index 1830a4691..000000000 --- a/gfx/cairo/support-new-style-atomic-primitives.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 5d150ee111c222f09e78f4f88540964476327844 Mon Sep 17 00:00:00 2001 -From: Nathan Froyd <froydnj@mozilla.com> -Date: Mon, 4 May 2015 13:38:41 -0400 -Subject: Support new-style __atomic_* primitives - -Recent versions of GCC/clang feature a new set of compiler intrinsics -for performing atomic operations, motivated by the operations needed to -support the C++11 memory model. These intrinsics are more flexible than -the old __sync_* intrinstics and offer efficient support for atomic load -and store operations. - -Having the load appear atomic to the compiler is particular important -for tools like ThreadSanitizer so they don't report false positives on -memory operations that we intend to be atomic. - -Patch from Nathan Froyd <froydnj@mozilla.com> - -diff --git a/src/cairo-atomic-private.h b/src/cairo-atomic-private.h -index 327fed1..11b2887 100644 ---- a/src/cairo-atomic-private.h -+++ b/src/cairo-atomic-private.h -@@ -53,6 +53,96 @@ - - CAIRO_BEGIN_DECLS - -+/* C++11 atomic primitives were designed to be more flexible than the -+ * __sync_* family of primitives. Despite the name, they are available -+ * in C as well as C++. The motivating reason for using them is that -+ * for _cairo_atomic_{int,ptr}_get, the compiler is able to see that -+ * the load is intended to be atomic, as opposed to the __sync_* -+ * version, below, where the load looks like a plain load. Having -+ * the load appear atomic to the compiler is particular important for -+ * tools like ThreadSanitizer so they don't report false positives on -+ * memory operations that we intend to be atomic. -+ */ -+#if HAVE_CXX11_ATOMIC_PRIMITIVES -+ -+#define HAS_ATOMIC_OPS 1 -+ -+typedef int cairo_atomic_int_t; -+ -+static cairo_always_inline cairo_atomic_int_t -+_cairo_atomic_int_get (cairo_atomic_int_t *x) -+{ -+ return __atomic_load_n(x, __ATOMIC_SEQ_CST); -+} -+ -+static cairo_always_inline void * -+_cairo_atomic_ptr_get (void **x) -+{ -+ return __atomic_load_n(x, __ATOMIC_SEQ_CST); -+} -+ -+# define _cairo_atomic_int_inc(x) ((void) __atomic_fetch_add(x, 1, __ATOMIC_SEQ_CST)) -+# define _cairo_atomic_int_dec(x) ((void) __atomic_fetch_sub(x, 1, __ATOMIC_SEQ_CST)) -+# define _cairo_atomic_int_dec_and_test(x) (__atomic_fetch_sub(x, 1, __ATOMIC_SEQ_CST) == 1) -+ -+#if SIZEOF_VOID_P==SIZEOF_INT -+typedef int cairo_atomic_intptr_t; -+#elif SIZEOF_VOID_P==SIZEOF_LONG -+typedef long cairo_atomic_intptr_t; -+#elif SIZEOF_VOID_P==SIZEOF_LONG_LONG -+typedef long long cairo_atomic_intptr_t; -+#else -+#error No matching integer pointer type -+#endif -+ -+static cairo_always_inline cairo_bool_t -+_cairo_atomic_int_cmpxchg_impl(cairo_atomic_int_t *x, -+ cairo_atomic_int_t oldv, -+ cairo_atomic_int_t newv) -+{ -+ cairo_atomic_int_t expected = oldv; -+ return __atomic_compare_exchange_n(x, &expected, newv, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); -+} -+ -+#define _cairo_atomic_int_cmpxchg(x, oldv, newv) \ -+ _cairo_atomic_int_cmpxchg_impl(x, oldv, newv) -+ -+static cairo_always_inline cairo_atomic_int_t -+_cairo_atomic_int_cmpxchg_return_old_impl(cairo_atomic_int_t *x, -+ cairo_atomic_int_t oldv, -+ cairo_atomic_int_t newv) -+{ -+ cairo_atomic_int_t expected = oldv; -+ (void) __atomic_compare_exchange_n(x, &expected, newv, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); -+ return expected; -+} -+ -+#define _cairo_atomic_int_cmpxchg_return_old(x, oldv, newv) \ -+ _cairo_atomic_int_cmpxchg_return_old_impl(x, oldv, newv) -+ -+static cairo_always_inline cairo_bool_t -+_cairo_atomic_ptr_cmpxchg_impl(void **x, void *oldv, void *newv) -+{ -+ void *expected = oldv; -+ return __atomic_compare_exchange_n(x, &expected, newv, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); -+} -+ -+#define _cairo_atomic_ptr_cmpxchg(x, oldv, newv) \ -+ _cairo_atomic_ptr_cmpxchg_impl(x, oldv, newv) -+ -+static cairo_always_inline void * -+_cairo_atomic_ptr_cmpxchg_return_old_impl(void **x, void *oldv, void *newv) -+{ -+ void *expected = oldv; -+ (void) __atomic_compare_exchange_n(x, &expected, newv, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); -+ return expected; -+} -+ -+#define _cairo_atomic_ptr_cmpxchg_return_old(x, oldv, newv) \ -+ _cairo_atomic_ptr_cmpxchg_return_old_impl(x, oldv, newv) -+ -+#endif -+ - #if HAVE_INTEL_ATOMIC_PRIMITIVES - - #define HAS_ATOMIC_OPS 1 --- -cgit v0.10.2 - diff --git a/gfx/cairo/surface-clipper.patch b/gfx/cairo/surface-clipper.patch deleted file mode 100644 index 608841147..000000000 --- a/gfx/cairo/surface-clipper.patch +++ /dev/null @@ -1,26 +0,0 @@ -commit 061cc774a861f349334117203c301dee202f9f26 -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -Date: Wed Apr 7 23:05:48 2010 -0400 - - Remove an incorrect optimization that was causing the clip - not to be set when it should've been. - - This happens when the path is equal but the parents aren't shared. - -diff --git a/src/cairo-surface-clipper.c b/src/cairo-surface-clipper.c -index d536f0c..03610d1 100644 ---- a/src/cairo-surface-clipper.c -+++ b/src/cairo-surface-clipper.c -@@ -78,12 +78,6 @@ _cairo_surface_clipper_set_clip (cairo_surface_clipper_t *clipper, - if (clip != NULL && clip->path == clipper->clip.path) - return CAIRO_STATUS_SUCCESS; - -- if (clip != NULL && clipper->clip.path != NULL && -- _cairo_path_fixed_equal (&clip->path->path, &clipper->clip.path->path)) -- { -- return CAIRO_STATUS_SUCCESS; -- } -- - /* all clipped out state should never propagate this far */ - assert (clip == NULL || clip->path != NULL); - diff --git a/gfx/cairo/tee-surfaces-pointwise.patch b/gfx/cairo/tee-surfaces-pointwise.patch deleted file mode 100644 index 180005fa6..000000000 --- a/gfx/cairo/tee-surfaces-pointwise.patch +++ /dev/null @@ -1,278 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1294019288 -46800 -# Node ID bacc54d452a9fddb5a0d6a1442ec7be4de81ffa7 -# Parent ccba8826be1451d0e61d0df38363dadffb20ba48 -Bug 593604. Part 2: When compositing a tee surface into another tee surface, try to compose the subsurfaces pointwise. r=jrmuizel,a=blocking - -diff --git a/gfx/cairo/cairo/src/cairo-tee-surface.c b/gfx/cairo/cairo/src/cairo-tee-surface.c ---- a/gfx/cairo/cairo/src/cairo-tee-surface.c -+++ b/gfx/cairo/cairo/src/cairo-tee-surface.c -@@ -186,35 +186,72 @@ static void - _cairo_tee_surface_get_font_options (void *abstract_surface, - cairo_font_options_t *options) - { - cairo_tee_surface_t *surface = abstract_surface; - - _cairo_surface_wrapper_get_font_options (&surface->master, options); - } - -+static const cairo_pattern_t * -+_cairo_tee_surface_match_source (cairo_tee_surface_t *surface, -+ const cairo_pattern_t *source, -+ int index, -+ cairo_surface_wrapper_t *dest, -+ cairo_surface_pattern_t *temp) -+{ -+ cairo_surface_t *s; -+ cairo_status_t status = cairo_pattern_get_surface ((cairo_pattern_t *)source, &s); -+ if (status == CAIRO_STATUS_SUCCESS && -+ cairo_surface_get_type (s) == CAIRO_SURFACE_TYPE_TEE) { -+ cairo_surface_t *tee_surf = cairo_tee_surface_index (s, index); -+ if (tee_surf->status == CAIRO_STATUS_SUCCESS && -+ tee_surf->backend == dest->target->backend) { -+ status = _cairo_pattern_init_copy (&temp->base, source); -+ if (status == CAIRO_STATUS_SUCCESS) { -+ cairo_surface_destroy (temp->surface); -+ temp->surface = tee_surf; -+ cairo_surface_reference (temp->surface); -+ return &temp->base; -+ } -+ } -+ } -+ -+ return source; -+} -+ - static cairo_int_status_t - _cairo_tee_surface_paint (void *abstract_surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_clip_t *clip) - { - cairo_tee_surface_t *surface = abstract_surface; - cairo_surface_wrapper_t *slaves; - int n, num_slaves; - cairo_status_t status; -+ const cairo_pattern_t *matched_source; -+ cairo_surface_pattern_t temp; - -- status = _cairo_surface_wrapper_paint (&surface->master, op, source, clip); -+ matched_source = _cairo_tee_surface_match_source (surface, source, 0, &surface->master, &temp); -+ status = _cairo_surface_wrapper_paint (&surface->master, op, matched_source, clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - return status; - - num_slaves = _cairo_array_num_elements (&surface->slaves); - slaves = _cairo_array_index (&surface->slaves, 0); - for (n = 0; n < num_slaves; n++) { -- status = _cairo_surface_wrapper_paint (&slaves[n], op, source, clip); -+ matched_source = _cairo_tee_surface_match_source (surface, source, n + 1, &slaves[n], &temp); -+ status = _cairo_surface_wrapper_paint (&slaves[n], op, matched_source, clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - return status; - } - - return CAIRO_STATUS_SUCCESS; - } - - static cairo_int_status_t -@@ -223,27 +260,37 @@ _cairo_tee_surface_mask (void *abstrac - const cairo_pattern_t *source, - const cairo_pattern_t *mask, - cairo_clip_t *clip) - { - cairo_tee_surface_t *surface = abstract_surface; - cairo_surface_wrapper_t *slaves; - int n, num_slaves; - cairo_status_t status; -+ const cairo_pattern_t *matched_source; -+ cairo_surface_pattern_t temp; - -+ matched_source = _cairo_tee_surface_match_source (surface, source, 0, &surface->master, &temp); - status = _cairo_surface_wrapper_mask (&surface->master, -- op, source, mask, clip); -+ op, matched_source, mask, clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - return status; - - num_slaves = _cairo_array_num_elements (&surface->slaves); - slaves = _cairo_array_index (&surface->slaves, 0); - for (n = 0; n < num_slaves; n++) { -+ matched_source = _cairo_tee_surface_match_source (surface, source, n + 1, &slaves[n], &temp); - status = _cairo_surface_wrapper_mask (&slaves[n], -- op, source, mask, clip); -+ op, matched_source, mask, clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - return status; - } - - return CAIRO_STATUS_SUCCESS; - } - - static cairo_int_status_t -@@ -257,35 +304,45 @@ _cairo_tee_surface_stroke (void *abst - double tolerance, - cairo_antialias_t antialias, - cairo_clip_t *clip) - { - cairo_tee_surface_t *surface = abstract_surface; - cairo_surface_wrapper_t *slaves; - int n, num_slaves; - cairo_status_t status; -+ const cairo_pattern_t *matched_source; -+ cairo_surface_pattern_t temp; - -+ matched_source = _cairo_tee_surface_match_source (surface, source, 0, &surface->master, &temp); - status = _cairo_surface_wrapper_stroke (&surface->master, -- op, source, -+ op, matched_source, - path, style, - ctm, ctm_inverse, - tolerance, antialias, - clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - return status; - - num_slaves = _cairo_array_num_elements (&surface->slaves); - slaves = _cairo_array_index (&surface->slaves, 0); - for (n = 0; n < num_slaves; n++) { -+ matched_source = _cairo_tee_surface_match_source (surface, source, n + 1, &slaves[n], &temp); - status = _cairo_surface_wrapper_stroke (&slaves[n], -- op, source, -+ op, matched_source, - path, style, - ctm, ctm_inverse, - tolerance, antialias, - clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - return status; - } - - return CAIRO_STATUS_SUCCESS; - } - - static cairo_int_status_t -@@ -297,33 +354,43 @@ _cairo_tee_surface_fill (void *abstra - double tolerance, - cairo_antialias_t antialias, - cairo_clip_t *clip) - { - cairo_tee_surface_t *surface = abstract_surface; - cairo_surface_wrapper_t *slaves; - int n, num_slaves; - cairo_status_t status; -+ const cairo_pattern_t *matched_source; -+ cairo_surface_pattern_t temp; - -+ matched_source = _cairo_tee_surface_match_source (surface, source, 0, &surface->master, &temp); - status = _cairo_surface_wrapper_fill (&surface->master, -- op, source, -+ op, matched_source, - path, fill_rule, - tolerance, antialias, - clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - return status; - - num_slaves = _cairo_array_num_elements (&surface->slaves); - slaves = _cairo_array_index (&surface->slaves, 0); - for (n = 0; n < num_slaves; n++) { -+ matched_source = _cairo_tee_surface_match_source (surface, source, n + 1, &slaves[n], &temp); - status = _cairo_surface_wrapper_fill (&slaves[n], -- op, source, -+ op, matched_source, - path, fill_rule, - tolerance, antialias, - clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - return status; - } - - return CAIRO_STATUS_SUCCESS; - } - - static cairo_bool_t -@@ -346,46 +413,56 @@ _cairo_tee_surface_show_text_glyphs (voi - cairo_scaled_font_t *scaled_font, - cairo_clip_t *clip) - { - cairo_tee_surface_t *surface = abstract_surface; - cairo_surface_wrapper_t *slaves; - int n, num_slaves; - cairo_status_t status; - cairo_glyph_t *glyphs_copy; -+ const cairo_pattern_t *matched_source; -+ cairo_surface_pattern_t temp; - - /* XXX: This copying is ugly. */ - glyphs_copy = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); - if (unlikely (glyphs_copy == NULL)) - return _cairo_error (CAIRO_STATUS_NO_MEMORY); - - memcpy (glyphs_copy, glyphs, sizeof (cairo_glyph_t) * num_glyphs); -+ matched_source = _cairo_tee_surface_match_source (surface, source, 0, &surface->master, &temp); - status = _cairo_surface_wrapper_show_text_glyphs (&surface->master, op, -- source, -+ matched_source, - utf8, utf8_len, - glyphs_copy, num_glyphs, - clusters, num_clusters, - cluster_flags, - scaled_font, - clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - goto CLEANUP; - - num_slaves = _cairo_array_num_elements (&surface->slaves); - slaves = _cairo_array_index (&surface->slaves, 0); - for (n = 0; n < num_slaves; n++) { - memcpy (glyphs_copy, glyphs, sizeof (cairo_glyph_t) * num_glyphs); -+ matched_source = _cairo_tee_surface_match_source (surface, source, n + 1, &slaves[n], &temp); - status = _cairo_surface_wrapper_show_text_glyphs (&slaves[n], op, -- source, -+ matched_source, - utf8, utf8_len, - glyphs_copy, num_glyphs, - clusters, num_clusters, - cluster_flags, - scaled_font, - clip); -+ if (matched_source == &temp.base) { -+ _cairo_pattern_fini (&temp.base); -+ } - if (unlikely (status)) - goto CLEANUP; - } - - CLEANUP: - free (glyphs_copy); - return status; - } diff --git a/gfx/cairo/text-path-filling-threshold.patch b/gfx/cairo/text-path-filling-threshold.patch deleted file mode 100644 index 69efce093..000000000 --- a/gfx/cairo/text-path-filling-threshold.patch +++ /dev/null @@ -1,90 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-gstate.c b/gfx/cairo/cairo/src/cairo-gstate.c ---- a/gfx/cairo/cairo/src/cairo-gstate.c -+++ b/gfx/cairo/cairo/src/cairo-gstate.c -@@ -1673,26 +1673,31 @@ _cairo_gstate_show_text_glyphs (cairo_gs - - source_pattern = &source_pattern_stack.base; - status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern); - if (unlikely (status)) - goto CLEANUP_GLYPHS; - - /* For really huge font sizes, we can just do path;fill instead of - * show_glyphs, as show_glyphs would put excess pressure on the cache, -- * and moreover, not all components below us correctly handle huge font -- * sizes. I wanted to set the limit at 256. But alas, seems like cairo's -+ * not all components below us correctly handle huge font sizes, and -+ * path filling can be cheaper since parts of glyphs are likely to be -+ * clipped out. 256 seems like a good limit. But alas, seems like cairo's - * rasterizer is something like ten times slower than freetype's for huge -- * sizes. So, no win just yet. For now, do it for insanely-huge sizes, -- * just to make sure we don't make anyone unhappy. When we get a really -- * fast rasterizer in cairo, we may want to readjust this. -+ * sizes. So, no win just yet when we're using cairo's rasterizer. -+ * For now, if we're using cairo's rasterizer, use path filling only -+ * for insanely-huge sizes, just to make sure we don't make anyone -+ * unhappy. When we get a really fast rasterizer in cairo, we may -+ * want to readjust this. The threshold calculation is -+ * encapsulated in _cairo_surface_get_text_path_fill_threshold. - * - * Needless to say, do this only if show_text_glyphs is not available. */ - if (cairo_surface_has_show_text_glyphs (gstate->target) || -- _cairo_scaled_font_get_max_scale (gstate->scaled_font) <= 10240) { -+ _cairo_scaled_font_get_max_scale (gstate->scaled_font) <= -+ _cairo_surface_get_text_path_fill_threshold (gstate->target)) { - status = _cairo_surface_show_text_glyphs (gstate->target, - gstate->op, - source_pattern, - utf8, utf8_len, - transformed_glyphs, num_glyphs, - transformed_clusters, num_clusters, - cluster_flags, - gstate->scaled_font, NULL); -diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c ---- a/gfx/cairo/cairo/src/cairo-surface.c -+++ b/gfx/cairo/cairo/src/cairo-surface.c -@@ -1120,16 +1120,22 @@ cairo_surface_get_fallback_resolution (c - double *y_pixels_per_inch) - { - if (x_pixels_per_inch) - *x_pixels_per_inch = surface->x_fallback_resolution; - if (y_pixels_per_inch) - *y_pixels_per_inch = surface->y_fallback_resolution; - } - -+int -+_cairo_surface_get_text_path_fill_threshold (const cairo_surface_t *surface) -+{ -+ return surface->backend->fill == NULL ? 10240 : 256; -+} -+ - cairo_bool_t - _cairo_surface_has_device_transform (cairo_surface_t *surface) - { - return ! _cairo_matrix_is_identity (&surface->device_transform); - } - - /** - * _cairo_surface_acquire_source_image: -diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h ---- a/gfx/cairo/cairo/src/cairoint.h -+++ b/gfx/cairo/cairo/src/cairoint.h -@@ -2065,16 +2065,19 @@ _cairo_surface_composite_shape_fixup_unb - int dst_x, - int dst_y, - unsigned int width, - unsigned int height); - - cairo_private cairo_bool_t - _cairo_surface_is_opaque (const cairo_surface_t *surface); - -+cairo_private int -+_cairo_surface_get_text_path_fill_threshold (const cairo_surface_t *surface); -+ - cairo_private void - _cairo_surface_set_device_scale (cairo_surface_t *surface, - double sx, - double sy); - - cairo_private cairo_bool_t - _cairo_surface_has_device_transform (cairo_surface_t *surface); - diff --git a/gfx/cairo/unicode-printing.patch b/gfx/cairo/unicode-printing.patch deleted file mode 100644 index 09b3991ea..000000000 --- a/gfx/cairo/unicode-printing.patch +++ /dev/null @@ -1,333 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c -@@ -1426,16 +1426,104 @@ _cairo_win32_printing_surface_fill (void - } - - fflush(stderr); - - return status; - } - - static cairo_int_status_t -+_cairo_win32_printing_surface_emit_win32_glyphs (cairo_win32_surface_t *surface, -+ cairo_operator_t op, -+ const cairo_pattern_t *source, -+ cairo_glyph_t *glyphs, -+ int num_glyphs, -+ cairo_scaled_font_t *scaled_font, -+ cairo_clip_t *clip, -+ int *remaining_glyphs) -+{ -+ cairo_matrix_t ctm; -+ cairo_glyph_t *unicode_glyphs; -+ cairo_scaled_font_subsets_glyph_t subset_glyph; -+ int i, first; -+ cairo_bool_t sequence_is_unicode; -+ cairo_status_t status = CAIRO_STATUS_SUCCESS; -+ -+ /* Where possible reverse the glyph indices back to unicode -+ * characters. Strings of glyphs that could not be reversed to -+ * unicode will be printed with ETO_GLYPH_INDEX. -+ * -+ * As _cairo_win32_scaled_font_index_to_ucs4() is a slow -+ * operation, the font subsetting function -+ * _cairo_scaled_font_subsets_map_glyph() is used to obtain -+ * the unicode value because it caches the reverse mapping in -+ * the subsets. -+ */ -+ -+ if (surface->has_ctm) { -+ for (i = 0; i < num_glyphs; i++) -+ cairo_matrix_transform_point (&surface->ctm, &glyphs[i].x, &glyphs[i].y); -+ cairo_matrix_multiply (&ctm, &scaled_font->ctm, &surface->ctm); -+ scaled_font = cairo_scaled_font_create (scaled_font->font_face, -+ &scaled_font->font_matrix, -+ &ctm, -+ &scaled_font->options); -+ } -+ -+ unicode_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); -+ if (unicode_glyphs == NULL) -+ return _cairo_error (CAIRO_STATUS_NO_MEMORY); -+ -+ memcpy (unicode_glyphs, glyphs, num_glyphs * sizeof (cairo_glyph_t)); -+ for (i = 0; i < num_glyphs; i++) { -+ status = _cairo_scaled_font_subsets_map_glyph (surface->font_subsets, -+ scaled_font, -+ glyphs[i].index, -+ NULL, 0, -+ &subset_glyph); -+ if (status) -+ goto fail; -+ -+ unicode_glyphs[i].index = subset_glyph.unicode; -+ } -+ -+ i = 0; -+ first = 0; -+ sequence_is_unicode = unicode_glyphs[0].index <= 0xffff; -+ while (i < num_glyphs) { -+ if (i == num_glyphs - 1 || -+ ((unicode_glyphs[i + 1].index < 0xffff) != sequence_is_unicode)) -+ { -+ status = _cairo_win32_surface_show_glyphs_internal ( -+ surface, -+ op, -+ source, -+ sequence_is_unicode ? &unicode_glyphs[first] : &glyphs[first], -+ i - first + 1, -+ scaled_font, -+ clip, -+ remaining_glyphs, -+ ! sequence_is_unicode); -+ first = i + 1; -+ if (i < num_glyphs - 1) -+ sequence_is_unicode = unicode_glyphs[i + 1].index <= 0xffff; -+ } -+ i++; -+ } -+ -+fail: -+ if (surface->has_ctm) -+ cairo_scaled_font_destroy (scaled_font); -+ -+ free (unicode_glyphs); -+ -+ return status; -+} -+ -+static cairo_int_status_t - _cairo_win32_printing_surface_show_glyphs (void *abstract_surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_glyph_t *glyphs, - int num_glyphs, - cairo_scaled_font_t *scaled_font, - cairo_clip_t *clip, - int *remaining_glyphs) -@@ -1533,77 +1621,24 @@ _cairo_win32_printing_surface_show_glyph - } - } - #endif - - #if CAIRO_HAS_WIN32_FONT - if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_WIN32 && - source->type == CAIRO_PATTERN_TYPE_SOLID) - { -- cairo_matrix_t ctm; -- cairo_glyph_t *type1_glyphs = NULL; -- cairo_scaled_font_subsets_glyph_t subset_glyph; -- -- /* Calling ExtTextOutW() with ETO_GLYPH_INDEX and a Type 1 -- * font on a printer DC prints garbled text. The text displays -- * correctly on a display DC. When using a printer -- * DC, ExtTextOutW() only works with characters and not glyph -- * indices. -- * -- * For Type 1 fonts the glyph indices are converted back to -- * unicode characters before calling _cairo_win32_surface_show_glyphs(). -- * -- * As _cairo_win32_scaled_font_index_to_ucs4() is a slow -- * operation, the font subsetting function -- * _cairo_scaled_font_subsets_map_glyph() is used to obtain -- * the unicode value because it caches the reverse mapping in -- * the subsets. -- */ -- if (_cairo_win32_scaled_font_is_type1 (scaled_font)) { -- type1_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); -- if (type1_glyphs == NULL) { -- status = _cairo_error (CAIRO_STATUS_NO_MEMORY); -- goto FINISH; -- } -- memcpy (type1_glyphs, glyphs, num_glyphs * sizeof (cairo_glyph_t)); -- for (i = 0; i < num_glyphs; i++) { -- status = _cairo_scaled_font_subsets_map_glyph (surface->font_subsets, -- scaled_font, -- type1_glyphs[i].index, -- NULL, 0, -- &subset_glyph); -- if (status) -- goto FINISH; -- -- type1_glyphs[i].index = subset_glyph.unicode; -- } -- glyphs = type1_glyphs; -- } -- -- if (surface->has_ctm || surface->has_gdi_ctm) { -- cairo_matrix_multiply (&ctm, &surface->ctm, &surface->gdi_ctm); -- for (i = 0; i < num_glyphs; i++) -- cairo_matrix_transform_point (&ctm, &glyphs[i].x, &glyphs[i].y); -- cairo_matrix_multiply (&ctm, &scaled_font->ctm, &ctm); -- scaled_font = cairo_scaled_font_create (scaled_font->font_face, -- &scaled_font->font_matrix, -- &ctm, -- &scaled_font->options); -- } -- status = _cairo_win32_surface_show_glyphs (surface, op, -- source, glyphs, -- num_glyphs, scaled_font, -- clip, -- remaining_glyphs); -- if (surface->has_ctm || surface->has_gdi_ctm) -- cairo_scaled_font_destroy (scaled_font); -- -- if (type1_glyphs != NULL) -- free (type1_glyphs); -- -+ status = _cairo_win32_printing_surface_emit_win32_glyphs (surface, -+ op, -+ source, -+ glyphs, -+ num_glyphs, -+ scaled_font, -+ clip, -+ remaining_glyphs); - goto FINISH; - } - #endif - - SaveDC (surface->dc); - old_ctm = surface->ctm; - old_has_ctm = surface->has_ctm; - surface->has_ctm = TRUE; -diff --git a/gfx/cairo/cairo/src/cairo-win32-private.h b/gfx/cairo/cairo/src/cairo-win32-private.h ---- a/gfx/cairo/cairo/src/cairo-win32-private.h -+++ b/gfx/cairo/cairo/src/cairo-win32-private.h -@@ -157,16 +157,27 @@ _cairo_win32_surface_get_extents (void - uint32_t - _cairo_win32_flags_for_dc (HDC dc); - - cairo_status_t - _cairo_win32_surface_set_clip_region (void *abstract_surface, - cairo_region_t *region); - - cairo_int_status_t -+_cairo_win32_surface_show_glyphs_internal (void *surface, -+ cairo_operator_t op, -+ const cairo_pattern_t *source, -+ cairo_glyph_t *glyphs, -+ int num_glyphs, -+ cairo_scaled_font_t *scaled_font, -+ cairo_clip_t *clip, -+ int *remaining_glyphs, -+ cairo_bool_t glyph_indices); -+ -+cairo_int_status_t - _cairo_win32_surface_show_glyphs (void *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_glyph_t *glyphs, - int num_glyphs, - cairo_scaled_font_t *scaled_font, - cairo_clip_t *clip, - int *remaining_glyphs); -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -1607,24 +1607,25 @@ static cairo_status_t - _cairo_win32_surface_flush (void *abstract_surface) - { - return _cairo_win32_surface_set_clip_region (abstract_surface, NULL); - } - - #define STACK_GLYPH_SIZE 256 - - cairo_int_status_t --_cairo_win32_surface_show_glyphs (void *surface, -- cairo_operator_t op, -- const cairo_pattern_t *source, -- cairo_glyph_t *glyphs, -- int num_glyphs, -- cairo_scaled_font_t *scaled_font, -- cairo_clip_t *clip, -- int *remaining_glyphs) -+_cairo_win32_surface_show_glyphs_internal (void *surface, -+ cairo_operator_t op, -+ const cairo_pattern_t *source, -+ cairo_glyph_t *glyphs, -+ int num_glyphs, -+ cairo_scaled_font_t *scaled_font, -+ cairo_clip_t *clip, -+ int *remaining_glyphs, -+ cairo_bool_t glyph_indexing) - { - #ifdef CAIRO_HAS_WIN32_FONT - if (scaled_font->backend->type == CAIRO_FONT_TYPE_DWRITE) { - #ifdef CAIRO_HAS_DWRITE_FONT - return _cairo_dwrite_show_glyphs_on_surface(surface, op, source, glyphs, num_glyphs, scaled_font, clip); - #endif - } else { - cairo_win32_surface_t *dst = surface; -@@ -1737,29 +1738,20 @@ _cairo_win32_surface_show_glyphs (void - dxy_buf[j+1] = _cairo_lround (logical_y - next_logical_y); - /* note that GDI coordinate system is inverted */ - - logical_x = next_logical_x; - logical_y = next_logical_y; - } - } - -- /* Using glyph indices for a Type 1 font does not work on a -- * printer DC. The win32 printing surface will convert the the -- * glyph indices of Type 1 fonts to the unicode values. -- */ -- if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) && -- _cairo_win32_scaled_font_is_type1 (scaled_font)) -- { -+ if (glyph_indexing) -+ glyph_index_option = ETO_GLYPH_INDEX; -+ else - glyph_index_option = 0; -- } -- else -- { -- glyph_index_option = ETO_GLYPH_INDEX; -- } - - win_result = ExtTextOutW(dst->dc, - start_x, - start_y, - glyph_index_option | ETO_PDY, - NULL, - glyph_buf, - num_glyphs, -@@ -1778,16 +1770,37 @@ _cairo_win32_surface_show_glyphs (void - } - #else - return CAIRO_INT_STATUS_UNSUPPORTED; - #endif - } - - #undef STACK_GLYPH_SIZE - -+cairo_int_status_t -+_cairo_win32_surface_show_glyphs (void *surface, -+ cairo_operator_t op, -+ const cairo_pattern_t *source, -+ cairo_glyph_t *glyphs, -+ int num_glyphs, -+ cairo_scaled_font_t *scaled_font, -+ cairo_clip_t *clip, -+ int *remaining_glyphs) -+{ -+ return _cairo_win32_surface_show_glyphs_internal (surface, -+ op, -+ source, -+ glyphs, -+ num_glyphs, -+ scaled_font, -+ clip, -+ remaining_glyphs, -+ TRUE); -+} -+ - static cairo_surface_t * - cairo_win32_surface_create_internal (HDC hdc, cairo_format_t format) - { - cairo_win32_surface_t *surface; - - RECT rect; - - surface = malloc (sizeof (cairo_win32_surface_t)); diff --git a/gfx/cairo/use-show-text-glyphs-if-glyph-path-fails.patch b/gfx/cairo/use-show-text-glyphs-if-glyph-path-fails.patch deleted file mode 100644 index 1670eaf73..000000000 --- a/gfx/cairo/use-show-text-glyphs-if-glyph-path-fails.patch +++ /dev/null @@ -1,42 +0,0 @@ -From: Jonathan Kew <jkew@mozilla.com> -bug 715798 pt 2 - fall back to show_text_glyphs even at huge sizes if scaled_font_glyph_path didn't work. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-gstate.c b/gfx/cairo/cairo/src/cairo-gstate.c ---- a/gfx/cairo/cairo/src/cairo-gstate.c -+++ b/gfx/cairo/cairo/src/cairo-gstate.c -@@ -2002,23 +2002,34 @@ cairo_status_t - cairo_path_fixed_t path; - - _cairo_path_fixed_init (&path); - - status = _cairo_scaled_font_glyph_path (gstate->scaled_font, - transformed_glyphs, num_glyphs, - &path); - -- if (status == CAIRO_STATUS_SUCCESS) { -+ if (status == CAIRO_STATUS_SUCCESS && !_cairo_path_fixed_fill_is_empty (&path)) { - status = _cairo_surface_fill (gstate->target, op, pattern, - &path, - CAIRO_FILL_RULE_WINDING, - gstate->tolerance, - gstate->scaled_font->options.antialias, - _gstate_get_clip (gstate, &clip)); -+ } else { -+ /* if _cairo_scaled_font_glyph_path() failed, maybe the font doesn't support -+ * returning paths, so try the _cairo_surface_show_text_glyphs() option -+ */ -+ status = _cairo_surface_show_text_glyphs (gstate->target, op, pattern, -+ utf8, utf8_len, -+ transformed_glyphs, num_glyphs, -+ transformed_clusters, num_clusters, -+ cluster_flags, -+ gstate->scaled_font, -+ _gstate_get_clip (gstate, &clip)); - } - - _cairo_path_fixed_fini (&path); - } - - _cairo_clip_fini (&clip); - - CLEANUP_GLYPHS: diff --git a/gfx/cairo/win32-ExtCreatePen-zero-size.patch b/gfx/cairo/win32-ExtCreatePen-zero-size.patch deleted file mode 100644 index 3970015f7..000000000 --- a/gfx/cairo/win32-ExtCreatePen-zero-size.patch +++ /dev/null @@ -1,85 +0,0 @@ -From: Robert O'Callahan <robert@ocallahan.org> -Bug 768348. Avoid ExtCreatePen failures by avoiding rounding widths and dash lengths down to zero. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c -@@ -1251,22 +1251,24 @@ static cairo_int_status_t - { - cairo_win32_surface_t *surface = abstract_surface; - cairo_int_status_t status; - HPEN pen; - LOGBRUSH brush; - COLORREF color; - XFORM xform; - DWORD pen_style; -+ DWORD pen_width; - DWORD *dash_array; - HGDIOBJ obj; - unsigned int i; - cairo_solid_pattern_t clear; - cairo_matrix_t mat; - double scale; -+ double scaled_width; - - status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (status) - return status; - - if (op == CAIRO_OPERATOR_CLEAR) { - _cairo_win32_printing_surface_init_clear_color (surface, &clear); - source = (cairo_pattern_t*) &clear; -@@ -1288,17 +1290,21 @@ static cairo_int_status_t - _cairo_matrix_factor_out_scale (&mat, &scale); - - pen_style = PS_GEOMETRIC; - dash_array = NULL; - if (style->num_dashes) { - pen_style |= PS_USERSTYLE; - dash_array = calloc (sizeof (DWORD), style->num_dashes); - for (i = 0; i < style->num_dashes; i++) { -- dash_array[i] = (DWORD) (scale * style->dash[i]); -+ DWORD dashes = (DWORD) (scale * style->dash[i]); -+ /* zero dash-lengths cause ExtCreatePen to fail. Make the dashes -+ * longer if necessary. -+ */ -+ dash_array[i] = MAX(1, dashes); - } - } else { - pen_style |= PS_SOLID; - } - - SetMiterLimit (surface->dc, (FLOAT) (style->miter_limit), NULL); - if (source->type == CAIRO_PATTERN_TYPE_SOLID) { - cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; -@@ -1310,18 +1316,29 @@ static cairo_int_status_t - /* Color not used as the pen will only be used by WidenPath() */ - color = RGB (0,0,0); - } - brush.lbStyle = BS_SOLID; - brush.lbColor = color; - brush.lbHatch = 0; - pen_style |= _cairo_win32_line_cap (style->line_cap); - pen_style |= _cairo_win32_line_join (style->line_join); -+ scaled_width = scale * style->line_width; -+ if (scaled_width == 0.0) -+ return status; -+ pen_width = (DWORD)scaled_width; -+ if (pen_width == 0) { -+ /* ExtCreatePen will fail if passed zero width. We have to choose -+ * between drawing something too wide, or drawing nothing at all. -+ * Let's draw something. -+ */ -+ pen_width = 1; -+ } - pen = ExtCreatePen(pen_style, -- scale * style->line_width, -+ pen_width, - &brush, - style->num_dashes, - dash_array); - if (pen == NULL) - return _cairo_win32_print_gdi_error ("_win32_surface_stroke:ExtCreatePen"); - obj = SelectObject (surface->dc, pen); - if (obj == NULL) - return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SelectObject"); diff --git a/gfx/cairo/win32-avoid-extend-pad-fallback.patch b/gfx/cairo/win32-avoid-extend-pad-fallback.patch deleted file mode 100644 index b04282ce9..000000000 --- a/gfx/cairo/win32-avoid-extend-pad-fallback.patch +++ /dev/null @@ -1,109 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -1114,17 +1114,17 @@ static cairo_int_status_t - cairo_win32_surface_t *dst = abstract_dst; - cairo_win32_surface_t *src; - cairo_surface_pattern_t *src_surface_pattern; - int alpha; - double scalex, scaley; - cairo_fixed_t x0_fixed, y0_fixed; - cairo_int_status_t status; - -- cairo_bool_t needs_alpha, needs_scale, needs_repeat; -+ cairo_bool_t needs_alpha, needs_scale, needs_repeat, needs_pad; - cairo_image_surface_t *src_image = NULL; - - cairo_format_t src_format; - cairo_rectangle_int_t src_extents; - - cairo_rectangle_int_t src_r = { src_x, src_y, width, height }; - cairo_rectangle_int_t dst_r = { dst_x, dst_y, width, height }; - -@@ -1145,17 +1145,18 @@ static cairo_int_status_t - { - goto UNSUPPORTED; - } - - if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) - goto UNSUPPORTED; - - if (pattern->extend != CAIRO_EXTEND_NONE && -- pattern->extend != CAIRO_EXTEND_REPEAT) -+ pattern->extend != CAIRO_EXTEND_REPEAT && -+ pattern->extend != CAIRO_EXTEND_PAD) - goto UNSUPPORTED; - - if (mask_pattern) { - /* FIXME: When we fully support RENDER style 4-channel - * masks we need to check r/g/b != 1.0. - */ - if (mask_pattern->type != CAIRO_PATTERN_TYPE_SOLID) - return CAIRO_INT_STATUS_UNSUPPORTED; -@@ -1252,16 +1253,17 @@ static cairo_int_status_t - - /* If the src rectangle doesn't wholly lie within the src extents, - * fudge things. We really need to do fixup on the unpainted - * region -- e.g. the SOURCE operator is broken for areas outside - * of the extents, because it won't clear that area to transparent - * black. - */ - -+ needs_pad = FALSE; - if (pattern->extend != CAIRO_EXTEND_REPEAT) { - needs_repeat = FALSE; - - /* If the src rect and the extents of the source image don't overlap at all, - * we can't do anything useful here. - */ - if (src_r.x > src_extents.width || src_r.y > src_extents.height || - (src_r.x + src_r.width) < 0 || (src_r.y + src_r.height) < 0) -@@ -1273,40 +1275,48 @@ static cairo_int_status_t - - if (src_r.x < 0) { - src_r.width += src_r.x; - - dst_r.width += src_r.x; - dst_r.x -= src_r.x; - - src_r.x = 0; -+ needs_pad = TRUE; - } - - if (src_r.y < 0) { - src_r.height += src_r.y; - - dst_r.height += src_r.y; - dst_r.y -= src_r.y; - - src_r.y = 0; -+ needs_pad = TRUE; - } - - if (src_r.x + src_r.width > src_extents.width) { - src_r.width = src_extents.width - src_r.x; - dst_r.width = src_r.width; -+ needs_pad = TRUE; - } - - if (src_r.y + src_r.height > src_extents.height) { - src_r.height = src_extents.height - src_r.y; - dst_r.height = src_r.height; -+ needs_pad = TRUE; - } - } else { - needs_repeat = TRUE; - } - -+ if (pattern->extend == CAIRO_EXTEND_PAD && needs_pad) { -+ goto UNSUPPORTED; -+ } -+ - /* - * Operations that we can do: - * - * AlphaBlend uses the following formula for alpha when not use the per-pixel alpha (AlphaFormat = 0) - * Dst.Alpha = Src.Alpha * (SCA/255.0) + Dst.Alpha * (1.0 - (SCA/255.0)) - * This turns into Dst.Alpha = Src.Alpha when SCA = 255. - * (http://msdn.microsoft.com/en-us/library/aa921335.aspx) - * diff --git a/gfx/cairo/win32-canvas-glyph-position.patch b/gfx/cairo/win32-canvas-glyph-position.patch deleted file mode 100644 index 4ed10596c..000000000 --- a/gfx/cairo/win32-canvas-glyph-position.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-font.c b/gfx/cairo/cairo/src/cairo-win32-font.c ---- a/gfx/cairo/cairo/src/cairo-win32-font.c -+++ b/gfx/cairo/cairo/src/cairo-win32-font.c -@@ -1182,22 +1182,22 @@ _add_glyph (cairo_glyph_state_t *state, - if (state->glyphs.num_elements > 0) { - int dx; - - if (logical_y != state->last_y) { - status = _flush_glyphs (state); - if (status) - return status; - state->start_x = logical_x; -+ } else { -+ dx = logical_x - state->last_x; -+ status = _cairo_array_append (&state->dx, &dx); -+ if (status) -+ return status; - } -- -- dx = logical_x - state->last_x; -- status = _cairo_array_append (&state->dx, &dx); -- if (status) -- return status; - } else { - state->start_x = logical_x; - } - - state->last_x = logical_x; - state->last_y = logical_y; - - status = _cairo_array_append (&state->glyphs, &glyph_index); diff --git a/gfx/cairo/win32-cleartype-clipping.patch b/gfx/cairo/win32-cleartype-clipping.patch deleted file mode 100644 index 839e94039..000000000 --- a/gfx/cairo/win32-cleartype-clipping.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-font.c b/gfx/cairo/cairo/src/cairo-win32-font.c ---- a/gfx/cairo/cairo/src/cairo-win32-font.c -+++ b/gfx/cairo/cairo/src/cairo-win32-font.c -@@ -986,6 +986,19 @@ _cairo_win32_scaled_font_init_glyph_metr - &metrics, 0, NULL, &matrix) == GDI_ERROR) { - status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_init_glyph_metrics:GetGlyphOutlineW"); - memset (&metrics, 0, sizeof (GLYPHMETRICS)); -+ } else { -+ if (metrics.gmBlackBoxX > 0 && scaled_font->base.options.antialias != CAIRO_ANTIALIAS_NONE) { -+ /* The bounding box reported by Windows supposedly contains the glyph's "black" area; -+ * however, antialiasing (especially with ClearType) means that the actual image that -+ * needs to be rendered may "bleed" into the adjacent pixels, mainly on the right side. -+ * To avoid clipping the glyphs when drawn by _cairo_surface_fallback_show_glyphs, -+ * for example, or other code that uses glyph extents to determine the area to update, -+ * we add a pixel of "slop" to left side of the nominal "black" area returned by GDI, -+ * and two pixels to the right (as tests show some glyphs bleed into this column). -+ */ -+ metrics.gmptGlyphOrigin.x -= 1; -+ metrics.gmBlackBoxX += 3; -+ } - } - cairo_win32_scaled_font_done_font (&scaled_font->base); - if (status) diff --git a/gfx/cairo/win32-composite-src-mod.patch b/gfx/cairo/win32-composite-src-mod.patch deleted file mode 100644 index f2f99940a..000000000 --- a/gfx/cairo/win32-composite-src-mod.patch +++ /dev/null @@ -1,44 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -928,16 +928,19 @@ _cairo_win32_surface_composite_inner (ca - return _composite_alpha_blend (dst, src, alpha, - src_r.x, src_r.y, src_r.width, src_r.height, - dst_r.x, dst_r.y, dst_r.width, dst_r.height); - } - - return CAIRO_STATUS_SUCCESS; - } - -+/* from pixman-private.h */ -+#define MOD(a,b) ((a) < 0 ? ((b) - ((-(a) - 1) % (b))) - 1 : (a) % (b)) -+ - static cairo_int_status_t - _cairo_win32_surface_composite (cairo_operator_t op, - cairo_pattern_t *pattern, - cairo_pattern_t *mask_pattern, - void *abstract_dst, - int src_x, - int src_y, - int mask_x, -@@ -1209,18 +1212,18 @@ _cairo_win32_surface_composite (cairo_op - /* If we need to repeat, we turn the repeated blit into - * a bunch of piece-by-piece blits. - */ - if (needs_repeat) { - cairo_rectangle_int_t piece_src_r, piece_dst_r; - uint32_t rendered_width = 0, rendered_height = 0; - uint32_t to_render_height, to_render_width; - int32_t piece_x, piece_y; -- int32_t src_start_x = src_r.x % src_extents.width; -- int32_t src_start_y = src_r.y % src_extents.height; -+ int32_t src_start_x = MOD(src_r.x, src_extents.width); -+ int32_t src_start_y = MOD(src_r.y, src_extents.height); - - if (needs_scale) - goto UNSUPPORTED; - - /* If both the src and dest have an image, we may as well fall - * back, because it will be faster than our separate blits. - * Our blit code will be fastest when the src is a DDB and the - * destination is a DDB. diff --git a/gfx/cairo/win32-d3dsurface9.patch b/gfx/cairo/win32-d3dsurface9.patch deleted file mode 100644 index b0e80252f..000000000 --- a/gfx/cairo/win32-d3dsurface9.patch +++ /dev/null @@ -1,465 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-rename.h b/gfx/cairo/cairo/src/cairo-rename.h ---- a/gfx/cairo/cairo/src/cairo-rename.h -+++ b/gfx/cairo/cairo/src/cairo-rename.h -@@ -335,16 +335,17 @@ - #define cairo_win32_font_face_create_for_logfontw_hfont _moz_cairo_win32_font_face_create_for_logfontw_hfont - #define cairo_win32_printing_surface_create _moz_cairo_win32_printing_surface_create - #define cairo_win32_scaled_font_done_font _moz_cairo_win32_scaled_font_done_font - #define cairo_win32_scaled_font_get_device_to_logical _moz_cairo_win32_scaled_font_get_device_to_logical - #define cairo_win32_scaled_font_get_logical_to_device _moz_cairo_win32_scaled_font_get_logical_to_device - #define cairo_win32_scaled_font_get_metrics_factor _moz_cairo_win32_scaled_font_get_metrics_factor - #define cairo_win32_scaled_font_select_font _moz_cairo_win32_scaled_font_select_font - #define cairo_win32_surface_create _moz_cairo_win32_surface_create -+#define cairo_win32_surface_create_with_d3dsurface9 _moz_cairo_win32_surface_create_with_d3dsurface9 - #define cairo_win32_surface_create_with_ddb _moz_cairo_win32_surface_create_with_ddb - #define cairo_win32_surface_create_with_dib _moz_cairo_win32_surface_create_with_dib - #define cairo_win32_surface_get_dc _moz_cairo_win32_surface_get_dc - #define cairo_win32_surface_get_image _moz_cairo_win32_surface_get_image - #define cairo_xcb_surface_create _moz_cairo_xcb_surface_create - #define cairo_xcb_surface_create_for_bitmap _moz_cairo_xcb_surface_create_for_bitmap - #define cairo_xcb_surface_create_with_xrender_format _moz_cairo_xcb_surface_create_with_xrender_format - #define cairo_xcb_surface_set_size _moz_cairo_xcb_surface_set_size -diff --git a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c -@@ -1852,16 +1852,17 @@ cairo_win32_printing_surface_create (HDC - } - - _cairo_surface_clipper_init (&surface->clipper, - _cairo_win32_printing_surface_clipper_intersect_clip_path); - - surface->image = NULL; - surface->format = CAIRO_FORMAT_RGB24; - surface->content = CAIRO_CONTENT_COLOR_ALPHA; -+ surface->d3d9surface = NULL; - - surface->dc = hdc; - surface->bitmap = NULL; - surface->is_dib = FALSE; - surface->saved_dc_bitmap = NULL; - surface->brush = NULL; - surface->old_brush = NULL; - surface->font_subsets = _cairo_scaled_font_subsets_create_scaled (); -diff --git a/gfx/cairo/cairo/src/cairo-win32-private.h b/gfx/cairo/cairo/src/cairo-win32-private.h ---- a/gfx/cairo/cairo/src/cairo-win32-private.h -+++ b/gfx/cairo/cairo/src/cairo-win32-private.h -@@ -54,16 +54,18 @@ CAIRO_BEGIN_DECLS - - typedef struct _cairo_win32_surface { - cairo_surface_t base; - - cairo_format_t format; - - HDC dc; - -+ struct IDirect3DSurface9 *d3d9surface; -+ - /* We create off-screen surfaces as DIBs or DDBs, based on what we created - * originally*/ - HBITMAP bitmap; - cairo_bool_t is_dib; - - /* Used to save the initial 1x1 monochrome bitmap for the DC to - * select back into the DC before deleting the DC and our - * bitmap. For Windows XP, this doesn't seem to be necessary -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -54,16 +54,17 @@ - #include "cairo-win32-private.h" - #include "cairo-scaled-font-subsets-private.h" - #include "cairo-surface-fallback-private.h" - #include "cairo-surface-clipper-private.h" - #include "cairo-gstate-private.h" - #include "cairo-private.h" - #include <wchar.h> - #include <windows.h> -+#include <d3d9.h> - - #if defined(__MINGW32__) && !defined(ETO_PDY) - # define ETO_PDY 0x2000 - #endif - - #undef DEBUG_COMPOSITE - - /* for older SDKs */ -@@ -384,16 +385,17 @@ static cairo_surface_t * - - surface->image = cairo_image_surface_create_for_data (bits, format, - width, height, rowstride); - status = surface->image->status; - if (status) - goto FAIL; - - surface->format = format; -+ surface->d3d9surface = NULL; - - surface->clip_rect.x = 0; - surface->clip_rect.y = 0; - surface->clip_rect.width = width; - surface->clip_rect.height = height; - - surface->initial_clip_rgn = NULL; - surface->had_simple_clip = FALSE; -@@ -481,26 +483,73 @@ cairo_status_t - if (surface->bitmap) { - SelectObject (surface->dc, surface->saved_dc_bitmap); - DeleteObject (surface->bitmap); - DeleteDC (surface->dc); - } else { - _cairo_win32_restore_initial_clip (surface); - } - -+ if (surface->d3d9surface) { -+ IDirect3DSurface9_ReleaseDC (surface->d3d9surface, surface->dc); -+ IDirect3DSurface9_Release (surface->d3d9surface); -+ } -+ - if (surface->initial_clip_rgn) - DeleteObject (surface->initial_clip_rgn); - - if (surface->font_subsets != NULL) - _cairo_scaled_font_subsets_destroy (surface->font_subsets); - - return CAIRO_STATUS_SUCCESS; - } - - static cairo_status_t -+_cairo_win32_surface_d3d9_lock_rect (cairo_win32_surface_t *surface, -+ int x, -+ int y, -+ int width, -+ int height, -+ cairo_image_surface_t **local_out) -+{ -+ cairo_image_surface_t *local; -+ cairo_int_status_t status; -+ -+ RECT rectin = { x, y, x+width, y+height }; -+ D3DLOCKED_RECT rectout; -+ HRESULT hr; -+ hr = IDirect3DSurface9_ReleaseDC (surface->d3d9surface, surface->dc); -+ hr = IDirect3DSurface9_LockRect (surface->d3d9surface, -+ &rectout, &rectin, 0); -+ surface->dc = 0; // Don't use the DC when this is locked! -+ if (hr) { -+ IDirect3DSurface9_GetDC (surface->d3d9surface, &surface->dc); -+ return CAIRO_INT_STATUS_UNSUPPORTED; -+ } -+ local = cairo_image_surface_create_for_data (rectout.pBits, -+ surface->format, -+ width, height, -+ rectout.Pitch); -+ if (local == NULL) { -+ IDirect3DSurface9_UnlockRect (surface->d3d9surface); -+ IDirect3DSurface9_GetDC (surface->d3d9surface, &surface->dc); -+ return CAIRO_INT_STATUS_UNSUPPORTED; -+ } -+ if (local->base.status) { -+ IDirect3DSurface9_UnlockRect (surface->d3d9surface); -+ IDirect3DSurface9_GetDC (surface->d3d9surface, &surface->dc); -+ return local->base.status; -+ } -+ -+ *local_out = local; -+ -+ return CAIRO_STATUS_SUCCESS; -+} -+ -+static cairo_status_t - _cairo_win32_surface_get_subimage (cairo_win32_surface_t *surface, - int x, - int y, - int width, - int height, - cairo_win32_surface_t **local_out) - { - cairo_win32_surface_t *local; -@@ -599,17 +648,16 @@ static void - } - - static cairo_status_t - _cairo_win32_surface_acquire_source_image (void *abstract_surface, - cairo_image_surface_t **image_out, - void **image_extra) - { - cairo_win32_surface_t *surface = abstract_surface; -- cairo_win32_surface_t *local; - cairo_status_t status; - - if (!surface->image && !surface->is_dib && surface->bitmap && - (surface->flags & CAIRO_WIN32_SURFACE_CAN_CONVERT_TO_DIB) != 0) - { - /* This is a DDB, and we're being asked to use it as a source for - * something that we couldn't support natively. So turn it into - * a DIB, so that we have an equivalent image surface, as long -@@ -619,69 +667,109 @@ static cairo_status_t - } - - if (surface->image) { - *image_out = (cairo_image_surface_t *)surface->image; - *image_extra = NULL; - return CAIRO_STATUS_SUCCESS; - } - -- status = _cairo_win32_surface_get_subimage (abstract_surface, 0, 0, -- surface->extents.width, -- surface->extents.height, &local); -- if (status) -- return status; -- -- *image_out = (cairo_image_surface_t *)local->image; -- *image_extra = local; -+ if (surface->d3d9surface) { -+ cairo_image_surface_t *local; -+ status = _cairo_win32_surface_d3d9_lock_rect (abstract_surface, 0, 0, -+ surface->extents.width, -+ surface->extents.height, &local); -+ if (status) -+ return status; -+ -+ *image_out = local; -+ *image_extra = surface; -+ } else { -+ cairo_win32_surface_t *local; -+ status = _cairo_win32_surface_get_subimage (abstract_surface, 0, 0, -+ surface->extents.width, -+ surface->extents.height, &local); -+ if (status) -+ return status; -+ -+ *image_out = (cairo_image_surface_t *)local->image; -+ *image_extra = local; -+ } -+ // image_extra is always of type cairo_win32_surface_t. For d3d9surface it points -+ // to the original surface to get back the d3d9surface and properly unlock. -+ - return CAIRO_STATUS_SUCCESS; - } - - static void - _cairo_win32_surface_release_source_image (void *abstract_surface, - cairo_image_surface_t *image, - void *image_extra) - { -+ cairo_win32_surface_t *surface = abstract_surface; - cairo_win32_surface_t *local = image_extra; - -- if (local) -+ if (local && local->d3d9surface) { -+ IDirect3DSurface9_UnlockRect (local->d3d9surface); -+ IDirect3DSurface9_GetDC (local->d3d9surface, &local->dc); -+ cairo_surface_destroy ((cairo_surface_t *)image); -+ } else { - cairo_surface_destroy ((cairo_surface_t *)local); -+ } - } - - static cairo_status_t - _cairo_win32_surface_acquire_dest_image (void *abstract_surface, - cairo_rectangle_int_t *interest_rect, - cairo_image_surface_t **image_out, - cairo_rectangle_int_t *image_rect, - void **image_extra) - { - cairo_win32_surface_t *surface = abstract_surface; -- cairo_win32_surface_t *local = NULL; - cairo_status_t status; - - if (surface->image) { - GdiFlush(); - - *image_out = (cairo_image_surface_t *) surface->image; - *image_extra = NULL; - *image_rect = surface->extents; - return CAIRO_STATUS_SUCCESS; - } - -- status = _cairo_win32_surface_get_subimage (abstract_surface, -+ if (surface->d3d9surface) { -+ cairo_image_surface_t *local = NULL; -+ status = _cairo_win32_surface_d3d9_lock_rect (abstract_surface, - interest_rect->x, - interest_rect->y, - interest_rect->width, -- interest_rect->height, -- &local); -- if (status) -- return status; -- -- *image_out = (cairo_image_surface_t *) local->image; -- *image_extra = local; -+ interest_rect->height, &local); -+ -+ if (status) -+ return status; -+ -+ *image_out = local; -+ *image_extra = surface; -+ } else { -+ cairo_win32_surface_t *local = NULL; -+ status = _cairo_win32_surface_get_subimage (abstract_surface, -+ interest_rect->x, -+ interest_rect->y, -+ interest_rect->width, -+ interest_rect->height, &local); -+ -+ if (status) -+ return status; -+ -+ *image_out = (cairo_image_surface_t *) local->image; -+ *image_extra = local; -+ } -+ // image_extra is always of type cairo_win32_surface_t. For d3d9surface it points -+ // to the original surface to get back the d3d9surface and properly unlock. -+ - *image_rect = *interest_rect; - return CAIRO_STATUS_SUCCESS; - } - - static void - _cairo_win32_surface_release_dest_image (void *abstract_surface, - cairo_rectangle_int_t *interest_rect, - cairo_image_surface_t *image, -@@ -689,29 +777,37 @@ static void - void *image_extra) - { - cairo_win32_surface_t *surface = abstract_surface; - cairo_win32_surface_t *local = image_extra; - - if (!local) - return; - -- /* clear any clip that's currently set on the surface -- so that we can blit uninhibited. */ -- _cairo_win32_surface_set_clip_region (surface, NULL); -- -- if (!BitBlt (surface->dc, -- image_rect->x, image_rect->y, -- image_rect->width, image_rect->height, -- local->dc, -- 0, 0, -- SRCCOPY)) -- _cairo_win32_print_gdi_error ("_cairo_win32_surface_release_dest_image"); -- -- cairo_surface_destroy ((cairo_surface_t *)local); -+ if (local->d3d9surface) { -+ IDirect3DSurface9_UnlockRect (local->d3d9surface); -+ IDirect3DSurface9_GetDC (local->d3d9surface, &local->dc); -+ cairo_surface_destroy ((cairo_surface_t *)image); -+ } else { -+ -+ /* clear any clip that's currently set on the surface -+ so that we can blit uninhibited. */ -+ _cairo_win32_surface_set_clip_region (surface, NULL); -+ -+ if (!BitBlt (surface->dc, -+ image_rect->x, image_rect->y, -+ image_rect->width, image_rect->height, -+ local->dc, -+ 0, 0, -+ SRCCOPY)) -+ _cairo_win32_print_gdi_error ("_cairo_win32_surface_release_dest_image"); -+ -+ cairo_surface_destroy ((cairo_surface_t *)local); -+ } -+ - } - - cairo_status_t - _cairo_win32_surface_set_clip_region (void *abstract_surface, - cairo_region_t *region) - { - cairo_win32_surface_t *surface = abstract_surface; - cairo_status_t status = CAIRO_STATUS_SUCCESS; -@@ -1849,16 +1945,17 @@ cairo_win32_surface_create_internal (HDC - free (surface); - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); - } - - surface->clip_region = NULL; - surface->image = NULL; - surface->format = format; - -+ surface->d3d9surface = NULL; - surface->dc = hdc; - surface->bitmap = NULL; - surface->is_dib = FALSE; - surface->saved_dc_bitmap = NULL; - surface->brush = NULL; - surface->old_brush = NULL; - surface->font_subsets = NULL; - -@@ -2009,16 +2106,29 @@ cairo_win32_surface_create_with_ddb (HDC - - FINISH: - if (screen_dc) - ReleaseDC (NULL, screen_dc); - - return (cairo_surface_t*) new_surf; - } - -+cairo_public cairo_surface_t * -+cairo_win32_surface_create_with_d3dsurface9 (IDirect3DSurface9 *surface) -+{ -+ HDC dc; -+ cairo_win32_surface_t *win_surface; -+ -+ IDirect3DSurface9_AddRef (surface); -+ IDirect3DSurface9_GetDC (surface, &dc); -+ win_surface = cairo_win32_surface_create_internal(dc, CAIRO_FORMAT_RGB24); -+ win_surface->d3d9surface = surface; -+ return (cairo_surface_t*) win_surface; -+ -+} - /** - * _cairo_surface_is_win32: - * @surface: a #cairo_surface_t - * - * Checks if a surface is a win32 surface. This will - * return False if this is a win32 printing surface; use - * _cairo_surface_is_win32_printing() to check for that. - * -diff --git a/gfx/cairo/cairo/src/cairo-win32.h b/gfx/cairo/cairo/src/cairo-win32.h ---- a/gfx/cairo/cairo/src/cairo-win32.h -+++ b/gfx/cairo/cairo/src/cairo-win32.h -@@ -59,17 +59,16 @@ cairo_win32_surface_create_with_ddb (HDC hdc, - cairo_format_t format, - int width, - int height); - - cairo_public cairo_surface_t * - cairo_win32_surface_create_with_dib (cairo_format_t format, - int width, - int height); -- - cairo_public HDC - cairo_win32_surface_get_dc (cairo_surface_t *surface); - - cairo_public HDC - cairo_win32_get_dc_with_clip (cairo_t *cr); - - cairo_public cairo_surface_t * - cairo_win32_surface_get_image (cairo_surface_t *surface); -@@ -143,16 +142,21 @@ cairo_dwrite_scaled_font_get_force_GDI_classic(cairo_scaled_font_t *dwrite_scale - void - cairo_dwrite_set_cleartype_params(FLOAT gamma, FLOAT contrast, FLOAT level, int geometry, int mode); - - int - cairo_dwrite_get_cleartype_rendering_mode(); - - #endif /* CAIRO_HAS_DWRITE_FONT */ - -+struct IDirect3DSurface9; -+cairo_public cairo_surface_t * -+cairo_win32_surface_create_with_d3dsurface9 (struct IDirect3DSurface9 *surface); -+ -+ - #if CAIRO_HAS_D2D_SURFACE - - struct _cairo_device - { - int type; - int refcount; - }; - diff --git a/gfx/cairo/win32-ddb-dib.patch b/gfx/cairo/win32-ddb-dib.patch deleted file mode 100644 index a520d6e10..000000000 --- a/gfx/cairo/win32-ddb-dib.patch +++ /dev/null @@ -1,181 +0,0 @@ -b=455513; add optional flag to allow converting a DDB to a DIB internally, if the surface is every used as a source; r=jmuizelaar - -If a DDB is used as a source for an operation that can't be handled -natively by GDI, we end up needing to take a really slow path (creating a -temporary surface for acquire_source) for each operation. If we convert -the DDB to a DIB, we then end up having a real image buffer and can hand -things off to pixman directly. - -This isn't the default mode because I'm not sure if there are cases where a -DDB is explicitly needed (e.g. for printing), and it would change -current cairo behaviour. It might become the default at some point in the -future. - -diff --git a/gfx/cairo/cairo/src/cairo-win32-private.h b/gfx/cairo/cairo/src/cairo-win32-private.h ---- a/gfx/cairo/cairo/src/cairo-win32-private.h -+++ b/gfx/cairo/cairo/src/cairo-win32-private.h -@@ -117,6 +117,9 @@ - - /* Whether we can use the CHECKJPEGFORMAT escape function */ - CAIRO_WIN32_SURFACE_CAN_CHECK_PNG = (1<<8), -+ -+ /* if this DDB surface can be converted to a DIB if necessary */ -+ CAIRO_WIN32_SURFACE_CAN_CONVERT_TO_DIB = (1<<9), - }; - - cairo_status_t -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -560,6 +560,56 @@ - return CAIRO_STATUS_SUCCESS; - } - -+static void -+_cairo_win32_convert_ddb_to_dib (cairo_win32_surface_t *surface) -+{ -+ cairo_win32_surface_t *new_surface; -+ int width = surface->extents.width; -+ int height = surface->extents.height; -+ -+ BOOL ok; -+ HBITMAP oldbitmap; -+ -+ new_surface = (cairo_win32_surface_t*) -+ _cairo_win32_surface_create_for_dc (surface->dc, -+ surface->format, -+ width, -+ height); -+ -+ if (new_surface->base.status) -+ return; -+ -+ /* DDB can't be 32bpp, so BitBlt is safe */ -+ ok = BitBlt (new_surface->dc, -+ 0, 0, width, height, -+ surface->dc, -+ 0, 0, SRCCOPY); -+ -+ if (!ok) -+ goto out; -+ -+ /* Now swap around new_surface and surface's internal bitmap -+ * pointers. */ -+ DeleteDC (new_surface->dc); -+ new_surface->dc = NULL; -+ -+ oldbitmap = SelectObject (surface->dc, new_surface->bitmap); -+ DeleteObject (oldbitmap); -+ -+ surface->image = new_surface->image; -+ surface->is_dib = new_surface->is_dib; -+ surface->bitmap = new_surface->bitmap; -+ -+ new_surface->bitmap = NULL; -+ new_surface->image = NULL; -+ -+ /* Finally update flags */ -+ surface->flags = _cairo_win32_flags_for_dc (surface->dc); -+ -+ out: -+ cairo_surface_destroy ((cairo_surface_t*)new_surface); -+} -+ - static cairo_status_t - _cairo_win32_surface_acquire_source_image (void *abstract_surface, - cairo_image_surface_t **image_out, -@@ -568,6 +618,17 @@ - cairo_win32_surface_t *surface = abstract_surface; - cairo_win32_surface_t *local = NULL; - cairo_status_t status; -+ -+ if (!surface->image && !surface->is_dib && surface->bitmap && -+ (surface->flags & CAIRO_WIN32_SURFACE_CAN_CONVERT_TO_DIB) != 0) -+ { -+ /* This is a DDB, and we're being asked to use it as a source for -+ * something that we couldn't support natively. So turn it into -+ * a DIB, so that we have an equivalent image surface, as long -+ * as we're allowed to via flags. -+ */ -+ _cairo_win32_convert_ddb_to_dib (surface); -+ } - - if (surface->image) { - *image_out = (cairo_image_surface_t *)surface->image; -@@ -2133,3 +2194,61 @@ - free(rd); - fflush (stderr); - } -+ -+/** -+ * cairo_win32_surface_set_can_convert_to_dib -+ * @surface: a #cairo_surface_t -+ * @can_convert: a #cairo_bool_t indicating whether this surface can -+ * be coverted to a DIB if necessary -+ * -+ * A DDB surface with this flag set can be converted to a DIB if it's -+ * used as a source in a way that GDI can't natively handle; for -+ * example, drawing a RGB24 DDB onto an ARGB32 DIB. Doing this -+ * conversion results in a significant speed optimization, because we -+ * can call on pixman to perform the operation natively, instead of -+ * reading the data from the DC each time. -+ * -+ * Return value: %CAIRO_STATUS_SUCCESS if the flag was successfully -+ * changed, or an error otherwise. -+ * -+ */ -+cairo_status_t -+cairo_win32_surface_set_can_convert_to_dib (cairo_surface_t *asurface, cairo_bool_t can_convert) -+{ -+ cairo_win32_surface_t *surface = (cairo_win32_surface_t*) asurface; -+ if (surface->base.type != CAIRO_SURFACE_TYPE_WIN32) -+ return CAIRO_STATUS_SURFACE_TYPE_MISMATCH; -+ -+ if (surface->bitmap) { -+ if (can_convert) -+ surface->flags |= CAIRO_WIN32_SURFACE_CAN_CONVERT_TO_DIB; -+ else -+ surface->flags &= ~CAIRO_WIN32_SURFACE_CAN_CONVERT_TO_DIB; -+ } -+ -+ return CAIRO_STATUS_SUCCESS; -+} -+ -+/** -+ * cairo_win32_surface_get_can_convert_to_dib -+ * @surface: a #cairo_surface_t -+ * @can_convert: a #cairo_bool_t* that receives the return value -+ * -+ * Returns the value of the flag indicating whether the surface can be -+ * converted to a DIB if necessary, as set by -+ * cairo_win32_surface_set_can_convert_to_dib. -+ * -+ * Return value: %CAIRO_STATUS_SUCCESS if the flag was successfully -+ * retreived, or an error otherwise. -+ * -+ */ -+cairo_status_t -+cairo_win32_surface_get_can_convert_to_dib (cairo_surface_t *asurface, cairo_bool_t *can_convert) -+{ -+ cairo_win32_surface_t *surface = (cairo_win32_surface_t*) asurface; -+ if (surface->base.type != CAIRO_SURFACE_TYPE_WIN32) -+ return CAIRO_STATUS_SURFACE_TYPE_MISMATCH; -+ -+ *can_convert = ((surface->flags & CAIRO_WIN32_SURFACE_CAN_CONVERT_TO_DIB) != 0); -+ return CAIRO_STATUS_SUCCESS; -+} -diff --git a/gfx/cairo/cairo/src/cairo-win32.h b/gfx/cairo/cairo/src/cairo-win32.h ---- a/gfx/cairo/cairo/src/cairo-win32.h -+++ b/gfx/cairo/cairo/src/cairo-win32.h -@@ -68,6 +68,12 @@ cairo_win32_surface_get_dc (cairo_surface_t *surface); - cairo_public cairo_surface_t * - cairo_win32_surface_get_image (cairo_surface_t *surface); - -+cairo_public cairo_status_t -+cairo_win32_surface_set_can_convert_to_dib (cairo_surface_t *surface, cairo_bool_t can_convert); -+ -+cairo_public cairo_status_t -+cairo_win32_surface_get_can_convert_to_dib (cairo_surface_t *surface, cairo_bool_t *can_convert); -+ - #if CAIRO_HAS_WIN32_FONT - diff --git a/gfx/cairo/win32-ffs-gcc.patch b/gfx/cairo/win32-ffs-gcc.patch deleted file mode 100644 index e7cc1d1f6..000000000 --- a/gfx/cairo/win32-ffs-gcc.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-compiler-private.h b/gfx/cairo/cairo/src/cairo-compiler-private.h -index ffac9ce..9a05831 100644 ---- a/gfx/cairo/cairo/src/cairo-compiler-private.h -+++ b/gfx/cairo/cairo/src/cairo-compiler-private.h -@@ -229,16 +229,20 @@ ffs (int x) - - if (_BitScanForward(&i, x) != 0) - return i + 1; - - return 0; - } - #endif - -+#elif defined(__WIN32__) && defined(__GNUC__) -+ -+#define ffs(x) __builtin_ffs(x) -+ - #endif - - #if defined(_MSC_VER) && defined(_M_IX86) - /* When compiling with /Gy and /OPT:ICF identical functions will be folded in together. - The CAIRO_ENSURE_UNIQUE macro ensures that a function is always unique and - will never be folded into another one. Something like this might eventually - be needed for GCC but it seems fine for now. */ - #define CAIRO_ENSURE_UNIQUE \ diff --git a/gfx/cairo/win32-gdi-font-cache-no-HFONT.patch b/gfx/cairo/win32-gdi-font-cache-no-HFONT.patch deleted file mode 100644 index fe93095ae..000000000 --- a/gfx/cairo/win32-gdi-font-cache-no-HFONT.patch +++ /dev/null @@ -1,145 +0,0 @@ -# HG changeset patch -# User Robert O'Callahan <robert@ocallahan.org> -# Date 1357107533 -46800 -# Node ID ed54dfdd2facb11a4d4158138b460a31de45e9f7 -# Parent ab6457cc16ec14ea07386dcfc57cad6b8a9ac55d -Bug 717178. Part 3 alternative: don't put Win32 cairo_font_face_ts into the font-face cache if they were created with an explicit HFONT. r=jrmuizel - -diff --git a/gfx/cairo/cairo/src/cairo-win32-font.c b/gfx/cairo/cairo/src/cairo-win32-font.c ---- a/gfx/cairo/cairo/src/cairo-win32-font.c -+++ b/gfx/cairo/cairo/src/cairo-win32-font.c -@@ -1941,16 +1942,21 @@ const cairo_font_face_backend_t _cairo_w - * The primary purpose of this mapping is to provide unique - * #cairo_font_face_t values so that our cache and mapping from - * #cairo_font_face_t => #cairo_scaled_font_t works. Once the - * corresponding #cairo_font_face_t objects fall out of downstream - * caches, we don't need them in this hash table anymore. - * - * Modifications to this hash table are protected by - * _cairo_win32_font_face_mutex. -+ * -+ * Only #cairo_font_face_t values with null 'hfont' (no -+ * HFONT preallocated by caller) are stored in this table. We rely -+ * on callers to manage the lifetime of the HFONT, and they can't -+ * do that if we share #cairo_font_face_t values with other callers. - */ - - static cairo_hash_table_t *cairo_win32_font_face_hash_table = NULL; - - static int - _cairo_win32_font_face_keys_equal (const void *key_a, - const void *key_b); - -@@ -2036,22 +2042,24 @@ static int - } - - static void - _cairo_win32_font_face_destroy (void *abstract_face) - { - cairo_hash_table_t *hash_table; - cairo_win32_font_face_t *font_face = abstract_face; - -- hash_table = _cairo_win32_font_face_hash_table_lock (); -- if (unlikely (hash_table == NULL)) { -- return; -+ if (!font_face->hfont) { -+ hash_table = _cairo_win32_font_face_hash_table_lock (); -+ if (unlikely (hash_table == NULL)) { -+ return; -+ } -+ _cairo_hash_table_remove (hash_table, &font_face->base.hash_entry); -+ _cairo_win32_font_face_hash_table_unlock (); - } -- _cairo_hash_table_remove (hash_table, &font_face->base.hash_entry); -- _cairo_win32_font_face_hash_table_unlock (); - } - - /** - * cairo_win32_font_face_create_for_logfontw_hfont: - * @logfont: A #LOGFONTW structure specifying the font to use. - * If @font is %NULL then the lfHeight, lfWidth, lfOrientation and lfEscapement - * fields of this structure are ignored. Otherwise lfWidth, lfOrientation and - * lfEscapement must be zero. -@@ -2070,55 +2078,63 @@ static void - **/ - cairo_font_face_t * - cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font) - { - cairo_win32_font_face_t *font_face, key; - cairo_hash_table_t *hash_table; - cairo_status_t status; - -- hash_table = _cairo_win32_font_face_hash_table_lock (); -- if (unlikely (hash_table == NULL)) { -- _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); -- return (cairo_font_face_t *)&_cairo_font_face_nil; -- } -+ if (!font) { -+ hash_table = _cairo_win32_font_face_hash_table_lock (); -+ if (unlikely (hash_table == NULL)) { -+ _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); -+ return (cairo_font_face_t *)&_cairo_font_face_nil; -+ } - -- _cairo_win32_font_face_init_key (&key, logfont, font); -+ _cairo_win32_font_face_init_key (&key, logfont, font); - -- /* Return existing unscaled font if it exists in the hash table. */ -- font_face = _cairo_hash_table_lookup (hash_table, -- &key.base.hash_entry); -- if (font_face != NULL) { -- cairo_font_face_reference (&font_face->base); -- goto DONE; -+ /* Return existing unscaled font if it exists in the hash table. */ -+ font_face = _cairo_hash_table_lookup (hash_table, -+ &key.base.hash_entry); -+ if (font_face != NULL) { -+ cairo_font_face_reference (&font_face->base); -+ goto DONE; -+ } - } - - /* Otherwise create it and insert into hash table. */ - font_face = malloc (sizeof (cairo_win32_font_face_t)); - if (!font_face) { - _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); - goto FAIL; - } - - _cairo_win32_font_face_init_key (font_face, logfont, font); - _cairo_font_face_init (&font_face->base, &_cairo_win32_font_face_backend); -+ assert (font_face->base.hash_entry.hash == key.base.hash_entry.hash); - -- assert (font_face->base.hash_entry.hash == key.base.hash_entry.hash); -- status = _cairo_hash_table_insert (hash_table, -- &font_face->base.hash_entry); -- if (unlikely (status)) -- goto FAIL; -+ if (!font) { -+ status = _cairo_hash_table_insert (hash_table, -+ &font_face->base.hash_entry); -+ if (unlikely (status)) -+ goto FAIL; -+ } - - DONE: -- _cairo_win32_font_face_hash_table_unlock (); -+ if (!font) { -+ _cairo_win32_font_face_hash_table_unlock (); -+ } - - return &font_face->base; - - FAIL: -- _cairo_win32_font_face_hash_table_unlock (); -+ if (!font) { -+ _cairo_win32_font_face_hash_table_unlock (); -+ } - - return (cairo_font_face_t *)&_cairo_font_face_nil; - } - - /** - * cairo_win32_font_face_create_for_logfontw: - * @logfont: A #LOGFONTW structure specifying the font to use. - * The lfHeight, lfWidth, lfOrientation and lfEscapement diff --git a/gfx/cairo/win32-gdi-font-cache.patch b/gfx/cairo/win32-gdi-font-cache.patch deleted file mode 100644 index e082a2e4d..000000000 --- a/gfx/cairo/win32-gdi-font-cache.patch +++ /dev/null @@ -1,375 +0,0 @@ -# HG changeset patch -# User Andrea Canciani <ranma42@gmail.com>, Adrian Johnson <ajohnson@redneon.com> -# Date 1354838294 -46800 -# Node ID 390df735b9d5c5ba07a4d3fe9ca2ebc9e7626a78 -# Parent e30a5b6a5a003b85fc1ca8b76719a56ef59d976e -Bug 717178. Part 2: Import changesets eb29a25d, 6e3e3291 and 101fab7c from upstream. -====== - -From 101fab7cd8a90f7cf3d8113c792b3f8c2a9afb7d Mon Sep 17 00:00:00 2001 -From: Andrea Canciani <ranma42@gmail.com> -Date: Wed, 15 Jun 2011 09:37:36 +0000 -Subject: win32-font: Improve static data reset function - -The hashtable is guaranteed to only contain font faces which are -currently referenced, hence there is no need to remove any font face -when it is reset (just like for toy-font). - -This makes the function simpler and fixes the assertion - -Assertion failed: predicate != NULL, file cairo-hash.c, line 373 - -hit by multiple tests (the first one being "clear"). - -See https://bugs.freedesktop.org/show_bug.cgi?id=38049 - -====== - -From eb29a25dd6dddc511388bf883c9b95843ecdb823 Mon Sep 17 00:00:00 2001 -From: Adrian Johnson <ajohnson@redneon.com> -Date: Tue, 16 Nov 2010 13:18:39 +0000 -Subject: win32: Use a font_face hash table to provide unique font faces - -Similar to the freetype and toy font backends, use a hash table -to map logfont,hfont to font faces. - -This fixes the multiple embedding of the same font in PDF. - -https://bugs.freedesktop.org/show_bug.cgi?id=24849 - -====== - -From 6e3e329170ab4b96bc0d587c8071e869e228e758 Mon Sep 17 00:00:00 2001 -From: Adrian Johnson <ajohnson@redneon.com> -Date: Thu, 18 Nov 2010 12:37:45 +0000 -Subject: win32: fix font_face hashing - -some bugs were discovered while testing with firefox - -====== - -diff --git a/gfx/cairo/cairo/src/cairo-debug.c b/gfx/cairo/cairo/src/cairo-debug.c ---- a/gfx/cairo/cairo/src/cairo-debug.c -+++ b/gfx/cairo/cairo/src/cairo-debug.c -@@ -64,16 +64,20 @@ cairo_debug_reset_static_data (void) - _cairo_scaled_font_map_destroy (); - - _cairo_toy_font_face_reset_static_data (); - - #if CAIRO_HAS_FT_FONT - _cairo_ft_font_reset_static_data (); - #endif - -+#if CAIRO_HAS_WIN32_FONT -+ _cairo_win32_font_reset_static_data (); -+#endif -+ - _cairo_intern_string_reset_static_data (); - - _cairo_scaled_font_reset_static_data (); - - _cairo_pattern_reset_static_data (); - - _cairo_clip_reset_static_data (); - -diff --git a/gfx/cairo/cairo/src/cairo-mutex-list-private.h b/gfx/cairo/cairo/src/cairo-mutex-list-private.h ---- a/gfx/cairo/cairo/src/cairo-mutex-list-private.h -+++ b/gfx/cairo/cairo/src/cairo-mutex-list-private.h -@@ -46,16 +46,20 @@ CAIRO_MUTEX_DECLARE (_cairo_intern_strin - CAIRO_MUTEX_DECLARE (_cairo_scaled_font_map_mutex) - CAIRO_MUTEX_DECLARE (_cairo_scaled_glyph_page_cache_mutex) - CAIRO_MUTEX_DECLARE (_cairo_scaled_font_error_mutex) - - #if CAIRO_HAS_FT_FONT - CAIRO_MUTEX_DECLARE (_cairo_ft_unscaled_font_map_mutex) - #endif - -+#if CAIRO_HAS_WIN32_FONT -+CAIRO_MUTEX_DECLARE (_cairo_win32_font_face_mutex) -+#endif -+ - #if CAIRO_HAS_XLIB_SURFACE - CAIRO_MUTEX_DECLARE (_cairo_xlib_display_mutex) - #endif - - #if CAIRO_HAS_XCB_SURFACE - CAIRO_MUTEX_DECLARE (_cairo_xcb_connections_mutex) - #endif - -diff --git a/gfx/cairo/cairo/src/cairo-win32-font.c b/gfx/cairo/cairo/src/cairo-win32-font.c ---- a/gfx/cairo/cairo/src/cairo-win32-font.c -+++ b/gfx/cairo/cairo/src/cairo-win32-font.c -@@ -42,16 +42,18 @@ - # define _WIN32_WINNT 0x0500 - #endif - - #include "cairoint.h" - - #include "cairo-win32-private.h" - #include "cairo-error-private.h" - -+#include <wchar.h> -+ - #ifndef SPI_GETFONTSMOOTHINGTYPE - #define SPI_GETFONTSMOOTHINGTYPE 0x200a - #endif - #ifndef FE_FONTSMOOTHINGCLEARTYPE - #define FE_FONTSMOOTHINGCLEARTYPE 2 - #endif - #ifndef CLEARTYPE_QUALITY - #define CLEARTYPE_QUALITY 5 -@@ -1887,19 +1889,17 @@ struct _cairo_win32_font_face { - cairo_font_face_t base; - LOGFONTW logfont; - HFONT hfont; - }; - - /* implement the platform-specific interface */ - - static void --_cairo_win32_font_face_destroy (void *abstract_face) --{ --} -+_cairo_win32_font_face_destroy (void *abstract_face); - - static cairo_bool_t - _is_scale (const cairo_matrix_t *matrix, double scale) - { - return matrix->xx == scale && matrix->yy == scale && - matrix->xy == 0. && matrix->yx == 0. && - matrix->x0 == 0. && matrix->y0 == 0.; - } -@@ -1932,16 +1932,128 @@ static cairo_status_t - - const cairo_font_face_backend_t _cairo_win32_font_face_backend = { - CAIRO_FONT_TYPE_WIN32, - _cairo_win32_font_face_create_for_toy, - _cairo_win32_font_face_destroy, - _cairo_win32_font_face_scaled_font_create - }; - -+/* We maintain a hash table from LOGFONT,HFONT => #cairo_font_face_t. -+ * The primary purpose of this mapping is to provide unique -+ * #cairo_font_face_t values so that our cache and mapping from -+ * #cairo_font_face_t => #cairo_scaled_font_t works. Once the -+ * corresponding #cairo_font_face_t objects fall out of downstream -+ * caches, we don't need them in this hash table anymore. -+ * -+ * Modifications to this hash table are protected by -+ * _cairo_win32_font_face_mutex. -+ */ -+ -+static cairo_hash_table_t *cairo_win32_font_face_hash_table = NULL; -+ -+static int -+_cairo_win32_font_face_keys_equal (const void *key_a, -+ const void *key_b); -+ -+static void -+_cairo_win32_font_face_hash_table_destroy (void) -+{ -+ cairo_hash_table_t *hash_table; -+ -+ /* We manually acquire the lock rather than calling -+ * _cairo_win32_font_face_hash_table_lock simply to avoid creating -+ * the table only to destroy it again. */ -+ CAIRO_MUTEX_LOCK (_cairo_win32_font_face_mutex); -+ hash_table = cairo_win32_font_face_hash_table; -+ cairo_win32_font_face_hash_table = NULL; -+ CAIRO_MUTEX_UNLOCK (_cairo_win32_font_face_mutex); -+ -+ if (hash_table != NULL) -+ _cairo_hash_table_destroy (hash_table); -+} -+ -+static cairo_hash_table_t * -+_cairo_win32_font_face_hash_table_lock (void) -+{ -+ CAIRO_MUTEX_LOCK (_cairo_win32_font_face_mutex); -+ -+ if (unlikely (cairo_win32_font_face_hash_table == NULL)) -+ { -+ cairo_win32_font_face_hash_table = -+ _cairo_hash_table_create (_cairo_win32_font_face_keys_equal); -+ -+ if (unlikely (cairo_win32_font_face_hash_table == NULL)) { -+ CAIRO_MUTEX_UNLOCK (_cairo_win32_font_face_mutex); -+ _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); -+ return NULL; -+ } -+ } -+ -+ return cairo_win32_font_face_hash_table; -+} -+ -+static void -+_cairo_win32_font_face_hash_table_unlock (void) -+{ -+ CAIRO_MUTEX_UNLOCK (_cairo_win32_font_face_mutex); -+} -+ -+static void -+_cairo_win32_font_face_init_key (cairo_win32_font_face_t *key, -+ LOGFONTW *logfont, -+ HFONT font) -+{ -+ unsigned long hash = _CAIRO_HASH_INIT_VALUE; -+ -+ key->logfont = *logfont; -+ key->hfont = font; -+ -+ hash = _cairo_hash_bytes (0, logfont->lfFaceName, 2*wcslen(logfont->lfFaceName)); -+ hash = _cairo_hash_bytes (hash, &logfont->lfWeight, sizeof(logfont->lfWeight)); -+ hash = _cairo_hash_bytes (hash, &logfont->lfItalic, sizeof(logfont->lfItalic)); -+ -+ key->base.hash_entry.hash = hash; -+} -+ -+static int -+_cairo_win32_font_face_keys_equal (const void *key_a, -+ const void *key_b) -+{ -+ const cairo_win32_font_face_t *face_a = key_a; -+ const cairo_win32_font_face_t *face_b = key_b; -+ -+ if (face_a->logfont.lfWeight == face_b->logfont.lfWeight && -+ face_a->logfont.lfItalic == face_b->logfont.lfItalic && -+ face_a->logfont.lfUnderline == face_b->logfont.lfUnderline && -+ face_a->logfont.lfStrikeOut == face_b->logfont.lfStrikeOut && -+ face_a->logfont.lfCharSet == face_b->logfont.lfCharSet && -+ face_a->logfont.lfOutPrecision == face_b->logfont.lfOutPrecision && -+ face_a->logfont.lfClipPrecision == face_b->logfont.lfClipPrecision && -+ face_a->logfont.lfPitchAndFamily == face_b->logfont.lfPitchAndFamily && -+ (wcscmp (face_a->logfont.lfFaceName, face_b->logfont.lfFaceName) == 0)) -+ return TRUE; -+ else -+ return FALSE; -+} -+ -+static void -+_cairo_win32_font_face_destroy (void *abstract_face) -+{ -+ cairo_hash_table_t *hash_table; -+ cairo_win32_font_face_t *font_face = abstract_face; -+ -+ hash_table = _cairo_win32_font_face_hash_table_lock (); -+ if (unlikely (hash_table == NULL)) { -+ return; -+ } -+ _cairo_hash_table_remove (hash_table, &font_face->base.hash_entry); -+ _cairo_win32_font_face_hash_table_unlock (); -+} -+ - /** - * cairo_win32_font_face_create_for_logfontw_hfont: - * @logfont: A #LOGFONTW structure specifying the font to use. - * If @font is %NULL then the lfHeight, lfWidth, lfOrientation and lfEscapement - * fields of this structure are ignored. Otherwise lfWidth, lfOrientation and - * lfEscapement must be zero. - * @font: An #HFONT that can be used when the font matrix is a scale by - * -lfHeight and the CTM is identity. -@@ -1954,30 +2066,61 @@ const cairo_font_face_backend_t _cairo_w - * and can be used with functions such as cairo_win32_scaled_font_select_font(). - * - * Return value: a newly created #cairo_font_face_t. Free with - * cairo_font_face_destroy() when you are done using it. - **/ - cairo_font_face_t * - cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font) - { -- cairo_win32_font_face_t *font_face; -+ cairo_win32_font_face_t *font_face, key; -+ cairo_hash_table_t *hash_table; -+ cairo_status_t status; - -+ hash_table = _cairo_win32_font_face_hash_table_lock (); -+ if (unlikely (hash_table == NULL)) { -+ _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); -+ return (cairo_font_face_t *)&_cairo_font_face_nil; -+ } -+ -+ _cairo_win32_font_face_init_key (&key, logfont, font); -+ -+ /* Return existing unscaled font if it exists in the hash table. */ -+ font_face = _cairo_hash_table_lookup (hash_table, -+ &key.base.hash_entry); -+ if (font_face != NULL) { -+ cairo_font_face_reference (&font_face->base); -+ goto DONE; -+ } -+ -+ /* Otherwise create it and insert into hash table. */ - font_face = malloc (sizeof (cairo_win32_font_face_t)); - if (!font_face) { - _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); -- return (cairo_font_face_t *)&_cairo_font_face_nil; -+ goto FAIL; - } - -- font_face->logfont = *logfont; -- font_face->hfont = font; -- -+ _cairo_win32_font_face_init_key (font_face, logfont, font); - _cairo_font_face_init (&font_face->base, &_cairo_win32_font_face_backend); - -+ assert (font_face->base.hash_entry.hash == key.base.hash_entry.hash); -+ status = _cairo_hash_table_insert (hash_table, -+ &font_face->base.hash_entry); -+ if (unlikely (status)) -+ goto FAIL; -+ -+DONE: -+ _cairo_win32_font_face_hash_table_unlock (); -+ - return &font_face->base; -+ -+FAIL: -+ _cairo_win32_font_face_hash_table_unlock (); -+ -+ return (cairo_font_face_t *)&_cairo_font_face_nil; - } - - /** - * cairo_win32_font_face_create_for_logfontw: - * @logfont: A #LOGFONTW structure specifying the font to use. - * The lfHeight, lfWidth, lfOrientation and lfEscapement - * fields of this structure are ignored. - * -@@ -2176,8 +2319,14 @@ cairo_win32_scaled_font_get_device_to_lo - cairo_win32_scaled_font_t *win_font = (cairo_win32_scaled_font_t *)scaled_font; - if (! _cairo_scaled_font_is_win32 (scaled_font)) { - _cairo_error_throw (CAIRO_STATUS_FONT_TYPE_MISMATCH); - cairo_matrix_init_identity (device_to_logical); - return; - } - *device_to_logical = win_font->device_to_logical; - } -+ -+void -+_cairo_win32_font_reset_static_data (void) -+{ -+ _cairo_win32_font_face_hash_table_destroy (); -+} -diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h ---- a/gfx/cairo/cairo/src/cairoint.h -+++ b/gfx/cairo/cairo/src/cairoint.h -@@ -403,16 +403,19 @@ cairo_private void - _cairo_reset_static_data (void); - - cairo_private void - _cairo_toy_font_face_reset_static_data (void); - - cairo_private void - _cairo_ft_font_reset_static_data (void); - -+cairo_private void -+_cairo_win32_font_reset_static_data (void); -+ - /* the font backend interface */ - - struct _cairo_unscaled_font_backend { - void (*destroy) (void *unscaled_font); - }; - - /* #cairo_toy_font_face_t - simple family/slant/weight font faces used for - * the built-in font API diff --git a/gfx/cairo/win32-inline-cpp-keyword.patch b/gfx/cairo/win32-inline-cpp-keyword.patch deleted file mode 100644 index 4b6f542d7..000000000 --- a/gfx/cairo/win32-inline-cpp-keyword.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-compiler-private.h b/gfx/cairo/cairo/src/cairo-compiler-private.h ---- a/gfx/cairo/cairo/src/cairo-compiler-private.h -+++ b/gfx/cairo/cairo/src/cairo-compiler-private.h -@@ -205,18 +205,20 @@ - #if (defined(__WIN32__) && !defined(__WINE__)) || defined(_MSC_VER) - #define snprintf _snprintf - #define popen _popen - #define pclose _pclose - #define hypot _hypot - #endif - - #ifdef _MSC_VER -+#ifndef __cplusplus - #undef inline - #define inline __inline -+#endif - - /* there are currently linkage problems that arise when trying to include intrin.h in c++: - * D:\sdks\v7.0\include\winnt.h(3674) : error C2733: second C linkage of overloaded function '_interlockedbittestandset' not allowed - * so avoid defining ffs in c++ code for now */ - #ifndef __cplusplus - /* Add a definition of ffs */ - #include <intrin.h> - #pragma intrinsic(_BitScanForward) diff --git a/gfx/cairo/win32-logical-font-scale.patch b/gfx/cairo/win32-logical-font-scale.patch deleted file mode 100644 index 02d812be3..000000000 --- a/gfx/cairo/win32-logical-font-scale.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -r e10a8066a62c gfx/cairo/cairo/src/cairo-win32-private.h ---- a/gfx/cairo/cairo/src/cairo-win32-private.h Fri Jun 08 17:39:38 2007 -0700 -+++ b/gfx/cairo/cairo/src/cairo-win32-private.h Fri Jun 29 09:14:35 2007 +0200 -@@ -46,7 +46,7 @@ - #define SB_NONE 0 - #endif - --#define WIN32_FONT_LOGICAL_SCALE 32 -+#define WIN32_FONT_LOGICAL_SCALE 1 - - typedef struct _cairo_win32_surface { - cairo_surface_t base; diff --git a/gfx/cairo/win32-printing-axis-swap.patch b/gfx/cairo/win32-printing-axis-swap.patch deleted file mode 100644 index 87a1a91e4..000000000 --- a/gfx/cairo/win32-printing-axis-swap.patch +++ /dev/null @@ -1,292 +0,0 @@ -# HG changeset patch -# User Lee Salzman <lsalzman@mozilla.com> -# Date 1445463645 14400 -# Wed Oct 21 17:40:45 2015 -0400 -# Node ID 9e84563cbd73c5b0993dfd018ca25b660b667e94 -# Parent 2d3fd51c4182c253a2f102655e8e9e466032853f -workaround for Windows printer drivers that can't handle swapped X and Y axes - -diff --git a/gfx/cairo/cairo/src/cairo-matrix.c b/gfx/cairo/cairo/src/cairo-matrix.c ---- a/gfx/cairo/cairo/src/cairo-matrix.c -+++ b/gfx/cairo/cairo/src/cairo-matrix.c -@@ -873,42 +873,56 @@ cairo_bool_t - (Note that the minor axis length is at the minimum of the above solution, - which is just sqrt ( f - sqrt(g² + h²) ) given the symmetry of (D)). - - - For another derivation of the same result, using Singular Value Decomposition, - see doc/tutorial/src/singular.c. - */ - --/* determine the length of the major axis of a circle of the given radius -- after applying the transformation matrix. */ --double --_cairo_matrix_transformed_circle_major_axis (const cairo_matrix_t *matrix, -- double radius) -+/* determine the length of the major and minor axes of a circle of the given -+ radius after applying the transformation matrix. */ -+void -+_cairo_matrix_transformed_circle_axes (const cairo_matrix_t *matrix, -+ double radius, -+ double *major, -+ double *minor) - { -- double a, b, c, d, f, g, h, i, j; -+ double a, b, c, d, f, g, h, i, j, k; - - _cairo_matrix_get_affine (matrix, - &a, &b, - &c, &d, - NULL, NULL); - - i = a*a + b*b; - j = c*c + d*d; -+ k = a*c + b*d; - - f = 0.5 * (i + j); - g = 0.5 * (i - j); -- h = a*c + b*d; -+ h = hypot (g, k); - -- return radius * sqrt (f + hypot (g, h)); -+ if (major) -+ *major = radius * sqrt (f + h); -+ if (minor) -+ *minor = radius * sqrt (f - h); -+} - -- /* -- * we don't need the minor axis length, which is -- * double min = radius * sqrt (f - sqrt (g*g+h*h)); -- */ -+/* determine the length of the major axis of a circle of the given radius -+ after applying the transformation matrix. */ -+double -+_cairo_matrix_transformed_circle_major_axis (const cairo_matrix_t *matrix, -+ double radius) -+{ -+ double major; -+ -+ _cairo_matrix_transformed_circle_axes (matrix, radius, &major, NULL); -+ -+ return major; - } - - void - _cairo_matrix_to_pixman_matrix (const cairo_matrix_t *matrix, - pixman_transform_t *pixman_transform, - double xc, - double yc) - { -diff --git a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-printing-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-printing-surface.c -@@ -610,16 +610,17 @@ static cairo_status_t - int x_tile, y_tile, left, right, top, bottom; - RECT clip; - const cairo_color_t *background_color; - const unsigned char *mime_data; - unsigned long mime_size; - cairo_image_info_t mime_info; - cairo_bool_t use_mime; - DWORD mime_type; -+ cairo_bool_t axis_swap; - - /* If we can't use StretchDIBits with this surface, we can't do anything - * here. - */ - if (!(surface->flags & CAIRO_WIN32_SURFACE_CAN_STRETCHDIB)) - return CAIRO_INT_STATUS_UNSUPPORTED; - - if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) -@@ -658,39 +659,65 @@ static cairo_status_t - &mime_size, - &mime_info); - } - if (_cairo_status_is_error (status)) - return status; - - use_mime = (status == CAIRO_STATUS_SUCCESS); - -- if (!use_mime && image->format != CAIRO_FORMAT_RGB24) { -+ m = pattern->base.matrix; -+ status = cairo_matrix_invert (&m); -+ /* _cairo_pattern_set_matrix guarantees invertibility */ -+ assert (status == CAIRO_STATUS_SUCCESS); -+ cairo_matrix_multiply (&m, &m, &surface->ctm); -+ cairo_matrix_multiply (&m, &m, &surface->gdi_ctm); -+ /* Check if the matrix swaps the X and Y axes by checking if the diagonal -+ * is effectively zero. This can happen, for example, if it was composed -+ * with a rotation such as a landscape transform. Some printing devices -+ * don't support such transforms in StretchDIBits. -+ */ -+ axis_swap = fabs (m.xx*image->width) < 1 && fabs (m.yy*image->height) < 1; -+ -+ if (!use_mime && (image->format != CAIRO_FORMAT_RGB24 || axis_swap)) { - cairo_surface_t *opaque_surface; - cairo_surface_pattern_t image_pattern; - cairo_solid_pattern_t background_pattern; -+ int width = image->width, height = image->height; - -+ if (axis_swap) { -+ width = image->height; -+ height = image->width; -+ } - opaque_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, -- image->width, -- image->height); -+ width, -+ height); - if (opaque_surface->status) { - status = opaque_surface->status; - goto CLEANUP_OPAQUE_IMAGE; - } - -- _cairo_pattern_init_solid (&background_pattern, -- background_color); -- status = _cairo_surface_paint (opaque_surface, -- CAIRO_OPERATOR_SOURCE, -- &background_pattern.base, -- NULL); -- if (status) -- goto CLEANUP_OPAQUE_IMAGE; -+ if (image->format != CAIRO_FORMAT_RGB24) { -+ _cairo_pattern_init_solid (&background_pattern, -+ background_color); -+ status = _cairo_surface_paint (opaque_surface, -+ CAIRO_OPERATOR_SOURCE, -+ &background_pattern.base, -+ NULL); -+ if (status) -+ goto CLEANUP_OPAQUE_IMAGE; -+ } - - _cairo_pattern_init_for_surface (&image_pattern, &image->base); -+ if (axis_swap) { -+ /* swap the X and Y axes to undo the axis swap in the matrix */ -+ cairo_matrix_t swap_xy = { 0, 1, 1, 0, 0, 0 }; -+ cairo_pattern_set_matrix (&image_pattern.base, &swap_xy); -+ cairo_matrix_multiply (&m, &swap_xy, &m); -+ } - status = _cairo_surface_paint (opaque_surface, - CAIRO_OPERATOR_OVER, - &image_pattern.base, - NULL); - _cairo_pattern_fini (&image_pattern.base); - if (status) - goto CLEANUP_OPAQUE_IMAGE; - -@@ -706,23 +733,16 @@ static cairo_status_t - bi.bmiHeader.biXPelsPerMeter = PELS_72DPI; - bi.bmiHeader.biYPelsPerMeter = PELS_72DPI; - bi.bmiHeader.biPlanes = 1; - bi.bmiHeader.biBitCount = 32; - bi.bmiHeader.biCompression = use_mime ? mime_type : BI_RGB; - bi.bmiHeader.biClrUsed = 0; - bi.bmiHeader.biClrImportant = 0; - -- m = pattern->base.matrix; -- status = cairo_matrix_invert (&m); -- /* _cairo_pattern_set_matrix guarantees invertibility */ -- assert (status == CAIRO_STATUS_SUCCESS); -- -- cairo_matrix_multiply (&m, &m, &surface->gdi_ctm); -- cairo_matrix_multiply(&m, &m, &surface->ctm); - SaveDC (surface->dc); - _cairo_matrix_to_win32_xform (&m, &xform); - - if (! SetWorldTransform (surface->dc, &xform)) { - status = _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_paint_image_pattern"); - goto CLEANUP_OPAQUE_IMAGE; - } - -@@ -1260,16 +1280,17 @@ static cairo_int_status_t - DWORD pen_width; - DWORD *dash_array; - HGDIOBJ obj; - unsigned int i; - cairo_solid_pattern_t clear; - cairo_matrix_t mat; - double scale; - double scaled_width; -+ double major, minor; - - status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (status) - return status; - - if (op == CAIRO_OPERATOR_CLEAR) { - _cairo_win32_printing_surface_init_clear_color (surface, &clear); - source = (cairo_pattern_t*) &clear; -@@ -1350,22 +1371,40 @@ static cairo_int_status_t - if (status) - return status; - - /* - * Switch to user space to set line parameters - */ - SaveDC (surface->dc); - -- _cairo_matrix_to_win32_xform (&mat, &xform); -- xform.eDx = 0.0f; -- xform.eDy = 0.0f; -+ /* Some printers don't handle transformed strokes. Avoid the transform -+ * if not required for the pen shape. Use the SVD here to find the major -+ * and minor scales then check if they differ by more than 1 device unit. -+ * If the difference is smaller, then just treat the scaling as uniform. -+ * This check ignores rotations as the pen shape is symmetric before -+ * transformation. -+ */ -+ _cairo_matrix_transformed_circle_axes (&mat, scale, &major, &minor); -+ if (fabs (major - minor) > 1) { -+ /* Check if the matrix swaps the X and Y axes such that the diagonal -+ * is nearly zero. This was observed to cause problems with XPS export. -+ */ -+ if (fabs (mat.xx) < 1e-6 && fabs (mat.yy) < 1e-6) { -+ /* swap the X and Y axes to undo the axis swap in the matrix */ -+ cairo_matrix_t swap_xy = { 0, 1, 1, 0, 0, 0 }; -+ cairo_matrix_multiply (&mat, &swap_xy, &mat); -+ } -+ _cairo_matrix_to_win32_xform (&mat, &xform); -+ xform.eDx = 0.0f; -+ xform.eDy = 0.0f; - -- if (!ModifyWorldTransform (surface->dc, &xform, MWT_LEFTMULTIPLY)) -- return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SetWorldTransform"); -+ if (!ModifyWorldTransform (surface->dc, &xform, MWT_LEFTMULTIPLY)) -+ return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SetWorldTransform"); -+ } - - if (source->type == CAIRO_PATTERN_TYPE_SOLID) { - StrokePath (surface->dc); - } else { - if (!WidenPath (surface->dc)) - return _cairo_win32_print_gdi_error ("_win32_surface_stroke:WidenPath"); - if (!SelectClipPath (surface->dc, RGN_AND)) - return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SelectClipPath"); -diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h ---- a/gfx/cairo/cairo/src/cairoint.h -+++ b/gfx/cairo/cairo/src/cairoint.h -@@ -2115,16 +2115,22 @@ cairo_private cairo_bool_t - int *itx, int *ity); - - cairo_private cairo_bool_t - _cairo_matrix_has_unity_scale (const cairo_matrix_t *matrix); - - cairo_private cairo_bool_t - _cairo_matrix_is_pixel_exact (const cairo_matrix_t *matrix) cairo_pure; - -+cairo_private void -+_cairo_matrix_transformed_circle_axes (const cairo_matrix_t *matrix, -+ double radius, -+ double *major, -+ double *minor); -+ - cairo_private double - _cairo_matrix_transformed_circle_major_axis (const cairo_matrix_t *matrix, - double radius) cairo_pure; - - cairo_private void - _cairo_matrix_to_pixman_matrix (const cairo_matrix_t *matrix, - pixman_transform_t *pixman_transform, - double xc, diff --git a/gfx/cairo/win32-raster.patch b/gfx/cairo/win32-raster.patch deleted file mode 100644 index 080873121..000000000 --- a/gfx/cairo/win32-raster.patch +++ /dev/null @@ -1,262 +0,0 @@ -changeset: 29338:f2a10f325734 -tag: qtip -tag: tip -tag: win32-raster-mask2.patch -tag: qbase -user: Jeff Muizelaar <jmuizelaar@mozilla.com> -date: Mon Jun 22 14:26:07 2009 -0400 -summary: imported patch win32-raster-mask2.patch - -diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c ---- a/gfx/cairo/cairo/src/cairo-image-surface.c -+++ b/gfx/cairo/cairo/src/cairo-image-surface.c -@@ -1232,27 +1232,27 @@ typedef struct _cairo_image_surface_span - cairo_composite_rectangles_t composite_rectangles; - } cairo_image_surface_span_renderer_t; - --static cairo_status_t --_cairo_image_surface_span_renderer_render_row ( -- void *abstract_renderer, -+void -+_cairo_image_surface_span_render_row ( - int y, - const cairo_half_open_span_t *spans, -- unsigned num_spans) -+ unsigned num_spans, -+ cairo_image_surface_t *mask, -+ const cairo_composite_rectangles_t *rects) - { -- cairo_image_surface_span_renderer_t *renderer = abstract_renderer; -- int xmin = renderer->composite_rectangles.mask.x; -- int xmax = xmin + renderer->composite_rectangles.width; -+ int xmin = rects->mask.x; -+ int xmax = xmin + rects->width; - uint8_t *row; - int prev_x = xmin; - int prev_alpha = 0; - unsigned i; - - /* Make sure we're within y-range. */ -- y -= renderer->composite_rectangles.mask.y; -- if (y < 0 || y >= renderer->composite_rectangles.height) -+ y -= rects->mask.y; -+ if (y < 0 || y >= rects->height) - return CAIRO_STATUS_SUCCESS; - -- row = (uint8_t*)(renderer->mask->data) + y*(size_t)renderer->mask->stride - xmin; -+ row = (uint8_t*)(mask->data) + y*(size_t)mask->stride - xmin; - - /* Find the first span within x-range. */ - for (i=0; i < num_spans && spans[i].x < xmin; i++) {} -@@ -1286,7 +1286,17 @@ _cairo_image_surface_span_renderer_rende - if (prev_alpha != 0 && prev_x < xmax) { - memset(row + prev_x, prev_alpha, xmax - prev_x); - } -+} - -+static cairo_status_t -+_cairo_image_surface_span_renderer_render_row ( -+ void *abstract_renderer, -+ int y, -+ const cairo_half_open_span_t *spans, -+ unsigned num_spans) -+{ -+ cairo_image_surface_span_renderer_t *renderer = abstract_renderer; -+ _cairo_image_surface_span_render_row (y, spans, num_spans, renderer->mask, &renderer->composite_rectangles); - return CAIRO_STATUS_SUCCESS; - } - -diff --git a/gfx/cairo/cairo/src/cairo-tor-scan-converter.c b/gfx/cairo/cairo/src/cairo-tor-scan-converter.c ---- a/gfx/cairo/cairo/src/cairo-tor-scan-converter.c -+++ b/gfx/cairo/cairo/src/cairo-tor-scan-converter.c -@@ -295,9 +295,9 @@ typedef int grid_area_t; - #elif GRID_XY == 15 - # define GRID_AREA_TO_ALPHA(c) (((c) << 4) + (c)) - #elif GRID_XY == 2*256*15 --# define GRID_AREA_TO_ALPHA(c) (((c) + ((c)<<4)) >> 9) -+# define GRID_AREA_TO_ALPHA(c) (((c) + ((c)<<4) + 256) >> 9) - #else --# define GRID_AREA_TO_ALPHA(c) ((c)*255 / GRID_XY) /* tweak me for rounding */ -+# define GRID_AREA_TO_ALPHA(c) (((c)*255 + GRID_XY/2) / GRID_XY) - #endif - - #define UNROLL3(x) x x x -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -2048,6 +2048,148 @@ _cairo_win32_surface_reset (void *abstra - return CAIRO_STATUS_SUCCESS; - } - -+typedef struct _cairo_win32_surface_span_renderer { -+ cairo_span_renderer_t base; -+ -+ cairo_operator_t op; -+ const cairo_pattern_t *pattern; -+ cairo_antialias_t antialias; -+ -+ cairo_image_surface_t *mask; -+ cairo_win32_surface_t *dst; -+ -+ cairo_composite_rectangles_t composite_rectangles; -+} cairo_win32_surface_span_renderer_t; -+ -+static cairo_status_t -+_cairo_win32_surface_span_renderer_render_row ( -+ void *abstract_renderer, -+ int y, -+ const cairo_half_open_span_t *spans, -+ unsigned num_spans) -+{ -+ cairo_win32_surface_span_renderer_t *renderer = abstract_renderer; -+ _cairo_image_surface_span_render_row (y, spans, num_spans, renderer->mask, &renderer->composite_rectangles); -+ return CAIRO_STATUS_SUCCESS; -+} -+ -+static void -+_cairo_win32_surface_span_renderer_destroy (void *abstract_renderer) -+{ -+ cairo_win32_surface_span_renderer_t *renderer = abstract_renderer; -+ if (!renderer) return; -+ -+ if (renderer->mask != NULL) -+ cairo_surface_destroy (&renderer->mask->base); -+ -+ free (renderer); -+} -+ -+static cairo_status_t -+_cairo_win32_surface_span_renderer_finish (void *abstract_renderer) -+{ -+ cairo_win32_surface_span_renderer_t *renderer = abstract_renderer; -+ cairo_status_t status = CAIRO_STATUS_SUCCESS; -+ -+ if (renderer->pattern == NULL || renderer->mask == NULL) -+ return CAIRO_STATUS_SUCCESS; -+ -+ status = cairo_surface_status (&renderer->mask->base); -+ if (status == CAIRO_STATUS_SUCCESS) { -+ cairo_composite_rectangles_t *rects = &renderer->composite_rectangles; -+ cairo_win32_surface_t *dst = renderer->dst; -+ cairo_pattern_t *mask_pattern = cairo_pattern_create_for_surface (&renderer->mask->base); -+ /* composite onto the image surface directly if we can */ -+ if (dst->image) { -+ GdiFlush(); -+ -+ status = dst->image->backend->composite (renderer->op, -+ renderer->pattern, mask_pattern, dst->image, -+ rects->src.x, -+ rects->src.y, -+ 0, 0, /* mask.x, mask.y */ -+ rects->dst.x, rects->dst.y, -+ rects->width, rects->height); -+ } else { -+ /* otherwise go through the fallback_composite path which -+ * will do the appropriate surface acquisition */ -+ status = _cairo_surface_fallback_composite ( -+ renderer->op, -+ renderer->pattern, mask_pattern, dst, -+ rects->src.x, -+ rects->src.y, -+ 0, 0, /* mask.x, mask.y */ -+ rects->dst.x, rects->dst.y, -+ rects->width, rects->height); -+ } -+ cairo_pattern_destroy (mask_pattern); -+ -+ } -+ if (status != CAIRO_STATUS_SUCCESS) -+ return _cairo_span_renderer_set_error (abstract_renderer, -+ status); -+ return CAIRO_STATUS_SUCCESS; -+} -+ -+static cairo_bool_t -+_cairo_win32_surface_check_span_renderer (cairo_operator_t op, -+ const cairo_pattern_t *pattern, -+ void *abstract_dst, -+ cairo_antialias_t antialias, -+ const cairo_composite_rectangles_t *rects) -+{ -+ (void) op; -+ (void) pattern; -+ (void) abstract_dst; -+ (void) antialias; -+ (void) rects; -+ return TRUE; -+} -+ -+static cairo_span_renderer_t * -+_cairo_win32_surface_create_span_renderer (cairo_operator_t op, -+ const cairo_pattern_t *pattern, -+ void *abstract_dst, -+ cairo_antialias_t antialias, -+ const cairo_composite_rectangles_t *rects) -+{ -+ cairo_win32_surface_t *dst = abstract_dst; -+ cairo_win32_surface_span_renderer_t *renderer -+ = calloc(1, sizeof(*renderer)); -+ cairo_status_t status; -+ int width = rects->width; -+ int height = rects->height; -+ -+ if (renderer == NULL) -+ return _cairo_span_renderer_create_in_error (CAIRO_STATUS_NO_MEMORY); -+ -+ renderer->base.destroy = _cairo_win32_surface_span_renderer_destroy; -+ renderer->base.finish = _cairo_win32_surface_span_renderer_finish; -+ renderer->base.render_row = -+ _cairo_win32_surface_span_renderer_render_row; -+ renderer->op = op; -+ renderer->pattern = pattern; -+ renderer->antialias = antialias; -+ renderer->dst = dst; -+ -+ renderer->composite_rectangles = *rects; -+ -+ /* TODO: support rendering to A1 surfaces (or: go add span -+ * compositing to pixman.) */ -+ renderer->mask = (cairo_image_surface_t *) -+ cairo_image_surface_create (CAIRO_FORMAT_A8, -+ width, height); -+ -+ status = cairo_surface_status (&renderer->mask->base); -+ -+ if (status != CAIRO_STATUS_SUCCESS) { -+ _cairo_win32_surface_span_renderer_destroy (renderer); -+ return _cairo_span_renderer_create_in_error (status); -+ } -+ return &renderer->base; -+} -+ -+ - static const cairo_surface_backend_t cairo_win32_surface_backend = { - CAIRO_SURFACE_TYPE_WIN32, - _cairo_win32_surface_create_similar, -@@ -2060,8 +2202,8 @@ static const cairo_surface_backend_t cai - _cairo_win32_surface_composite, - _cairo_win32_surface_fill_rectangles, - NULL, /* composite_trapezoids */ -- NULL, /* create_span_renderer */ -- NULL, /* check_span_renderer */ -+ _cairo_win32_surface_create_span_renderer, -+ _cairo_win32_surface_check_span_renderer, - NULL, /* copy_page */ - NULL, /* show_page */ - _cairo_win32_surface_set_clip_region, -diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h ---- a/gfx/cairo/cairo/src/cairoint.h -+++ b/gfx/cairo/cairo/src/cairoint.h -@@ -2193,6 +2193,12 @@ _cairo_image_surface_set_clip_region (vo - cairo_private cairo_image_surface_t * - _cairo_image_surface_coerce (cairo_image_surface_t *surface, - cairo_format_t format); -+cairo_private void -+_cairo_image_surface_span_render_row (int y, -+ const cairo_half_open_span_t *spans, -+ unsigned num_spans, -+ cairo_image_surface_t *mask, -+ const cairo_composite_rectangles_t *rects); - - cairo_private cairo_image_transparency_t - _cairo_image_analyze_transparency (cairo_image_surface_t *image); diff --git a/gfx/cairo/win32-transparent-surface.patch b/gfx/cairo/win32-transparent-surface.patch deleted file mode 100644 index c8765cf28..000000000 --- a/gfx/cairo/win32-transparent-surface.patch +++ /dev/null @@ -1,129 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -1709,40 +1709,23 @@ _cairo_win32_surface_show_glyphs (void - } - #else - return CAIRO_INT_STATUS_UNSUPPORTED; - #endif - } - - #undef STACK_GLYPH_SIZE - --/** -- * cairo_win32_surface_create: -- * @hdc: the DC to create a surface for -- * -- * Creates a cairo surface that targets the given DC. The DC will be -- * queried for its initial clip extents, and this will be used as the -- * size of the cairo surface. The resulting surface will always be of -- * format %CAIRO_FORMAT_RGB24; should you need another surface format, -- * you will need to create one through -- * cairo_win32_surface_create_with_dib(). -- * -- * Return value: the newly created surface -- **/ --cairo_surface_t * --cairo_win32_surface_create (HDC hdc) -+static cairo_surface_t * -+cairo_win32_surface_create_internal (HDC hdc, cairo_format_t format) - { - cairo_win32_surface_t *surface; - -- cairo_format_t format; - RECT rect; - -- /* Assume that everything coming in as a HDC is RGB24 */ -- format = CAIRO_FORMAT_RGB24; -- - surface = malloc (sizeof (cairo_win32_surface_t)); - if (surface == NULL) - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); - - if (_cairo_win32_save_initial_clip (hdc, surface) != CAIRO_STATUS_SUCCESS) { - free (surface); - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); - } -@@ -1765,17 +1748,58 @@ cairo_win32_surface_create (HDC hdc) - surface->extents.width = rect.right - rect.left; - surface->extents.height = rect.bottom - rect.top; - - surface->flags = _cairo_win32_flags_for_dc (surface->dc); - - _cairo_surface_init (&surface->base, &cairo_win32_surface_backend, - _cairo_content_from_format (format)); - -- return (cairo_surface_t *)surface; -+ return &surface->base; -+} -+ -+/** -+ * cairo_win32_surface_create: -+ * @hdc: the DC to create a surface for -+ * -+ * Creates a cairo surface that targets the given DC. The DC will be -+ * queried for its initial clip extents, and this will be used as the -+ * size of the cairo surface. The resulting surface will always be of -+ * format %CAIRO_FORMAT_RGB24; should you need another surface format, -+ * you will need to create one through -+ * cairo_win32_surface_create_with_dib() or call -+ * cairo_win32_surface_create_with_alpha. -+ * -+ * Return value: the newly created surface -+ **/ -+cairo_surface_t * -+cairo_win32_surface_create (HDC hdc) -+{ -+ /* Assume everything comes in as RGB24 */ -+ return cairo_win32_surface_create_internal(hdc, CAIRO_FORMAT_RGB24); -+} -+ -+/** -+ * cairo_win32_surface_create_with_alpha: -+ * @hdc: the DC to create a surface for -+ * -+ * Creates a cairo surface that targets the given DC. The DC will be -+ * queried for its initial clip extents, and this will be used as the -+ * size of the cairo surface. The resulting surface will always be of -+ * format %CAIRO_FORMAT_ARGB32; this format is used when drawing into -+ * transparent windows. -+ * -+ * Return value: the newly created surface -+ * -+ * Since: 1.10 -+ **/ -+cairo_surface_t * -+cairo_win32_surface_create_with_alpha (HDC hdc) -+{ -+ return cairo_win32_surface_create_internal(hdc, CAIRO_FORMAT_ARGB32); - } - - /** - * cairo_win32_surface_create_with_dib: - * @format: format of pixels in the surface to create - * @width: width of the surface, in pixels - * @height: height of the surface, in pixels - * -diff --git a/gfx/cairo/cairo/src/cairo-win32.h b/gfx/cairo/cairo/src/cairo-win32.h ---- a/gfx/cairo/cairo/src/cairo-win32.h -+++ b/gfx/cairo/cairo/src/cairo-win32.h -@@ -44,16 +44,19 @@ - #include <windows.h> - - CAIRO_BEGIN_DECLS - - cairo_public cairo_surface_t * - cairo_win32_surface_create (HDC hdc); - - cairo_public cairo_surface_t * -+cairo_win32_surface_create_with_alpha (HDC hdc); -+ -+cairo_public cairo_surface_t * - cairo_win32_printing_surface_create (HDC hdc); - - cairo_public cairo_surface_t * - cairo_win32_surface_create_with_ddb (HDC hdc, - cairo_format_t format, - int width, - int height); - diff --git a/gfx/cairo/win32-vertically-offset-glyph.patch b/gfx/cairo/win32-vertically-offset-glyph.patch deleted file mode 100644 index ffdf63b4a..000000000 --- a/gfx/cairo/win32-vertically-offset-glyph.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c ---- a/gfx/cairo/cairo/src/cairo-win32-surface.c -+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c -@@ -1742,17 +1742,18 @@ _cairo_win32_surface_show_glyphs (void - - cairo_matrix_transform_point(&device_to_logical, - &next_user_x, &next_user_y); - - next_logical_x = _cairo_lround (next_user_x); - next_logical_y = _cairo_lround (next_user_y); - - dxy_buf[j] = _cairo_lround (next_logical_x - logical_x); -- dxy_buf[j+1] = _cairo_lround (next_logical_y - logical_y); -+ dxy_buf[j+1] = _cairo_lround (logical_y - next_logical_y); -+ /* note that GDI coordinate system is inverted */ - - logical_x = next_logical_x; - logical_y = next_logical_y; - } - } - - /* Using glyph indices for a Type 1 font does not work on a - * printer DC. The win32 printing surface will convert the the diff --git a/gfx/cairo/wrap-source_image.patch b/gfx/cairo/wrap-source_image.patch deleted file mode 100644 index 89da5a08d..000000000 --- a/gfx/cairo/wrap-source_image.patch +++ /dev/null @@ -1,105 +0,0 @@ -Author: Jeff Muizelaar <jmuizelaar@mozilla.com> -diff --git a/src/cairo-surface.c b/src/cairo-surface.c -index 8278694..12f6242 100644 ---- a/src/cairo-surface.c -+++ b/src/cairo-surface.c -@@ -1530,6 +1530,70 @@ _cairo_recording_surface_clone_similar (cairo_surface_t *surface, - return CAIRO_STATUS_SUCCESS; - } - -+struct acquire_source_image_data -+{ -+ cairo_surface_t *src; -+ cairo_image_surface_t *image; -+ void *image_extra; -+}; -+ -+static void -+_wrap_release_source_image (void *data) -+{ -+ struct acquire_source_image_data *acquire_data = data; -+ _cairo_surface_release_source_image (acquire_data->src, -+ acquire_data->image, -+ acquire_data->image_extra); -+ free(data); -+} -+ -+static cairo_status_t -+_wrap_image (cairo_surface_t *src, -+ cairo_image_surface_t *image, -+ void *image_extra, -+ cairo_image_surface_t **out) -+{ -+ static cairo_user_data_key_t wrap_image_key; -+ cairo_image_surface_t *surface; -+ cairo_status_t status; -+ -+ struct acquire_source_image_data *data = malloc (sizeof (*data)); -+ if (unlikely (data == NULL)) -+ return _cairo_error (CAIRO_STATUS_NO_MEMORY); -+ data->src = src; -+ data->image = image; -+ data->image_extra = image_extra; -+ -+ surface = (cairo_image_surface_t *) -+ _cairo_image_surface_create_with_pixman_format (image->data, -+ image->pixman_format, -+ image->width, -+ image->height, -+ image->stride); -+ status = surface->base.status; -+ if (status) { -+ free (data); -+ return status; -+ } -+ -+ status = _cairo_user_data_array_set_data (&surface->base.user_data, -+ &wrap_image_key, -+ data, -+ _wrap_release_source_image); -+ if (status) { -+ cairo_surface_destroy (&surface->base); -+ free (data); -+ return status; -+ } -+ -+ pixman_image_set_component_alpha ( -+ surface->pixman_image, -+ pixman_image_get_component_alpha (surface->pixman_image)); -+ -+ *out = surface; -+ return CAIRO_STATUS_SUCCESS; -+} -+ - /** - * _cairo_surface_clone_similar: - * @surface: a #cairo_surface_t -@@ -1606,15 +1670,19 @@ _cairo_surface_clone_similar (cairo_surface_t *surface, - /* If we failed, try again with an image surface */ - status = _cairo_surface_acquire_source_image (src, &image, &image_extra); - if (status == CAIRO_STATUS_SUCCESS) { -- status = -- surface->backend->clone_similar (surface, &image->base, -- src_x, src_y, -- width, height, -- clone_offset_x, -- clone_offset_y, -- clone_out); -- -- _cairo_surface_release_source_image (src, image, image_extra); -+ status = _wrap_image(src, image, image_extra, &image); -+ if (status != CAIRO_STATUS_SUCCESS) { -+ _cairo_surface_release_source_image (src, image, image_extra); -+ } else { -+ status = -+ surface->backend->clone_similar (surface, &image->base, -+ src_x, src_y, -+ width, height, -+ clone_offset_x, -+ clone_offset_y, -+ clone_out); -+ cairo_surface_destroy(&image->base); -+ } - } - } - } diff --git a/gfx/cairo/xlib-flush-glyphs.patch b/gfx/cairo/xlib-flush-glyphs.patch deleted file mode 100644 index 78a19d0dd..000000000 --- a/gfx/cairo/xlib-flush-glyphs.patch +++ /dev/null @@ -1,66 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface.c b/gfx/cairo/cairo/src/cairo-xlib-surface.c -index f0de3c7..e24c962 100644 ---- a/gfx/cairo/cairo/src/cairo-xlib-surface.c -+++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c -@@ -50,35 +50,36 @@ - #include "cairo-xlib-private.h" - #include "cairo-xlib-surface-private.h" - #include "cairo-clip-private.h" - #include "cairo-error-private.h" - #include "cairo-scaled-font-private.h" - #include "cairo-surface-snapshot-private.h" - #include "cairo-surface-subsurface-private.h" - #include "cairo-region-private.h" -+#include "cairo-xlib-xrender-private.h" - - #include <X11/Xutil.h> /* for XDestroyImage */ -+#include <X11/Xlibint.h> /* for access to XDisplay's innards */ - - #define XLIB_COORD_MAX 32767 - - #define DEBUG 0 - - #if DEBUG - #define UNSUPPORTED(reason) \ - fprintf (stderr, \ - "cairo-xlib: hit unsupported operation %s(), line %d: %s\n", \ - __FUNCTION__, __LINE__, reason), \ - CAIRO_INT_STATUS_UNSUPPORTED - #else - #define UNSUPPORTED(reason) CAIRO_INT_STATUS_UNSUPPORTED - #endif - - #if DEBUG --#include <X11/Xlibint.h> - static void CAIRO_PRINTF_FORMAT (2, 3) - _x_bread_crumb (Display *dpy, - const char *fmt, - ...) - { - xReq *req; - char buf[2048]; - unsigned int len, len_dwords; -@@ -4313,16 +4314,23 @@ _cairo_xlib_surface_add_glyph (cairo_xlib_display_t *display, - } - break; - default: - ASSERT_NOT_REACHED; - break; - } - /* XXX assume X server wants pixman padding. Xft assumes this as well */ - -+ struct _XDisplay *dpy = (struct _XDisplay *) display->display; -+ int req_length = sz_xRenderAddGlyphsReq + 4; -+ if (req_length & 3) -+ req_length += 4 - (req_length & 3); -+ if (dpy->bufptr + req_length > dpy->bufmax) -+ XFlush (display->display); -+ - XRenderAddGlyphs (display->display, glyphset_info->glyphset, - &glyph_index, &glyph_info, 1, - (char *) data, - glyph_surface->stride * glyph_surface->height); - - if (data != glyph_surface->data) - free (data); - diff --git a/gfx/cairo/xlib-glyph-clip-region.patch b/gfx/cairo/xlib-glyph-clip-region.patch deleted file mode 100644 index 50ff7f951..000000000 --- a/gfx/cairo/xlib-glyph-clip-region.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface.c b/gfx/cairo/cairo/src/cairo-xlib-surface.c ---- a/gfx/cairo/cairo/src/cairo-xlib-surface.c -+++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c -@@ -4806,30 +4806,30 @@ static cairo_int_status_t - } - - X_DEBUG ((display->display, "show_glyphs (dst=%x)", (unsigned int) dst->drawable)); - - if (clip_region != NULL && - cairo_region_num_rectangles (clip_region) == 1) - { - cairo_rectangle_int_t glyph_extents; -- const cairo_rectangle_int_t *clip_extents; -+ cairo_rectangle_int_t clip_extents; - - /* Can we do without the clip? - * Around 50% of the time the clip is redundant (firefox). - */ - _cairo_scaled_font_glyph_approximate_extents (scaled_font, - glyphs, num_glyphs, - &glyph_extents); - -- clip_extents = &clip->path->extents; -- if (clip_extents->x <= glyph_extents.x && -- clip_extents->y <= glyph_extents.y && -- clip_extents->x + clip_extents->width >= glyph_extents.x + glyph_extents.width && -- clip_extents->y + clip_extents->height >= glyph_extents.y + glyph_extents.height) -+ cairo_region_get_extents(clip_region, &clip_extents); -+ if (clip_extents.x <= glyph_extents.x && -+ clip_extents.y <= glyph_extents.y && -+ clip_extents.x + clip_extents.width >= glyph_extents.x + glyph_extents.width && -+ clip_extents.y + clip_extents.height >= glyph_extents.y + glyph_extents.height) - { - clip_region = NULL; - } - } - - status = _cairo_xlib_surface_set_clip_region (dst, clip_region); - if (unlikely (status)) - goto BAIL0; diff --git a/gfx/cairo/xlib-initialize-members.patch b/gfx/cairo/xlib-initialize-members.patch deleted file mode 100644 index 0066ceb34..000000000 --- a/gfx/cairo/xlib-initialize-members.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff -r 059e9961a122 gfx/cairo/cairo/src/cairo-xlib-display.c ---- a/gfx/cairo/cairo/src/cairo-xlib-display.c Thu Feb 25 03:59:05 2010 -0800 -+++ b/gfx/cairo/cairo/src/cairo-xlib-display.c Fri Feb 26 16:15:29 2010 +0100 -@@ -259,7 +259,14 @@ - * add our hook. For now, that means Render, so we call into its - * QueryVersion function to ensure it gets initialized. - */ -- XRenderQueryVersion (dpy, &render_major, &render_minor); -+ Status s = XRenderQueryVersion (dpy, &render_major, &render_minor); -+ if (s == 0) { -+ /* XRenderQueryVersion failed, possibly because the server -+ * doesn't have the RENDER extension. Don't leave the version -+ * numbers uninitialised. See #548793. -+ */ -+ render_major = render_minor = 0; -+ } - - codes = XAddExtension (dpy); - if (unlikely (codes == NULL)) { diff --git a/gfx/cairo/zero-sized.patch b/gfx/cairo/zero-sized.patch deleted file mode 100644 index bdd6ca798..000000000 --- a/gfx/cairo/zero-sized.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c -index e9e544d..cde68a1 100644 ---- a/src/cairo-image-surface.c -+++ b/src/cairo-image-surface.c -@@ -324,8 +324,8 @@ _cairo_image_surface_create_with_pixman_format (unsigned char *data, - cairo_surface_t *surface; - pixman_image_t *pixman_image; - -- pixman_image = pixman_image_create_bits (pixman_format, width, height, -- (uint32_t *) data, stride); -+ pixman_image = pixman_image_create_bits (pixman_format, width ? width : 1, height ? height : 1, -+ (uint32_t *) data, stride ? stride : 4); - - if (unlikely (pixman_image == NULL)) - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); -diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c -index f86a133..ddcb600 100644 ---- a/src/cairo-xlib-surface.c -+++ b/src/cairo-xlib-surface.c -@@ -675,7 +675,8 @@ _get_image_surface (cairo_xlib_surface_t *surface, - - pixmap = XCreatePixmap (surface->dpy, - surface->drawable, -- extents.width, extents.height, -+ extents.width <= 0 ? 1 : extents.width, -+ extents.height <= 0 ? 1 : extents.height, - surface->depth); - if (pixmap) { - XCopyArea (surface->dpy, surface->drawable, pixmap, surface->gc, -@@ -686,7 +687,8 @@ _get_image_surface (cairo_xlib_surface_t *surface, - ximage = XGetImage (surface->dpy, - pixmap, - 0, 0, -- extents.width, extents.height, -+ extents.width <= 0 ? 1 : extents.width, -+ extents.height <= 0 ? 1 : extents.height, - AllPlanes, ZPixmap); - - XFreePixmap (surface->dpy, pixmap); diff --git a/gfx/cairo/zombie-face.patch b/gfx/cairo/zombie-face.patch deleted file mode 100644 index a4175fecc..000000000 --- a/gfx/cairo/zombie-face.patch +++ /dev/null @@ -1,119 +0,0 @@ -From 0238fe2cafea2e1ed19bb222117bd73ee6898d4d Mon Sep 17 00:00:00 2001 -From: Karl Tomlinson <karlt+@karlt.net> -Date: Thu, 14 May 2009 10:46:29 +0000 -Subject: [ft] Resolve mutual referencing problems with zombie faces - -Bug 21706 -- zombie ft_font_face / ft_unscaled_font mutual - referencing problems -[http://bugs.freedesktop.org/show_bug.cgi?id=21706] - -There can be more than one zombie font_face belonging to an unscaled_font, -but only the first is destroyed. This leaks the client's FT_Face -(and associated font data) as release of the FT_Face depends on release -of the font_face. - -(The reason why Firefox ends up with two different font_faces for one -unscaled_font is that load_flags for faces with artificial oblique have -FT_LOAD_NO_BITMAP set. -https://bugzilla.mozilla.org/show_bug.cgi?id=486974) - -Also it's possible for _cairo_ft_font_face_create to pull out a zombie -font_face from the unscaled_font, which would crash -_cairo_ft_font_face_scaled_font_create, as that expects non-null -font_face->unscaled (if !font-face->pattern). ---- -diff --git a/AUTHORS b/AUTHORS -index 289fecb..8c06174 100644 ---- a/AUTHORS -+++ b/AUTHORS -@@ -86,7 +86,7 @@ Travis Spencer <tspencer@cs.pdx.edu> XCB backend fix - Bill Spitzak <spitzak@d2.com> Build fix to find Xrender.h without xrender.pc - Zhe Su <james.su@gmail.com> Add support for fontconfig's embeddedbitmap option - Owen Taylor <otaylor@redhat.com> Font rewrite, documentation, win32 backend --Karl Tomlinson <karlt+@karlt.net> -+Karl Tomlinson <karlt+@karlt.net> Optimisation and obscure bug fixes (mozilla) - Alp Toker <alp@atoker.com> Fix several code/comment typos - Malcolm Tredinnick <malcolm@commsecure.com.au> Documentation fixes - David Turner <david@freetype.org> Optimize gradient calculations -diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c -index 1e2a18e..f9ff0b1 100644 ---- a/src/cairo-ft-font.c -+++ b/src/cairo-ft-font.c -@@ -543,8 +543,10 @@ _cairo_ft_unscaled_font_destroy (void *abstract_font) - /* See comments in _ft_font_face_destroy about the "zombie" state - * for a _ft_font_face. - */ -- if (unscaled->faces && !unscaled->faces->unscaled) -+ if (unscaled->faces && unscaled->faces->unscaled == NULL) { -+ assert (unscaled->faces->next == NULL); - cairo_font_face_destroy (&unscaled->faces->base); -+ } - } else { - _font_map_release_face_lock_held (font_map, unscaled); - } -@@ -2233,9 +2235,10 @@ _cairo_ft_font_face_destroy (void *abstract_face) - if (font_face == NULL) - return; - -- /* When destroying the face created by cairo_ft_font_face_create_for_ft_face, -+ /* When destroying a face created by cairo_ft_font_face_create_for_ft_face, - * we have a special "zombie" state for the face when the unscaled font -- * is still alive but there are no public references to the font face. -+ * is still alive but there are no other references to a font face with -+ * the same FT_Face. - * - * We go from: - * -@@ -2249,6 +2252,8 @@ _cairo_ft_font_face_destroy (void *abstract_face) - - if (font_face->unscaled && - font_face->unscaled->from_face && -+ font_face->next == NULL && -+ font_face->unscaled->faces == font_face && - CAIRO_REFERENCE_COUNT_GET_VALUE (&font_face->unscaled->base.ref_count) > 1) - { - cairo_font_face_reference (&font_face->base); -@@ -2394,12 +2399,21 @@ _cairo_ft_font_face_create (cairo_ft_unscaled_font_t *unscaled, - font_face->ft_options.extra_flags == ft_options->extra_flags && - cairo_font_options_equal (&font_face->ft_options.base, &ft_options->base)) - { -- if (font_face->base.status == CAIRO_STATUS_SUCCESS) -- return cairo_font_face_reference (&font_face->base); -+ if (font_face->base.status) { -+ /* The font_face has been left in an error state, abandon it. */ -+ *prev_font_face = font_face->next; -+ break; -+ } - -- /* The font_face has been left in an error state, abandon it. */ -- *prev_font_face = font_face->next; -- break; -+ if (font_face->unscaled == NULL) { -+ /* Resurrect this "zombie" font_face (from -+ * _cairo_ft_font_face_destroy), switching its unscaled_font -+ * from owner to ownee. */ -+ font_face->unscaled = unscaled; -+ _cairo_unscaled_font_reference (&unscaled->base); -+ return &font_face->base; -+ } else -+ return cairo_font_face_reference (&font_face->base); - } - } - -@@ -2415,6 +2429,14 @@ _cairo_ft_font_face_create (cairo_ft_unscaled_font_t *unscaled, - - font_face->ft_options = *ft_options; - -+ if (unscaled->faces && unscaled->faces->unscaled == NULL) { -+ /* This "zombie" font_face (from _cairo_ft_font_face_destroy) -+ * is no longer needed. */ -+ assert (unscaled->from_face && unscaled->faces->next == NULL); -+ cairo_font_face_destroy (&unscaled->faces->base); -+ unscaled->faces = NULL; -+ } -+ - font_face->next = unscaled->faces; - unscaled->faces = font_face; - --- -cgit v0.8.2 diff --git a/gfx/ots/LICENSE b/gfx/ots/LICENSE index a7531cf7c..d5e3bff5a 100644 --- a/gfx/ots/LICENSE +++ b/gfx/ots/LICENSE @@ -1,27 +1,27 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2009-2017 The OTS Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/gfx/ots/README.mozilla b/gfx/ots/README.mozilla index b96826735..0353a99c5 100644 --- a/gfx/ots/README.mozilla +++ b/gfx/ots/README.mozilla @@ -2,10 +2,11 @@ This is the Sanitiser for OpenType project, from http://code.google.com/p/ots/. Our reference repository is https://github.com/khaledhosny/ots/. -Current revision: ba8417620956a920ed1f05a2f666fb6317fb10cb +Current revision: 8bba749d9d5401726a7d7609ab914fdb5e92bfbe (8.0.0) -Upstream files included: LICENSE, src/, include/ +Upstream files included: LICENSE, src/, include/, tests/*.cc Additional files: README.mozilla, src/moz.build Additional patch: ots-visibility.patch (bug 711079). +Additional patch: ots-lz4.patch diff --git a/gfx/ots/include/opentype-sanitiser.h b/gfx/ots/include/opentype-sanitiser.h index 87d0f3d28..52cbd3aee 100644 --- a/gfx/ots/include/opentype-sanitiser.h +++ b/gfx/ots/include/opentype-sanitiser.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -35,13 +35,17 @@ typedef int int32_t; typedef unsigned int uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; -#define ntohl(x) _byteswap_ulong (x) -#define ntohs(x) _byteswap_ushort (x) -#define htonl(x) _byteswap_ulong (x) -#define htons(x) _byteswap_ushort (x) +#define ots_ntohl(x) _byteswap_ulong (x) +#define ots_ntohs(x) _byteswap_ushort (x) +#define ots_htonl(x) _byteswap_ulong (x) +#define ots_htons(x) _byteswap_ushort (x) #else #include <arpa/inet.h> #include <stdint.h> +#define ots_ntohl(x) ntohl (x) +#define ots_ntohs(x) ntohs (x) +#define ots_htonl(x) htonl (x) +#define ots_htons(x) htons (x) #endif #include <sys/types.h> @@ -52,7 +56,7 @@ typedef unsigned __int64 uint64_t; #include <cstring> #define OTS_TAG(c1,c2,c3,c4) ((uint32_t)((((uint8_t)(c1))<<24)|(((uint8_t)(c2))<<16)|(((uint8_t)(c3))<<8)|((uint8_t)(c4)))) -#define OTS_UNTAG(tag) ((uint8_t)((tag)>>24)), ((uint8_t)((tag)>>16)), ((uint8_t)((tag)>>8)), ((uint8_t)(tag)) +#define OTS_UNTAG(tag) ((char)((tag)>>24)), ((char)((tag)>>16)), ((char)((tag)>>8)), ((char)(tag)) namespace ots { @@ -80,7 +84,7 @@ class OTSStream { const size_t l = std::min(length, static_cast<size_t>(4) - chksum_offset); uint32_t tmp = 0; std::memcpy(reinterpret_cast<uint8_t *>(&tmp) + chksum_offset, data, l); - chksum_ += ntohl(tmp); + chksum_ += ots_ntohl(tmp); length -= l; offset += l; } @@ -89,7 +93,7 @@ class OTSStream { uint32_t tmp; std::memcpy(&tmp, reinterpret_cast<const uint8_t *>(data) + offset, sizeof(uint32_t)); - chksum_ += ntohl(tmp); + chksum_ += ots_ntohl(tmp); length -= 4; offset += 4; } @@ -99,7 +103,7 @@ class OTSStream { uint32_t tmp = 0; std::memcpy(&tmp, reinterpret_cast<const uint8_t*>(data) + offset, length); - chksum_ += ntohl(tmp); + chksum_ += ots_ntohl(tmp); } return WriteRaw(data, orig_length); @@ -127,27 +131,27 @@ class OTSStream { } bool WriteU16(uint16_t v) { - v = htons(v); + v = ots_htons(v); return Write(&v, sizeof(v)); } bool WriteS16(int16_t v) { - v = htons(v); + v = ots_htons(v); return Write(&v, sizeof(v)); } bool WriteU24(uint32_t v) { - v = htonl(v); + v = ots_htonl(v); return Write(reinterpret_cast<uint8_t*>(&v)+1, 3); } bool WriteU32(uint32_t v) { - v = htonl(v); + v = ots_htonl(v); return Write(&v, sizeof(v)); } bool WriteS32(int32_t v) { - v = htonl(v); + v = ots_htonl(v); return Write(&v, sizeof(v)); } @@ -176,7 +180,7 @@ class OTSStream { enum TableAction { TABLE_ACTION_DEFAULT, // Use OTS's default action for that table - TABLE_ACTION_SANITIZE, // Sanitize the table, potentially droping it + TABLE_ACTION_SANITIZE, // Sanitize the table, potentially dropping it TABLE_ACTION_PASSTHRU, // Serialize the table unchanged TABLE_ACTION_DROP // Drop the table }; @@ -186,7 +190,7 @@ class OTS_API OTSContext { OTSContext() {} virtual ~OTSContext() {} - // Process a given OpenType file and write out a sanitised version + // Process a given OpenType file and write out a sanitized version // output: a pointer to an object implementing the OTSStream interface. The // sanitisied output will be written to this. In the even of a failure, // partial output may have been written. diff --git a/gfx/ots/include/ots-memory-stream.h b/gfx/ots/include/ots-memory-stream.h index 579da616f..cd5b089fa 100644 --- a/gfx/ots/include/ots-memory-stream.h +++ b/gfx/ots/include/ots-memory-stream.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/gfx/ots/ots-lz4.patch b/gfx/ots/ots-lz4.patch new file mode 100644 index 000000000..4251e72d6 --- /dev/null +++ b/gfx/ots/ots-lz4.patch @@ -0,0 +1,74 @@ +diff --git a/gfx/ots/src/glat.cc b/gfx/ots/src/glat.cc +--- a/gfx/ots/src/glat.cc ++++ b/gfx/ots/src/glat.cc +@@ -4,9 +4,9 @@ + + #include "glat.h" + + #include "gloc.h" +-#include "lz4.h" ++#include "mozilla/Compression.h" + #include <list> + + namespace ots { + +@@ -212,16 +212,17 @@ bool OpenTypeGLAT_v3::Parse(const uint8_ + return DropGraphite("Decompressed size exceeds 30MB: %gMB", + decompressed_size / (1024.0 * 1024.0)); + } + std::vector<uint8_t> decompressed(decompressed_size); +- int ret = LZ4_decompress_safe_partial( ++ size_t outputSize = 0; ++ bool ret = mozilla::Compression::LZ4::decompressPartial( + reinterpret_cast<const char*>(data + table.offset()), +- reinterpret_cast<char*>(decompressed.data()), + table.remaining(), // input buffer size (input size + padding) ++ reinterpret_cast<char*>(decompressed.data()), + decompressed.size(), // target output size +- decompressed.size()); // output buffer size +- if (ret < 0 || unsigned(ret) != decompressed.size()) { +- return DropGraphite("Decompression failed with error code %d", ret); ++ &outputSize); // return output size ++ if (!ret || outputSize != decompressed.size()) { ++ return DropGraphite("Decompression failed"); + } + return this->Parse(decompressed.data(), decompressed.size(), true); + } + default: +diff --git a/gfx/ots/src/silf.cc b/gfx/ots/src/silf.cc +--- a/gfx/ots/src/silf.cc ++++ b/gfx/ots/src/silf.cc +@@ -4,9 +4,9 @@ + + #include "silf.h" + + #include "name.h" +-#include "lz4.h" ++#include "mozilla/Compression.h" + #include <cmath> + + namespace ots { + +@@ -50,16 +50,17 @@ bool OpenTypeSILF::Parse(const uint8_t* + return DropGraphite("Decompressed size exceeds 30MB: %gMB", + decompressed_size / (1024.0 * 1024.0)); + } + std::vector<uint8_t> decompressed(decompressed_size); +- int ret = LZ4_decompress_safe_partial( ++ size_t outputSize = 0; ++ bool ret = mozilla::Compression::LZ4::decompressPartial( + reinterpret_cast<const char*>(data + table.offset()), +- reinterpret_cast<char*>(decompressed.data()), + table.remaining(), // input buffer size (input size + padding) ++ reinterpret_cast<char*>(decompressed.data()), + decompressed.size(), // target output size +- decompressed.size()); // output buffer size +- if (ret < 0 || unsigned(ret) != decompressed.size()) { +- return DropGraphite("Decompression failed with error code %d", ret); ++ &outputSize); // return output size ++ if (!ret || outputSize != decompressed.size()) { ++ return DropGraphite("Decompression failed"); + } + return this->Parse(decompressed.data(), decompressed.size(), true); + } + default: diff --git a/gfx/ots/ots-visibility.patch b/gfx/ots/ots-visibility.patch index aeac81c4d..c1265472b 100644 --- a/gfx/ots/ots-visibility.patch +++ b/gfx/ots/ots-visibility.patch @@ -1,10 +1,7 @@ diff --git a/gfx/ots/include/opentype-sanitiser.h b/gfx/ots/include/opentype-sanitiser.h --- a/gfx/ots/include/opentype-sanitiser.h +++ b/gfx/ots/include/opentype-sanitiser.h -@@ -1,15 +1,35 @@ - // Copyright (c) 2009 The Chromium Authors. All rights reserved. - // Use of this source code is governed by a BSD-style license that can be - // found in the LICENSE file. +@@ -4,8 +4,28 @@ #ifndef OPENTYPE_SANITISER_H_ #define OPENTYPE_SANITISER_H_ @@ -33,15 +30,7 @@ diff --git a/gfx/ots/include/opentype-sanitiser.h b/gfx/ots/include/opentype-san #include <stdlib.h> typedef signed char int8_t; typedef unsigned char uint8_t; - typedef short int16_t; - typedef unsigned short uint16_t; - typedef int int32_t; - typedef unsigned int uint32_t; -@@ -187,17 +207,17 @@ class OTSStream { - - enum TableAction { - TABLE_ACTION_DEFAULT, // Use OTS's default action for that table - TABLE_ACTION_SANITIZE, // Sanitize the table, potentially droping it +@@ -164,9 +184,9 @@ enum TableAction { TABLE_ACTION_PASSTHRU, // Serialize the table unchanged TABLE_ACTION_DROP // Drop the table }; @@ -52,7 +41,3 @@ diff --git a/gfx/ots/include/opentype-sanitiser.h b/gfx/ots/include/opentype-san OTSContext() {} virtual ~OTSContext() {} - // Process a given OpenType file and write out a sanitised version - // output: a pointer to an object implementing the OTSStream interface. The - // sanitisied output will be written to this. In the even of a failure, - // partial output may have been written. diff --git a/gfx/ots/src/avar.cc b/gfx/ots/src/avar.cc new file mode 100644 index 000000000..2a431b1c2 --- /dev/null +++ b/gfx/ots/src/avar.cc @@ -0,0 +1,109 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "avar.h" + +#include "fvar.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeAVAR +// ----------------------------------------------------------------------------- + +bool OpenTypeAVAR::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + if (!table.ReadU16(&this->majorVersion) || + !table.ReadU16(&this->minorVersion) || + !table.ReadU16(&this->reserved) || + !table.ReadU16(&this->axisCount)) { + return Drop("Failed to read table header"); + } + if (this->majorVersion != 1) { + return Drop("Unknown table version"); + } + if (this->minorVersion > 0) { + // we only know how to serialize version 1.0 + Warning("Downgrading minor version to 0"); + this->minorVersion = 0; + } + if (this->reserved != 0) { + Warning("Expected reserved=0"); + this->reserved = 0; + } + + OpenTypeFVAR* fvar = static_cast<OpenTypeFVAR*>( + GetFont()->GetTypedTable(OTS_TAG_FVAR)); + if (!fvar) { + return DropVariations("Required fvar table is missing"); + } + if (axisCount != fvar->AxisCount()) { + return Drop("Axis count mismatch"); + } + + for (size_t i = 0; i < this->axisCount; i++) { + this->axisSegmentMaps.emplace_back(); + uint16_t positionMapCount; + if (!table.ReadU16(&positionMapCount)) { + return Drop("Failed to read position map count"); + } + int foundRequiredMappings = 0; + for (size_t j = 0; j < positionMapCount; j++) { + AxisValueMap map; + if (!table.ReadS16(&map.fromCoordinate) || + !table.ReadS16(&map.toCoordinate)) { + return Drop("Failed to read axis value map"); + } + if (map.fromCoordinate < -0x4000 || + map.fromCoordinate > 0x4000 || + map.toCoordinate < -0x4000 || + map.toCoordinate > 0x4000) { + return Drop("Axis value map coordinate out of range"); + } + if (j > 0) { + if (map.fromCoordinate <= this->axisSegmentMaps[i].back().fromCoordinate || + map.toCoordinate < this->axisSegmentMaps[i].back().toCoordinate) { + return Drop("Axis value map out of order"); + } + } + if ((map.fromCoordinate == -0x4000 && map.toCoordinate == -0x4000) || + (map.fromCoordinate == 0 && map.toCoordinate == 0) || + (map.fromCoordinate == 0x4000 && map.toCoordinate == 0x4000)) { + ++foundRequiredMappings; + } + this->axisSegmentMaps[i].push_back(map); + } + if (positionMapCount > 0 && foundRequiredMappings != 3) { + return Drop("A required mapping (for -1, 0 or 1) is missing"); + } + } + + return true; +} + +bool OpenTypeAVAR::Serialize(OTSStream* out) { + if (!out->WriteU16(this->majorVersion) || + !out->WriteU16(this->minorVersion) || + !out->WriteU16(this->reserved) || + !out->WriteU16(this->axisCount)) { + return Error("Failed to write table"); + } + + for (size_t i = 0; i < this->axisCount; i++) { + const auto& axisValueMap = this->axisSegmentMaps[i]; + if (!out->WriteU16(axisValueMap.size())) { + return Error("Failed to write table"); + } + for (size_t j = 0; j < axisValueMap.size(); j++) { + if (!out->WriteS16(axisValueMap[j].fromCoordinate) || + !out->WriteS16(axisValueMap[j].toCoordinate)) { + return Error("Failed to write table"); + } + } + } + + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/avar.h b/gfx/ots/src/avar.h new file mode 100644 index 000000000..756651c04 --- /dev/null +++ b/gfx/ots/src/avar.h @@ -0,0 +1,42 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_AVAR_H_ +#define OTS_AVAR_H_ + +#include "ots.h" + +#include <vector> + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeAVAR Interface +// ----------------------------------------------------------------------------- + +class OpenTypeAVAR : public Table { + public: + explicit OpenTypeAVAR(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + uint16_t majorVersion; + uint16_t minorVersion; + uint16_t reserved; + uint16_t axisCount; + + struct AxisValueMap { + int16_t fromCoordinate; + int16_t toCoordinate; + }; + + std::vector<std::vector<AxisValueMap>> axisSegmentMaps; +}; + +} // namespace ots + +#endif // OTS_AVAR_H_ diff --git a/gfx/ots/src/cff.cc b/gfx/ots/src/cff.cc index 23b6dadac..b0affd510 100644 --- a/gfx/ots/src/cff.cc +++ b/gfx/ots/src/cff.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright (c) 2012-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,7 +9,8 @@ #include <vector> #include "maxp.h" -#include "cff_type2_charstring.h" +#include "cff_charstring.h" +#include "variations.h" // CFF - PostScript font program (Compact Font Format) table // http://www.microsoft.com/typography/otspec/cff.htm @@ -28,6 +29,7 @@ enum DICT_OPERAND_TYPE { enum DICT_DATA_TYPE { DICT_DATA_TOPLEVEL, DICT_DATA_FDARRAY, + DICT_DATA_PRIVATE, }; enum FONT_FORMAT { @@ -39,7 +41,9 @@ enum FONT_FORMAT { // see Appendix. A const size_t kNStdString = 390; -bool ReadOffset(ots::Buffer *table, uint8_t off_size, uint32_t *offset) { +typedef std::pair<uint32_t, DICT_OPERAND_TYPE> Operand; + +bool ReadOffset(ots::Buffer &table, uint8_t off_size, uint32_t *offset) { if (off_size > 4) { return OTS_FAILURE(); } @@ -47,7 +51,7 @@ bool ReadOffset(ots::Buffer *table, uint8_t off_size, uint32_t *offset) { uint32_t tmp32 = 0; for (unsigned i = 0; i < off_size; ++i) { uint8_t tmp8 = 0; - if (!table->ReadU8(&tmp8)) { + if (!table.ReadU8(&tmp8)) { return OTS_FAILURE(); } tmp32 <<= 8; @@ -57,39 +61,47 @@ bool ReadOffset(ots::Buffer *table, uint8_t off_size, uint32_t *offset) { return true; } -bool ParseIndex(ots::Buffer *table, ots::CFFIndex *index) { - index->off_size = 0; - index->offsets.clear(); +bool ParseIndex(ots::Buffer &table, ots::CFFIndex &index, bool cff2 = false) { + index.off_size = 0; + index.offsets.clear(); - if (!table->ReadU16(&(index->count))) { - return OTS_FAILURE(); + if (cff2) { + if (!table.ReadU32(&(index.count))) { + return OTS_FAILURE(); + } + } else { + uint16_t count; + if (!table.ReadU16(&count)) { + return OTS_FAILURE(); + } + index.count = count; } - if (index->count == 0) { + + if (index.count == 0) { // An empty INDEX. - index->offset_to_next = table->offset(); + index.offset_to_next = table.offset(); return true; } - if (!table->ReadU8(&(index->off_size))) { + if (!table.ReadU8(&(index.off_size))) { return OTS_FAILURE(); } - if ((index->off_size == 0) || - (index->off_size > 4)) { + if (index.off_size < 1 || index.off_size > 4) { return OTS_FAILURE(); } - const size_t array_size = (index->count + 1) * index->off_size; + const size_t array_size = (index.count + 1) * index.off_size; // less than ((64k + 1) * 4), thus does not overflow. - const size_t object_data_offset = table->offset() + array_size; + const size_t object_data_offset = table.offset() + array_size; // does not overflow too, since offset() <= 1GB. - if (object_data_offset >= table->length()) { + if (object_data_offset >= table.length()) { return OTS_FAILURE(); } - for (unsigned i = 0; i <= index->count; ++i) { // '<=' is not a typo. + for (unsigned i = 0; i <= index.count; ++i) { // '<=' is not a typo. uint32_t rel_offset = 0; - if (!ReadOffset(table, index->off_size, &rel_offset)) { + if (!ReadOffset(table, index.off_size, &rel_offset)) { return OTS_FAILURE(); } if (rel_offset < 1) { @@ -99,60 +111,56 @@ bool ParseIndex(ots::Buffer *table, ots::CFFIndex *index) { return OTS_FAILURE(); } - if (rel_offset > table->length()) { + if (rel_offset > table.length()) { return OTS_FAILURE(); } // does not underflow. - if (object_data_offset > table->length() - (rel_offset - 1)) { + if (object_data_offset > table.length() - (rel_offset - 1)) { return OTS_FAILURE(); } - index->offsets.push_back( + index.offsets.push_back( object_data_offset + (rel_offset - 1)); // less than length(), 1GB. } - for (unsigned i = 1; i < index->offsets.size(); ++i) { + for (unsigned i = 1; i < index.offsets.size(); ++i) { // We allow consecutive identical offsets here for zero-length strings. // See http://crbug.com/69341 for more details. - if (index->offsets[i] < index->offsets[i - 1]) { + if (index.offsets[i] < index.offsets[i - 1]) { return OTS_FAILURE(); } } - index->offset_to_next = index->offsets.back(); + index.offset_to_next = index.offsets.back(); return true; } bool ParseNameData( ots::Buffer *table, const ots::CFFIndex &index, std::string* out_name) { uint8_t name[256] = {0}; - if (index.offsets.size() == 0) { // just in case. + + const size_t length = index.offsets[1] - index.offsets[0]; + // font names should be no longer than 127 characters. + if (length > 127) { return OTS_FAILURE(); } - for (unsigned i = 1; i < index.offsets.size(); ++i) { - const size_t length = index.offsets[i] - index.offsets[i - 1]; - // font names should be no longer than 127 characters. - if (length > 127) { - return OTS_FAILURE(); - } - table->set_offset(index.offsets[i - 1]); - if (!table->Read(name, length)) { + table->set_offset(index.offsets[0]); + if (!table->Read(name, length)) { + return OTS_FAILURE(); + } + + for (size_t i = 0; i < length; ++i) { + // setting the first byte to NUL is allowed. + if (i == 0 && name[i] == 0) continue; + // non-ASCII characters are not recommended (except the first character). + if (name[i] < 33 || name[i] > 126) { return OTS_FAILURE(); } - - for (size_t j = 0; j < length; ++j) { - // setting the first byte to NUL is allowed. - if (j == 0 && name[j] == 0) continue; - // non-ASCII characters are not recommended (except the first character). - if (name[j] < 33 || name[j] > 126) { - return OTS_FAILURE(); - } - // [, ], ... are not allowed. - if (std::strchr("[](){}<>/% ", name[j])) { - return OTS_FAILURE(); - } + // [, ], ... are not allowed. + if (std::strchr("[](){}<>/% ", name[i])) { + return OTS_FAILURE(); } } @@ -160,8 +168,7 @@ bool ParseNameData( return true; } -bool CheckOffset(const std::pair<uint32_t, DICT_OPERAND_TYPE>& operand, - size_t table_length) { +bool CheckOffset(const Operand& operand, size_t table_length) { if (operand.second != DICT_OPERAND_INTEGER) { return OTS_FAILURE(); } @@ -171,8 +178,7 @@ bool CheckOffset(const std::pair<uint32_t, DICT_OPERAND_TYPE>& operand, return true; } -bool CheckSid(const std::pair<uint32_t, DICT_OPERAND_TYPE>& operand, - size_t sid_max) { +bool CheckSid(const Operand& operand, size_t sid_max) { if (operand.second != DICT_OPERAND_INTEGER) { return OTS_FAILURE(); } @@ -182,30 +188,28 @@ bool CheckSid(const std::pair<uint32_t, DICT_OPERAND_TYPE>& operand, return true; } -bool ParseDictDataBcd( - ots::Buffer *table, - std::vector<std::pair<uint32_t, DICT_OPERAND_TYPE> > *operands) { +bool ParseDictDataBcd(ots::Buffer &table, std::vector<Operand> &operands) { bool read_decimal_point = false; bool read_e = false; uint8_t nibble = 0; size_t count = 0; while (true) { - if (!table->ReadU8(&nibble)) { + if (!table.ReadU8(&nibble)) { return OTS_FAILURE(); } if ((nibble & 0xf0) == 0xf0) { if ((nibble & 0xf) == 0xf) { // TODO(yusukes): would be better to store actual double value, // rather than the dummy integer. - operands->push_back(std::make_pair(static_cast<uint32_t>(0), + operands.push_back(std::make_pair(static_cast<uint32_t>(0), DICT_OPERAND_REAL)); return true; } return OTS_FAILURE(); } if ((nibble & 0x0f) == 0x0f) { - operands->push_back(std::make_pair(static_cast<uint32_t>(0), + operands.push_back(std::make_pair(static_cast<uint32_t>(0), DICT_OPERAND_REAL)); return true; } @@ -242,18 +246,17 @@ bool ParseDictDataBcd( } } -bool ParseDictDataEscapedOperator( - ots::Buffer *table, - std::vector<std::pair<uint32_t, DICT_OPERAND_TYPE> > *operands) { +bool ParseDictDataEscapedOperator(ots::Buffer &table, + std::vector<Operand> &operands) { uint8_t op = 0; - if (!table->ReadU8(&op)) { + if (!table.ReadU8(&op)) { return OTS_FAILURE(); } if ((op <= 14) || (op >= 17 && op <= 23) || (op >= 30 && op <= 38)) { - operands->push_back(std::make_pair((12U << 8) + op, DICT_OPERATOR)); + operands.push_back(std::make_pair((12U << 8) + op, DICT_OPERATOR)); return true; } @@ -261,9 +264,8 @@ bool ParseDictDataEscapedOperator( return OTS_FAILURE(); } -bool ParseDictDataNumber( - ots::Buffer *table, uint8_t b0, - std::vector<std::pair<uint32_t, DICT_OPERAND_TYPE> > *operands) { +bool ParseDictDataNumber(ots::Buffer &table, uint8_t b0, + std::vector<Operand> &operands) { uint8_t b1 = 0; uint8_t b2 = 0; uint8_t b3 = 0; @@ -271,22 +273,22 @@ bool ParseDictDataNumber( switch (b0) { case 28: // shortint - if (!table->ReadU8(&b1) || - !table->ReadU8(&b2)) { + if (!table.ReadU8(&b1) || + !table.ReadU8(&b2)) { return OTS_FAILURE(); } - operands->push_back(std::make_pair( + operands.push_back(std::make_pair( static_cast<uint32_t>((b1 << 8) + b2), DICT_OPERAND_INTEGER)); return true; case 29: // longint - if (!table->ReadU8(&b1) || - !table->ReadU8(&b2) || - !table->ReadU8(&b3) || - !table->ReadU8(&b4)) { + if (!table.ReadU8(&b1) || + !table.ReadU8(&b2) || + !table.ReadU8(&b3) || + !table.ReadU8(&b4)) { return OTS_FAILURE(); } - operands->push_back(std::make_pair( + operands.push_back(std::make_pair( static_cast<uint32_t>((b1 << 24) + (b2 << 16) + (b3 << 8) + b4), DICT_OPERAND_INTEGER)); return true; @@ -302,12 +304,12 @@ bool ParseDictDataNumber( if (b0 >=32 && b0 <=246) { result = b0 - 139; } else if (b0 >=247 && b0 <= 250) { - if (!table->ReadU8(&b1)) { + if (!table.ReadU8(&b1)) { return OTS_FAILURE(); } result = (b0 - 247) * 256 + b1 + 108; } else if (b0 >= 251 && b0 <= 254) { - if (!table->ReadU8(&b1)) { + if (!table.ReadU8(&b1)) { return OTS_FAILURE(); } result = -(b0 - 251) * 256 + b1 - 108; @@ -315,22 +317,21 @@ bool ParseDictDataNumber( return OTS_FAILURE(); } - operands->push_back(std::make_pair(result, DICT_OPERAND_INTEGER)); + operands.push_back(std::make_pair(result, DICT_OPERAND_INTEGER)); return true; } -bool ParseDictDataReadNext( - ots::Buffer *table, - std::vector<std::pair<uint32_t, DICT_OPERAND_TYPE> > *operands) { +bool ParseDictDataReadNext(ots::Buffer &table, + std::vector<Operand> &operands) { uint8_t op = 0; - if (!table->ReadU8(&op)) { + if (!table.ReadU8(&op)) { return OTS_FAILURE(); } - if (op <= 21) { + if (op <= 24) { if (op == 12) { return ParseDictDataEscapedOperator(table, operands); } - operands->push_back(std::make_pair( + operands.push_back(std::make_pair( static_cast<uint32_t>(op), DICT_OPERATOR)); return true; } else if (op <= 27 || op == 31 || op == 255) { @@ -341,12 +342,69 @@ bool ParseDictDataReadNext( return ParseDictDataNumber(table, op, operands); } +bool OperandsOverflow(std::vector<Operand>& operands, bool cff2) { + // An operator may be preceded by up to a maximum of 48 operands in CFF1 and + // 513 operands in CFF2. + if ((cff2 && operands.size() > ots::kMaxCFF2ArgumentStack) || + (!cff2 && operands.size() > ots::kMaxCFF1ArgumentStack)) { + return true; + } + return false; +} + +bool ParseDictDataReadOperands(ots::Buffer& dict, + std::vector<Operand>& operands, + bool cff2) { + if (!ParseDictDataReadNext(dict, operands)) { + return OTS_FAILURE(); + } + if (operands.empty()) { + return OTS_FAILURE(); + } + if (OperandsOverflow(operands, cff2)) { + return OTS_FAILURE(); + } + return true; +} + +bool ValidCFF2DictOp(uint32_t op, DICT_DATA_TYPE type) { + if (type == DICT_DATA_TOPLEVEL) { + switch (op) { + case (12U << 8) + 7: // FontMatrix + case 17: // CharStrings + case (12U << 8) + 36: // FDArray + case (12U << 8) + 37: // FDSelect + case 24: // vstore + return true; + default: + return false; + } + } else if (type == DICT_DATA_FDARRAY) { + if (op == 18) // Private DICT + return true; + } else if (type == DICT_DATA_PRIVATE) { + switch (op) { + case (12U << 8) + 14: // ForceBold + case (12U << 8) + 19: // initialRandomSeed + case 20: // defaultWidthX + case 21: // nominalWidthX + return false; + default: + return true; + } + } + + return false; +} + bool ParsePrivateDictData( - const uint8_t *data, - size_t table_length, size_t offset, size_t dict_length, + ots::Buffer &table, size_t offset, size_t dict_length, DICT_DATA_TYPE type, ots::OpenTypeCFF *out_cff) { - ots::Buffer table(data + offset, dict_length); - std::vector<std::pair<uint32_t, DICT_OPERAND_TYPE> > operands; + ots::Buffer dict(table.buffer() + offset, dict_length); + std::vector<Operand> operands; + bool cff2 = (out_cff->major == 2); + bool blend_seen = false; + uint32_t vsindex = 0; // Since a Private DICT for FDArray might not have a Local Subr (e.g. Hiragino // Kaku Gothic Std W8), we create an empty Local Subr here to match the size @@ -355,15 +413,8 @@ bool ParsePrivateDictData( out_cff->local_subrs_per_font.push_back(new ots::CFFIndex); } - while (table.offset() < dict_length) { - if (!ParseDictDataReadNext(&table, &operands)) { - return OTS_FAILURE(); - } - if (operands.empty()) { - return OTS_FAILURE(); - } - if (operands.size() > 48) { - // An operator may be preceded by up to a maximum of 48 operands. + while (dict.offset() < dict.length()) { + if (!ParseDictDataReadOperands(dict, operands, cff2)) { return OTS_FAILURE(); } if (operands.back().second != DICT_OPERATOR) { @@ -374,13 +425,18 @@ bool ParsePrivateDictData( const uint32_t op = operands.back().first; operands.pop_back(); + if (cff2 && !ValidCFF2DictOp(op, DICT_DATA_PRIVATE)) { + return OTS_FAILURE(); + } + + bool clear_operands = true; switch (op) { // hints case 6: // BlueValues case 7: // OtherBlues case 8: // FamilyBlues case 9: // FamilyOtherBlues - if (operands.empty() || (operands.size() % 2) != 0) { + if ((operands.size() % 2) != 0) { return OTS_FAILURE(); } break; @@ -420,12 +476,11 @@ bool ParsePrivateDictData( if (operands.back().first >= 1024 * 1024 * 1024) { return OTS_FAILURE(); } - if (operands.back().first + offset >= table_length) { + if (operands.back().first + offset >= table.length()) { return OTS_FAILURE(); } // parse "16. Local Subrs INDEX" - ots::Buffer cff_table(data, table_length); - cff_table.set_offset(operands.back().first + offset); + table.set_offset(operands.back().first + offset); ots::CFFIndex *local_subrs_index = NULL; if (type == DICT_DATA_FDARRAY) { if (out_cff->local_subrs_per_font.empty()) { @@ -439,7 +494,7 @@ bool ParsePrivateDictData( local_subrs_index = new ots::CFFIndex; out_cff->local_subrs = local_subrs_index; } - if (!ParseIndex(&cff_table, local_subrs_index)) { + if (!ParseIndex(table, *local_subrs_index, cff2)) { return OTS_FAILURE(); } break; @@ -458,42 +513,125 @@ bool ParsePrivateDictData( } break; + case 22: { // vsindex + if (!cff2) { + return OTS_FAILURE(); + } + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (operands.back().second != DICT_OPERAND_INTEGER) { + return OTS_FAILURE(); + } + if (blend_seen) { + return OTS_FAILURE(); + } + vsindex = operands.back().first; + if (vsindex >= out_cff->region_index_count.size()) { + return OTS_FAILURE(); + } + break; + } + + case 23: { // blend + if (!cff2) { + return OTS_FAILURE(); + } + if (operands.size() < 1) { + return OTS_FAILURE(); + } + if (vsindex >= out_cff->region_index_count.size()) { + return OTS_FAILURE(); + } + uint16_t k = out_cff->region_index_count.at(vsindex); + uint16_t n = operands.back().first; + if (operands.size() < n * (k + 1) + 1) { + return OTS_FAILURE(); + } + size_t operands_size = operands.size(); + // Keep the 1st n operands on the stack for the next operator to use + // and pop the rest. There can be multiple consecutive blend operator, + // so this makes sure the operands of all of them are kept on the + // stack. + while (operands.size() > operands_size - ((n * k) + 1)) + operands.pop_back(); + clear_operands = false; + blend_seen = true; + break; + } + default: return OTS_FAILURE(); } - operands.clear(); + if (clear_operands) { + operands.clear(); + } } return true; } -bool ParseDictData(const uint8_t *data, size_t table_length, - const ots::CFFIndex &index, uint16_t glyphs, - size_t sid_max, DICT_DATA_TYPE type, +bool ParseVariationStore(ots::OpenTypeCFF& out_cff, ots::Buffer& table) { + uint16_t length; + + if (!table.ReadU16(&length)) { + return OTS_FAILURE(); + } + + // Empty VariationStore is allowed. + if (!length) { + return true; + } + + if (length > table.remaining()) { + return OTS_FAILURE(); + } + + if (!ParseItemVariationStore(out_cff.GetFont(), + table.buffer() + table.offset(), length, + &(out_cff.region_index_count))) { + return OTS_FAILURE(); + } + + return true; +} + +bool ParseDictData(ots::Buffer& table, ots::Buffer& dict, + uint16_t glyphs, size_t sid_max, DICT_DATA_TYPE type, + ots::OpenTypeCFF *out_cff); + +bool ParseDictData(ots::Buffer& table, const ots::CFFIndex &index, + uint16_t glyphs, size_t sid_max, DICT_DATA_TYPE type, ots::OpenTypeCFF *out_cff) { for (unsigned i = 1; i < index.offsets.size(); ++i) { - if (type == DICT_DATA_TOPLEVEL) { - out_cff->char_strings_array.push_back(new ots::CFFIndex); - } size_t dict_length = index.offsets[i] - index.offsets[i - 1]; - ots::Buffer table(data + index.offsets[i - 1], dict_length); - - std::vector<std::pair<uint32_t, DICT_OPERAND_TYPE> > operands; + ots::Buffer dict(table.buffer() + index.offsets[i - 1], dict_length); - FONT_FORMAT font_format = FORMAT_UNKNOWN; - bool have_ros = false; - uint16_t charstring_glyphs = 0; - size_t charset_offset = 0; + if (!ParseDictData(table, dict, glyphs, sid_max, type, out_cff)) { + return OTS_FAILURE(); + } + } + return true; +} - while (table.offset() < dict_length) { - if (!ParseDictDataReadNext(&table, &operands)) { - return OTS_FAILURE(); - } - if (operands.empty()) { - return OTS_FAILURE(); - } - if (operands.size() > 48) { - // An operator may be preceded by up to a maximum of 48 operands. +bool ParseDictData(ots::Buffer& table, ots::Buffer& dict, + uint16_t glyphs, size_t sid_max, DICT_DATA_TYPE type, + ots::OpenTypeCFF *out_cff) { + bool cff2 = (out_cff->major == 2); + std::vector<Operand> operands; + + FONT_FORMAT font_format = FORMAT_UNKNOWN; + bool have_ros = false; + bool have_charstrings = false; + bool have_vstore = false; + size_t charset_offset = 0; + + if (cff2) { + // Parse VariationStore first, since it might be referenced in other places + // (e.g. FDArray) that might be parsed after it. + size_t dict_offset = dict.offset(); + while (dict.offset() < dict.length()) { + if (!ParseDictDataReadOperands(dict, operands, cff2)) { return OTS_FAILURE(); } if (operands.back().second != DICT_OPERATOR) continue; @@ -502,399 +640,503 @@ bool ParseDictData(const uint8_t *data, size_t table_length, const uint32_t op = operands.back().first; operands.pop_back(); - switch (op) { - // SID - case 0: // version - case 1: // Notice - case 2: // Copyright - case 3: // FullName - case 4: // FamilyName - case (12U << 8) + 0: // Copyright - case (12U << 8) + 21: // PostScript - case (12U << 8) + 22: // BaseFontName - case (12U << 8) + 38: // FontName - if (operands.size() != 1) { - return OTS_FAILURE(); - } - if (!CheckSid(operands.back(), sid_max)) { - return OTS_FAILURE(); - } - break; + if (op == 24) { // vstore + if (type != DICT_DATA_TOPLEVEL) { + return OTS_FAILURE(); + } + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (!CheckOffset(operands.back(), table.length())) { + return OTS_FAILURE(); + } + // parse "VariationStore Data Contents" + table.set_offset(operands.back().first); + if (!ParseVariationStore(*out_cff, table)) { + return OTS_FAILURE(); + } + break; + } + operands.clear(); + } + operands.clear(); + dict.set_offset(dict_offset); + } - // array - case 5: // FontBBox - case 14: // XUID - case (12U << 8) + 7: // FontMatrix - case (12U << 8) + 23: // BaseFontBlend (delta) - if (operands.empty()) { - return OTS_FAILURE(); - } - break; + while (dict.offset() < dict.length()) { + if (!ParseDictDataReadOperands(dict, operands, cff2)) { + return OTS_FAILURE(); + } + if (operands.back().second != DICT_OPERATOR) continue; - // number - case 13: // UniqueID - case (12U << 8) + 2: // ItalicAngle - case (12U << 8) + 3: // UnderlinePosition - case (12U << 8) + 4: // UnderlineThickness - case (12U << 8) + 5: // PaintType - case (12U << 8) + 8: // StrokeWidth - case (12U << 8) + 20: // SyntheticBase - if (operands.size() != 1) { - return OTS_FAILURE(); - } - break; - case (12U << 8) + 31: // CIDFontVersion - case (12U << 8) + 32: // CIDFontRevision - case (12U << 8) + 33: // CIDFontType - case (12U << 8) + 34: // CIDCount - case (12U << 8) + 35: // UIDBase - if (operands.size() != 1) { - return OTS_FAILURE(); - } - if (font_format != FORMAT_CID_KEYED) { - return OTS_FAILURE(); - } - break; - case (12U << 8) + 6: // CharstringType - if (operands.size() != 1) { - return OTS_FAILURE(); - } - if(operands.back().second != DICT_OPERAND_INTEGER) { - return OTS_FAILURE(); - } - if (operands.back().first != 2) { - // We only support the "Type 2 Charstring Format." - // TODO(yusukes): Support Type 1 format? Is that still in use? - return OTS_FAILURE(); - } - break; + // got operator + const uint32_t op = operands.back().first; + operands.pop_back(); - // boolean - case (12U << 8) + 1: // isFixedPitch - if (operands.size() != 1) { - return OTS_FAILURE(); - } - if (operands.back().second != DICT_OPERAND_INTEGER) { - return OTS_FAILURE(); - } - if (operands.back().first >= 2) { - return OTS_FAILURE(); - } - break; + if (cff2 && !ValidCFF2DictOp(op, type)) { + return OTS_FAILURE(); + } - // offset(0) - case 15: // charset - if (operands.size() != 1) { - return OTS_FAILURE(); - } - if (operands.back().first <= 2) { - // predefined charset, ISOAdobe, Expert or ExpertSubset, is used. - break; - } - if (!CheckOffset(operands.back(), table_length)) { - return OTS_FAILURE(); - } - if (charset_offset) { - return OTS_FAILURE(); // multiple charset tables? - } - charset_offset = operands.back().first; - break; + switch (op) { + // SID + case 0: // version + case 1: // Notice + case 2: // Copyright + case 3: // FullName + case 4: // FamilyName + case (12U << 8) + 0: // Copyright + case (12U << 8) + 21: // PostScript + case (12U << 8) + 22: // BaseFontName + case (12U << 8) + 38: // FontName + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (!CheckSid(operands.back(), sid_max)) { + return OTS_FAILURE(); + } + break; - case 16: { // Encoding - if (operands.size() != 1) { - return OTS_FAILURE(); - } - if (operands.back().first <= 1) { - break; // predefined encoding, "Standard" or "Expert", is used. - } - if (!CheckOffset(operands.back(), table_length)) { - return OTS_FAILURE(); - } + // array + case 5: // FontBBox + case 14: // XUID + case (12U << 8) + 7: // FontMatrix + case (12U << 8) + 23: // BaseFontBlend (delta) + if (operands.empty()) { + return OTS_FAILURE(); + } + break; - // parse sub dictionary INDEX. - ots::Buffer cff_table(data, table_length); - cff_table.set_offset(operands.back().first); - uint8_t format = 0; - if (!cff_table.ReadU8(&format)) { - return OTS_FAILURE(); - } - if (format & 0x80) { - // supplemental encoding is not supported at the moment. - return OTS_FAILURE(); - } - // TODO(yusukes): support & parse supplemental encoding tables. - break; + // number + case 13: // UniqueID + case (12U << 8) + 2: // ItalicAngle + case (12U << 8) + 3: // UnderlinePosition + case (12U << 8) + 4: // UnderlineThickness + case (12U << 8) + 5: // PaintType + case (12U << 8) + 8: // StrokeWidth + case (12U << 8) + 20: // SyntheticBase + if (operands.size() != 1) { + return OTS_FAILURE(); + } + break; + case (12U << 8) + 31: // CIDFontVersion + case (12U << 8) + 32: // CIDFontRevision + case (12U << 8) + 33: // CIDFontType + case (12U << 8) + 34: // CIDCount + case (12U << 8) + 35: // UIDBase + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (font_format != FORMAT_CID_KEYED) { + return OTS_FAILURE(); + } + break; + case (12U << 8) + 6: // CharstringType + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if(operands.back().second != DICT_OPERAND_INTEGER) { + return OTS_FAILURE(); + } + if (operands.back().first != 2) { + // We only support the "Type 2 Charstring Format." + // TODO(yusukes): Support Type 1 format? Is that still in use? + return OTS_FAILURE(); } + break; - case 17: { // CharStrings - if (type != DICT_DATA_TOPLEVEL) { - return OTS_FAILURE(); - } - if (operands.size() != 1) { - return OTS_FAILURE(); - } - if (!CheckOffset(operands.back(), table_length)) { - return OTS_FAILURE(); - } - // parse "14. CharStrings INDEX" - ots::Buffer cff_table(data, table_length); - cff_table.set_offset(operands.back().first); - ots::CFFIndex *charstring_index = out_cff->char_strings_array.back(); - if (!ParseIndex(&cff_table, charstring_index)) { - return OTS_FAILURE(); - } - if (charstring_index->count < 2) { - return OTS_FAILURE(); - } - if (charstring_glyphs) { - return OTS_FAILURE(); // multiple charstring tables? - } - charstring_glyphs = charstring_index->count; - if (charstring_glyphs != glyphs) { - return OTS_FAILURE(); // CFF and maxp have different number of glyphs? - } + // boolean + case (12U << 8) + 1: // isFixedPitch + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (operands.back().second != DICT_OPERAND_INTEGER) { + return OTS_FAILURE(); + } + if (operands.back().first >= 2) { + return OTS_FAILURE(); + } + break; + + // offset(0) + case 15: // charset + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (operands.back().first <= 2) { + // predefined charset, ISOAdobe, Expert or ExpertSubset, is used. break; } + if (!CheckOffset(operands.back(), table.length())) { + return OTS_FAILURE(); + } + if (charset_offset) { + return OTS_FAILURE(); // multiple charset tables? + } + charset_offset = operands.back().first; + break; - case (12U << 8) + 36: { // FDArray - if (type != DICT_DATA_TOPLEVEL) { - return OTS_FAILURE(); - } - if (operands.size() != 1) { - return OTS_FAILURE(); - } - if (!CheckOffset(operands.back(), table_length)) { - return OTS_FAILURE(); - } + case 16: { // Encoding + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (operands.back().first <= 1) { + break; // predefined encoding, "Standard" or "Expert", is used. + } + if (!CheckOffset(operands.back(), table.length())) { + return OTS_FAILURE(); + } - // parse sub dictionary INDEX. - ots::Buffer cff_table(data, table_length); - cff_table.set_offset(operands.back().first); - ots::CFFIndex sub_dict_index; - if (!ParseIndex(&cff_table, &sub_dict_index)) { - return OTS_FAILURE(); - } - if (!ParseDictData(data, table_length, - sub_dict_index, - glyphs, sid_max, DICT_DATA_FDARRAY, - out_cff)) { - return OTS_FAILURE(); - } - if (out_cff->font_dict_length != 0) { - return OTS_FAILURE(); // two or more FDArray found. - } - out_cff->font_dict_length = sub_dict_index.count; - break; + table.set_offset(operands.back().first); + uint8_t format = 0; + if (!table.ReadU8(&format)) { + return OTS_FAILURE(); } + if (format & 0x80) { + // supplemental encoding is not supported at the moment. + return OTS_FAILURE(); + } + // TODO(yusukes): support & parse supplemental encoding tables. + break; + } - case (12U << 8) + 37: { // FDSelect - if (type != DICT_DATA_TOPLEVEL) { - return OTS_FAILURE(); + case 17: { // CharStrings + if (type != DICT_DATA_TOPLEVEL) { + return OTS_FAILURE(); + } + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (!CheckOffset(operands.back(), table.length())) { + return OTS_FAILURE(); + } + // parse "14. CharStrings INDEX" + table.set_offset(operands.back().first); + ots::CFFIndex *charstring_index = out_cff->charstrings_index; + if (!ParseIndex(table, *charstring_index, cff2)) { + return OTS_FAILURE(); + } + if (charstring_index->count < 2) { + return OTS_FAILURE(); + } + if (have_charstrings) { + return OTS_FAILURE(); // multiple charstring tables? + } + have_charstrings = true; + if (charstring_index->count != glyphs) { + return OTS_FAILURE(); // CFF and maxp have different number of glyphs? + } + break; + } + + case 24: { // vstore + if (!cff2) { + return OTS_FAILURE(); + } + if (have_vstore) { + return OTS_FAILURE(); // multiple vstore tables? + } + have_vstore = true; + // parsed above. + break; + } + + case (12U << 8) + 36: { // FDArray + if (type != DICT_DATA_TOPLEVEL) { + return OTS_FAILURE(); + } + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (!CheckOffset(operands.back(), table.length())) { + return OTS_FAILURE(); + } + + // parse Font DICT INDEX. + table.set_offset(operands.back().first); + ots::CFFIndex sub_dict_index; + if (!ParseIndex(table, sub_dict_index, cff2)) { + return OTS_FAILURE(); + } + if (!ParseDictData(table, sub_dict_index, + glyphs, sid_max, DICT_DATA_FDARRAY, + out_cff)) { + return OTS_FAILURE(); + } + if (out_cff->font_dict_length != 0) { + return OTS_FAILURE(); // two or more FDArray found. + } + out_cff->font_dict_length = sub_dict_index.count; + break; + } + + case (12U << 8) + 37: { // FDSelect + if (type != DICT_DATA_TOPLEVEL) { + return OTS_FAILURE(); + } + if (operands.size() != 1) { + return OTS_FAILURE(); + } + if (!CheckOffset(operands.back(), table.length())) { + return OTS_FAILURE(); + } + + // parse FDSelect data structure + table.set_offset(operands.back().first); + uint8_t format = 0; + if (!table.ReadU8(&format)) { + return OTS_FAILURE(); + } + if (format == 0) { + for (uint16_t j = 0; j < glyphs; ++j) { + uint8_t fd_index = 0; + if (!table.ReadU8(&fd_index)) { + return OTS_FAILURE(); + } + (out_cff->fd_select)[j] = fd_index; } - if (operands.size() != 1) { + } else if (format == 3) { + uint16_t n_ranges = 0; + if (!table.ReadU16(&n_ranges)) { return OTS_FAILURE(); } - if (!CheckOffset(operands.back(), table_length)) { + if (n_ranges == 0) { return OTS_FAILURE(); } - // parse FDSelect data structure - ots::Buffer cff_table(data, table_length); - cff_table.set_offset(operands.back().first); - uint8_t format = 0; - if (!cff_table.ReadU8(&format)) { - return OTS_FAILURE(); - } - if (format == 0) { - for (uint16_t j = 0; j < glyphs; ++j) { - uint8_t fd_index = 0; - if (!cff_table.ReadU8(&fd_index)) { - return OTS_FAILURE(); - } - (out_cff->fd_select)[j] = fd_index; - } - } else if (format == 3) { - uint16_t n_ranges = 0; - if (!cff_table.ReadU16(&n_ranges)) { + uint16_t last_gid = 0; + uint8_t fd_index = 0; + for (unsigned j = 0; j < n_ranges; ++j) { + uint16_t first = 0; // GID + if (!table.ReadU16(&first)) { return OTS_FAILURE(); } - if (n_ranges == 0) { + + // Sanity checks. + if ((j == 0) && (first != 0)) { return OTS_FAILURE(); } + if ((j != 0) && (last_gid >= first)) { + return OTS_FAILURE(); // not increasing order. + } + if (first >= glyphs) { + return OTS_FAILURE(); // invalid gid. + } - uint16_t last_gid = 0; - uint8_t fd_index = 0; - for (unsigned j = 0; j < n_ranges; ++j) { - uint16_t first = 0; // GID - if (!cff_table.ReadU16(&first)) { - return OTS_FAILURE(); - } - - // Sanity checks. - if ((j == 0) && (first != 0)) { - return OTS_FAILURE(); - } - if ((j != 0) && (last_gid >= first)) { - return OTS_FAILURE(); // not increasing order. - } - - // Copy the mapping to |out_cff->fd_select|. - if (j != 0) { - for (uint16_t k = last_gid; k < first; ++k) { - if (!out_cff->fd_select.insert( - std::make_pair(k, fd_index)).second) { - return OTS_FAILURE(); - } + // Copy the mapping to |out_cff->fd_select|. + if (j != 0) { + for (auto k = last_gid; k < first; ++k) { + if (!out_cff->fd_select.insert( + std::make_pair(k, fd_index)).second) { + return OTS_FAILURE(); } } - - if (!cff_table.ReadU8(&fd_index)) { - return OTS_FAILURE(); - } - last_gid = first; - // TODO(yusukes): check GID? - } - uint16_t sentinel = 0; - if (!cff_table.ReadU16(&sentinel)) { - return OTS_FAILURE(); } - if (last_gid >= sentinel) { + + if (!table.ReadU8(&fd_index)) { return OTS_FAILURE(); } - for (uint16_t k = last_gid; k < sentinel; ++k) { - if (!out_cff->fd_select.insert( - std::make_pair(k, fd_index)).second) { - return OTS_FAILURE(); - } - } - } else { - // unknown format - return OTS_FAILURE(); - } - break; - } - - // Private DICT (2 * number) - case 18: { - if (operands.size() != 2) { - return OTS_FAILURE(); + last_gid = first; } - if (operands.back().second != DICT_OPERAND_INTEGER) { + uint16_t sentinel = 0; + if (!table.ReadU16(&sentinel)) { return OTS_FAILURE(); } - const uint32_t private_offset = operands.back().first; - operands.pop_back(); - if (operands.back().second != DICT_OPERAND_INTEGER) { + if (last_gid >= sentinel) { return OTS_FAILURE(); } - const uint32_t private_length = operands.back().first; - if (private_offset > table_length) { - return OTS_FAILURE(); + if (sentinel > glyphs) { + return OTS_FAILURE(); // invalid gid. } - if (private_length >= table_length) { - return OTS_FAILURE(); + for (auto k = last_gid; k < sentinel; ++k) { + if (!out_cff->fd_select.insert( + std::make_pair(k, fd_index)).second) { + return OTS_FAILURE(); + } } - if (private_length + private_offset > table_length) { + } else if (cff2 && format == 4) { + uint32_t n_ranges = 0; + if (!table.ReadU32(&n_ranges)) { return OTS_FAILURE(); } - // parse "15. Private DICT Data" - if (!ParsePrivateDictData(data, table_length, - private_offset, private_length, - type, out_cff)) { + if (n_ranges == 0) { return OTS_FAILURE(); } - break; - } - // ROS - case (12U << 8) + 30: - if (font_format != FORMAT_UNKNOWN) { - return OTS_FAILURE(); + uint32_t last_gid = 0; + uint16_t fd_index = 0; + for (unsigned j = 0; j < n_ranges; ++j) { + uint32_t first = 0; // GID + if (!table.ReadU32(&first)) { + return OTS_FAILURE(); + } + + // Sanity checks. + if ((j == 0) && (first != 0)) { + return OTS_FAILURE(); + } + if ((j != 0) && (last_gid >= first)) { + return OTS_FAILURE(); // not increasing order. + } + if (first >= glyphs) { + return OTS_FAILURE(); // invalid gid. + } + + // Copy the mapping to |out_cff->fd_select|. + if (j != 0) { + for (auto k = last_gid; k < first; ++k) { + if (!out_cff->fd_select.insert( + std::make_pair(k, fd_index)).second) { + return OTS_FAILURE(); + } + } + } + + if (!table.ReadU16(&fd_index)) { + return OTS_FAILURE(); + } + last_gid = first; } - font_format = FORMAT_CID_KEYED; - if (operands.size() != 3) { + uint32_t sentinel = 0; + if (!table.ReadU32(&sentinel)) { return OTS_FAILURE(); } - // check SIDs - operands.pop_back(); // ignore the first number. - if (!CheckSid(operands.back(), sid_max)) { + if (last_gid >= sentinel) { return OTS_FAILURE(); } - operands.pop_back(); - if (!CheckSid(operands.back(), sid_max)) { - return OTS_FAILURE(); + if (sentinel > glyphs) { + return OTS_FAILURE(); // invalid gid. } - if (have_ros) { - return OTS_FAILURE(); // multiple ROS tables? + for (auto k = last_gid; k < sentinel; ++k) { + if (!out_cff->fd_select.insert( + std::make_pair(k, fd_index)).second) { + return OTS_FAILURE(); + } } - have_ros = true; - break; - - default: + } else { + // unknown format return OTS_FAILURE(); + } + break; } - operands.clear(); - if (font_format == FORMAT_UNKNOWN) { - font_format = FORMAT_OTHER; + // Private DICT (2 * number) + case 18: { + if (operands.size() != 2) { + return OTS_FAILURE(); + } + if (operands.back().second != DICT_OPERAND_INTEGER) { + return OTS_FAILURE(); + } + const uint32_t private_offset = operands.back().first; + operands.pop_back(); + if (operands.back().second != DICT_OPERAND_INTEGER) { + return OTS_FAILURE(); + } + const uint32_t private_length = operands.back().first; + if (private_offset > table.length()) { + return OTS_FAILURE(); + } + if (private_length >= table.length()) { + return OTS_FAILURE(); + } + if (private_length + private_offset > table.length()) { + return OTS_FAILURE(); + } + // parse "15. Private DICT data" + if (!ParsePrivateDictData(table, private_offset, private_length, + type, out_cff)) { + return OTS_FAILURE(); + } + break; } - } - // parse "13. Charsets" - if (charset_offset) { - ots::Buffer cff_table(data, table_length); - cff_table.set_offset(charset_offset); - uint8_t format = 0; - if (!cff_table.ReadU8(&format)) { + // ROS + case (12U << 8) + 30: + if (font_format != FORMAT_UNKNOWN) { + return OTS_FAILURE(); + } + font_format = FORMAT_CID_KEYED; + if (operands.size() != 3) { + return OTS_FAILURE(); + } + // check SIDs + operands.pop_back(); // ignore the first number. + if (!CheckSid(operands.back(), sid_max)) { + return OTS_FAILURE(); + } + operands.pop_back(); + if (!CheckSid(operands.back(), sid_max)) { + return OTS_FAILURE(); + } + if (have_ros) { + return OTS_FAILURE(); // multiple ROS tables? + } + have_ros = true; + break; + + default: return OTS_FAILURE(); - } - switch (format) { - case 0: - for (uint16_t j = 1 /* .notdef is omitted */; j < glyphs; ++j) { - uint16_t sid = 0; - if (!cff_table.ReadU16(&sid)) { - return OTS_FAILURE(); - } - if (!have_ros && (sid > sid_max)) { - return OTS_FAILURE(); - } - // TODO(yusukes): check CIDs when have_ros is true. + } + operands.clear(); + + if (font_format == FORMAT_UNKNOWN) { + font_format = FORMAT_OTHER; + } + } + + // parse "13. Charsets" + if (charset_offset) { + table.set_offset(charset_offset); + uint8_t format = 0; + if (!table.ReadU8(&format)) { + return OTS_FAILURE(); + } + switch (format) { + case 0: + for (uint16_t j = 1 /* .notdef is omitted */; j < glyphs; ++j) { + uint16_t sid = 0; + if (!table.ReadU16(&sid)) { + return OTS_FAILURE(); } - break; + if (!have_ros && (sid > sid_max)) { + return OTS_FAILURE(); + } + // TODO(yusukes): check CIDs when have_ros is true. + } + break; + + case 1: + case 2: { + uint32_t total = 1; // .notdef is omitted. + while (total < glyphs) { + uint16_t sid = 0; + if (!table.ReadU16(&sid)) { + return OTS_FAILURE(); + } + if (!have_ros && (sid > sid_max)) { + return OTS_FAILURE(); + } + // TODO(yusukes): check CIDs when have_ros is true. - case 1: - case 2: { - uint32_t total = 1; // .notdef is omitted. - while (total < glyphs) { - uint16_t sid = 0; - if (!cff_table.ReadU16(&sid)) { + if (format == 1) { + uint8_t left = 0; + if (!table.ReadU8(&left)) { return OTS_FAILURE(); } - if (!have_ros && (sid > sid_max)) { + total += (left + 1); + } else { + uint16_t left = 0; + if (!table.ReadU16(&left)) { return OTS_FAILURE(); } - // TODO(yusukes): check CIDs when have_ros is true. - - if (format == 1) { - uint8_t left = 0; - if (!cff_table.ReadU8(&left)) { - return OTS_FAILURE(); - } - total += (left + 1); - } else { - uint16_t left = 0; - if (!cff_table.ReadU16(&left)) { - return OTS_FAILURE(); - } - total += (left + 1); - } + total += (left + 1); } - break; } - - default: - return OTS_FAILURE(); + break; } + + default: + return OTS_FAILURE(); } } return true; @@ -904,147 +1146,218 @@ bool ParseDictData(const uint8_t *data, size_t table_length, namespace ots { -bool ots_cff_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeCFF::ValidateFDSelect(uint16_t num_glyphs) { + for (const auto& fd_select : this->fd_select) { + if (fd_select.first >= num_glyphs) { + return Error("Invalid glyph index in FDSelect: %d >= %d\n", + fd_select.first, num_glyphs); + } + if (fd_select.second >= this->font_dict_length) { + return Error("Invalid FD index: %d >= %d\n", + fd_select.second, this->font_dict_length); + } + } + return true; +} + +bool OpenTypeCFF::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - font->cff = new OpenTypeCFF; - font->cff->data = data; - font->cff->length = length; - font->cff->font_dict_length = 0; - font->cff->local_subrs = NULL; + Font *font = GetFont(); + + this->m_data = data; + this->m_length = length; // parse "6. Header" in the Adobe Compact Font Format Specification uint8_t major = 0; uint8_t minor = 0; uint8_t hdr_size = 0; uint8_t off_size = 0; - if (!table.ReadU8(&major)) { - return OTS_FAILURE(); + if (!table.ReadU8(&major) || + !table.ReadU8(&minor) || + !table.ReadU8(&hdr_size) || + !table.ReadU8(&off_size)) { + return Error("Failed to read table header"); } - if (!table.ReadU8(&minor)) { - return OTS_FAILURE(); - } - if (!table.ReadU8(&hdr_size)) { - return OTS_FAILURE(); - } - if (!table.ReadU8(&off_size)) { - return OTS_FAILURE(); - } - if ((off_size == 0) || (off_size > 4)) { - return OTS_FAILURE(); + + if (off_size < 1 || off_size > 4) { + return Error("Bad offSize: %d", off_size); } - if ((major != 1) || - (minor != 0) || - (hdr_size != 4)) { - return OTS_FAILURE(); + if (major != 1 || minor != 0) { + return Error("Unsupported table version: %d.%d", major, minor); } - if (hdr_size >= length) { - return OTS_FAILURE(); + + this->major = major; + + if (hdr_size != 4 || hdr_size >= length) { + return Error("Bad hdrSize: %d", hdr_size); } // parse "7. Name INDEX" table.set_offset(hdr_size); CFFIndex name_index; - if (!ParseIndex(&table, &name_index)) { - return OTS_FAILURE(); + if (!ParseIndex(table, name_index)) { + return Error("Failed to parse Name INDEX"); } - if (!ParseNameData(&table, name_index, &(font->cff->name))) { - return OTS_FAILURE(); + if (name_index.count != 1 || name_index.offsets.size() != 2) { + return Error("Name INDEX must contain only one entry, not %d", + name_index.count); + } + if (!ParseNameData(&table, name_index, &(this->name))) { + return Error("Failed to parse Name INDEX data"); } // parse "8. Top DICT INDEX" table.set_offset(name_index.offset_to_next); CFFIndex top_dict_index; - if (!ParseIndex(&table, &top_dict_index)) { - return OTS_FAILURE(); + if (!ParseIndex(table, top_dict_index)) { + return Error("Failed to parse Top DICT INDEX"); } - if (name_index.count != top_dict_index.count) { - return OTS_FAILURE(); + if (top_dict_index.count != 1) { + return Error("Top DICT INDEX must contain only one entry, not %d", + top_dict_index.count); } // parse "10. String INDEX" table.set_offset(top_dict_index.offset_to_next); CFFIndex string_index; - if (!ParseIndex(&table, &string_index)) { - return OTS_FAILURE(); + if (!ParseIndex(table, string_index)) { + return Error("Failed to parse String INDEX"); } if (string_index.count >= 65000 - kNStdString) { - return OTS_FAILURE(); + return Error("Too many entries in String INDEX: %d", string_index.count); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return Error("Required maxp table missing"); + } + const uint16_t num_glyphs = maxp->num_glyphs; const size_t sid_max = string_index.count + kNStdString; // string_index.count == 0 is allowed. // parse "9. Top DICT Data" - if (!ParseDictData(data, length, top_dict_index, + this->charstrings_index = new ots::CFFIndex; + if (!ParseDictData(table, top_dict_index, num_glyphs, sid_max, - DICT_DATA_TOPLEVEL, font->cff)) { - return OTS_FAILURE(); + DICT_DATA_TOPLEVEL, this)) { + return Error("Failed to parse Top DICT Data"); } // parse "16. Global Subrs INDEX" table.set_offset(string_index.offset_to_next); CFFIndex global_subrs_index; - if (!ParseIndex(&table, &global_subrs_index)) { - return OTS_FAILURE(); + if (!ParseIndex(table, global_subrs_index)) { + return Error("Failed to parse Global Subrs INDEX"); } - // Check if all fd_index in FDSelect are valid. - std::map<uint16_t, uint8_t>::const_iterator iter; - std::map<uint16_t, uint8_t>::const_iterator end = font->cff->fd_select.end(); - for (iter = font->cff->fd_select.begin(); iter != end; ++iter) { - if (iter->second >= font->cff->font_dict_length) { - return OTS_FAILURE(); - } + // Check if all fd and glyph indices in FDSelect are valid. + if (!ValidateFDSelect(num_glyphs)) { + return Error("Failed to validate FDSelect"); } // Check if all charstrings (font hinting code for each glyph) are valid. - for (size_t i = 0; i < font->cff->char_strings_array.size(); ++i) { - if (!ValidateType2CharStringIndex(font, - *(font->cff->char_strings_array.at(i)), - global_subrs_index, - font->cff->fd_select, - font->cff->local_subrs_per_font, - font->cff->local_subrs, - &table)) { - return OTS_FAILURE_MSG("Failed validating charstring set %d", (int) i); - } + if (!ValidateCFFCharStrings(*this, global_subrs_index, &table)) { + return Error("Failed validating CharStrings INDEX"); } return true; } -bool ots_cff_should_serialise(Font *font) { - return font->cff != NULL; +bool OpenTypeCFF::Serialize(OTSStream *out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write table"); + } + return true; } -bool ots_cff_serialise(OTSStream *out, Font *font) { - // TODO(yusukes): would be better to transcode the data, - // rather than simple memcpy. - if (!out->Write(font->cff->data, font->cff->length)) { - return OTS_FAILURE(); +OpenTypeCFF::~OpenTypeCFF() { + for (size_t i = 0; i < this->local_subrs_per_font.size(); ++i) { + delete (this->local_subrs_per_font)[i]; } - return true; + delete this->charstrings_index; + delete this->local_subrs; } -void ots_cff_reuse(Font *font, Font *other) { - font->cff = other->cff; - font->cff_reused = true; +bool OpenTypeCFF2::Parse(const uint8_t *data, size_t length) { + Buffer table(data, length); + + Font *font = GetFont(); + + this->m_data = data; + this->m_length = length; + + // parse "6. Header" + uint8_t major = 0; + uint8_t minor = 0; + uint8_t hdr_size = 0; + uint16_t top_dict_size = 0; + if (!table.ReadU8(&major) || + !table.ReadU8(&minor) || + !table.ReadU8(&hdr_size) || + !table.ReadU16(&top_dict_size)) { + return Error("Failed to read table header"); + } + + if (major != 2 || minor != 0) { + return Error("Unsupported table version: %d.%d", major, minor); + } + + this->major = major; + + if (hdr_size >= length) { + return Error("Bad hdrSize: %d", hdr_size); + } + + if (top_dict_size == 0 || hdr_size + top_dict_size > length) { + return Error("Bad topDictLength: %d", top_dict_size); + } + + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return Error("Required maxp table missing"); + } + const uint16_t num_glyphs = maxp->num_glyphs; + const size_t sid_max = kNStdString; + + // parse "7. Top DICT Data" + ots::Buffer top_dict(data + hdr_size, top_dict_size); + table.set_offset(hdr_size); + this->charstrings_index = new ots::CFFIndex; + if (!ParseDictData(table, top_dict, + num_glyphs, sid_max, + DICT_DATA_TOPLEVEL, this)) { + return Error("Failed to parse Top DICT Data"); + } + + // parse "9. Global Subrs INDEX" + table.set_offset(hdr_size + top_dict_size); + CFFIndex global_subrs_index; + if (!ParseIndex(table, global_subrs_index, true)) { + return Error("Failed to parse Global Subrs INDEX"); + } + + // Check if all fd and glyph indices in FDSelect are valid. + if (!ValidateFDSelect(num_glyphs)) { + return Error("Failed to validate FDSelect"); + } + + // Check if all charstrings (font hinting code for each glyph) are valid. + if (!ValidateCFFCharStrings(*this, global_subrs_index, &table)) { + return Error("Failed validating CharStrings INDEX"); + } + + return true; } -void ots_cff_free(Font *font) { - if (font->cff) { - for (size_t i = 0; i < font->cff->char_strings_array.size(); ++i) { - delete (font->cff->char_strings_array)[i]; - } - for (size_t i = 0; i < font->cff->local_subrs_per_font.size(); ++i) { - delete (font->cff->local_subrs_per_font)[i]; - } - delete font->cff->local_subrs; - delete font->cff; +bool OpenTypeCFF2::Serialize(OTSStream *out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write table"); } + return true; } } // namespace ots diff --git a/gfx/ots/src/cff.h b/gfx/ots/src/cff.h index 5584acc62..cfce9ab91 100644 --- a/gfx/ots/src/cff.h +++ b/gfx/ots/src/cff.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,34 +11,81 @@ #include <string> #include <vector> +#undef major // glibc defines major! + namespace ots { struct CFFIndex { CFFIndex() : count(0), off_size(0), offset_to_next(0) {} - uint16_t count; + uint32_t count; uint8_t off_size; std::vector<uint32_t> offsets; uint32_t offset_to_next; }; -struct OpenTypeCFF { - const uint8_t *data; - size_t length; +typedef std::map<uint32_t, uint16_t> CFFFDSelect; + +class OpenTypeCFF : public Table { + public: + explicit OpenTypeCFF(Font *font, uint32_t tag) + : Table(font, tag, tag), + major(0), + font_dict_length(0), + charstrings_index(NULL), + local_subrs(NULL), + m_data(NULL), + m_length(0) { + } + + ~OpenTypeCFF(); + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + + // Major version number. + uint8_t major; + // Name INDEX. This name is used in name.cc as a postscript font name. std::string name; // The number of fonts the file has. size_t font_dict_length; // A map from glyph # to font #. - std::map<uint16_t, uint8_t> fd_select; + CFFFDSelect fd_select; // A list of char strings. - std::vector<CFFIndex *> char_strings_array; + CFFIndex* charstrings_index; // A list of Local Subrs associated with FDArrays. Can be empty. std::vector<CFFIndex *> local_subrs_per_font; // A Local Subrs associated with Top DICT. Can be NULL. CFFIndex *local_subrs; + + // CFF2 VariationStore regionIndexCount. + std::vector<uint16_t> region_index_count; + + protected: + bool ValidateFDSelect(uint16_t num_glyphs); + + private: + const uint8_t *m_data; + size_t m_length; +}; + +class OpenTypeCFF2 : public OpenTypeCFF { + public: + explicit OpenTypeCFF2(Font *font, uint32_t tag) + : OpenTypeCFF(font, tag), + m_data(NULL), + m_length(0) { + } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + + private: + const uint8_t *m_data; + size_t m_length; }; } // namespace ots diff --git a/gfx/ots/src/cff_type2_charstring.cc b/gfx/ots/src/cff_charstring.cc index 8c5544b2e..23c17d183 100644 --- a/gfx/ots/src/cff_type2_charstring.cc +++ b/gfx/ots/src/cff_charstring.cc @@ -1,11 +1,11 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2010-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // A parser for the Type 2 Charstring Format. // http://www.adobe.com/devnet/font/pdfs/5177.Type2.pdf -#include "cff_type2_charstring.h" +#include "cff_charstring.h" #include <climits> #include <cstdio> @@ -22,7 +22,6 @@ namespace { // Note #5177. const int32_t kMaxSubrsCount = 65536; const size_t kMaxCharStringLength = 65535; -const size_t kMaxArgumentStack = 48; const size_t kMaxNumberOfStemHints = 96; const size_t kMaxSubrNesting = 10; @@ -30,117 +29,130 @@ const size_t kMaxSubrNesting = 10; // will fail with the dummy value. const int32_t dummy_result = INT_MAX; -bool ExecuteType2CharString(ots::Font *font, - size_t call_depth, - const ots::CFFIndex& global_subrs_index, - const ots::CFFIndex& local_subrs_index, - ots::Buffer *cff_table, - ots::Buffer *char_string, - std::stack<int32_t> *argument_stack, - bool *out_found_endchar, - bool *out_found_width, - size_t *in_out_num_stems); +bool ExecuteCharString(ots::OpenTypeCFF& cff, + size_t call_depth, + const ots::CFFIndex& global_subrs_index, + const ots::CFFIndex& local_subrs_index, + ots::Buffer *cff_table, + ots::Buffer *char_string, + std::stack<int32_t> *argument_stack, + bool *out_found_endchar, + bool *out_found_width, + size_t *in_out_num_stems, + bool cff2); + +bool ArgumentStackOverflows(std::stack<int32_t> *argument_stack, bool cff2) { + if ((cff2 && argument_stack->size() > ots::kMaxCFF2ArgumentStack) || + (!cff2 && argument_stack->size() > ots::kMaxCFF1ArgumentStack)) { + return true; + } + return false; +} #ifdef DUMP_T2CHARSTRING // Converts |op| to a string and returns it. -const char *Type2CharStringOperatorToString(ots::Type2CharStringOperator op) { +const char *CharStringOperatorToString(ots::CharStringOperator op) { switch (op) { case ots::kHStem: - return "HStem"; + return "hstem"; case ots::kVStem: - return "VStem"; + return "vstem"; case ots::kVMoveTo: - return "VMoveTo"; + return "vmoveto"; case ots::kRLineTo: - return "RLineTo"; + return "rlineto"; case ots::kHLineTo: - return "HLineTo"; + return "hlineto"; case ots::kVLineTo: - return "VLineTo"; + return "vlineto"; case ots::kRRCurveTo: - return "RRCurveTo"; + return "rrcurveto"; case ots::kCallSubr: - return "CallSubr"; + return "callsubr"; case ots::kReturn: - return "Return"; + return "return"; case ots::kEndChar: - return "EndChar"; + return "endchar"; + case ots::kVSIndex: + return "vsindex"; + case ots::kBlend: + return "blend"; case ots::kHStemHm: - return "HStemHm"; + return "hstemhm"; case ots::kHintMask: - return "HintMask"; + return "hintmask"; case ots::kCntrMask: - return "CntrMask"; + return "cntrmask"; case ots::kRMoveTo: - return "RMoveTo"; + return "rmoveto"; case ots::kHMoveTo: - return "HMoveTo"; + return "hmoveto"; case ots::kVStemHm: - return "VStemHm"; + return "vstemhm"; case ots::kRCurveLine: - return "RCurveLine"; + return "rcurveline"; case ots::kRLineCurve: - return "RLineCurve"; + return "rlinecurve"; case ots::kVVCurveTo: return "VVCurveTo"; case ots::kHHCurveTo: - return "HHCurveTo"; + return "hhcurveto"; case ots::kCallGSubr: - return "CallGSubr"; + return "callgsubr"; case ots::kVHCurveTo: - return "VHCurveTo"; + return "vhcurveto"; case ots::kHVCurveTo: return "HVCurveTo"; case ots::kDotSection: - return "DotSection"; + return "dotsection"; case ots::kAnd: - return "And"; + return "and"; case ots::kOr: - return "Or"; + return "or"; case ots::kNot: - return "Not"; + return "not"; case ots::kAbs: - return "Abs"; + return "abs"; case ots::kAdd: - return "Add"; + return "add"; case ots::kSub: - return "Sub"; + return "sub"; case ots::kDiv: - return "Div"; + return "div"; case ots::kNeg: - return "Neg"; + return "neg"; case ots::kEq: - return "Eq"; + return "eq"; case ots::kDrop: - return "Drop"; + return "drop"; case ots::kPut: - return "Put"; + return "put"; case ots::kGet: - return "Get"; + return "get"; case ots::kIfElse: - return "IfElse"; + return "ifelse"; case ots::kRandom: - return "Random"; + return "random"; case ots::kMul: - return "Mul"; + return "mul"; case ots::kSqrt: - return "Sqrt"; + return "sqrt"; case ots::kDup: - return "Dup"; + return "dup"; case ots::kExch: - return "Exch"; + return "exch"; case ots::kIndex: - return "Index"; + return "index"; case ots::kRoll: - return "Roll"; + return "roll"; case ots::kHFlex: - return "HFlex"; + return "hflex"; case ots::kFlex: - return "Flex"; + return "flex"; case ots::kHFlex1: - return "HFlex1"; + return "hflex1"; case ots::kFlex1: - return "Flex1"; + return "flex1"; } return "UNKNOWN"; @@ -150,9 +162,9 @@ const char *Type2CharStringOperatorToString(ots::Type2CharStringOperator op) { // Read one or more bytes from the |char_string| buffer and stores the number // read on |out_number|. If the number read is an operator (ex 'vstem'), sets // true on |out_is_operator|. Returns true if the function read a number. -bool ReadNextNumberFromType2CharString(ots::Buffer *char_string, - int32_t *out_number, - bool *out_is_operator) { +bool ReadNextNumberFromCharString(ots::Buffer *char_string, + int32_t *out_number, + bool *out_is_operator) { uint8_t v = 0; if (!char_string->ReadU8(&v)) { return OTS_FAILURE(); @@ -174,7 +186,7 @@ bool ReadNextNumberFromType2CharString(ots::Buffer *char_string, *out_is_operator = true; } else if (v <= 27) { // Special handling for v==19 and v==20 are implemented in - // ExecuteType2CharStringOperator(). + // ExecuteCharStringOperator(). *out_number = v; *out_is_operator = true; } else if (v == 28) { @@ -221,23 +233,63 @@ bool ReadNextNumberFromType2CharString(ots::Buffer *char_string, return true; } +bool ValidCFF2Operator(int32_t op) { + switch (op) { + case ots::kReturn: + case ots::kEndChar: + case ots::kAbs: + case ots::kAdd: + case ots::kSub: + case ots::kDiv: + case ots::kNeg: + case ots::kRandom: + case ots::kMul: + case ots::kSqrt: + case ots::kDrop: + case ots::kExch: + case ots::kIndex: + case ots::kRoll: + case ots::kDup: + case ots::kPut: + case ots::kGet: + case ots::kDotSection: + case ots::kAnd: + case ots::kOr: + case ots::kNot: + case ots::kEq: + case ots::kIfElse: + return false; + } + + return true; +} + // Executes |op| and updates |argument_stack|. Returns true if the execution // succeeds. If the |op| is kCallSubr or kCallGSubr, the function recursively -// calls ExecuteType2CharString() function. The arguments other than |op| and +// calls ExecuteCharString() function. The arguments other than |op| and // |argument_stack| are passed for that reason. -bool ExecuteType2CharStringOperator(ots::Font *font, - int32_t op, - size_t call_depth, - const ots::CFFIndex& global_subrs_index, - const ots::CFFIndex& local_subrs_index, - ots::Buffer *cff_table, - ots::Buffer *char_string, - std::stack<int32_t> *argument_stack, - bool *out_found_endchar, - bool *in_out_found_width, - size_t *in_out_num_stems) { +bool ExecuteCharStringOperator(ots::OpenTypeCFF& cff, + int32_t op, + size_t call_depth, + const ots::CFFIndex& global_subrs_index, + const ots::CFFIndex& local_subrs_index, + ots::Buffer *cff_table, + ots::Buffer *char_string, + std::stack<int32_t> *argument_stack, + bool *out_found_endchar, + bool *in_out_found_width, + size_t *in_out_num_stems, + bool *in_out_have_blend, + bool *in_out_have_visindex, + int32_t *in_out_vsindex, + bool cff2) { + ots::Font* font = cff.GetFont(); const size_t stack_size = argument_stack->size(); + if (cff2 && !ValidCFF2Operator(op)) { + return OTS_FAILURE(); + } + switch (op) { case ots::kCallSubr: case ots::kCallGSubr: { @@ -290,16 +342,17 @@ bool ExecuteType2CharStringOperator(ots::Font *font, } ots::Buffer char_string_to_jump(cff_table->buffer() + offset, length); - return ExecuteType2CharString(font, - call_depth + 1, - global_subrs_index, - local_subrs_index, - cff_table, - &char_string_to_jump, - argument_stack, - out_found_endchar, - in_out_found_width, - in_out_num_stems); + return ExecuteCharString(cff, + call_depth + 1, + global_subrs_index, + local_subrs_index, + cff_table, + &char_string_to_jump, + argument_stack, + out_found_endchar, + in_out_found_width, + in_out_num_stems, + cff2); } case ots::kReturn: @@ -310,6 +363,51 @@ bool ExecuteType2CharStringOperator(ots::Font *font, *in_out_found_width = true; // just in case. return true; + case ots::kVSIndex: { + if (!cff2) { + return OTS_FAILURE(); + } + if (stack_size != 1) { + return OTS_FAILURE(); + } + if (*in_out_have_blend || *in_out_have_visindex) { + return OTS_FAILURE(); + } + if (argument_stack->top() >= cff.region_index_count.size()) { + return OTS_FAILURE(); + } + *in_out_have_visindex = true; + *in_out_vsindex = argument_stack->top(); + while (!argument_stack->empty()) + argument_stack->pop(); + return true; + } + + case ots::kBlend: { + if (!cff2) { + return OTS_FAILURE(); + } + if (stack_size < 1) { + return OTS_FAILURE(); + } + if (*in_out_vsindex >= cff.region_index_count.size()) { + return OTS_FAILURE(); + } + uint16_t k = cff.region_index_count.at(*in_out_vsindex); + uint16_t n = argument_stack->top(); + if (stack_size < n * (k + 1) + 1) { + return OTS_FAILURE(); + } + + // Keep the 1st n operands on the stack for the next operator to use and + // pop the rest. There can be multiple consecutive blend operator, so this + // makes sure the operands of all of them are kept on the stack. + while (argument_stack->size() > stack_size - ((n * k) + 1)) + argument_stack->pop(); + *in_out_have_blend = true; + return true; + } + case ots::kHStem: case ots::kVStem: case ots::kHStemHm: @@ -649,7 +747,7 @@ bool ExecuteType2CharStringOperator(ots::Font *font, argument_stack->pop(); argument_stack->push(dummy_result); argument_stack->push(dummy_result); - if (argument_stack->size() > kMaxArgumentStack) { + if (ArgumentStackOverflows(argument_stack, cff2)) { return OTS_FAILURE(); } // TODO(yusukes): Implement this. We should push a real value for all @@ -729,26 +827,29 @@ bool ExecuteType2CharStringOperator(ots::Font *font, // in_out_found_width: true is set if |char_string| contains 'width' byte (which // is 0 or 1 byte.) // in_out_num_stems: total number of hstems and vstems processed so far. -bool ExecuteType2CharString(ots::Font *font, - size_t call_depth, - const ots::CFFIndex& global_subrs_index, - const ots::CFFIndex& local_subrs_index, - ots::Buffer *cff_table, - ots::Buffer *char_string, - std::stack<int32_t> *argument_stack, - bool *out_found_endchar, - bool *in_out_found_width, - size_t *in_out_num_stems) { +bool ExecuteCharString(ots::OpenTypeCFF& cff, + size_t call_depth, + const ots::CFFIndex& global_subrs_index, + const ots::CFFIndex& local_subrs_index, + ots::Buffer *cff_table, + ots::Buffer *char_string, + std::stack<int32_t> *argument_stack, + bool *out_found_endchar, + bool *in_out_found_width, + size_t *in_out_num_stems, + bool cff2) { if (call_depth > kMaxSubrNesting) { return OTS_FAILURE(); } *out_found_endchar = false; + bool in_out_have_blend = false, in_out_have_visindex = false; + int32_t in_out_vsindex = 0; const size_t length = char_string->length(); while (char_string->offset() < length) { int32_t operator_or_operand = 0; bool is_operator = false; - if (!ReadNextNumberFromType2CharString(char_string, + if (!ReadNextNumberFromCharString(char_string, &operator_or_operand, &is_operator)) { return OTS_FAILURE(); @@ -761,35 +862,39 @@ bool ExecuteType2CharString(ots::Font *font, */ if (!is_operator) { - std::fprintf(stderr, "#%d# ", operator_or_operand); + std::fprintf(stderr, "%d ", operator_or_operand); } else { - std::fprintf(stderr, "#%s#\n", - Type2CharStringOperatorToString( - ots::Type2CharStringOperator(operator_or_operand)) + std::fprintf(stderr, "%s\n", + CharStringOperatorToString( + ots::CharStringOperator(operator_or_operand)) ); } #endif if (!is_operator) { argument_stack->push(operator_or_operand); - if (argument_stack->size() > kMaxArgumentStack) { + if (ArgumentStackOverflows(argument_stack, cff2)) { return OTS_FAILURE(); } continue; } // An operator is found. Execute it. - if (!ExecuteType2CharStringOperator(font, - operator_or_operand, - call_depth, - global_subrs_index, - local_subrs_index, - cff_table, - char_string, - argument_stack, - out_found_endchar, - in_out_found_width, - in_out_num_stems)) { + if (!ExecuteCharStringOperator(cff, + operator_or_operand, + call_depth, + global_subrs_index, + local_subrs_index, + cff_table, + char_string, + argument_stack, + out_found_endchar, + in_out_found_width, + in_out_num_stems, + &in_out_have_blend, + &in_out_have_visindex, + &in_out_vsindex, + cff2)) { return OTS_FAILURE(); } if (*out_found_endchar) { @@ -801,37 +906,39 @@ bool ExecuteType2CharString(ots::Font *font, } // No endchar operator is found. + if (cff2) + return true; return OTS_FAILURE(); } // Selects a set of subroutings for |glyph_index| from |cff| and sets it on // |out_local_subrs_to_use|. Returns true on success. -bool SelectLocalSubr(const std::map<uint16_t, uint8_t> &fd_select, - const std::vector<ots::CFFIndex *> &local_subrs_per_font, - const ots::CFFIndex *local_subrs, +bool SelectLocalSubr(const ots::OpenTypeCFF& cff, uint16_t glyph_index, // 0-origin const ots::CFFIndex **out_local_subrs_to_use) { + bool cff2 = (cff.major == 2); *out_local_subrs_to_use = NULL; // First, find local subrs from |local_subrs_per_font|. - if ((fd_select.size() > 0) && - (!local_subrs_per_font.empty())) { + if ((cff.fd_select.size() > 0) && + (!cff.local_subrs_per_font.empty())) { // Look up FDArray index for the glyph. - std::map<uint16_t, uint8_t>::const_iterator iter = - fd_select.find(glyph_index); - if (iter == fd_select.end()) { + const auto& iter = cff.fd_select.find(glyph_index); + if (iter == cff.fd_select.end()) { return OTS_FAILURE(); } - const uint8_t fd_index = iter->second; - if (fd_index >= local_subrs_per_font.size()) { + const auto fd_index = iter->second; + if (fd_index >= cff.local_subrs_per_font.size()) { return OTS_FAILURE(); } - *out_local_subrs_to_use = local_subrs_per_font.at(fd_index); - } else if (local_subrs) { + *out_local_subrs_to_use = cff.local_subrs_per_font.at(fd_index); + } else if (cff.local_subrs) { // Second, try to use |local_subrs|. Most Latin fonts don't have FDSelect // entries. If The font has a local subrs index associated with the Top // DICT (not FDArrays), use it. - *out_local_subrs_to_use = local_subrs; + *out_local_subrs_to_use = cff.local_subrs; + } else if (cff2 && cff.local_subrs_per_font.size() == 1) { + *out_local_subrs_to_use = cff.local_subrs_per_font.at(0); } else { // Just return NULL. *out_local_subrs_to_use = NULL; @@ -844,18 +951,16 @@ bool SelectLocalSubr(const std::map<uint16_t, uint8_t> &fd_select, namespace ots { -bool ValidateType2CharStringIndex( - ots::Font *font, - const CFFIndex& char_strings_index, +bool ValidateCFFCharStrings( + ots::OpenTypeCFF& cff, const CFFIndex& global_subrs_index, - const std::map<uint16_t, uint8_t> &fd_select, - const std::vector<CFFIndex *> &local_subrs_per_font, - const CFFIndex *local_subrs, Buffer* cff_table) { + const CFFIndex& char_strings_index = *(cff.charstrings_index); if (char_strings_index.offsets.size() == 0) { return OTS_FAILURE(); // no charstring. } + bool cff2 = (cff.major == 2); // For each glyph, validate the corresponding charstring. for (unsigned i = 1; i < char_strings_index.offsets.size(); ++i) { // Prepare a Buffer object, |char_string|, which contains the charstring @@ -875,9 +980,7 @@ bool ValidateType2CharStringIndex( // Get a local subrs for the glyph. const unsigned glyph_index = i - 1; // index in the map is 0-origin. const CFFIndex *local_subrs_to_use = NULL; - if (!SelectLocalSubr(fd_select, - local_subrs_per_font, - local_subrs, + if (!SelectLocalSubr(cff, glyph_index, &local_subrs_to_use)) { return OTS_FAILURE(); @@ -891,16 +994,19 @@ bool ValidateType2CharStringIndex( // Check a charstring for the |i|-th glyph. std::stack<int32_t> argument_stack; bool found_endchar = false; - bool found_width = false; + // CFF2 CharString has no value for width, so we start with true here to + // error out if width is found. + bool found_width = cff2; size_t num_stems = 0; - if (!ExecuteType2CharString(font, - 0 /* initial call_depth is zero */, - global_subrs_index, *local_subrs_to_use, - cff_table, &char_string, &argument_stack, - &found_endchar, &found_width, &num_stems)) { + if (!ExecuteCharString(cff, + 0 /* initial call_depth is zero */, + global_subrs_index, *local_subrs_to_use, + cff_table, &char_string, &argument_stack, + &found_endchar, &found_width, &num_stems, + cff2)) { return OTS_FAILURE(); } - if (!found_endchar) { + if (!cff2 && !found_endchar) { return OTS_FAILURE(); } } diff --git a/gfx/ots/src/cff_type2_charstring.h b/gfx/ots/src/cff_charstring.h index be44bc72c..5a2fa9ff2 100644 --- a/gfx/ots/src/cff_type2_charstring.h +++ b/gfx/ots/src/cff_charstring.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2010-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -13,6 +13,9 @@ namespace ots { +const size_t kMaxCFF1ArgumentStack = 48; +const size_t kMaxCFF2ArgumentStack = 513; + // Validates all charstrings in |char_strings_index|. Charstring is a small // language for font hinting defined in Adobe Technical Note #5177. // http://www.adobe.com/devnet/font/pdfs/5177.Type2.pdf @@ -34,17 +37,14 @@ namespace ots { // local_subrs: A Local Subrs associated with Top DICT. Can be NULL. // cff_table: A buffer which contains actual byte code of charstring, global // subroutines and local subroutines. -bool ValidateType2CharStringIndex( - Font *font, - const CFFIndex &char_strings_index, +bool ValidateCFFCharStrings( + OpenTypeCFF& cff, const CFFIndex &global_subrs_index, - const std::map<uint16_t, uint8_t> &fd_select, - const std::vector<CFFIndex *> &local_subrs_per_font, - const CFFIndex *local_subrs, Buffer *cff_table); // The list of Operators. See Appendix. A in Adobe Technical Note #5177. -enum Type2CharStringOperator { +// and https://docs.microsoft.com/en-us/typography/opentype/spec/cff2charstr +enum CharStringOperator { kHStem = 1, kVStem = 3, kVMoveTo = 4, @@ -55,6 +55,8 @@ enum Type2CharStringOperator { kCallSubr = 10, kReturn = 11, kEndChar = 14, + kVSIndex = 15, + kBlend = 16, kHStemHm = 18, kHintMask = 19, kCntrMask = 20, diff --git a/gfx/ots/src/cmap.cc b/gfx/ots/src/cmap.cc index 325f8e0d1..72c2a20fc 100644 --- a/gfx/ots/src/cmap.cc +++ b/gfx/ots/src/cmap.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -15,8 +15,6 @@ // cmap - Character To Glyph Index Mapping Table // http://www.microsoft.com/typography/otspec/cmap.htm -#define TABLE_NAME "cmap" - namespace { struct CMAPSubtableHeader { @@ -56,8 +54,12 @@ const uint32_t kIVSStart = 0xE0100; const uint32_t kIVSEnd = 0xE01EF; const uint32_t kUVSUpperLimit = 0xFFFFFF; +} // namespace + +namespace ots { + // Parses Format 4 tables -bool ParseFormat4(ots::Font *font, int platform, int encoding, +bool OpenTypeCMAP::ParseFormat4(int platform, int encoding, const uint8_t *data, size_t length, uint16_t num_glyphs) { ots::Buffer subtable(data, length); @@ -65,20 +67,22 @@ bool ParseFormat4(ots::Font *font, int platform, int encoding, // whole thing and recompacting it, we validate it and include it verbatim // in the output. - if (!font->os2) { - return OTS_FAILURE_MSG("Required OS/2 table missing"); + OpenTypeOS2 *os2 = static_cast<OpenTypeOS2*>( + GetFont()->GetTypedTable(OTS_TAG_OS2)); + if (!os2) { + return Error("Required OS/2 table missing"); } if (!subtable.Skip(4)) { - return OTS_FAILURE_MSG("Can't read 4 bytes at start of cmap format 4 subtable"); + return Error("Can't read 4 bytes at start of cmap format 4 subtable"); } uint16_t language = 0; if (!subtable.ReadU16(&language)) { - return OTS_FAILURE_MSG("Can't read language"); + return Error("Can't read language"); } if (language) { // Platform ID 3 (windows) subtables should have language '0'. - return OTS_FAILURE_MSG("Languages should be 0 (%d)", language); + return Error("Languages should be 0 (%d)", language); } uint16_t segcountx2, search_range, entry_selector, range_shift; @@ -87,16 +91,16 @@ bool ParseFormat4(ots::Font *font, int platform, int encoding, !subtable.ReadU16(&search_range) || !subtable.ReadU16(&entry_selector) || !subtable.ReadU16(&range_shift)) { - return OTS_FAILURE_MSG("Failed to read subcmap structure"); + return Error("Failed to read subcmap structure"); } if (segcountx2 & 1 || search_range & 1) { - return OTS_FAILURE_MSG("Bad subcmap structure"); + return Error("Bad subcmap structure"); } const uint16_t segcount = segcountx2 >> 1; // There must be at least one segment according the spec. if (segcount < 1) { - return OTS_FAILURE_MSG("Segcount < 1 (%d)", segcount); + return Error("Segcount < 1 (%d)", segcount); } // log2segcount is the maximal x s.t. 2^x < segcount @@ -107,48 +111,48 @@ bool ParseFormat4(ots::Font *font, int platform, int encoding, const uint16_t expected_search_range = 2 * 1u << log2segcount; if (expected_search_range != search_range) { - return OTS_FAILURE_MSG("expected search range != search range (%d != %d)", expected_search_range, search_range); + return Error("expected search range != search range (%d != %d)", expected_search_range, search_range); } if (entry_selector != log2segcount) { - return OTS_FAILURE_MSG("entry selector != log2(segement count) (%d != %d)", entry_selector, log2segcount); + return Error("entry selector != log2(segement count) (%d != %d)", entry_selector, log2segcount); } const uint16_t expected_range_shift = segcountx2 - search_range; if (range_shift != expected_range_shift) { - return OTS_FAILURE_MSG("unexpected range shift (%d != %d)", range_shift, expected_range_shift); + return Error("unexpected range shift (%d != %d)", range_shift, expected_range_shift); } std::vector<Subtable314Range> ranges(segcount); for (unsigned i = 0; i < segcount; ++i) { if (!subtable.ReadU16(&ranges[i].end_range)) { - return OTS_FAILURE_MSG("Failed to read segment %d", i); + return Error("Failed to read segment %d", i); } } uint16_t padding; if (!subtable.ReadU16(&padding)) { - return OTS_FAILURE_MSG("Failed to read cmap subtable segment padding"); + return Error("Failed to read cmap subtable segment padding"); } if (padding) { - return OTS_FAILURE_MSG("Non zero cmap subtable segment padding (%d)", padding); + return Error("Non zero cmap subtable segment padding (%d)", padding); } for (unsigned i = 0; i < segcount; ++i) { if (!subtable.ReadU16(&ranges[i].start_range)) { - return OTS_FAILURE_MSG("Failed to read segment start range %d", i); + return Error("Failed to read segment start range %d", i); } } for (unsigned i = 0; i < segcount; ++i) { if (!subtable.ReadS16(&ranges[i].id_delta)) { - return OTS_FAILURE_MSG("Failed to read segment delta %d", i); + return Error("Failed to read segment delta %d", i); } } for (unsigned i = 0; i < segcount; ++i) { ranges[i].id_range_offset_offset = subtable.offset(); if (!subtable.ReadU16(&ranges[i].id_range_offset)) { - return OTS_FAILURE_MSG("Failed to read segment range offset %d", i); + return Error("Failed to read segment range offset %d", i); } if (ranges[i].id_range_offset & 1) { @@ -156,12 +160,12 @@ bool ParseFormat4(ots::Font *font, int platform, int encoding, // for 0xFFFF-0xFFFF range. // (e.g., many fonts in http://www.princexml.com/fonts/) if (i == segcount - 1u) { - OTS_WARNING("bad id_range_offset"); + Warning("bad id_range_offset"); ranges[i].id_range_offset = 0; // The id_range_offset value in the transcoded font will not change // since this table is not actually "transcoded" yet. } else { - return OTS_FAILURE_MSG("Bad segment offset (%d)", ranges[i].id_range_offset); + return Error("Bad segment offset (%d)", ranges[i].id_range_offset); } } } @@ -176,36 +180,36 @@ bool ParseFormat4(ots::Font *font, int platform, int encoding, (ranges[i].end_range == 0xffff)) { // Some fonts (e.g., Germania.ttf) have multiple 0xffff terminators. // We'll accept them as an exception. - OTS_WARNING("multiple 0xffff terminators found"); + Warning("multiple 0xffff terminators found"); continue; } // Note: some Linux fonts (e.g., LucidaSansOblique.ttf, bsmi00lp.ttf) have // unsorted table... if (ranges[i].end_range <= ranges[i - 1].end_range) { - return OTS_FAILURE_MSG("Out of order end range (%d <= %d)", ranges[i].end_range, ranges[i-1].end_range); + return Error("Out of order end range (%d <= %d)", ranges[i].end_range, ranges[i-1].end_range); } if (ranges[i].start_range <= ranges[i - 1].end_range) { - return OTS_FAILURE_MSG("out of order start range (%d <= %d)", ranges[i].start_range, ranges[i-1].end_range); + return Error("out of order start range (%d <= %d)", ranges[i].start_range, ranges[i-1].end_range); } // On many fonts, the value of {first, last}_char_index are incorrect. // Fix them. - if (font->os2->first_char_index != 0xFFFF && + if (os2->table.first_char_index != 0xFFFF && ranges[i].start_range != 0xFFFF && - font->os2->first_char_index > ranges[i].start_range) { - font->os2->first_char_index = ranges[i].start_range; + os2->table.first_char_index > ranges[i].start_range) { + os2->table.first_char_index = ranges[i].start_range; } - if (font->os2->last_char_index != 0xFFFF && + if (os2->table.last_char_index != 0xFFFF && ranges[i].end_range != 0xFFFF && - font->os2->last_char_index < ranges[i].end_range) { - font->os2->last_char_index = ranges[i].end_range; + os2->table.last_char_index < ranges[i].end_range) { + os2->table.last_char_index = ranges[i].end_range; } } // The last range must end at 0xffff if (ranges[segcount - 1].start_range != 0xffff || ranges[segcount - 1].end_range != 0xffff) { - return OTS_FAILURE_MSG("Final segment start and end must be 0xFFFF (0x%04X-0x%04X)", + return Error("Final segment start and end must be 0xFFFF (0x%04X-0x%04X)", ranges[segcount - 1].start_range, ranges[segcount - 1].end_range); } @@ -219,7 +223,7 @@ bool ParseFormat4(ots::Font *font, int platform, int encoding, // this is explictly allowed to overflow in the spec const uint16_t glyph = code_point + ranges[i].id_delta; if (glyph >= num_glyphs) { - return OTS_FAILURE_MSG("Range glyph reference too high (%d > %d)", glyph, num_glyphs - 1); + return Error("Range glyph reference too high (%d > %d)", glyph, num_glyphs - 1); } } else { const uint16_t range_delta = code_point - ranges[i].start_range; @@ -230,13 +234,13 @@ bool ParseFormat4(ots::Font *font, int platform, int encoding, range_delta * 2; // We need to be able to access a 16-bit value from this offset if (glyph_id_offset + 1 >= length) { - return OTS_FAILURE_MSG("bad glyph id offset (%d > %ld)", glyph_id_offset, length); + return Error("bad glyph id offset (%d > %ld)", glyph_id_offset, length); } uint16_t glyph; std::memcpy(&glyph, data + glyph_id_offset, 2); - glyph = ntohs(glyph); + glyph = ots_ntohs(glyph); if (glyph >= num_glyphs) { - return OTS_FAILURE_MSG("Range glyph reference too high (%d > %d)", glyph, num_glyphs - 1); + return Error("Range glyph reference too high (%d > %d)", glyph, num_glyphs - 1); } } } @@ -245,85 +249,85 @@ bool ParseFormat4(ots::Font *font, int platform, int encoding, // We accept the table. // TODO(yusukes): transcode the subtable. if (platform == 3 && encoding == 0) { - font->cmap->subtable_3_0_4_data = data; - font->cmap->subtable_3_0_4_length = length; + this->subtable_3_0_4_data = data; + this->subtable_3_0_4_length = length; } else if (platform == 3 && encoding == 1) { - font->cmap->subtable_3_1_4_data = data; - font->cmap->subtable_3_1_4_length = length; + this->subtable_3_1_4_data = data; + this->subtable_3_1_4_length = length; } else if (platform == 0 && encoding == 3) { - font->cmap->subtable_0_3_4_data = data; - font->cmap->subtable_0_3_4_length = length; + this->subtable_0_3_4_data = data; + this->subtable_0_3_4_length = length; } else { - return OTS_FAILURE_MSG("Unknown cmap subtable type (platform=%d, encoding=%d)", platform, encoding); + return Error("Unknown cmap subtable type (platform=%d, encoding=%d)", platform, encoding); } return true; } -bool Parse31012(ots::Font *font, - const uint8_t *data, size_t length, uint16_t num_glyphs) { +bool OpenTypeCMAP::Parse31012(const uint8_t *data, size_t length, + uint16_t num_glyphs) { ots::Buffer subtable(data, length); // Format 12 tables are simple. We parse these and fully serialise them // later. if (!subtable.Skip(8)) { - return OTS_FAILURE_MSG("failed to skip the first 8 bytes of format 12 subtable"); + return Error("failed to skip the first 8 bytes of format 12 subtable"); } uint32_t language = 0; if (!subtable.ReadU32(&language)) { - return OTS_FAILURE_MSG("can't read format 12 subtable language"); + return Error("can't read format 12 subtable language"); } if (language) { - return OTS_FAILURE_MSG("format 12 subtable language should be zero (%d)", language); + return Error("format 12 subtable language should be zero (%d)", language); } uint32_t num_groups = 0; if (!subtable.ReadU32(&num_groups)) { - return OTS_FAILURE_MSG("can't read number of format 12 subtable groups"); + return Error("can't read number of format 12 subtable groups"); } if (num_groups == 0 || subtable.remaining() / 12 < num_groups) { - return OTS_FAILURE_MSG("Bad format 12 subtable group count %d", num_groups); + return Error("Bad format 12 subtable group count %d", num_groups); } std::vector<ots::OpenTypeCMAPSubtableRange> &groups - = font->cmap->subtable_3_10_12; + = this->subtable_3_10_12; groups.resize(num_groups); for (unsigned i = 0; i < num_groups; ++i) { if (!subtable.ReadU32(&groups[i].start_range) || !subtable.ReadU32(&groups[i].end_range) || !subtable.ReadU32(&groups[i].start_glyph_id)) { - return OTS_FAILURE_MSG("can't read format 12 subtable group"); + return Error("can't read format 12 subtable group"); } if (groups[i].start_range > kUnicodeUpperLimit || groups[i].end_range > kUnicodeUpperLimit || groups[i].start_glyph_id > 0xFFFF) { - return OTS_FAILURE_MSG("bad format 12 subtable group (startCharCode=0x%4X, endCharCode=0x%4X, startGlyphID=%d)", + return Error("bad format 12 subtable group (startCharCode=0x%4X, endCharCode=0x%4X, startGlyphID=%d)", groups[i].start_range, groups[i].end_range, groups[i].start_glyph_id); } // We assert that the glyph value is within range. Because of the range // limits, above, we don't need to worry about overflow. if (groups[i].end_range < groups[i].start_range) { - return OTS_FAILURE_MSG("format 12 subtable group endCharCode before startCharCode (0x%4X < 0x%4X)", + return Error("format 12 subtable group endCharCode before startCharCode (0x%4X < 0x%4X)", groups[i].end_range, groups[i].start_range); } if ((groups[i].end_range - groups[i].start_range) + groups[i].start_glyph_id > num_glyphs) { - return OTS_FAILURE_MSG("bad format 12 subtable group startGlyphID (%d)", groups[i].start_glyph_id); + return Error("bad format 12 subtable group startGlyphID (%d)", groups[i].start_glyph_id); } } // the groups must be sorted by start code and may not overlap for (unsigned i = 1; i < num_groups; ++i) { if (groups[i].start_range <= groups[i - 1].start_range) { - return OTS_FAILURE_MSG("out of order format 12 subtable group (startCharCode=0x%4X <= startCharCode=0x%4X of previous group)", + return Error("out of order format 12 subtable group (startCharCode=0x%4X <= startCharCode=0x%4X of previous group)", groups[i].start_range, groups[i-1].start_range); } if (groups[i].start_range <= groups[i - 1].end_range) { - return OTS_FAILURE_MSG("overlapping format 12 subtable groups (startCharCode=0x%4X <= endCharCode=0x%4X of previous group)", + return Error("overlapping format 12 subtable groups (startCharCode=0x%4X <= endCharCode=0x%4X of previous group)", groups[i].start_range, groups[i-1].end_range); } } @@ -331,44 +335,43 @@ bool Parse31012(ots::Font *font, return true; } -bool Parse31013(ots::Font *font, - const uint8_t *data, size_t length, uint16_t num_glyphs) { +bool OpenTypeCMAP::Parse31013(const uint8_t *data, size_t length, + uint16_t num_glyphs) { ots::Buffer subtable(data, length); // Format 13 tables are simple. We parse these and fully serialise them // later. if (!subtable.Skip(8)) { - return OTS_FAILURE_MSG("Bad cmap subtable length"); + return Error("Bad cmap subtable length"); } uint32_t language = 0; if (!subtable.ReadU32(&language)) { - return OTS_FAILURE_MSG("Can't read cmap subtable language"); + return Error("Can't read cmap subtable language"); } if (language) { - return OTS_FAILURE_MSG("Cmap subtable language should be zero but is %d", language); + return Error("Cmap subtable language should be zero but is %d", language); } uint32_t num_groups = 0; if (!subtable.ReadU32(&num_groups)) { - return OTS_FAILURE_MSG("Can't read number of groups in a cmap subtable"); + return Error("Can't read number of groups in a cmap subtable"); } // We limit the number of groups in the same way as in 3.10.12 tables. See // the comment there in if (num_groups == 0 || subtable.remaining() / 12 < num_groups) { - return OTS_FAILURE_MSG("Bad format 13 subtable group count %d", num_groups); + return Error("Bad format 13 subtable group count %d", num_groups); } - std::vector<ots::OpenTypeCMAPSubtableRange> &groups - = font->cmap->subtable_3_10_13; + std::vector<ots::OpenTypeCMAPSubtableRange> &groups = this->subtable_3_10_13; groups.resize(num_groups); for (unsigned i = 0; i < num_groups; ++i) { if (!subtable.ReadU32(&groups[i].start_range) || !subtable.ReadU32(&groups[i].end_range) || !subtable.ReadU32(&groups[i].start_glyph_id)) { - return OTS_FAILURE_MSG("Can't read subrange structure in a cmap subtable"); + return Error("Can't read subrange structure in a cmap subtable"); } // We conservatively limit all of the values to protect some parsers from @@ -376,29 +379,29 @@ bool Parse31013(ots::Font *font, if (groups[i].start_range > kUnicodeUpperLimit || groups[i].end_range > kUnicodeUpperLimit || groups[i].start_glyph_id > 0xFFFF) { - return OTS_FAILURE_MSG("Bad subrange with start_range=%d, end_range=%d, start_glyph_id=%d", groups[i].start_range, groups[i].end_range, groups[i].start_glyph_id); + return Error("Bad subrange with start_range=%d, end_range=%d, start_glyph_id=%d", groups[i].start_range, groups[i].end_range, groups[i].start_glyph_id); } if (groups[i].start_glyph_id >= num_glyphs) { - return OTS_FAILURE_MSG("Subrange starting glyph id too high (%d > %d)", groups[i].start_glyph_id, num_glyphs); + return Error("Subrange starting glyph id too high (%d > %d)", groups[i].start_glyph_id, num_glyphs); } } // the groups must be sorted by start code and may not overlap for (unsigned i = 1; i < num_groups; ++i) { if (groups[i].start_range <= groups[i - 1].start_range) { - return OTS_FAILURE_MSG("Overlapping subrange starts (%d >= %d)", groups[i]. start_range, groups[i-1].start_range); + return Error("Overlapping subrange starts (%d >= %d)", groups[i]. start_range, groups[i-1].start_range); } if (groups[i].start_range <= groups[i - 1].end_range) { - return OTS_FAILURE_MSG("Overlapping subranges (%d <= %d)", groups[i].start_range, groups[i-1].end_range); + return Error("Overlapping subranges (%d <= %d)", groups[i].start_range, groups[i-1].end_range); } } return true; } -bool Parse0514(ots::Font *font, - const uint8_t *data, size_t length, uint16_t num_glyphs) { +bool OpenTypeCMAP::Parse0514(const uint8_t *data, size_t length, + uint16_t num_glyphs) { // Unicode Variation Selector table ots::Buffer subtable(data, length); @@ -407,26 +410,26 @@ bool Parse0514(ots::Font *font, // Skip format (USHORT) and length (ULONG) if (!subtable.Skip(6)) { - return OTS_FAILURE_MSG("Can't read start of cmap subtable"); + return Error("Can't read start of cmap subtable"); } uint32_t num_records = 0; if (!subtable.ReadU32(&num_records)) { - return OTS_FAILURE_MSG("Can't read number of records in cmap subtable"); + return Error("Can't read number of records in cmap subtable"); } if (num_records == 0 || num_records > kMaxCMAPSelectorRecords) { - return OTS_FAILURE_MSG("Bad format 14 subtable records count %d", num_records); + return Error("Bad format 14 subtable records count %d", num_records); } std::vector<ots::OpenTypeCMAPSubtableVSRecord>& records - = font->cmap->subtable_0_5_14; + = this->subtable_0_5_14; records.resize(num_records); for (unsigned i = 0; i < num_records; ++i) { if (!subtable.ReadU24(&records[i].var_selector) || !subtable.ReadU32(&records[i].default_offset) || !subtable.ReadU32(&records[i].non_default_offset)) { - return OTS_FAILURE_MSG("Can't read record structure of record %d in cmap subtale", i); + return Error("Can't read record structure of record %d in cmap subtale", i); } // Checks the value of variation selector if (!((records[i].var_selector >= kMongolianVSStart && @@ -435,24 +438,24 @@ bool Parse0514(ots::Font *font, records[i].var_selector <= kVSEnd) || (records[i].var_selector >= kIVSStart && records[i].var_selector <= kIVSEnd))) { - return OTS_FAILURE_MSG("Bad record variation selector (%04X) in record %i", records[i].var_selector, i); + return Error("Bad record variation selector (%04X) in record %i", records[i].var_selector, i); } if (i > 0 && records[i-1].var_selector >= records[i].var_selector) { - return OTS_FAILURE_MSG("Out of order variation selector (%04X >= %04X) in record %d", records[i-1].var_selector, records[i].var_selector, i); + return Error("Out of order variation selector (%04X >= %04X) in record %d", records[i-1].var_selector, records[i].var_selector, i); } // Checks offsets if (!records[i].default_offset && !records[i].non_default_offset) { - return OTS_FAILURE_MSG("No default aoffset in variation selector record %d", i); + return Error("No default aoffset in variation selector record %d", i); } if (records[i].default_offset && records[i].default_offset >= length) { - return OTS_FAILURE_MSG("Default offset too high (%d >= %ld) in record %d", records[i].default_offset, length, i); + return Error("Default offset too high (%d >= %ld) in record %d", records[i].default_offset, length, i); } if (records[i].non_default_offset && records[i].non_default_offset >= length) { - return OTS_FAILURE_MSG("Non default offset too high (%d >= %ld) in record %d", records[i].non_default_offset, length, i); + return Error("Non default offset too high (%d >= %ld) in record %d", records[i].non_default_offset, length, i); } } @@ -462,10 +465,10 @@ bool Parse0514(ots::Font *font, subtable.set_offset(records[i].default_offset); uint32_t num_ranges = 0; if (!subtable.ReadU32(&num_ranges)) { - return OTS_FAILURE_MSG("Can't read number of ranges in record %d", i); + return Error("Can't read number of ranges in record %d", i); } if (num_ranges == 0 || subtable.remaining() / 4 < num_ranges) { - return OTS_FAILURE_MSG("Bad number of ranges (%d) in record %d", num_ranges, i); + return Error("Bad number of ranges (%d) in record %d", num_ranges, i); } uint32_t last_unicode_value = 0; @@ -476,7 +479,7 @@ bool Parse0514(ots::Font *font, for (unsigned j = 0; j < num_ranges; ++j) { if (!subtable.ReadU24(&ranges[j].unicode_value) || !subtable.ReadU8(&ranges[j].additional_count)) { - return OTS_FAILURE_MSG("Can't read range info in variation selector record %d", i); + return Error("Can't read range info in variation selector record %d", i); } const uint32_t check_value = ranges[j].unicode_value + ranges[j].additional_count; @@ -485,7 +488,7 @@ bool Parse0514(ots::Font *font, check_value > kUVSUpperLimit || (last_unicode_value && ranges[j].unicode_value <= last_unicode_value)) { - return OTS_FAILURE_MSG("Bad Unicode value *%04X) in variation selector range %d record %d", ranges[j].unicode_value, j, i); + return Error("Bad Unicode value *%04X) in variation selector range %d record %d", ranges[j].unicode_value, j, i); } last_unicode_value = check_value; } @@ -496,10 +499,10 @@ bool Parse0514(ots::Font *font, subtable.set_offset(records[i].non_default_offset); uint32_t num_mappings = 0; if (!subtable.ReadU32(&num_mappings)) { - return OTS_FAILURE_MSG("Can't read number of mappings in variation selector record %d", i); + return Error("Can't read number of mappings in variation selector record %d", i); } if (num_mappings == 0 || subtable.remaining() / 5 < num_mappings) { - return OTS_FAILURE_MSG("Bad number of mappings (%d) in variation selector record %d", num_mappings, i); + return Error("Bad number of mappings (%d) in variation selector record %d", num_mappings, i); } uint32_t last_unicode_value = 0; @@ -510,14 +513,14 @@ bool Parse0514(ots::Font *font, for (unsigned j = 0; j < num_mappings; ++j) { if (!subtable.ReadU24(&mappings[j].unicode_value) || !subtable.ReadU16(&mappings[j].glyph_id)) { - return OTS_FAILURE_MSG("Can't read mapping %d in variation selector record %d", j, i); + return Error("Can't read mapping %d in variation selector record %d", j, i); } if (mappings[j].glyph_id == 0 || mappings[j].unicode_value == 0 || mappings[j].unicode_value > kUnicodeUpperLimit || (last_unicode_value && mappings[j].unicode_value <= last_unicode_value)) { - return OTS_FAILURE_MSG("Bad mapping (%04X -> %d) in mapping %d of variation selector %d", mappings[j].unicode_value, mappings[j].glyph_id, j, i); + return Error("Bad mapping (%04X -> %d) in mapping %d of variation selector %d", mappings[j].unicode_value, mappings[j].glyph_id, j, i); } last_unicode_value = mappings[j].unicode_value; } @@ -525,60 +528,55 @@ bool Parse0514(ots::Font *font, } if (subtable.offset() != length) { - return OTS_FAILURE_MSG("Bad subtable offset (%ld != %ld)", subtable.offset(), length); + return Error("Bad subtable offset (%ld != %ld)", subtable.offset(), length); } - font->cmap->subtable_0_5_14_length = subtable.offset(); + this->subtable_0_5_14_length = subtable.offset(); return true; } -bool Parse100(ots::Font *font, const uint8_t *data, size_t length) { +bool OpenTypeCMAP::Parse100(const uint8_t *data, size_t length) { // Mac Roman table ots::Buffer subtable(data, length); if (!subtable.Skip(4)) { - return OTS_FAILURE_MSG("Bad cmap subtable"); + return Error("Bad cmap subtable"); } uint16_t language = 0; if (!subtable.ReadU16(&language)) { - return OTS_FAILURE_MSG("Can't read language in cmap subtable"); + return Error("Can't read language in cmap subtable"); } if (language) { // simsun.ttf has non-zero language id. - OTS_WARNING("language id should be zero: %u", language); + Warning("language id should be zero: %u", language); } - font->cmap->subtable_1_0_0.reserve(kFormat0ArraySize); + this->subtable_1_0_0.reserve(kFormat0ArraySize); for (size_t i = 0; i < kFormat0ArraySize; ++i) { uint8_t glyph_id = 0; if (!subtable.ReadU8(&glyph_id)) { - return OTS_FAILURE_MSG("Can't read glyph id at array[%ld] in cmap subtable", i); + return Error("Can't read glyph id at array[%ld] in cmap subtable", i); } - font->cmap->subtable_1_0_0.push_back(glyph_id); + this->subtable_1_0_0.push_back(glyph_id); } return true; } -} // namespace - -namespace ots { - -bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeCMAP::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - font->cmap = new OpenTypeCMAP; uint16_t version = 0; uint16_t num_tables = 0; if (!table.ReadU16(&version) || !table.ReadU16(&num_tables)) { - return OTS_FAILURE_MSG("Can't read structure of cmap"); + return Error("Can't read structure of cmap"); } if (version != 0) { - return OTS_FAILURE_MSG("Non zero cmap version (%d)", version); + return Error("Non zero cmap version (%d)", version); } if (!num_tables) { - return OTS_FAILURE_MSG("No subtables in cmap!"); + return Error("No subtables in cmap!"); } std::vector<CMAPSubtableHeader> subtable_headers; @@ -591,7 +589,7 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { if (!table.ReadU16(&subt.platform) || !table.ReadU16(&subt.encoding) || !table.ReadU32(&subt.offset)) { - return OTS_FAILURE_MSG("Can't read subtable information cmap subtable %d", i); + return Error("Can't read subtable information cmap subtable %d", i); } subtable_headers.push_back(subt); @@ -602,11 +600,11 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { // make sure that all the offsets are valid. for (unsigned i = 0; i < num_tables; ++i) { if (subtable_headers[i].offset > 1024 * 1024 * 1024) { - return OTS_FAILURE_MSG("Bad subtable offset in cmap subtable %d", i); + return Error("Bad subtable offset in cmap subtable %d", i); } if (subtable_headers[i].offset < data_offset || subtable_headers[i].offset >= length) { - return OTS_FAILURE_MSG("Bad subtable offset (%d) in cmap subtable %d", subtable_headers[i].offset, i); + return Error("Bad subtable offset (%d) in cmap subtable %d", subtable_headers[i].offset, i); } } @@ -615,7 +613,7 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { for (unsigned i = 0; i < num_tables; ++i) { table.set_offset(subtable_headers[i].offset); if (!table.ReadU16(&subtable_headers[i].format)) { - return OTS_FAILURE_MSG("Can't read cmap subtable header format %d", i); + return Error("Can't read cmap subtable header format %d", i); } uint16_t len = 0; @@ -624,10 +622,10 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { case 0: case 4: if (!table.ReadU16(&len)) { - return OTS_FAILURE_MSG("Can't read cmap subtable %d length", i); + return Error("Can't read cmap subtable %d length", i); } if (!table.ReadU16(&lang)) { - return OTS_FAILURE_MSG("Can't read cmap subtable %d language", i); + return Error("Can't read cmap subtable %d language", i); } subtable_headers[i].length = len; subtable_headers[i].language = lang; @@ -635,18 +633,18 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { case 12: case 13: if (!table.Skip(2)) { - return OTS_FAILURE_MSG("Bad cmap subtable %d structure", i); + return Error("Bad cmap subtable %d structure", i); } if (!table.ReadU32(&subtable_headers[i].length)) { - return OTS_FAILURE_MSG("Can read cmap subtable %d length", i); + return Error("Can read cmap subtable %d length", i); } if (!table.ReadU32(&subtable_headers[i].language)) { - return OTS_FAILURE_MSG("Can't read cmap subtable %d language", i); + return Error("Can't read cmap subtable %d language", i); } break; case 14: if (!table.ReadU32(&subtable_headers[i].length)) { - return OTS_FAILURE_MSG("Can't read cmap subtable %d length", i); + return Error("Can't read cmap subtable %d length", i); } subtable_headers[i].language = 0; break; @@ -664,7 +662,7 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { (subtable_headers[i - 1].encoding > subtable_headers[i].encoding || (subtable_headers[i - 1].encoding == subtable_headers[i].encoding && subtable_headers[i - 1].language > subtable_headers[i].language)))) - OTS_WARNING("subtable %d with platform ID %d, encoding ID %d, language ID %d " + Warning("subtable %d with platform ID %d, encoding ID %d, language ID %d " "following subtable with platform ID %d, encoding ID %d, language ID %d", i, subtable_headers[i].platform, @@ -679,14 +677,14 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { for (unsigned i = 0; i < num_tables; ++i) { if (!subtable_headers[i].length) continue; if (subtable_headers[i].length > 1024 * 1024 * 1024) { - return OTS_FAILURE_MSG("Bad cmap subtable %d length", i); + return Error("Bad cmap subtable %d length", i); } // We know that both the offset and length are < 1GB, so the following // addition doesn't overflow const uint32_t end_byte = subtable_headers[i].offset + subtable_headers[i].length; if (end_byte > length) { - return OTS_FAILURE_MSG("Over long cmap subtable %d @ %d for %d", i, subtable_headers[i].offset, subtable_headers[i].length); + return Error("Over long cmap subtable %d @ %d for %d", i, subtable_headers[i].offset, subtable_headers[i].length); } } @@ -714,16 +712,18 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { for (unsigned i = 0; i < overlap_checker.size(); ++i) { overlap_count += (overlap_checker[i].second ? 1 : -1); if (overlap_count > 1) { - return OTS_FAILURE_MSG("Excessive overlap count %d", overlap_count); + return Error("Excessive overlap count %d", overlap_count); } } // we grab the number of glyphs in the file from the maxp table to make sure // that the character map isn't referencing anything beyound this range. - if (!font->maxp) { - return OTS_FAILURE_MSG("No maxp table in font! Needed by cmap."); + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return Error("No maxp table in font! Needed by cmap."); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + const uint16_t num_glyphs = maxp->num_glyphs; // We only support a subset of the possible character map tables. Microsoft // 'strongly recommends' that everyone supports the Unicode BMP table with @@ -760,29 +760,30 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { // table actually points to MS symbol data and thus should be parsed as // 3-0-4 table (e.g., marqueem.ttf and quixotic.ttf). This error will be // recovered in ots_cmap_serialise(). - if (!ParseFormat4(font, 3, 1, data + subtable_headers[i].offset, + if (!ParseFormat4(3, 1, data + subtable_headers[i].offset, subtable_headers[i].length, num_glyphs)) { - return OTS_FAILURE_MSG("Failed to parse format 4 cmap subtable %d", i); + return Error("Failed to parse format 4 cmap subtable %d", i); } } else if ((subtable_headers[i].encoding == 3) && (subtable_headers[i].format == 4)) { // parse and output the 0-3-4 table as 0-3-4 table. - if (!ParseFormat4(font, 0, 3, data + subtable_headers[i].offset, + if (!ParseFormat4(0, 3, data + subtable_headers[i].offset, subtable_headers[i].length, num_glyphs)) { - return OTS_FAILURE_MSG("Failed to parse format 4 cmap subtable %d", i); + return Error("Failed to parse format 4 cmap subtable %d", i); } - } else if ((subtable_headers[i].encoding == 3) && + } else if ((subtable_headers[i].encoding == 3 || + subtable_headers[i].encoding == 4) && (subtable_headers[i].format == 12)) { - // parse and output the 0-3-12 table as 3-10-12 table. - if (!Parse31012(font, data + subtable_headers[i].offset, + // parse and output the 0-3-12 or 0-4-12 tables as 3-10-12 table. + if (!Parse31012(data + subtable_headers[i].offset, subtable_headers[i].length, num_glyphs)) { - return OTS_FAILURE_MSG("Failed to parse format 12 cmap subtable %d", i); + return Error("Failed to parse format 12 cmap subtable %d", i); } } else if ((subtable_headers[i].encoding == 5) && (subtable_headers[i].format == 14)) { - if (!Parse0514(font, data + subtable_headers[i].offset, + if (!Parse0514(data + subtable_headers[i].offset, subtable_headers[i].length, num_glyphs)) { - return OTS_FAILURE_MSG("Failed to parse format 14 cmap subtable %d", i); + return Error("Failed to parse format 14 cmap subtable %d", i); } } } else if (subtable_headers[i].platform == 1) { @@ -791,7 +792,7 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { if ((subtable_headers[i].encoding == 0) && (subtable_headers[i].format == 0)) { // parse and output the 1-0-0 table. - if (!Parse100(font, data + subtable_headers[i].offset, + if (!Parse100(data + subtable_headers[i].offset, subtable_headers[i].length)) { return OTS_FAILURE(); } @@ -804,7 +805,7 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { case 1: if (subtable_headers[i].format == 4) { // parse 3-0-4 or 3-1-4 table. - if (!ParseFormat4(font, subtable_headers[i].platform, + if (!ParseFormat4(subtable_headers[i].platform, subtable_headers[i].encoding, data + subtable_headers[i].offset, subtable_headers[i].length, num_glyphs)) { @@ -814,14 +815,14 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { break; case 10: if (subtable_headers[i].format == 12) { - font->cmap->subtable_3_10_12.clear(); - if (!Parse31012(font, data + subtable_headers[i].offset, + this->subtable_3_10_12.clear(); + if (!Parse31012(data + subtable_headers[i].offset, subtable_headers[i].length, num_glyphs)) { return OTS_FAILURE(); } } else if (subtable_headers[i].format == 13) { - font->cmap->subtable_3_10_13.clear(); - if (!Parse31013(font, data + subtable_headers[i].offset, + this->subtable_3_10_13.clear(); + if (!Parse31013(data + subtable_headers[i].offset, subtable_headers[i].length, num_glyphs)) { return OTS_FAILURE(); } @@ -834,20 +835,16 @@ bool ots_cmap_parse(Font *font, const uint8_t *data, size_t length) { return true; } -bool ots_cmap_should_serialise(Font *font) { - return font->cmap != NULL; -} - -bool ots_cmap_serialise(OTSStream *out, Font *font) { - const bool have_034 = font->cmap->subtable_0_3_4_data != NULL; - const bool have_0514 = font->cmap->subtable_0_5_14.size() != 0; - const bool have_100 = font->cmap->subtable_1_0_0.size() != 0; - const bool have_304 = font->cmap->subtable_3_0_4_data != NULL; +bool OpenTypeCMAP::Serialize(OTSStream *out) { + const bool have_034 = this->subtable_0_3_4_data != NULL; + const bool have_0514 = this->subtable_0_5_14.size() != 0; + const bool have_100 = this->subtable_1_0_0.size() != 0; + const bool have_304 = this->subtable_3_0_4_data != NULL; // MS Symbol and MS Unicode tables should not co-exist. // See the comment above in 0-0-4 parser. - const bool have_314 = (!have_304) && font->cmap->subtable_3_1_4_data; - const bool have_31012 = font->cmap->subtable_3_10_12.size() != 0; - const bool have_31013 = font->cmap->subtable_3_10_13.size() != 0; + const bool have_314 = (!have_304) && this->subtable_3_1_4_data; + const bool have_31012 = this->subtable_3_10_12.size() != 0; + const bool have_31013 = this->subtable_3_10_13.size() != 0; const uint16_t num_subtables = static_cast<uint16_t>(have_034) + static_cast<uint16_t>(have_0514) + static_cast<uint16_t>(have_100) + @@ -860,7 +857,7 @@ bool ots_cmap_serialise(OTSStream *out, Font *font) { // Some fonts don't have 3-0-4 MS Symbol nor 3-1-4 Unicode BMP tables // (e.g., old fonts for Mac). We don't support them. if (!have_304 && !have_314 && !have_034 && !have_31012 && !have_31013) { - return OTS_FAILURE_MSG("no supported subtables were found"); + return Error("no supported subtables were found"); } if (!out->WriteU16(0) || @@ -875,8 +872,8 @@ bool ots_cmap_serialise(OTSStream *out, Font *font) { const off_t offset_034 = out->Tell(); if (have_034) { - if (!out->Write(font->cmap->subtable_0_3_4_data, - font->cmap->subtable_0_3_4_length)) { + if (!out->Write(this->subtable_0_3_4_data, + this->subtable_0_3_4_length)) { return OTS_FAILURE(); } } @@ -884,10 +881,10 @@ bool ots_cmap_serialise(OTSStream *out, Font *font) { const off_t offset_0514 = out->Tell(); if (have_0514) { const std::vector<ots::OpenTypeCMAPSubtableVSRecord> &records - = font->cmap->subtable_0_5_14; + = this->subtable_0_5_14; const unsigned num_records = records.size(); if (!out->WriteU16(14) || - !out->WriteU32(font->cmap->subtable_0_5_14_length) || + !out->WriteU32(this->subtable_0_5_14_length) || !out->WriteU32(num_records)) { return OTS_FAILURE(); } @@ -939,23 +936,23 @@ bool ots_cmap_serialise(OTSStream *out, Font *font) { !out->WriteU16(0)) { // language return OTS_FAILURE(); } - if (!out->Write(&(font->cmap->subtable_1_0_0[0]), kFormat0ArraySize)) { + if (!out->Write(&(this->subtable_1_0_0[0]), kFormat0ArraySize)) { return OTS_FAILURE(); } } const off_t offset_304 = out->Tell(); if (have_304) { - if (!out->Write(font->cmap->subtable_3_0_4_data, - font->cmap->subtable_3_0_4_length)) { + if (!out->Write(this->subtable_3_0_4_data, + this->subtable_3_0_4_length)) { return OTS_FAILURE(); } } const off_t offset_314 = out->Tell(); if (have_314) { - if (!out->Write(font->cmap->subtable_3_1_4_data, - font->cmap->subtable_3_1_4_length)) { + if (!out->Write(this->subtable_3_1_4_data, + this->subtable_3_1_4_length)) { return OTS_FAILURE(); } } @@ -963,7 +960,7 @@ bool ots_cmap_serialise(OTSStream *out, Font *font) { const off_t offset_31012 = out->Tell(); if (have_31012) { std::vector<OpenTypeCMAPSubtableRange> &groups - = font->cmap->subtable_3_10_12; + = this->subtable_3_10_12; const unsigned num_groups = groups.size(); if (!out->WriteU16(12) || !out->WriteU16(0) || @@ -985,7 +982,7 @@ bool ots_cmap_serialise(OTSStream *out, Font *font) { const off_t offset_31013 = out->Tell(); if (have_31013) { std::vector<OpenTypeCMAPSubtableRange> &groups - = font->cmap->subtable_3_10_13; + = this->subtable_3_10_13; const unsigned num_groups = groups.size(); if (!out->WriteU16(13) || !out->WriteU16(0) || @@ -1074,15 +1071,4 @@ bool ots_cmap_serialise(OTSStream *out, Font *font) { return true; } -void ots_cmap_reuse(Font *font, Font *other) { - font->cmap = other->cmap; - font->cmap_reused = true; -} - -void ots_cmap_free(Font *font) { - delete font->cmap; -} - } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/cmap.h b/gfx/ots/src/cmap.h index 5b09556b7..feddbc696 100644 --- a/gfx/ots/src/cmap.h +++ b/gfx/ots/src/cmap.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -35,9 +35,11 @@ struct OpenTypeCMAPSubtableVSRecord { std::vector<OpenTypeCMAPSubtableVSMapping> mappings; }; -struct OpenTypeCMAP { - OpenTypeCMAP() - : subtable_0_3_4_data(NULL), +class OpenTypeCMAP : public Table { + public: + explicit OpenTypeCMAP(Font *font, uint32_t tag) + : Table(font, tag, tag), + subtable_0_3_4_data(NULL), subtable_0_3_4_length(0), subtable_0_5_14_length(0), subtable_3_0_4_data(NULL), @@ -46,6 +48,10 @@ struct OpenTypeCMAP { subtable_3_1_4_length(0) { } + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + + private: // Platform 0, Encoding 3, Format 4, Unicode BMP table. const uint8_t *subtable_0_3_4_data; size_t subtable_0_3_4_length; @@ -67,6 +73,13 @@ struct OpenTypeCMAP { std::vector<OpenTypeCMAPSubtableRange> subtable_3_10_13; // Platform 1, Encoding 0, Format 0, Mac Roman table. std::vector<uint8_t> subtable_1_0_0; + + bool ParseFormat4(int platform, int encoding, const uint8_t *data, + size_t length, uint16_t num_glyphs); + bool Parse31012(const uint8_t *data, size_t length, uint16_t num_glyphs); + bool Parse31013(const uint8_t *data, size_t length, uint16_t num_glyphs); + bool Parse0514(const uint8_t *data, size_t length, uint16_t num_glyphs); + bool Parse100(const uint8_t *data, size_t length); }; } // namespace ots diff --git a/gfx/ots/src/cvar.cc b/gfx/ots/src/cvar.cc new file mode 100644 index 000000000..a2bad7a15 --- /dev/null +++ b/gfx/ots/src/cvar.cc @@ -0,0 +1,56 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cvar.h" + +#include "fvar.h" +#include "variations.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeCVAR +// ----------------------------------------------------------------------------- + +bool OpenTypeCVAR::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + + uint16_t majorVersion; + uint16_t minorVersion; + + if (!table.ReadU16(&majorVersion) || + !table.ReadU16(&minorVersion)) { + return Drop("Failed to read table header"); + } + + if (majorVersion != 1) { + return Drop("Unknown table version"); + } + + OpenTypeFVAR* fvar = static_cast<OpenTypeFVAR*>( + GetFont()->GetTypedTable(OTS_TAG_FVAR)); + if (!fvar) { + return DropVariations("Required fvar table is missing"); + } + + if (!ParseVariationData(GetFont(), data + table.offset(), length - table.offset(), + fvar->AxisCount(), 0)) { + return Drop("Failed to parse variation data"); + } + + this->m_data = data; + this->m_length = length; + + return true; +} + +bool OpenTypeCVAR::Serialize(OTSStream* out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write cvar table"); + } + + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/cvar.h b/gfx/ots/src/cvar.h new file mode 100644 index 000000000..8f31e98cd --- /dev/null +++ b/gfx/ots/src/cvar.h @@ -0,0 +1,31 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_CVAR_H_ +#define OTS_CVAR_H_ + +#include "ots.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeCVAR Interface +// ----------------------------------------------------------------------------- + +class OpenTypeCVAR : public Table { + public: + explicit OpenTypeCVAR(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + const uint8_t *m_data; + size_t m_length; +}; + +} // namespace ots + +#endif // OTS_CVAR_H_ diff --git a/gfx/ots/src/cvt.cc b/gfx/ots/src/cvt.cc index 1402e7c06..2e0257889 100644 --- a/gfx/ots/src/cvt.cc +++ b/gfx/ots/src/cvt.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,59 +7,40 @@ // cvt - Control Value Table // http://www.microsoft.com/typography/otspec/cvt.htm -#define TABLE_NAME "cvt" - namespace ots { -bool ots_cvt_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeCVT::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeCVT *cvt = new OpenTypeCVT; - font->cvt = cvt; - if (length >= 128 * 1024u) { - return OTS_FAILURE_MSG("Length (%d) > 120K"); // almost all cvt tables are less than 4k bytes. + return Error("Length (%d) > 120K"); // almost all cvt tables are less than 4k bytes. } if (length % 2 != 0) { - return OTS_FAILURE_MSG("Uneven cvt length (%d)", length); + return Error("Uneven table length (%d)", length); } if (!table.Skip(length)) { - return OTS_FAILURE_MSG("Length too high"); + return Error("Table length too high"); } - cvt->data = data; - cvt->length = length; + this->data = data; + this->length = length; return true; } -bool ots_cvt_should_serialise(Font *font) { - if (!font->glyf) { - return false; // this table is not for CFF fonts. - } - return font->cvt != NULL; -} - -bool ots_cvt_serialise(OTSStream *out, Font *font) { - const OpenTypeCVT *cvt = font->cvt; - - if (!out->Write(cvt->data, cvt->length)) { - return OTS_FAILURE_MSG("Failed to write CVT table"); +bool OpenTypeCVT::Serialize(OTSStream *out) { + if (!out->Write(this->data, this->length)) { + return Error("Failed to write cvt table"); } return true; } -void ots_cvt_reuse(Font *font, Font *other) { - font->cvt = other->cvt; - font->cvt_reused = true; -} - -void ots_cvt_free(Font *font) { - delete font->cvt; +bool OpenTypeCVT::ShouldSerialize() { + return Table::ShouldSerialize() && + // this table is not for CFF fonts. + GetFont()->GetTable(OTS_TAG_GLYF) != NULL; } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/cvt.h b/gfx/ots/src/cvt.h index 3c25f06f6..88a96ca20 100644 --- a/gfx/ots/src/cvt.h +++ b/gfx/ots/src/cvt.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,7 +9,16 @@ namespace ots { -struct OpenTypeCVT { +class OpenTypeCVT : public Table { + public: + explicit OpenTypeCVT(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: const uint8_t *data; uint32_t length; }; diff --git a/gfx/ots/src/feat.cc b/gfx/ots/src/feat.cc new file mode 100644 index 000000000..374a7ae9f --- /dev/null +++ b/gfx/ots/src/feat.cc @@ -0,0 +1,193 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "feat.h" + +#include "name.h" + +namespace ots { + +bool OpenTypeFEAT::Parse(const uint8_t* data, size_t length) { + if (GetFont()->dropped_graphite) { + return Drop("Skipping Graphite table"); + } + Buffer table(data, length); + + if (!table.ReadU32(&this->version)) { + return DropGraphite("Failed to read version"); + } + if (this->version >> 16 != 1 && this->version >> 16 != 2) { + return DropGraphite("Unsupported table version: %u", this->version >> 16); + } + if (!table.ReadU16(&this->numFeat)) { + return DropGraphite("Failed to read numFeat"); + } + if (!table.ReadU16(&this->reserved)) { + return DropGraphite("Failed to read reserved"); + } + if (this->reserved != 0) { + Warning("Nonzero reserved"); + } + if (!table.ReadU32(&this->reserved2)) { + return DropGraphite("Failed to read valid reserved2"); + } + if (this->reserved2 != 0) { + Warning("Nonzero reserved2"); + } + + std::unordered_set<size_t> unverified; + //this->features.resize(this->numFeat, this); + for (unsigned i = 0; i < this->numFeat; ++i) { + this->features.emplace_back(this); + FeatureDefn& feature = this->features[i]; + if (!feature.ParsePart(table)) { + return DropGraphite("Failed to read features[%u]", i); + } + this->feature_ids.insert(feature.id); + for (unsigned j = 0; j < feature.numSettings; ++j) { + size_t offset = feature.offset + j * 4; + if (offset < feature.offset || offset > length) { + return DropGraphite("Invalid FeatSettingDefn offset %zu/%zu", + offset, length); + } + unverified.insert(offset); + // need to verify that this FeatureDefn points to valid + // FeatureSettingDefn + } + } + + while (table.remaining()) { + bool used = unverified.erase(table.offset()); + FeatureSettingDefn featSetting(this); + if (!featSetting.ParsePart(table, used)) { + return DropGraphite("Failed to read a FeatureSettingDefn"); + } + featSettings.push_back(featSetting); + } + + if (!unverified.empty()) { + return DropGraphite("%zu incorrect offsets into featSettings", + unverified.size()); + } + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + return true; +} + +bool OpenTypeFEAT::Serialize(OTSStream* out) { + if (!out->WriteU32(this->version) || + !out->WriteU16(this->numFeat) || + !out->WriteU16(this->reserved) || + !out->WriteU32(this->reserved2) || + !SerializeParts(this->features, out) || + !SerializeParts(this->featSettings, out)) { + return Error("Failed to write table"); + } + return true; +} + +bool OpenTypeFEAT::IsValidFeatureId(uint32_t id) const { + return feature_ids.count(id); +} + +bool OpenTypeFEAT::FeatureDefn::ParsePart(Buffer& table) { + OpenTypeNAME* name = static_cast<OpenTypeNAME*>( + parent->GetFont()->GetTypedTable(OTS_TAG_NAME)); + if (!name) { + return parent->Error("FeatureDefn: Required name table is missing"); + } + + if (parent->version >> 16 >= 2 && !table.ReadU32(&this->id)) { + return parent->Error("FeatureDefn: Failed to read id"); + } + if (parent->version >> 16 == 1) { + uint16_t id; + if (!table.ReadU16(&id)) { + return parent->Error("FeatureDefn: Failed to read id"); + } + this->id = id; + } + if (!table.ReadU16(&this->numSettings)) { + return parent->Error("FeatureDefn: Failed to read numSettings"); + } + if (parent->version >> 16 >= 2) { + if (!table.ReadU16(&this->reserved)) { + return parent->Error("FeatureDefn: Failed to read reserved"); + } + if (this->reserved != 0) { + parent->Warning("FeatureDefn: Nonzero reserved"); + } + } + if (!table.ReadU32(&this->offset)) { + return parent->Error("FeatureDefn: Failed to read offset"); + } // validity of offset verified in OpenTypeFEAT::Parse + if (!table.ReadU16(&this->flags)) { + return parent->Error("FeatureDefn: Failed to read flags"); + } + if ((this->flags & RESERVED) != 0) { + this->flags &= ~RESERVED; + parent->Warning("FeatureDefn: Nonzero (flags & 0x%x) repaired", RESERVED); + } + if (this->flags & HAS_DEFAULT_SETTING && + (this->flags & DEFAULT_SETTING) >= this->numSettings) { + return parent->Error("FeatureDefn: (flags & 0x%x) is set but (flags & 0x%x " + "is not a valid setting index", HAS_DEFAULT_SETTING, + DEFAULT_SETTING); + } + if (!table.ReadU16(&this->label)) { + return parent->Error("FeatureDefn: Failed to read label"); + } + if (!name->IsValidNameId(this->label)) { + if (this->id == 1 && name->IsValidNameId(this->label, true)) { + parent->Warning("FeatureDefn: Missing NameRecord repaired for feature" + " with id=%u, label=%u", this->id, this->label); + } + else { + return parent->Error("FeatureDefn: Invalid label"); + } + } + return true; +} + +bool OpenTypeFEAT::FeatureDefn::SerializePart(OTSStream* out) const { + if ((parent->version >> 16 >= 2 && !out->WriteU32(this->id)) || + (parent->version >> 16 == 1 && + !out->WriteU16(static_cast<uint16_t>(this->id))) || + !out->WriteU16(this->numSettings) || + (parent->version >> 16 >= 2 && !out->WriteU16(this->reserved)) || + !out->WriteU32(this->offset) || + !out->WriteU16(this->flags) || + !out->WriteU16(this->label)) { + return parent->Error("FeatureDefn: Failed to write"); + } + return true; +} + +bool OpenTypeFEAT::FeatureSettingDefn::ParsePart(Buffer& table, bool used) { + OpenTypeNAME* name = static_cast<OpenTypeNAME*>( + parent->GetFont()->GetTypedTable(OTS_TAG_NAME)); + if (!name) { + return parent->Error("FeatureSettingDefn: Required name table is missing"); + } + + if (!table.ReadS16(&this->value)) { + return parent->Error("FeatureSettingDefn: Failed to read value"); + } + if (!table.ReadU16(&this->label) || + (used && !name->IsValidNameId(this->label))) { + return parent->Error("FeatureSettingDefn: Failed to read valid label"); + } + return true; +} + +bool OpenTypeFEAT::FeatureSettingDefn::SerializePart(OTSStream* out) const { + if (!out->WriteS16(this->value) || + !out->WriteU16(this->label)) { + return parent->Error("FeatureSettingDefn: Failed to write"); + } + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/feat.h b/gfx/ots/src/feat.h new file mode 100644 index 000000000..29c2656ff --- /dev/null +++ b/gfx/ots/src/feat.h @@ -0,0 +1,61 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_FEAT_H_ +#define OTS_FEAT_H_ + +#include <vector> +#include <unordered_set> + +#include "ots.h" +#include "graphite.h" + +namespace ots { + +class OpenTypeFEAT : public Table { + public: + explicit OpenTypeFEAT(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + bool IsValidFeatureId(uint32_t id) const; + + private: + struct FeatureDefn : public TablePart<OpenTypeFEAT> { + explicit FeatureDefn(OpenTypeFEAT* parent) + : TablePart<OpenTypeFEAT>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + uint32_t id; + uint16_t numSettings; + uint16_t reserved; + uint32_t offset; + uint16_t flags; + static const uint16_t HAS_DEFAULT_SETTING = 0x4000; + static const uint16_t RESERVED = 0x3F00; + static const uint16_t DEFAULT_SETTING = 0x00FF; + uint16_t label; + }; + struct FeatureSettingDefn : public TablePart<OpenTypeFEAT> { + explicit FeatureSettingDefn(OpenTypeFEAT* parent) + : TablePart<OpenTypeFEAT>(parent) { } + bool ParsePart(Buffer& table) { return ParsePart(table, true); } + bool ParsePart(Buffer& table, bool used); + bool SerializePart(OTSStream* out) const; + int16_t value; + uint16_t label; + }; + uint32_t version; + uint16_t numFeat; + uint16_t reserved; + uint32_t reserved2; + std::vector<FeatureDefn> features; + std::vector<FeatureSettingDefn> featSettings; + std::unordered_set<uint32_t> feature_ids; +}; + +} // namespace ots + +#endif // OTS_FEAT_H_ diff --git a/gfx/ots/src/fpgm.cc b/gfx/ots/src/fpgm.cc index faa9a2392..bb52b367f 100644 --- a/gfx/ots/src/fpgm.cc +++ b/gfx/ots/src/fpgm.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,53 +7,36 @@ // fpgm - Font Program // http://www.microsoft.com/typography/otspec/fpgm.htm -#define TABLE_NAME "fpgm" - namespace ots { -bool ots_fpgm_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeFPGM::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeFPGM *fpgm = new OpenTypeFPGM; - font->fpgm = fpgm; - if (length >= 128 * 1024u) { - return OTS_FAILURE_MSG("length (%ld) > 120", length); // almost all fpgm tables are less than 5k bytes. + return Error("length (%ld) > 120", length); // almost all fpgm tables are less than 5k bytes. } if (!table.Skip(length)) { - return OTS_FAILURE_MSG("Bad fpgm length"); + return Error("Bad table length"); } - fpgm->data = data; - fpgm->length = length; + this->data = data; + this->length = length; return true; } -bool ots_fpgm_should_serialise(Font *font) { - if (!font->glyf) return false; // this table is not for CFF fonts. - return font->fpgm != NULL; -} - -bool ots_fpgm_serialise(OTSStream *out, Font *font) { - const OpenTypeFPGM *fpgm = font->fpgm; - - if (!out->Write(fpgm->data, fpgm->length)) { - return OTS_FAILURE_MSG("Failed to write fpgm"); +bool OpenTypeFPGM::Serialize(OTSStream *out) { + if (!out->Write(this->data, this->length)) { + return Error("Failed to write fpgm table"); } return true; } -void ots_fpgm_reuse(Font *font, Font *other) { - font->fpgm = other->fpgm; - font->fpgm_reused = true; -} - -void ots_fpgm_free(Font *font) { - delete font->fpgm; +bool OpenTypeFPGM::ShouldSerialize() { + return Table::ShouldSerialize() && + // this table is not for CFF fonts. + GetFont()->GetTable(OTS_TAG_GLYF) != NULL; } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/fpgm.h b/gfx/ots/src/fpgm.h index 8fabac36d..9ed6b34bf 100644 --- a/gfx/ots/src/fpgm.h +++ b/gfx/ots/src/fpgm.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,7 +9,16 @@ namespace ots { -struct OpenTypeFPGM { +class OpenTypeFPGM : public Table { + public: + explicit OpenTypeFPGM(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: const uint8_t *data; uint32_t length; }; diff --git a/gfx/ots/src/fvar.cc b/gfx/ots/src/fvar.cc new file mode 100644 index 000000000..6f9b4d6eb --- /dev/null +++ b/gfx/ots/src/fvar.cc @@ -0,0 +1,164 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "fvar.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeFVAR +// ----------------------------------------------------------------------------- + +bool OpenTypeFVAR::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + if (!table.ReadU16(&this->majorVersion) || + !table.ReadU16(&this->minorVersion) || + !table.ReadU16(&this->axesArrayOffset) || + !table.ReadU16(&this->reserved) || + !table.ReadU16(&this->axisCount) || + !table.ReadU16(&this->axisSize) || + !table.ReadU16(&this->instanceCount) || + !table.ReadU16(&this->instanceSize)) { + return DropVariations("Failed to read table header"); + } + if (this->majorVersion != 1) { + return DropVariations("Unknown table version"); + } + if (this->minorVersion > 0) { + Warning("Downgrading minor version to 0"); + this->minorVersion = 0; + } + if (this->axesArrayOffset > length || this->axesArrayOffset < table.offset()) { + return DropVariations("Bad axesArrayOffset"); + } + if (this->reserved != 2) { + Warning("Expected reserved=2"); + this->reserved = 2; + } + if (this->axisCount == 0) { + return DropVariations("No variation axes"); + } + if (this->axisSize != 20) { + return DropVariations("Invalid axisSize"); + } + // instanceCount is not validated + if (this->instanceSize == this->axisCount * sizeof(Fixed) + 6) { + this->instancesHavePostScriptNameID = true; + } else if (this->instanceSize == this->axisCount * sizeof(Fixed) + 4) { + this->instancesHavePostScriptNameID = false; + } else { + return DropVariations("Invalid instanceSize"); + } + + // When we serialize, the axes array will go here, even if it was + // originally at a different offset. So we update the axesArrayOffset + // field for the header. + uint32_t origAxesArrayOffset = this->axesArrayOffset; + this->axesArrayOffset = table.offset(); + + table.set_offset(origAxesArrayOffset); + for (unsigned i = 0; i < this->axisCount; i++) { + this->axes.emplace_back(); + auto& axis = this->axes[i]; + if (!table.ReadU32(&axis.axisTag) || + !table.ReadS32(&axis.minValue) || + !table.ReadS32(&axis.defaultValue) || + !table.ReadS32(&axis.maxValue) || + !table.ReadU16(&axis.flags) || + !table.ReadU16(&axis.axisNameID)) { + return DropVariations("Failed to read axis record"); + } + if (!CheckTag(axis.axisTag)) { + return DropVariations("Bad axis tag"); + } + if (!(axis.minValue <= axis.defaultValue && axis.defaultValue <= axis.maxValue)) { + return DropVariations("Bad axis value range"); + } + if ((axis.flags & 0xFFFEu) != 0) { + Warning("Discarding unknown axis flags"); + axis.flags &= ~0xFFFEu; + } + if (axis.axisNameID <= 255 || axis.axisNameID >= 32768) { + Warning("Axis nameID out of range"); + // We don't check that the name actually exists -- assume the client can handle + // a missing name when it tries to read the table. + } + } + + for (unsigned i = 0; i < this->instanceCount; i++) { + this->instances.emplace_back(); + auto& inst = this->instances[i]; + if (!table.ReadU16(&inst.subfamilyNameID) || + !table.ReadU16(&inst.flags)) { + return DropVariations("Failed to read instance record"); + } + inst.coordinates.reserve(this->axisCount); + for (unsigned j = 0; j < this->axisCount; j++) { + inst.coordinates.emplace_back(); + auto& coord = inst.coordinates[j]; + if (!table.ReadS32(&coord)) { + return DropVariations("Failed to read instance coordinates"); + } + } + if (this->instancesHavePostScriptNameID) { + if (!table.ReadU16(&inst.postScriptNameID)) { + return DropVariations("Failed to read instance psname ID"); + } + } + } + + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + + return true; +} + +bool OpenTypeFVAR::Serialize(OTSStream* out) { + if (!out->WriteU16(this->majorVersion) || + !out->WriteU16(this->minorVersion) || + !out->WriteU16(this->axesArrayOffset) || + !out->WriteU16(this->reserved) || + !out->WriteU16(this->axisCount) || + !out->WriteU16(this->axisSize) || + !out->WriteU16(this->instanceCount) || + !out->WriteU16(this->instanceSize)) { + return Error("Failed to write table"); + } + + for (unsigned i = 0; i < this->axisCount; i++) { + const auto& axis = this->axes[i]; + if (!out->WriteU32(axis.axisTag) || + !out->WriteS32(axis.minValue) || + !out->WriteS32(axis.defaultValue) || + !out->WriteS32(axis.maxValue) || + !out->WriteU16(axis.flags) || + !out->WriteU16(axis.axisNameID)) { + return Error("Failed to write table"); + } + } + + for (unsigned i = 0; i < this->instanceCount; i++) { + const auto& inst = this->instances[i]; + if (!out->WriteU16(inst.subfamilyNameID) || + !out->WriteU16(inst.flags)) { + return Error("Failed to write table"); + } + for (unsigned j = 0; j < this->axisCount; j++) { + const auto& coord = inst.coordinates[j]; + if (!out->WriteS32(coord)) { + return Error("Failed to write table"); + } + } + if (this->instancesHavePostScriptNameID) { + if (!out->WriteU16(inst.postScriptNameID)) { + return Error("Failed to write table"); + } + } + } + + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/fvar.h b/gfx/ots/src/fvar.h new file mode 100644 index 000000000..a469c8cdd --- /dev/null +++ b/gfx/ots/src/fvar.h @@ -0,0 +1,63 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_FVAR_H_ +#define OTS_FVAR_H_ + +#include <vector> + +#include "ots.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeFVAR Interface +// ----------------------------------------------------------------------------- + +class OpenTypeFVAR : public Table { + public: + explicit OpenTypeFVAR(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + uint16_t AxisCount() const { return axisCount; } + + private: + uint16_t majorVersion; + uint16_t minorVersion; + uint16_t axesArrayOffset; + uint16_t reserved; + uint16_t axisCount; + uint16_t axisSize; + uint16_t instanceCount; + uint16_t instanceSize; + + typedef int32_t Fixed; /* 16.16 fixed-point value */ + + struct VariationAxisRecord { + uint32_t axisTag; + Fixed minValue; + Fixed defaultValue; + Fixed maxValue; + uint16_t flags; + uint16_t axisNameID; + }; + std::vector<VariationAxisRecord> axes; + + struct InstanceRecord { + uint16_t subfamilyNameID; + uint16_t flags; + std::vector<Fixed> coordinates; + uint16_t postScriptNameID; // optional + }; + std::vector<InstanceRecord> instances; + + bool instancesHavePostScriptNameID; +}; + +} // namespace ots + +#endif // OTS_FVAR_H_ diff --git a/gfx/ots/src/gasp.cc b/gfx/ots/src/gasp.cc index 5ebf5d84b..2a03c831f 100644 --- a/gfx/ots/src/gasp.cc +++ b/gfx/ots/src/gasp.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,113 +7,78 @@ // gasp - Grid-fitting And Scan-conversion Procedure // http://www.microsoft.com/typography/otspec/gasp.htm -#define TABLE_NAME "gasp" - -#define DROP_THIS_TABLE(...) \ - do { \ - OTS_FAILURE_MSG_(font->file, TABLE_NAME ": " __VA_ARGS__); \ - OTS_FAILURE_MSG("Table discarded"); \ - delete font->gasp; \ - font->gasp = 0; \ - } while (0) - namespace ots { -bool ots_gasp_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeGASP::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeGASP *gasp = new OpenTypeGASP; - font->gasp = gasp; - uint16_t num_ranges = 0; - if (!table.ReadU16(&gasp->version) || + if (!table.ReadU16(&this->version) || !table.ReadU16(&num_ranges)) { - return OTS_FAILURE_MSG("Failed to read table header"); + return Error("Failed to read table header"); } - if (gasp->version > 1) { + if (this->version > 1) { // Lots of Linux fonts have bad version numbers... - DROP_THIS_TABLE("bad version: %u", gasp->version); - return true; + return Drop("Unsupported version: %u", this->version); } if (num_ranges == 0) { - DROP_THIS_TABLE("num_ranges is zero"); - return true; + return Drop("numRanges is zero"); } - gasp->gasp_ranges.reserve(num_ranges); + this->gasp_ranges.reserve(num_ranges); for (unsigned i = 0; i < num_ranges; ++i) { uint16_t max_ppem = 0; uint16_t behavior = 0; if (!table.ReadU16(&max_ppem) || !table.ReadU16(&behavior)) { - return OTS_FAILURE_MSG("Failed to read subrange %d", i); + return Error("Failed to read GASPRANGE %d", i); } - if ((i > 0) && (gasp->gasp_ranges[i - 1].first >= max_ppem)) { + if ((i > 0) && (this->gasp_ranges[i - 1].first >= max_ppem)) { // The records in the gaspRange[] array must be sorted in order of // increasing rangeMaxPPEM value. - DROP_THIS_TABLE("ranges are not sorted"); - return true; + return Drop("Ranges are not sorted"); } if ((i == num_ranges - 1u) && // never underflow. (max_ppem != 0xffffu)) { - DROP_THIS_TABLE("The last record should be 0xFFFF as a sentinel value " + return Drop("The last record should be 0xFFFF as a sentinel value " "for rangeMaxPPEM"); - return true; } if (behavior >> 8) { - OTS_WARNING("undefined bits are used: %x", behavior); + Warning("Undefined bits are used: %x", behavior); // mask undefined bits. behavior &= 0x000fu; } - if (gasp->version == 0 && (behavior >> 2) != 0) { - OTS_WARNING("changed the version number to 1"); - gasp->version = 1; + if (this->version == 0 && (behavior >> 2) != 0) { + Warning("Changed the version number to 1"); + this->version = 1; } - gasp->gasp_ranges.push_back(std::make_pair(max_ppem, behavior)); + this->gasp_ranges.push_back(std::make_pair(max_ppem, behavior)); } return true; } -bool ots_gasp_should_serialise(Font *font) { - return font->gasp != NULL; -} - -bool ots_gasp_serialise(OTSStream *out, Font *font) { - const OpenTypeGASP *gasp = font->gasp; - - const uint16_t num_ranges = static_cast<uint16_t>(gasp->gasp_ranges.size()); - if (num_ranges != gasp->gasp_ranges.size() || - !out->WriteU16(gasp->version) || +bool OpenTypeGASP::Serialize(OTSStream *out) { + const uint16_t num_ranges = static_cast<uint16_t>(this->gasp_ranges.size()); + if (num_ranges != this->gasp_ranges.size() || + !out->WriteU16(this->version) || !out->WriteU16(num_ranges)) { - return OTS_FAILURE_MSG("failed to write gasp header"); + return Error("Failed to write table header"); } for (uint16_t i = 0; i < num_ranges; ++i) { - if (!out->WriteU16(gasp->gasp_ranges[i].first) || - !out->WriteU16(gasp->gasp_ranges[i].second)) { - return OTS_FAILURE_MSG("Failed to write gasp subtable %d", i); + if (!out->WriteU16(this->gasp_ranges[i].first) || + !out->WriteU16(this->gasp_ranges[i].second)) { + return Error("Failed to write GASPRANGE %d", i); } } return true; } -void ots_gasp_reuse(Font *font, Font *other) { - font->gasp = other->gasp; - font->gasp_reused = true; -} - -void ots_gasp_free(Font *font) { - delete font->gasp; -} - } // namespace ots - -#undef TABLE_NAME -#undef DROP_THIS_TABLE diff --git a/gfx/ots/src/gasp.h b/gfx/ots/src/gasp.h index 48d7e7c16..ce9e987aa 100644 --- a/gfx/ots/src/gasp.h +++ b/gfx/ots/src/gasp.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -13,7 +13,15 @@ namespace ots { -struct OpenTypeGASP { +class OpenTypeGASP : public Table { + public: + explicit OpenTypeGASP(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + + private: uint16_t version; // A array of (max PPEM, GASP behavior) pairs. std::vector<std::pair<uint16_t, uint16_t> > gasp_ranges; diff --git a/gfx/ots/src/gdef.cc b/gfx/ots/src/gdef.cc index 71c6fc592..71e1075e3 100644 --- a/gfx/ots/src/gdef.cc +++ b/gfx/ots/src/gdef.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,68 +11,60 @@ #include "gsub.h" #include "layout.h" #include "maxp.h" +#include "variations.h" // GDEF - The Glyph Definition Table // http://www.microsoft.com/typography/otspec/gdef.htm -#define TABLE_NAME "GDEF" - namespace { -// The maximum class value in class definition tables. -const uint16_t kMaxClassDefValue = 0xFFFF; // The maximum class value in the glyph class definision table. const uint16_t kMaxGlyphClassDefValue = 4; // The maximum format number of caret value tables. -// We don't support format 3 for now. See the comment in -// ParseLigCaretListTable() for the reason. -const uint16_t kMaxCaretValueFormat = 2; - -bool ParseGlyphClassDefTable(ots::Font *font, const uint8_t *data, - size_t length, const uint16_t num_glyphs) { - return ots::ParseClassDefTable(font, data, length, num_glyphs, - kMaxGlyphClassDefValue); -} +const uint16_t kMaxCaretValueFormat = 3; + +} // namespace -bool ParseAttachListTable(ots::Font *font, const uint8_t *data, - size_t length, const uint16_t num_glyphs) { +namespace ots { + +bool OpenTypeGDEF::ParseAttachListTable(const uint8_t *data, size_t length) { ots::Buffer subtable(data, length); uint16_t offset_coverage = 0; uint16_t glyph_count = 0; if (!subtable.ReadU16(&offset_coverage) || !subtable.ReadU16(&glyph_count)) { - return OTS_FAILURE_MSG("Failed to read gdef header"); + return Error("Failed to read gdef header"); } const unsigned attach_points_end = 2 * static_cast<unsigned>(glyph_count) + 4; if (attach_points_end > std::numeric_limits<uint16_t>::max()) { - return OTS_FAILURE_MSG("Bad glyph count in gdef"); + return Error("Bad glyph count in gdef"); } if (offset_coverage == 0 || offset_coverage >= length || offset_coverage < attach_points_end) { - return OTS_FAILURE_MSG("Bad coverage offset %d", offset_coverage); + return Error("Bad coverage offset %d", offset_coverage); } - if (glyph_count > num_glyphs) { - return OTS_FAILURE_MSG("Bad glyph count %u", glyph_count); + if (glyph_count > this->m_num_glyphs) { + return Error("Bad glyph count %u", glyph_count); } std::vector<uint16_t> attach_points; attach_points.resize(glyph_count); for (unsigned i = 0; i < glyph_count; ++i) { if (!subtable.ReadU16(&attach_points[i])) { - return OTS_FAILURE_MSG("Can't read attachment point %d", i); + return Error("Can't read attachment point %d", i); } if (attach_points[i] >= length || attach_points[i] < attach_points_end) { - return OTS_FAILURE_MSG("Bad attachment point %d of %d", i, attach_points[i]); + return Error("Bad attachment point %d of %d", i, attach_points[i]); } } // Parse coverage table - if (!ots::ParseCoverageTable(font, data + offset_coverage, - length - offset_coverage, num_glyphs)) { - return OTS_FAILURE_MSG("Bad coverage table"); + if (!ots::ParseCoverageTable(GetFont(), data + offset_coverage, + length - offset_coverage, this->m_num_glyphs)) { + return Error("Bad coverage table"); } // Parse attach point table @@ -80,20 +72,20 @@ bool ParseAttachListTable(ots::Font *font, const uint8_t *data, subtable.set_offset(attach_points[i]); uint16_t point_count = 0; if (!subtable.ReadU16(&point_count)) { - return OTS_FAILURE_MSG("Can't read point count %d", i); + return Error("Can't read point count %d", i); } if (point_count == 0) { - return OTS_FAILURE_MSG("zero point count %d", i); + return Error("zero point count %d", i); } uint16_t last_point_index = 0; uint16_t point_index = 0; for (unsigned j = 0; j < point_count; ++j) { if (!subtable.ReadU16(&point_index)) { - return OTS_FAILURE_MSG("Can't read point index %d in point %d", j, i); + return Error("Can't read point index %d in point %d", j, i); } // Contour point indeces are in increasing numerical order if (last_point_index != 0 && last_point_index >= point_index) { - return OTS_FAILURE_MSG("bad contour indeces: %u >= %u", + return Error("bad contour indeces: %u >= %u", last_point_index, point_index); } last_point_index = point_index; @@ -102,43 +94,42 @@ bool ParseAttachListTable(ots::Font *font, const uint8_t *data, return true; } -bool ParseLigCaretListTable(ots::Font *font, const uint8_t *data, - size_t length, const uint16_t num_glyphs) { +bool OpenTypeGDEF::ParseLigCaretListTable(const uint8_t *data, size_t length) { ots::Buffer subtable(data, length); uint16_t offset_coverage = 0; uint16_t lig_glyph_count = 0; if (!subtable.ReadU16(&offset_coverage) || !subtable.ReadU16(&lig_glyph_count)) { - return OTS_FAILURE_MSG("Can't read caret structure"); + return Error("Can't read caret structure"); } const unsigned lig_glyphs_end = 2 * static_cast<unsigned>(lig_glyph_count) + 4; if (lig_glyphs_end > std::numeric_limits<uint16_t>::max()) { - return OTS_FAILURE_MSG("Bad caret structure"); + return Error("Bad caret structure"); } if (offset_coverage == 0 || offset_coverage >= length || offset_coverage < lig_glyphs_end) { - return OTS_FAILURE_MSG("Bad caret coverate offset %d", offset_coverage); + return Error("Bad caret coverate offset %d", offset_coverage); } - if (lig_glyph_count > num_glyphs) { - return OTS_FAILURE_MSG("bad ligature glyph count: %u", lig_glyph_count); + if (lig_glyph_count > this->m_num_glyphs) { + return Error("bad ligature glyph count: %u", lig_glyph_count); } std::vector<uint16_t> lig_glyphs; lig_glyphs.resize(lig_glyph_count); for (unsigned i = 0; i < lig_glyph_count; ++i) { if (!subtable.ReadU16(&lig_glyphs[i])) { - return OTS_FAILURE_MSG("Can't read ligature glyph location %d", i); + return Error("Can't read ligature glyph location %d", i); } if (lig_glyphs[i] >= length || lig_glyphs[i] < lig_glyphs_end) { - return OTS_FAILURE_MSG("Bad ligature glyph location %d in glyph %d", lig_glyphs[i], i); + return Error("Bad ligature glyph location %d in glyph %d", lig_glyphs[i], i); } } // Parse coverage table - if (!ots::ParseCoverageTable(font, data + offset_coverage, - length - offset_coverage, num_glyphs)) { - return OTS_FAILURE_MSG("Can't parse caret coverage table"); + if (!ots::ParseCoverageTable(GetFont(), data + offset_coverage, + length - offset_coverage, this->m_num_glyphs)) { + return Error("Can't parse caret coverage table"); } // Parse ligature glyph table @@ -146,10 +137,10 @@ bool ParseLigCaretListTable(ots::Font *font, const uint8_t *data, subtable.set_offset(lig_glyphs[i]); uint16_t caret_count = 0; if (!subtable.ReadU16(&caret_count)) { - return OTS_FAILURE_MSG("Can't read caret count for glyph %d", i); + return Error("Can't read caret count for glyph %d", i); } if (caret_count == 0) { - return OTS_FAILURE_MSG("bad caret value count: %u", caret_count); + return Error("bad caret value count: %u", caret_count); } std::vector<uint16_t> caret_value_offsets; @@ -157,10 +148,10 @@ bool ParseLigCaretListTable(ots::Font *font, const uint8_t *data, unsigned caret_value_offsets_end = 2 * static_cast<unsigned>(caret_count) + 2; for (unsigned j = 0; j < caret_count; ++j) { if (!subtable.ReadU16(&caret_value_offsets[j])) { - return OTS_FAILURE_MSG("Can't read caret offset %d for glyph %d", j, i); + return Error("Can't read caret offset %d for glyph %d", j, i); } if (caret_value_offsets[j] >= length || caret_value_offsets[j] < caret_value_offsets_end) { - return OTS_FAILURE_MSG("Bad caret offset %d for caret %d glyph %d", caret_value_offsets[j], j, i); + return Error("Bad caret offset %d for caret %d glyph %d", caret_value_offsets[j], j, i); } } @@ -169,91 +160,93 @@ bool ParseLigCaretListTable(ots::Font *font, const uint8_t *data, subtable.set_offset(lig_glyphs[i] + caret_value_offsets[j]); uint16_t caret_format = 0; if (!subtable.ReadU16(&caret_format)) { - return OTS_FAILURE_MSG("Can't read caret values table %d in glyph %d", j, i); + return Error("Can't read caret values table %d in glyph %d", j, i); } - // TODO(bashi): We only support caret value format 1 and 2 for now - // because there are no fonts which contain caret value format 3 - // as far as we investigated. if (caret_format == 0 || caret_format > kMaxCaretValueFormat) { - return OTS_FAILURE_MSG("bad caret value format: %u", caret_format); + return Error("bad caret value format: %u", caret_format); } // CaretValueFormats contain a 2-byte field which could be // arbitrary value. if (!subtable.Skip(2)) { - return OTS_FAILURE_MSG("Bad caret value table structure %d in glyph %d", j, i); + return Error("Bad caret value table structure %d in glyph %d", j, i); + } + if (caret_format == 3) { + uint16_t offset_device = 0; + if (!subtable.ReadU16(&offset_device)) { + return Error("Can't read device offset for caret value %d " + "in glyph %d", j, i); + } + uint16_t absolute_offset = lig_glyphs[i] + caret_value_offsets[j] + + offset_device; + if (offset_device == 0 || absolute_offset >= length) { + return Error("Bad device offset for caret value %d in glyph %d: %d", + j, i, offset_device); + } + if (!ots::ParseDeviceTable(GetFont(), data + absolute_offset, + length - absolute_offset)) { + return Error("Bad device table for caret value %d in glyph %d", + j, i, offset_device); + } } } } return true; } -bool ParseMarkAttachClassDefTable(ots::Font *font, const uint8_t *data, - size_t length, const uint16_t num_glyphs) { - return ots::ParseClassDefTable(font, data, length, num_glyphs, kMaxClassDefValue); -} - -bool ParseMarkGlyphSetsDefTable(ots::Font *font, const uint8_t *data, - size_t length, const uint16_t num_glyphs) { +bool OpenTypeGDEF::ParseMarkGlyphSetsDefTable(const uint8_t *data, size_t length) { ots::Buffer subtable(data, length); uint16_t format = 0; uint16_t mark_set_count = 0; if (!subtable.ReadU16(&format) || !subtable.ReadU16(&mark_set_count)) { - return OTS_FAILURE_MSG("Can' read mark glyph table structure"); + return Error("Can' read mark glyph table structure"); } if (format != 1) { - return OTS_FAILURE_MSG("bad mark glyph set table format: %u", format); + return Error("bad mark glyph set table format: %u", format); } const unsigned mark_sets_end = 2 * static_cast<unsigned>(mark_set_count) + 4; if (mark_sets_end > std::numeric_limits<uint16_t>::max()) { - return OTS_FAILURE_MSG("Bad mark_set %d", mark_sets_end); + return Error("Bad mark_set %d", mark_sets_end); } for (unsigned i = 0; i < mark_set_count; ++i) { uint32_t offset_coverage = 0; if (!subtable.ReadU32(&offset_coverage)) { - return OTS_FAILURE_MSG("Can't read covrage location for mark set %d", i); + return Error("Can't read covrage location for mark set %d", i); } if (offset_coverage >= length || offset_coverage < mark_sets_end) { - return OTS_FAILURE_MSG("Bad coverage location %d for mark set %d", offset_coverage, i); + return Error("Bad coverage location %d for mark set %d", offset_coverage, i); } - if (!ots::ParseCoverageTable(font, data + offset_coverage, - length - offset_coverage, num_glyphs)) { - return OTS_FAILURE_MSG("Failed to parse coverage table for mark set %d", i); + if (!ots::ParseCoverageTable(GetFont(), data + offset_coverage, + length - offset_coverage, this->m_num_glyphs)) { + return Error("Failed to parse coverage table for mark set %d", i); } } - font->gdef->num_mark_glyph_sets = mark_set_count; + this->num_mark_glyph_sets = mark_set_count; return true; } -} // namespace +bool OpenTypeGDEF::Parse(const uint8_t *data, size_t length) { + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); -namespace ots { - -bool ots_gdef_parse(Font *font, const uint8_t *data, size_t length) { // Grab the number of glyphs in the font from the maxp table to check // GlyphIDs in GDEF table. - if (!font->maxp) { - return OTS_FAILURE_MSG("No maxp table in font, needed by GDEF"); + if (!maxp) { + return Error("No maxp table in font, needed by GDEF"); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + this->m_num_glyphs = maxp->num_glyphs; Buffer table(data, length); - OpenTypeGDEF *gdef = new OpenTypeGDEF; - font->gdef = gdef; - - uint32_t version = 0; - if (!table.ReadU32(&version)) { - return OTS_FAILURE_MSG("Incomplete table"); + uint16_t version_major = 0, version_minor = 0; + if (!table.ReadU16(&version_major) || + !table.ReadU16(&version_minor)) { + return Error("Incomplete table"); } - if (version < 0x00010000 || version == 0x00010001) { - return OTS_FAILURE_MSG("Bad version"); - } - - if (version >= 0x00010002) { - gdef->version_2 = true; + if (version_major != 1 || version_minor == 1) { // there is no v1.1 + return Error("Bad version"); } uint16_t offset_glyph_class_def = 0; @@ -264,110 +257,108 @@ bool ots_gdef_parse(Font *font, const uint8_t *data, size_t length) { !table.ReadU16(&offset_attach_list) || !table.ReadU16(&offset_lig_caret_list) || !table.ReadU16(&offset_mark_attach_class_def)) { - return OTS_FAILURE_MSG("Incomplete table"); + return Error("Incomplete table"); } uint16_t offset_mark_glyph_sets_def = 0; - if (gdef->version_2) { + if (version_minor >= 2) { if (!table.ReadU16(&offset_mark_glyph_sets_def)) { - return OTS_FAILURE_MSG("Incomplete table"); + return Error("Incomplete table"); + } + } + uint32_t item_var_store_offset = 0; + if (version_minor >= 3) { + if (!table.ReadU32(&item_var_store_offset)) { + return Error("Incomplete table"); } } unsigned gdef_header_end = 4 + 4 * 2; - if (gdef->version_2) + if (version_minor >= 2) gdef_header_end += 2; + if (version_minor >= 3) + gdef_header_end += 4; // Parse subtables if (offset_glyph_class_def) { if (offset_glyph_class_def >= length || offset_glyph_class_def < gdef_header_end) { - return OTS_FAILURE_MSG("Invalid offset to glyph classes"); + return Error("Invalid offset to glyph classes"); } - if (!ParseGlyphClassDefTable(font, data + offset_glyph_class_def, + if (!ots::ParseClassDefTable(GetFont(), data + offset_glyph_class_def, length - offset_glyph_class_def, - num_glyphs)) { - return OTS_FAILURE_MSG("Invalid glyph classes"); + this->m_num_glyphs, kMaxGlyphClassDefValue)) { + return Error("Invalid glyph classes"); } - gdef->has_glyph_class_def = true; } if (offset_attach_list) { if (offset_attach_list >= length || offset_attach_list < gdef_header_end) { - return OTS_FAILURE_MSG("Invalid offset to attachment list"); + return Error("Invalid offset to attachment list"); } - if (!ParseAttachListTable(font, data + offset_attach_list, - length - offset_attach_list, - num_glyphs)) { - return OTS_FAILURE_MSG("Invalid attachment list"); + if (!ParseAttachListTable(data + offset_attach_list, + length - offset_attach_list)) { + return Error("Invalid attachment list"); } } if (offset_lig_caret_list) { if (offset_lig_caret_list >= length || offset_lig_caret_list < gdef_header_end) { - return OTS_FAILURE_MSG("Invalid offset to ligature caret list"); + return Error("Invalid offset to ligature caret list"); } - if (!ParseLigCaretListTable(font, data + offset_lig_caret_list, - length - offset_lig_caret_list, - num_glyphs)) { - return OTS_FAILURE_MSG("Invalid ligature caret list"); + if (!ParseLigCaretListTable(data + offset_lig_caret_list, + length - offset_lig_caret_list)) { + return Error("Invalid ligature caret list"); } } if (offset_mark_attach_class_def) { if (offset_mark_attach_class_def >= length || offset_mark_attach_class_def < gdef_header_end) { - return OTS_FAILURE_MSG("Invalid offset to mark attachment list"); + return Error("Invalid offset to mark attachment list"); } - if (!ParseMarkAttachClassDefTable(font, - data + offset_mark_attach_class_def, - length - offset_mark_attach_class_def, - num_glyphs)) { - return OTS_FAILURE_MSG("Invalid mark attachment list"); + if (!ots::ParseClassDefTable(GetFont(), + data + offset_mark_attach_class_def, + length - offset_mark_attach_class_def, + this->m_num_glyphs, kMaxClassDefValue)) { + return Error("Invalid mark attachment list"); } - gdef->has_mark_attachment_class_def = true; } if (offset_mark_glyph_sets_def) { if (offset_mark_glyph_sets_def >= length || offset_mark_glyph_sets_def < gdef_header_end) { - return OTS_FAILURE_MSG("invalid offset to mark glyph sets"); + return Error("invalid offset to mark glyph sets"); } - if (!ParseMarkGlyphSetsDefTable(font, - data + offset_mark_glyph_sets_def, - length - offset_mark_glyph_sets_def, - num_glyphs)) { - return OTS_FAILURE_MSG("Invalid mark glyph sets"); + if (!ParseMarkGlyphSetsDefTable(data + offset_mark_glyph_sets_def, + length - offset_mark_glyph_sets_def)) { + return Error("Invalid mark glyph sets"); } - gdef->has_mark_glyph_sets_def = true; } - gdef->data = data; - gdef->length = length; - return true; -} - -bool ots_gdef_should_serialise(Font *font) { - return font->gdef != NULL && font->gdef->data != NULL; -} -bool ots_gdef_serialise(OTSStream *out, Font *font) { - if (!out->Write(font->gdef->data, font->gdef->length)) { - return OTS_FAILURE_MSG("Failed to write GDEF table"); + if (item_var_store_offset) { + if (item_var_store_offset >= length || + item_var_store_offset < gdef_header_end) { + return Error("invalid offset to item variation store"); + } + if (!ParseItemVariationStore(GetFont(), data + item_var_store_offset, + length - item_var_store_offset)) { + return Error("Invalid item variation store"); + } } + this->m_data = data; + this->m_length = length; return true; } -void ots_gdef_reuse(Font *font, Font *other) { - font->gdef = other->gdef; - font->gdef_reused = true; -} +bool OpenTypeGDEF::Serialize(OTSStream *out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write table"); + } -void ots_gdef_free(Font *font) { - delete font->gdef; + return true; } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/gdef.h b/gfx/ots/src/gdef.h index f46f419c7..7c7cc0ce5 100644 --- a/gfx/ots/src/gdef.h +++ b/gfx/ots/src/gdef.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,25 +9,29 @@ namespace ots { -struct OpenTypeGDEF { - OpenTypeGDEF() - : version_2(false), - has_glyph_class_def(false), - has_mark_attachment_class_def(false), - has_mark_glyph_sets_def(false), +class OpenTypeGDEF : public Table { + public: + explicit OpenTypeGDEF(Font *font, uint32_t tag) + : Table(font, tag, tag), num_mark_glyph_sets(0), - data(NULL), - length(0) { + m_data(NULL), + m_length(0), + m_num_glyphs(0) { } - bool version_2; - bool has_glyph_class_def; - bool has_mark_attachment_class_def; - bool has_mark_glyph_sets_def; + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + uint16_t num_mark_glyph_sets; - const uint8_t *data; - size_t length; + private: + bool ParseAttachListTable(const uint8_t *data, size_t length); + bool ParseLigCaretListTable(const uint8_t *data, size_t length); + bool ParseMarkGlyphSetsDefTable(const uint8_t *data, size_t length); + + const uint8_t *m_data; + size_t m_length; + uint16_t m_num_glyphs; }; } // namespace ots diff --git a/gfx/ots/src/glat.cc b/gfx/ots/src/glat.cc new file mode 100644 index 000000000..23f7dfd9a --- /dev/null +++ b/gfx/ots/src/glat.cc @@ -0,0 +1,459 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "glat.h" + +#include "gloc.h" +#include "mozilla/Compression.h" +#include <list> + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT_v1 +// ----------------------------------------------------------------------------- + +bool OpenTypeGLAT_v1::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + OpenTypeGLOC* gloc = static_cast<OpenTypeGLOC*>( + GetFont()->GetTypedTable(OTS_TAG_GLOC)); + if (!gloc) { + return DropGraphite("Required Gloc table is missing"); + } + + if (!table.ReadU32(&this->version) || this->version >> 16 != 1) { + return DropGraphite("Failed to read version"); + } + + const std::vector<uint32_t>& locations = gloc->GetLocations(); + if (locations.empty()) { + return DropGraphite("No locations from Gloc table"); + } + std::list<uint32_t> unverified(locations.begin(), locations.end()); + while (table.remaining()) { + GlatEntry entry(this); + if (table.offset() > unverified.front()) { + return DropGraphite("Offset check failed for a GlatEntry"); + } + if (table.offset() == unverified.front()) { + unverified.pop_front(); + } + if (unverified.empty()) { + return DropGraphite("Expected more locations"); + } + if (!entry.ParsePart(table)) { + return DropGraphite("Failed to read a GlatEntry"); + } + this->entries.push_back(entry); + } + + if (unverified.size() != 1 || unverified.front() != table.offset()) { + return DropGraphite("%zu location(s) could not be verified", unverified.size()); + } + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + return true; +} + +bool OpenTypeGLAT_v1::Serialize(OTSStream* out) { + if (!out->WriteU32(this->version) || + !SerializeParts(this->entries, out)) { + return Error("Failed to write table"); + } + return true; +} + +bool OpenTypeGLAT_v1::GlatEntry::ParsePart(Buffer& table) { + if (!table.ReadU8(&this->attNum)) { + return parent->Error("GlatEntry: Failed to read attNum"); + } + if (!table.ReadU8(&this->num)) { + return parent->Error("GlatEntry: Failed to read num"); + } + + //this->attributes.resize(this->num); + for (int i = 0; i < this->num; ++i) { + this->attributes.emplace_back(); + if (!table.ReadS16(&this->attributes[i])) { + return parent->Error("GlatEntry: Failed to read attribute %u", i); + } + } + return true; +} + +bool OpenTypeGLAT_v1::GlatEntry::SerializePart(OTSStream* out) const { + if (!out->WriteU8(this->attNum) || + !out->WriteU8(this->num) || + !SerializeParts(this->attributes, out)) { + return parent->Error("GlatEntry: Failed to write"); + } + return true; +} + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT_v2 +// ----------------------------------------------------------------------------- + +bool OpenTypeGLAT_v2::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + OpenTypeGLOC* gloc = static_cast<OpenTypeGLOC*>( + GetFont()->GetTypedTable(OTS_TAG_GLOC)); + if (!gloc) { + return DropGraphite("Required Gloc table is missing"); + } + + if (!table.ReadU32(&this->version) || this->version >> 16 != 1) { + return DropGraphite("Failed to read version"); + } + + const std::vector<uint32_t>& locations = gloc->GetLocations(); + if (locations.empty()) { + return DropGraphite("No locations from Gloc table"); + } + std::list<uint32_t> unverified(locations.begin(), locations.end()); + while (table.remaining()) { + GlatEntry entry(this); + if (table.offset() > unverified.front()) { + return DropGraphite("Offset check failed for a GlatEntry"); + } + if (table.offset() == unverified.front()) { + unverified.pop_front(); + } + if (unverified.empty()) { + return DropGraphite("Expected more locations"); + } + if (!entry.ParsePart(table)) { + return DropGraphite("Failed to read a GlatEntry"); + } + this->entries.push_back(entry); + } + + if (unverified.size() != 1 || unverified.front() != table.offset()) { + return DropGraphite("%zu location(s) could not be verified", unverified.size()); + } + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + return true; +} + +bool OpenTypeGLAT_v2::Serialize(OTSStream* out) { + if (!out->WriteU32(this->version) || + !SerializeParts(this->entries, out)) { + return Error("Failed to write table"); + } + return true; +} + +bool OpenTypeGLAT_v2::GlatEntry::ParsePart(Buffer& table) { + if (!table.ReadS16(&this->attNum)) { + return parent->Error("GlatEntry: Failed to read attNum"); + } + if (!table.ReadS16(&this->num) || this->num < 0) { + return parent->Error("GlatEntry: Failed to read valid num"); + } + + //this->attributes.resize(this->num); + for (int i = 0; i < this->num; ++i) { + this->attributes.emplace_back(); + if (!table.ReadS16(&this->attributes[i])) { + return parent->Error("GlatEntry: Failed to read attribute %u", i); + } + } + return true; +} + +bool OpenTypeGLAT_v2::GlatEntry::SerializePart(OTSStream* out) const { + if (!out->WriteS16(this->attNum) || + !out->WriteS16(this->num) || + !SerializeParts(this->attributes, out)) { + return parent->Error("GlatEntry: Failed to write"); + } + return true; +} + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT_v3 +// ----------------------------------------------------------------------------- + +bool OpenTypeGLAT_v3::Parse(const uint8_t* data, size_t length, + bool prevent_decompression) { + Buffer table(data, length); + OpenTypeGLOC* gloc = static_cast<OpenTypeGLOC*>( + GetFont()->GetTypedTable(OTS_TAG_GLOC)); + if (!gloc) { + return DropGraphite("Required Gloc table is missing"); + } + + if (!table.ReadU32(&this->version) || this->version >> 16 != 3) { + return DropGraphite("Failed to read version"); + } + if (!table.ReadU32(&this->compHead)) { + return DropGraphite("Failed to read compression header"); + } + switch ((this->compHead & SCHEME) >> 27) { + case 0: // uncompressed + break; + case 1: { // lz4 + if (prevent_decompression) { + return DropGraphite("Illegal nested compression"); + } + size_t decompressed_size = this->compHead & FULL_SIZE; + if (decompressed_size < length) { + return DropGraphite("Decompressed size is less than compressed size"); + } + if (decompressed_size == 0) { + return DropGraphite("Decompressed size is set to 0"); + } + // decompressed table must be <= 30MB + if (decompressed_size > 30 * 1024 * 1024) { + return DropGraphite("Decompressed size exceeds 30MB: %gMB", + decompressed_size / (1024.0 * 1024.0)); + } + std::vector<uint8_t> decompressed(decompressed_size); + size_t outputSize = 0; + bool ret = mozilla::Compression::LZ4::decompressPartial( + reinterpret_cast<const char*>(data + table.offset()), + table.remaining(), // input buffer size (input size + padding) + reinterpret_cast<char*>(decompressed.data()), + decompressed.size(), // target output size + &outputSize); // return output size + if (!ret || outputSize != decompressed.size()) { + return DropGraphite("Decompression failed"); + } + return this->Parse(decompressed.data(), decompressed.size(), true); + } + default: + return DropGraphite("Unknown compression scheme"); + } + if (this->compHead & RESERVED) { + Warning("Nonzero reserved"); + } + + const std::vector<uint32_t>& locations = gloc->GetLocations(); + if (locations.empty()) { + return DropGraphite("No locations from Gloc table"); + } + std::list<uint32_t> unverified(locations.begin(), locations.end()); + //this->entries.resize(locations.size() - 1, this); + for (size_t i = 0; i < locations.size() - 1; ++i) { + this->entries.emplace_back(this); + if (table.offset() != unverified.front()) { + return DropGraphite("Offset check failed for a GlyphAttrs"); + } + unverified.pop_front(); + if (!this->entries[i].ParsePart(table, + unverified.front() - table.offset())) { + // unverified.front() is guaranteed to exist because of the number of + // iterations of this loop + return DropGraphite("Failed to read a GlyphAttrs"); + } + } + + if (unverified.size() != 1 || unverified.front() != table.offset()) { + return DropGraphite("%zu location(s) could not be verified", unverified.size()); + } + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + return true; +} + +bool OpenTypeGLAT_v3::Serialize(OTSStream* out) { + if (!out->WriteU32(this->version) || + !out->WriteU32(this->compHead) || + !SerializeParts(this->entries, out)) { + return Error("Failed to write table"); + } + return true; +} + +bool OpenTypeGLAT_v3::GlyphAttrs::ParsePart(Buffer& table, const size_t size) { + size_t init_offset = table.offset(); + if (parent->compHead & OCTABOXES && !octabox.ParsePart(table)) { + // parent->flags & 0b1: octaboxes are present flag + return parent->Error("GlyphAttrs: Failed to read octabox"); + } + + while (table.offset() < init_offset + size) { + GlatEntry entry(parent); + if (!entry.ParsePart(table)) { + return parent->Error("GlyphAttrs: Failed to read a GlatEntry"); + } + this->entries.push_back(entry); + } + return true; +} + +bool OpenTypeGLAT_v3::GlyphAttrs::SerializePart(OTSStream* out) const { + if ((parent->compHead & OCTABOXES && !octabox.SerializePart(out)) || + !SerializeParts(this->entries, out)) { + return parent->Error("GlyphAttrs: Failed to write"); + } + return true; +} + +bool OpenTypeGLAT_v3::GlyphAttrs:: +OctaboxMetrics::ParsePart(Buffer& table) { + if (!table.ReadU16(&this->subbox_bitmap)) { + return parent->Error("OctaboxMetrics: Failed to read subbox_bitmap"); + } + if (!table.ReadU8(&this->diag_neg_min)) { + return parent->Error("OctaboxMetrics: Failed to read diag_neg_min"); + } + if (!table.ReadU8(&this->diag_neg_max) || + this->diag_neg_max < this->diag_neg_min) { + return parent->Error("OctaboxMetrics: Failed to read valid diag_neg_max"); + } + if (!table.ReadU8(&this->diag_pos_min)) { + return parent->Error("OctaboxMetrics: Failed to read diag_pos_min"); + } + if (!table.ReadU8(&this->diag_pos_max) || + this->diag_pos_max < this->diag_pos_min) { + return parent->Error("OctaboxMetrics: Failed to read valid diag_pos_max"); + } + + unsigned subboxes_len = 0; // count of 1's in this->subbox_bitmap + for (uint16_t i = this->subbox_bitmap; i; i >>= 1) { + if (i & 0b1) { + ++subboxes_len; + } + } + //this->subboxes.resize(subboxes_len, parent); + for (unsigned i = 0; i < subboxes_len; i++) { + this->subboxes.emplace_back(parent); + if (!this->subboxes[i].ParsePart(table)) { + return parent->Error("OctaboxMetrics: Failed to read subbox[%u]", i); + } + } + return true; +} + +bool OpenTypeGLAT_v3::GlyphAttrs:: +OctaboxMetrics::SerializePart(OTSStream* out) const { + if (!out->WriteU16(this->subbox_bitmap) || + !out->WriteU8(this->diag_neg_min) || + !out->WriteU8(this->diag_neg_max) || + !out->WriteU8(this->diag_pos_min) || + !out->WriteU8(this->diag_pos_max) || + !SerializeParts(this->subboxes, out)) { + return parent->Error("OctaboxMetrics: Failed to write"); + } + return true; +} + +bool OpenTypeGLAT_v3::GlyphAttrs::OctaboxMetrics:: +SubboxEntry::ParsePart(Buffer& table) { + if (!table.ReadU8(&this->left)) { + return parent->Error("SubboxEntry: Failed to read left"); + } + if (!table.ReadU8(&this->right) || this->right < this->left) { + return parent->Error("SubboxEntry: Failed to read valid right"); + } + if (!table.ReadU8(&this->bottom)) { + return parent->Error("SubboxEntry: Failed to read bottom"); + } + if (!table.ReadU8(&this->top) || this->top < this->bottom) { + return parent->Error("SubboxEntry: Failed to read valid top"); + } + if (!table.ReadU8(&this->diag_pos_min)) { + return parent->Error("SubboxEntry: Failed to read diag_pos_min"); + } + if (!table.ReadU8(&this->diag_pos_max) || + this->diag_pos_max < this->diag_pos_min) { + return parent->Error("SubboxEntry: Failed to read valid diag_pos_max"); + } + if (!table.ReadU8(&this->diag_neg_min)) { + return parent->Error("SubboxEntry: Failed to read diag_neg_min"); + } + if (!table.ReadU8(&this->diag_neg_max) || + this->diag_neg_max < this->diag_neg_min) { + return parent->Error("SubboxEntry: Failed to read valid diag_neg_max"); + } + return true; +} + +bool OpenTypeGLAT_v3::GlyphAttrs::OctaboxMetrics:: +SubboxEntry::SerializePart(OTSStream* out) const { + if (!out->WriteU8(this->left) || + !out->WriteU8(this->right) || + !out->WriteU8(this->bottom) || + !out->WriteU8(this->top) || + !out->WriteU8(this->diag_pos_min) || + !out->WriteU8(this->diag_pos_max) || + !out->WriteU8(this->diag_neg_min) || + !out->WriteU8(this->diag_neg_max)) { + return parent->Error("SubboxEntry: Failed to write"); + } + return true; +} + +bool OpenTypeGLAT_v3::GlyphAttrs:: +GlatEntry::ParsePart(Buffer& table) { + if (!table.ReadS16(&this->attNum)) { + return parent->Error("GlatEntry: Failed to read attNum"); + } + if (!table.ReadS16(&this->num) || this->num < 0) { + return parent->Error("GlatEntry: Failed to read valid num"); + } + + //this->attributes.resize(this->num); + for (int i = 0; i < this->num; ++i) { + this->attributes.emplace_back(); + if (!table.ReadS16(&this->attributes[i])) { + return parent->Error("GlatEntry: Failed to read attribute %u", i); + } + } + return true; +} + +bool OpenTypeGLAT_v3::GlyphAttrs:: +GlatEntry::SerializePart(OTSStream* out) const { + if (!out->WriteS16(this->attNum) || + !out->WriteS16(this->num) || + !SerializeParts(this->attributes, out)) { + return parent->Error("GlatEntry: Failed to write"); + } + return true; +} + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT +// ----------------------------------------------------------------------------- + +bool OpenTypeGLAT::Parse(const uint8_t* data, size_t length) { + if (GetFont()->dropped_graphite) { + return Drop("Skipping Graphite table"); + } + Buffer table(data, length); + uint32_t version; + if (!table.ReadU32(&version)) { + return DropGraphite("Failed to read version"); + } + switch (version >> 16) { + case 1: + this->handler = new OpenTypeGLAT_v1(this->font, this->tag); + break; + case 2: + this->handler = new OpenTypeGLAT_v2(this->font, this->tag); + break; + case 3: { + this->handler = new OpenTypeGLAT_v3(this->font, this->tag); + break; + } + default: + return DropGraphite("Unsupported table version: %u", version >> 16); + } + return this->handler->Parse(data, length); +} + +bool OpenTypeGLAT::Serialize(OTSStream* out) { + if (!this->handler) { + return Error("No Glat table parsed"); + } + return this->handler->Serialize(out); +} + +} // namespace ots diff --git a/gfx/ots/src/glat.h b/gfx/ots/src/glat.h new file mode 100644 index 000000000..04c9c1cce --- /dev/null +++ b/gfx/ots/src/glat.h @@ -0,0 +1,172 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_GLAT_H_ +#define OTS_GLAT_H_ + +#include <vector> + +#include "ots.h" +#include "graphite.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT_Basic Interface +// ----------------------------------------------------------------------------- + +class OpenTypeGLAT_Basic : public Table { + public: + explicit OpenTypeGLAT_Basic(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + virtual bool Parse(const uint8_t* data, size_t length) = 0; + virtual bool Serialize(OTSStream* out) = 0; +}; + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT_v1 +// ----------------------------------------------------------------------------- + +class OpenTypeGLAT_v1 : public OpenTypeGLAT_Basic { + public: + explicit OpenTypeGLAT_v1(Font* font, uint32_t tag) + : OpenTypeGLAT_Basic(font, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + struct GlatEntry : public TablePart<OpenTypeGLAT_v1> { + explicit GlatEntry(OpenTypeGLAT_v1* parent) + : TablePart<OpenTypeGLAT_v1>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + uint8_t attNum; + uint8_t num; + std::vector<int16_t> attributes; + }; + uint32_t version; + std::vector<GlatEntry> entries; +}; + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT_v2 +// ----------------------------------------------------------------------------- + +class OpenTypeGLAT_v2 : public OpenTypeGLAT_Basic { + public: + explicit OpenTypeGLAT_v2(Font* font, uint32_t tag) + : OpenTypeGLAT_Basic(font, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + struct GlatEntry : public TablePart<OpenTypeGLAT_v2> { + explicit GlatEntry(OpenTypeGLAT_v2* parent) + : TablePart<OpenTypeGLAT_v2>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + int16_t attNum; + int16_t num; + std::vector<int16_t> attributes; + }; + uint32_t version; + std::vector<GlatEntry> entries; +}; + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT_v3 +// ----------------------------------------------------------------------------- + +class OpenTypeGLAT_v3 : public OpenTypeGLAT_Basic { + public: + explicit OpenTypeGLAT_v3(Font* font, uint32_t tag) + : OpenTypeGLAT_Basic(font, tag) { } + + bool Parse(const uint8_t* data, size_t length) { + return this->Parse(data, length, false); + } + bool Serialize(OTSStream* out); + + private: + bool Parse(const uint8_t* data, size_t length, bool prevent_decompression); + struct GlyphAttrs : public TablePart<OpenTypeGLAT_v3> { + explicit GlyphAttrs(OpenTypeGLAT_v3* parent) + : TablePart<OpenTypeGLAT_v3>(parent), octabox(parent) { } + bool ParsePart(Buffer& table) { return false; } + bool ParsePart(Buffer& table, const size_t size); + bool SerializePart(OTSStream* out) const; + struct OctaboxMetrics : public TablePart<OpenTypeGLAT_v3> { + explicit OctaboxMetrics(OpenTypeGLAT_v3* parent) + : TablePart<OpenTypeGLAT_v3>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + struct SubboxEntry : public TablePart<OpenTypeGLAT_v3> { + explicit SubboxEntry(OpenTypeGLAT_v3* parent) + : TablePart<OpenTypeGLAT_v3>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + uint8_t left; + uint8_t right; + uint8_t bottom; + uint8_t top; + uint8_t diag_pos_min; + uint8_t diag_pos_max; + uint8_t diag_neg_min; + uint8_t diag_neg_max; + }; + uint16_t subbox_bitmap; + uint8_t diag_neg_min; + uint8_t diag_neg_max; + uint8_t diag_pos_min; + uint8_t diag_pos_max; + std::vector<SubboxEntry> subboxes; + }; + struct GlatEntry : public TablePart<OpenTypeGLAT_v3> { + explicit GlatEntry(OpenTypeGLAT_v3* parent) + : TablePart<OpenTypeGLAT_v3>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + int16_t attNum; + int16_t num; + std::vector<int16_t> attributes; + }; + OctaboxMetrics octabox; + std::vector<GlatEntry> entries; + }; + uint32_t version; + uint32_t compHead; // compression header + static const uint32_t SCHEME = 0xF8000000; + static const uint32_t FULL_SIZE = 0x07FFFFFF; + static const uint32_t RESERVED = 0x07FFFFFE; + static const uint32_t OCTABOXES = 0x00000001; + std::vector<GlyphAttrs> entries; +}; + +// ----------------------------------------------------------------------------- +// OpenTypeGLAT +// ----------------------------------------------------------------------------- + +class OpenTypeGLAT : public Table { + public: + explicit OpenTypeGLAT(Font* font, uint32_t tag) + : Table(font, tag, tag), font(font), tag(tag) { } + OpenTypeGLAT(const OpenTypeGLAT& other) = delete; + OpenTypeGLAT& operator=(const OpenTypeGLAT& other) = delete; + ~OpenTypeGLAT() { delete handler; } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + Font* font; + uint32_t tag; + OpenTypeGLAT_Basic* handler = nullptr; +}; + +} // namespace ots + +#endif // OTS_GLAT_H_ diff --git a/gfx/ots/src/gloc.cc b/gfx/ots/src/gloc.cc new file mode 100644 index 000000000..9c5ee3bdf --- /dev/null +++ b/gfx/ots/src/gloc.cc @@ -0,0 +1,108 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gloc.h" + +#include "name.h" + +namespace ots { + +bool OpenTypeGLOC::Parse(const uint8_t* data, size_t length) { + if (GetFont()->dropped_graphite) { + return Drop("Skipping Graphite table"); + } + Buffer table(data, length); + OpenTypeNAME* name = static_cast<OpenTypeNAME*>( + GetFont()->GetTypedTable(OTS_TAG_NAME)); + if (!name) { + return DropGraphite("Required name table is missing"); + } + + if (!table.ReadU32(&this->version)) { + return DropGraphite("Failed to read version"); + } + if (this->version >> 16 != 1) { + return DropGraphite("Unsupported table version: %u", this->version >> 16); + } + if (!table.ReadU16(&this->flags) || this->flags > 0b11) { + return DropGraphite("Failed to read valid flags"); + } + if (!table.ReadU16(&this->numAttribs)) { + return DropGraphite("Failed to read numAttribs"); + } + + if (this->flags & ATTRIB_IDS && this->numAttribs * sizeof(uint16_t) > + table.remaining()) { + return DropGraphite("Failed to calulate length of locations"); + } + size_t locations_len = (table.remaining() - + (this->flags & ATTRIB_IDS ? this->numAttribs * sizeof(uint16_t) : 0)) / + (this->flags & LONG_FORMAT ? sizeof(uint32_t) : sizeof(uint16_t)); + //this->locations.resize(locations_len); + if (this->flags & LONG_FORMAT) { + unsigned long last_location = 0; + for (size_t i = 0; i < locations_len; ++i) { + this->locations.emplace_back(); + uint32_t& location = this->locations[i]; + if (!table.ReadU32(&location) || location < last_location) { + return DropGraphite("Failed to read valid locations[%lu]", i); + } + last_location = location; + } + } else { // short (16-bit) offsets + unsigned last_location = 0; + for (size_t i = 0; i < locations_len; ++i) { + uint16_t location; + if (!table.ReadU16(&location) || location < last_location) { + return DropGraphite("Failed to read valid locations[%lu]", i); + } + last_location = location; + this->locations.push_back(static_cast<uint32_t>(location)); + } + } + if (this->locations.empty()) { + return DropGraphite("No locations"); + } + + if (this->flags & ATTRIB_IDS) { // attribIds array present + //this->attribIds.resize(numAttribs); + for (unsigned i = 0; i < this->numAttribs; ++i) { + this->attribIds.emplace_back(); + if (!table.ReadU16(&this->attribIds[i]) || + !name->IsValidNameId(this->attribIds[i])) { + return DropGraphite("Failed to read valid attribIds[%u]", i); + } + } + } + + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + return true; +} + +bool OpenTypeGLOC::Serialize(OTSStream* out) { + if (!out->WriteU32(this->version) || + !out->WriteU16(this->flags) || + !out->WriteU16(this->numAttribs) || + (this->flags & LONG_FORMAT ? !SerializeParts(this->locations, out) : + ![&] { + for (uint32_t location : this->locations) { + if (!out->WriteU16(static_cast<uint16_t>(location))) { + return false; + } + } + return true; + }()) || + (this->flags & ATTRIB_IDS && !SerializeParts(this->attribIds, out))) { + return Error("Failed to write table"); + } + return true; +} + +const std::vector<uint32_t>& OpenTypeGLOC::GetLocations() { + return this->locations; +} + +} // namespace ots diff --git a/gfx/ots/src/gloc.h b/gfx/ots/src/gloc.h new file mode 100644 index 000000000..60184ffb9 --- /dev/null +++ b/gfx/ots/src/gloc.h @@ -0,0 +1,36 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_GLOC_H_ +#define OTS_GLOC_H_ + +#include <vector> + +#include "ots.h" +#include "graphite.h" + +namespace ots { + +class OpenTypeGLOC : public Table { + public: + explicit OpenTypeGLOC(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + const std::vector<uint32_t>& GetLocations(); + + private: + uint32_t version; + uint16_t flags; + static const uint16_t LONG_FORMAT = 0b1; + static const uint16_t ATTRIB_IDS = 0b10; + uint16_t numAttribs; + std::vector<uint32_t> locations; + std::vector<uint16_t> attribIds; +}; + +} // namespace ots + +#endif // OTS_GLOC_H_ diff --git a/gfx/ots/src/glyf.cc b/gfx/ots/src/glyf.cc index 311916dc0..0c19d6d7b 100644 --- a/gfx/ots/src/glyf.cc +++ b/gfx/ots/src/glyf.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -14,20 +14,15 @@ // glyf - Glyph Data // http://www.microsoft.com/typography/otspec/glyf.htm -#define TABLE_NAME "glyf" - -namespace { +namespace ots { -bool ParseFlagsForSimpleGlyph(ots::Font *font, - ots::Buffer *table, - uint32_t gly_length, - uint32_t num_flags, - uint32_t *flags_count_logical, - uint32_t *flags_count_physical, - uint32_t *xy_coordinates_length) { +bool OpenTypeGLYF::ParseFlagsForSimpleGlyph(Buffer &glyph, + uint32_t num_flags, + uint32_t *flag_index, + uint32_t *coordinates_length) { uint8_t flag = 0; - if (!table->ReadU8(&flag)) { - return OTS_FAILURE_MSG("Can't read flag"); + if (!glyph.ReadU8(&flag)) { + return Error("Can't read flag"); } uint32_t delta = 0; @@ -43,140 +38,205 @@ bool ParseFlagsForSimpleGlyph(ots::Font *font, delta += 2; } + /* MS and Apple specs say this bit is reserved and must be set to zero, but + * Apple spec then contradicts itself and says it should be set on the first + * contour flag for simple glyphs with overlapping contours: + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6AATIntro.html + * (“Overlapping contours†section) */ + if (flag & (1u << 6) && *flag_index != 0) { + return Error("Bad glyph flag (%d), " + "bit 6 must be set to zero for flag %d", flag, *flag_index); + } + if (flag & (1u << 3)) { // repeat - if (*flags_count_logical + 1 >= num_flags) { - return OTS_FAILURE_MSG("Count too high (%d + 1 >= %d)", *flags_count_logical, num_flags); + if (*flag_index + 1 >= num_flags) { + return Error("Count too high (%d + 1 >= %d)", *flag_index, num_flags); } uint8_t repeat = 0; - if (!table->ReadU8(&repeat)) { - return OTS_FAILURE_MSG("Can't read repeat value"); + if (!glyph.ReadU8(&repeat)) { + return Error("Can't read repeat value"); } if (repeat == 0) { - return OTS_FAILURE_MSG("Zero repeat"); + return Error("Zero repeat"); } delta += (delta * repeat); - *flags_count_logical += repeat; - if (*flags_count_logical >= num_flags) { - return OTS_FAILURE_MSG("Count too high (%d >= %d)", *flags_count_logical, num_flags); + *flag_index += repeat; + if (*flag_index >= num_flags) { + return Error("Count too high (%d >= %d)", *flag_index, num_flags); } - ++(*flags_count_physical); } - if ((flag & (1u << 6)) || (flag & (1u << 7))) { // reserved flags - return OTS_FAILURE_MSG("Bad glyph flag value (%d), reserved flags must be set to zero", flag); + if (flag & (1u << 7)) { // reserved flag + return Error("Bad glyph flag (%d), reserved bit 7 must be set to zero", flag); } - *xy_coordinates_length += delta; - if (gly_length < *xy_coordinates_length) { - return OTS_FAILURE_MSG("Glyph coordinates length too low (%d < %d)", gly_length, *xy_coordinates_length); + *coordinates_length += delta; + if (glyph.length() < *coordinates_length) { + return Error("Glyph coordinates length bigger than glyph length (%d > %d)", + *coordinates_length, glyph.length()); } return true; } -bool ParseSimpleGlyph(ots::Font *font, const uint8_t *data, - ots::Buffer *table, int16_t num_contours, - uint32_t gly_offset, uint32_t gly_length, - uint32_t *new_size) { - ots::OpenTypeGLYF *glyf = font->glyf; - +bool OpenTypeGLYF::ParseSimpleGlyph(Buffer &glyph, + int16_t num_contours) { // read the end-points array uint16_t num_flags = 0; for (int i = 0; i < num_contours; ++i) { uint16_t tmp_index = 0; - if (!table->ReadU16(&tmp_index)) { - return OTS_FAILURE_MSG("Can't read contour index %d", i); + if (!glyph.ReadU16(&tmp_index)) { + return Error("Can't read contour index %d", i); } if (tmp_index == 0xffffu) { - return OTS_FAILURE_MSG("Bad contour index %d", i); + return Error("Bad contour index %d", i); } // check if the indices are monotonically increasing if (i && (tmp_index + 1 <= num_flags)) { - return OTS_FAILURE_MSG("Decreasing contour index %d + 1 <= %d", tmp_index, num_flags); + return Error("Decreasing contour index %d + 1 <= %d", tmp_index, num_flags); } num_flags = tmp_index + 1; } uint16_t bytecode_length = 0; - if (!table->ReadU16(&bytecode_length)) { - return OTS_FAILURE_MSG("Can't read bytecode length"); - } - if ((font->maxp->version_1) && - (font->maxp->max_size_glyf_instructions < bytecode_length)) { - return OTS_FAILURE_MSG("Bytecode length too high %d", bytecode_length); + if (!glyph.ReadU16(&bytecode_length)) { + return Error("Can't read bytecode length"); } - const uint32_t gly_header_length = 10 + num_contours * 2 + 2; - if (gly_length < (gly_header_length + bytecode_length)) { - return OTS_FAILURE_MSG("Glyph header length too high %d", gly_header_length); + if (this->maxp->version_1 && + this->maxp->max_size_glyf_instructions < bytecode_length) { + this->maxp->max_size_glyf_instructions = bytecode_length; + Warning("Bytecode length is bigger than maxp.maxSizeOfInstructions %d: %d", + this->maxp->max_size_glyf_instructions, bytecode_length); } - glyf->iov.push_back(std::make_pair( - data + gly_offset, - static_cast<size_t>(gly_header_length + bytecode_length))); - - if (!table->Skip(bytecode_length)) { - return OTS_FAILURE_MSG("Can't skip bytecode of length %d", bytecode_length); + if (!glyph.Skip(bytecode_length)) { + return Error("Can't read bytecode of length %d", bytecode_length); } - uint32_t flags_count_physical = 0; // on memory - uint32_t xy_coordinates_length = 0; - for (uint32_t flags_count_logical = 0; - flags_count_logical < num_flags; - ++flags_count_logical, ++flags_count_physical) { - if (!ParseFlagsForSimpleGlyph(font, - table, - gly_length, - num_flags, - &flags_count_logical, - &flags_count_physical, - &xy_coordinates_length)) { - return OTS_FAILURE_MSG("Failed to parse glyph flags %d", flags_count_logical); + uint32_t coordinates_length = 0; + for (uint32_t i = 0; i < num_flags; ++i) { + if (!ParseFlagsForSimpleGlyph(glyph, num_flags, &i, &coordinates_length)) { + return Error("Failed to parse glyph flags %d", i); } } - if (gly_length < (gly_header_length + bytecode_length + - flags_count_physical + xy_coordinates_length)) { - return OTS_FAILURE_MSG("Glyph too short %d", gly_length); + if (!glyph.Skip(coordinates_length)) { + return Error("Glyph too short %d", glyph.length()); } - if (gly_length - (gly_header_length + bytecode_length + - flags_count_physical + xy_coordinates_length) > 3) { + if (glyph.remaining() > 3) { // We allow 0-3 bytes difference since gly_length is 4-bytes aligned, // zero-padded length. - return OTS_FAILURE_MSG("Invalid glyph length %d", gly_length); + Warning("Extra bytes at end of the glyph: %d", glyph.remaining()); } - glyf->iov.push_back(std::make_pair( - data + gly_offset + gly_header_length + bytecode_length, - static_cast<size_t>(flags_count_physical + xy_coordinates_length))); - - *new_size - = gly_header_length + flags_count_physical + xy_coordinates_length + bytecode_length; + this->iov.push_back(std::make_pair(glyph.buffer(), glyph.offset())); return true; } -} // namespace +#define ARG_1_AND_2_ARE_WORDS (1u << 0) +#define WE_HAVE_A_SCALE (1u << 3) +#define MORE_COMPONENTS (1u << 5) +#define WE_HAVE_AN_X_AND_Y_SCALE (1u << 6) +#define WE_HAVE_A_TWO_BY_TWO (1u << 7) +#define WE_HAVE_INSTRUCTIONS (1u << 8) + +bool OpenTypeGLYF::ParseCompositeGlyph(Buffer &glyph) { + uint16_t flags = 0; + uint16_t gid = 0; + do { + if (!glyph.ReadU16(&flags) || !glyph.ReadU16(&gid)) { + return Error("Can't read composite glyph flags or glyphIndex"); + } -namespace ots { + if (gid >= this->maxp->num_glyphs) { + return Error("Invalid glyph id used in composite glyph: %d", gid); + } + + if (flags & ARG_1_AND_2_ARE_WORDS) { + int16_t argument1; + int16_t argument2; + if (!glyph.ReadS16(&argument1) || !glyph.ReadS16(&argument2)) { + return Error("Can't read argument1 or argument2"); + } + } else { + uint8_t argument1; + uint8_t argument2; + if (!glyph.ReadU8(&argument1) || !glyph.ReadU8(&argument2)) { + return Error("Can't read argument1 or argument2"); + } + } + + if (flags & WE_HAVE_A_SCALE) { + int16_t scale; + if (!glyph.ReadS16(&scale)) { + return Error("Can't read scale"); + } + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + int16_t xscale; + int16_t yscale; + if (!glyph.ReadS16(&xscale) || !glyph.ReadS16(&yscale)) { + return Error("Can't read xscale or yscale"); + } + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + int16_t xscale; + int16_t scale01; + int16_t scale10; + int16_t yscale; + if (!glyph.ReadS16(&xscale) || + !glyph.ReadS16(&scale01) || + !glyph.ReadS16(&scale10) || + !glyph.ReadS16(&yscale)) { + return Error("Can't read transform"); + } + } + } while (flags & MORE_COMPONENTS); + + if (flags & WE_HAVE_INSTRUCTIONS) { + uint16_t bytecode_length; + if (!glyph.ReadU16(&bytecode_length)) { + return Error("Can't read instructions size"); + } -bool ots_glyf_parse(Font *font, const uint8_t *data, size_t length) { - Buffer table(data, length); + if (this->maxp->version_1 && + this->maxp->max_size_glyf_instructions < bytecode_length) { + this->maxp->max_size_glyf_instructions = bytecode_length; + Warning("Bytecode length is bigger than maxp.maxSizeOfInstructions " + "%d: %d", + this->maxp->max_size_glyf_instructions, bytecode_length); + } - if (!font->maxp || !font->loca || !font->head) { - return OTS_FAILURE_MSG("Missing maxp or loca or head table needed by glyf table"); + if (!glyph.Skip(bytecode_length)) { + return Error("Can't read bytecode of length %d", bytecode_length); + } } - OpenTypeGLYF *glyf = new OpenTypeGLYF; - font->glyf = glyf; + this->iov.push_back(std::make_pair(glyph.buffer(), glyph.offset())); - const unsigned num_glyphs = font->maxp->num_glyphs; - std::vector<uint32_t> &offsets = font->loca->offsets; + return true; +} + +bool OpenTypeGLYF::Parse(const uint8_t *data, size_t length) { + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + OpenTypeLOCA *loca = static_cast<OpenTypeLOCA*>( + GetFont()->GetTypedTable(OTS_TAG_LOCA)); + OpenTypeHEAD *head = static_cast<OpenTypeHEAD*>( + GetFont()->GetTypedTable(OTS_TAG_HEAD)); + if (!maxp || !loca || !head) { + return Error("Missing maxp or loca or head table needed by glyf table"); + } + + this->maxp = maxp; + + const unsigned num_glyphs = maxp->num_glyphs; + std::vector<uint32_t> &offsets = loca->offsets; if (offsets.size() != num_glyphs + 1) { - return OTS_FAILURE_MSG("Invalide glyph offsets size %ld != %d", offsets.size(), num_glyphs + 1); + return Error("Invalide glyph offsets size %ld != %d", offsets.size(), num_glyphs + 1); } std::vector<uint32_t> resulting_offsets(num_glyphs + 1); @@ -193,30 +253,31 @@ bool ots_glyf_parse(Font *font, const uint8_t *data, size_t length) { } if (gly_offset >= length) { - return OTS_FAILURE_MSG("Glyph %d offset %d too high %ld", i, gly_offset, length); + return Error("Glyph %d offset %d too high %ld", i, gly_offset, length); } // Since these are unsigned types, the compiler is not allowed to assume // that they never overflow. if (gly_offset + gly_length < gly_offset) { - return OTS_FAILURE_MSG("Glyph %d length (%d < 0)!", i, gly_length); + return Error("Glyph %d length (%d < 0)!", i, gly_length); } if (gly_offset + gly_length > length) { - return OTS_FAILURE_MSG("Glyph %d length %d too high", i, gly_length); + return Error("Glyph %d length %d too high", i, gly_length); } - table.set_offset(gly_offset); + Buffer glyph(data + gly_offset, gly_length); + int16_t num_contours, xmin, ymin, xmax, ymax; - if (!table.ReadS16(&num_contours) || - !table.ReadS16(&xmin) || - !table.ReadS16(&ymin) || - !table.ReadS16(&xmax) || - !table.ReadS16(&ymax)) { - return OTS_FAILURE_MSG("Can't read glyph %d header", i); + if (!glyph.ReadS16(&num_contours) || + !glyph.ReadS16(&xmin) || + !glyph.ReadS16(&ymin) || + !glyph.ReadS16(&xmax) || + !glyph.ReadS16(&ymax)) { + return Error("Can't read glyph %d header", i); } if (num_contours <= -2) { // -2, -3, -4, ... are reserved for future use. - return OTS_FAILURE_MSG("Bad number of contours %d in glyph %d", num_contours, i); + return Error("Bad number of contours %d in glyph %d", num_contours, i); } // workaround for fonts in http://www.princexml.com/fonts/ @@ -224,35 +285,36 @@ bool ots_glyf_parse(Font *font, const uint8_t *data, size_t length) { (xmax == -32767) && (ymin == 32767) && (ymax == -32767)) { - OTS_WARNING("bad xmin/xmax/ymin/ymax values"); + Warning("bad xmin/xmax/ymin/ymax values"); xmin = xmax = ymin = ymax = 0; } if (xmin > xmax || ymin > ymax) { - return OTS_FAILURE_MSG("Bad bounding box values bl=(%d, %d), tr=(%d, %d) in glyph %d", xmin, ymin, xmax, ymax, i); + return Error("Bad bounding box values bl=(%d, %d), tr=(%d, %d) in glyph %d", xmin, ymin, xmax, ymax, i); } - unsigned new_size = 0; - if (num_contours >= 0) { - // this is a simple glyph and might contain bytecode - if (!ParseSimpleGlyph(font, data, &table, - num_contours, gly_offset, gly_length, &new_size)) { - return OTS_FAILURE_MSG("Failed to parse glyph %d", i); + if (num_contours == 0) { + // This is an empty glyph and shouldn’t have any glyph data, but if it + // does we will simply ignore it. + glyph.set_offset(0); + } else if (num_contours > 0) { + if (!ParseSimpleGlyph(glyph, num_contours)) { + return Error("Failed to parse glyph %d", i); } } else { - // it's a composite glyph without any bytecode. Enqueue the whole thing - glyf->iov.push_back(std::make_pair(data + gly_offset, - static_cast<size_t>(gly_length))); - new_size = gly_length; + if (!ParseCompositeGlyph(glyph)) { + return Error("Failed to parse glyph %d", i); + } } + size_t new_size = glyph.offset(); resulting_offsets[i] = current_offset; // glyphs must be four byte aligned // TODO(yusukes): investigate whether this padding is really necessary. // Which part of the spec requires this? const unsigned padding = (4 - (new_size & 3)) % 4; if (padding) { - glyf->iov.push_back(std::make_pair( + this->iov.push_back(std::make_pair( reinterpret_cast<const uint8_t*>("\x00\x00\x00\x00"), static_cast<size_t>(padding))); new_size += padding; @@ -264,40 +326,32 @@ bool ots_glyf_parse(Font *font, const uint8_t *data, size_t length) { const uint16_t max16 = std::numeric_limits<uint16_t>::max(); if ((*std::max_element(resulting_offsets.begin(), resulting_offsets.end()) >= (max16 * 2u)) && - (font->head->index_to_loc_format != 1)) { - OTS_WARNING("2-bytes indexing is not possible (due to the padding above)"); - font->head->index_to_loc_format = 1; + (head->index_to_loc_format != 1)) { + head->index_to_loc_format = 1; } - font->loca->offsets = resulting_offsets; - return true; -} - -bool ots_glyf_should_serialise(Font *font) { - return font->glyf != NULL; -} - -bool ots_glyf_serialise(OTSStream *out, Font *font) { - const OpenTypeGLYF *glyf = font->glyf; + loca->offsets = resulting_offsets; - for (unsigned i = 0; i < glyf->iov.size(); ++i) { - if (!out->Write(glyf->iov[i].first, glyf->iov[i].second)) { - return OTS_FAILURE_MSG("Falied to write glyph %d", i); - } + if (this->iov.empty()) { + // As a special case when all glyph in the font are empty, add a zero byte + // to the table, so that we don’t reject it down the way, and to make the + // table work on Windows as well. + // See https://github.com/khaledhosny/ots/issues/52 + static const uint8_t kZero = 0; + this->iov.push_back(std::make_pair(&kZero, 1)); } return true; } -void ots_glyf_reuse(Font *font, Font *other) { - font->glyf = other->glyf; - font->glyf_reused = true; -} +bool OpenTypeGLYF::Serialize(OTSStream *out) { + for (unsigned i = 0; i < this->iov.size(); ++i) { + if (!out->Write(this->iov[i].first, this->iov[i].second)) { + return Error("Falied to write glyph %d", i); + } + } -void ots_glyf_free(Font *font) { - delete font->glyf; + return true; } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/glyf.h b/gfx/ots/src/glyf.h index 9a8baf5ec..1da94e4b9 100644 --- a/gfx/ots/src/glyf.h +++ b/gfx/ots/src/glyf.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -12,8 +12,26 @@ #include "ots.h" namespace ots { +class OpenTypeMAXP; + +class OpenTypeGLYF : public Table { + public: + explicit OpenTypeGLYF(Font *font, uint32_t tag) + : Table(font, tag, tag), maxp(NULL) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + + private: + bool ParseFlagsForSimpleGlyph(Buffer &glyph, + uint32_t num_flags, + uint32_t *flag_index, + uint32_t *coordinates_length); + bool ParseSimpleGlyph(Buffer &glyph, int16_t num_contours); + bool ParseCompositeGlyph(Buffer &glyph); + + OpenTypeMAXP* maxp; -struct OpenTypeGLYF { std::vector<std::pair<const uint8_t*, size_t> > iov; }; diff --git a/gfx/ots/src/gpos.cc b/gfx/ots/src/gpos.cc index 83d9ab053..034f9799d 100644 --- a/gfx/ots/src/gpos.cc +++ b/gfx/ots/src/gpos.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -30,12 +30,12 @@ enum GPOS_TYPE { GPOS_TYPE_RESERVED = 10 }; -// The size of gpos header. -const unsigned kGposHeaderSize = 10; +// The size of gpos header, version 1.0. +const unsigned kGposHeaderSize_1_0 = 10; +// The size of gpos header, version 1.1. +const unsigned kGposHeaderSize_1_1 = 14; // The maximum format number for anchor tables. const uint16_t kMaxAnchorFormat = 3; -// The maximum number of class value. -const uint16_t kMaxClassDefValue = 0xFFFF; // Lookup type parsers. bool ParseSingleAdjustment(const ots::Font *font, @@ -76,9 +76,23 @@ const ots::LookupSubtableParser kGposLookupSubtableParser = { // Shared Tables: ValueRecord, Anchor Table, and MarkArray +size_t CalcValueRecordSize(const uint16_t value_format) { + size_t size = 0; + for (unsigned i = 0; i < 8; ++i) { + if ((value_format >> i) & 0x1) { + size += 2; + } + } + + return size; +} + bool ParseValueRecord(const ots::Font *font, - ots::Buffer* subtable, const uint8_t *data, - const size_t length, const uint16_t value_format) { + ots::Buffer* subtable, + const uint16_t value_format) { + const uint8_t *data = subtable->buffer(); + const size_t length = subtable->length(); + // Check existence of adjustment fields. for (unsigned i = 0; i < 4; ++i) { if ((value_format >> i) & 0x1) { @@ -207,6 +221,12 @@ bool ParseSingleAdjustment(const ots::Font *font, const uint8_t *data, const size_t length) { ots::Buffer subtable(data, length); + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + uint16_t format = 0; uint16_t offset_coverage = 0; uint16_t value_format = 0; @@ -218,7 +238,7 @@ bool ParseSingleAdjustment(const ots::Font *font, const uint8_t *data, if (format == 1) { // Format 1 exactly one value record. - if (!ParseValueRecord(font, &subtable, data, length, value_format)) { + if (!ParseValueRecord(font, &subtable, value_format)) { return OTS_FAILURE_MSG("Failed to parse format 1 single adjustment table"); } } else if (format == 2) { @@ -227,7 +247,7 @@ bool ParseSingleAdjustment(const ots::Font *font, const uint8_t *data, return OTS_FAILURE_MSG("Failed to parse format 2 single adjustment table"); } for (unsigned i = 0; i < value_count; ++i) { - if (!ParseValueRecord(font, &subtable, data, length, value_format)) { + if (!ParseValueRecord(font, &subtable, value_format)) { return OTS_FAILURE_MSG("Failed to parse value record %d in format 2 single adjustment table", i); } } @@ -241,7 +261,7 @@ bool ParseSingleAdjustment(const ots::Font *font, const uint8_t *data, if (!ots::ParseCoverageTable(font, data + offset_coverage, length - offset_coverage, - font->maxp->num_glyphs)) { + maxp->num_glyphs)) { return OTS_FAILURE_MSG("Failed to parse coverage table in single adjustment table"); } @@ -268,10 +288,10 @@ bool ParsePairSetTable(const ots::Font *font, if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("glyph id %d too high >= %d", glyph_id, num_glyphs); } - if (!ParseValueRecord(font, &subtable, data, length, value_format1)) { + if (!ParseValueRecord(font, &subtable, value_format1)) { return OTS_FAILURE_MSG("Failed to parse value record in format 1 pair set table"); } - if (!ParseValueRecord(font, &subtable, data, length, value_format2)) { + if (!ParseValueRecord(font, &subtable, value_format2)) { return OTS_FAILURE_MSG("Failed to parse value record in format 2 pair set table"); } } @@ -341,34 +361,44 @@ bool ParsePairPosFormat2(const ots::Font *font, return OTS_FAILURE_MSG("Failed to read pair pos format 2 data"); } + size_t value_record1_size = CalcValueRecordSize(value_format1); + size_t value_record2_size = CalcValueRecordSize(value_format2); + size_t value_records_size = size_t(class1_count) * size_t(class2_count) * + (value_record1_size + value_record2_size); + + // Check the validity of class definition offsets. + if (offset_class_def1 < subtable.offset() + value_records_size || + offset_class_def2 < subtable.offset() + value_records_size || + offset_class_def1 >= length || offset_class_def2 >= length) { + return OTS_FAILURE_MSG("Bad ParsePairPosFormat2 class definition offsets %d or %d", offset_class_def1, offset_class_def2); + } + // Check class 1 records. - for (unsigned i = 0; i < class1_count; ++i) { - // Check class 2 records. - for (unsigned j = 0; j < class2_count; ++j) { - if (value_format1 && !ParseValueRecord(font, &subtable, data, length, - value_format1)) { - return OTS_FAILURE_MSG("Failed to parse value record 1 %d and %d", j, i); - } - if (value_format2 && !ParseValueRecord(font, &subtable, data, length, - value_format2)) { - return OTS_FAILURE_MSG("Falied to parse value record 2 %d and %d", j, i); + if (value_record1_size || value_record2_size) { + for (unsigned i = 0; i < class1_count; ++i) { + // Check class 2 records. + for (unsigned j = 0; j < class2_count; ++j) { + if (value_format1 && value_record2_size && + !ParseValueRecord(font, &subtable, value_format1)) { + return OTS_FAILURE_MSG("Failed to parse value record 1 %d and %d", j, i); + } + if (value_format2 && value_record2_size && + !ParseValueRecord(font, &subtable, value_format2)) { + return OTS_FAILURE_MSG("Falied to parse value record 2 %d and %d", j, i); + } } } } // Check class definition tables. - if (offset_class_def1 < subtable.offset() || offset_class_def1 >= length || - offset_class_def2 < subtable.offset() || offset_class_def2 >= length) { - return OTS_FAILURE_MSG("Bad class definition table offsets %d or %d", offset_class_def1, offset_class_def2); - } if (!ots::ParseClassDefTable(font, data + offset_class_def1, length - offset_class_def1, - num_glyphs, kMaxClassDefValue)) { + num_glyphs, ots::kMaxClassDefValue)) { return OTS_FAILURE_MSG("Failed to parse class definition table 1"); } if (!ots::ParseClassDefTable(font, data + offset_class_def2, length - offset_class_def2, - num_glyphs, kMaxClassDefValue)) { + num_glyphs, ots::kMaxClassDefValue)) { return OTS_FAILURE_MSG("Failed to parse class definition table 2"); } @@ -381,6 +411,12 @@ bool ParsePairAdjustment(const ots::Font *font, const uint8_t *data, const size_t length) { ots::Buffer subtable(data, length); + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + uint16_t format = 0; uint16_t offset_coverage = 0; uint16_t value_format1 = 0; @@ -394,12 +430,12 @@ bool ParsePairAdjustment(const ots::Font *font, const uint8_t *data, if (format == 1) { if (!ParsePairPosFormat1(font, data, length, value_format1, value_format2, - font->maxp->num_glyphs)) { + maxp->num_glyphs)) { return OTS_FAILURE_MSG("Failed to parse pair pos format 1"); } } else if (format == 2) { if (!ParsePairPosFormat2(font, data, length, value_format1, value_format2, - font->maxp->num_glyphs)) { + maxp->num_glyphs)) { return OTS_FAILURE_MSG("Failed to parse pair format 2"); } } else { @@ -411,7 +447,7 @@ bool ParsePairAdjustment(const ots::Font *font, const uint8_t *data, } if (!ots::ParseCoverageTable(font, data + offset_coverage, length - offset_coverage, - font->maxp->num_glyphs)) { + maxp->num_glyphs)) { return OTS_FAILURE_MSG("Failed to parse coverage table"); } @@ -424,6 +460,12 @@ bool ParseCursiveAttachment(const ots::Font *font, const uint8_t *data, const size_t length) { ots::Buffer subtable(data, length); + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + uint16_t format = 0; uint16_t offset_coverage = 0; uint16_t entry_exit_count = 0; @@ -478,7 +520,7 @@ bool ParseCursiveAttachment(const ots::Font *font, const uint8_t *data, } if (!ots::ParseCoverageTable(font, data + offset_coverage, length - offset_coverage, - font->maxp->num_glyphs)) { + maxp->num_glyphs)) { return OTS_FAILURE_MSG("Failed to parse coverage table in cursive attachment"); } @@ -552,6 +594,12 @@ bool ParseMarkToAttachmentSubtables(const ots::Font *font, const GPOS_TYPE type) { ots::Buffer subtable(data, length); + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + uint16_t format = 0; uint16_t offset_coverage1 = 0; uint16_t offset_coverage2 = 0; @@ -580,7 +628,7 @@ bool ParseMarkToAttachmentSubtables(const ots::Font *font, } if (!ots::ParseCoverageTable(font, data + offset_coverage1, length - offset_coverage1, - font->maxp->num_glyphs)) { + maxp->num_glyphs)) { return OTS_FAILURE_MSG("Failed to parse converge 1 table"); } if (offset_coverage2 < header_end || offset_coverage2 >= length) { @@ -588,7 +636,7 @@ bool ParseMarkToAttachmentSubtables(const ots::Font *font, } if (!ots::ParseCoverageTable(font, data + offset_coverage2, length - offset_coverage2, - font->maxp->num_glyphs)) { + maxp->num_glyphs)) { return OTS_FAILURE_MSG("Failed to parse coverage table 2"); } @@ -652,17 +700,37 @@ bool ParseMarkToMarkAttachment(const ots::Font *font, // Contextual Positioning Subtables bool ParseContextPositioning(const ots::Font *font, const uint8_t *data, const size_t length) { - return ots::ParseContextSubtable(font, data, length, font->maxp->num_glyphs, - font->gpos->num_lookups); + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + ots::OpenTypeGPOS *gpos = static_cast<ots::OpenTypeGPOS*>( + font->GetTypedTable(OTS_TAG_GPOS)); + if (!gpos) { + return OTS_FAILURE_MSG("Internal error!"); + } + return ots::ParseContextSubtable(font, data, length, maxp->num_glyphs, + gpos->num_lookups); } // Lookup Type 8: // Chaining Contexual Positioning Subtable bool ParseChainedContextPositioning(const ots::Font *font, const uint8_t *data, const size_t length) { + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + ots::OpenTypeGPOS *gpos = static_cast<ots::OpenTypeGPOS*>( + font->GetTypedTable(OTS_TAG_GPOS)); + if (!gpos) { + return OTS_FAILURE_MSG("Internal error!"); + } return ots::ParseChainingContextSubtable(font, data, length, - font->maxp->num_glyphs, - font->gpos->num_lookups); + maxp->num_glyphs, + gpos->num_lookups); } // Lookup Type 9: @@ -677,139 +745,96 @@ bool ParseExtensionPositioning(const ots::Font *font, namespace ots { -// As far as I checked, following fonts contain invalid GPOS table and -// OTS will drop their GPOS table. -// -// # invalid delta format in device table -// samanata.ttf -// -// # bad size range in device table -// Sarai_07.ttf -// -// # bad offset to PairSetTable -// chandas1-2.ttf -// -// # bad offset to FeatureTable -// glrso12.ttf -// gllr12.ttf -// glbo12.ttf -// glb12.ttf -// glro12.ttf -// glbso12.ttf -// glrc12.ttf -// glrsc12.ttf -// glbs12.ttf -// glrs12.ttf -// glr12.ttf -// -// # ScriptRecords aren't sorted by tag -// Garogier_unhinted.otf -// -// # bad start coverage index in CoverageFormat2 -// AndBasR.ttf -// CharisSILB.ttf -// CharisSILBI.ttf -// CharisSILI.ttf -// CharisSILR.ttf -// DoulosSILR.ttf -// GenBasBI.ttf -// GenBasI.ttf -// GenBkBasI.ttf -// GenBkBasB.ttf -// GenBkBasR.ttf -// Padauk-Bold.ttf -// Padauk.ttf -// -// # Contour point indexes aren't sorted -// Arial Unicode.ttf - -bool ots_gpos_parse(Font *font, const uint8_t *data, size_t length) { - // Parsing GPOS table requires num_glyphs which is contained in maxp table. - if (!font->maxp) { - return OTS_FAILURE_MSG("missing maxp table needed in GPOS"); - } - +bool OpenTypeGPOS::Parse(const uint8_t *data, size_t length) { + Font *font = GetFont(); Buffer table(data, length); - OpenTypeGPOS *gpos = new OpenTypeGPOS; - font->gpos = gpos; - - uint32_t version = 0; + uint16_t version_major = 0, version_minor = 0; uint16_t offset_script_list = 0; uint16_t offset_feature_list = 0; uint16_t offset_lookup_list = 0; - if (!table.ReadU32(&version) || + uint32_t offset_feature_variations = 0; + if (!table.ReadU16(&version_major) || + !table.ReadU16(&version_minor) || !table.ReadU16(&offset_script_list) || !table.ReadU16(&offset_feature_list) || !table.ReadU16(&offset_lookup_list)) { - return OTS_FAILURE_MSG("Incomplete table"); + return Error("Incomplete table"); } - if (version != 0x00010000) { - return OTS_FAILURE_MSG("Bad version"); + if (version_major != 1 || version_minor > 1) { + return Error("Bad version"); + } + + if (version_minor > 0) { + if (!table.ReadU32(&offset_feature_variations)) { + return Error("Incomplete table"); + } } + const size_t header_size = + (version_minor == 0) ? kGposHeaderSize_1_0 : kGposHeaderSize_1_1; + if (offset_lookup_list) { - if (offset_lookup_list < kGposHeaderSize || offset_lookup_list >= length) { - return OTS_FAILURE_MSG("Bad lookup list offset in table header"); + if (offset_lookup_list < header_size || offset_lookup_list >= length) { + return Error("Bad lookup list offset in table header"); } if (!ParseLookupListTable(font, data + offset_lookup_list, length - offset_lookup_list, &kGposLookupSubtableParser, - &gpos->num_lookups)) { - return OTS_FAILURE_MSG("Failed to parse lookup list table"); + &this->num_lookups)) { + return Error("Failed to parse lookup list table"); } } uint16_t num_features = 0; if (offset_feature_list) { - if (offset_feature_list < kGposHeaderSize || offset_feature_list >= length) { - return OTS_FAILURE_MSG("Bad feature list offset in table header"); + if (offset_feature_list < header_size || offset_feature_list >= length) { + return Error("Bad feature list offset in table header"); } if (!ParseFeatureListTable(font, data + offset_feature_list, - length - offset_feature_list, gpos->num_lookups, + length - offset_feature_list, this->num_lookups, &num_features)) { - return OTS_FAILURE_MSG("Failed to parse feature list table"); + return Error("Failed to parse feature list table"); } } if (offset_script_list) { - if (offset_script_list < kGposHeaderSize || offset_script_list >= length) { - return OTS_FAILURE_MSG("Bad script list offset in table header"); + if (offset_script_list < header_size || offset_script_list >= length) { + return Error("Bad script list offset in table header"); } if (!ParseScriptListTable(font, data + offset_script_list, length - offset_script_list, num_features)) { - return OTS_FAILURE_MSG("Failed to parse script list table"); + return Error("Failed to parse script list table"); } } - gpos->data = data; - gpos->length = length; - return true; -} - -bool ots_gpos_should_serialise(Font *font) { - return font->gpos != NULL && font->gpos->data != NULL; -} + if (offset_feature_variations) { + if (offset_feature_variations < header_size || offset_feature_variations >= length) { + return Error("Bad feature variations offset in table header"); + } -bool ots_gpos_serialise(OTSStream *out, Font *font) { - if (!out->Write(font->gpos->data, font->gpos->length)) { - return OTS_FAILURE_MSG("Failed to write GPOS table"); + if (!ParseFeatureVariationsTable(font, data + offset_feature_variations, + length - offset_feature_variations, + this->num_lookups)) { + return Error("Failed to parse feature variations table"); + } } + this->m_data = data; + this->m_length = length; return true; } -void ots_gpos_reuse(Font *font, Font *other) { - font->gpos = other->gpos; - font->gpos_reused = true; -} +bool OpenTypeGPOS::Serialize(OTSStream *out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write GPOS table"); + } -void ots_gpos_free(Font *font) { - delete font->gpos; + return true; } } // namespace ots diff --git a/gfx/ots/src/gpos.h b/gfx/ots/src/gpos.h index 3a4034f6f..423c8ae83 100644 --- a/gfx/ots/src/gpos.h +++ b/gfx/ots/src/gpos.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,18 +9,24 @@ namespace ots { -struct OpenTypeGPOS { - OpenTypeGPOS() - : num_lookups(0), - data(NULL), - length(0) { +class OpenTypeGPOS : public Table { + public: + explicit OpenTypeGPOS(Font *font, uint32_t tag) + : Table(font, tag, tag), + num_lookups(0), + m_data(NULL), + m_length(0) { } + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + // Number of lookups in GPOS table uint16_t num_lookups; - const uint8_t *data; - size_t length; + private: + const uint8_t *m_data; + size_t m_length; }; } // namespace ots diff --git a/gfx/ots/src/graphite.h b/gfx/ots/src/graphite.h new file mode 100644 index 000000000..452cb26a8 --- /dev/null +++ b/gfx/ots/src/graphite.h @@ -0,0 +1,96 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_GRAPHITE_H_ +#define OTS_GRAPHITE_H_ + +#include <vector> +#include <type_traits> + +namespace ots { + +template<typename ParentType> +class TablePart { + public: + TablePart(ParentType* parent) : parent(parent) { } + virtual ~TablePart() { } + virtual bool ParsePart(Buffer& table) = 0; + virtual bool SerializePart(OTSStream* out) const = 0; + protected: + ParentType* parent; +}; + +template<typename T> +bool SerializeParts(const std::vector<T>& vec, OTSStream* out) { + for (const T& part : vec) { + if (!part.SerializePart(out)) { + return false; + } + } + return true; +} + +template<typename T> +bool SerializeParts(const std::vector<std::vector<T>>& vec, OTSStream* out) { + for (const std::vector<T>& part : vec) { + if (!SerializeParts(part, out)) { + return false; + } + } + return true; +} + +inline bool SerializeParts(const std::vector<uint8_t>& vec, OTSStream* out) { + for (uint8_t part : vec) { + if (!out->WriteU8(part)) { + return false; + } + } + return true; +} + +inline bool SerializeParts(const std::vector<uint16_t>& vec, OTSStream* out) { + for (uint16_t part : vec) { + if (!out->WriteU16(part)) { + return false; + } + } + return true; +} + +inline bool SerializeParts(const std::vector<int16_t>& vec, OTSStream* out) { + for (int16_t part : vec) { + if (!out->WriteS16(part)) { + return false; + } + } + return true; +} + +inline bool SerializeParts(const std::vector<uint32_t>& vec, OTSStream* out) { + for (uint32_t part : vec) { + if (!out->WriteU32(part)) { + return false; + } + } + return true; +} + +inline bool SerializeParts(const std::vector<int32_t>& vec, OTSStream* out) { + for (int32_t part : vec) { + if (!out->WriteS32(part)) { + return false; + } + } + return true; +} + +template<typename T> +size_t datasize(std::vector<T> vec) { + return sizeof(T) * vec.size(); +} + +} // namespace ots + +#endif // OTS_GRAPHITE_H_ diff --git a/gfx/ots/src/gsub.cc b/gfx/ots/src/gsub.cc index 9baf2e88b..c90fb48f3 100644 --- a/gfx/ots/src/gsub.cc +++ b/gfx/ots/src/gsub.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -17,8 +17,10 @@ namespace { -// The GSUB header size -const size_t kGsubHeaderSize = 4 + 3 * 2; +// The GSUB header size for table version 1.0 +const size_t kGsubHeaderSize_1_0 = 4 + 3 * 2; +// GSUB header size v1.1 +const size_t kGsubHeaderSize_1_1 = 4 + 3 * 2 + 4; enum GSUB_TYPE { GSUB_TYPE_SINGLE = 1, @@ -82,7 +84,12 @@ bool ParseSingleSubstitution(const ots::Font *font, return OTS_FAILURE_MSG("Failed to read single subst table header"); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + const uint16_t num_glyphs = maxp->num_glyphs; if (format == 1) { // Parse SingleSubstFormat1 int16_t delta_glyph_id = 0; @@ -170,7 +177,12 @@ bool ParseMutipleSubstitution(const ots::Font *font, return OTS_FAILURE_MSG("Bad multiple subst table format %d", format); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + const uint16_t num_glyphs = maxp->num_glyphs; const unsigned sequence_end = static_cast<unsigned>(6) + sequence_count * 2; if (sequence_end > std::numeric_limits<uint16_t>::max()) { @@ -245,7 +257,12 @@ bool ParseAlternateSubstitution(const ots::Font *font, return OTS_FAILURE_MSG("Bad alternate subst table format %d", format); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + const uint16_t num_glyphs = maxp->num_glyphs; const unsigned alternate_set_end = static_cast<unsigned>(6) + alternate_set_count * 2; if (alternate_set_end > std::numeric_limits<uint16_t>::max()) { @@ -362,7 +379,12 @@ bool ParseLigatureSubstitution(const ots::Font *font, return OTS_FAILURE_MSG("Bad ligature substitution table format %d", format); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + const uint16_t num_glyphs = maxp->num_glyphs; const unsigned ligature_set_end = static_cast<unsigned>(6) + lig_set_count * 2; if (ligature_set_end > std::numeric_limits<uint16_t>::max()) { @@ -398,8 +420,18 @@ bool ParseLigatureSubstitution(const ots::Font *font, // Contextual Substitution Subtable bool ParseContextSubstitution(const ots::Font *font, const uint8_t *data, const size_t length) { - return ots::ParseContextSubtable(font, data, length, font->maxp->num_glyphs, - font->gsub->num_lookups); + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + ots::OpenTypeGSUB *gsub = static_cast<ots::OpenTypeGSUB*>( + font->GetTypedTable(OTS_TAG_GSUB)); + if (!gsub) { + return OTS_FAILURE_MSG("Internal error!"); + } + return ots::ParseContextSubtable(font, data, length, maxp->num_glyphs, + gsub->num_lookups); } // Lookup Type 6: @@ -407,9 +439,19 @@ bool ParseContextSubstitution(const ots::Font *font, bool ParseChainingContextSubstitution(const ots::Font *font, const uint8_t *data, const size_t length) { + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + ots::OpenTypeGSUB *gsub = static_cast<ots::OpenTypeGSUB*>( + font->GetTypedTable(OTS_TAG_GSUB)); + if (!gsub) { + return OTS_FAILURE_MSG("Internal error!"); + } return ots::ParseChainingContextSubtable(font, data, length, - font->maxp->num_glyphs, - font->gsub->num_lookups); + maxp->num_glyphs, + gsub->num_lookups); } // Lookup Type 7: @@ -434,7 +476,12 @@ bool ParseReverseChainingContextSingleSubstitution( return OTS_FAILURE_MSG("Failed to read reverse chaining header"); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + ots::OpenTypeMAXP *maxp = static_cast<ots::OpenTypeMAXP*>( + font->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return OTS_FAILURE_MSG("Required maxp table missing"); + } + const uint16_t num_glyphs = maxp->num_glyphs; uint16_t backtrack_glyph_count = 0; if (!subtable.ReadU16(&backtrack_glyph_count)) { @@ -530,143 +577,97 @@ bool ParseReverseChainingContextSingleSubstitution( namespace ots { -// As far as I checked, following fonts contain invalid values in GSUB table. -// OTS will drop their GSUB table. -// -// # too large substitute (value is 0xFFFF) -// kaiu.ttf -// mingliub2.ttf -// mingliub1.ttf -// mingliub0.ttf -// GraublauWeb.otf -// GraublauWebBold.otf -// -// # too large alternate (value is 0xFFFF) -// ManchuFont.ttf -// -// # bad offset to lang sys table (NULL offset) -// DejaVuMonoSansBold.ttf -// DejaVuMonoSansBoldOblique.ttf -// DejaVuMonoSansOblique.ttf -// DejaVuSansMono-BoldOblique.ttf -// DejaVuSansMono-Oblique.ttf -// DejaVuSansMono-Bold.ttf -// -// # bad start coverage index -// GenBasBI.ttf -// GenBasI.ttf -// AndBasR.ttf -// GenBkBasI.ttf -// CharisSILR.ttf -// CharisSILBI.ttf -// CharisSILI.ttf -// CharisSILB.ttf -// DoulosSILR.ttf -// CharisSILBI.ttf -// GenBkBasB.ttf -// GenBkBasR.ttf -// GenBkBasBI.ttf -// GenBasB.ttf -// GenBasR.ttf -// -// # glyph range is overlapping -// KacstTitleL.ttf -// KacstDecorative.ttf -// KacstTitle.ttf -// KacstArt.ttf -// KacstPoster.ttf -// KacstQurn.ttf -// KacstDigital.ttf -// KacstBook.ttf -// KacstFarsi.ttf - -bool ots_gsub_parse(Font *font, const uint8_t *data, size_t length) { - // Parsing gsub table requires |font->maxp->num_glyphs| - if (!font->maxp) { - return OTS_FAILURE_MSG("Missing maxp table in font, needed by GSUB"); - } - +bool OpenTypeGSUB::Parse(const uint8_t *data, size_t length) { + // Parsing gsub table requires |maxp->num_glyphs| + Font *font = GetFont(); Buffer table(data, length); - OpenTypeGSUB *gsub = new OpenTypeGSUB; - font->gsub = gsub; - - uint32_t version = 0; + uint16_t version_major = 0, version_minor = 0; uint16_t offset_script_list = 0; uint16_t offset_feature_list = 0; uint16_t offset_lookup_list = 0; - if (!table.ReadU32(&version) || + uint32_t offset_feature_variations = 0; + if (!table.ReadU16(&version_major) || + !table.ReadU16(&version_minor) || !table.ReadU16(&offset_script_list) || !table.ReadU16(&offset_feature_list) || !table.ReadU16(&offset_lookup_list)) { - return OTS_FAILURE_MSG("Incomplete table"); + return Error("Incomplete table"); } - if (version != 0x00010000) { - return OTS_FAILURE_MSG("Bad version"); + if (version_major != 1 || version_minor > 1) { + return Error("Bad version"); } + if (version_minor > 0) { + if (!table.ReadU32(&offset_feature_variations)) { + return Error("Incomplete table"); + } + } + + const size_t header_size = + (version_minor == 0) ? kGsubHeaderSize_1_0 : kGsubHeaderSize_1_1; + if (offset_lookup_list) { - if (offset_lookup_list < kGsubHeaderSize || offset_lookup_list >= length) { - return OTS_FAILURE_MSG("Bad lookup list offset in table header"); + if (offset_lookup_list < header_size || offset_lookup_list >= length) { + return Error("Bad lookup list offset in table header"); } if (!ParseLookupListTable(font, data + offset_lookup_list, length - offset_lookup_list, &kGsubLookupSubtableParser, - &gsub->num_lookups)) { - return OTS_FAILURE_MSG("Failed to parse lookup list table"); + &this->num_lookups)) { + return Error("Failed to parse lookup list table"); } } uint16_t num_features = 0; if (offset_feature_list) { - if (offset_feature_list < kGsubHeaderSize || offset_feature_list >= length) { - return OTS_FAILURE_MSG("Bad feature list offset in table header"); + if (offset_feature_list < header_size || offset_feature_list >= length) { + return Error("Bad feature list offset in table header"); } if (!ParseFeatureListTable(font, data + offset_feature_list, - length - offset_feature_list, gsub->num_lookups, + length - offset_feature_list, this->num_lookups, &num_features)) { - return OTS_FAILURE_MSG("Failed to parse feature list table"); + return Error("Failed to parse feature list table"); } } if (offset_script_list) { - if (offset_script_list < kGsubHeaderSize || offset_script_list >= length) { - return OTS_FAILURE_MSG("Bad script list offset in table header"); + if (offset_script_list < header_size || offset_script_list >= length) { + return Error("Bad script list offset in table header"); } if (!ParseScriptListTable(font, data + offset_script_list, length - offset_script_list, num_features)) { - return OTS_FAILURE_MSG("Failed to parse script list table"); + return Error("Failed to parse script list table"); } } - gsub->data = data; - gsub->length = length; - return true; -} - -bool ots_gsub_should_serialise(Font *font) { - return font->gsub != NULL && font->gsub->data != NULL; -} + if (offset_feature_variations) { + if (offset_feature_variations < header_size || offset_feature_variations >= length) { + return Error("Bad feature variations offset in table header"); + } -bool ots_gsub_serialise(OTSStream *out, Font *font) { - if (!out->Write(font->gsub->data, font->gsub->length)) { - return OTS_FAILURE_MSG("Failed to write GSUB table"); + if (!ParseFeatureVariationsTable(font, data + offset_feature_variations, + length - offset_feature_variations, + this->num_lookups)) { + return Error("Failed to parse feature variations table"); + } } + this->m_data = data; + this->m_length = length; return true; } -void ots_gsub_reuse(Font *font, Font *other) { - font->gsub = other->gsub; - font->gsub_reused = true; -} +bool OpenTypeGSUB::Serialize(OTSStream *out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write GSUB table"); + } -void ots_gsub_free(Font *font) { - delete font->gsub; + return true; } } // namespace ots diff --git a/gfx/ots/src/gsub.h b/gfx/ots/src/gsub.h index f6f8cd3b1..76c990465 100644 --- a/gfx/ots/src/gsub.h +++ b/gfx/ots/src/gsub.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,18 +9,24 @@ namespace ots { -struct OpenTypeGSUB { - OpenTypeGSUB() - : num_lookups(0), - data(NULL), - length(0) { +class OpenTypeGSUB : public Table { + public: + explicit OpenTypeGSUB(Font *font, uint32_t tag) + : Table(font, tag, tag), + num_lookups(0), + m_data(NULL), + m_length(0) { } + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + // Number of lookups in GPSUB table uint16_t num_lookups; - const uint8_t *data; - size_t length; + //private: + const uint8_t *m_data; + size_t m_length; }; } // namespace ots diff --git a/gfx/ots/src/gvar.cc b/gfx/ots/src/gvar.cc new file mode 100644 index 000000000..324a0fc83 --- /dev/null +++ b/gfx/ots/src/gvar.cc @@ -0,0 +1,158 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gvar.h" + +#include "fvar.h" +#include "maxp.h" +#include "variations.h" + +#define TABLE_NAME "gvar" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeGVAR +// ----------------------------------------------------------------------------- + +static bool ParseSharedTuples(const Font* font, const uint8_t* data, size_t length, + size_t sharedTupleCount, size_t axisCount) { + Buffer subtable(data, length); + for (unsigned i = 0; i < sharedTupleCount; i++) { + for (unsigned j = 0; j < axisCount; j++) { + int16_t coordinate; + if (!subtable.ReadS16(&coordinate)) { + return OTS_FAILURE_MSG("Failed to read shared tuple coordinate"); + } + } + } + return true; +} + +static bool ParseGlyphVariationDataArray(const Font* font, const uint8_t* data, size_t length, + uint16_t flags, size_t glyphCount, size_t axisCount, + size_t sharedTupleCount, + const uint8_t* glyphVariationData, + size_t glyphVariationDataLength) { + Buffer subtable(data, length); + + bool glyphVariationDataOffsetsAreLong = (flags & 0x0001u); + uint32_t prevOffset = 0; + for (size_t i = 0; i < glyphCount + 1; i++) { + uint32_t offset; + if (glyphVariationDataOffsetsAreLong) { + if (!subtable.ReadU32(&offset)) { + return OTS_FAILURE_MSG("Failed to read GlyphVariationData offset"); + } + } else { + uint16_t halfOffset; + if (!subtable.ReadU16(&halfOffset)) { + return OTS_FAILURE_MSG("Failed to read GlyphVariationData offset"); + } + offset = halfOffset * 2; + } + + if (i > 0 && offset > prevOffset) { + if (prevOffset > glyphVariationDataLength) { + return OTS_FAILURE_MSG("Invalid GlyphVariationData offset"); + } + if (!ParseVariationData(font, glyphVariationData + prevOffset, + glyphVariationDataLength - prevOffset, + axisCount, sharedTupleCount)) { + return OTS_FAILURE_MSG("Failed to parse GlyphVariationData"); + } + } + prevOffset = offset; + } + + return true; +} + +bool OpenTypeGVAR::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + + uint16_t majorVersion; + uint16_t minorVersion; + uint16_t axisCount; + uint16_t sharedTupleCount; + uint32_t sharedTuplesOffset; + uint16_t glyphCount; + uint16_t flags; + uint32_t glyphVariationDataArrayOffset; + + if (!table.ReadU16(&majorVersion) || + !table.ReadU16(&minorVersion) || + !table.ReadU16(&axisCount) || + !table.ReadU16(&sharedTupleCount) || + !table.ReadU32(&sharedTuplesOffset) || + !table.ReadU16(&glyphCount) || + !table.ReadU16(&flags) || + !table.ReadU32(&glyphVariationDataArrayOffset)) { + return DropVariations("Failed to read table header"); + } + if (majorVersion != 1) { + return DropVariations("Unknown table version"); + } + + // check axisCount == fvar->axisCount + OpenTypeFVAR* fvar = static_cast<OpenTypeFVAR*>( + GetFont()->GetTypedTable(OTS_TAG_FVAR)); + if (!fvar) { + return DropVariations("Required fvar table is missing"); + } + if (axisCount != fvar->AxisCount()) { + return DropVariations("Axis count mismatch"); + } + + // check glyphCount == maxp->num_glyphs + OpenTypeMAXP* maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return DropVariations("Required maxp table is missing"); + } + if (glyphCount != maxp->num_glyphs) { + return DropVariations("Glyph count mismatch"); + } + + if (sharedTupleCount > 0) { + if (sharedTuplesOffset < table.offset() || sharedTuplesOffset > length) { + return DropVariations("Invalid sharedTuplesOffset"); + } + if (!ParseSharedTuples(GetFont(), + data + sharedTuplesOffset, length - sharedTuplesOffset, + sharedTupleCount, axisCount)) { + return DropVariations("Failed to parse shared tuples"); + } + } + + if (glyphVariationDataArrayOffset) { + if (glyphVariationDataArrayOffset > length) { + return DropVariations("Invalid glyphVariationDataArrayOffset"); + } + if (!ParseGlyphVariationDataArray(GetFont(), + data + table.offset(), length - table.offset(), + flags, glyphCount, axisCount, sharedTupleCount, + data + glyphVariationDataArrayOffset, + length - glyphVariationDataArrayOffset)) { + return DropVariations("Failed to read glyph variation data array"); + } + } + + this->m_data = data; + this->m_length = length; + + return true; +} + +bool OpenTypeGVAR::Serialize(OTSStream* out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write gvar table"); + } + + return true; +} + +} // namespace ots + +#undef TABLE_NAME diff --git a/gfx/ots/src/gvar.h b/gfx/ots/src/gvar.h new file mode 100644 index 000000000..8a90c57a3 --- /dev/null +++ b/gfx/ots/src/gvar.h @@ -0,0 +1,31 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_GVAR_H_ +#define OTS_GVAR_H_ + +#include "ots.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeGVAR Interface +// ----------------------------------------------------------------------------- + +class OpenTypeGVAR : public Table { + public: + explicit OpenTypeGVAR(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + const uint8_t *m_data; + size_t m_length; +}; + +} // namespace ots + +#endif // OTS_GVAR_H_ diff --git a/gfx/ots/src/hdmx.cc b/gfx/ots/src/hdmx.cc index f57b71f59..42ac9de8d 100644 --- a/gfx/ots/src/hdmx.cc +++ b/gfx/ots/src/hdmx.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,139 +9,112 @@ // hdmx - Horizontal Device Metrics // http://www.microsoft.com/typography/otspec/hdmx.htm -#define TABLE_NAME "hdmx" - -#define DROP_THIS_TABLE(...) \ - do { \ - OTS_FAILURE_MSG_(font->file, TABLE_NAME ": " __VA_ARGS__); \ - OTS_FAILURE_MSG("Table discarded"); \ - delete font->hdmx; \ - font->hdmx = 0; \ - } while (0) - namespace ots { -bool ots_hdmx_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeHDMX::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - font->hdmx = new OpenTypeHDMX; - OpenTypeHDMX * const hdmx = font->hdmx; - if (!font->head || !font->maxp) { - return OTS_FAILURE_MSG("Missing maxp or head tables in font, needed by hdmx"); + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + OpenTypeHEAD *head = static_cast<OpenTypeHEAD*>( + GetFont()->GetTypedTable(OTS_TAG_HEAD)); + if (!head || !maxp) { + return Error("Missing maxp or head tables in font, needed by hdmx"); } - if ((font->head->flags & 0x14) == 0) { - // http://www.microsoft.com/typography/otspec/recom.htm - DROP_THIS_TABLE("the table should not be present when bit 2 and 4 of the " - "head->flags are not set"); - return true; + if ((head->flags & 0x14) == 0) { + // http://www.microsoft.com/typography/otspec/recom.htm#hdmx + return Drop("the table should not be present when bit 2 and 4 of the " + "head->flags are not set"); } int16_t num_recs; - if (!table.ReadU16(&hdmx->version) || + if (!table.ReadU16(&this->version) || !table.ReadS16(&num_recs) || - !table.ReadS32(&hdmx->size_device_record)) { - return OTS_FAILURE_MSG("Failed to read hdmx header"); + !table.ReadS32(&this->size_device_record)) { + return Error("Failed to read table header"); } - if (hdmx->version != 0) { - DROP_THIS_TABLE("bad version: %u", hdmx->version); - return true; + if (this->version != 0) { + return Drop("Unsupported version: %u", this->version); } if (num_recs <= 0) { - DROP_THIS_TABLE("bad num_recs: %d", num_recs); - return true; + return Drop("Bad numRecords: %d", num_recs); } - const int32_t actual_size_device_record = font->maxp->num_glyphs + 2; - if (hdmx->size_device_record < actual_size_device_record) { - DROP_THIS_TABLE("bad hdmx->size_device_record: %d", hdmx->size_device_record); - return true; + const int32_t actual_size_device_record = maxp->num_glyphs + 2; + if (this->size_device_record < actual_size_device_record) { + return Drop("Bad sizeDeviceRecord: %d", this->size_device_record); } - hdmx->pad_len = hdmx->size_device_record - actual_size_device_record; - if (hdmx->pad_len > 3) { - return OTS_FAILURE_MSG("Bad padding %d", hdmx->pad_len); + this->pad_len = this->size_device_record - actual_size_device_record; + if (this->pad_len > 3) { + return Error("Bad DeviceRecord padding %d", this->pad_len); } uint8_t last_pixel_size = 0; - hdmx->records.reserve(num_recs); + this->records.reserve(num_recs); for (int i = 0; i < num_recs; ++i) { OpenTypeHDMXDeviceRecord rec; if (!table.ReadU8(&rec.pixel_size) || !table.ReadU8(&rec.max_width)) { - return OTS_FAILURE_MSG("Failed to read hdmx record %d", i); + return Error("Failed to read DeviceRecord %d", i); } if ((i != 0) && (rec.pixel_size <= last_pixel_size)) { - DROP_THIS_TABLE("records are not sorted"); - return true; + return Drop("DeviceRecord's are not sorted"); } last_pixel_size = rec.pixel_size; - rec.widths.reserve(font->maxp->num_glyphs); - for (unsigned j = 0; j < font->maxp->num_glyphs; ++j) { + rec.widths.reserve(maxp->num_glyphs); + for (unsigned j = 0; j < maxp->num_glyphs; ++j) { uint8_t width; if (!table.ReadU8(&width)) { - return OTS_FAILURE_MSG("Failed to read glyph width %d in record %d", j, i); + return Error("Failed to read glyph width %d in DeviceRecord %d", j, i); } rec.widths.push_back(width); } - if ((hdmx->pad_len > 0) && - !table.Skip(hdmx->pad_len)) { - return OTS_FAILURE_MSG("Failed to skip padding %d", hdmx->pad_len); + if ((this->pad_len > 0) && + !table.Skip(this->pad_len)) { + return Error("DeviceRecord %d should be padded by %d", i, this->pad_len); } - hdmx->records.push_back(rec); + this->records.push_back(rec); } return true; } -bool ots_hdmx_should_serialise(Font *font) { - if (!font->hdmx) return false; - if (!font->glyf) return false; // this table is not for CFF fonts. - return true; +bool OpenTypeHDMX::ShouldSerialize() { + return Table::ShouldSerialize() && + // this table is not for CFF fonts. + GetFont()->GetTable(OTS_TAG_GLYF) != NULL; } -bool ots_hdmx_serialise(OTSStream *out, Font *font) { - OpenTypeHDMX * const hdmx = font->hdmx; - - const int16_t num_recs = static_cast<int16_t>(hdmx->records.size()); - if (hdmx->records.size() > +bool OpenTypeHDMX::Serialize(OTSStream *out) { + const int16_t num_recs = static_cast<int16_t>(this->records.size()); + if (this->records.size() > static_cast<size_t>(std::numeric_limits<int16_t>::max()) || - !out->WriteU16(hdmx->version) || + !out->WriteU16(this->version) || !out->WriteS16(num_recs) || - !out->WriteS32(hdmx->size_device_record)) { - return OTS_FAILURE_MSG("Failed to write hdmx header"); + !out->WriteS32(this->size_device_record)) { + return Error("Failed to write table header"); } for (int16_t i = 0; i < num_recs; ++i) { - const OpenTypeHDMXDeviceRecord& rec = hdmx->records[i]; + const OpenTypeHDMXDeviceRecord& rec = this->records[i]; if (!out->Write(&rec.pixel_size, 1) || !out->Write(&rec.max_width, 1) || !out->Write(&rec.widths[0], rec.widths.size())) { - return OTS_FAILURE_MSG("Failed to write hdmx record %d", i); + return Error("Failed to write DeviceRecord %d", i); } - if ((hdmx->pad_len > 0) && - !out->Write((const uint8_t *)"\x00\x00\x00", hdmx->pad_len)) { - return OTS_FAILURE_MSG("Failed to write hdmx padding of length %d", hdmx->pad_len); + if ((this->pad_len > 0) && + !out->Write((const uint8_t *)"\x00\x00\x00", this->pad_len)) { + return Error("Failed to write padding of length %d", this->pad_len); } } return true; } -void ots_hdmx_reuse(Font *font, Font *other) { - font->hdmx = other->hdmx; - font->hdmx_reused = true; -} - -void ots_hdmx_free(Font *font) { - delete font->hdmx; -} - } // namespace ots - -#undef TABLE_NAME -#undef DROP_THIS_TABLE diff --git a/gfx/ots/src/hdmx.h b/gfx/ots/src/hdmx.h index 9ec212437..5d323dd7e 100644 --- a/gfx/ots/src/hdmx.h +++ b/gfx/ots/src/hdmx.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -17,7 +17,16 @@ struct OpenTypeHDMXDeviceRecord { std::vector<uint8_t> widths; }; -struct OpenTypeHDMX { +class OpenTypeHDMX : public Table { + public: + explicit OpenTypeHDMX(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: uint16_t version; int32_t size_device_record; int32_t pad_len; diff --git a/gfx/ots/src/head.cc b/gfx/ots/src/head.cc index 229ea71f9..6088504c8 100644 --- a/gfx/ots/src/head.cc +++ b/gfx/ots/src/head.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,151 +9,124 @@ // head - Font Header // http://www.microsoft.com/typography/otspec/head.htm -#define TABLE_NAME "head" - namespace ots { -bool ots_head_parse(Font* font, const uint8_t *data, size_t length) { +bool OpenTypeHEAD::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeHEAD *head = new OpenTypeHEAD; - font->head = head; uint32_t version = 0; if (!table.ReadU32(&version) || - !table.ReadU32(&head->revision)) { - return OTS_FAILURE_MSG("Failed to read head header"); + !table.ReadU32(&this->revision)) { + return Error("Failed to read table header"); } if (version >> 16 != 1) { - return OTS_FAILURE_MSG("Bad head table version of %d", version); + return Error("Unsupported majorVersion: %d", version >> 16); } // Skip the checksum adjustment if (!table.Skip(4)) { - return OTS_FAILURE_MSG("Failed to read checksum"); + return Error("Failed to read checksum"); } uint32_t magic; if (!table.ReadU32(&magic) || magic != 0x5F0F3CF5) { - return OTS_FAILURE_MSG("Failed to read font magic number"); + return Error("Failed to read or incorrect magicNumber"); } - if (!table.ReadU16(&head->flags)) { - return OTS_FAILURE_MSG("Failed to read head flags"); + if (!table.ReadU16(&this->flags)) { + return Error("Failed to read flags"); } // We allow bits 0..4, 11..13 - head->flags &= 0x381f; - - if (!table.ReadU16(&head->ppem)) { - return OTS_FAILURE_MSG("Failed to read pixels per em"); - } + this->flags &= 0x381f; - // ppem must be in range - if (head->ppem < 16 || - head->ppem > 16384) { - return OTS_FAILURE_MSG("Bad ppm of %d", head->ppem); + if (!table.ReadU16(&this->upem)) { + return Error("Failed to read unitsPerEm"); } - // ppem must be a power of two -#if 0 - // We don't call ots_failure() for now since lots of TrueType fonts are - // not following this rule. Putting OTS_WARNING here is too noisy. - if ((head->ppem - 1) & head->ppem) { - return OTS_FAILURE_MSG("ppm not a power of two: %d", head->ppem); + // upem must be in range + if (this->upem < 16 || + this->upem > 16384) { + return Error("unitsPerEm on in the range [16, 16384]: %d", this->upem); } -#endif - if (!table.ReadR64(&head->created) || - !table.ReadR64(&head->modified)) { - return OTS_FAILURE_MSG("Can't read font dates"); + if (!table.ReadR64(&this->created) || + !table.ReadR64(&this->modified)) { + return Error("Can't read font dates"); } - if (!table.ReadS16(&head->xmin) || - !table.ReadS16(&head->ymin) || - !table.ReadS16(&head->xmax) || - !table.ReadS16(&head->ymax)) { - return OTS_FAILURE_MSG("Failed to read font bounding box"); + if (!table.ReadS16(&this->xmin) || + !table.ReadS16(&this->ymin) || + !table.ReadS16(&this->xmax) || + !table.ReadS16(&this->ymax)) { + return Error("Failed to read font bounding box"); } - if (head->xmin > head->xmax) { - return OTS_FAILURE_MSG("Bad x dimension in the font bounding box (%d, %d)", head->xmin, head->xmax); + if (this->xmin > this->xmax) { + return Error("Bad x dimension in the font bounding box (%d, %d)", + this->xmin, this->xmax); } - if (head->ymin > head->ymax) { - return OTS_FAILURE_MSG("Bad y dimension in the font bounding box (%d, %d)", head->ymin, head->ymax); + if (this->ymin > this->ymax) { + return Error("Bad y dimension in the font bounding box (%d, %d)", + this->ymin, this->ymax); } - if (!table.ReadU16(&head->mac_style)) { - return OTS_FAILURE_MSG("Failed to read font style"); + if (!table.ReadU16(&this->mac_style)) { + return Error("Failed to read macStyle"); } // We allow bits 0..6 - head->mac_style &= 0x7f; + this->mac_style &= 0x7f; - if (!table.ReadU16(&head->min_ppem)) { - return OTS_FAILURE_MSG("Failed to read font minimum ppm"); + if (!table.ReadU16(&this->min_ppem)) { + return Error("Failed to read lowestRecPPEM"); } // We don't care about the font direction hint if (!table.Skip(2)) { - return OTS_FAILURE_MSG("Failed to skip font direction hint"); + return Error("Failed to read fontDirectionHint"); } - if (!table.ReadS16(&head->index_to_loc_format)) { - return OTS_FAILURE_MSG("Failed to read index to loc format"); + if (!table.ReadS16(&this->index_to_loc_format)) { + return Error("Failed to read indexToLocFormat"); } - if (head->index_to_loc_format < 0 || - head->index_to_loc_format > 1) { - return OTS_FAILURE_MSG("Bad index to loc format %d", head->index_to_loc_format); + if (this->index_to_loc_format < 0 || + this->index_to_loc_format > 1) { + return Error("Bad indexToLocFormat %d", this->index_to_loc_format); } int16_t glyph_data_format; if (!table.ReadS16(&glyph_data_format) || glyph_data_format) { - return OTS_FAILURE_MSG("Failed to read glyph data format"); + return Error("Failed to read or bad glyphDataFormat"); } return true; } -bool ots_head_should_serialise(Font *font) { - return font->head != NULL; -} - -bool ots_head_serialise(OTSStream *out, Font *font) { - const OpenTypeHEAD *head = font->head; +bool OpenTypeHEAD::Serialize(OTSStream *out) { if (!out->WriteU32(0x00010000) || - !out->WriteU32(head->revision) || + !out->WriteU32(this->revision) || !out->WriteU32(0) || // check sum not filled in yet !out->WriteU32(0x5F0F3CF5) || - !out->WriteU16(head->flags) || - !out->WriteU16(head->ppem) || - !out->WriteR64(head->created) || - !out->WriteR64(head->modified) || - !out->WriteS16(head->xmin) || - !out->WriteS16(head->ymin) || - !out->WriteS16(head->xmax) || - !out->WriteS16(head->ymax) || - !out->WriteU16(head->mac_style) || - !out->WriteU16(head->min_ppem) || + !out->WriteU16(this->flags) || + !out->WriteU16(this->upem) || + !out->WriteR64(this->created) || + !out->WriteR64(this->modified) || + !out->WriteS16(this->xmin) || + !out->WriteS16(this->ymin) || + !out->WriteS16(this->xmax) || + !out->WriteS16(this->ymax) || + !out->WriteU16(this->mac_style) || + !out->WriteU16(this->min_ppem) || !out->WriteS16(2) || - !out->WriteS16(head->index_to_loc_format) || + !out->WriteS16(this->index_to_loc_format) || !out->WriteS16(0)) { - return OTS_FAILURE_MSG("Failed to write head table"); + return Error("Failed to write table"); } return true; } -void ots_head_reuse(Font *font, Font *other) { - font->head = other->head; - font->head_reused = true; -} - -void ots_head_free(Font *font) { - delete font->head; -} - } // namespace - -#undef TABLE_NAME diff --git a/gfx/ots/src/head.h b/gfx/ots/src/head.h index 5967c4b89..a040fcf24 100644 --- a/gfx/ots/src/head.h +++ b/gfx/ots/src/head.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,10 +9,17 @@ namespace ots { -struct OpenTypeHEAD { +class OpenTypeHEAD : public Table { + public: + explicit OpenTypeHEAD(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + uint32_t revision; uint16_t flags; - uint16_t ppem; + uint16_t upem; uint64_t created; uint64_t modified; diff --git a/gfx/ots/src/hhea.cc b/gfx/ots/src/hhea.cc index 624287280..d024aaac4 100644 --- a/gfx/ots/src/hhea.cc +++ b/gfx/ots/src/hhea.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,49 +10,23 @@ // hhea - Horizontal Header // http://www.microsoft.com/typography/otspec/hhea.htm -#define TABLE_NAME "hhea" - namespace ots { -bool ots_hhea_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeHHEA::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeHHEA *hhea = new OpenTypeHHEA; - font->hhea = hhea; - if (!table.ReadU32(&hhea->header.version)) { - return OTS_FAILURE_MSG("Failed to read hhea version"); - } - if (hhea->header.version >> 16 != 1) { - return OTS_FAILURE_MSG("Bad hhea version of %d", hhea->header.version); + if (!table.ReadU32(&this->version)) { + return Error("Failed to read table version"); } - - if (!ParseMetricsHeader(font, &table, &hhea->header)) { - return OTS_FAILURE_MSG("Failed to parse horizontal metrics"); + if (this->version >> 16 != 1) { + return Error("Unsupported majorVersion: %d", this->version >> 16); } - return true; + return OpenTypeMetricsHeader::Parse(data, length); } -bool ots_hhea_should_serialise(Font *font) { - return font->hhea != NULL; -} - -bool ots_hhea_serialise(OTSStream *out, Font *font) { - if (!SerialiseMetricsHeader(font, out, &font->hhea->header)) { - return OTS_FAILURE_MSG("Failed to serialise horizontal metrics"); - } - return true; -} - -void ots_hhea_reuse(Font *font, Font *other) { - font->hhea = other->hhea; - font->hhea_reused = true; -} - -void ots_hhea_free(Font *font) { - delete font->hhea; +bool OpenTypeHHEA::Serialize(OTSStream *out) { + return OpenTypeMetricsHeader::Serialize(out); } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/hhea.h b/gfx/ots/src/hhea.h index bdea9aa0d..0405bd9d1 100644 --- a/gfx/ots/src/hhea.h +++ b/gfx/ots/src/hhea.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,8 +10,13 @@ namespace ots { -struct OpenTypeHHEA { - OpenTypeMetricsHeader header; +class OpenTypeHHEA : public OpenTypeMetricsHeader { + public: + explicit OpenTypeHHEA(Font *font, uint32_t tag) + : OpenTypeMetricsHeader(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); }; } // namespace ots diff --git a/gfx/ots/src/hmtx.cc b/gfx/ots/src/hmtx.cc index 667d1fe6f..2ef7771fd 100644 --- a/gfx/ots/src/hmtx.cc +++ b/gfx/ots/src/hmtx.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,47 +10,14 @@ // hmtx - Horizontal Metrics // http://www.microsoft.com/typography/otspec/hmtx.htm -#define TABLE_NAME "hmtx" - namespace ots { -bool ots_hmtx_parse(Font *font, const uint8_t *data, size_t length) { - Buffer table(data, length); - OpenTypeHMTX *hmtx = new OpenTypeHMTX; - font->hmtx = hmtx; - - if (!font->hhea || !font->maxp) { - return OTS_FAILURE_MSG("Missing hhea or maxp tables in font, needed by hmtx"); - } - - if (!ParseMetricsTable(font, &table, font->maxp->num_glyphs, - &font->hhea->header, &hmtx->metrics)) { - return OTS_FAILURE_MSG("Failed to parse hmtx metrics"); - } - - return true; -} - -bool ots_hmtx_should_serialise(Font *font) { - return font->hmtx != NULL; +bool OpenTypeHMTX::Parse(const uint8_t *data, size_t length) { + return OpenTypeMetricsTable::Parse(data, length); } -bool ots_hmtx_serialise(OTSStream *out, Font *font) { - if (!SerialiseMetricsTable(font, out, &font->hmtx->metrics)) { - return OTS_FAILURE_MSG("Failed to serialise htmx metrics"); - } - return true; -} - -void ots_hmtx_reuse(Font *font, Font *other) { - font->hmtx = other->hmtx; - font->hmtx_reused = true; -} - -void ots_hmtx_free(Font *font) { - delete font->hmtx; +bool OpenTypeHMTX::Serialize(OTSStream *out) { + return OpenTypeMetricsTable::Serialize(out); } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/hmtx.h b/gfx/ots/src/hmtx.h index 435949c5e..dbea9c80c 100644 --- a/gfx/ots/src/hmtx.h +++ b/gfx/ots/src/hmtx.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -6,12 +6,18 @@ #define OTS_HMTX_H_ #include "metrics.h" +#include "hhea.h" #include "ots.h" namespace ots { -struct OpenTypeHMTX { - OpenTypeMetricsTable metrics; +class OpenTypeHMTX : public OpenTypeMetricsTable { + public: + explicit OpenTypeHMTX(Font *font, uint32_t tag) + : OpenTypeMetricsTable(font, tag, tag, OTS_TAG_HHEA) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); }; } // namespace ots diff --git a/gfx/ots/src/hvar.cc b/gfx/ots/src/hvar.cc new file mode 100644 index 000000000..2bcea8680 --- /dev/null +++ b/gfx/ots/src/hvar.cc @@ -0,0 +1,85 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "hvar.h" + +#include "variations.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeHVAR +// ----------------------------------------------------------------------------- + +bool OpenTypeHVAR::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + + uint16_t majorVersion; + uint16_t minorVersion; + uint32_t itemVariationStoreOffset; + uint32_t advanceWidthMappingOffset; + uint32_t lsbMappingOffset; + uint32_t rsbMappingOffset; + + if (!table.ReadU16(&majorVersion) || + !table.ReadU16(&minorVersion) || + !table.ReadU32(&itemVariationStoreOffset) || + !table.ReadU32(&advanceWidthMappingOffset) || + !table.ReadU32(&lsbMappingOffset) || + !table.ReadU32(&rsbMappingOffset)) { + return DropVariations("Failed to read table header"); + } + + if (majorVersion != 1) { + return DropVariations("Unknown table version"); + } + + if (itemVariationStoreOffset > length || + advanceWidthMappingOffset > length || + lsbMappingOffset > length || + rsbMappingOffset > length) { + return DropVariations("Invalid subtable offset"); + } + + if (!ParseItemVariationStore(GetFont(), data + itemVariationStoreOffset, + length - itemVariationStoreOffset)) { + return DropVariations("Failed to parse item variation store"); + } + + if (advanceWidthMappingOffset) { + if (!ParseDeltaSetIndexMap(GetFont(), data + advanceWidthMappingOffset, + length - advanceWidthMappingOffset)) { + return DropVariations("Failed to parse advance width mappings"); + } + } + + if (lsbMappingOffset) { + if (!ParseDeltaSetIndexMap(GetFont(), data + lsbMappingOffset, + length - lsbMappingOffset)) { + return DropVariations("Failed to parse LSB mappings"); + } + } + + if (rsbMappingOffset) { + if (!ParseDeltaSetIndexMap(GetFont(), data + rsbMappingOffset, + length - rsbMappingOffset)) { + return DropVariations("Failed to parse RSB mappings"); + } + } + + this->m_data = data; + this->m_length = length; + + return true; +} + +bool OpenTypeHVAR::Serialize(OTSStream* out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write HVAR table"); + } + + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/hvar.h b/gfx/ots/src/hvar.h new file mode 100644 index 000000000..5bfd2e4ea --- /dev/null +++ b/gfx/ots/src/hvar.h @@ -0,0 +1,31 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_HVAR_H_ +#define OTS_HVAR_H_ + +#include "ots.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeHVAR Interface +// ----------------------------------------------------------------------------- + +class OpenTypeHVAR : public Table { + public: + explicit OpenTypeHVAR(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + const uint8_t *m_data; + size_t m_length; +}; + +} // namespace ots + +#endif // OTS_HVAR_H_ diff --git a/gfx/ots/src/kern.cc b/gfx/ots/src/kern.cc index d4ae8fcc4..ec41dfb9c 100644 --- a/gfx/ots/src/kern.cc +++ b/gfx/ots/src/kern.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,75 +7,61 @@ // kern - Kerning // http://www.microsoft.com/typography/otspec/kern.htm -#define TABLE_NAME "kern" - -#define DROP_THIS_TABLE(msg_) \ - do { \ - OTS_FAILURE_MSG(msg_ ", table discarded"); \ - delete font->kern; \ - font->kern = 0; \ - } while (0) - namespace ots { -bool ots_kern_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeKERN::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeKERN *kern = new OpenTypeKERN; - font->kern = kern; - uint16_t num_tables = 0; - if (!table.ReadU16(&kern->version) || + if (!table.ReadU16(&this->version) || !table.ReadU16(&num_tables)) { - return OTS_FAILURE_MSG("Failed to read kern header"); + return Error("Failed to read table header"); } - if (kern->version > 0) { - DROP_THIS_TABLE("bad table version"); - return true; + if (this->version > 0) { + return Drop("Unsupported table version: %d", this->version); } if (num_tables == 0) { - DROP_THIS_TABLE("num_tables is zero"); - return true; + return Drop("nTables is zero"); } - kern->subtables.reserve(num_tables); + this->subtables.reserve(num_tables); for (unsigned i = 0; i < num_tables; ++i) { OpenTypeKERNFormat0 subtable; uint16_t sub_length = 0; if (!table.ReadU16(&subtable.version) || !table.ReadU16(&sub_length)) { - return OTS_FAILURE_MSG("Failed to read kern subtable %d header", i); + return Error("Failed to read subtable %d header", i); } if (subtable.version > 0) { - OTS_WARNING("Bad subtable version: %d", subtable.version); + Warning("Ignoring subtable %d with unsupported version: %d", + i, subtable.version); continue; } const size_t current_offset = table.offset(); if (current_offset - 4 + sub_length > length) { - return OTS_FAILURE_MSG("Bad kern subtable %d offset %ld", i, current_offset); + return Error("Bad subtable %d offset %ld", i, current_offset); } if (!table.ReadU16(&subtable.coverage)) { - return OTS_FAILURE_MSG("Cailed to read kern subtable %d coverage", i); + return Error("Failed to read subtable %d coverage", i); } if (!(subtable.coverage & 0x1)) { - OTS_WARNING( + Warning( "We don't support vertical data as the renderer doesn't support it."); continue; } if (subtable.coverage & 0xF0) { - DROP_THIS_TABLE("Reserved fields should zero-filled"); - return true; + return Drop("Reserved fields should be zero"); } const uint32_t format = (subtable.coverage & 0xFF00) >> 8; if (format != 0) { - OTS_WARNING("Format %d is not supported.", format); + Warning("Ignoring subtable %d with unsupported format: %d", i, format); continue; } @@ -85,12 +71,11 @@ bool ots_kern_parse(Font *font, const uint8_t *data, size_t length) { !table.ReadU16(&subtable.search_range) || !table.ReadU16(&subtable.entry_selector) || !table.ReadU16(&subtable.range_shift)) { - return OTS_FAILURE_MSG("Failed to read kern subtable %d format 0 fields", i); + return Error("Failed to read subtable %d format 0 fields", i); } if (!num_pairs) { - DROP_THIS_TABLE("Zero length subtable is found"); - return true; + return Drop("Zero length subtable is found"); } // Sanity checks for search_range, entry_selector, and range_shift. See the @@ -98,8 +83,7 @@ bool ots_kern_parse(Font *font, const uint8_t *data, size_t length) { const size_t kFormat0PairSize = 6; // left, right, and value. 2 bytes each. if (num_pairs > (65536 / kFormat0PairSize)) { // Some fonts (e.g. calibri.ttf, pykes_peak_zero.ttf) have pairs >= 10923. - DROP_THIS_TABLE("Too large subtable"); - return true; + return Drop("Too large subtable"); } unsigned max_pow2 = 0; while (1u << (max_pow2 + 1) <= num_pairs) { @@ -107,16 +91,16 @@ bool ots_kern_parse(Font *font, const uint8_t *data, size_t length) { } const uint16_t expected_search_range = (1u << max_pow2) * kFormat0PairSize; if (subtable.search_range != expected_search_range) { - OTS_WARNING("bad search range"); + Warning("bad search range"); subtable.search_range = expected_search_range; } if (subtable.entry_selector != max_pow2) { - return OTS_FAILURE_MSG("Bad subtable %d entry selector %d", i, subtable.entry_selector); + return Error("Bad subtable %d entry selector %d", i, subtable.entry_selector); } const uint16_t expected_range_shift = kFormat0PairSize * num_pairs - subtable.search_range; if (subtable.range_shift != expected_range_shift) { - OTS_WARNING("bad range shift"); + Warning("bad range shift"); subtable.range_shift = expected_range_shift; } @@ -128,64 +112,55 @@ bool ots_kern_parse(Font *font, const uint8_t *data, size_t length) { if (!table.ReadU16(&kerning_pair.left) || !table.ReadU16(&kerning_pair.right) || !table.ReadS16(&kerning_pair.value)) { - return OTS_FAILURE_MSG("Failed to read subtable %d kerning pair %d", i, j); + return Error("Failed to read subtable %d kerning pair %d", i, j); } const uint32_t current_pair = (kerning_pair.left << 16) + kerning_pair.right; if (j != 0 && current_pair <= last_pair) { // Many free fonts don't follow this rule, so we don't call OTS_FAILURE // in order to support these fonts. - DROP_THIS_TABLE("Kerning pairs are not sorted"); - return true; + return Drop("Kerning pairs are not sorted"); } last_pair = current_pair; subtable.pairs.push_back(kerning_pair); } - kern->subtables.push_back(subtable); + this->subtables.push_back(subtable); } - if (!kern->subtables.size()) { - DROP_THIS_TABLE("All subtables are removed"); - return true; + if (!this->subtables.size()) { + return Drop("All subtables were removed"); } return true; } -bool ots_kern_should_serialise(Font *font) { - if (!font->glyf) return false; // this table is not for CFF fonts. - return font->kern != NULL; -} - -bool ots_kern_serialise(OTSStream *out, Font *font) { - const OpenTypeKERN *kern = font->kern; - - const uint16_t num_subtables = static_cast<uint16_t>(kern->subtables.size()); - if (num_subtables != kern->subtables.size() || - !out->WriteU16(kern->version) || +bool OpenTypeKERN::Serialize(OTSStream *out) { + const uint16_t num_subtables = static_cast<uint16_t>(this->subtables.size()); + if (num_subtables != this->subtables.size() || + !out->WriteU16(this->version) || !out->WriteU16(num_subtables)) { - return OTS_FAILURE_MSG("Can't write kern table header"); + return Error("Failed to write kern table header"); } for (uint16_t i = 0; i < num_subtables; ++i) { - const size_t length = 14 + (6 * kern->subtables[i].pairs.size()); + const size_t length = 14 + (6 * this->subtables[i].pairs.size()); if (length > std::numeric_limits<uint16_t>::max() || - !out->WriteU16(kern->subtables[i].version) || + !out->WriteU16(this->subtables[i].version) || !out->WriteU16(static_cast<uint16_t>(length)) || - !out->WriteU16(kern->subtables[i].coverage) || + !out->WriteU16(this->subtables[i].coverage) || !out->WriteU16( - static_cast<uint16_t>(kern->subtables[i].pairs.size())) || - !out->WriteU16(kern->subtables[i].search_range) || - !out->WriteU16(kern->subtables[i].entry_selector) || - !out->WriteU16(kern->subtables[i].range_shift)) { - return OTS_FAILURE_MSG("Failed to write kern subtable %d", i); - } - for (unsigned j = 0; j < kern->subtables[i].pairs.size(); ++j) { - if (!out->WriteU16(kern->subtables[i].pairs[j].left) || - !out->WriteU16(kern->subtables[i].pairs[j].right) || - !out->WriteS16(kern->subtables[i].pairs[j].value)) { - return OTS_FAILURE_MSG("Failed to write kern pair %d for subtable %d", j, i); + static_cast<uint16_t>(this->subtables[i].pairs.size())) || + !out->WriteU16(this->subtables[i].search_range) || + !out->WriteU16(this->subtables[i].entry_selector) || + !out->WriteU16(this->subtables[i].range_shift)) { + return Error("Failed to write kern subtable %d", i); + } + for (unsigned j = 0; j < this->subtables[i].pairs.size(); ++j) { + if (!out->WriteU16(this->subtables[i].pairs[j].left) || + !out->WriteU16(this->subtables[i].pairs[j].right) || + !out->WriteS16(this->subtables[i].pairs[j].value)) { + return Error("Failed to write kern pair %d for subtable %d", j, i); } } } @@ -193,16 +168,10 @@ bool ots_kern_serialise(OTSStream *out, Font *font) { return true; } -void ots_kern_reuse(Font *font, Font *other) { - font->kern = other->kern; - font->kern_reused = true; -} - -void ots_kern_free(Font *font) { - delete font->kern; +bool OpenTypeKERN::ShouldSerialize() { + return Table::ShouldSerialize() && + // this table is not for CFF fonts. + GetFont()->GetTable(OTS_TAG_GLYF) != NULL; } } // namespace ots - -#undef TABLE_NAME -#undef DROP_THIS_TABLE diff --git a/gfx/ots/src/kern.h b/gfx/ots/src/kern.h index 9350ef7f8..38f056851 100644 --- a/gfx/ots/src/kern.h +++ b/gfx/ots/src/kern.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -30,7 +30,16 @@ struct OpenTypeKERNFormat0 { // WebFonts unlikely use it. I've checked thousands of proprietary fonts and // free fonts, and found no font uses the format. -struct OpenTypeKERN { +class OpenTypeKERN : public Table { + public: + explicit OpenTypeKERN(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: uint16_t version; std::vector<OpenTypeKERNFormat0> subtables; }; diff --git a/gfx/ots/src/layout.cc b/gfx/ots/src/layout.cc index 1d87b53d4..8e99f573d 100644 --- a/gfx/ots/src/layout.cc +++ b/gfx/ots/src/layout.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,6 +7,7 @@ #include <limits> #include <vector> +#include "fvar.h" #include "gdef.h" // OpenType Layout Common Table Formats @@ -22,14 +23,11 @@ const uint32_t kScriptTableTagDflt = 0x44464c54; const uint16_t kNoRequiredFeatureIndexDefined = 0xFFFF; // The lookup flag bit which indicates existence of MarkFilteringSet. const uint16_t kUseMarkFilteringSetBit = 0x0010; -// The lookup flags which require GDEF table. -const uint16_t kGdefRequiredFlags = 0x0002 | 0x0004 | 0x0008; -// The mask for MarkAttachmentType. -const uint16_t kMarkAttachmentTypeMask = 0xFF00; // The maximum type number of format for device tables. const uint16_t kMaxDeltaFormatType = 3; -// The maximum number of class value. -const uint16_t kMaxClassDefValue = 0xFFFF; +// In variation fonts, Device Tables are replaced by VariationIndex tables, +// indicated by this flag in the deltaFormat field. +const uint16_t kVariationIndex = 0x8000; struct ScriptRecord { uint32_t tag; @@ -94,15 +92,12 @@ bool ParseScriptTable(const ots::Font *font, } // The spec requires a script table for 'DFLT' tag must contain non-NULL - // |offset_default_lang_sys| and |lang_sys_count| == 0 + // |offset_default_lang_sys|. // https://www.microsoft.com/typography/otspec/chapter2.htm if (tag == kScriptTableTagDflt) { if (offset_default_lang_sys == 0) { return OTS_FAILURE_MSG("DFLT script doesn't satisfy the spec. DefaultLangSys is NULL"); } - if (lang_sys_count != 0) { - return OTS_FAILURE_MSG("DFLT script doesn't satisfy the spec. LangSysCount is not zero: %d", lang_sys_count); - } } const unsigned lang_sys_record_end = @@ -197,27 +192,7 @@ bool ParseLookupTable(ots::Font *font, const uint8_t *data, return OTS_FAILURE_MSG("Bad lookup type %d", lookup_type); } - // Check lookup flags. - if ((lookup_flag & kGdefRequiredFlags) && - (!font->gdef || !font->gdef->has_glyph_class_def)) { - return OTS_FAILURE_MSG("Lookup flags require GDEF table, " - "but none was found: %d", lookup_flag); - } - if ((lookup_flag & kMarkAttachmentTypeMask) && - (!font->gdef || !font->gdef->has_mark_attachment_class_def)) { - return OTS_FAILURE_MSG("Lookup flags ask for mark attachment, " - "but there is no GDEF table or it has no " - "mark attachment classes: %d", lookup_flag); - } - bool use_mark_filtering_set = false; - if (lookup_flag & kUseMarkFilteringSetBit) { - if (!font->gdef || !font->gdef->has_mark_glyph_sets_def) { - return OTS_FAILURE_MSG("Lookup flags ask for mark filtering, " - "but there is no GDEF table or it has no " - "mark filtering sets: %d", lookup_flag); - } - use_mark_filtering_set = true; - } + bool use_mark_filtering_set = lookup_flag & kUseMarkFilteringSetBit; std::vector<uint16_t> subtables; subtables.reserve(subtable_count); @@ -248,8 +223,12 @@ bool ParseLookupTable(ots::Font *font, const uint8_t *data, if (!subtable.ReadU16(&mark_filtering_set)) { return OTS_FAILURE_MSG("Failed to read mark filtering set"); } - if (font->gdef->num_mark_glyph_sets == 0 || - mark_filtering_set >= font->gdef->num_mark_glyph_sets) { + + ots::OpenTypeGDEF *gdef = static_cast<ots::OpenTypeGDEF*>( + font->GetTypedTable(OTS_TAG_GDEF)); + + if (gdef && (gdef->num_mark_glyph_sets == 0 || + mark_filtering_set >= gdef->num_mark_glyph_sets)) { return OTS_FAILURE_MSG("Bad mark filtering set %d", mark_filtering_set); } } @@ -311,15 +290,15 @@ bool ParseClassDefFormat2(const ots::Font *font, // Skip format field. if (!subtable.Skip(2)) { - return OTS_FAILURE_MSG("Failed to skip format of class defintion header"); + return OTS_FAILURE_MSG("Failed to read class definition format"); } uint16_t range_count = 0; if (!subtable.ReadU16(&range_count)) { - return OTS_FAILURE_MSG("Failed to read range count in class definition"); + return OTS_FAILURE_MSG("Failed to read classRangeCount"); } if (range_count > num_glyphs) { - return OTS_FAILURE_MSG("bad range count: %u", range_count); + return OTS_FAILURE_MSG("classRangeCount > glyph count: %u > %u", range_count, num_glyphs); } uint16_t last_end = 0; @@ -330,13 +309,16 @@ bool ParseClassDefFormat2(const ots::Font *font, if (!subtable.ReadU16(&start) || !subtable.ReadU16(&end) || !subtable.ReadU16(&class_value)) { - return OTS_FAILURE_MSG("Failed to read class definition reange %d", i); + return OTS_FAILURE_MSG("Failed to read ClassRangeRecord %d", i); + } + if (start > end) { + return OTS_FAILURE_MSG("ClassRangeRecord %d, start > end: %u > %u", i, start, end); } - if (start > end || (last_end && start <= last_end)) { - return OTS_FAILURE_MSG("glyph range is overlapping.in range %d", i); + if (last_end && start <= last_end) { + return OTS_FAILURE_MSG("ClassRangeRecord %d start overlaps with end of the previous one: %u <= %u", i, start, last_end); } if (class_value > num_classes) { - return OTS_FAILURE_MSG("bad class value: %u", class_value); + return OTS_FAILURE_MSG("ClassRangeRecord %d class > number of classes: %u > %u", i, class_value, num_classes); } last_end = end; } @@ -661,7 +643,7 @@ bool ParseContextFormat2(const ots::Font *font, } if (!ots::ParseClassDefTable(font, data + offset_class_def, length - offset_class_def, - num_glyphs, kMaxClassDefValue)) { + num_glyphs, ots::kMaxClassDefValue)) { return OTS_FAILURE_MSG("Failed to parse class definition table in context format 2"); } @@ -1014,7 +996,7 @@ bool ParseChainContextFormat2(const ots::Font *font, } if (!ots::ParseClassDefTable(font, data + offset_backtrack_class_def, length - offset_backtrack_class_def, - num_glyphs, kMaxClassDefValue)) { + num_glyphs, ots::kMaxClassDefValue)) { return OTS_FAILURE_MSG("Failed to parse backtrack class defn table in chain context format 2"); } } @@ -1025,7 +1007,7 @@ bool ParseChainContextFormat2(const ots::Font *font, } if (!ots::ParseClassDefTable(font, data + offset_input_class_def, length - offset_input_class_def, - num_glyphs, kMaxClassDefValue)) { + num_glyphs, ots::kMaxClassDefValue)) { return OTS_FAILURE_MSG("Failed to parse input class defn in chain context format 2"); } @@ -1036,7 +1018,7 @@ bool ParseChainContextFormat2(const ots::Font *font, } if (!ots::ParseClassDefTable(font, data + offset_lookahead_class_def, length - offset_lookahead_class_def, - num_glyphs, kMaxClassDefValue)) { + num_glyphs, ots::kMaxClassDefValue)) { return OTS_FAILURE_MSG("Failed to parse lookahead class defn in chain context format 2"); } } @@ -1400,11 +1382,17 @@ bool ParseDeviceTable(const ots::Font *font, !subtable.ReadU16(&delta_format)) { return OTS_FAILURE_MSG("Failed to read device table header"); } + if (delta_format == kVariationIndex) { + // start_size and end_size are replaced by deltaSetOuterIndex + // and deltaSetInnerIndex respectively, but we don't attempt to + // check them here, so nothing more to do. + return true; + } if (start_size > end_size) { - return OTS_FAILURE_MSG("bad size range: %u > %u", start_size, end_size); + return OTS_FAILURE_MSG("Bad device table size range: %u > %u", start_size, end_size); } if (delta_format == 0 || delta_format > kMaxDeltaFormatType) { - return OTS_FAILURE_MSG("bad delta format: %u", delta_format); + return OTS_FAILURE_MSG("Bad device table delta format: 0x%x", delta_format); } // The number of delta values per uint16. The device table should contain // at least |num_units| * 2 bytes compressed data. @@ -1516,6 +1504,173 @@ bool ParseExtensionSubtable(const Font *font, return true; } +bool ParseConditionTable(const Font *font, + const uint8_t *data, const size_t length, + const uint16_t axis_count) { + Buffer subtable(data, length); + + uint16_t format = 0; + if (!subtable.ReadU16(&format)) { + return OTS_FAILURE_MSG("Failed to read condition table format"); + } + + if (format != 1) { + // An unknown format is not an error, but should be ignored per spec. + return true; + } + + uint16_t axis_index = 0; + int16_t filter_range_min_value = 0; + int16_t filter_range_max_value = 0; + if (!subtable.ReadU16(&axis_index) || + !subtable.ReadS16(&filter_range_min_value) || + !subtable.ReadS16(&filter_range_max_value)) { + return OTS_FAILURE_MSG("Failed to read condition table (format 1)"); + } + + if (axis_index >= axis_count) { + return OTS_FAILURE_MSG("Axis index out of range in condition"); + } + + // Check min/max values are within range -1.0 .. 1.0 and properly ordered + if (filter_range_min_value < -0x4000 || // -1.0 in F2DOT14 format + filter_range_max_value > 0x4000 || // +1.0 in F2DOT14 format + filter_range_min_value > filter_range_max_value) { + return OTS_FAILURE_MSG("Invalid filter range in condition"); + } + + return true; +} + +bool ParseConditionSetTable(const Font *font, + const uint8_t *data, const size_t length, + const uint16_t axis_count) { + Buffer subtable(data, length); + + uint16_t condition_count = 0; + if (!subtable.ReadU16(&condition_count)) { + return OTS_FAILURE_MSG("Failed to read condition count"); + } + + for (uint16_t i = 0; i < condition_count; i++) { + uint32_t condition_offset = 0; + if (!subtable.ReadU32(&condition_offset)) { + return OTS_FAILURE_MSG("Failed to read condition offset"); + } + if (condition_offset < subtable.offset() || condition_offset >= length) { + return OTS_FAILURE_MSG("Offset out of range"); + } + if (!ParseConditionTable(font, data + condition_offset, length - condition_offset, + axis_count)) { + return OTS_FAILURE_MSG("Failed to parse condition table"); + } + } + + return true; +} + +bool ParseFeatureTableSubstitutionTable(const Font *font, + const uint8_t *data, const size_t length, + const uint16_t num_lookups) { + Buffer subtable(data, length); + + uint16_t version_major = 0; + uint16_t version_minor = 0; + uint16_t substitution_count = 0; + const size_t kFeatureTableSubstitutionHeaderSize = 3 * sizeof(uint16_t); + + if (!subtable.ReadU16(&version_major) || + !subtable.ReadU16(&version_minor) || + !subtable.ReadU16(&substitution_count)) { + return OTS_FAILURE_MSG("Failed to read feature table substitution table header"); + } + + for (uint16_t i = 0; i < substitution_count; i++) { + uint16_t feature_index = 0; + uint32_t alternate_feature_table_offset = 0; + const size_t kFeatureTableSubstitutionRecordSize = sizeof(uint16_t) + sizeof(uint32_t); + + if (!subtable.ReadU16(&feature_index) || + !subtable.ReadU32(&alternate_feature_table_offset)) { + return OTS_FAILURE_MSG("Failed to read feature table substitution record"); + } + + if (alternate_feature_table_offset < kFeatureTableSubstitutionHeaderSize + + kFeatureTableSubstitutionRecordSize * substitution_count || + alternate_feature_table_offset >= length) { + return OTS_FAILURE_MSG("Invalid alternate feature table offset"); + } + + if (!ParseFeatureTable(font, data + alternate_feature_table_offset, + length - alternate_feature_table_offset, num_lookups)) { + return OTS_FAILURE_MSG("Failed to parse alternate feature table"); + } + } + + return true; +} + +bool ParseFeatureVariationsTable(const Font *font, + const uint8_t *data, const size_t length, + const uint16_t num_lookups) { + Buffer subtable(data, length); + + uint16_t version_major = 0; + uint16_t version_minor = 0; + uint32_t feature_variation_record_count = 0; + + if (!subtable.ReadU16(&version_major) || + !subtable.ReadU16(&version_minor) || + !subtable.ReadU32(&feature_variation_record_count)) { + return OTS_FAILURE_MSG("Failed to read feature variations table header"); + } + + OpenTypeFVAR* fvar = static_cast<OpenTypeFVAR*>(font->GetTypedTable(OTS_TAG_FVAR)); + if (!fvar) { + return OTS_FAILURE_MSG("Not a variation font"); + } + const uint16_t axis_count = fvar->AxisCount(); + + const size_t kEndOfFeatureVariationRecords = + 2 * sizeof(uint16_t) + sizeof(uint32_t) + + feature_variation_record_count * 2 * sizeof(uint32_t); + + for (uint32_t i = 0; i < feature_variation_record_count; i++) { + uint32_t condition_set_offset = 0; + uint32_t feature_table_substitution_offset = 0; + if (!subtable.ReadU32(&condition_set_offset) || + !subtable.ReadU32(&feature_table_substitution_offset)) { + return OTS_FAILURE_MSG("Failed to read feature variation record"); + } + + if (condition_set_offset) { + if (condition_set_offset < kEndOfFeatureVariationRecords || + condition_set_offset >= length) { + return OTS_FAILURE_MSG("Condition set offset out of range"); + } + if (!ParseConditionSetTable(font, data + condition_set_offset, + length - condition_set_offset, + axis_count)) { + return OTS_FAILURE_MSG("Failed to parse condition set table"); + } + } + + if (feature_table_substitution_offset) { + if (feature_table_substitution_offset < kEndOfFeatureVariationRecords || + feature_table_substitution_offset >= length) { + return OTS_FAILURE_MSG("Feature table substitution offset out of range"); + } + if (!ParseFeatureTableSubstitutionTable(font, data + feature_table_substitution_offset, + length - feature_table_substitution_offset, + num_lookups)) { + return OTS_FAILURE_MSG("Failed to parse feature table substitution table"); + } + } + } + + return true; +} + } // namespace ots #undef TABLE_NAME diff --git a/gfx/ots/src/layout.h b/gfx/ots/src/layout.h index d195646d4..d10a3be5b 100644 --- a/gfx/ots/src/layout.h +++ b/gfx/ots/src/layout.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -12,6 +12,8 @@ namespace ots { +// The maximum number of class value. +const uint16_t kMaxClassDefValue = 0xFFFF; struct LookupSubtableParser { struct TypeParser { @@ -70,6 +72,23 @@ bool ParseExtensionSubtable(const Font *font, const uint8_t *data, const size_t length, const LookupSubtableParser* parser); +// For feature variations table (in GSUB/GPOS v1.1) +bool ParseConditionTable(const Font *font, + const uint8_t *data, const size_t length, + const uint16_t axis_count); + +bool ParseConditionSetTable(const Font *font, + const uint8_t *data, const size_t length, + const uint16_t axis_count); + +bool ParseFeatureTableSubstitutionTable(const Font *font, + const uint8_t *data, const size_t length, + const uint16_t num_lookups); + +bool ParseFeatureVariationsTable(const Font *font, + const uint8_t *data, const size_t length, + const uint16_t num_lookups); + } // namespace ots #endif // OTS_LAYOUT_H_ diff --git a/gfx/ots/src/loca.cc b/gfx/ots/src/loca.cc index aae04c25a..4f322027d 100644 --- a/gfx/ots/src/loca.cc +++ b/gfx/ots/src/loca.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,84 +10,79 @@ // loca - Index to Location // http://www.microsoft.com/typography/otspec/loca.htm -#define TABLE_NAME "loca" - namespace ots { -bool ots_loca_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeLOCA::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); // We can't do anything useful in validating this data except to ensure that // the values are monotonically increasing. - OpenTypeLOCA *loca = new OpenTypeLOCA; - font->loca = loca; - - if (!font->maxp || !font->head) { - return OTS_FAILURE_MSG("maxp or head tables missing from font, needed by loca"); + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + OpenTypeHEAD *head = static_cast<OpenTypeHEAD*>( + GetFont()->GetTypedTable(OTS_TAG_HEAD)); + if (!maxp || !head) { + return Error("Required maxp or head tables are missing"); } - const unsigned num_glyphs = font->maxp->num_glyphs; + const unsigned num_glyphs = maxp->num_glyphs; unsigned last_offset = 0; - loca->offsets.resize(num_glyphs + 1); + this->offsets.resize(num_glyphs + 1); // maxp->num_glyphs is uint16_t, thus the addition never overflows. - if (font->head->index_to_loc_format == 0) { + if (head->index_to_loc_format == 0) { // Note that the <= here (and below) is correct. There is one more offset // than the number of glyphs in order to give the length of the final // glyph. for (unsigned i = 0; i <= num_glyphs; ++i) { uint16_t offset = 0; if (!table.ReadU16(&offset)) { - return OTS_FAILURE_MSG("Failed to read offset for glyph %d", i); + return Error("Failed to read offset for glyph %d", i); } if (offset < last_offset) { - return OTS_FAILURE_MSG("Out of order offset %d < %d for glyph %d", offset, last_offset, i); + return Error("Out of order offset %d < %d for glyph %d", offset, last_offset, i); } last_offset = offset; - loca->offsets[i] = offset * 2; + this->offsets[i] = offset * 2; } } else { for (unsigned i = 0; i <= num_glyphs; ++i) { uint32_t offset = 0; if (!table.ReadU32(&offset)) { - return OTS_FAILURE_MSG("Failed to read offset for glyph %d", i); + return Error("Failed to read offset for glyph %d", i); } if (offset < last_offset) { - return OTS_FAILURE_MSG("Out of order offset %d < %d for glyph %d", offset, last_offset, i); + return Error("Out of order offset %d < %d for glyph %d", offset, last_offset, i); } last_offset = offset; - loca->offsets[i] = offset; + this->offsets[i] = offset; } } return true; } -bool ots_loca_should_serialise(Font *font) { - return font->loca != NULL; -} - -bool ots_loca_serialise(OTSStream *out, Font *font) { - const OpenTypeLOCA *loca = font->loca; - const OpenTypeHEAD *head = font->head; +bool OpenTypeLOCA::Serialize(OTSStream *out) { + OpenTypeHEAD *head = static_cast<OpenTypeHEAD*>( + GetFont()->GetTypedTable(OTS_TAG_HEAD)); if (!head) { - return OTS_FAILURE_MSG("Missing head table in font needed by loca"); + return Error("Required head table is missing"); } if (head->index_to_loc_format == 0) { - for (unsigned i = 0; i < loca->offsets.size(); ++i) { - const uint16_t offset = static_cast<uint16_t>(loca->offsets[i] >> 1); - if ((offset != (loca->offsets[i] >> 1)) || + for (unsigned i = 0; i < this->offsets.size(); ++i) { + const uint16_t offset = static_cast<uint16_t>(this->offsets[i] >> 1); + if ((offset != (this->offsets[i] >> 1)) || !out->WriteU16(offset)) { - return OTS_FAILURE_MSG("Failed to write glyph offset for glyph %d", i); + return Error("Failed to write glyph offset for glyph %d", i); } } } else { - for (unsigned i = 0; i < loca->offsets.size(); ++i) { - if (!out->WriteU32(loca->offsets[i])) { - return OTS_FAILURE_MSG("Failed to write glyph offset for glyph %d", i); + for (unsigned i = 0; i < this->offsets.size(); ++i) { + if (!out->WriteU32(this->offsets[i])) { + return Error("Failed to write glyph offset for glyph %d", i); } } } @@ -95,15 +90,4 @@ bool ots_loca_serialise(OTSStream *out, Font *font) { return true; } -void ots_loca_reuse(Font *font, Font *other) { - font->loca = other->loca; - font->loca_reused = true; -} - -void ots_loca_free(Font *font) { - delete font->loca; -} - } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/loca.h b/gfx/ots/src/loca.h index 255ef06ec..da3241842 100644 --- a/gfx/ots/src/loca.h +++ b/gfx/ots/src/loca.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,7 +11,14 @@ namespace ots { -struct OpenTypeLOCA { +class OpenTypeLOCA : public Table { + public: + explicit OpenTypeLOCA(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + std::vector<uint32_t> offsets; }; diff --git a/gfx/ots/src/ltsh.cc b/gfx/ots/src/ltsh.cc index 5b34cf4ad..4c40c5eb7 100644 --- a/gfx/ots/src/ltsh.cc +++ b/gfx/ots/src/ltsh.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,89 +9,63 @@ // LTSH - Linear Threshold // http://www.microsoft.com/typography/otspec/ltsh.htm -#define TABLE_NAME "LTSH" - -#define DROP_THIS_TABLE(...) \ - do { \ - OTS_FAILURE_MSG_(font->file, TABLE_NAME ": " __VA_ARGS__); \ - OTS_FAILURE_MSG("Table discarded"); \ - delete font->ltsh; \ - font->ltsh = 0; \ - } while (0) - namespace ots { -bool ots_ltsh_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeLTSH::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - if (!font->maxp) { - return OTS_FAILURE_MSG("Missing maxp table from font needed by ltsh"); + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return Error("Required maxp table is missing"); } - OpenTypeLTSH *ltsh = new OpenTypeLTSH; - font->ltsh = ltsh; - uint16_t num_glyphs = 0; - if (!table.ReadU16(<sh->version) || + if (!table.ReadU16(&this->version) || !table.ReadU16(&num_glyphs)) { - return OTS_FAILURE_MSG("Failed to read ltsh header"); + return Error("Failed to read table header"); } - if (ltsh->version != 0) { - DROP_THIS_TABLE("bad version: %u", ltsh->version); - return true; + if (this->version != 0) { + return Drop("Unsupported version: %u", this->version); } - if (num_glyphs != font->maxp->num_glyphs) { - DROP_THIS_TABLE("bad num_glyphs: %u", num_glyphs); - return true; + if (num_glyphs != maxp->num_glyphs) { + return Drop("Bad numGlyphs: %u", num_glyphs); } - ltsh->ypels.reserve(num_glyphs); + this->ypels.reserve(num_glyphs); for (unsigned i = 0; i < num_glyphs; ++i) { uint8_t pel = 0; if (!table.ReadU8(&pel)) { - return OTS_FAILURE_MSG("Failed to read pixels for glyph %d", i); + return Error("Failed to read pixels for glyph %d", i); } - ltsh->ypels.push_back(pel); + this->ypels.push_back(pel); } return true; } -bool ots_ltsh_should_serialise(Font *font) { - if (!font->glyf) return false; // this table is not for CFF fonts. - return font->ltsh != NULL; -} - -bool ots_ltsh_serialise(OTSStream *out, Font *font) { - const OpenTypeLTSH *ltsh = font->ltsh; - - const uint16_t num_ypels = static_cast<uint16_t>(ltsh->ypels.size()); - if (num_ypels != ltsh->ypels.size() || - !out->WriteU16(ltsh->version) || +bool OpenTypeLTSH::Serialize(OTSStream *out) { + const uint16_t num_ypels = static_cast<uint16_t>(this->ypels.size()); + if (num_ypels != this->ypels.size() || + !out->WriteU16(this->version) || !out->WriteU16(num_ypels)) { - return OTS_FAILURE_MSG("Failed to write pels size"); + return Error("Failed to write table header"); } for (uint16_t i = 0; i < num_ypels; ++i) { - if (!out->Write(&(ltsh->ypels[i]), 1)) { - return OTS_FAILURE_MSG("Failed to write pixel size for glyph %d", i); + if (!out->Write(&(this->ypels[i]), 1)) { + return Error("Failed to write pixel size for glyph %d", i); } } return true; } -void ots_ltsh_reuse(Font *font, Font *other) { - font->ltsh = other->ltsh; - font->ltsh_reused = true; -} - -void ots_ltsh_free(Font *font) { - delete font->ltsh; +bool OpenTypeLTSH::ShouldSerialize() { + return Table::ShouldSerialize() && + // this table is not for CFF fonts. + GetFont()->GetTable(OTS_TAG_GLYF) != NULL; } } // namespace ots - -#undef TABLE_NAME -#undef DROP_THIS_TABLE diff --git a/gfx/ots/src/ltsh.h b/gfx/ots/src/ltsh.h index 23d97d784..cc9fbf62d 100644 --- a/gfx/ots/src/ltsh.h +++ b/gfx/ots/src/ltsh.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,7 +11,16 @@ namespace ots { -struct OpenTypeLTSH { +class OpenTypeLTSH : public Table { + public: + explicit OpenTypeLTSH(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: uint16_t version; std::vector<uint8_t> ypels; }; diff --git a/gfx/ots/src/math.cc b/gfx/ots/src/math.cc index 36417dc29..c94e3bee3 100644 --- a/gfx/ots/src/math.cc +++ b/gfx/ots/src/math.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2014 The Chromium Authors. All rights reserved. +// Copyright (c) 2014-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -12,12 +12,7 @@ #include "maxp.h" // MATH - The MATH Table -// The specification is not yet public but has been submitted to the MPEG group -// in response to the 'Call for Proposals for ISO/IEC 14496-22 "Open Font -// Format" Color Font Technology and MATH layout support'. Meanwhile, you can -// contact Microsoft's engineer Murray Sargent to obtain a copy. - -#define TABLE_NAME "MATH" +// http://www.microsoft.com/typography/otspec/math.htm namespace { @@ -48,11 +43,15 @@ const unsigned kMathValueRecordSize = 2 * 2; // PartFlags const unsigned kGlyphPartRecordSize = 5 * 2; +} // namespace + +namespace ots { + // Shared Table: MathValueRecord -bool ParseMathValueRecord(const ots::Font *font, - ots::Buffer* subtable, const uint8_t *data, - const size_t length) { +bool OpenTypeMATH::ParseMathValueRecord(ots::Buffer* subtable, + const uint8_t *data, + const size_t length) { // Check the Value field. if (!subtable->Skip(2)) { return OTS_FAILURE(); @@ -67,7 +66,7 @@ bool ParseMathValueRecord(const ots::Font *font, if (offset >= length) { return OTS_FAILURE(); } - if (!ots::ParseDeviceTable(font, data + offset, length - offset)) { + if (!ots::ParseDeviceTable(GetFont(), data + offset, length - offset)) { return OTS_FAILURE(); } } @@ -75,8 +74,8 @@ bool ParseMathValueRecord(const ots::Font *font, return true; } -bool ParseMathConstantsTable(const ots::Font *font, - const uint8_t *data, size_t length) { +bool OpenTypeMATH::ParseMathConstantsTable(const uint8_t *data, + size_t length) { ots::Buffer subtable(data, length); // Part 1: int16 or uint16 constants. @@ -146,7 +145,7 @@ bool ParseMathConstantsTable(const ots::Font *font, // // RadicalKernAfterDegree for (unsigned i = 0; i < static_cast<unsigned>(51); ++i) { - if (!ParseMathValueRecord(font, &subtable, data, length)) { + if (!ParseMathValueRecord(&subtable, data, length)) { return OTS_FAILURE(); } } @@ -160,11 +159,10 @@ bool ParseMathConstantsTable(const ots::Font *font, return true; } -bool ParseMathValueRecordSequenceForGlyphs(const ots::Font *font, - ots::Buffer* subtable, - const uint8_t *data, - const size_t length, - const uint16_t num_glyphs) { +bool OpenTypeMATH::ParseMathValueRecordSequenceForGlyphs(ots::Buffer* subtable, + const uint8_t *data, + const size_t length, + const uint16_t num_glyphs) { // Check the header. uint16_t offset_coverage = 0; uint16_t sequence_count = 0; @@ -183,7 +181,7 @@ bool ParseMathValueRecordSequenceForGlyphs(const ots::Font *font, if (offset_coverage < sequence_end || offset_coverage >= length) { return OTS_FAILURE(); } - if (!ots::ParseCoverageTable(font, data + offset_coverage, + if (!ots::ParseCoverageTable(GetFont(), data + offset_coverage, length - offset_coverage, num_glyphs, sequence_count)) { return OTS_FAILURE(); @@ -191,7 +189,7 @@ bool ParseMathValueRecordSequenceForGlyphs(const ots::Font *font, // Check sequence. for (unsigned i = 0; i < sequence_count; ++i) { - if (!ParseMathValueRecord(font, subtable, data, length)) { + if (!ParseMathValueRecord(subtable, data, length)) { return OTS_FAILURE(); } } @@ -199,26 +197,23 @@ bool ParseMathValueRecordSequenceForGlyphs(const ots::Font *font, return true; } -bool ParseMathItalicsCorrectionInfoTable(const ots::Font *font, - const uint8_t *data, - size_t length, - const uint16_t num_glyphs) { +bool OpenTypeMATH::ParseMathItalicsCorrectionInfoTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs) { ots::Buffer subtable(data, length); - return ParseMathValueRecordSequenceForGlyphs(font, &subtable, data, length, + return ParseMathValueRecordSequenceForGlyphs(&subtable, data, length, num_glyphs); } -bool ParseMathTopAccentAttachmentTable(const ots::Font *font, - const uint8_t *data, - size_t length, - const uint16_t num_glyphs) { +bool OpenTypeMATH::ParseMathTopAccentAttachmentTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs) { ots::Buffer subtable(data, length); - return ParseMathValueRecordSequenceForGlyphs(font, &subtable, data, length, + return ParseMathValueRecordSequenceForGlyphs(&subtable, data, length, num_glyphs); } -bool ParseMathKernTable(const ots::Font *font, - const uint8_t *data, size_t length) { +bool OpenTypeMATH::ParseMathKernTable(const uint8_t *data, size_t length) { ots::Buffer subtable(data, length); // Check the Height count. @@ -229,14 +224,14 @@ bool ParseMathKernTable(const ots::Font *font, // Check the Correction Heights. for (unsigned i = 0; i < height_count; ++i) { - if (!ParseMathValueRecord(font, &subtable, data, length)) { + if (!ParseMathValueRecord(&subtable, data, length)) { return OTS_FAILURE(); } } // Check the Kern Values. for (unsigned i = 0; i <= height_count; ++i) { - if (!ParseMathValueRecord(font, &subtable, data, length)) { + if (!ParseMathValueRecord(&subtable, data, length)) { return OTS_FAILURE(); } } @@ -244,9 +239,9 @@ bool ParseMathKernTable(const ots::Font *font, return true; } -bool ParseMathKernInfoTable(const ots::Font *font, - const uint8_t *data, size_t length, - const uint16_t num_glyphs) { +bool OpenTypeMATH::ParseMathKernInfoTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs) { ots::Buffer subtable(data, length); // Check the header. @@ -267,7 +262,7 @@ bool ParseMathKernInfoTable(const ots::Font *font, if (offset_coverage < sequence_end || offset_coverage >= length) { return OTS_FAILURE(); } - if (!ots::ParseCoverageTable(font, data + offset_coverage, length - offset_coverage, + if (!ots::ParseCoverageTable(GetFont(), data + offset_coverage, length - offset_coverage, num_glyphs, sequence_count)) { return OTS_FAILURE(); } @@ -282,7 +277,7 @@ bool ParseMathKernInfoTable(const ots::Font *font, } if (offset_math_kern) { if (offset_math_kern < sequence_end || offset_math_kern >= length || - !ParseMathKernTable(font, data + offset_math_kern, + !ParseMathKernTable(data + offset_math_kern, length - offset_math_kern)) { return OTS_FAILURE(); } @@ -293,9 +288,9 @@ bool ParseMathKernInfoTable(const ots::Font *font, return true; } -bool ParseMathGlyphInfoTable(const ots::Font *font, - const uint8_t *data, size_t length, - const uint16_t num_glyphs) { +bool OpenTypeMATH::ParseMathGlyphInfoTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs) { ots::Buffer subtable(data, length); // Check Header. @@ -318,7 +313,7 @@ bool ParseMathGlyphInfoTable(const ots::Font *font, if (offset_math_italics_correction_info >= length || offset_math_italics_correction_info < kMathGlyphInfoHeaderSize || !ParseMathItalicsCorrectionInfoTable( - font, data + offset_math_italics_correction_info, + data + offset_math_italics_correction_info, length - offset_math_italics_correction_info, num_glyphs)) { return OTS_FAILURE(); @@ -327,7 +322,7 @@ bool ParseMathGlyphInfoTable(const ots::Font *font, if (offset_math_top_accent_attachment) { if (offset_math_top_accent_attachment >= length || offset_math_top_accent_attachment < kMathGlyphInfoHeaderSize || - !ParseMathTopAccentAttachmentTable(font, data + + !ParseMathTopAccentAttachmentTable(data + offset_math_top_accent_attachment, length - offset_math_top_accent_attachment, @@ -338,7 +333,7 @@ bool ParseMathGlyphInfoTable(const ots::Font *font, if (offset_extended_shaped_coverage) { if (offset_extended_shaped_coverage >= length || offset_extended_shaped_coverage < kMathGlyphInfoHeaderSize || - !ots::ParseCoverageTable(font, data + offset_extended_shaped_coverage, + !ots::ParseCoverageTable(GetFont(), data + offset_extended_shaped_coverage, length - offset_extended_shaped_coverage, num_glyphs)) { return OTS_FAILURE(); @@ -347,7 +342,7 @@ bool ParseMathGlyphInfoTable(const ots::Font *font, if (offset_math_kern_info) { if (offset_math_kern_info >= length || offset_math_kern_info < kMathGlyphInfoHeaderSize || - !ParseMathKernInfoTable(font, data + offset_math_kern_info, + !ParseMathKernInfoTable(data + offset_math_kern_info, length - offset_math_kern_info, num_glyphs)) { return OTS_FAILURE(); } @@ -356,14 +351,14 @@ bool ParseMathGlyphInfoTable(const ots::Font *font, return true; } -bool ParseGlyphAssemblyTable(const ots::Font *font, - const uint8_t *data, - size_t length, const uint16_t num_glyphs) { +bool OpenTypeMATH::ParseGlyphAssemblyTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs) { ots::Buffer subtable(data, length); // Check the header. uint16_t part_count = 0; - if (!ParseMathValueRecord(font, &subtable, data, length) || + if (!ParseMathValueRecord(&subtable, data, length) || !subtable.ReadU16(&part_count)) { return OTS_FAILURE(); } @@ -384,19 +379,19 @@ bool ParseGlyphAssemblyTable(const ots::Font *font, return OTS_FAILURE(); } if (glyph >= num_glyphs) { - return OTS_FAILURE_MSG("bad glyph ID: %u", glyph); + return Error("bad glyph ID: %u", glyph); } if (part_flags & ~0x00000001) { - return OTS_FAILURE_MSG("unknown part flag: %u", part_flags); + return Error("unknown part flag: %u", part_flags); } } return true; } -bool ParseMathGlyphConstructionTable(const ots::Font *font, - const uint8_t *data, - size_t length, const uint16_t num_glyphs) { +bool OpenTypeMATH::ParseMathGlyphConstructionTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs) { ots::Buffer subtable(data, length); // Check the header. @@ -419,7 +414,7 @@ bool ParseMathGlyphConstructionTable(const ots::Font *font, offset_glyph_assembly < sequence_end) { return OTS_FAILURE(); } - if (!ParseGlyphAssemblyTable(font, data + offset_glyph_assembly, + if (!ParseGlyphAssemblyTable(data + offset_glyph_assembly, length - offset_glyph_assembly, num_glyphs)) { return OTS_FAILURE(); } @@ -433,21 +428,20 @@ bool ParseMathGlyphConstructionTable(const ots::Font *font, return OTS_FAILURE(); } if (glyph >= num_glyphs) { - return OTS_FAILURE_MSG("bad glyph ID: %u", glyph); + return Error("bad glyph ID: %u", glyph); } } return true; } -bool ParseMathGlyphConstructionSequence(const ots::Font *font, - ots::Buffer* subtable, - const uint8_t *data, - size_t length, - const uint16_t num_glyphs, - uint16_t offset_coverage, - uint16_t glyph_count, - const unsigned sequence_end) { +bool OpenTypeMATH::ParseMathGlyphConstructionSequence(ots::Buffer* subtable, + const uint8_t *data, + size_t length, + const uint16_t num_glyphs, + uint16_t offset_coverage, + uint16_t glyph_count, + const unsigned sequence_end) { // Zero glyph count, nothing to parse. if (!glyph_count) { return true; @@ -457,7 +451,7 @@ bool ParseMathGlyphConstructionSequence(const ots::Font *font, if (offset_coverage < sequence_end || offset_coverage >= length) { return OTS_FAILURE(); } - if (!ots::ParseCoverageTable(font, data + offset_coverage, + if (!ots::ParseCoverageTable(GetFont(), data + offset_coverage, length - offset_coverage, num_glyphs, glyph_count)) { return OTS_FAILURE(); @@ -471,7 +465,7 @@ bool ParseMathGlyphConstructionSequence(const ots::Font *font, } if (offset_glyph_construction < sequence_end || offset_glyph_construction >= length || - !ParseMathGlyphConstructionTable(font, data + offset_glyph_construction, + !ParseMathGlyphConstructionTable(data + offset_glyph_construction, length - offset_glyph_construction, num_glyphs)) { return OTS_FAILURE(); @@ -481,9 +475,9 @@ bool ParseMathGlyphConstructionSequence(const ots::Font *font, return true; } -bool ParseMathVariantsTable(const ots::Font *font, - const uint8_t *data, - size_t length, const uint16_t num_glyphs) { +bool OpenTypeMATH::ParseMathVariantsTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs) { ots::Buffer subtable(data, length); // Check the header. @@ -505,11 +499,11 @@ bool ParseMathVariantsTable(const ots::Font *font, return OTS_FAILURE(); } - if (!ParseMathGlyphConstructionSequence(font, &subtable, data, length, num_glyphs, + if (!ParseMathGlyphConstructionSequence(&subtable, data, length, num_glyphs, offset_vert_glyph_coverage, vert_glyph_count, sequence_end) || - !ParseMathGlyphConstructionSequence(font, &subtable, data, length, num_glyphs, + !ParseMathGlyphConstructionSequence(&subtable, data, length, num_glyphs, offset_horiz_glyph_coverage, horiz_glyph_count, sequence_end)) { @@ -519,37 +513,24 @@ bool ParseMathVariantsTable(const ots::Font *font, return true; } -} // namespace - -#define DROP_THIS_TABLE(msg_) \ - do { \ - OTS_FAILURE_MSG(msg_ ", table discarded"); \ - font->math->data = 0; \ - font->math->length = 0; \ - } while (0) - -namespace ots { - -bool ots_math_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeMATH::Parse(const uint8_t *data, size_t length) { // Grab the number of glyphs in the font from the maxp table to check // GlyphIDs in MATH table. - if (!font->maxp) { - return OTS_FAILURE(); + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return Error("Required maxp table missing"); } - const uint16_t num_glyphs = font->maxp->num_glyphs; + const uint16_t num_glyphs = maxp->num_glyphs; Buffer table(data, length); - OpenTypeMATH* math = new OpenTypeMATH; - font->math = math; - uint32_t version = 0; if (!table.ReadU32(&version)) { return OTS_FAILURE(); } if (version != 0x00010000) { - DROP_THIS_TABLE("bad MATH version"); - return true; + return Drop("bad MATH version"); } uint16_t offset_math_constants = 0; @@ -567,53 +548,37 @@ bool ots_math_parse(Font *font, const uint8_t *data, size_t length) { offset_math_glyph_info < kMathHeaderSize || offset_math_variants >= length || offset_math_variants < kMathHeaderSize) { - DROP_THIS_TABLE("bad offset in MATH header"); - return true; + return Drop("bad offset in MATH header"); } - if (!ParseMathConstantsTable(font, data + offset_math_constants, + if (!ParseMathConstantsTable(data + offset_math_constants, length - offset_math_constants)) { - DROP_THIS_TABLE("failed to parse MathConstants table"); - return true; + return Drop("failed to parse MathConstants table"); } - if (!ParseMathGlyphInfoTable(font, data + offset_math_glyph_info, + if (!ParseMathGlyphInfoTable(data + offset_math_glyph_info, length - offset_math_glyph_info, num_glyphs)) { - DROP_THIS_TABLE("failed to parse MathGlyphInfo table"); - return true; + return Drop("failed to parse MathGlyphInfo table"); } - if (!ParseMathVariantsTable(font, data + offset_math_variants, + if (!ParseMathVariantsTable(data + offset_math_variants, length - offset_math_variants, num_glyphs)) { - DROP_THIS_TABLE("failed to parse MathVariants table"); - return true; + return Drop("failed to parse MathVariants table"); } - math->data = data; - math->length = length; + this->m_data = data; + this->m_length = length; return true; } -bool ots_math_should_serialise(Font *font) { - return font->math != NULL && font->math->data != NULL; -} - -bool ots_math_serialise(OTSStream *out, Font *font) { - if (!out->Write(font->math->data, font->math->length)) { +bool OpenTypeMATH::Serialize(OTSStream *out) { + if (!out->Write(this->m_data, this->m_length)) { return OTS_FAILURE(); } return true; } -void ots_math_reuse(Font *font, Font *other) { - font->math = other->math; - font->math_reused = true; -} - -void ots_math_free(Font *font) { - delete font->math; +bool OpenTypeMATH::ShouldSerialize() { + return Table::ShouldSerialize() && this->m_data != NULL; } } // namespace ots - -#undef TABLE_NAME -#undef DROP_THIS_TABLE diff --git a/gfx/ots/src/math_.h b/gfx/ots/src/math_.h index 91c54dbe1..875cacd4d 100644 --- a/gfx/ots/src/math_.h +++ b/gfx/ots/src/math_.h @@ -1,4 +1,4 @@ -// Copyright (c) 2014 The Chromium Authors. All rights reserved. +// Copyright (c) 2014-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,14 +9,58 @@ namespace ots { -struct OpenTypeMATH { - OpenTypeMATH() - : data(NULL), - length(0) { - } +class OpenTypeMATH : public Table { + public: + explicit OpenTypeMATH(Font *font, uint32_t tag) + : Table(font, tag, tag), + m_data(NULL), + m_length(0) { } - const uint8_t *data; - size_t length; + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: + bool ParseMathValueRecord(ots::Buffer* subtable, + const uint8_t *data, + const size_t length); + bool ParseMathConstantsTable(const uint8_t *data, size_t length); + bool ParseMathValueRecordSequenceForGlyphs(ots::Buffer* subtable, + const uint8_t *data, + const size_t length, + const uint16_t num_glyphs); + bool ParseMathItalicsCorrectionInfoTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs); + bool ParseMathTopAccentAttachmentTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs); + bool ParseMathKernTable(const uint8_t *data, size_t length); + bool ParseMathKernInfoTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs); + bool ParseMathGlyphInfoTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs); + bool ParseGlyphAssemblyTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs); + bool ParseMathGlyphConstructionTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs); + bool ParseMathGlyphConstructionSequence(ots::Buffer* subtable, + const uint8_t *data, + size_t length, + const uint16_t num_glyphs, + uint16_t offset_coverage, + uint16_t glyph_count, + const unsigned sequence_end); + bool ParseMathVariantsTable(const uint8_t *data, + size_t length, + const uint16_t num_glyphs); + + const uint8_t *m_data; + size_t m_length; }; } // namespace ots diff --git a/gfx/ots/src/maxp.cc b/gfx/ots/src/maxp.cc index 41e29a745..232e4a988 100644 --- a/gfx/ots/src/maxp.cc +++ b/gfx/ots/src/maxp.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,119 +7,97 @@ // maxp - Maximum Profile // http://www.microsoft.com/typography/otspec/maxp.htm -#define TABLE_NAME "maxp" - namespace ots { -bool ots_maxp_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeMAXP::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeMAXP *maxp = new OpenTypeMAXP; - font->maxp = maxp; - uint32_t version = 0; if (!table.ReadU32(&version)) { - return OTS_FAILURE_MSG("Failed to read version of maxp table"); + return Error("Failed to read table version"); } if (version >> 16 > 1) { - return OTS_FAILURE_MSG("Bad maxp version %d", version); + return Error("Unsupported table version 0x%x", version); } - if (!table.ReadU16(&maxp->num_glyphs)) { - return OTS_FAILURE_MSG("Failed to read number of glyphs from maxp table"); + if (!table.ReadU16(&this->num_glyphs)) { + return Error("Failed to read numGlyphs"); } - if (!maxp->num_glyphs) { - return OTS_FAILURE_MSG("Bad number of glyphs 0 in maxp table"); + if (!this->num_glyphs) { + return Error("numGlyphs is 0"); } if (version >> 16 == 1) { - maxp->version_1 = true; - if (!table.ReadU16(&maxp->max_points) || - !table.ReadU16(&maxp->max_contours) || - !table.ReadU16(&maxp->max_c_points) || - !table.ReadU16(&maxp->max_c_contours) || - !table.ReadU16(&maxp->max_zones) || - !table.ReadU16(&maxp->max_t_points) || - !table.ReadU16(&maxp->max_storage) || - !table.ReadU16(&maxp->max_fdefs) || - !table.ReadU16(&maxp->max_idefs) || - !table.ReadU16(&maxp->max_stack) || - !table.ReadU16(&maxp->max_size_glyf_instructions) || - !table.ReadU16(&maxp->max_c_components) || - !table.ReadU16(&maxp->max_c_depth)) { - return OTS_FAILURE_MSG("Failed to read maxp table"); + this->version_1 = true; + if (!table.ReadU16(&this->max_points) || + !table.ReadU16(&this->max_contours) || + !table.ReadU16(&this->max_c_points) || + !table.ReadU16(&this->max_c_contours) || + !table.ReadU16(&this->max_zones) || + !table.ReadU16(&this->max_t_points) || + !table.ReadU16(&this->max_storage) || + !table.ReadU16(&this->max_fdefs) || + !table.ReadU16(&this->max_idefs) || + !table.ReadU16(&this->max_stack) || + !table.ReadU16(&this->max_size_glyf_instructions) || + !table.ReadU16(&this->max_c_components) || + !table.ReadU16(&this->max_c_depth)) { + return Error("Failed to read version 1 table data"); } - if (maxp->max_zones == 0) { + if (this->max_zones == 0) { // workaround for ipa*.ttf Japanese fonts. - OTS_WARNING("bad max_zones: %u", maxp->max_zones); - maxp->max_zones = 1; - } else if (maxp->max_zones == 3) { + Warning("Bad maxZones: %u", this->max_zones); + this->max_zones = 1; + } else if (this->max_zones == 3) { // workaround for Ecolier-*.ttf fonts. - OTS_WARNING("bad max_zones: %u", maxp->max_zones); - maxp->max_zones = 2; + Warning("Bad maxZones: %u", this->max_zones); + this->max_zones = 2; } - if ((maxp->max_zones != 1) && (maxp->max_zones != 2)) { - return OTS_FAILURE_MSG("Bad max zones %d in maxp", maxp->max_zones); + if ((this->max_zones != 1) && (this->max_zones != 2)) { + return Error("Bad maxZones: %u", this->max_zones); } } else { - maxp->version_1 = false; + this->version_1 = false; } return true; } -bool ots_maxp_should_serialise(Font *font) { - return font->maxp != NULL; -} - -bool ots_maxp_serialise(OTSStream *out, Font *font) { - const OpenTypeMAXP *maxp = font->maxp; - - if (!out->WriteU32(maxp->version_1 ? 0x00010000 : 0x00005000) || - !out->WriteU16(maxp->num_glyphs)) { - return OTS_FAILURE_MSG("Failed to write maxp version or number of glyphs"); +bool OpenTypeMAXP::Serialize(OTSStream *out) { + if (!out->WriteU32(this->version_1 ? 0x00010000 : 0x00005000) || + !out->WriteU16(this->num_glyphs)) { + return Error("Failed to write version or numGlyphs"); } - if (!maxp->version_1) return true; + if (!this->version_1) return true; - if (!out->WriteU16(maxp->max_points) || - !out->WriteU16(maxp->max_contours) || - !out->WriteU16(maxp->max_c_points) || - !out->WriteU16(maxp->max_c_contours)) { - return OTS_FAILURE_MSG("Failed to write maxp"); + if (!out->WriteU16(this->max_points) || + !out->WriteU16(this->max_contours) || + !out->WriteU16(this->max_c_points) || + !out->WriteU16(this->max_c_contours)) { + return Error("Failed to write maxp"); } - if (!out->WriteU16(maxp->max_zones) || - !out->WriteU16(maxp->max_t_points) || - !out->WriteU16(maxp->max_storage) || - !out->WriteU16(maxp->max_fdefs) || - !out->WriteU16(maxp->max_idefs) || - !out->WriteU16(maxp->max_stack) || - !out->WriteU16(maxp->max_size_glyf_instructions)) { - return OTS_FAILURE_MSG("Failed to write more maxp"); + if (!out->WriteU16(this->max_zones) || + !out->WriteU16(this->max_t_points) || + !out->WriteU16(this->max_storage) || + !out->WriteU16(this->max_fdefs) || + !out->WriteU16(this->max_idefs) || + !out->WriteU16(this->max_stack) || + !out->WriteU16(this->max_size_glyf_instructions)) { + return Error("Failed to write more maxp"); } - if (!out->WriteU16(maxp->max_c_components) || - !out->WriteU16(maxp->max_c_depth)) { - return OTS_FAILURE_MSG("Failed to write yet more maxp"); + if (!out->WriteU16(this->max_c_components) || + !out->WriteU16(this->max_c_depth)) { + return Error("Failed to write yet more maxp"); } return true; } -void ots_maxp_reuse(Font *font, Font *other) { - font->maxp = other->maxp; - font->maxp_reused = true; -} - -void ots_maxp_free(Font *font) { - delete font->maxp; -} - } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/maxp.h b/gfx/ots/src/maxp.h index efca0c91a..99dbdc439 100644 --- a/gfx/ots/src/maxp.h +++ b/gfx/ots/src/maxp.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,7 +9,14 @@ namespace ots { -struct OpenTypeMAXP { +class OpenTypeMAXP : public Table { + public: + explicit OpenTypeMAXP(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + uint16_t num_glyphs; bool version_1; diff --git a/gfx/ots/src/metrics.cc b/gfx/ots/src/metrics.cc index cd89f4555..b49d73c5d 100644 --- a/gfx/ots/src/metrics.cc +++ b/gfx/ots/src/metrics.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,149 +11,163 @@ // http://www.microsoft.com/typography/otspec/hhea.htm // http://www.microsoft.com/typography/otspec/vhea.htm -#define TABLE_NAME "metrics" // XXX: use individual table names - namespace ots { -bool ParseMetricsHeader(Font *font, Buffer *table, - OpenTypeMetricsHeader *header) { - if (!table->ReadS16(&header->ascent) || - !table->ReadS16(&header->descent) || - !table->ReadS16(&header->linegap) || - !table->ReadU16(&header->adv_width_max) || - !table->ReadS16(&header->min_sb1) || - !table->ReadS16(&header->min_sb2) || - !table->ReadS16(&header->max_extent) || - !table->ReadS16(&header->caret_slope_rise) || - !table->ReadS16(&header->caret_slope_run) || - !table->ReadS16(&header->caret_offset)) { - return OTS_FAILURE_MSG("Failed to read metrics header"); +bool OpenTypeMetricsHeader::Parse(const uint8_t *data, size_t length) { + Buffer table(data, length); + + // Skip already read version. + if (!table.Skip(4)) { + return false; + } + + if (!table.ReadS16(&this->ascent) || + !table.ReadS16(&this->descent) || + !table.ReadS16(&this->linegap) || + !table.ReadU16(&this->adv_width_max) || + !table.ReadS16(&this->min_sb1) || + !table.ReadS16(&this->min_sb2) || + !table.ReadS16(&this->max_extent) || + !table.ReadS16(&this->caret_slope_rise) || + !table.ReadS16(&this->caret_slope_run) || + !table.ReadS16(&this->caret_offset)) { + return Error("Failed to read table"); } - if (header->ascent < 0) { - OTS_WARNING("bad ascent: %d", header->ascent); - header->ascent = 0; + if (this->ascent < 0) { + Warning("bad ascent: %d", this->ascent); + this->ascent = 0; } - if (header->linegap < 0) { - OTS_WARNING("bad linegap: %d", header->linegap); - header->linegap = 0; + if (this->linegap < 0) { + Warning("bad linegap: %d", this->linegap); + this->linegap = 0; } - if (!font->head) { - return OTS_FAILURE_MSG("Missing head font table"); + OpenTypeHEAD *head = static_cast<OpenTypeHEAD*>( + GetFont()->GetTypedTable(OTS_TAG_HEAD)); + if (!head) { + return Error("Missing head font table"); } // if the font is non-slanted, caret_offset should be zero. - if (!(font->head->mac_style & 2) && - (header->caret_offset != 0)) { - OTS_WARNING("bad caret offset: %d", header->caret_offset); - header->caret_offset = 0; + if (!(head->mac_style & 2) && + (this->caret_offset != 0)) { + Warning("bad caret offset: %d", this->caret_offset); + this->caret_offset = 0; } // skip the reserved bytes - if (!table->Skip(8)) { - return OTS_FAILURE_MSG("Failed to skip reserverd bytes"); + if (!table.Skip(8)) { + return Error("Failed to read reserverd bytes"); } int16_t data_format; - if (!table->ReadS16(&data_format)) { - return OTS_FAILURE_MSG("Failed to read data format"); + if (!table.ReadS16(&data_format)) { + return Error("Failed to read metricDataFormat"); } if (data_format) { - return OTS_FAILURE_MSG("Bad data format %d", data_format); + return Error("Bad metricDataFormat: %d", data_format); } - if (!table->ReadU16(&header->num_metrics)) { - return OTS_FAILURE_MSG("Failed to read number of metrics"); + if (!table.ReadU16(&this->num_metrics)) { + return Error("Failed to read number of metrics"); } - if (!font->maxp) { - return OTS_FAILURE_MSG("Missing maxp font table"); + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return Error("Missing maxp font table"); } - if (header->num_metrics > font->maxp->num_glyphs) { - return OTS_FAILURE_MSG("Bad number of metrics %d", header->num_metrics); + if (this->num_metrics > maxp->num_glyphs) { + return Error("Bad number of metrics %d", this->num_metrics); } return true; } -bool SerialiseMetricsHeader(const ots::Font *font, - OTSStream *out, - const OpenTypeMetricsHeader *header) { - if (!out->WriteU32(header->version) || - !out->WriteS16(header->ascent) || - !out->WriteS16(header->descent) || - !out->WriteS16(header->linegap) || - !out->WriteU16(header->adv_width_max) || - !out->WriteS16(header->min_sb1) || - !out->WriteS16(header->min_sb2) || - !out->WriteS16(header->max_extent) || - !out->WriteS16(header->caret_slope_rise) || - !out->WriteS16(header->caret_slope_run) || - !out->WriteS16(header->caret_offset) || +bool OpenTypeMetricsHeader::Serialize(OTSStream *out) { + if (!out->WriteU32(this->version) || + !out->WriteS16(this->ascent) || + !out->WriteS16(this->descent) || + !out->WriteS16(this->linegap) || + !out->WriteU16(this->adv_width_max) || + !out->WriteS16(this->min_sb1) || + !out->WriteS16(this->min_sb2) || + !out->WriteS16(this->max_extent) || + !out->WriteS16(this->caret_slope_rise) || + !out->WriteS16(this->caret_slope_run) || + !out->WriteS16(this->caret_offset) || !out->WriteR64(0) || // reserved !out->WriteS16(0) || // metric data format - !out->WriteU16(header->num_metrics)) { - return OTS_FAILURE_MSG("Failed to write metrics"); + !out->WriteU16(this->num_metrics)) { + return Error("Failed to write metrics"); } return true; } -bool ParseMetricsTable(const ots::Font *font, - Buffer *table, - const uint16_t num_glyphs, - const OpenTypeMetricsHeader *header, - OpenTypeMetricsTable *metrics) { +bool OpenTypeMetricsTable::Parse(const uint8_t *data, size_t length) { + Buffer table(data, length); + + // OpenTypeMetricsHeader is a superclass of both 'hhea' and 'vhea', + // so the cast here is OK, whichever m_header_tag we have. + OpenTypeMetricsHeader *header = static_cast<OpenTypeMetricsHeader*>( + GetFont()->GetTypedTable(m_header_tag)); + if (!header) { + return Error("Required %c%c%c%c table missing", OTS_UNTAG(m_header_tag)); + } // |num_metrics| is a uint16_t, so it's bounded < 65536. This limits that // amount of memory that we'll allocate for this to a sane amount. const unsigned num_metrics = header->num_metrics; - if (num_metrics > num_glyphs) { - return OTS_FAILURE_MSG("Bad number of metrics %d", num_metrics); + OpenTypeMAXP *maxp = static_cast<OpenTypeMAXP*>( + GetFont()->GetTypedTable(OTS_TAG_MAXP)); + if (!maxp) { + return Error("Required maxp table missing"); + } + if (num_metrics > maxp->num_glyphs) { + return Error("Bad number of metrics %d", num_metrics); } if (!num_metrics) { - return OTS_FAILURE_MSG("No metrics!"); + return Error("No metrics!"); } - const unsigned num_sbs = num_glyphs - num_metrics; + const unsigned num_sbs = maxp->num_glyphs - num_metrics; - metrics->entries.reserve(num_metrics); + this->entries.reserve(num_metrics); for (unsigned i = 0; i < num_metrics; ++i) { uint16_t adv = 0; int16_t sb = 0; - if (!table->ReadU16(&adv) || !table->ReadS16(&sb)) { - return OTS_FAILURE_MSG("Failed to read metric %d", i); + if (!table.ReadU16(&adv) || !table.ReadS16(&sb)) { + return Error("Failed to read metric %d", i); } - metrics->entries.push_back(std::make_pair(adv, sb)); + this->entries.push_back(std::make_pair(adv, sb)); } - metrics->sbs.reserve(num_sbs); + this->sbs.reserve(num_sbs); for (unsigned i = 0; i < num_sbs; ++i) { int16_t sb; - if (!table->ReadS16(&sb)) { + if (!table.ReadS16(&sb)) { // Some Japanese fonts (e.g., mona.ttf) fail this test. - return OTS_FAILURE_MSG("Failed to read side bearing %d", i + num_metrics); + return Error("Failed to read side bearing %d", i + num_metrics); } - metrics->sbs.push_back(sb); + this->sbs.push_back(sb); } return true; } -bool SerialiseMetricsTable(const ots::Font *font, - OTSStream *out, - const OpenTypeMetricsTable *metrics) { - for (unsigned i = 0; i < metrics->entries.size(); ++i) { - if (!out->WriteU16(metrics->entries[i].first) || - !out->WriteS16(metrics->entries[i].second)) { - return OTS_FAILURE_MSG("Failed to write metric %d", i); +bool OpenTypeMetricsTable::Serialize(OTSStream *out) { + for (unsigned i = 0; i < this->entries.size(); ++i) { + if (!out->WriteU16(this->entries[i].first) || + !out->WriteS16(this->entries[i].second)) { + return Error("Failed to write metric %d", i); } } - for (unsigned i = 0; i < metrics->sbs.size(); ++i) { - if (!out->WriteS16(metrics->sbs[i])) { - return OTS_FAILURE_MSG("Failed to write side bearing %ld", i + metrics->entries.size()); + for (unsigned i = 0; i < this->sbs.size(); ++i) { + if (!out->WriteS16(this->sbs[i])) { + return Error("Failed to write side bearing %ld", i + this->entries.size()); } } @@ -161,5 +175,3 @@ bool SerialiseMetricsTable(const ots::Font *font, } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/metrics.h b/gfx/ots/src/metrics.h index 767be2fdb..efe14c070 100644 --- a/gfx/ots/src/metrics.h +++ b/gfx/ots/src/metrics.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -13,7 +13,14 @@ namespace ots { -struct OpenTypeMetricsHeader { +class OpenTypeMetricsHeader : public Table { + public: + explicit OpenTypeMetricsHeader(Font *font, uint32_t tag, uint32_t type) + : Table(font, tag, type) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + uint32_t version; int16_t ascent; int16_t descent; @@ -28,27 +35,22 @@ struct OpenTypeMetricsHeader { uint16_t num_metrics; }; -struct OpenTypeMetricsTable { +struct OpenTypeMetricsTable : public Table { + public: + explicit OpenTypeMetricsTable(Font *font, uint32_t tag, uint32_t type, + uint32_t header_tag) + : Table(font, tag, type), m_header_tag(header_tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + + private: + uint32_t m_header_tag; + std::vector<std::pair<uint16_t, int16_t> > entries; std::vector<int16_t> sbs; }; -bool ParseMetricsHeader(Font *font, Buffer *table, - OpenTypeMetricsHeader *header); -bool SerialiseMetricsHeader(const ots::Font *font, - OTSStream *out, - const OpenTypeMetricsHeader *header); - -bool ParseMetricsTable(const ots::Font *font, - Buffer *table, - const uint16_t num_glyphs, - const OpenTypeMetricsHeader *header, - OpenTypeMetricsTable *metrics); -bool SerialiseMetricsTable(const ots::Font *font, - OTSStream *out, - const OpenTypeMetricsTable *metrics); - } // namespace ots #endif // OTS_METRICS_H_ - diff --git a/gfx/ots/src/moz.build b/gfx/ots/src/moz.build index f8e60d5f8..962a86a5b 100644 --- a/gfx/ots/src/moz.build +++ b/gfx/ots/src/moz.build @@ -9,41 +9,52 @@ EXPORTS += [ '../include/ots-memory-stream.h', ] -SOURCES += [ - # don't unify sources that use a (file-specific) DROP_THIS_TABLE macro - 'gasp.cc', - 'gdef.cc', - 'gpos.cc', - 'gsub.cc', - 'hdmx.cc', - 'kern.cc', - 'ltsh.cc', - 'math.cc', - 'vdmx.cc', - 'vorg.cc', -] - UNIFIED_SOURCES += [ + 'avar.cc', 'cff.cc', - 'cff_type2_charstring.cc', + 'cff_charstring.cc', 'cmap.cc', + 'cvar.cc', 'cvt.cc', + 'feat.cc', 'fpgm.cc', + 'fvar.cc', + 'gasp.cc', + 'gdef.cc', + 'glat.cc', + 'gloc.cc', 'glyf.cc', + 'gpos.cc', + 'gsub.cc', + 'gvar.cc', + 'hdmx.cc', 'head.cc', 'hhea.cc', 'hmtx.cc', + 'hvar.cc', + 'kern.cc', 'layout.cc', 'loca.cc', + 'ltsh.cc', + 'math.cc', 'maxp.cc', 'metrics.cc', + 'mvar.cc', 'name.cc', 'os2.cc', 'ots.cc', 'post.cc', 'prep.cc', + 'sile.cc', + 'silf.cc', + 'sill.cc', + 'stat.cc', + 'variations.cc', + 'vdmx.cc', 'vhea.cc', 'vmtx.cc', + 'vorg.cc', + 'vvar.cc', ] # We allow warnings for third-party code that can be updated from upstream. @@ -53,8 +64,14 @@ FINAL_LIBRARY = 'gkmedias' DEFINES['PACKAGE_VERSION'] = '"moz"' DEFINES['PACKAGE_BUGREPORT'] = '"http://bugzilla.mozilla.org/"' +DEFINES['OTS_GRAPHITE'] = 1 +DEFINES['OTS_VARIATIONS'] = 1 USE_LIBS += [ 'brotli', 'woff2', ] + +LOCAL_INCLUDES += [ + '/modules/woff2/src', +] diff --git a/gfx/ots/src/mvar.cc b/gfx/ots/src/mvar.cc new file mode 100644 index 000000000..d021203d3 --- /dev/null +++ b/gfx/ots/src/mvar.cc @@ -0,0 +1,105 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "mvar.h" + +#include "variations.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeMVAR +// ----------------------------------------------------------------------------- + +bool OpenTypeMVAR::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + + uint16_t majorVersion; + uint16_t minorVersion; + uint16_t reserved; + uint16_t valueRecordSize; + uint16_t valueRecordCount; + uint16_t itemVariationStoreOffset; + + if (!table.ReadU16(&majorVersion) || + !table.ReadU16(&minorVersion) || + !table.ReadU16(&reserved) || + !table.ReadU16(&valueRecordSize) || + !table.ReadU16(&valueRecordCount) || + !table.ReadU16(&itemVariationStoreOffset)) { + return DropVariations("Failed to read table header"); + } + + if (majorVersion != 1) { + return DropVariations("Unknown table version"); + } + + if (reserved != 0) { + Warning("Expected reserved=0"); + } + + // The spec says that valueRecordSize "must be greater than zero", + // but we don't enforce this in the case where valueRecordCount + // is zero. + // The minimum size for a valueRecord to be valid is 8, for the + // three fields currently defined in the record (see below). + if (valueRecordSize < 8) { + if (valueRecordCount != 0) { + return DropVariations("Value record size too small"); + } + } + + if (valueRecordCount == 0) { + if (itemVariationStoreOffset != 0) { + // The spec says "if valueRecordCount is zero, set to zero", + // but having a variation store even when record count is zero + // should be harmless -- it just won't be useful for anything. + // But we don't need to reject altogether. + Warning("Unexpected item variation store"); + } + } else { + if (itemVariationStoreOffset < table.offset() || itemVariationStoreOffset > length) { + return DropVariations("Invalid item variation store offset"); + } + if (!ParseItemVariationStore(GetFont(), data + itemVariationStoreOffset, + length - itemVariationStoreOffset)) { + return DropVariations("Failed to parse item variation store"); + } + } + + uint32_t prevTag = 0; + size_t offset = table.offset(); + for (unsigned i = 0; i < valueRecordCount; i++) { + uint32_t tag; + uint16_t deltaSetOuterIndex, deltaSetInnerIndex; + if (!table.ReadU32(&tag) || + !table.ReadU16(&deltaSetOuterIndex) || + !table.ReadU16(&deltaSetInnerIndex)) { + return DropVariations("Failed to read value record"); + } + if (tag <= prevTag) { + return DropVariations("Invalid or out-of-order value tag"); + } + prevTag = tag; + // Adjust offset in case additional fields have been added to the + // valueRecord by a new minor version (allowed by spec). + offset += valueRecordSize; + table.set_offset(offset); + } + + this->m_data = data; + this->m_length = length; + + return true; +} + +bool OpenTypeMVAR::Serialize(OTSStream* out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write MVAR table"); + } + + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/mvar.h b/gfx/ots/src/mvar.h new file mode 100644 index 000000000..81fb6155d --- /dev/null +++ b/gfx/ots/src/mvar.h @@ -0,0 +1,31 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_MVAR_H_ +#define OTS_MVAR_H_ + +#include "ots.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeMVAR Interface +// ----------------------------------------------------------------------------- + +class OpenTypeMVAR : public Table { + public: + explicit OpenTypeMVAR(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + const uint8_t *m_data; + size_t m_length; +}; + +} // namespace ots + +#endif // OTS_MVAR_H_ diff --git a/gfx/ots/src/name.cc b/gfx/ots/src/name.cc index e55be7537..11deeecaa 100644 --- a/gfx/ots/src/name.cc +++ b/gfx/ots/src/name.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,8 +10,6 @@ // name - Naming Table // http://www.microsoft.com/typography/otspec/name.htm -#define TABLE_NAME "name" - namespace { bool ValidInPsName(char c) { @@ -56,25 +54,22 @@ void AssignToUtf16BeFromAscii(std::string* target, namespace ots { -bool ots_name_parse(Font *font, const uint8_t* data, size_t length) { +bool OpenTypeNAME::Parse(const uint8_t* data, size_t length) { Buffer table(data, length); - OpenTypeNAME* name = new OpenTypeNAME; - font->name = name; - uint16_t format = 0; if (!table.ReadU16(&format) || format > 1) { - return OTS_FAILURE_MSG("Failed to read name table format or bad format %d", format); + return Error("Failed to read table format or bad format %d", format); } uint16_t count = 0; if (!table.ReadU16(&count)) { - return OTS_FAILURE_MSG("Failed to read name count"); + return Error("Failed to read name count"); } uint16_t string_offset = 0; if (!table.ReadU16(&string_offset) || string_offset > length) { - return OTS_FAILURE_MSG("Failed to read strings offset"); + return Error("Failed to read or bad stringOffset"); } const char* string_base = reinterpret_cast<const char*>(data) + string_offset; @@ -94,7 +89,7 @@ bool ots_name_parse(Font *font, const uint8_t* data, size_t length) { !table.ReadU16(&rec.name_id) || !table.ReadU16(&name_length) || !table.ReadU16(&name_offset)) { - return OTS_FAILURE_MSG("Failed to read name entry %d", i); + return Error("Failed to read name entry %d", i); } // check platform & encoding, discard names with unknown values switch (rec.platform_id) { @@ -148,40 +143,49 @@ bool ots_name_parse(Font *font, const uint8_t* data, size_t length) { } } - if (!name->names.empty() && !(name->names.back() < rec)) { - OTS_WARNING("name records are not sorted."); + if (!this->names.empty() && !(this->names.back() < rec)) { + Warning("name records are not sorted."); sort_required = true; } - name->names.push_back(rec); + this->names.push_back(rec); + this->name_ids.insert(rec.name_id); } if (format == 1) { // extended name table format with language tags uint16_t lang_tag_count; if (!table.ReadU16(&lang_tag_count)) { - return OTS_FAILURE_MSG("Failed to read language tag count"); + return Error("Failed to read langTagCount"); } for (unsigned i = 0; i < lang_tag_count; ++i) { uint16_t tag_length = 0; uint16_t tag_offset = 0; if (!table.ReadU16(&tag_length) || !table.ReadU16(&tag_offset)) { - return OTS_FAILURE_MSG("Faile to read tag length or offset"); + return Error("Faile to read length or offset for langTagRecord %d", i); } const unsigned tag_end = static_cast<unsigned>(string_offset) + tag_offset + tag_length; if (tag_end > length) { - return OTS_FAILURE_MSG("bad end of tag %d > %ld for name entry %d", tag_end, length, i); + return Error("bad end of tag %d > %ld for langTagRecord %d", tag_end, length, i); + } + // Lang tag is BCP 47 tag per the spec, the recommonded BCP 47 max tag + // length is 35: + // https://tools.ietf.org/html/bcp47#section-4.4.1 + // We are being too generous and allowing for 100 (multiplied by 2 since + // this is UTF-16 string). + if (tag_length > 100 * 2) { + return Error("Too long language tag for LangTagRecord %d: %d", i, tag_length); } std::string tag(string_base + tag_offset, tag_length); - name->lang_tags.push_back(tag); + this->lang_tags.push_back(tag); } } if (table.offset() > string_offset) { // the string storage apparently overlapped the name/tag records; // consider this font to be badly broken - return OTS_FAILURE_MSG("Bad table offset %ld > %d", table.offset(), string_offset); + return Error("Bad table offset %ld > %d", table.offset(), string_offset); } // check existence of required name strings (synthesize if necessary) @@ -207,17 +211,16 @@ bool ots_name_parse(Font *font, const uint8_t* data, size_t length) { // if not, we'll add our fixed versions here bool mac_name[kStdNameCount] = { 0 }; bool win_name[kStdNameCount] = { 0 }; - for (std::vector<NameRecord>::iterator name_iter = name->names.begin(); - name_iter != name->names.end(); ++name_iter) { - const uint16_t id = name_iter->name_id; + for (const auto& name : this->names) { + const uint16_t id = name.name_id; if (id >= kStdNameCount || kStdNames[id] == NULL) { continue; } - if (name_iter->platform_id == 1) { + if (name.platform_id == 1) { mac_name[id] = true; continue; } - if (name_iter->platform_id == 3) { + if (name.platform_id == 3) { win_name[id] = true; continue; } @@ -236,49 +239,41 @@ bool ots_name_parse(Font *font, const uint8_t* data, size_t length) { 1033 /* language_id */ , i /* name_id */); AssignToUtf16BeFromAscii(&win_rec.text, std::string(kStdNames[i])); - name->names.push_back(mac_rec); - name->names.push_back(win_rec); + this->names.push_back(mac_rec); + this->names.push_back(win_rec); sort_required = true; } } if (sort_required) { - std::sort(name->names.begin(), name->names.end()); + std::sort(this->names.begin(), this->names.end()); } return true; } -bool ots_name_should_serialise(Font *font) { - return font->name != NULL; -} - -bool ots_name_serialise(OTSStream* out, Font *font) { - const OpenTypeNAME* name = font->name; - - uint16_t name_count = static_cast<uint16_t>(name->names.size()); - uint16_t lang_tag_count = static_cast<uint16_t>(name->lang_tags.size()); +bool OpenTypeNAME::Serialize(OTSStream* out) { + uint16_t name_count = static_cast<uint16_t>(this->names.size()); + uint16_t lang_tag_count = static_cast<uint16_t>(this->lang_tags.size()); uint16_t format = 0; size_t string_offset = 6 + name_count * 12; - if (name->lang_tags.size() > 0) { + if (this->lang_tags.size() > 0) { // lang tags require a format-1 name table format = 1; string_offset += 2 + lang_tag_count * 4; } if (string_offset > 0xffff) { - return OTS_FAILURE_MSG("Bad string offset %ld", string_offset); + return Error("Bad stringOffset: %ld", string_offset); } if (!out->WriteU16(format) || !out->WriteU16(name_count) || !out->WriteU16(static_cast<uint16_t>(string_offset))) { - return OTS_FAILURE_MSG("Failed to write name header"); + return Error("Failed to write name header"); } std::string string_data; - for (std::vector<NameRecord>::const_iterator name_iter = name->names.begin(); - name_iter != name->names.end(); ++name_iter) { - const NameRecord& rec = *name_iter; + for (const auto& rec : this->names) { if (string_data.size() + rec.text.size() > std::numeric_limits<uint16_t>::max() || !out->WriteU16(rec.platform_id) || @@ -287,44 +282,77 @@ bool ots_name_serialise(OTSStream* out, Font *font) { !out->WriteU16(rec.name_id) || !out->WriteU16(static_cast<uint16_t>(rec.text.size())) || !out->WriteU16(static_cast<uint16_t>(string_data.size())) ) { - return OTS_FAILURE_MSG("Faile to write name entry"); + return Error("Faile to write nameRecord"); } string_data.append(rec.text); } if (format == 1) { if (!out->WriteU16(lang_tag_count)) { - return OTS_FAILURE_MSG("Faile to write language tag count"); + return Error("Faile to write langTagCount"); } - for (std::vector<std::string>::const_iterator tag_iter = - name->lang_tags.begin(); - tag_iter != name->lang_tags.end(); ++tag_iter) { - if (string_data.size() + tag_iter->size() > + for (const auto& tag : this->lang_tags) { + if (string_data.size() + tag.size() > std::numeric_limits<uint16_t>::max() || - !out->WriteU16(static_cast<uint16_t>(tag_iter->size())) || + !out->WriteU16(static_cast<uint16_t>(tag.size())) || !out->WriteU16(static_cast<uint16_t>(string_data.size()))) { - return OTS_FAILURE_MSG("Failed to write string"); + return Error("Failed to write langTagRecord"); } - string_data.append(*tag_iter); + string_data.append(tag); } } if (!out->Write(string_data.data(), string_data.size())) { - return OTS_FAILURE_MSG("Faile to write string data"); + return Error("Faile to write string data"); } return true; } -void ots_name_reuse(Font *font, Font *other) { - font->name = other->name; - font->name_reused = true; -} - -void ots_name_free(Font *font) { - delete font->name; +bool OpenTypeNAME::IsValidNameId(uint16_t nameID, bool addIfMissing) { + if (addIfMissing && !this->name_ids.count(nameID)) { + bool added_unicode = false; + bool added_macintosh = false; + bool added_windows = false; + const size_t names_size = this->names.size(); // original size + for (size_t i = 0; i < names_size; ++i) switch (names[i].platform_id) { + case 0: + if (!added_unicode) { + // If there is an existing NameRecord with platform_id == 0 (Unicode), + // then add a NameRecord for the the specified nameID with arguments + // 0 (Unicode), 0 (v1.0), 0 (unspecified language). + this->names.emplace_back(0, 0, 0, nameID); + this->names.back().text = "NoName"; + added_unicode = true; + } + break; + case 1: + if (!added_macintosh) { + // If there is an existing NameRecord with platform_id == 1 (Macintosh), + // then add a NameRecord for the specified nameID with arguments + // 1 (Macintosh), 0 (Roman), 0 (English). + this->names.emplace_back(1, 0, 0, nameID); + this->names.back().text = "NoName"; + added_macintosh = true; + } + break; + case 3: + if (!added_windows) { + // If there is an existing NameRecord with platform_id == 3 (Windows), + // then add a NameRecord for the specified nameID with arguments + // 3 (Windows), 1 (UCS), 1033 (US English). + this->names.emplace_back(3, 1, 1033, nameID); + this->names.back().text = "NoName"; + added_windows = true; + } + break; + } + if (added_unicode || added_macintosh || added_windows) { + std::sort(this->names.begin(), this->names.end()); + this->name_ids.insert(nameID); + } + } + return this->name_ids.count(nameID); } } // namespace - -#undef TABLE_NAME diff --git a/gfx/ots/src/name.h b/gfx/ots/src/name.h index a11965f46..68c7ac096 100644 --- a/gfx/ots/src/name.h +++ b/gfx/ots/src/name.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,6 +9,7 @@ #include <string> #include <utility> #include <vector> +#include <unordered_set> #include "ots.h" @@ -43,9 +44,19 @@ struct NameRecord { } }; -struct OpenTypeNAME { +class OpenTypeNAME : public Table { + public: + explicit OpenTypeNAME(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool IsValidNameId(uint16_t nameID, bool addIfMissing = false); + + private: std::vector<NameRecord> names; std::vector<std::string> lang_tags; + std::unordered_set<uint16_t> name_ids; }; } // namespace ots diff --git a/gfx/ots/src/os2.cc b/gfx/ots/src/os2.cc index fd5cdd1d6..5376a1dbb 100644 --- a/gfx/ots/src/os2.cc +++ b/gfx/ots/src/os2.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,77 +10,73 @@ // OS/2 - OS/2 and Windows Metrics // http://www.microsoft.com/typography/otspec/os2.htm -#define TABLE_NAME "OS/2" - namespace ots { -bool ots_os2_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeOS2::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeOS2 *os2 = new OpenTypeOS2; - font->os2 = os2; - - if (!table.ReadU16(&os2->version) || - !table.ReadS16(&os2->avg_char_width) || - !table.ReadU16(&os2->weight_class) || - !table.ReadU16(&os2->width_class) || - !table.ReadU16(&os2->type) || - !table.ReadS16(&os2->subscript_x_size) || - !table.ReadS16(&os2->subscript_y_size) || - !table.ReadS16(&os2->subscript_x_offset) || - !table.ReadS16(&os2->subscript_y_offset) || - !table.ReadS16(&os2->superscript_x_size) || - !table.ReadS16(&os2->superscript_y_size) || - !table.ReadS16(&os2->superscript_x_offset) || - !table.ReadS16(&os2->superscript_y_offset) || - !table.ReadS16(&os2->strikeout_size) || - !table.ReadS16(&os2->strikeout_position) || - !table.ReadS16(&os2->family_class)) { - return OTS_FAILURE_MSG("Error reading basic table elements"); - } - - if (os2->version > 5) { - return OTS_FAILURE_MSG("Unsupported table version: %u", os2->version); - } - - // Follow WPF Font Selection Model's advice. - if (1 <= os2->weight_class && os2->weight_class <= 9) { - OTS_WARNING("Bad usWeightClass: %u, changing it to: %u", os2->weight_class, os2->weight_class * 100); - os2->weight_class *= 100; - } - // Ditto. - if (os2->weight_class > 999) { - OTS_WARNING("Bad usWeightClass: %u, changing it to: %d", os2->weight_class, 999); - os2->weight_class = 999; - } - - if (os2->width_class < 1) { - OTS_WARNING("Bad usWidthClass: %u, changing it to: %d", os2->width_class, 1); - os2->width_class = 1; - } else if (os2->width_class > 9) { - OTS_WARNING("Bad usWidthClass: %u, changing it to: %d", os2->width_class, 9); - os2->width_class = 9; + if (!table.ReadU16(&this->table.version) || + !table.ReadS16(&this->table.avg_char_width) || + !table.ReadU16(&this->table.weight_class) || + !table.ReadU16(&this->table.width_class) || + !table.ReadU16(&this->table.type) || + !table.ReadS16(&this->table.subscript_x_size) || + !table.ReadS16(&this->table.subscript_y_size) || + !table.ReadS16(&this->table.subscript_x_offset) || + !table.ReadS16(&this->table.subscript_y_offset) || + !table.ReadS16(&this->table.superscript_x_size) || + !table.ReadS16(&this->table.superscript_y_size) || + !table.ReadS16(&this->table.superscript_x_offset) || + !table.ReadS16(&this->table.superscript_y_offset) || + !table.ReadS16(&this->table.strikeout_size) || + !table.ReadS16(&this->table.strikeout_position) || + !table.ReadS16(&this->table.family_class)) { + return Error("Error reading basic table elements"); + } + + if (this->table.version > 5) { + return Error("Unsupported table version: %u", this->table.version); + } + + if (this->table.weight_class < 1) { + Warning("Bad usWeightClass: %u, changing it to %d", + this->table.weight_class, 1); + this->table.weight_class = 1; + } else if (this->table.weight_class > 1000) { + Warning("Bad usWeightClass: %u, changing it to %d", + this->table.weight_class, 1000); + this->table.weight_class = 1000; + } + + if (this->table.width_class < 1) { + Warning("Bad usWidthClass: %u, changing it to %d", + this->table.width_class, 1); + this->table.width_class = 1; + } else if (this->table.width_class > 9) { + Warning("Bad usWidthClass: %u, changing it to %d", + this->table.width_class, 9); + this->table.width_class = 9; } // lowest 3 bits of fsType are exclusive. - if (os2->type & 0x2) { + if (this->table.type & 0x2) { // mask bits 2 & 3. - os2->type &= 0xfff3u; - } else if (os2->type & 0x4) { + this->table.type &= 0xfff3u; + } else if (this->table.type & 0x4) { // mask bits 1 & 3. - os2->type &= 0xfff4u; - } else if (os2->type & 0x8) { + this->table.type &= 0xfff4u; + } else if (this->table.type & 0x8) { // mask bits 1 & 2. - os2->type &= 0xfff9u; + this->table.type &= 0xfff9u; } // mask reserved bits. use only 0..3, 8, 9 bits. - os2->type &= 0x30f; + this->table.type &= 0x30f; -#define SET_TO_ZERO(a, b) \ - if (os2->b < 0) { \ - OTS_WARNING("Bad " a ": %d, setting it to zero", os2->b); \ - os2->b = 0; \ +#define SET_TO_ZERO(a, b) \ + if (this->table.b < 0) { \ + Warning("Bad " a ": %d, setting it to zero", this->table.b); \ + this->table.b = 0; \ } SET_TO_ZERO("ySubscriptXSize", subscript_x_size); @@ -90,7 +86,7 @@ bool ots_os2_parse(Font *font, const uint8_t *data, size_t length) { SET_TO_ZERO("yStrikeoutSize", strikeout_size); #undef SET_TO_ZERO - static std::string panose_strings[10] = { + static const char* panose_strings[10] = { "bFamilyType", "bSerifStyle", "bWeight", @@ -103,234 +99,222 @@ bool ots_os2_parse(Font *font, const uint8_t *data, size_t length) { "bXHeight", }; for (unsigned i = 0; i < 10; ++i) { - if (!table.ReadU8(&os2->panose[i])) { - return OTS_FAILURE_MSG("Error reading PANOSE %s", panose_strings[i].c_str()); + if (!table.ReadU8(&this->table.panose[i])) { + return Error("Failed to read PANOSE %s", panose_strings[i]); } } - if (!table.ReadU32(&os2->unicode_range_1) || - !table.ReadU32(&os2->unicode_range_2) || - !table.ReadU32(&os2->unicode_range_3) || - !table.ReadU32(&os2->unicode_range_4) || - !table.ReadU32(&os2->vendor_id) || - !table.ReadU16(&os2->selection) || - !table.ReadU16(&os2->first_char_index) || - !table.ReadU16(&os2->last_char_index) || - !table.ReadS16(&os2->typo_ascender) || - !table.ReadS16(&os2->typo_descender) || - !table.ReadS16(&os2->typo_linegap) || - !table.ReadU16(&os2->win_ascent) || - !table.ReadU16(&os2->win_descent)) { - return OTS_FAILURE_MSG("Error reading more basic table fields"); + if (!table.ReadU32(&this->table.unicode_range_1) || + !table.ReadU32(&this->table.unicode_range_2) || + !table.ReadU32(&this->table.unicode_range_3) || + !table.ReadU32(&this->table.unicode_range_4) || + !table.ReadU32(&this->table.vendor_id) || + !table.ReadU16(&this->table.selection) || + !table.ReadU16(&this->table.first_char_index) || + !table.ReadU16(&this->table.last_char_index) || + !table.ReadS16(&this->table.typo_ascender) || + !table.ReadS16(&this->table.typo_descender) || + !table.ReadS16(&this->table.typo_linegap) || + !table.ReadU16(&this->table.win_ascent) || + !table.ReadU16(&this->table.win_descent)) { + return Error("Error reading more basic table fields"); } // If bit 6 is set, then bits 0 and 5 must be clear. - if (os2->selection & 0x40) { - os2->selection &= 0xffdeu; + if (this->table.selection & 0x40) { + this->table.selection &= 0xffdeu; } // the settings of bits 0 and 1 must be reflected in the macStyle bits // in the 'head' table. - if (!font->head) { - return OTS_FAILURE_MSG("Needed head table is missing from the font"); - } - if ((os2->selection & 0x1) && - !(font->head->mac_style & 0x2)) { - OTS_WARNING("adjusting Mac style (italic)"); - font->head->mac_style |= 0x2; + OpenTypeHEAD *head = static_cast<OpenTypeHEAD*>( + GetFont()->GetTypedTable(OTS_TAG_HEAD)); + + if ((this->table.selection & 0x1) && + head && !(head->mac_style & 0x2)) { + Warning("Adjusting head.macStyle (italic) to match fsSelection"); + head->mac_style |= 0x2; } - if ((os2->selection & 0x2) && - !(font->head->mac_style & 0x4)) { - OTS_WARNING("adjusting Mac style (underscore)"); - font->head->mac_style |= 0x4; + if ((this->table.selection & 0x2) && + head && !(head->mac_style & 0x4)) { + Warning("Adjusting head.macStyle (underscore) to match fsSelection"); + head->mac_style |= 0x4; } // While bit 6 on implies that bits 0 and 1 of macStyle are clear, // the reverse is not true. - if ((os2->selection & 0x40) && - (font->head->mac_style & 0x3)) { - OTS_WARNING("adjusting Mac style (regular)"); - font->head->mac_style &= 0xfffcu; + if ((this->table.selection & 0x40) && + head && (head->mac_style & 0x3)) { + Warning("Adjusting head.macStyle (regular) to match fsSelection"); + head->mac_style &= 0xfffcu; } - if ((os2->version < 4) && - (os2->selection & 0x300)) { + if ((this->table.version < 4) && + (this->table.selection & 0x300)) { // bit 8 and 9 must be unset in OS/2 table versions less than 4. - return OTS_FAILURE_MSG("Version %d incompatible with selection %d", os2->version, os2->selection); + Warning("fsSelection bits 8 and 9 must be unset for table version %d", + this->table.version); } // mask reserved bits. use only 0..9 bits. - os2->selection &= 0x3ff; + this->table.selection &= 0x3ff; - if (os2->first_char_index > os2->last_char_index) { - return OTS_FAILURE_MSG("first char index %d > last char index %d in os2", os2->first_char_index, os2->last_char_index); + if (this->table.first_char_index > this->table.last_char_index) { + Warning("usFirstCharIndex %d > usLastCharIndex %d", + this->table.first_char_index, this->table.last_char_index); + this->table.first_char_index = this->table.last_char_index; } - if (os2->typo_linegap < 0) { - OTS_WARNING("bad linegap: %d", os2->typo_linegap); - os2->typo_linegap = 0; + if (this->table.typo_linegap < 0) { + Warning("Bad sTypoLineGap, setting it to 0: %d", this->table.typo_linegap); + this->table.typo_linegap = 0; } - if (os2->version < 1) { + if (this->table.version < 1) { // http://www.microsoft.com/typography/otspec/os2ver0.htm return true; } - if (length < offsetof(OpenTypeOS2, code_page_range_2)) { - OTS_WARNING("bad version number: %u", os2->version); + if (length < offsetof(OS2Data, code_page_range_2)) { + Warning("Bad version number, setting it to 0: %u", this->table.version); // Some fonts (e.g., kredit1.ttf and quinquef.ttf) have weird version // numbers. Fix them. - os2->version = 0; + this->table.version = 0; return true; } - if (!table.ReadU32(&os2->code_page_range_1) || - !table.ReadU32(&os2->code_page_range_2)) { - return OTS_FAILURE_MSG("Failed to read codepage ranges"); + if (!table.ReadU32(&this->table.code_page_range_1) || + !table.ReadU32(&this->table.code_page_range_2)) { + return Error("Failed to read ulCodePageRange1 or ulCodePageRange2"); } - if (os2->version < 2) { + if (this->table.version < 2) { // http://www.microsoft.com/typography/otspec/os2ver1.htm return true; } - if (length < offsetof(OpenTypeOS2, max_context)) { - OTS_WARNING("bad version number: %u", os2->version); + if (length < offsetof(OS2Data, max_context)) { + Warning("Bad version number, setting it to 1: %u", this->table.version); // some Japanese fonts (e.g., mona.ttf) have weird version number. // fix them. - os2->version = 1; + this->table.version = 1; return true; } - if (!table.ReadS16(&os2->x_height) || - !table.ReadS16(&os2->cap_height) || - !table.ReadU16(&os2->default_char) || - !table.ReadU16(&os2->break_char) || - !table.ReadU16(&os2->max_context)) { - return OTS_FAILURE_MSG("Failed to read version 2-specific fields"); + if (!table.ReadS16(&this->table.x_height) || + !table.ReadS16(&this->table.cap_height) || + !table.ReadU16(&this->table.default_char) || + !table.ReadU16(&this->table.break_char) || + !table.ReadU16(&this->table.max_context)) { + return Error("Failed to read version 2-specific fields"); } - if (os2->x_height < 0) { - OTS_WARNING("bad x_height: %d", os2->x_height); - os2->x_height = 0; + if (this->table.x_height < 0) { + Warning("Bad sxHeight settig it to 0: %d", this->table.x_height); + this->table.x_height = 0; } - if (os2->cap_height < 0) { - OTS_WARNING("bad cap_height: %d", os2->cap_height); - os2->cap_height = 0; + if (this->table.cap_height < 0) { + Warning("Bad sCapHeight setting it to 0: %d", this->table.cap_height); + this->table.cap_height = 0; } - if (os2->version < 5) { + if (this->table.version < 5) { // http://www.microsoft.com/typography/otspec/os2ver4.htm return true; } - if (!table.ReadU16(&os2->lower_optical_pointsize) || - !table.ReadU16(&os2->upper_optical_pointsize)) { - return OTS_FAILURE_MSG("Failed to read version 5-specific fields"); + if (!table.ReadU16(&this->table.lower_optical_pointsize) || + !table.ReadU16(&this->table.upper_optical_pointsize)) { + return Error("Failed to read version 5-specific fields"); } - if (os2->lower_optical_pointsize > 0xFFFE) { - OTS_WARNING("'usLowerOpticalPointSize' is bigger than 0xFFFE: %d", os2->lower_optical_pointsize); - os2->lower_optical_pointsize = 0xFFFE; + if (this->table.lower_optical_pointsize > 0xFFFE) { + Warning("usLowerOpticalPointSize is bigger than 0xFFFE: %d", + this->table.lower_optical_pointsize); + this->table.lower_optical_pointsize = 0xFFFE; } - if (os2->upper_optical_pointsize < 2) { - OTS_WARNING("'usUpperOpticalPointSize' is lower than 2: %d", os2->upper_optical_pointsize); - os2->upper_optical_pointsize = 2; + if (this->table.upper_optical_pointsize < 2) { + Warning("usUpperOpticalPointSize is lower than 2: %d", + this->table.upper_optical_pointsize); + this->table.upper_optical_pointsize = 2; } return true; } -bool ots_os2_should_serialise(Font *font) { - return font->os2 != NULL; -} - -bool ots_os2_serialise(OTSStream *out, Font *font) { - const OpenTypeOS2 *os2 = font->os2; - - if (!out->WriteU16(os2->version) || - !out->WriteS16(os2->avg_char_width) || - !out->WriteU16(os2->weight_class) || - !out->WriteU16(os2->width_class) || - !out->WriteU16(os2->type) || - !out->WriteS16(os2->subscript_x_size) || - !out->WriteS16(os2->subscript_y_size) || - !out->WriteS16(os2->subscript_x_offset) || - !out->WriteS16(os2->subscript_y_offset) || - !out->WriteS16(os2->superscript_x_size) || - !out->WriteS16(os2->superscript_y_size) || - !out->WriteS16(os2->superscript_x_offset) || - !out->WriteS16(os2->superscript_y_offset) || - !out->WriteS16(os2->strikeout_size) || - !out->WriteS16(os2->strikeout_position) || - !out->WriteS16(os2->family_class)) { - return OTS_FAILURE_MSG("Failed to write basic OS2 information"); +bool OpenTypeOS2::Serialize(OTSStream *out) { + if (!out->WriteU16(this->table.version) || + !out->WriteS16(this->table.avg_char_width) || + !out->WriteU16(this->table.weight_class) || + !out->WriteU16(this->table.width_class) || + !out->WriteU16(this->table.type) || + !out->WriteS16(this->table.subscript_x_size) || + !out->WriteS16(this->table.subscript_y_size) || + !out->WriteS16(this->table.subscript_x_offset) || + !out->WriteS16(this->table.subscript_y_offset) || + !out->WriteS16(this->table.superscript_x_size) || + !out->WriteS16(this->table.superscript_y_size) || + !out->WriteS16(this->table.superscript_x_offset) || + !out->WriteS16(this->table.superscript_y_offset) || + !out->WriteS16(this->table.strikeout_size) || + !out->WriteS16(this->table.strikeout_position) || + !out->WriteS16(this->table.family_class)) { + return Error("Failed to write basic table data"); } for (unsigned i = 0; i < 10; ++i) { - if (!out->Write(&os2->panose[i], 1)) { - return OTS_FAILURE_MSG("Failed to write os2 panose information"); + if (!out->Write(&this->table.panose[i], 1)) { + return Error("Failed to write PANOSE data"); } } - if (!out->WriteU32(os2->unicode_range_1) || - !out->WriteU32(os2->unicode_range_2) || - !out->WriteU32(os2->unicode_range_3) || - !out->WriteU32(os2->unicode_range_4) || - !out->WriteU32(os2->vendor_id) || - !out->WriteU16(os2->selection) || - !out->WriteU16(os2->first_char_index) || - !out->WriteU16(os2->last_char_index) || - !out->WriteS16(os2->typo_ascender) || - !out->WriteS16(os2->typo_descender) || - !out->WriteS16(os2->typo_linegap) || - !out->WriteU16(os2->win_ascent) || - !out->WriteU16(os2->win_descent)) { - return OTS_FAILURE_MSG("Failed to write version 1-specific fields"); + if (!out->WriteU32(this->table.unicode_range_1) || + !out->WriteU32(this->table.unicode_range_2) || + !out->WriteU32(this->table.unicode_range_3) || + !out->WriteU32(this->table.unicode_range_4) || + !out->WriteU32(this->table.vendor_id) || + !out->WriteU16(this->table.selection) || + !out->WriteU16(this->table.first_char_index) || + !out->WriteU16(this->table.last_char_index) || + !out->WriteS16(this->table.typo_ascender) || + !out->WriteS16(this->table.typo_descender) || + !out->WriteS16(this->table.typo_linegap) || + !out->WriteU16(this->table.win_ascent) || + !out->WriteU16(this->table.win_descent)) { + return Error("Failed to write version 1-specific fields"); } - if (os2->version < 1) { + if (this->table.version < 1) { return true; } - if (!out->WriteU32(os2->code_page_range_1) || - !out->WriteU32(os2->code_page_range_2)) { - return OTS_FAILURE_MSG("Failed to write codepage ranges"); + if (!out->WriteU32(this->table.code_page_range_1) || + !out->WriteU32(this->table.code_page_range_2)) { + return Error("Failed to write codepage ranges"); } - if (os2->version < 2) { + if (this->table.version < 2) { return true; } - if (!out->WriteS16(os2->x_height) || - !out->WriteS16(os2->cap_height) || - !out->WriteU16(os2->default_char) || - !out->WriteU16(os2->break_char) || - !out->WriteU16(os2->max_context)) { - return OTS_FAILURE_MSG("Failed to write version 2-specific fields"); + if (!out->WriteS16(this->table.x_height) || + !out->WriteS16(this->table.cap_height) || + !out->WriteU16(this->table.default_char) || + !out->WriteU16(this->table.break_char) || + !out->WriteU16(this->table.max_context)) { + return Error("Failed to write version 2-specific fields"); } - if (os2->version < 5) { + if (this->table.version < 5) { return true; } - if (!out->WriteU16(os2->lower_optical_pointsize) || - !out->WriteU16(os2->upper_optical_pointsize)) { - return OTS_FAILURE_MSG("Failed to write version 5-specific fields"); + if (!out->WriteU16(this->table.lower_optical_pointsize) || + !out->WriteU16(this->table.upper_optical_pointsize)) { + return Error("Failed to write version 5-specific fields"); } return true; } -void ots_os2_reuse(Font *font, Font *other) { - font->os2 = other->os2; - font->os2_reused = true; -} - -void ots_os2_free(Font *font) { - delete font->os2; -} - } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/os2.h b/gfx/ots/src/os2.h index 01511c5dc..b3f1bad9b 100644 --- a/gfx/ots/src/os2.h +++ b/gfx/ots/src/os2.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,7 +9,7 @@ namespace ots { -struct OpenTypeOS2 { +struct OS2Data { uint16_t version; int16_t avg_char_width; uint16_t weight_class; @@ -51,6 +51,17 @@ struct OpenTypeOS2 { uint16_t upper_optical_pointsize; }; +class OpenTypeOS2 : public Table { + public: + explicit OpenTypeOS2(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + + OS2Data table; +}; + } // namespace ots #endif // OTS_OS2_H_ diff --git a/gfx/ots/src/ots.cc b/gfx/ots/src/ots.cc index 15794475a..38d97a9ed 100644 --- a/gfx/ots/src/ots.cc +++ b/gfx/ots/src/ots.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -14,25 +14,75 @@ #include <map> #include <vector> -#include "woff2_dec.h" +#include <woff2/decode.h> // The OpenType Font File -// http://www.microsoft.com/typography/otspec/cmap.htm +// http://www.microsoft.com/typography/otspec/otff.htm + +#include "avar.h" +#include "cff.h" +#include "cmap.h" +#include "cvar.h" +#include "cvt.h" +#include "fpgm.h" +#include "fvar.h" +#include "gasp.h" +#include "gdef.h" +#include "glyf.h" +#include "gpos.h" +#include "gsub.h" +#include "gvar.h" +#include "hdmx.h" +#include "head.h" +#include "hhea.h" +#include "hmtx.h" +#include "hvar.h" +#include "kern.h" +#include "loca.h" +#include "ltsh.h" +#include "math_.h" +#include "maxp.h" +#include "mvar.h" +#include "name.h" +#include "os2.h" +#include "ots.h" +#include "post.h" +#include "prep.h" +#include "stat.h" +#include "vdmx.h" +#include "vhea.h" +#include "vmtx.h" +#include "vorg.h" +#include "vvar.h" + +// Graphite tables +#ifdef OTS_GRAPHITE +#include "feat.h" +#include "glat.h" +#include "gloc.h" +#include "sile.h" +#include "silf.h" +#include "sill.h" +#endif -namespace { +namespace ots { -// Generate a message with or without a table tag, when 'header' is the OpenTypeFile pointer -#define OTS_FAILURE_MSG_TAG(msg_,tag_) OTS_FAILURE_MSG_TAG_(header, msg_, tag_) -#define OTS_FAILURE_MSG_HDR(msg_) OTS_FAILURE_MSG_(header, msg_) -#define OTS_WARNING_MSG_HDR(msg_) OTS_WARNING_MSG_(header, msg_) +struct Arena { + public: + ~Arena() { + for (auto& hunk : hunks_) { + delete[] hunk; + } + } + uint8_t* Allocate(size_t length) { + uint8_t* p = new uint8_t[length]; + hunks_.push_back(p); + return p; + } -struct OpenTypeTable { - uint32_t tag; - uint32_t chksum; - uint32_t offset; - uint32_t length; - uint32_t uncompressed_length; + private: + std::vector<uint8_t*> hunks_; }; bool CheckTag(uint32_t tag_value) { @@ -46,99 +96,83 @@ bool CheckTag(uint32_t tag_value) { return true; } -struct Arena { - public: - ~Arena() { - for (std::vector<uint8_t*>::iterator - i = hunks_.begin(); i != hunks_.end(); ++i) { - delete[] *i; - } - } +}; // namespace ots - uint8_t* Allocate(size_t length) { - uint8_t* p = new uint8_t[length]; - hunks_.push_back(p); - return p; - } +namespace { + +#define OTS_MSG_TAG_(level,otf_,msg_,tag_) \ + (OTS_MESSAGE_(level,otf_,"%c%c%c%c: %s", OTS_UNTAG(tag_), msg_), false) + +// Generate a message with or without a table tag, when 'header' is the FontFile pointer +#define OTS_FAILURE_MSG_TAG(msg_,tag_) OTS_MSG_TAG_(0, header, msg_, tag_) +#define OTS_FAILURE_MSG_HDR(...) OTS_FAILURE_MSG_(header, __VA_ARGS__) +#define OTS_WARNING_MSG_HDR(...) OTS_WARNING_MSG_(header, __VA_ARGS__) - private: - std::vector<uint8_t*> hunks_; -}; const struct { uint32_t tag; - bool (*parse)(ots::Font *font, const uint8_t *data, size_t length); - bool (*serialise)(ots::OTSStream *out, ots::Font *font); - bool (*should_serialise)(ots::Font *font); - void (*reuse)(ots::Font *font, ots::Font *other); bool required; -} table_parsers[] = { - { OTS_TAG('m','a','x','p'), ots::ots_maxp_parse, ots::ots_maxp_serialise, - ots::ots_maxp_should_serialise, ots::ots_maxp_reuse, true }, - { OTS_TAG('h','e','a','d'), ots::ots_head_parse, ots::ots_head_serialise, - ots::ots_head_should_serialise, ots::ots_head_reuse, true }, - { OTS_TAG('O','S','/','2'), ots::ots_os2_parse, ots::ots_os2_serialise, - ots::ots_os2_should_serialise, ots::ots_os2_reuse, true }, - { OTS_TAG('c','m','a','p'), ots::ots_cmap_parse, ots::ots_cmap_serialise, - ots::ots_cmap_should_serialise, ots::ots_cmap_reuse, true }, - { OTS_TAG('h','h','e','a'), ots::ots_hhea_parse, ots::ots_hhea_serialise, - ots::ots_hhea_should_serialise, ots::ots_hhea_reuse, true }, - { OTS_TAG('h','m','t','x'), ots::ots_hmtx_parse, ots::ots_hmtx_serialise, - ots::ots_hmtx_should_serialise, ots::ots_hmtx_reuse, true }, - { OTS_TAG('n','a','m','e'), ots::ots_name_parse, ots::ots_name_serialise, - ots::ots_name_should_serialise, ots::ots_name_reuse, true }, - { OTS_TAG('p','o','s','t'), ots::ots_post_parse, ots::ots_post_serialise, - ots::ots_post_should_serialise, ots::ots_post_reuse, true }, - { OTS_TAG('l','o','c','a'), ots::ots_loca_parse, ots::ots_loca_serialise, - ots::ots_loca_should_serialise, ots::ots_loca_reuse, false }, - { OTS_TAG('g','l','y','f'), ots::ots_glyf_parse, ots::ots_glyf_serialise, - ots::ots_glyf_should_serialise, ots::ots_glyf_reuse, false }, - { OTS_TAG('C','F','F',' '), ots::ots_cff_parse, ots::ots_cff_serialise, - ots::ots_cff_should_serialise, ots::ots_cff_reuse, false }, - { OTS_TAG('V','D','M','X'), ots::ots_vdmx_parse, ots::ots_vdmx_serialise, - ots::ots_vdmx_should_serialise, ots::ots_vdmx_reuse, false }, - { OTS_TAG('h','d','m','x'), ots::ots_hdmx_parse, ots::ots_hdmx_serialise, - ots::ots_hdmx_should_serialise, ots::ots_hdmx_reuse, false }, - { OTS_TAG('g','a','s','p'), ots::ots_gasp_parse, ots::ots_gasp_serialise, - ots::ots_gasp_should_serialise, ots::ots_gasp_reuse, false }, - { OTS_TAG('c','v','t',' '), ots::ots_cvt_parse, ots::ots_cvt_serialise, - ots::ots_cvt_should_serialise, ots::ots_cvt_reuse, false }, - { OTS_TAG('f','p','g','m'), ots::ots_fpgm_parse, ots::ots_fpgm_serialise, - ots::ots_fpgm_should_serialise, ots::ots_fpgm_reuse, false }, - { OTS_TAG('p','r','e','p'), ots::ots_prep_parse, ots::ots_prep_serialise, - ots::ots_prep_should_serialise, ots::ots_prep_reuse, false }, - { OTS_TAG('L','T','S','H'), ots::ots_ltsh_parse, ots::ots_ltsh_serialise, - ots::ots_ltsh_should_serialise, ots::ots_ltsh_reuse, false }, - { OTS_TAG('V','O','R','G'), ots::ots_vorg_parse, ots::ots_vorg_serialise, - ots::ots_vorg_should_serialise, ots::ots_vorg_reuse, false }, - { OTS_TAG('k','e','r','n'), ots::ots_kern_parse, ots::ots_kern_serialise, - ots::ots_kern_should_serialise, ots::ots_kern_reuse, false }, +} supported_tables[] = { + { OTS_TAG_MAXP, true }, + { OTS_TAG_HEAD, true }, + { OTS_TAG_OS2, true }, + { OTS_TAG_CMAP, true }, + { OTS_TAG_HHEA, true }, + { OTS_TAG_HMTX, true }, + { OTS_TAG_NAME, true }, + { OTS_TAG_POST, true }, + { OTS_TAG_LOCA, false }, + { OTS_TAG_GLYF, false }, + { OTS_TAG_CFF, false }, + { OTS_TAG_VDMX, false }, + { OTS_TAG_HDMX, false }, + { OTS_TAG_GASP, false }, + { OTS_TAG_CVT, false }, + { OTS_TAG_FPGM, false }, + { OTS_TAG_PREP, false }, + { OTS_TAG_LTSH, false }, + { OTS_TAG_VORG, false }, + { OTS_TAG_KERN, false }, + // We need to parse fvar table before other tables that may need to know + // the number of variation axes (if any) + { OTS_TAG_FVAR, false }, + { OTS_TAG_AVAR, false }, + { OTS_TAG_CVAR, false }, + { OTS_TAG_GVAR, false }, + { OTS_TAG_HVAR, false }, + { OTS_TAG_MVAR, false }, + { OTS_TAG_STAT, false }, + { OTS_TAG_VVAR, false }, + { OTS_TAG_CFF2, false }, // We need to parse GDEF table in advance of parsing GSUB/GPOS tables // because they could refer GDEF table. - { OTS_TAG('G','D','E','F'), ots::ots_gdef_parse, ots::ots_gdef_serialise, - ots::ots_gdef_should_serialise, ots::ots_gdef_reuse, false }, - { OTS_TAG('G','P','O','S'), ots::ots_gpos_parse, ots::ots_gpos_serialise, - ots::ots_gpos_should_serialise, ots::ots_gpos_reuse, false }, - { OTS_TAG('G','S','U','B'), ots::ots_gsub_parse, ots::ots_gsub_serialise, - ots::ots_gsub_should_serialise, ots::ots_gsub_reuse, false }, - { OTS_TAG('v','h','e','a'), ots::ots_vhea_parse, ots::ots_vhea_serialise, - ots::ots_vhea_should_serialise, ots::ots_vhea_reuse, false }, - { OTS_TAG('v','m','t','x'), ots::ots_vmtx_parse, ots::ots_vmtx_serialise, - ots::ots_vmtx_should_serialise, ots::ots_vmtx_reuse, false }, - { OTS_TAG('M','A','T','H'), ots::ots_math_parse, ots::ots_math_serialise, - ots::ots_math_should_serialise, ots::ots_math_reuse, false }, - { 0, NULL, NULL, NULL, NULL, false }, + { OTS_TAG_GDEF, false }, + { OTS_TAG_GPOS, false }, + { OTS_TAG_GSUB, false }, + { OTS_TAG_VHEA, false }, + { OTS_TAG_VMTX, false }, + { OTS_TAG_MATH, false }, + // Graphite tables +#ifdef OTS_GRAPHITE + { OTS_TAG_GLOC, false }, + { OTS_TAG_GLAT, false }, + { OTS_TAG_FEAT, false }, + { OTS_TAG_SILF, false }, + { OTS_TAG_SILE, false }, + { OTS_TAG_SILL, false }, +#endif + { 0, false }, }; -bool ProcessGeneric(ots::OpenTypeFile *header, +bool ProcessGeneric(ots::FontFile *header, ots::Font *font, uint32_t signature, ots::OTSStream *output, const uint8_t *data, size_t length, - const std::vector<OpenTypeTable>& tables, + const std::vector<ots::TableEntry>& tables, ots::Buffer& file); -bool ProcessTTF(ots::OpenTypeFile *header, +bool ProcessTTF(ots::FontFile *header, ots::Font *font, ots::OTSStream *output, const uint8_t *data, size_t length, uint32_t offset = 0) { @@ -202,10 +236,10 @@ bool ProcessTTF(ots::OpenTypeFile *header, } // Next up is the list of tables. - std::vector<OpenTypeTable> tables; + std::vector<ots::TableEntry> tables; for (unsigned i = 0; i < font->num_tables; ++i) { - OpenTypeTable table; + ots::TableEntry table; if (!file.ReadU32(&table.tag) || !file.ReadU32(&table.chksum) || !file.ReadU32(&table.offset) || @@ -221,7 +255,7 @@ bool ProcessTTF(ots::OpenTypeFile *header, tables, file); } -bool ProcessTTC(ots::OpenTypeFile *header, +bool ProcessTTC(ots::FontFile *header, ots::OTSStream *output, const uint8_t *data, size_t length, @@ -308,7 +342,7 @@ bool ProcessTTC(ots::OpenTypeFile *header, } } -bool ProcessWOFF(ots::OpenTypeFile *header, +bool ProcessWOFF(ots::FontFile *header, ots::Font *font, ots::OTSStream *output, const uint8_t *data, size_t length) { ots::Buffer file(data, length); @@ -388,14 +422,14 @@ bool ProcessWOFF(ots::OpenTypeFile *header, } // Next up is the list of tables. - std::vector<OpenTypeTable> tables; + std::vector<ots::TableEntry> tables; uint32_t first_index = 0; uint32_t last_index = 0; // Size of sfnt header plus size of table records. uint64_t total_sfnt_size = 12 + 16 * font->num_tables; for (unsigned i = 0; i < font->num_tables; ++i) { - OpenTypeTable table; + ots::TableEntry table; if (!file.ReadU32(&table.tag) || !file.ReadU32(&table.offset) || !file.ReadU32(&table.length) || @@ -463,13 +497,17 @@ bool ProcessWOFF(ots::OpenTypeFile *header, return ProcessGeneric(header, font, woff_tag, output, data, length, tables, file); } -bool ProcessWOFF2(ots::OpenTypeFile *header, +bool ProcessWOFF2(ots::FontFile *header, ots::OTSStream *output, const uint8_t *data, size_t length, uint32_t index) { size_t decompressed_size = woff2::ComputeWOFF2FinalSize(data, length); + if (decompressed_size < length) { + return OTS_FAILURE_MSG_HDR("Size of decompressed WOFF 2.0 is less than compressed size"); + } + if (decompressed_size == 0) { return OTS_FAILURE_MSG_HDR("Size of decompressed WOFF 2.0 is set to 0"); } @@ -493,16 +531,16 @@ bool ProcessWOFF2(ots::OpenTypeFile *header, } } -ots::TableAction GetTableAction(ots::OpenTypeFile *header, uint32_t tag) { +ots::TableAction GetTableAction(const ots::FontFile *header, uint32_t tag) { ots::TableAction action = header->context->GetTableAction(tag); if (action == ots::TABLE_ACTION_DEFAULT) { action = ots::TABLE_ACTION_DROP; for (unsigned i = 0; ; ++i) { - if (table_parsers[i].parse == NULL) break; + if (supported_tables[i].tag == 0) break; - if (table_parsers[i].tag == tag) { + if (supported_tables[i].tag == tag) { action = ots::TABLE_ACTION_SANITIZE; break; } @@ -514,14 +552,14 @@ ots::TableAction GetTableAction(ots::OpenTypeFile *header, uint32_t tag) { } bool GetTableData(const uint8_t *data, - const OpenTypeTable& table, - Arena *arena, + const ots::TableEntry& table, + ots::Arena &arena, size_t *table_length, const uint8_t **table_data) { if (table.uncompressed_length != table.length) { // Compressed table. Need to uncompress into memory first. *table_length = table.uncompressed_length; - *table_data = (*arena).Allocate(*table_length); + *table_data = arena.Allocate(*table_length); uLongf dest_len = *table_length; int r = uncompress((Bytef*) *table_data, &dest_len, data + table.offset, table.length); @@ -537,12 +575,12 @@ bool GetTableData(const uint8_t *data, return true; } -bool ProcessGeneric(ots::OpenTypeFile *header, +bool ProcessGeneric(ots::FontFile *header, ots::Font *font, uint32_t signature, ots::OTSStream *output, const uint8_t *data, size_t length, - const std::vector<OpenTypeTable>& tables, + const std::vector<ots::TableEntry>& tables, ots::Buffer& file) { const size_t data_offset = file.offset(); @@ -560,8 +598,8 @@ bool ProcessGeneric(ots::OpenTypeFile *header, } // all tag names must be built from printable ASCII characters - if (!CheckTag(tables[i].tag)) { - return OTS_FAILURE_MSG_TAG("invalid table tag", tables[i].tag); + if (!ots::CheckTag(tables[i].tag)) { + OTS_WARNING_MSG_HDR("Invalid table tag: 0x%X", tables[i].tag); } // tables must be 4-byte aligned @@ -616,11 +654,6 @@ bool ProcessGeneric(ots::OpenTypeFile *header, return OTS_FAILURE_MSG_HDR("uncompressed sum exceeds 30MB"); } - std::map<uint32_t, OpenTypeTable> table_map; - for (unsigned i = 0; i < font->num_tables; ++i) { - table_map[tables[i].tag] = tables[i]; - } - // check that the tables are not overlapping. std::vector<std::pair<uint32_t, uint8_t> > overlap_checker; for (unsigned i = 0; i < font->num_tables; ++i) { @@ -639,80 +672,66 @@ bool ProcessGeneric(ots::OpenTypeFile *header, } } - Arena arena; + std::map<uint32_t, ots::TableEntry> table_map; + for (unsigned i = 0; i < font->num_tables; ++i) { + table_map[tables[i].tag] = tables[i]; + } + ots::Arena arena; + // Parse known tables first as we need to parse them in specific order. for (unsigned i = 0; ; ++i) { - if (table_parsers[i].parse == NULL) break; - - uint32_t tag = table_parsers[i].tag; - const std::map<uint32_t, OpenTypeTable>::const_iterator it = table_map.find(tag); + if (supported_tables[i].tag == 0) break; - ots::TableAction action = GetTableAction(header, tag); - if (it == table_map.end()) { - if (table_parsers[i].required && action == ots::TABLE_ACTION_SANITIZE) { - return OTS_FAILURE_MSG_TAG("missing required table", table_parsers[i].tag); + uint32_t tag = supported_tables[i].tag; + const auto &it = table_map.find(tag); + if (it == table_map.cend()) { + if (supported_tables[i].required) { + return OTS_FAILURE_MSG_TAG("missing required table", tag); } - continue; - } - - uint32_t input_offset = it->second.offset; - const ots::TableMap::const_iterator ot = header->tables.find(input_offset); - if (ot == header->tables.end()) { - const uint8_t* table_data; - size_t table_length; - - if (!GetTableData(data, it->second, &arena, &table_length, &table_data)) { - return OTS_FAILURE_MSG_TAG("uncompress failed", table_parsers[i].tag); + } else { + if (!font->ParseTable(it->second, data, arena)) { + return OTS_FAILURE_MSG_TAG("Failed to parse table", tag); } + } + } - if (action == ots::TABLE_ACTION_SANITIZE && - !table_parsers[i].parse(font, table_data, table_length)) { - return OTS_FAILURE(); + // Then parse any tables left. + for (const auto &table_entry : tables) { + if (!font->GetTable(table_entry.tag)) { + if (!font->ParseTable(table_entry, data, arena)) { + return OTS_FAILURE_MSG_TAG("Failed to parse table", table_entry.tag); } - } else if (action == ots::TABLE_ACTION_SANITIZE) { - table_parsers[i].reuse(font, ot->second.first); } } - if (font->cff) { + if (font->GetTable(OTS_TAG_CFF) || font->GetTable(OTS_TAG_CFF2)) { // font with PostScript glyph if (font->version != OTS_TAG('O','T','T','O')) { return OTS_FAILURE_MSG_HDR("wrong font version for PostScript glyph data"); } - if (font->glyf || font->loca) { + if (font->GetTable(OTS_TAG_GLYF) || font->GetTable(OTS_TAG_LOCA)) { // mixing outline formats is not recommended return OTS_FAILURE_MSG_HDR("font contains both PS and TT glyphs"); } } else { - if (!font->glyf || !font->loca) { + if (!font->GetTable(OTS_TAG_GLYF) || !font->GetTable(OTS_TAG_LOCA)) { // No TrueType glyph found. -#define PASSTHRU_TABLE(tag_) (table_map.find(tag_) != table_map.end() && \ - GetTableAction(header, tag_) == ots::TABLE_ACTION_PASSTHRU) - // We don't sanitise bitmap table, but don't reject bitmap-only fonts if - // we keep the tables. - if (!PASSTHRU_TABLE(OTS_TAG('C','B','D','T')) || - !PASSTHRU_TABLE(OTS_TAG('C','B','L','C'))) { + // + // We don't sanitize bitmap tables, but don’t reject bitmap-only fonts if + // we are asked to pass them thru. + // Also don’t reject if we are asked to pass glyf/loca thru. + if (!font->GetTable(OTS_TAG('C','B','D','T')) && + !font->GetTable(OTS_TAG('C','B','L','C'))) { return OTS_FAILURE_MSG_HDR("no supported glyph shapes table(s) present"); } -#undef PASSTHRU_TABLE } } uint16_t num_output_tables = 0; - for (std::map<uint32_t, OpenTypeTable>::const_iterator it = table_map.begin(); - it != table_map.end(); ++it) { - ots::TableAction action = GetTableAction(header, it->first); - if (action == ots::TABLE_ACTION_PASSTHRU) { + for (const auto &it : table_map) { + ots::Table *table = font->GetTable(it.first); + if (table != NULL && table->ShouldSerialize()) num_output_tables++; - } else { - for (unsigned i = 0; table_parsers[i].parse != NULL; ++i) { - if (table_parsers[i].tag == it->first && - table_parsers[i].should_serialise(font)) { - num_output_tables++; - break; - } - } - } } uint16_t max_pow2 = 0; @@ -738,85 +757,49 @@ bool ProcessGeneric(ots::OpenTypeFile *header, return OTS_FAILURE_MSG_HDR("error writing output"); } - std::vector<ots::OutputTable> out_tables; + std::vector<ots::TableEntry> out_tables; size_t head_table_offset = 0; - for (std::map<uint32_t, OpenTypeTable>::const_iterator it = table_map.begin(); - it != table_map.end(); ++it) { - uint32_t input_offset = it->second.offset; - const ots::TableMap::const_iterator ot = header->tables.find(input_offset); - if (ot != header->tables.end()) { - ots::OutputTable out = ot->second.second; + for (const auto &it : table_map) { + uint32_t input_offset = it.second.offset; + const auto &ot = header->table_entries.find(input_offset); + if (ot != header->table_entries.end()) { + ots::TableEntry out = ot->second; if (out.tag == OTS_TAG('h','e','a','d')) { head_table_offset = out.offset; } out_tables.push_back(out); } else { - ots::OutputTable out; - out.tag = it->first; + ots::TableEntry out; + out.tag = it.first; out.offset = output->Tell(); if (out.tag == OTS_TAG('h','e','a','d')) { head_table_offset = out.offset; } - ots::TableAction action = GetTableAction(header, it->first); - if (action == ots::TABLE_ACTION_PASSTHRU) { + ots::Table *table = font->GetTable(out.tag); + if (table != NULL && table->ShouldSerialize()) { output->ResetChecksum(); - const uint8_t* table_data; - size_t table_length; - - if (!GetTableData(data, it->second, &arena, &table_length, &table_data)) { - return OTS_FAILURE_MSG_HDR("Failed to uncompress table"); - } - - if (!output->Write(table_data, table_length)) { - return OTS_FAILURE_MSG_HDR("Failed to serialize table"); + if (!table->Serialize(output)) { + return OTS_FAILURE_MSG_TAG("Failed to serialize table", out.tag); } const size_t end_offset = output->Tell(); if (end_offset <= out.offset) { // paranoid check. |end_offset| is supposed to be greater than the offset, // as long as the Tell() interface is implemented correctly. - return OTS_FAILURE_MSG_HDR("error writing output"); + return OTS_FAILURE_MSG_TAG("Table is empty or have -ve size", out.tag); } out.length = end_offset - out.offset; // align tables to four bytes if (!output->Pad((4 - (end_offset & 3)) % 4)) { - return OTS_FAILURE_MSG_HDR("error writing output"); + return OTS_FAILURE_MSG_TAG("Failed to pad table to 4 bytes", out.tag); } out.chksum = output->chksum(); out_tables.push_back(out); - header->tables[input_offset] = std::make_pair(font, out); - } else { - for (unsigned i = 0; table_parsers[i].parse != NULL; ++i) { - if (table_parsers[i].tag == it->first && - table_parsers[i].should_serialise(font)) { - output->ResetChecksum(); - if (!table_parsers[i].serialise(output, font)) { - return OTS_FAILURE_MSG_TAG("failed to serialize table", table_parsers[i].tag); - } - - const size_t end_offset = output->Tell(); - if (end_offset <= out.offset) { - // paranoid check. |end_offset| is supposed to be greater than the offset, - // as long as the Tell() interface is implemented correctly. - return OTS_FAILURE_MSG_HDR("error writing output"); - } - out.length = end_offset - out.offset; - - // align tables to four bytes - if (!output->Pad((4 - (end_offset & 3)) % 4)) { - return OTS_FAILURE_MSG_HDR("error writing output"); - } - out.chksum = output->chksum(); - out_tables.push_back(out); - header->tables[input_offset] = std::make_pair(font, out); - - break; - } - } + header->table_entries[input_offset] = out; } } } @@ -869,6 +852,225 @@ bool ProcessGeneric(ots::OpenTypeFile *header, namespace ots { +FontFile::~FontFile() { + for (const auto& it : tables) { + delete it.second; + } + tables.clear(); +} + +bool Font::ParseTable(const TableEntry& table_entry, const uint8_t* data, + Arena &arena) { + uint32_t tag = table_entry.tag; + TableAction action = GetTableAction(file, tag); + if (action == TABLE_ACTION_DROP) { + return true; + } + + const auto &it = file->tables.find(table_entry); + if (it != file->tables.end()) { + m_tables[tag] = it->second; + return true; + } + + Table *table = NULL; + bool ret = false; + + if (action == TABLE_ACTION_PASSTHRU) { + table = new TablePassthru(this, tag); + } else { + switch (tag) { + case OTS_TAG_AVAR: table = new OpenTypeAVAR(this, tag); break; + case OTS_TAG_CFF: table = new OpenTypeCFF(this, tag); break; + case OTS_TAG_CFF2: table = new OpenTypeCFF2(this, tag); break; + case OTS_TAG_CMAP: table = new OpenTypeCMAP(this, tag); break; + case OTS_TAG_CVAR: table = new OpenTypeCVAR(this, tag); break; + case OTS_TAG_CVT: table = new OpenTypeCVT(this, tag); break; + case OTS_TAG_FPGM: table = new OpenTypeFPGM(this, tag); break; + case OTS_TAG_FVAR: table = new OpenTypeFVAR(this, tag); break; + case OTS_TAG_GASP: table = new OpenTypeGASP(this, tag); break; + case OTS_TAG_GDEF: table = new OpenTypeGDEF(this, tag); break; + case OTS_TAG_GLYF: table = new OpenTypeGLYF(this, tag); break; + case OTS_TAG_GPOS: table = new OpenTypeGPOS(this, tag); break; + case OTS_TAG_GSUB: table = new OpenTypeGSUB(this, tag); break; + case OTS_TAG_GVAR: table = new OpenTypeGVAR(this, tag); break; + case OTS_TAG_HDMX: table = new OpenTypeHDMX(this, tag); break; + case OTS_TAG_HEAD: table = new OpenTypeHEAD(this, tag); break; + case OTS_TAG_HHEA: table = new OpenTypeHHEA(this, tag); break; + case OTS_TAG_HMTX: table = new OpenTypeHMTX(this, tag); break; + case OTS_TAG_HVAR: table = new OpenTypeHVAR(this, tag); break; + case OTS_TAG_KERN: table = new OpenTypeKERN(this, tag); break; + case OTS_TAG_LOCA: table = new OpenTypeLOCA(this, tag); break; + case OTS_TAG_LTSH: table = new OpenTypeLTSH(this, tag); break; + case OTS_TAG_MATH: table = new OpenTypeMATH(this, tag); break; + case OTS_TAG_MAXP: table = new OpenTypeMAXP(this, tag); break; + case OTS_TAG_MVAR: table = new OpenTypeMVAR(this, tag); break; + case OTS_TAG_NAME: table = new OpenTypeNAME(this, tag); break; + case OTS_TAG_OS2: table = new OpenTypeOS2(this, tag); break; + case OTS_TAG_POST: table = new OpenTypePOST(this, tag); break; + case OTS_TAG_PREP: table = new OpenTypePREP(this, tag); break; + case OTS_TAG_STAT: table = new OpenTypeSTAT(this, tag); break; + case OTS_TAG_VDMX: table = new OpenTypeVDMX(this, tag); break; + case OTS_TAG_VHEA: table = new OpenTypeVHEA(this, tag); break; + case OTS_TAG_VMTX: table = new OpenTypeVMTX(this, tag); break; + case OTS_TAG_VORG: table = new OpenTypeVORG(this, tag); break; + case OTS_TAG_VVAR: table = new OpenTypeVVAR(this, tag); break; + // Graphite tables +#ifdef OTS_GRAPHITE + case OTS_TAG_FEAT: table = new OpenTypeFEAT(this, tag); break; + case OTS_TAG_GLAT: table = new OpenTypeGLAT(this, tag); break; + case OTS_TAG_GLOC: table = new OpenTypeGLOC(this, tag); break; + case OTS_TAG_SILE: table = new OpenTypeSILE(this, tag); break; + case OTS_TAG_SILF: table = new OpenTypeSILF(this, tag); break; + case OTS_TAG_SILL: table = new OpenTypeSILL(this, tag); break; +#endif + default: break; + } + } + + if (table) { + const uint8_t* table_data; + size_t table_length; + + ret = GetTableData(data, table_entry, arena, &table_length, &table_data); + if (ret) { + // FIXME: Parsing some tables will fail if the table is not added to + // m_tables first. + m_tables[tag] = table; + ret = table->Parse(table_data, table_length); + if (ret) + file->tables[table_entry] = table; + else + m_tables.erase(tag); + } + } + + if (!ret) + delete table; + + return ret; +} + +Table* Font::GetTable(uint32_t tag) const { + const auto &it = m_tables.find(tag); + if (it != m_tables.end()) + return it->second; + return NULL; +} + +Table* Font::GetTypedTable(uint32_t tag) const { + Table* t = GetTable(tag); + if (t && t->Type() == tag) + return t; + return NULL; +} + +void Font::DropGraphite() { + file->context->Message(0, "Dropping all Graphite tables"); + for (const std::pair<uint32_t, Table*> entry : m_tables) { + if (entry.first == OTS_TAG_FEAT || + entry.first == OTS_TAG_GLAT || + entry.first == OTS_TAG_GLOC || + entry.first == OTS_TAG_SILE || + entry.first == OTS_TAG_SILF || + entry.first == OTS_TAG_SILL) { + entry.second->Drop("Discarding Graphite table"); + } + } + dropped_graphite = true; +} + +void Font::DropVariations() { + file->context->Message(0, "Dropping all Variation tables"); + for (const std::pair<uint32_t, Table*> entry : m_tables) { + if (entry.first == OTS_TAG_AVAR || + entry.first == OTS_TAG_CVAR || + entry.first == OTS_TAG_FVAR || + entry.first == OTS_TAG_GVAR || + entry.first == OTS_TAG_HVAR || + entry.first == OTS_TAG_MVAR || + entry.first == OTS_TAG_STAT || + entry.first == OTS_TAG_VVAR) { + entry.second->Drop("Discarding Variations table"); + } + } + dropped_variations = true; +} + +bool Table::ShouldSerialize() { + return m_shouldSerialize; +} + +void Table::Message(int level, const char *format, va_list va) { + char msg[206] = { OTS_UNTAG(m_tag), ':', ' ' }; + std::vsnprintf(msg + 6, 200, format, va); + m_font->file->context->Message(level, msg); +} + +bool Table::Error(const char *format, ...) { + va_list va; + va_start(va, format); + Message(0, format, va); + va_end(va); + + return false; +} + +bool Table::Warning(const char *format, ...) { + va_list va; + va_start(va, format); + Message(1, format, va); + va_end(va); + + return true; +} + +bool Table::Drop(const char *format, ...) { + m_shouldSerialize = false; + + va_list va; + va_start(va, format); + Message(0, format, va); + m_font->file->context->Message(0, "Table discarded"); + va_end(va); + + return true; +} + +bool Table::DropGraphite(const char *format, ...) { + va_list va; + va_start(va, format); + Message(0, format, va); + va_end(va); + + m_font->DropGraphite(); + return true; +} + +bool Table::DropVariations(const char *format, ...) { + va_list va; + va_start(va, format); + Message(0, format, va); + va_end(va); + + m_font->DropVariations(); + return true; +} + +bool TablePassthru::Parse(const uint8_t *data, size_t length) { + m_data = data; + m_length = length; + return true; +} + +bool TablePassthru::Serialize(OTSStream *out) { + if (!out->Write(m_data, m_length)) { + return Error("Failed to write table"); + } + + return true; +} + bool IsValidVersionTag(uint32_t tag) { return tag == 0x000010000 || // OpenType fonts with CFF data have 'OTTO' tag. @@ -882,7 +1084,7 @@ bool OTSContext::Process(OTSStream *output, const uint8_t *data, size_t length, uint32_t index) { - OpenTypeFile header; + FontFile header; Font font(&header); header.context = this; diff --git a/gfx/ots/src/ots.h b/gfx/ots/src/ots.h index 2d13f8d6d..4d2be1689 100644 --- a/gfx/ots/src/ots.h +++ b/gfx/ots/src/ots.h @@ -1,10 +1,14 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef OTS_H_ #define OTS_H_ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include <stddef.h> #include <cstdarg> #include <cstddef> @@ -54,13 +58,9 @@ namespace ots { #define OTS_WARNING_MSG_(otf_,...) \ OTS_MESSAGE_(1,otf_,__VA_ARGS__) -// Generate a message with an associated table tag -#define OTS_FAILURE_MSG_TAG_(otf_,msg_,tag_) \ - (OTS_MESSAGE_(0,otf_,"%c%c%c%c: %s", OTS_UNTAG(tag_), msg_), false) - // Convenience macros for use in files that only handle a single table tag, // defined as TABLE_NAME at the top of the file; the 'file' variable is -// expected to be the current OpenTypeFile pointer. +// expected to be the current FontFile pointer. #define OTS_FAILURE_MSG(...) OTS_FAILURE_MSG_(font->file, TABLE_NAME ": " __VA_ARGS__) #define OTS_WARNING(...) OTS_WARNING_MSG_(font->file, TABLE_NAME ": " __VA_ARGS__) @@ -112,7 +112,7 @@ class Buffer { return OTS_FAILURE(); } std::memcpy(value, buffer_ + offset_, sizeof(uint16_t)); - *value = ntohs(*value); + *value = ots_ntohs(*value); offset_ += 2; return true; } @@ -137,7 +137,7 @@ class Buffer { return OTS_FAILURE(); } std::memcpy(value, buffer_ + offset_, sizeof(uint32_t)); - *value = ntohl(*value); + *value = ots_ntohl(*value); offset_ += 4; return true; } @@ -184,111 +184,175 @@ template<typename T> T Round2(T value) { return (value + 1) & ~1; } +// Check that a tag consists entirely of printable ASCII characters +bool CheckTag(uint32_t tag_value); + bool IsValidVersionTag(uint32_t tag); -#define FOR_EACH_TABLE_TYPE \ - F(cff, CFF) \ - F(cmap, CMAP) \ - F(cvt, CVT) \ - F(fpgm, FPGM) \ - F(gasp, GASP) \ - F(gdef, GDEF) \ - F(glyf, GLYF) \ - F(gpos, GPOS) \ - F(gsub, GSUB) \ - F(hdmx, HDMX) \ - F(head, HEAD) \ - F(hhea, HHEA) \ - F(hmtx, HMTX) \ - F(kern, KERN) \ - F(loca, LOCA) \ - F(ltsh, LTSH) \ - F(math, MATH) \ - F(maxp, MAXP) \ - F(name, NAME) \ - F(os2, OS2) \ - F(post, POST) \ - F(prep, PREP) \ - F(vdmx, VDMX) \ - F(vorg, VORG) \ - F(vhea, VHEA) \ - F(vmtx, VMTX) - -#define F(name, capname) struct OpenType##capname; -FOR_EACH_TABLE_TYPE -#undef F +#define OTS_TAG_CFF OTS_TAG('C','F','F',' ') +#define OTS_TAG_CFF2 OTS_TAG('C','F','F','2') +#define OTS_TAG_CMAP OTS_TAG('c','m','a','p') +#define OTS_TAG_CVT OTS_TAG('c','v','t',' ') +#define OTS_TAG_FEAT OTS_TAG('F','e','a','t') +#define OTS_TAG_FPGM OTS_TAG('f','p','g','m') +#define OTS_TAG_GASP OTS_TAG('g','a','s','p') +#define OTS_TAG_GDEF OTS_TAG('G','D','E','F') +#define OTS_TAG_GLAT OTS_TAG('G','l','a','t') +#define OTS_TAG_GLOC OTS_TAG('G','l','o','c') +#define OTS_TAG_GLYF OTS_TAG('g','l','y','f') +#define OTS_TAG_GPOS OTS_TAG('G','P','O','S') +#define OTS_TAG_GSUB OTS_TAG('G','S','U','B') +#define OTS_TAG_HDMX OTS_TAG('h','d','m','x') +#define OTS_TAG_HEAD OTS_TAG('h','e','a','d') +#define OTS_TAG_HHEA OTS_TAG('h','h','e','a') +#define OTS_TAG_HMTX OTS_TAG('h','m','t','x') +#define OTS_TAG_KERN OTS_TAG('k','e','r','n') +#define OTS_TAG_LOCA OTS_TAG('l','o','c','a') +#define OTS_TAG_LTSH OTS_TAG('L','T','S','H') +#define OTS_TAG_MATH OTS_TAG('M','A','T','H') +#define OTS_TAG_MAXP OTS_TAG('m','a','x','p') +#define OTS_TAG_NAME OTS_TAG('n','a','m','e') +#define OTS_TAG_OS2 OTS_TAG('O','S','/','2') +#define OTS_TAG_POST OTS_TAG('p','o','s','t') +#define OTS_TAG_PREP OTS_TAG('p','r','e','p') +#define OTS_TAG_SILE OTS_TAG('S','i','l','e') +#define OTS_TAG_SILF OTS_TAG('S','i','l','f') +#define OTS_TAG_SILL OTS_TAG('S','i','l','l') +#define OTS_TAG_VDMX OTS_TAG('V','D','M','X') +#define OTS_TAG_VHEA OTS_TAG('v','h','e','a') +#define OTS_TAG_VMTX OTS_TAG('v','m','t','x') +#define OTS_TAG_VORG OTS_TAG('V','O','R','G') + +#define OTS_TAG_AVAR OTS_TAG('a','v','a','r') +#define OTS_TAG_CVAR OTS_TAG('c','v','a','r') +#define OTS_TAG_FVAR OTS_TAG('f','v','a','r') +#define OTS_TAG_GVAR OTS_TAG('g','v','a','r') +#define OTS_TAG_HVAR OTS_TAG('H','V','A','R') +#define OTS_TAG_MVAR OTS_TAG('M','V','A','R') +#define OTS_TAG_VVAR OTS_TAG('V','V','A','R') +#define OTS_TAG_STAT OTS_TAG('S','T','A','T') struct Font; -struct OpenTypeFile; +struct FontFile; +struct TableEntry; +struct Arena; + +class Table { + public: + explicit Table(Font *font, uint32_t tag, uint32_t type) + : m_tag(tag), + m_type(type), + m_font(font), + m_shouldSerialize(true) { + } + + virtual ~Table() { } -#define F(name, capname) \ -bool ots_##name##_parse(Font *f, const uint8_t *d, size_t l); \ -bool ots_##name##_should_serialise(Font *f); \ -bool ots_##name##_serialise(OTSStream *s, Font *f); \ -void ots_##name##_reuse(Font *f, Font *o);\ -void ots_##name##_free(Font *f); -FOR_EACH_TABLE_TYPE -#undef F + virtual bool Parse(const uint8_t *data, size_t length) = 0; + virtual bool Serialize(OTSStream *out) = 0; + virtual bool ShouldSerialize(); + + // Return the tag (table type) this Table was parsed as, to support + // "poor man's RTTI" so that we know if we can safely down-cast to + // a specific Table subclass. The m_type field is initialized to the + // appropriate tag when a subclass is constructed, or to zero for + // TablePassthru (indicating unparsed data). + uint32_t Type() { return m_type; } + + Font* GetFont() { return m_font; } + + bool Error(const char *format, ...); + bool Warning(const char *format, ...); + bool Drop(const char *format, ...); + bool DropGraphite(const char *format, ...); + bool DropVariations(const char *format, ...); + + private: + void Message(int level, const char *format, va_list va); + + uint32_t m_tag; + uint32_t m_type; + Font *m_font; + bool m_shouldSerialize; +}; + +class TablePassthru : public Table { + public: + explicit TablePassthru(Font *font, uint32_t tag) + : Table(font, tag, 0), + m_data(NULL), + m_length(0) { + } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + + private: + const uint8_t *m_data; + size_t m_length; +}; struct Font { - explicit Font(const OpenTypeFile *f) + explicit Font(FontFile *f) : file(f), version(0), num_tables(0), search_range(0), entry_selector(0), - range_shift(0) { -#define F(name, capname) \ - name = NULL; \ - name##_reused = false; - FOR_EACH_TABLE_TYPE -#undef F + range_shift(0), + dropped_graphite(false), + dropped_variations(false) { } - ~Font() { -#define F(name, capname) \ - if (!name##_reused) {\ - ots_##name##_free(this); \ - } - FOR_EACH_TABLE_TYPE -#undef F - } + bool ParseTable(const TableEntry& tableinfo, const uint8_t* data, + Arena &arena); + Table* GetTable(uint32_t tag) const; + + // This checks that the returned Table is actually of the correct subclass + // for |tag|, so it can safely be downcast to the corresponding OpenTypeXXXX; + // if not (i.e. if the table was treated as Passthru), it will return NULL. + Table* GetTypedTable(uint32_t tag) const; + + // Drop all Graphite tables and don't parse new ones. + void DropGraphite(); - const OpenTypeFile *file; + // Drop all Variations tables and don't parse new ones. + void DropVariations(); + + FontFile *file; uint32_t version; uint16_t num_tables; uint16_t search_range; uint16_t entry_selector; uint16_t range_shift; + bool dropped_graphite; + bool dropped_variations; -#define F(name, capname) \ - OpenType##capname *name; \ - bool name##_reused; -FOR_EACH_TABLE_TYPE -#undef F + private: + std::map<uint32_t, Table*> m_tables; }; -struct OutputTable { +struct TableEntry { uint32_t tag; - size_t offset; - size_t length; + uint32_t offset; + uint32_t length; + uint32_t uncompressed_length; uint32_t chksum; - bool operator<(const OutputTable& other) const { + bool operator<(const TableEntry& other) const { return tag < other.tag; } }; -typedef std::map<uint32_t, std::pair<Font*, OutputTable> > TableMap; +struct FontFile { + ~FontFile(); -struct OpenTypeFile { OTSContext *context; - TableMap tables; + std::map<TableEntry, Table*> tables; + std::map<uint32_t, TableEntry> table_entries; }; } // namespace ots -#undef FOR_EACH_TABLE_TYPE - #endif // OTS_H_ diff --git a/gfx/ots/src/post.cc b/gfx/ots/src/post.cc index a110b2dea..704c32007 100644 --- a/gfx/ots/src/post.cc +++ b/gfx/ots/src/post.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,74 +9,73 @@ // post - PostScript // http://www.microsoft.com/typography/otspec/post.htm -#define TABLE_NAME "post" - namespace ots { -bool ots_post_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypePOST::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypePOST *post = new OpenTypePOST; - font->post = post; + if (!table.ReadU32(&this->version)) { + return Error("Failed to read table version"); + } - if (!table.ReadU32(&post->version) || - !table.ReadU32(&post->italic_angle) || - !table.ReadS16(&post->underline) || - !table.ReadS16(&post->underline_thickness) || - !table.ReadU32(&post->is_fixed_pitch)) { - return OTS_FAILURE_MSG("Failed to read post header"); + if (this->version != 0x00010000 && + this->version != 0x00020000 && + this->version != 0x00030000) { + // 0x00025000 is deprecated. We don't accept it. + return Error("Unsupported table version 0x%x", this->version); } - if (post->underline_thickness < 0) { - post->underline_thickness = 1; + if (!table.ReadU32(&this->italic_angle) || + !table.ReadS16(&this->underline) || + !table.ReadS16(&this->underline_thickness) || + !table.ReadU32(&this->is_fixed_pitch) || + // We don't care about the memory usage fields. We'll set all these to + // zero when serialising + !table.Skip(16)) { + return Error("Failed to read table header"); } - if (post->version == 0x00010000) { - return true; - } else if (post->version == 0x00030000) { + if (this->underline_thickness < 0) { + this->underline_thickness = 1; + } + + if (this->version == 0x00010000 || this->version == 0x00030000) { return true; - } else if (post->version != 0x00020000) { - // 0x00025000 is deprecated. We don't accept it. - return OTS_FAILURE_MSG("Bad post version %x", post->version); } // We have a version 2 table with a list of Pascal strings at the end - // We don't care about the memory usage fields. We'll set all these to zero - // when serialising - if (!table.Skip(16)) { - return OTS_FAILURE_MSG("Failed to skip memory usage in post table"); - } - uint16_t num_glyphs = 0; if (!table.ReadU16(&num_glyphs)) { - return OTS_FAILURE_MSG("Failed to read number of glyphs"); + return Error("Failed to read numberOfGlyphs"); } - if (!font->maxp) { - return OTS_FAILURE_MSG("No maxp table required by post table"); + OpenTypeMAXP* maxp = static_cast<OpenTypeMAXP*> + (GetFont()->GetTable(OTS_TAG_MAXP)); + if (!maxp) { + return Error("Missing required maxp table"); } if (num_glyphs == 0) { - if (font->maxp->num_glyphs > 258) { - return OTS_FAILURE_MSG("Can't have no glyphs in the post table if there are more than 256 glyphs in the font"); + if (maxp->num_glyphs > 258) { + return Error("Can't have no glyphs in the post table if there are more " + "than 258 glyphs in the font"); } - OTS_WARNING("table version is 1, but no glyf names are found"); // workaround for fonts in http://www.fontsquirrel.com/fontface // (e.g., yataghan.ttf). - post->version = 0x00010000; - return true; + this->version = 0x00010000; + return Warning("Table version is 1, but no glyph names are found"); } - if (num_glyphs != font->maxp->num_glyphs) { + if (num_glyphs != maxp->num_glyphs) { // Note: Fixedsys500c.ttf seems to have inconsistent num_glyphs values. - return OTS_FAILURE_MSG("Bad number of glyphs in post table %d", num_glyphs); + return Error("Bad number of glyphs: %d", num_glyphs); } - post->glyph_name_index.resize(num_glyphs); + this->glyph_name_index.resize(num_glyphs); for (unsigned i = 0; i < num_glyphs; ++i) { - if (!table.ReadU16(&post->glyph_name_index[i])) { - return OTS_FAILURE_MSG("Failed to read post information for glyph %d", i); + if (!table.ReadU16(&this->glyph_name_index[i])) { + return Error("Failed to read glyph name %d", i); } // Note: A strict interpretation of the specification requires name indexes // are less than 32768. This, however, excludes fonts like unifont.ttf @@ -93,101 +92,85 @@ bool ots_post_parse(Font *font, const uint8_t *data, size_t length) { if (strings == strings_end) break; const unsigned string_length = *strings; if (strings + 1 + string_length > strings_end) { - return OTS_FAILURE_MSG("Bad string length %d", string_length); + return Error("Bad string length %d", string_length); } if (std::memchr(strings + 1, '\0', string_length)) { - return OTS_FAILURE_MSG("Bad string of length %d", string_length); + return Error("Bad string of length %d", string_length); } - post->names.push_back( + this->names.push_back( std::string(reinterpret_cast<const char*>(strings + 1), string_length)); strings += 1 + string_length; } - const unsigned num_strings = post->names.size(); + const unsigned num_strings = this->names.size(); // check that all the references are within bounds for (unsigned i = 0; i < num_glyphs; ++i) { - unsigned offset = post->glyph_name_index[i]; + unsigned offset = this->glyph_name_index[i]; if (offset < 258) { continue; } offset -= 258; if (offset >= num_strings) { - return OTS_FAILURE_MSG("Bad string index %d", offset); + return Error("Bad string index %d", offset); } } return true; } -bool ots_post_should_serialise(Font *font) { - return font->post != NULL; -} - -bool ots_post_serialise(OTSStream *out, Font *font) { - const OpenTypePOST *post = font->post; - +bool OpenTypePOST::Serialize(OTSStream *out) { // OpenType with CFF glyphs must have v3 post table. - if (post && font->cff && post->version != 0x00030000) { - return OTS_FAILURE_MSG("Bad post version %x", post->version); + if (GetFont()->GetTable(OTS_TAG_CFF) && this->version != 0x00030000) { + return Error("Only version supported for fonts with CFF table is 0x00030000" + " not 0x%x", this->version); } - if (!out->WriteU32(post->version) || - !out->WriteU32(post->italic_angle) || - !out->WriteS16(post->underline) || - !out->WriteS16(post->underline_thickness) || - !out->WriteU32(post->is_fixed_pitch) || + if (!out->WriteU32(this->version) || + !out->WriteU32(this->italic_angle) || + !out->WriteS16(this->underline) || + !out->WriteS16(this->underline_thickness) || + !out->WriteU32(this->is_fixed_pitch) || !out->WriteU32(0) || !out->WriteU32(0) || !out->WriteU32(0) || !out->WriteU32(0)) { - return OTS_FAILURE_MSG("Failed to write post header"); + return Error("Failed to write post header"); } - if (post->version != 0x00020000) { + if (this->version != 0x00020000) { return true; // v1.0 and v3.0 does not have glyph names. } const uint16_t num_indexes = - static_cast<uint16_t>(post->glyph_name_index.size()); - if (num_indexes != post->glyph_name_index.size() || + static_cast<uint16_t>(this->glyph_name_index.size()); + if (num_indexes != this->glyph_name_index.size() || !out->WriteU16(num_indexes)) { - return OTS_FAILURE_MSG("Failed to write number of indices"); + return Error("Failed to write number of indices"); } for (uint16_t i = 0; i < num_indexes; ++i) { - if (!out->WriteU16(post->glyph_name_index[i])) { - return OTS_FAILURE_MSG("Failed to write name index %d", i); + if (!out->WriteU16(this->glyph_name_index[i])) { + return Error("Failed to write name index %d", i); } } // Now we just have to write out the strings in the correct order - for (unsigned i = 0; i < post->names.size(); ++i) { - const std::string& s = post->names[i]; + for (unsigned i = 0; i < this->names.size(); ++i) { + const std::string& s = this->names[i]; const uint8_t string_length = static_cast<uint8_t>(s.size()); if (string_length != s.size() || !out->Write(&string_length, 1)) { - return OTS_FAILURE_MSG("Failed to write string %d", i); + return Error("Failed to write string %d", i); } // Some ttf fonts (e.g., frank.ttf on Windows Vista) have zero-length name. // We allow them. if (string_length > 0 && !out->Write(s.data(), string_length)) { - return OTS_FAILURE_MSG("Failed to write string length for string %d", i); + return Error("Failed to write string length for string %d", i); } } return true; } -void ots_post_reuse(Font *font, Font *other) { - font->post = other->post; - font->post_reused = true; -} - -void ots_post_free(Font *font) { - delete font->post; -} - } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/post.h b/gfx/ots/src/post.h index f220d4fc7..c341e391c 100644 --- a/gfx/ots/src/post.h +++ b/gfx/ots/src/post.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -13,7 +13,15 @@ namespace ots { -struct OpenTypePOST { +class OpenTypePOST : public Table { + public: + explicit OpenTypePOST(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + +private: uint32_t version; uint32_t italic_angle; int16_t underline; diff --git a/gfx/ots/src/prep.cc b/gfx/ots/src/prep.cc index 1c9b45f91..943bb45b9 100644 --- a/gfx/ots/src/prep.cc +++ b/gfx/ots/src/prep.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,53 +7,37 @@ // prep - Control Value Program // http://www.microsoft.com/typography/otspec/prep.htm -#define TABLE_NAME "prep" - namespace ots { -bool ots_prep_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypePREP::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypePREP *prep = new OpenTypePREP; - font->prep = prep; - if (length >= 128 * 1024u) { - return OTS_FAILURE_MSG("table length %ld > 120K", length); // almost all prep tables are less than 9k bytes. + // almost all prep tables are less than 9k bytes. + return Error("Table length %ld > 120K", length); } if (!table.Skip(length)) { - return OTS_FAILURE_MSG("Failed to read table of length %ld", length); + return Error("Failed to read table of length %ld", length); } - prep->data = data; - prep->length = length; + this->m_data = data; + this->m_length = length; return true; } -bool ots_prep_should_serialise(Font *font) { - if (!font->glyf) return false; // this table is not for CFF fonts. - return font->prep != NULL; -} - -bool ots_prep_serialise(OTSStream *out, Font *font) { - const OpenTypePREP *prep = font->prep; - - if (!out->Write(prep->data, prep->length)) { - return OTS_FAILURE_MSG("Failed to write table length"); +bool OpenTypePREP::Serialize(OTSStream *out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write table length"); } return true; } -void ots_prep_reuse(Font *font, Font *other) { - font->prep = other->prep; - font->prep_reused = true; -} - -void ots_prep_free(Font *font) { - delete font->prep; +bool OpenTypePREP::ShouldSerialize() { + return Table::ShouldSerialize() && + // this table is not for CFF fonts. + GetFont()->GetTable(OTS_TAG_GLYF) != NULL; } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/prep.h b/gfx/ots/src/prep.h index 935ca111c..4d3eda2cd 100644 --- a/gfx/ots/src/prep.h +++ b/gfx/ots/src/prep.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,9 +9,18 @@ namespace ots { -struct OpenTypePREP { - const uint8_t *data; - uint32_t length; +class OpenTypePREP : public Table { + public: + explicit OpenTypePREP(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: + const uint8_t *m_data; + uint32_t m_length; }; } // namespace ots diff --git a/gfx/ots/src/sile.cc b/gfx/ots/src/sile.cc new file mode 100644 index 000000000..74405e56e --- /dev/null +++ b/gfx/ots/src/sile.cc @@ -0,0 +1,74 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "sile.h" + +namespace ots { + +bool OpenTypeSILE::Parse(const uint8_t* data, size_t length) { + if (GetFont()->dropped_graphite) { + return Drop("Skipping Graphite table"); + } + Buffer table(data, length); + + if (!table.ReadU32(&this->version) || this->version >> 16 != 1) { + return DropGraphite("Failed to read valid version"); + } + if (!table.ReadU32(&this->checksum)) { + return DropGraphite("Failed to read checksum"); + } + if (!table.ReadU32(&this->createTime[0]) || + !table.ReadU32(&this->createTime[1])) { + return DropGraphite("Failed to read createTime"); + } + if (!table.ReadU32(&this->modifyTime[0]) || + !table.ReadU32(&this->modifyTime[1])) { + return DropGraphite("Failed to read modifyTime"); + } + + if (!table.ReadU16(&this->fontNameLength)) { + return DropGraphite("Failed to read fontNameLength"); + } + //this->fontName.resize(this->fontNameLength); + for (unsigned i = 0; i < this->fontNameLength; ++i) { + this->fontName.emplace_back(); + if (!table.ReadU16(&this->fontName[i])) { + return DropGraphite("Failed to read fontName[%u]", i); + } + } + + if (!table.ReadU16(&this->fontFileLength)) { + return DropGraphite("Failed to read fontFileLength"); + } + //this->baseFile.resize(this->fontFileLength); + for (unsigned i = 0; i < this->fontFileLength; ++i) { + this->baseFile.emplace_back(); + if (!table.ReadU16(&this->baseFile[i])) { + return DropGraphite("Failed to read baseFile[%u]", i); + } + } + + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + return true; +} + +bool OpenTypeSILE::Serialize(OTSStream* out) { + if (!out->WriteU32(this->version) || + !out->WriteU32(this->checksum) || + !out->WriteU32(this->createTime[0]) || + !out->WriteU32(this->createTime[1]) || + !out->WriteU32(this->modifyTime[0]) || + !out->WriteU32(this->modifyTime[1]) || + !out->WriteU16(this->fontNameLength) || + !SerializeParts(this->fontName, out) || + !out->WriteU16(this->fontFileLength) || + !SerializeParts(this->baseFile, out)) { + return Error("Failed to write table"); + } + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/sile.h b/gfx/ots/src/sile.h new file mode 100644 index 000000000..bdb00606f --- /dev/null +++ b/gfx/ots/src/sile.h @@ -0,0 +1,36 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_SILE_H_ +#define OTS_SILE_H_ + +#include "ots.h" +#include "graphite.h" + +#include <vector> + +namespace ots { + +class OpenTypeSILE : public Table { + public: + explicit OpenTypeSILE(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + uint32_t version; + uint32_t checksum; + uint32_t createTime[2]; + uint32_t modifyTime[2]; + uint16_t fontNameLength; + std::vector<uint16_t> fontName; + uint16_t fontFileLength; + std::vector<uint16_t> baseFile; +}; + +} // namespace ots + +#endif // OTS_SILE_H_ diff --git a/gfx/ots/src/silf.cc b/gfx/ots/src/silf.cc new file mode 100644 index 000000000..fa4e59e52 --- /dev/null +++ b/gfx/ots/src/silf.cc @@ -0,0 +1,977 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "silf.h" + +#include "name.h" +#include "mozilla/Compression.h" +#include <cmath> + +namespace ots { + +bool OpenTypeSILF::Parse(const uint8_t* data, size_t length, + bool prevent_decompression) { + if (GetFont()->dropped_graphite) { + return Drop("Skipping Graphite table"); + } + Buffer table(data, length); + + if (!table.ReadU32(&this->version)) { + return DropGraphite("Failed to read version"); + } + if (this->version >> 16 != 1 && + this->version >> 16 != 2 && + this->version >> 16 != 3 && + this->version >> 16 != 4 && + this->version >> 16 != 5) { + return DropGraphite("Unsupported table version: %u", this->version >> 16); + } + if (this->version >> 16 >= 3 && !table.ReadU32(&this->compHead)) { + return DropGraphite("Failed to read compHead"); + } + if (this->version >> 16 >= 5) { + switch ((this->compHead & SCHEME) >> 27) { + case 0: // uncompressed + break; + case 1: { // lz4 + if (prevent_decompression) { + return DropGraphite("Illegal nested compression"); + } + size_t decompressed_size = this->compHead & FULL_SIZE; + if (decompressed_size < length) { + return DropGraphite("Decompressed size is less than compressed size"); + } + if (decompressed_size == 0) { + return DropGraphite("Decompressed size is set to 0"); + } + // decompressed table must be <= 30MB + if (decompressed_size > 30 * 1024 * 1024) { + return DropGraphite("Decompressed size exceeds 30MB: %gMB", + decompressed_size / (1024.0 * 1024.0)); + } + std::vector<uint8_t> decompressed(decompressed_size); + size_t outputSize = 0; + bool ret = mozilla::Compression::LZ4::decompressPartial( + reinterpret_cast<const char*>(data + table.offset()), + table.remaining(), // input buffer size (input size + padding) + reinterpret_cast<char*>(decompressed.data()), + decompressed.size(), // target output size + &outputSize); // return output size + if (!ret || outputSize != decompressed.size()) { + return DropGraphite("Decompression failed"); + } + return this->Parse(decompressed.data(), decompressed.size(), true); + } + default: + return DropGraphite("Unknown compression scheme"); + } + } + if (!table.ReadU16(&this->numSub)) { + return DropGraphite("Failed to read numSub"); + } + if (this->version >> 16 >= 2 && !table.ReadU16(&this->reserved)) { + return DropGraphite("Failed to read reserved"); + } + if (this->version >> 16 >= 2 && this->reserved != 0) { + Warning("Nonzero reserved"); + } + + unsigned long last_offset = 0; + //this->offset.resize(this->numSub); + for (unsigned i = 0; i < this->numSub; ++i) { + this->offset.emplace_back(); + if (!table.ReadU32(&this->offset[i]) || this->offset[i] < last_offset) { + return DropGraphite("Failed to read offset[%u]", i); + } + last_offset = this->offset[i]; + } + + for (unsigned i = 0; i < this->numSub; ++i) { + if (table.offset() != this->offset[i]) { + return DropGraphite("Offset check failed for tables[%lu]", i); + } + SILSub subtable(this); + if (!subtable.ParsePart(table)) { + return DropGraphite("Failed to read tables[%u]", i); + } + tables.push_back(subtable); + } + + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + return true; +} + +bool OpenTypeSILF::Serialize(OTSStream* out) { + if (!out->WriteU32(this->version) || + (this->version >> 16 >= 3 && !out->WriteU32(this->compHead)) || + !out->WriteU16(this->numSub) || + (this->version >> 16 >= 2 && !out->WriteU16(this->reserved)) || + !SerializeParts(this->offset, out) || + !SerializeParts(this->tables, out)) { + return Error("Failed to write table"); + } + return true; +} + +bool OpenTypeSILF::SILSub::ParsePart(Buffer& table) { + size_t init_offset = table.offset(); + if (parent->version >> 16 >= 3) { + if (!table.ReadU32(&this->ruleVersion)) { + return parent->Error("SILSub: Failed to read ruleVersion"); + } + if (!table.ReadU16(&this->passOffset)) { + return parent->Error("SILSub: Failed to read passOffset"); + } + if (!table.ReadU16(&this->pseudosOffset)) { + return parent->Error("SILSub: Failed to read pseudosOffset"); + } + } + if (!table.ReadU16(&this->maxGlyphID)) { + return parent->Error("SILSub: Failed to read maxGlyphID"); + } + if (!table.ReadS16(&this->extraAscent)) { + return parent->Error("SILSub: Failed to read extraAscent"); + } + if (!table.ReadS16(&this->extraDescent)) { + return parent->Error("SILSub: Failed to read extraDescent"); + } + if (!table.ReadU8(&this->numPasses)) { + return parent->Error("SILSub: Failed to read numPasses"); + } + if (!table.ReadU8(&this->iSubst) || this->iSubst > this->numPasses) { + return parent->Error("SILSub: Failed to read valid iSubst"); + } + if (!table.ReadU8(&this->iPos) || this->iPos > this->numPasses) { + return parent->Error("SILSub: Failed to read valid iPos"); + } + if (!table.ReadU8(&this->iJust) || this->iJust > this->numPasses) { + return parent->Error("SILSub: Failed to read valid iJust"); + } + if (!table.ReadU8(&this->iBidi) || + !(iBidi == 0xFF || this->iBidi <= this->iPos)) { + return parent->Error("SILSub: Failed to read valid iBidi"); + } + if (!table.ReadU8(&this->flags)) { + return parent->Error("SILSub: Failed to read flags"); + // checks omitted + } + if (!table.ReadU8(&this->maxPreContext)) { + return parent->Error("SILSub: Failed to read maxPreContext"); + } + if (!table.ReadU8(&this->maxPostContext)) { + return parent->Error("SILSub: Failed to read maxPostContext"); + } + if (!table.ReadU8(&this->attrPseudo)) { + return parent->Error("SILSub: Failed to read attrPseudo"); + } + if (!table.ReadU8(&this->attrBreakWeight)) { + return parent->Error("SILSub: Failed to read attrBreakWeight"); + } + if (!table.ReadU8(&this->attrDirectionality)) { + return parent->Error("SILSub: Failed to read attrDirectionality"); + } + if (parent->version >> 16 >= 2) { + if (!table.ReadU8(&this->attrMirroring)) { + return parent->Error("SILSub: Failed to read attrMirroring"); + } + if (!table.ReadU8(&this->attrSkipPasses)) { + return parent->Error("SILSub: Failed to read attrSkipPasses"); + } + + if (!table.ReadU8(&this->numJLevels)) { + return parent->Error("SILSub: Failed to read numJLevels"); + } + //this->jLevels.resize(this->numJLevels, parent); + for (unsigned i = 0; i < this->numJLevels; ++i) { + this->jLevels.emplace_back(parent); + if (!this->jLevels[i].ParsePart(table)) { + return parent->Error("SILSub: Failed to read jLevels[%u]", i); + } + } + } + + if (!table.ReadU16(&this->numLigComp)) { + return parent->Error("SILSub: Failed to read numLigComp"); + } + if (!table.ReadU8(&this->numUserDefn)) { + return parent->Error("SILSub: Failed to read numUserDefn"); + } + if (!table.ReadU8(&this->maxCompPerLig)) { + return parent->Error("SILSub: Failed to read maxCompPerLig"); + } + if (!table.ReadU8(&this->direction)) { + return parent->Error("SILSub: Failed to read direction"); + } + if (!table.ReadU8(&this->attCollisions)) { + return parent->Error("SILSub: Failed to read attCollisions"); + } + if (parent->version >> 16 < 5 && this->attCollisions != 0) { + parent->Warning("SILSub: Nonzero attCollisions (reserved before v5)"); + } + if (!table.ReadU8(&this->reserved4)) { + return parent->Error("SILSub: Failed to read reserved4"); + } + if (this->reserved4 != 0) { + parent->Warning("SILSub: Nonzero reserved4"); + } + if (!table.ReadU8(&this->reserved5)) { + return parent->Error("SILSub: Failed to read reserved5"); + } + if (this->reserved5 != 0) { + parent->Warning("SILSub: Nonzero reserved5"); + } + if (parent->version >> 16 >= 2) { + if (!table.ReadU8(&this->reserved6)) { + return parent->Error("SILSub: Failed to read reserved6"); + } + if (this->reserved6 != 0) { + parent->Warning("SILSub: Nonzero reserved6"); + } + + if (!table.ReadU8(&this->numCritFeatures)) { + return parent->Error("SILSub: Failed to read numCritFeatures"); + } + //this->critFeatures.resize(this->numCritFeatures); + for (unsigned i = 0; i < this->numCritFeatures; ++i) { + this->critFeatures.emplace_back(); + if (!table.ReadU16(&this->critFeatures[i])) { + return parent->Error("SILSub: Failed to read critFeatures[%u]", i); + } + } + + if (!table.ReadU8(&this->reserved7)) { + return parent->Error("SILSub: Failed to read reserved7"); + } + if (this->reserved7 != 0) { + parent->Warning("SILSub: Nonzero reserved7"); + } + } + + if (!table.ReadU8(&this->numScriptTag)) { + return parent->Error("SILSub: Failed to read numScriptTag"); + } + //this->scriptTag.resize(this->numScriptTag); + for (unsigned i = 0; i < this->numScriptTag; ++i) { + this->scriptTag.emplace_back(); + if (!table.ReadU32(&this->scriptTag[i])) { + return parent->Error("SILSub: Failed to read scriptTag[%u]", i); + } + } + + if (!table.ReadU16(&this->lbGID)) { + return parent->Error("SILSub: Failed to read lbGID"); + } + if (this->lbGID > this->maxGlyphID) { + parent->Warning("SILSub: lbGID %u outside range 0..%u, replaced with 0", + this->lbGID, this->maxGlyphID); + this->lbGID = 0; + } + + if (parent->version >> 16 >= 3 && + table.offset() != init_offset + this->passOffset) { + return parent->Error("SILSub: passOffset check failed"); + } + unsigned long last_oPass = 0; + //this->oPasses.resize(static_cast<unsigned>(this->numPasses) + 1); + for (unsigned i = 0; i <= this->numPasses; ++i) { + this->oPasses.emplace_back(); + if (!table.ReadU32(&this->oPasses[i]) || this->oPasses[i] < last_oPass) { + return false; + } + last_oPass = this->oPasses[i]; + } + + if (parent->version >> 16 >= 3 && + table.offset() != init_offset + this->pseudosOffset) { + return parent->Error("SILSub: pseudosOffset check failed"); + } + if (!table.ReadU16(&this->numPseudo)) { + return parent->Error("SILSub: Failed to read numPseudo"); + } + + // The following three fields are deprecated and ignored. We fix them up here + // just for internal consistency, but the Graphite engine doesn't care. + if (!table.ReadU16(&this->searchPseudo) || + !table.ReadU16(&this->pseudoSelector) || + !table.ReadU16(&this->pseudoShift)) { + return parent->Error("SILSub: Failed to read searchPseudo..pseudoShift"); + } + if (this->numPseudo == 0) { + if (this->searchPseudo != 0 || this->pseudoSelector != 0 || this->pseudoShift != 0) { + this->searchPseudo = this->pseudoSelector = this->pseudoShift = 0; + } + } else { + unsigned floorLog2 = std::floor(std::log2(this->numPseudo)); + if (this->searchPseudo != 6 * (unsigned)std::pow(2, floorLog2) || + this->pseudoSelector != floorLog2 || + this->pseudoShift != 6 * this->numPseudo - this->searchPseudo) { + this->searchPseudo = 6 * (unsigned)std::pow(2, floorLog2); + this->pseudoSelector = floorLog2; + this->pseudoShift = 6 * this->numPseudo - this->searchPseudo; + } + } + + //this->pMaps.resize(this->numPseudo, parent); + for (unsigned i = 0; i < numPseudo; i++) { + this->pMaps.emplace_back(parent); + if (!this->pMaps[i].ParsePart(table)) { + return parent->Error("SILSub: Failed to read pMaps[%u]", i); + } + } + + if (!this->classes.ParsePart(table)) { + return parent->Error("SILSub: Failed to read classes"); + } + + //this->passes.resize(this->numPasses, parent); + for (unsigned i = 0; i < this->numPasses; ++i) { + this->passes.emplace_back(parent); + if (table.offset() != init_offset + this->oPasses[i]) { + return parent->Error("SILSub: Offset check failed for passes[%u]", i); + } + if (!this->passes[i].ParsePart(table, init_offset, this->oPasses[i+1])) { + return parent->Error("SILSub: Failed to read passes[%u]", i); + } + } + return true; +} + +bool OpenTypeSILF::SILSub::SerializePart(OTSStream* out) const { + if ((parent->version >> 16 >= 3 && + (!out->WriteU32(this->ruleVersion) || + !out->WriteU16(this->passOffset) || + !out->WriteU16(this->pseudosOffset))) || + !out->WriteU16(this->maxGlyphID) || + !out->WriteS16(this->extraAscent) || + !out->WriteS16(this->extraDescent) || + !out->WriteU8(this->numPasses) || + !out->WriteU8(this->iSubst) || + !out->WriteU8(this->iPos) || + !out->WriteU8(this->iJust) || + !out->WriteU8(this->iBidi) || + !out->WriteU8(this->flags) || + !out->WriteU8(this->maxPreContext) || + !out->WriteU8(this->maxPostContext) || + !out->WriteU8(this->attrPseudo) || + !out->WriteU8(this->attrBreakWeight) || + !out->WriteU8(this->attrDirectionality) || + (parent->version >> 16 >= 2 && + (!out->WriteU8(this->attrMirroring) || + !out->WriteU8(this->attrSkipPasses) || + !out->WriteU8(this->numJLevels) || + !SerializeParts(this->jLevels, out))) || + !out->WriteU16(this->numLigComp) || + !out->WriteU8(this->numUserDefn) || + !out->WriteU8(this->maxCompPerLig) || + !out->WriteU8(this->direction) || + !out->WriteU8(this->attCollisions) || + !out->WriteU8(this->reserved4) || + !out->WriteU8(this->reserved5) || + (parent->version >> 16 >= 2 && + (!out->WriteU8(this->reserved6) || + !out->WriteU8(this->numCritFeatures) || + !SerializeParts(this->critFeatures, out) || + !out->WriteU8(this->reserved7))) || + !out->WriteU8(this->numScriptTag) || + !SerializeParts(this->scriptTag, out) || + !out->WriteU16(this->lbGID) || + !SerializeParts(this->oPasses, out) || + !out->WriteU16(this->numPseudo) || + !out->WriteU16(this->searchPseudo) || + !out->WriteU16(this->pseudoSelector) || + !out->WriteU16(this->pseudoShift) || + !SerializeParts(this->pMaps, out) || + !this->classes.SerializePart(out) || + !SerializeParts(this->passes, out)) { + return parent->Error("SILSub: Failed to write"); + } + return true; +} + +bool OpenTypeSILF::SILSub:: +JustificationLevel::ParsePart(Buffer& table) { + if (!table.ReadU8(&this->attrStretch)) { + return parent->Error("JustificationLevel: Failed to read attrStretch"); + } + if (!table.ReadU8(&this->attrShrink)) { + return parent->Error("JustificationLevel: Failed to read attrShrink"); + } + if (!table.ReadU8(&this->attrStep)) { + return parent->Error("JustificationLevel: Failed to read attrStep"); + } + if (!table.ReadU8(&this->attrWeight)) { + return parent->Error("JustificationLevel: Failed to read attrWeight"); + } + if (!table.ReadU8(&this->runto)) { + return parent->Error("JustificationLevel: Failed to read runto"); + } + if (!table.ReadU8(&this->reserved)) { + return parent->Error("JustificationLevel: Failed to read reserved"); + } + if (this->reserved != 0) { + parent->Warning("JustificationLevel: Nonzero reserved"); + } + if (!table.ReadU8(&this->reserved2)) { + return parent->Error("JustificationLevel: Failed to read reserved2"); + } + if (this->reserved2 != 0) { + parent->Warning("JustificationLevel: Nonzero reserved2"); + } + if (!table.ReadU8(&this->reserved3)) { + return parent->Error("JustificationLevel: Failed to read reserved3"); + } + if (this->reserved3 != 0) { + parent->Warning("JustificationLevel: Nonzero reserved3"); + } + return true; +} + +bool OpenTypeSILF::SILSub:: +JustificationLevel::SerializePart(OTSStream* out) const { + if (!out->WriteU8(this->attrStretch) || + !out->WriteU8(this->attrShrink) || + !out->WriteU8(this->attrStep) || + !out->WriteU8(this->attrWeight) || + !out->WriteU8(this->runto) || + !out->WriteU8(this->reserved) || + !out->WriteU8(this->reserved2) || + !out->WriteU8(this->reserved3)) { + return parent->Error("JustificationLevel: Failed to write"); + } + return true; +} + +bool OpenTypeSILF::SILSub:: +PseudoMap::ParsePart(Buffer& table) { + if (parent->version >> 16 >= 2 && !table.ReadU32(&this->unicode)) { + return parent->Error("PseudoMap: Failed to read unicode"); + } + if (parent->version >> 16 == 1) { + uint16_t unicode; + if (!table.ReadU16(&unicode)) { + return parent->Error("PseudoMap: Failed to read unicode"); + } + this->unicode = unicode; + } + if (!table.ReadU16(&this->nPseudo)) { + return parent->Error("PseudoMap: Failed to read nPseudo"); + } + return true; +} + +bool OpenTypeSILF::SILSub:: +PseudoMap::SerializePart(OTSStream* out) const { + if ((parent->version >> 16 >= 2 && !out->WriteU32(this->unicode)) || + (parent->version >> 16 == 1 && + !out->WriteU16(static_cast<uint16_t>(this->unicode))) || + !out->WriteU16(this->nPseudo)) { + return parent->Error("PseudoMap: Failed to write"); + } + return true; +} + +bool OpenTypeSILF::SILSub:: +ClassMap::ParsePart(Buffer& table) { + size_t init_offset = table.offset(); + if (!table.ReadU16(&this->numClass)) { + return parent->Error("ClassMap: Failed to read numClass"); + } + if (!table.ReadU16(&this->numLinear) || this->numLinear > this->numClass) { + return parent->Error("ClassMap: Failed to read valid numLinear"); + } + + //this->oClass.resize(static_cast<unsigned long>(this->numClass) + 1); + if (parent->version >> 16 >= 4) { + unsigned long last_oClass = 0; + for (unsigned long i = 0; i <= this->numClass; ++i) { + this->oClass.emplace_back(); + if (!table.ReadU32(&this->oClass[i]) || this->oClass[i] < last_oClass) { + return parent->Error("ClassMap: Failed to read oClass[%lu]", i); + } + last_oClass = this->oClass[i]; + } + } + if (parent->version >> 16 < 4) { + unsigned last_oClass = 0; + for (unsigned long i = 0; i <= this->numClass; ++i) { + uint16_t offset; + if (!table.ReadU16(&offset) || offset < last_oClass) { + return parent->Error("ClassMap: Failed to read oClass[%lu]", i); + } + last_oClass = offset; + this->oClass.push_back(static_cast<uint32_t>(offset)); + } + } + + if (table.offset() - init_offset > this->oClass[this->numLinear]) { + return parent->Error("ClassMap: Failed to calculate length of glyphs"); + } + unsigned long glyphs_len = (this->oClass[this->numLinear] - + (table.offset() - init_offset))/2; + //this->glyphs.resize(glyphs_len); + for (unsigned long i = 0; i < glyphs_len; ++i) { + this->glyphs.emplace_back(); + if (!table.ReadU16(&this->glyphs[i])) { + return parent->Error("ClassMap: Failed to read glyphs[%lu]", i); + } + } + + unsigned lookups_len = this->numClass - this->numLinear; + // this->numLinear <= this->numClass + //this->lookups.resize(lookups_len, parent); + for (unsigned i = 0; i < lookups_len; ++i) { + this->lookups.emplace_back(parent); + if (table.offset() != init_offset + oClass[this->numLinear + i]) { + return parent->Error("ClassMap: Offset check failed for lookups[%u]", i); + } + if (!this->lookups[i].ParsePart(table)) { + return parent->Error("ClassMap: Failed to read lookups[%u]", i); + } + } + return true; +} + +bool OpenTypeSILF::SILSub:: +ClassMap::SerializePart(OTSStream* out) const { + if (!out->WriteU16(this->numClass) || + !out->WriteU16(this->numLinear) || + (parent->version >> 16 >= 4 && !SerializeParts(this->oClass, out)) || + (parent->version >> 16 < 4 && + ![&] { + for (uint32_t offset : this->oClass) { + if (!out->WriteU16(static_cast<uint16_t>(offset))) { + return false; + } + } + return true; + }()) || + !SerializeParts(this->glyphs, out) || + !SerializeParts(this->lookups, out)) { + return parent->Error("ClassMap: Failed to write"); + } + return true; +} + +bool OpenTypeSILF::SILSub::ClassMap:: +LookupClass::ParsePart(Buffer& table) { + if (!table.ReadU16(&this->numIDs)) { + return parent->Error("LookupClass: Failed to read numIDs"); + } + if (!table.ReadU16(&this->searchRange) || + !table.ReadU16(&this->entrySelector) || + !table.ReadU16(&this->rangeShift)) { + return parent->Error("LookupClass: Failed to read searchRange..rangeShift"); + } + if (this->numIDs == 0) { + if (this->searchRange != 0 || this->entrySelector != 0 || this->rangeShift != 0) { + parent->Warning("LookupClass: Correcting binary-search header for zero-length LookupPair list"); + this->searchRange = this->entrySelector = this->rangeShift = 0; + } + } else { + unsigned floorLog2 = std::floor(std::log2(this->numIDs)); + if (this->searchRange != (unsigned)std::pow(2, floorLog2) || + this->entrySelector != floorLog2 || + this->rangeShift != this->numIDs - this->searchRange) { + parent->Warning("LookupClass: Correcting binary-search header for LookupPair list"); + this->searchRange = (unsigned)std::pow(2, floorLog2); + this->entrySelector = floorLog2; + this->rangeShift = this->numIDs - this->searchRange; + } + } + + //this->lookups.resize(this->numIDs, parent); + for (unsigned i = 0; i < numIDs; ++i) { + this->lookups.emplace_back(parent); + if (!this->lookups[i].ParsePart(table)) { + return parent->Error("LookupClass: Failed to read lookups[%u]", i); + } + } + return true; +} + +bool OpenTypeSILF::SILSub::ClassMap:: +LookupClass::SerializePart(OTSStream* out) const { + if (!out->WriteU16(this->numIDs) || + !out->WriteU16(this->searchRange) || + !out->WriteU16(this->entrySelector) || + !out->WriteU16(this->rangeShift) || + !SerializeParts(this->lookups, out)) { + return parent->Error("LookupClass: Failed to write"); + } + return true; +} + +bool OpenTypeSILF::SILSub::ClassMap::LookupClass:: +LookupPair::ParsePart(Buffer& table) { + if (!table.ReadU16(&this->glyphId)) { + return parent->Error("LookupPair: Failed to read glyphId"); + } + if (!table.ReadU16(&this->index)) { + return parent->Error("LookupPair: Failed to read index"); + } + return true; +} + +bool OpenTypeSILF::SILSub::ClassMap::LookupClass:: +LookupPair::SerializePart(OTSStream* out) const { + if (!out->WriteU16(this->glyphId) || + !out->WriteU16(this->index)) { + return parent->Error("LookupPair: Failed to write"); + } + return true; +} + +bool OpenTypeSILF::SILSub:: +SILPass::ParsePart(Buffer& table, const size_t SILSub_init_offset, + const size_t next_pass_offset) { + size_t init_offset = table.offset(); + if (!table.ReadU8(&this->flags)) { + return parent->Error("SILPass: Failed to read flags"); + // checks omitted + } + if (!table.ReadU8(&this->maxRuleLoop)) { + return parent->Error("SILPass: Failed to read valid maxRuleLoop"); + } + if (!table.ReadU8(&this->maxRuleContext)) { + return parent->Error("SILPass: Failed to read maxRuleContext"); + } + if (!table.ReadU8(&this->maxBackup)) { + return parent->Error("SILPass: Failed to read maxBackup"); + } + if (!table.ReadU16(&this->numRules)) { + return parent->Error("SILPass: Failed to read numRules"); + } + if (parent->version >> 16 >= 2) { + if (!table.ReadU16(&this->fsmOffset)) { + return parent->Error("SILPass: Failed to read fsmOffset"); + } + if (!table.ReadU32(&this->pcCode) || + (parent->version >= 3 && this->pcCode < this->fsmOffset)) { + return parent->Error("SILPass: Failed to read pcCode"); + } + } + if (!table.ReadU32(&this->rcCode) || + (parent->version >> 16 >= 2 && this->rcCode < this->pcCode)) { + return parent->Error("SILPass: Failed to read valid rcCode"); + } + if (!table.ReadU32(&this->aCode) || this->aCode < this->rcCode) { + return parent->Error("SILPass: Failed to read valid aCode"); + } + if (!table.ReadU32(&this->oDebug) || + (this->oDebug && this->oDebug < this->aCode)) { + return parent->Error("SILPass: Failed to read valid oDebug"); + } + if (parent->version >> 16 >= 3 && + table.offset() != init_offset + this->fsmOffset) { + return parent->Error("SILPass: fsmOffset check failed"); + } + if (!table.ReadU16(&this->numRows) || + (this->oDebug && this->numRows < this->numRules)) { + return parent->Error("SILPass: Failed to read valid numRows"); + } + if (!table.ReadU16(&this->numTransitional)) { + return parent->Error("SILPass: Failed to read numTransitional"); + } + if (!table.ReadU16(&this->numSuccess)) { + return parent->Error("SILPass: Failed to read numSuccess"); + } + if (!table.ReadU16(&this->numColumns)) { + return parent->Error("SILPass: Failed to read numColumns"); + } + if (!table.ReadU16(&this->numRange)) { + return parent->Error("SILPass: Failed to read numRange"); + } + + // The following three fields are deprecated and ignored. We fix them up here + // just for internal consistency, but the Graphite engine doesn't care. + if (!table.ReadU16(&this->searchRange) || + !table.ReadU16(&this->entrySelector) || + !table.ReadU16(&this->rangeShift)) { + return parent->Error("SILPass: Failed to read searchRange..rangeShift"); + } + if (this->numRange == 0) { + if (this->searchRange != 0 || this->entrySelector != 0 || this->rangeShift != 0) { + this->searchRange = this->entrySelector = this->rangeShift = 0; + } + } else { + unsigned floorLog2 = std::floor(std::log2(this->numRange)); + if (this->searchRange != 6 * (unsigned)std::pow(2, floorLog2) || + this->entrySelector != floorLog2 || + this->rangeShift != 6 * this->numRange - this->searchRange) { + this->searchRange = 6 * (unsigned)std::pow(2, floorLog2); + this->entrySelector = floorLog2; + this->rangeShift = 6 * this->numRange - this->searchRange; + } + } + + //this->ranges.resize(this->numRange, parent); + for (unsigned i = 0 ; i < this->numRange; ++i) { + this->ranges.emplace_back(parent); + if (!this->ranges[i].ParsePart(table)) { + return parent->Error("SILPass: Failed to read ranges[%u]", i); + } + } + unsigned ruleMap_len = 0; // maximum value in oRuleMap + //this->oRuleMap.resize(static_cast<unsigned long>(this->numSuccess) + 1); + for (unsigned long i = 0; i <= this->numSuccess; ++i) { + this->oRuleMap.emplace_back(); + if (!table.ReadU16(&this->oRuleMap[i])) { + return parent->Error("SILPass: Failed to read oRuleMap[%u]", i); + } + if (oRuleMap[i] > ruleMap_len) { + ruleMap_len = oRuleMap[i]; + } + } + + //this->ruleMap.resize(ruleMap_len); + for (unsigned i = 0; i < ruleMap_len; ++i) { + this->ruleMap.emplace_back(); + if (!table.ReadU16(&this->ruleMap[i])) { + return parent->Error("SILPass: Failed to read ruleMap[%u]", i); + } + } + + if (!table.ReadU8(&this->minRulePreContext)) { + return parent->Error("SILPass: Failed to read minRulePreContext"); + } + if (!table.ReadU8(&this->maxRulePreContext) || + this->maxRulePreContext < this->minRulePreContext) { + return parent->Error("SILPass: Failed to read valid maxRulePreContext"); + } + + unsigned startStates_len = this->maxRulePreContext - this->minRulePreContext + + 1; + // this->minRulePreContext <= this->maxRulePreContext + //this->startStates.resize(startStates_len); + for (unsigned i = 0; i < startStates_len; ++i) { + this->startStates.emplace_back(); + if (!table.ReadS16(&this->startStates[i])) { + return parent->Error("SILPass: Failed to read startStates[%u]", i); + } + } + + //this->ruleSortKeys.resize(this->numRules); + for (unsigned i = 0; i < this->numRules; ++i) { + this->ruleSortKeys.emplace_back(); + if (!table.ReadU16(&this->ruleSortKeys[i])) { + return parent->Error("SILPass: Failed to read ruleSortKeys[%u]", i); + } + } + + //this->rulePreContext.resize(this->numRules); + for (unsigned i = 0; i < this->numRules; ++i) { + this->rulePreContext.emplace_back(); + if (!table.ReadU8(&this->rulePreContext[i])) { + return parent->Error("SILPass: Failed to read rulePreContext[%u]", i); + } + } + + if (parent->version >> 16 >= 2) { + if (!table.ReadU8(&this->collisionThreshold)) { + return parent->Error("SILPass: Failed to read collisionThreshold"); + } + if (!table.ReadU16(&this->pConstraint)) { + return parent->Error("SILPass: Failed to read pConstraint"); + } + } + + unsigned long ruleConstraints_len = this->aCode - this->rcCode; + // this->rcCode <= this->aCode + //this->oConstraints.resize(static_cast<unsigned long>(this->numRules) + 1); + for (unsigned long i = 0; i <= this->numRules; ++i) { + this->oConstraints.emplace_back(); + if (!table.ReadU16(&this->oConstraints[i]) || + this->oConstraints[i] > ruleConstraints_len) { + return parent->Error("SILPass: Failed to read valid oConstraints[%lu]", + i); + } + } + + if (!this->oDebug && this->aCode > next_pass_offset) { + return parent->Error("SILPass: Failed to calculate length of actions"); + } + unsigned long actions_len = this->oDebug ? this->oDebug - this->aCode : + next_pass_offset - this->aCode; + // if this->oDebug, then this->aCode <= this->oDebug + //this->oActions.resize(static_cast<unsigned long>(this->numRules) + 1); + for (unsigned long i = 0; i <= this->numRules; ++i) { + this->oActions.emplace_back(); + if (!table.ReadU16(&this->oActions[i]) || + (this->oActions[i] > actions_len)) { + return parent->Error("SILPass: Failed to read valid oActions[%lu]", i); + } + } + + //this->stateTrans.resize(this->numTransitional); + for (unsigned i = 0; i < this->numTransitional; ++i) { + this->stateTrans.emplace_back(); + //this->stateTrans[i].resize(this->numColumns); + for (unsigned j = 0; j < this->numColumns; ++j) { + this->stateTrans[i].emplace_back(); + if (!table.ReadU16(&stateTrans[i][j])) { + return parent->Error("SILPass: Failed to read stateTrans[%u][%u]", + i, j); + } + } + } + + if (parent->version >> 16 >= 2) { + if (!table.ReadU8(&this->reserved2)) { + return parent->Error("SILPass: Failed to read reserved2"); + } + if (this->reserved2 != 0) { + parent->Warning("SILPass: Nonzero reserved2"); + } + + if (table.offset() != SILSub_init_offset + this->pcCode) { + return parent->Error("SILPass: pcCode check failed"); + } + //this->passConstraints.resize(this->pConstraint); + for (unsigned i = 0; i < this->pConstraint; ++i) { + this->passConstraints.emplace_back(); + if (!table.ReadU8(&this->passConstraints[i])) { + return parent->Error("SILPass: Failed to read passConstraints[%u]", i); + } + } + } + + if (table.offset() != SILSub_init_offset + this->rcCode) { + return parent->Error("SILPass: rcCode check failed"); + } + //this->ruleConstraints.resize(ruleConstraints_len); // calculated above + for (unsigned long i = 0; i < ruleConstraints_len; ++i) { + this->ruleConstraints.emplace_back(); + if (!table.ReadU8(&this->ruleConstraints[i])) { + return parent->Error("SILPass: Failed to read ruleConstraints[%u]", i); + } + } + + if (table.offset() != SILSub_init_offset + this->aCode) { + return parent->Error("SILPass: aCode check failed"); + } + //this->actions.resize(actions_len); // calculated above + for (unsigned long i = 0; i < actions_len; ++i) { + this->actions.emplace_back(); + if (!table.ReadU8(&this->actions[i])) { + return parent->Error("SILPass: Failed to read actions[%u]", i); + } + } + + if (this->oDebug) { + OpenTypeNAME* name = static_cast<OpenTypeNAME*>( + parent->GetFont()->GetTypedTable(OTS_TAG_NAME)); + if (!name) { + return parent->Error("SILPass: Required name table is missing"); + } + + if (table.offset() != SILSub_init_offset + this->oDebug) { + return parent->Error("SILPass: oDebug check failed"); + } + //this->dActions.resize(this->numRules); + for (unsigned i = 0; i < this->numRules; ++i) { + this->dActions.emplace_back(); + if (!table.ReadU16(&this->dActions[i]) || + !name->IsValidNameId(this->dActions[i])) { + return parent->Error("SILPass: Failed to read valid dActions[%u]", i); + } + } + + unsigned dStates_len = this->numRows - this->numRules; + // this->numRules <= this->numRows + //this->dStates.resize(dStates_len); + for (unsigned i = 0; i < dStates_len; ++i) { + this->dStates.emplace_back(); + if (!table.ReadU16(&this->dStates[i]) || + !name->IsValidNameId(this->dStates[i])) { + return parent->Error("SILPass: Failed to read valid dStates[%u]", i); + } + } + + //this->dCols.resize(this->numRules); + for (unsigned i = 0; i < this->numRules; ++i) { + this->dCols.emplace_back(); + if (!table.ReadU16(&this->dCols[i]) || + !name->IsValidNameId(this->dCols[i])) { + return parent->Error("SILPass: Failed to read valid dCols[%u]"); + } + } + } + return true; +} + +bool OpenTypeSILF::SILSub:: +SILPass::SerializePart(OTSStream* out) const { + if (!out->WriteU8(this->flags) || + !out->WriteU8(this->maxRuleLoop) || + !out->WriteU8(this->maxRuleContext) || + !out->WriteU8(this->maxBackup) || + !out->WriteU16(this->numRules) || + (parent->version >> 16 >= 2 && + (!out->WriteU16(this->fsmOffset) || + !out->WriteU32(this->pcCode))) || + !out->WriteU32(this->rcCode) || + !out->WriteU32(this->aCode) || + !out->WriteU32(this->oDebug) || + !out->WriteU16(this->numRows) || + !out->WriteU16(this->numTransitional) || + !out->WriteU16(this->numSuccess) || + !out->WriteU16(this->numColumns) || + !out->WriteU16(this->numRange) || + !out->WriteU16(this->searchRange) || + !out->WriteU16(this->entrySelector) || + !out->WriteU16(this->rangeShift) || + !SerializeParts(this->ranges, out) || + !SerializeParts(this->oRuleMap, out) || + !SerializeParts(this->ruleMap, out) || + !out->WriteU8(this->minRulePreContext) || + !out->WriteU8(this->maxRulePreContext) || + !SerializeParts(this->startStates, out) || + !SerializeParts(this->ruleSortKeys, out) || + !SerializeParts(this->rulePreContext, out) || + (parent->version >> 16 >= 2 && + (!out->WriteU8(this->collisionThreshold) || + !out->WriteU16(this->pConstraint))) || + !SerializeParts(this->oConstraints, out) || + !SerializeParts(this->oActions, out) || + !SerializeParts(this->stateTrans, out) || + (parent->version >> 16 >= 2 && + (!out->WriteU8(this->reserved2) || + !SerializeParts(this->passConstraints, out))) || + !SerializeParts(this->ruleConstraints, out) || + !SerializeParts(this->actions, out) || + !SerializeParts(this->dActions, out) || + !SerializeParts(this->dStates, out) || + !SerializeParts(this->dCols, out)) { + return parent->Error("SILPass: Failed to write"); + } + return true; +} + +bool OpenTypeSILF::SILSub::SILPass:: +PassRange::ParsePart(Buffer& table) { + if (!table.ReadU16(&this->firstId)) { + return parent->Error("PassRange: Failed to read firstId"); + } + if (!table.ReadU16(&this->lastId)) { + return parent->Error("PassRange: Failed to read lastId"); + } + if (!table.ReadU16(&this->colId)) { + return parent->Error("PassRange: Failed to read colId"); + } + return true; +} + +bool OpenTypeSILF::SILSub::SILPass:: +PassRange::SerializePart(OTSStream* out) const { + if (!out->WriteU16(this->firstId) || + !out->WriteU16(this->lastId) || + !out->WriteU16(this->colId)) { + return parent->Error("PassRange: Failed to write"); + } + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/silf.h b/gfx/ots/src/silf.h new file mode 100644 index 000000000..b6c08032f --- /dev/null +++ b/gfx/ots/src/silf.h @@ -0,0 +1,196 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_SILF_H_ +#define OTS_SILF_H_ + +#include <vector> + +#include "ots.h" +#include "graphite.h" + +namespace ots { + +class OpenTypeSILF : public Table { + public: + explicit OpenTypeSILF(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length) { + return this->Parse(data, length, false); + } + bool Serialize(OTSStream* out); + + private: + bool Parse(const uint8_t* data, size_t length, bool prevent_decompression); + struct SILSub : public TablePart<OpenTypeSILF> { + explicit SILSub(OpenTypeSILF* parent) + : TablePart<OpenTypeSILF>(parent), classes(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + struct JustificationLevel : public TablePart<OpenTypeSILF> { + explicit JustificationLevel(OpenTypeSILF* parent) + : TablePart<OpenTypeSILF>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + uint8_t attrStretch; + uint8_t attrShrink; + uint8_t attrStep; + uint8_t attrWeight; + uint8_t runto; + uint8_t reserved; + uint8_t reserved2; + uint8_t reserved3; + }; + struct PseudoMap : public TablePart<OpenTypeSILF> { + explicit PseudoMap(OpenTypeSILF* parent) + : TablePart<OpenTypeSILF>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + uint32_t unicode; + uint16_t nPseudo; + }; + struct ClassMap : public TablePart<OpenTypeSILF> { + explicit ClassMap(OpenTypeSILF* parent) + : TablePart<OpenTypeSILF>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + struct LookupClass : public TablePart<OpenTypeSILF> { + explicit LookupClass(OpenTypeSILF* parent) + : TablePart<OpenTypeSILF>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + struct LookupPair : public TablePart<OpenTypeSILF> { + explicit LookupPair(OpenTypeSILF* parent) + : TablePart<OpenTypeSILF>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + uint16_t glyphId; + uint16_t index; + }; + uint16_t numIDs; + uint16_t searchRange; + uint16_t entrySelector; + uint16_t rangeShift; + std::vector<LookupPair> lookups; + }; + uint16_t numClass; + uint16_t numLinear; + std::vector<uint32_t> oClass; // uint16_t before v4 + std::vector<uint16_t> glyphs; + std::vector<LookupClass> lookups; + }; + struct SILPass : public TablePart<OpenTypeSILF> { + explicit SILPass(OpenTypeSILF* parent) + : TablePart<OpenTypeSILF>(parent) { } + bool ParsePart(Buffer& table) { return false; } + bool ParsePart(Buffer& table, const size_t SILSub_init_offset, + const size_t next_pass_offset); + bool SerializePart(OTSStream* out) const; + struct PassRange : public TablePart<OpenTypeSILF> { + explicit PassRange(OpenTypeSILF* parent) + : TablePart<OpenTypeSILF>(parent) { } + bool ParsePart(Buffer& table); + bool SerializePart(OTSStream* out) const; + uint16_t firstId; + uint16_t lastId; + uint16_t colId; + }; + uint8_t flags; + uint8_t maxRuleLoop; + uint8_t maxRuleContext; + uint8_t maxBackup; + uint16_t numRules; + uint16_t fsmOffset; + uint32_t pcCode; + uint32_t rcCode; + uint32_t aCode; + uint32_t oDebug; + uint16_t numRows; + uint16_t numTransitional; + uint16_t numSuccess; + uint16_t numColumns; + uint16_t numRange; + uint16_t searchRange; + uint16_t entrySelector; + uint16_t rangeShift; + std::vector<PassRange> ranges; + std::vector<uint16_t> oRuleMap; + std::vector<uint16_t> ruleMap; + uint8_t minRulePreContext; + uint8_t maxRulePreContext; + std::vector<int16_t> startStates; + std::vector<uint16_t> ruleSortKeys; + std::vector<uint8_t> rulePreContext; + uint8_t collisionThreshold; // reserved before v5 + uint16_t pConstraint; + std::vector<uint16_t> oConstraints; + std::vector<uint16_t> oActions; + std::vector<std::vector<uint16_t>> stateTrans; + uint8_t reserved2; + std::vector<uint8_t> passConstraints; + std::vector<uint8_t> ruleConstraints; + std::vector<uint8_t> actions; + std::vector<uint16_t> dActions; + std::vector<uint16_t> dStates; + std::vector<uint16_t> dCols; + }; + uint32_t ruleVersion; + uint16_t passOffset; + uint16_t pseudosOffset; + uint16_t maxGlyphID; + int16_t extraAscent; + int16_t extraDescent; + uint8_t numPasses; + uint8_t iSubst; + uint8_t iPos; + uint8_t iJust; + uint8_t iBidi; + uint8_t flags; + uint8_t maxPreContext; + uint8_t maxPostContext; + uint8_t attrPseudo; + uint8_t attrBreakWeight; + uint8_t attrDirectionality; + uint8_t attrMirroring; // reserved before v4 + uint8_t attrSkipPasses; // reserved2 before v4 + uint8_t numJLevels; + std::vector<JustificationLevel> jLevels; + uint16_t numLigComp; + uint8_t numUserDefn; + uint8_t maxCompPerLig; + uint8_t direction; + uint8_t attCollisions; // reserved3 before v5 + uint8_t reserved4; + uint8_t reserved5; + uint8_t reserved6; + uint8_t numCritFeatures; + std::vector<uint16_t> critFeatures; + uint8_t reserved7; + uint8_t numScriptTag; + std::vector<uint32_t> scriptTag; + uint16_t lbGID; + std::vector<uint32_t> oPasses; + uint16_t numPseudo; + uint16_t searchPseudo; + uint16_t pseudoSelector; + uint16_t pseudoShift; + std::vector<PseudoMap> pMaps; + ClassMap classes; + std::vector<SILPass> passes; + }; + uint32_t version; + uint32_t compHead; // compression header + static const uint32_t SCHEME = 0xF8000000; + static const uint32_t FULL_SIZE = 0x07FFFFFF; + static const uint32_t COMPILER_VERSION = 0x07FFFFFF; + uint16_t numSub; + uint16_t reserved; + std::vector<uint32_t> offset; + std::vector<SILSub> tables; +}; + +} // namespace ots + +#endif // OTS_SILF_H_ diff --git a/gfx/ots/src/sill.cc b/gfx/ots/src/sill.cc new file mode 100644 index 000000000..c7b20a980 --- /dev/null +++ b/gfx/ots/src/sill.cc @@ -0,0 +1,159 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "sill.h" + +#include "feat.h" +#include <cmath> +#include <unordered_set> + +namespace ots { + +bool OpenTypeSILL::Parse(const uint8_t* data, size_t length) { + if (GetFont()->dropped_graphite) { + return Drop("Skipping Graphite table"); + } + Buffer table(data, length); + + if (!table.ReadU32(&this->version) || this->version >> 16 != 1) { + return Drop("Failed to read valid version"); + } + if (!table.ReadU16(&this->numLangs)) { + return Drop("Failed to read numLangs"); + } + + // The following three fields are deprecated and ignored. We fix them up here + // just for internal consistency, but the Graphite engine doesn't care. + if (!table.ReadU16(&this->searchRange) || + !table.ReadU16(&this->entrySelector) || + !table.ReadU16(&this->rangeShift)) { + return Drop("Failed to read searchRange..rangeShift"); + } + if (this->numLangs == 0) { + if (this->searchRange != 0 || this->entrySelector != 0 || this->rangeShift != 0) { + this->searchRange = this->entrySelector = this->rangeShift = 0; + } + } else { + unsigned floorLog2 = std::floor(std::log2(this->numLangs)); + if (this->searchRange != (unsigned)std::pow(2, floorLog2) || + this->entrySelector != floorLog2 || + this->rangeShift != this->numLangs - this->searchRange) { + this->searchRange = (unsigned)std::pow(2, floorLog2); + this->entrySelector = floorLog2; + this->rangeShift = this->numLangs - this->searchRange; + } + } + + std::unordered_set<size_t> unverified; + //this->entries.resize(static_cast<unsigned long>(this->numLangs) + 1, this); + for (unsigned long i = 0; i <= this->numLangs; ++i) { + this->entries.emplace_back(this); + LanguageEntry& entry = this->entries[i]; + if (!entry.ParsePart(table)) { + return Drop("Failed to read entries[%u]", i); + } + for (unsigned j = 0; j < entry.numSettings; ++j) { + size_t offset = entry.offset + j * 8; + if (offset < entry.offset || offset > length) { + return DropGraphite("Invalid LangFeatureSetting offset %zu/%zu", + offset, length); + } + unverified.insert(offset); + // need to verify that this LanguageEntry points to valid + // LangFeatureSetting + } + } + + while (table.remaining()) { + unverified.erase(table.offset()); + LangFeatureSetting setting(this); + if (!setting.ParsePart(table)) { + return Drop("Failed to read a LangFeatureSetting"); + } + settings.push_back(setting); + } + + if (!unverified.empty()) { + return Drop("%zu incorrect offsets into settings", unverified.size()); + } + if (table.remaining()) { + return Warning("%zu bytes unparsed", table.remaining()); + } + return true; +} + +bool OpenTypeSILL::Serialize(OTSStream* out) { + if (!out->WriteU32(this->version) || + !out->WriteU16(this->numLangs) || + !out->WriteU16(this->searchRange) || + !out->WriteU16(this->entrySelector) || + !out->WriteU16(this->rangeShift) || + !SerializeParts(this->entries, out) || + !SerializeParts(this->settings, out)) { + return Error("Failed to write table"); + } + return true; +} + +bool OpenTypeSILL::LanguageEntry::ParsePart(Buffer& table) { + if (!table.ReadU8(&this->langcode[0]) || + !table.ReadU8(&this->langcode[1]) || + !table.ReadU8(&this->langcode[2]) || + !table.ReadU8(&this->langcode[3])) { + return parent->Error("LanguageEntry: Failed to read langcode"); + } + if (!table.ReadU16(&this->numSettings)) { + return parent->Error("LanguageEntry: Failed to read numSettings"); + } + if (!table.ReadU16(&this->offset)) { + return parent->Error("LanguageEntry: Failed to read offset"); + } + return true; +} + +bool OpenTypeSILL::LanguageEntry::SerializePart(OTSStream* out) const { + if (!out->WriteU8(this->langcode[0]) || + !out->WriteU8(this->langcode[1]) || + !out->WriteU8(this->langcode[2]) || + !out->WriteU8(this->langcode[3]) || + !out->WriteU16(this->numSettings) || + !out->WriteU16(this->offset)) { + return parent->Error("LanguageEntry: Failed to write"); + } + return true; +} + +bool OpenTypeSILL::LangFeatureSetting::ParsePart(Buffer& table) { + OpenTypeFEAT* feat = static_cast<OpenTypeFEAT*>( + parent->GetFont()->GetTypedTable(OTS_TAG_FEAT)); + if (!feat) { + return parent->Error("FeatureDefn: Required Feat table is missing"); + } + + if (!table.ReadU32(&this->featureId) || + !feat->IsValidFeatureId(this->featureId)) { + return parent->Error("LangFeatureSetting: Failed to read valid featureId"); + } + if (!table.ReadS16(&this->value)) { + return parent->Error("LangFeatureSetting: Failed to read value"); + } + if (!table.ReadU16(&this->reserved)) { + return parent->Error("LangFeatureSetting: Failed to read reserved"); + } + if (this->reserved != 0) { + parent->Warning("LangFeatureSetting: Nonzero reserved"); + } + return true; +} + +bool OpenTypeSILL::LangFeatureSetting::SerializePart(OTSStream* out) const { + if (!out->WriteU32(this->featureId) || + !out->WriteS16(this->value) || + !out->WriteU16(this->reserved)) { + return parent->Error("LangFeatureSetting: Failed to read reserved"); + } + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/sill.h b/gfx/ots/src/sill.h new file mode 100644 index 000000000..30f9b8d83 --- /dev/null +++ b/gfx/ots/src/sill.h @@ -0,0 +1,53 @@ +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_SILL_H_ +#define OTS_SILL_H_ + +#include "ots.h" +#include "graphite.h" + +#include <vector> + +namespace ots { + +class OpenTypeSILL : public Table { + public: + explicit OpenTypeSILL(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + struct LanguageEntry : public TablePart<OpenTypeSILL> { + explicit LanguageEntry(OpenTypeSILL* parent) + : TablePart<OpenTypeSILL>(parent) { } + bool ParsePart(Buffer &table); + bool SerializePart(OTSStream* out) const; + uint8_t langcode[4]; + uint16_t numSettings; + uint16_t offset; + }; + struct LangFeatureSetting : public TablePart<OpenTypeSILL> { + explicit LangFeatureSetting(OpenTypeSILL* parent) + : TablePart<OpenTypeSILL>(parent) { } + bool ParsePart(Buffer &table); + bool SerializePart(OTSStream* out) const; + uint32_t featureId; + int16_t value; + uint16_t reserved; + }; + uint32_t version; + uint16_t numLangs; + uint16_t searchRange; + uint16_t entrySelector; + uint16_t rangeShift; + std::vector<LanguageEntry> entries; + std::vector<LangFeatureSetting> settings; +}; + +} // namespace ots + +#endif // OTS_SILL_H_ diff --git a/gfx/ots/src/stat.cc b/gfx/ots/src/stat.cc new file mode 100644 index 000000000..9b7828109 --- /dev/null +++ b/gfx/ots/src/stat.cc @@ -0,0 +1,347 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "stat.h" +#include "name.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeSTAT +// ----------------------------------------------------------------------------- + +bool OpenTypeSTAT::ValidateNameId(uint16_t nameid, bool allowPredefined) { + OpenTypeNAME* name = static_cast<OpenTypeNAME*>( + GetFont()->GetTypedTable(OTS_TAG_NAME)); + + if (!name || !name->IsValidNameId(nameid)) { + Drop("Invalid nameID: %d", nameid); + return false; + } + + if (!allowPredefined && nameid < 26) { + Warning("nameID out of range: %d", nameid); + return true; + } + + if ((nameid >= 26 && nameid <= 255) || nameid >= 32768) { + Warning("nameID out of range: %d", nameid); + return true; + } + + return true; +} + +bool OpenTypeSTAT::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + if (!table.ReadU16(&this->majorVersion) || + !table.ReadU16(&this->minorVersion) || + !table.ReadU16(&this->designAxisSize) || + !table.ReadU16(&this->designAxisCount) || + !table.ReadU32(&this->designAxesOffset) || + !table.ReadU16(&this->axisValueCount) || + !table.ReadU32(&this->offsetToAxisValueOffsets) || + !(this->minorVersion < 1 || table.ReadU16(&this->elidedFallbackNameID))) { + return Drop("Failed to read table header"); + } + if (this->majorVersion != 1) { + return Drop("Unknown table version"); + } + if (this->minorVersion > 2) { + Warning("Unknown minor version, downgrading to 2"); + this->minorVersion = 2; + } + + if (this->designAxisSize < sizeof(AxisRecord)) { + return Drop("Invalid designAxisSize"); + } + + size_t headerEnd = table.offset(); + + if (this->designAxisCount == 0) { + if (this->designAxesOffset != 0) { + Warning("Unexpected non-zero designAxesOffset"); + this->designAxesOffset = 0; + } + } else { + if (this->designAxesOffset < headerEnd || + size_t(this->designAxesOffset) + + size_t(this->designAxisCount) * size_t(this->designAxisSize) > length) { + return Drop("Invalid designAxesOffset"); + } + } + + for (size_t i = 0; i < this->designAxisCount; i++) { + table.set_offset(this->designAxesOffset + i * this->designAxisSize); + this->designAxes.emplace_back(); + auto& axis = this->designAxes[i]; + if (!table.ReadU32(&axis.axisTag) || + !table.ReadU16(&axis.axisNameID) || + !table.ReadU16(&axis.axisOrdering)) { + return Drop("Failed to read design axis"); + } + if (!CheckTag(axis.axisTag)) { + return Drop("Bad design axis tag"); + } + if (!ValidateNameId(axis.axisNameID, false)) { + return true; + } + } + + // TODO + // - check that all axes defined in fvar are covered by STAT + // - check that axisOrdering values are not duplicated (warn only) + + if (this->axisValueCount == 0) { + if (this->offsetToAxisValueOffsets != 0) { + Warning("Unexpected non-zero offsetToAxisValueOffsets"); + this->offsetToAxisValueOffsets = 0; + } + } else { + if (this->offsetToAxisValueOffsets < headerEnd || + size_t(this->offsetToAxisValueOffsets) + + size_t(this->axisValueCount) * sizeof(uint16_t) > length) { + return Drop("Invalid offsetToAxisValueOffsets"); + } + } + + for (size_t i = 0; i < this->axisValueCount; i++) { + table.set_offset(this->offsetToAxisValueOffsets + i * sizeof(uint16_t)); + uint16_t axisValueOffset; + if (!table.ReadU16(&axisValueOffset)) { + return Drop("Failed to read axis value offset"); + } + if (this->offsetToAxisValueOffsets + axisValueOffset > length) { + return Drop("Invalid axis value offset"); + } + table.set_offset(this->offsetToAxisValueOffsets + axisValueOffset); + uint16_t format; + if (!table.ReadU16(&format)) { + return Drop("Failed to read axis value format"); + } + this->axisValues.emplace_back(format); + auto& axisValue = axisValues[i]; + switch (format) { + case 1: + if (!table.ReadU16(&axisValue.format1.axisIndex) || + !table.ReadU16(&axisValue.format1.flags) || + !table.ReadU16(&axisValue.format1.valueNameID) || + !table.ReadS32(&axisValue.format1.value)) { + return Drop("Failed to read axis value (format 1)"); + } + if (axisValue.format1.axisIndex >= this->designAxisCount) { + return Drop("Axis index out of range"); + } + if ((axisValue.format1.flags & 0xFFFCu) != 0) { + Warning("Unexpected axis value flags"); + axisValue.format1.flags &= ~0xFFFCu; + } + if (!ValidateNameId(axisValue.format1.valueNameID)) { + return true; + } + break; + case 2: + if (!table.ReadU16(&axisValue.format2.axisIndex) || + !table.ReadU16(&axisValue.format2.flags) || + !table.ReadU16(&axisValue.format2.valueNameID) || + !table.ReadS32(&axisValue.format2.nominalValue) || + !table.ReadS32(&axisValue.format2.rangeMinValue) || + !table.ReadS32(&axisValue.format2.rangeMaxValue)) { + return Drop("Failed to read axis value (format 2)"); + } + if (axisValue.format2.axisIndex >= this->designAxisCount) { + return Drop("Axis index out of range"); + } + if ((axisValue.format2.flags & 0xFFFCu) != 0) { + Warning("Unexpected axis value flags"); + axisValue.format1.flags &= ~0xFFFCu; + } + if (!ValidateNameId(axisValue.format2.valueNameID)) { + return true; + } + if (!(axisValue.format2.rangeMinValue <= axisValue.format2.nominalValue && + axisValue.format2.nominalValue <= axisValue.format2.rangeMaxValue)) { + Warning("Bad axis value range or nominal value"); + } + break; + case 3: + if (!table.ReadU16(&axisValue.format3.axisIndex) || + !table.ReadU16(&axisValue.format3.flags) || + !table.ReadU16(&axisValue.format3.valueNameID) || + !table.ReadS32(&axisValue.format3.value) || + !table.ReadS32(&axisValue.format3.linkedValue)) { + return Drop("Failed to read axis value (format 3)"); + } + if (axisValue.format3.axisIndex >= this->designAxisCount) { + return Drop("Axis index out of range"); + } + if ((axisValue.format3.flags & 0xFFFCu) != 0) { + Warning("Unexpected axis value flags"); + axisValue.format3.flags &= ~0xFFFCu; + } + if (!ValidateNameId(axisValue.format3.valueNameID)) { + return true; + } + break; + case 4: + if (this->minorVersion < 2) { + Warning("Invalid table version for format 4 axis values - updating"); + this->minorVersion = 2; + } + if (!table.ReadU16(&axisValue.format4.axisCount) || + !table.ReadU16(&axisValue.format4.flags) || + !table.ReadU16(&axisValue.format4.valueNameID)) { + return Drop("Failed to read axis value (format 4)"); + } + if (axisValue.format4.axisCount > this->designAxisCount) { + return Drop("Axis count out of range"); + } + if ((axisValue.format4.flags & 0xFFFCu) != 0) { + Warning("Unexpected axis value flags"); + axisValue.format4.flags &= ~0xFFFCu; + } + if (!ValidateNameId(axisValue.format4.valueNameID)) { + return true; + } + for (unsigned j = 0; j < axisValue.format4.axisCount; j++) { + axisValue.format4.axisValues.emplace_back(); + auto& v = axisValue.format4.axisValues[j]; + if (!table.ReadU16(&v.axisIndex) || + !table.ReadS32(&v.value)) { + return Drop("Failed to read axis value"); + } + if (v.axisIndex >= this->designAxisCount) { + return Drop("Axis index out of range"); + } + } + break; + default: + return Drop("Unknown axis value format"); + } + } + + return true; +} + +bool OpenTypeSTAT::Serialize(OTSStream* out) { + off_t tableStart = out->Tell(); + + size_t headerSize = 5 * sizeof(uint16_t) + 2 * sizeof(uint32_t); + if (this->minorVersion >= 1) { + headerSize += sizeof(uint16_t); + } + + if (this->designAxisCount == 0) { + this->designAxesOffset = 0; + } else { + this->designAxesOffset = headerSize; + } + + this->designAxisSize = sizeof(AxisRecord); + + if (this->axisValueCount == 0) { + this->offsetToAxisValueOffsets = 0; + } else { + if (this->designAxesOffset == 0) { + this->offsetToAxisValueOffsets = headerSize; + } else { + this->offsetToAxisValueOffsets = this->designAxesOffset + this->designAxisCount * this->designAxisSize; + } + } + + if (!out->WriteU16(this->majorVersion) || + !out->WriteU16(this->minorVersion) || + !out->WriteU16(this->designAxisSize) || + !out->WriteU16(this->designAxisCount) || + !out->WriteU32(this->designAxesOffset) || + !out->WriteU16(this->axisValueCount) || + !out->WriteU32(this->offsetToAxisValueOffsets) || + !(this->minorVersion < 1 || out->WriteU16(this->elidedFallbackNameID))) { + return Error("Failed to write table header"); + } + + if (this->designAxisCount > 0) { + if (out->Tell() - tableStart != this->designAxesOffset) { + return Error("Error computing designAxesOffset"); + } + } + + for (unsigned i = 0; i < this->designAxisCount; i++) { + const auto& axis = this->designAxes[i]; + if (!out->WriteU32(axis.axisTag) || + !out->WriteU16(axis.axisNameID) || + !out->WriteU16(axis.axisOrdering)) { + return Error("Failed to write design axis"); + } + } + + if (this->axisValueCount > 0) { + if (out->Tell() - tableStart != this->offsetToAxisValueOffsets) { + return Error("Error computing offsetToAxisValueOffsets"); + } + } + + uint32_t axisValueOffset = this->axisValueCount * sizeof(uint16_t); + for (unsigned i = 0; i < this->axisValueCount; i++) { + const auto& value = this->axisValues[i]; + if (!out->WriteU16(axisValueOffset)) { + return Error("Failed to write axis value offset"); + } + axisValueOffset += value.Length(); + } + for (unsigned i = 0; i < this->axisValueCount; i++) { + const auto& value = this->axisValues[i]; + if (!out->WriteU16(value.format)) { + return Error("Failed to write axis value"); + } + switch (value.format) { + case 1: + if (!out->WriteU16(value.format1.axisIndex) || + !out->WriteU16(value.format1.flags) || + !out->WriteU16(value.format1.valueNameID) || + !out->WriteS32(value.format1.value)) { + return Error("Failed to write axis value"); + } + break; + case 2: + if (!out->WriteU16(value.format2.axisIndex) || + !out->WriteU16(value.format2.flags) || + !out->WriteU16(value.format2.valueNameID) || + !out->WriteS32(value.format2.nominalValue) || + !out->WriteS32(value.format2.rangeMinValue) || + !out->WriteS32(value.format2.rangeMaxValue)) { + return Error("Failed to write axis value"); + } + break; + case 3: + if (!out->WriteU16(value.format3.axisIndex) || + !out->WriteU16(value.format3.flags) || + !out->WriteU16(value.format3.valueNameID) || + !out->WriteS32(value.format3.value) || + !out->WriteS32(value.format3.linkedValue)) { + return Error("Failed to write axis value"); + } + break; + case 4: + if (!out->WriteU16(value.format4.axisCount) || + !out->WriteU16(value.format4.flags) || + !out->WriteU16(value.format4.valueNameID)) { + return Error("Failed to write axis value"); + } + for (unsigned j = 0; j < value.format4.axisValues.size(); j++) { + if (!out->WriteU16(value.format4.axisValues[j].axisIndex) || + !out->WriteS32(value.format4.axisValues[j].value)) { + return Error("Failed to write axis value"); + } + } + break; + default: + return Error("Bad value format"); + } + } + + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/stat.h b/gfx/ots/src/stat.h new file mode 100644 index 000000000..873d08edc --- /dev/null +++ b/gfx/ots/src/stat.h @@ -0,0 +1,155 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_STAT_H_ +#define OTS_STAT_H_ + +#include <vector> + +#include "ots.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeSTAT Interface +// ----------------------------------------------------------------------------- + +class OpenTypeSTAT : public Table { + public: + explicit OpenTypeSTAT(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + bool ValidateNameId(uint16_t nameid, bool allowPredefined = true); + + uint16_t majorVersion; + uint16_t minorVersion; + uint16_t designAxisSize; + uint16_t designAxisCount; + uint32_t designAxesOffset; + uint16_t axisValueCount; + uint32_t offsetToAxisValueOffsets; + uint16_t elidedFallbackNameID; + + struct AxisRecord { + uint32_t axisTag; + uint16_t axisNameID; + uint16_t axisOrdering; + }; + std::vector<AxisRecord> designAxes; + + typedef int32_t Fixed; /* 16.16 fixed-point value */ + + struct AxisValueFormat1 { + uint16_t axisIndex; + uint16_t flags; + uint16_t valueNameID; + Fixed value; + static size_t Length() { + return 3 * sizeof(uint16_t) + sizeof(Fixed); + } + }; + + struct AxisValueFormat2 { + uint16_t axisIndex; + uint16_t flags; + uint16_t valueNameID; + Fixed nominalValue; + Fixed rangeMinValue; + Fixed rangeMaxValue; + static size_t Length() { + return 3 * sizeof(uint16_t) + 3 * sizeof(Fixed); + } + }; + + struct AxisValueFormat3 { + uint16_t axisIndex; + uint16_t flags; + uint16_t valueNameID; + Fixed value; + Fixed linkedValue; + static size_t Length() { + return 3 * sizeof(uint16_t) + 2 * sizeof(Fixed); + } + }; + + struct AxisValueFormat4 { + uint16_t axisCount; + uint16_t flags; + uint16_t valueNameID; + struct AxisValue { + uint16_t axisIndex; + Fixed value; + }; + std::vector<AxisValue> axisValues; + size_t Length() const { + return 3 * sizeof(uint16_t) + axisValues.size() * (sizeof(uint16_t) + sizeof(Fixed)); + } + }; + + struct AxisValueRecord { + uint16_t format; + union { + AxisValueFormat1 format1; + AxisValueFormat2 format2; + AxisValueFormat3 format3; + AxisValueFormat4 format4; + }; + explicit AxisValueRecord(uint16_t format_) + : format(format_) + { + if (format == 4) { + new (&this->format4) AxisValueFormat4(); + } + } + AxisValueRecord(const AxisValueRecord& other_) + : format(other_.format) + { + switch (format) { + case 1: + format1 = other_.format1; + break; + case 2: + format2 = other_.format2; + break; + case 3: + format3 = other_.format3; + break; + case 4: + new (&this->format4) AxisValueFormat4(); + format4 = other_.format4; + break; + } + } + ~AxisValueRecord() { + if (format == 4) { + this->format4.~AxisValueFormat4(); + } + } + uint32_t Length() const { + switch (format) { + case 1: + return sizeof(uint16_t) + format1.Length(); + case 2: + return sizeof(uint16_t) + format2.Length(); + case 3: + return sizeof(uint16_t) + format3.Length(); + case 4: + return sizeof(uint16_t) + format4.Length(); + default: + // can't happen + return 0; + } + } + }; + + std::vector<AxisValueRecord> axisValues; +}; + +} // namespace ots + +#endif // OTS_STAT_H_ diff --git a/gfx/ots/src/variations.cc b/gfx/ots/src/variations.cc new file mode 100644 index 000000000..cb7e5fb32 --- /dev/null +++ b/gfx/ots/src/variations.cc @@ -0,0 +1,261 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "layout.h" + +#include "fvar.h" + +// OpenType Variations Common Table Formats + +#define TABLE_NAME "Variations" // XXX: use individual table names + +namespace { + +bool ParseVariationRegionList(const ots::Font* font, const uint8_t* data, const size_t length, + uint16_t* regionCount) { + ots::Buffer subtable(data, length); + + uint16_t axisCount; + + if (!subtable.ReadU16(&axisCount) || + !subtable.ReadU16(regionCount)) { + return OTS_FAILURE_MSG("Failed to read variation region list header"); + } + + if (*regionCount == 0) { + return true; + } + + const ots::OpenTypeFVAR* fvar = + static_cast<ots::OpenTypeFVAR*>(font->GetTypedTable(OTS_TAG_FVAR)); + if (!fvar) { + return OTS_FAILURE_MSG("Required fvar table is missing"); + } + if (axisCount != fvar->AxisCount()) { + return OTS_FAILURE_MSG("Axis count mismatch"); + } + + for (unsigned i = 0; i < *regionCount; i++) { + for (unsigned j = 0; j < axisCount; j++) { + int16_t startCoord, peakCoord, endCoord; + if (!subtable.ReadS16(&startCoord) || + !subtable.ReadS16(&peakCoord) || + !subtable.ReadS16(&endCoord)) { + return OTS_FAILURE_MSG("Failed to read region axis coordinates"); + } + if (startCoord > peakCoord || peakCoord > endCoord) { + return OTS_FAILURE_MSG("Region axis coordinates out of order"); + } + if (startCoord < -0x4000 || endCoord > 0x4000) { + return OTS_FAILURE_MSG("Region axis coordinate out of range"); + } + if ((peakCoord < 0 && endCoord > 0) || + (peakCoord > 0 && startCoord < 0)) { + return OTS_FAILURE_MSG("Invalid region axis coordinates"); + } + } + } + + return true; +} + +bool +ParseVariationDataSubtable(const ots::Font* font, const uint8_t* data, const size_t length, + const uint16_t regionCount, + uint16_t* regionIndexCount) { + ots::Buffer subtable(data, length); + + uint16_t itemCount; + uint16_t shortDeltaCount; + + if (!subtable.ReadU16(&itemCount) || + !subtable.ReadU16(&shortDeltaCount) || + !subtable.ReadU16(regionIndexCount)) { + return OTS_FAILURE_MSG("Failed to read variation data subtable header"); + } + + for (unsigned i = 0; i < *regionIndexCount; i++) { + uint16_t regionIndex; + if (!subtable.ReadU16(®ionIndex) || regionIndex >= regionCount) { + return OTS_FAILURE_MSG("Bad region index"); + } + } + + if (!subtable.Skip(size_t(itemCount) * (size_t(shortDeltaCount) + size_t(*regionIndexCount)))) { + return OTS_FAILURE_MSG("Failed to read delta data"); + } + + return true; +} + +} // namespace + +namespace ots { + +bool +ParseItemVariationStore(const Font* font, + const uint8_t* data, const size_t length, + std::vector<uint16_t>* regionIndexCounts) { + Buffer subtable(data, length); + + uint16_t format; + uint32_t variationRegionListOffset; + uint16_t itemVariationDataCount; + + if (!subtable.ReadU16(&format) || + !subtable.ReadU32(&variationRegionListOffset) || + !subtable.ReadU16(&itemVariationDataCount)) { + return OTS_FAILURE_MSG("Failed to read item variation store header"); + } + + if (format != 1) { + return OTS_FAILURE_MSG("Unknown item variation store format"); + } + + if (variationRegionListOffset < subtable.offset() + 4 * itemVariationDataCount || + variationRegionListOffset > length) { + return OTS_FAILURE_MSG("Invalid variation region list offset"); + } + + uint16_t regionCount; + if (!ParseVariationRegionList(font, + data + variationRegionListOffset, + length - variationRegionListOffset, + ®ionCount)) { + return OTS_FAILURE_MSG("Failed to parse variation region list"); + } + + for (unsigned i = 0; i < itemVariationDataCount; i++) { + uint32_t offset; + if (!subtable.ReadU32(&offset)) { + return OTS_FAILURE_MSG("Failed to read variation data subtable offset"); + } + if (offset >= length) { + return OTS_FAILURE_MSG("Bad offset to variation data subtable"); + } + uint16_t regionIndexCount = 0; + if (!ParseVariationDataSubtable(font, data + offset, length - offset, + regionCount, + ®ionIndexCount)) { + return OTS_FAILURE_MSG("Failed to parse variation data subtable"); + } + if (regionIndexCounts) { + regionIndexCounts->push_back(regionIndexCount); + } + } + + return true; +} + +bool ParseDeltaSetIndexMap(const Font* font, const uint8_t* data, const size_t length) { + Buffer subtable(data, length); + + uint16_t entryFormat; + uint16_t mapCount; + + if (!subtable.ReadU16(&entryFormat) || + !subtable.ReadU16(&mapCount)) { + return OTS_FAILURE_MSG("Failed to read delta set index map header"); + } + + const uint16_t MAP_ENTRY_SIZE_MASK = 0x0030; + + const uint16_t entrySize = (((entryFormat & MAP_ENTRY_SIZE_MASK) >> 4) + 1); + if (!subtable.Skip(entrySize * mapCount)) { + return OTS_FAILURE_MSG("Failed to read delta set index map data"); + } + + return true; +} + +bool ParseVariationData(const Font* font, const uint8_t* data, size_t length, + size_t axisCount, size_t sharedTupleCount) { + Buffer subtable(data, length); + + uint16_t tupleVariationCount; + uint16_t dataOffset; + if (!subtable.ReadU16(&tupleVariationCount) || + !subtable.ReadU16(&dataOffset)) { + return OTS_FAILURE_MSG("Failed to read variation data header"); + } + + if (dataOffset > length) { + return OTS_FAILURE_MSG("Invalid serialized data offset"); + } + + tupleVariationCount &= 0x0FFF; // mask off flags + + const uint16_t EMBEDDED_PEAK_TUPLE = 0x8000; + const uint16_t INTERMEDIATE_REGION = 0x4000; + const uint16_t TUPLE_INDEX_MASK = 0x0FFF; + + for (unsigned i = 0; i < tupleVariationCount; i++) { + uint16_t variationDataSize; + uint16_t tupleIndex; + + if (!subtable.ReadU16(&variationDataSize) || + !subtable.ReadU16(&tupleIndex)) { + return OTS_FAILURE_MSG("Failed to read tuple variation header"); + } + + if (tupleIndex & EMBEDDED_PEAK_TUPLE) { + for (unsigned axis = 0; axis < axisCount; axis++) { + int16_t coordinate; + if (!subtable.ReadS16(&coordinate)) { + return OTS_FAILURE_MSG("Failed to read tuple coordinate"); + } + if (coordinate < -0x4000 || coordinate > 0x4000) { + return OTS_FAILURE_MSG("Invalid tuple coordinate"); + } + } + } + + if (tupleIndex & INTERMEDIATE_REGION) { + std::vector<int16_t> startTuple(axisCount); + for (unsigned axis = 0; axis < axisCount; axis++) { + int16_t coordinate; + if (!subtable.ReadS16(&coordinate)) { + return OTS_FAILURE_MSG("Failed to read tuple coordinate"); + } + if (coordinate < -0x4000 || coordinate > 0x4000) { + return OTS_FAILURE_MSG("Invalid tuple coordinate"); + } + startTuple.push_back(coordinate); + } + + std::vector<int16_t> endTuple(axisCount); + for (unsigned axis = 0; axis < axisCount; axis++) { + int16_t coordinate; + if (!subtable.ReadS16(&coordinate)) { + return OTS_FAILURE_MSG("Failed to read tuple coordinate"); + } + if (coordinate < -0x4000 || coordinate > 0x4000) { + return OTS_FAILURE_MSG("Invalid tuple coordinate"); + } + endTuple.push_back(coordinate); + } + + for (unsigned axis = 0; axis < axisCount; axis++) { + if (startTuple[axis] > endTuple[axis]) { + return OTS_FAILURE_MSG("Invalid intermediate range"); + } + } + } + + if (!(tupleIndex & EMBEDDED_PEAK_TUPLE)) { + tupleIndex &= TUPLE_INDEX_MASK; + if (tupleIndex >= sharedTupleCount) { + return OTS_FAILURE_MSG("Tuple index out of range"); + } + } + } + + // TODO: we don't attempt to interpret the serialized data block + + return true; +} + +} // namespace ots + +#undef TABLE_NAME diff --git a/gfx/ots/src/variations.h b/gfx/ots/src/variations.h new file mode 100644 index 000000000..aaaac1784 --- /dev/null +++ b/gfx/ots/src/variations.h @@ -0,0 +1,26 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_VARIATIONS_H_ +#define OTS_VARIATIONS_H_ + +#include <vector> +#include "ots.h" + +// Utility functions for OpenType variations common table formats. + +namespace ots { + +bool ParseItemVariationStore(const Font* font, + const uint8_t* data, const size_t length, + std::vector<uint16_t>* out_region_index_count = NULL); + +bool ParseDeltaSetIndexMap(const Font* font, const uint8_t* data, const size_t length); + +bool ParseVariationData(const Font* font, const uint8_t* data, size_t length, + size_t axisCount, size_t sharedTupleCount); + +} // namespace ots + +#endif // OTS_VARIATIONS_H_ diff --git a/gfx/ots/src/vdmx.cc b/gfx/ots/src/vdmx.cc index cd80946ae..54055777a 100644 --- a/gfx/ots/src/vdmx.cc +++ b/gfx/ots/src/vdmx.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,91 +7,75 @@ // VDMX - Vertical Device Metrics // http://www.microsoft.com/typography/otspec/vdmx.htm -#define TABLE_NAME "VDMX" - -#define DROP_THIS_TABLE(...) \ - do { \ - OTS_FAILURE_MSG_(font->file, TABLE_NAME ": " __VA_ARGS__); \ - OTS_FAILURE_MSG("Table discarded"); \ - delete font->vdmx; \ - font->vdmx = 0; \ - } while (0) - namespace ots { -bool ots_vdmx_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeVDMX::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - font->vdmx = new OpenTypeVDMX; - OpenTypeVDMX * const vdmx = font->vdmx; - if (!table.ReadU16(&vdmx->version) || - !table.ReadU16(&vdmx->num_recs) || - !table.ReadU16(&vdmx->num_ratios)) { - return OTS_FAILURE_MSG("Failed to read table header"); + if (!table.ReadU16(&this->version) || + !table.ReadU16(&this->num_recs) || + !table.ReadU16(&this->num_ratios)) { + return Error("Failed to read table header"); } - if (vdmx->version > 1) { - DROP_THIS_TABLE("bad version: %u", vdmx->version); - return true; // continue transcoding + if (this->version > 1) { + return Drop("Unsupported table version: %u", this->version); } - vdmx->rat_ranges.reserve(vdmx->num_ratios); - for (unsigned i = 0; i < vdmx->num_ratios; ++i) { + this->rat_ranges.reserve(this->num_ratios); + for (unsigned i = 0; i < this->num_ratios; ++i) { OpenTypeVDMXRatioRecord rec; if (!table.ReadU8(&rec.charset) || !table.ReadU8(&rec.x_ratio) || !table.ReadU8(&rec.y_start_ratio) || !table.ReadU8(&rec.y_end_ratio)) { - return OTS_FAILURE_MSG("Failed to read ratio header %d", i); + return Error("Failed to read RatioRange record %d", i); } if (rec.charset > 1) { - DROP_THIS_TABLE("bad charset: %u", rec.charset); - return true; + return Drop("Unsupported character set: %u", rec.charset); } if (rec.y_start_ratio > rec.y_end_ratio) { - DROP_THIS_TABLE("bad y ratio"); - return true; + return Drop("Bad y ratio"); } // All values set to zero signal the default grouping to use; // if present, this must be the last Ratio group in the table. - if ((i < vdmx->num_ratios - 1u) && + if ((i < this->num_ratios - 1u) && (rec.x_ratio == 0) && (rec.y_start_ratio == 0) && (rec.y_end_ratio == 0)) { // workaround for fonts which have 2 or more {0, 0, 0} terminators. - DROP_THIS_TABLE("superfluous terminator found"); - return true; + return Drop("Superfluous terminator found"); } - vdmx->rat_ranges.push_back(rec); + this->rat_ranges.push_back(rec); } - vdmx->offsets.reserve(vdmx->num_ratios); + this->offsets.reserve(this->num_ratios); const size_t current_offset = table.offset(); // current_offset is less than (2 bytes * 3) + (4 bytes * USHRT_MAX) = 256k. - for (unsigned i = 0; i < vdmx->num_ratios; ++i) { + for (unsigned i = 0; i < this->num_ratios; ++i) { uint16_t offset; if (!table.ReadU16(&offset)) { - return OTS_FAILURE_MSG("Failed to read ratio offset %d", i); + return Error("Failed to read ratio offset %d", i); } if (current_offset + offset >= length) { // thus doesn't overflow. - return OTS_FAILURE_MSG("Bad ratio offset %d for ration %d", offset, i); + return Error("Bad ratio offset %d for ration %d", offset, i); } - vdmx->offsets.push_back(offset); + this->offsets.push_back(offset); } - vdmx->groups.reserve(vdmx->num_recs); - for (unsigned i = 0; i < vdmx->num_recs; ++i) { + this->groups.reserve(this->num_recs); + for (unsigned i = 0; i < this->num_recs; ++i) { OpenTypeVDMXGroup group; if (!table.ReadU16(&group.recs) || !table.ReadU8(&group.startsz) || !table.ReadU8(&group.endsz)) { - return OTS_FAILURE_MSG("Failed to read record header %d", i); + return Error("Failed to read record header %d", i); } group.entries.reserve(group.recs); for (unsigned j = 0; j < group.recs; ++j) { @@ -99,71 +83,68 @@ bool ots_vdmx_parse(Font *font, const uint8_t *data, size_t length) { if (!table.ReadU16(&vt.y_pel_height) || !table.ReadS16(&vt.y_max) || !table.ReadS16(&vt.y_min)) { - return OTS_FAILURE_MSG("Failed to read reacord %d group %d", i, j); + return Error("Failed to read reacord %d group %d", i, j); } if (vt.y_max < vt.y_min) { - DROP_THIS_TABLE("bad y min/max"); - return true; + return Drop("bad y min/max"); } // This table must appear in sorted order (sorted by yPelHeight), // but need not be continuous. if ((j != 0) && (group.entries[j - 1].y_pel_height >= vt.y_pel_height)) { - DROP_THIS_TABLE("the table is not sorted"); - return true; + return Drop("The table is not sorted"); } group.entries.push_back(vt); } - vdmx->groups.push_back(group); + this->groups.push_back(group); } return true; } -bool ots_vdmx_should_serialise(Font *font) { - if (!font->glyf) return false; // this table is not for CFF fonts. - return font->vdmx != NULL; +bool OpenTypeVDMX::ShouldSerialize() { + return Table::ShouldSerialize() && + // this table is not for CFF fonts. + GetFont()->GetTable(OTS_TAG_GLYF) != NULL; } -bool ots_vdmx_serialise(OTSStream *out, Font *font) { - OpenTypeVDMX * const vdmx = font->vdmx; - - if (!out->WriteU16(vdmx->version) || - !out->WriteU16(vdmx->num_recs) || - !out->WriteU16(vdmx->num_ratios)) { - return OTS_FAILURE_MSG("Failed to write table header"); +bool OpenTypeVDMX::Serialize(OTSStream *out) { + if (!out->WriteU16(this->version) || + !out->WriteU16(this->num_recs) || + !out->WriteU16(this->num_ratios)) { + return Error("Failed to write table header"); } - for (unsigned i = 0; i < vdmx->rat_ranges.size(); ++i) { - const OpenTypeVDMXRatioRecord& rec = vdmx->rat_ranges[i]; + for (unsigned i = 0; i < this->rat_ranges.size(); ++i) { + const OpenTypeVDMXRatioRecord& rec = this->rat_ranges[i]; if (!out->Write(&rec.charset, 1) || !out->Write(&rec.x_ratio, 1) || !out->Write(&rec.y_start_ratio, 1) || !out->Write(&rec.y_end_ratio, 1)) { - return OTS_FAILURE_MSG("Failed to write ratio %d", i); + return Error("Failed to write RatioRange record %d", i); } } - for (unsigned i = 0; i < vdmx->offsets.size(); ++i) { - if (!out->WriteU16(vdmx->offsets[i])) { - return OTS_FAILURE_MSG("Failed to write ratio offset %d", i); + for (unsigned i = 0; i < this->offsets.size(); ++i) { + if (!out->WriteU16(this->offsets[i])) { + return Error("Failed to write ratio offset %d", i); } } - for (unsigned i = 0; i < vdmx->groups.size(); ++i) { - const OpenTypeVDMXGroup& group = vdmx->groups[i]; + for (unsigned i = 0; i < this->groups.size(); ++i) { + const OpenTypeVDMXGroup& group = this->groups[i]; if (!out->WriteU16(group.recs) || !out->Write(&group.startsz, 1) || !out->Write(&group.endsz, 1)) { - return OTS_FAILURE_MSG("Failed to write group %d", i); + return Error("Failed to write group %d", i); } for (unsigned j = 0; j < group.entries.size(); ++j) { const OpenTypeVDMXVTable& vt = group.entries[j]; if (!out->WriteU16(vt.y_pel_height) || !out->WriteS16(vt.y_max) || !out->WriteS16(vt.y_min)) { - return OTS_FAILURE_MSG("Failed to write group %d entry %d", i, j); + return Error("Failed to write group %d entry %d", i, j); } } } @@ -171,16 +152,4 @@ bool ots_vdmx_serialise(OTSStream *out, Font *font) { return true; } -void ots_vdmx_reuse(Font *font, Font *other) { - font->vdmx = other->vdmx; - font->vdmx_reused = true; -} - -void ots_vdmx_free(Font *font) { - delete font->vdmx; -} - } // namespace ots - -#undef TABLE_NAME -#undef DROP_THIS_TABLE diff --git a/gfx/ots/src/vdmx.h b/gfx/ots/src/vdmx.h index 1d959efe5..6ccf6dc1b 100644 --- a/gfx/ots/src/vdmx.h +++ b/gfx/ots/src/vdmx.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -31,7 +31,16 @@ struct OpenTypeVDMXGroup { std::vector<OpenTypeVDMXVTable> entries; }; -struct OpenTypeVDMX { +class OpenTypeVDMX : public Table { + public: + explicit OpenTypeVDMX(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: uint16_t version; uint16_t num_recs; uint16_t num_ratios; diff --git a/gfx/ots/src/vhea.cc b/gfx/ots/src/vhea.cc index e721b971e..e44bedf20 100644 --- a/gfx/ots/src/vhea.cc +++ b/gfx/ots/src/vhea.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,51 +10,30 @@ // vhea - Vertical Header Table // http://www.microsoft.com/typography/otspec/vhea.htm -#define TABLE_NAME "vhea" - namespace ots { -bool ots_vhea_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeVHEA::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - OpenTypeVHEA *vhea = new OpenTypeVHEA; - font->vhea = vhea; - if (!table.ReadU32(&vhea->header.version)) { - return OTS_FAILURE_MSG("Failed to read version"); - } - if (vhea->header.version != 0x00010000 && - vhea->header.version != 0x00011000) { - return OTS_FAILURE_MSG("Bad vhea version %x", vhea->header.version); + if (!table.ReadU32(&this->version)) { + return Error("Failed to read version"); } - - if (!ParseMetricsHeader(font, &table, &vhea->header)) { - return OTS_FAILURE_MSG("Failed to parse metrics in vhea"); + if (this->version != 0x00010000 && + this->version != 0x00011000) { + return Error("Unsupported table version: 0x%x", this->version); } - return true; + return OpenTypeMetricsHeader::Parse(data, length); } -bool ots_vhea_should_serialise(Font *font) { - // vhea should'nt serialise when vmtx doesn't exist. - return font->vhea != NULL && font->vmtx != NULL; +bool OpenTypeVHEA::Serialize(OTSStream *out) { + return OpenTypeMetricsHeader::Serialize(out); } -bool ots_vhea_serialise(OTSStream *out, Font *font) { - if (!SerialiseMetricsHeader(font, out, &font->vhea->header)) { - return OTS_FAILURE_MSG("Failed to write vhea metrics"); - } - return true; -} - -void ots_vhea_reuse(Font *font, Font *other) { - font->vhea = other->vhea; - font->vhea_reused = true; -} - -void ots_vhea_free(Font *font) { - delete font->vhea; +bool OpenTypeVHEA::ShouldSerialize() { + return OpenTypeMetricsHeader::ShouldSerialize() && + // vhea shouldn't serialise when vmtx doesn't exist. + GetFont()->GetTable(OTS_TAG_VMTX) != NULL; } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/vhea.h b/gfx/ots/src/vhea.h index f8efde731..8776acd11 100644 --- a/gfx/ots/src/vhea.h +++ b/gfx/ots/src/vhea.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,8 +10,14 @@ namespace ots { -struct OpenTypeVHEA { - OpenTypeMetricsHeader header; +class OpenTypeVHEA : public OpenTypeMetricsHeader { + public: + explicit OpenTypeVHEA(Font *font, uint32_t tag) + : OpenTypeMetricsHeader(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); }; } // namespace ots diff --git a/gfx/ots/src/vmtx.cc b/gfx/ots/src/vmtx.cc index 64a706148..d576ae294 100644 --- a/gfx/ots/src/vmtx.cc +++ b/gfx/ots/src/vmtx.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,48 +10,20 @@ // vmtx - Vertical Metrics Table // http://www.microsoft.com/typography/otspec/vmtx.htm -#define TABLE_NAME "vmtx" - namespace ots { -bool ots_vmtx_parse(Font *font, const uint8_t *data, size_t length) { - Buffer table(data, length); - OpenTypeVMTX *vmtx = new OpenTypeVMTX; - font->vmtx = vmtx; - - if (!font->vhea || !font->maxp) { - return OTS_FAILURE_MSG("vhea or maxp table missing as needed by vmtx"); - } - - if (!ParseMetricsTable(font, &table, font->maxp->num_glyphs, - &font->vhea->header, &vmtx->metrics)) { - return OTS_FAILURE_MSG("Failed to parse vmtx metrics"); - } - - return true; +bool OpenTypeVMTX::Parse(const uint8_t *data, size_t length) { + return OpenTypeMetricsTable::Parse(data, length); } -bool ots_vmtx_should_serialise(Font *font) { - // vmtx should serialise when vhea is preserved. - return font->vmtx != NULL && font->vhea != NULL; +bool OpenTypeVMTX::Serialize(OTSStream *out) { + return OpenTypeMetricsTable::Serialize(out); } -bool ots_vmtx_serialise(OTSStream *out, Font *font) { - if (!SerialiseMetricsTable(font, out, &font->vmtx->metrics)) { - return OTS_FAILURE_MSG("Failed to write vmtx metrics"); - } - return true; -} - -void ots_vmtx_reuse(Font *font, Font *other) { - font->vmtx = other->vmtx; - font->vmtx_reused = true; -} - -void ots_vmtx_free(Font *font) { - delete font->vmtx; +bool OpenTypeVMTX::ShouldSerialize() { + return OpenTypeMetricsTable::ShouldSerialize() && + // vmtx should serialise when vhea is preserved. + GetFont()->GetTable(OTS_TAG_VHEA) != NULL; } } // namespace ots - -#undef TABLE_NAME diff --git a/gfx/ots/src/vmtx.h b/gfx/ots/src/vmtx.h index 061dc73ed..b243fe214 100644 --- a/gfx/ots/src/vmtx.h +++ b/gfx/ots/src/vmtx.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -6,12 +6,19 @@ #define OTS_VMTX_H_ #include "metrics.h" +#include "vhea.h" #include "ots.h" namespace ots { -struct OpenTypeVMTX { - OpenTypeMetricsTable metrics; +struct OpenTypeVMTX : public OpenTypeMetricsTable { + public: + explicit OpenTypeVMTX(Font *font, uint32_t tag) + : OpenTypeMetricsTable(font, tag, tag, OTS_TAG_VHEA) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); }; } // namespace ots diff --git a/gfx/ots/src/vorg.cc b/gfx/ots/src/vorg.cc index 358923125..3b4b51c53 100644 --- a/gfx/ots/src/vorg.cc +++ b/gfx/ots/src/vorg.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,37 +9,23 @@ // VORG - Vertical Origin Table // http://www.microsoft.com/typography/otspec/vorg.htm -#define TABLE_NAME "VORG" - -#define DROP_THIS_TABLE(...) \ - do { \ - OTS_FAILURE_MSG_(font->file, TABLE_NAME ": " __VA_ARGS__); \ - OTS_FAILURE_MSG("Table discarded"); \ - delete font->vorg; \ - font->vorg = 0; \ - } while (0) - namespace ots { -bool ots_vorg_parse(Font *font, const uint8_t *data, size_t length) { +bool OpenTypeVORG::Parse(const uint8_t *data, size_t length) { Buffer table(data, length); - font->vorg = new OpenTypeVORG; - OpenTypeVORG * const vorg = font->vorg; uint16_t num_recs; - if (!table.ReadU16(&vorg->major_version) || - !table.ReadU16(&vorg->minor_version) || - !table.ReadS16(&vorg->default_vert_origin_y) || + if (!table.ReadU16(&this->major_version) || + !table.ReadU16(&this->minor_version) || + !table.ReadS16(&this->default_vert_origin_y) || !table.ReadU16(&num_recs)) { - return OTS_FAILURE_MSG("Failed to read header"); + return Error("Failed to read header"); } - if (vorg->major_version != 1) { - DROP_THIS_TABLE("bad major version: %u", vorg->major_version); - return true; + if (this->major_version != 1) { + return Drop("Unsupported majorVersion: %u", this->major_version); } - if (vorg->minor_version != 0) { - DROP_THIS_TABLE("bad minor version: %u", vorg->minor_version); - return true; + if (this->minor_version != 0) { + return Drop("Unsupported minorVersion: %u", this->minor_version); } // num_recs might be zero (e.g., DFHSMinchoPro5-W3-Demo.otf). @@ -48,64 +34,50 @@ bool ots_vorg_parse(Font *font, const uint8_t *data, size_t length) { } uint16_t last_glyph_index = 0; - vorg->metrics.reserve(num_recs); + this->metrics.reserve(num_recs); for (unsigned i = 0; i < num_recs; ++i) { OpenTypeVORGMetrics rec; if (!table.ReadU16(&rec.glyph_index) || !table.ReadS16(&rec.vert_origin_y)) { - return OTS_FAILURE_MSG("Failed to read record %d", i); + return Error("Failed to read record %d", i); } if ((i != 0) && (rec.glyph_index <= last_glyph_index)) { - DROP_THIS_TABLE("the table is not sorted"); - return true; + return Drop("The table is not sorted"); } last_glyph_index = rec.glyph_index; - vorg->metrics.push_back(rec); + this->metrics.push_back(rec); } return true; } -bool ots_vorg_should_serialise(Font *font) { - if (!font->cff) return false; // this table is not for fonts with TT glyphs. - return font->vorg != NULL; -} - -bool ots_vorg_serialise(OTSStream *out, Font *font) { - OpenTypeVORG * const vorg = font->vorg; - - const uint16_t num_metrics = static_cast<uint16_t>(vorg->metrics.size()); - if (num_metrics != vorg->metrics.size() || - !out->WriteU16(vorg->major_version) || - !out->WriteU16(vorg->minor_version) || - !out->WriteS16(vorg->default_vert_origin_y) || +bool OpenTypeVORG::Serialize(OTSStream *out) { + const uint16_t num_metrics = static_cast<uint16_t>(this->metrics.size()); + if (num_metrics != this->metrics.size() || + !out->WriteU16(this->major_version) || + !out->WriteU16(this->minor_version) || + !out->WriteS16(this->default_vert_origin_y) || !out->WriteU16(num_metrics)) { - return OTS_FAILURE_MSG("Failed to write table header"); + return Error("Failed to write table header"); } for (uint16_t i = 0; i < num_metrics; ++i) { - const OpenTypeVORGMetrics& rec = vorg->metrics[i]; + const OpenTypeVORGMetrics& rec = this->metrics[i]; if (!out->WriteU16(rec.glyph_index) || !out->WriteS16(rec.vert_origin_y)) { - return OTS_FAILURE_MSG("Failed to write record %d", i); + return Error("Failed to write record %d", i); } } return true; } -void ots_vorg_reuse(Font *font, Font *other) { - font->vorg = other->vorg; - font->vorg_reused = true; -} - -void ots_vorg_free(Font *font) { - delete font->vorg; +bool OpenTypeVORG::ShouldSerialize() { + return Table::ShouldSerialize() && + // this table is not for fonts with TT glyphs. + GetFont()->GetTable(OTS_TAG_CFF) != NULL; } } // namespace ots - -#undef TABLE_NAME -#undef DROP_THIS_TABLE diff --git a/gfx/ots/src/vorg.h b/gfx/ots/src/vorg.h index c3d3ffdae..caffea875 100644 --- a/gfx/ots/src/vorg.h +++ b/gfx/ots/src/vorg.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2009-2017 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -16,7 +16,16 @@ struct OpenTypeVORGMetrics { int16_t vert_origin_y; }; -struct OpenTypeVORG { +class OpenTypeVORG : public Table { + public: + explicit OpenTypeVORG(Font *font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t *data, size_t length); + bool Serialize(OTSStream *out); + bool ShouldSerialize(); + + private: uint16_t major_version; uint16_t minor_version; int16_t default_vert_origin_y; diff --git a/gfx/ots/src/vvar.cc b/gfx/ots/src/vvar.cc new file mode 100644 index 000000000..b47ea479d --- /dev/null +++ b/gfx/ots/src/vvar.cc @@ -0,0 +1,95 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "vvar.h" + +#include "variations.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeVVAR +// ----------------------------------------------------------------------------- + +bool OpenTypeVVAR::Parse(const uint8_t* data, size_t length) { + Buffer table(data, length); + + uint16_t majorVersion; + uint16_t minorVersion; + uint32_t itemVariationStoreOffset; + uint32_t advanceHeightMappingOffset; + uint32_t tsbMappingOffset; + uint32_t bsbMappingOffset; + uint32_t vOrgMappingOffset; + + if (!table.ReadU16(&majorVersion) || + !table.ReadU16(&minorVersion) || + !table.ReadU32(&itemVariationStoreOffset) || + !table.ReadU32(&advanceHeightMappingOffset) || + !table.ReadU32(&tsbMappingOffset) || + !table.ReadU32(&bsbMappingOffset) || + !table.ReadU32(&vOrgMappingOffset)) { + return DropVariations("Failed to read table header"); + } + + if (majorVersion != 1) { + return DropVariations("Unknown table version"); + } + + if (itemVariationStoreOffset > length || + advanceHeightMappingOffset > length || + tsbMappingOffset > length || + bsbMappingOffset > length || + vOrgMappingOffset > length) { + return DropVariations("Invalid subtable offset"); + } + + if (!ParseItemVariationStore(GetFont(), data + itemVariationStoreOffset, + length - itemVariationStoreOffset)) { + return DropVariations("Failed to parse item variation store"); + } + + if (advanceHeightMappingOffset) { + if (!ParseDeltaSetIndexMap(GetFont(), data + advanceHeightMappingOffset, + length - advanceHeightMappingOffset)) { + return DropVariations("Failed to parse advance height mappings"); + } + } + + if (tsbMappingOffset) { + if (!ParseDeltaSetIndexMap(GetFont(), data + tsbMappingOffset, + length - tsbMappingOffset)) { + return DropVariations("Failed to parse TSB mappings"); + } + } + + if (bsbMappingOffset) { + if (!ParseDeltaSetIndexMap(GetFont(), data + bsbMappingOffset, + length - bsbMappingOffset)) { + return DropVariations("Failed to parse BSB mappings"); + } + } + + if (vOrgMappingOffset) { + if (!ParseDeltaSetIndexMap(GetFont(), data + vOrgMappingOffset, + length - vOrgMappingOffset)) { + return DropVariations("Failed to parse vOrg mappings"); + } + } + + this->m_data = data; + this->m_length = length; + + return true; +} + +bool OpenTypeVVAR::Serialize(OTSStream* out) { + if (!out->Write(this->m_data, this->m_length)) { + return Error("Failed to write VVAR table"); + } + + return true; +} + +} // namespace ots diff --git a/gfx/ots/src/vvar.h b/gfx/ots/src/vvar.h new file mode 100644 index 000000000..15d435745 --- /dev/null +++ b/gfx/ots/src/vvar.h @@ -0,0 +1,31 @@ +// Copyright (c) 2018 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef OTS_VVAR_H_ +#define OTS_VVAR_H_ + +#include "ots.h" + +namespace ots { + +// ----------------------------------------------------------------------------- +// OpenTypeVVAR Interface +// ----------------------------------------------------------------------------- + +class OpenTypeVVAR : public Table { + public: + explicit OpenTypeVVAR(Font* font, uint32_t tag) + : Table(font, tag, tag) { } + + bool Parse(const uint8_t* data, size_t length); + bool Serialize(OTSStream* out); + + private: + const uint8_t *m_data; + size_t m_length; +}; + +} // namespace ots + +#endif // OTS_VVAR_H_ diff --git a/gfx/ots/sync.sh b/gfx/ots/sync.sh index 5a7e54b0a..81738f9e1 100755 --- a/gfx/ots/sync.sh +++ b/gfx/ots/sync.sh @@ -20,10 +20,19 @@ echo "Updating include..." rm -rf include/ cp -r $1/include . +echo "Updating tests..." +rm -rf tests/* +mkdir -p tests +cp -r $1/tests/*.cc tests + echo "Updating README.mozilla..." REVISION=`cd $1; git log | head -1 | sed "s/commit //"` -sed -e "s/\(Current revision: \).*/\1$REVISION/" README.mozilla > README.tmp +VERSION=`cd $1; git describe | cut -d '-' -f 1 | sed 's/v//'` +sed -e "s/\(Current revision: \).*/\1$REVISION \($VERSION\)/" README.mozilla > README.tmp mv README.tmp README.mozilla echo "Applying ots-visibility.patch..." patch -p3 < ots-visibility.patch + +echo "Applying ots-lz4.patch..." +patch -p3 < ots-lz4.patch diff --git a/gfx/ots/tests/cff_charstring_test.cc b/gfx/ots/tests/cff_charstring_test.cc new file mode 100644 index 000000000..18e077e8f --- /dev/null +++ b/gfx/ots/tests/cff_charstring_test.cc @@ -0,0 +1,1588 @@ +// Copyright (c) 2010-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cff_charstring.h" + +#include <gtest/gtest.h> + +#include <climits> +#include <vector> + +#include "cff.h" + +// Returns a biased number for callsubr and callgsubr operators. +#define GET_SUBR_NUMBER(n) ((n) - 107) +#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) + +namespace { + +// A constant which is used in AddSubr function below. +const int kOpPrefix = INT_MAX; + +// Encodes an operator |op| to 1 or more bytes and pushes them to |out_bytes|. +// Returns true if the conversion succeeds. +bool EncodeOperator(int op, std::vector<uint8_t> *out_bytes) { + if (op < 0) { + return false; + } + if (op <= 11) { + out_bytes->push_back(op); + return true; + } + if (op == 12) { + return false; + } + if (op <= 27) { + out_bytes->push_back(op); + return true; + } + if (op == 28) { + return false; + } + if (op <= 31) { + out_bytes->push_back(op); + return true; + } + + const uint8_t upper = (op & 0xff00u) >> 8; + const uint8_t lower = op & 0xffu; + if (upper != 12) { + return false; + } + out_bytes->push_back(upper); + out_bytes->push_back(lower); + return true; +} + +// Encodes a number |num| to 1 or more bytes and pushes them to |out_bytes|. +// Returns true if the conversion succeeds. The function does not support 16.16 +// Fixed number. +bool EncodeNumber(int num, std::vector<uint8_t> *out_bytes) { + if (num >= -107 && num <= 107) { + out_bytes->push_back(num + 139); + return true; + } + if (num >= 108 && num <= 1131) { + const uint8_t v = ((num - 108) / 256) + 247; + const uint8_t w = (num - 108) % 256; + out_bytes->push_back(v); + out_bytes->push_back(w); + return true; + } + if (num <= -108 && num >= -1131) { + const uint8_t v = (-(num + 108) / 256) + 251; + const uint8_t w = -(num + 108) % 256; + out_bytes->push_back(v); + out_bytes->push_back(w); + return true; + } + if (num <= 32768 && num >= -32767) { + const uint8_t v = (num % 0xff00u) >> 8; + const uint8_t w = num % 0xffu; + out_bytes->push_back(28); + out_bytes->push_back(v); + out_bytes->push_back(w); + return true; + } + return false; +} + +// Adds a subroutine |subr| to |out_buffer| and |out_subr|. The contents of the +// subroutine is copied to |out_buffer|, and then the position of the subroutine +// in |out_buffer| is written to |out_subr|. Returns true on success. +bool AddSubr(const int *subr, size_t subr_len, + std::vector<uint8_t>* out_buffer, ots::CFFIndex *out_subr) { + size_t pre_offset = out_buffer->size(); + for (size_t i = 0; i < subr_len; ++i) { + if (subr[i] != kOpPrefix) { + if (!EncodeNumber(subr[i], out_buffer)) { + return false; + } + } else { + if (i + 1 == subr_len) { + return false; + } + ++i; + if (!EncodeOperator(subr[i], out_buffer)) { + return false; + } + } + } + + ++(out_subr->count); + out_subr->off_size = 1; + if (out_subr->offsets.empty()) { + out_subr->offsets.push_back(pre_offset); + } + out_subr->offsets.push_back(out_buffer->size()); + return true; +} + +// Validates |char_string| and returns true if it's valid. +bool Validate(const int *char_string, size_t char_string_len, + const int *global_subrs, size_t global_subrs_len, + const int *local_subrs, size_t local_subrs_len) { + std::vector<uint8_t> buffer; + ots::CFFIndex* char_strings_index = new ots::CFFIndex; + ots::CFFIndex global_subrs_index; + ots::CFFIndex* local_subrs_index = new ots::CFFIndex; + + if (char_string) { + if (!AddSubr(char_string, char_string_len, + &buffer, char_strings_index)) { + return false; + } + } + if (global_subrs) { + if (!AddSubr(global_subrs, global_subrs_len, + &buffer, &global_subrs_index)) { + return false; + } + } + if (local_subrs) { + if (!AddSubr(local_subrs, local_subrs_len, + &buffer, local_subrs_index)) { + return false; + } + } + + ots::Buffer ots_buffer(&buffer[0], buffer.size()); + + ots::FontFile* file = new ots::FontFile(); + file->context = new ots::OTSContext(); + ots::Font* font = new ots::Font(file); + ots::OpenTypeCFF* cff = new ots::OpenTypeCFF(font, OTS_TAG_CFF); + cff->charstrings_index = char_strings_index; + cff->local_subrs = local_subrs_index; + bool ret = ots::ValidateCFFCharStrings(*cff, + global_subrs_index, + &ots_buffer); + delete file->context; + delete file; + delete font; + delete cff; + + return ret; +} + +// Validates |char_string| and returns true if it's valid. +bool ValidateCharStrings(const int *char_string, size_t char_string_len) { + return Validate(char_string, char_string_len, NULL, 0, NULL, 0); +} + +} // namespace + +TEST(ValidateTest, TestRMoveTo) { + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kRMoveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, // width + 1, 2, kOpPrefix, ots::kRMoveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kRMoveTo, + 1, 2, 3, kOpPrefix, ots::kRMoveTo, // invalid number of args + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestHMoveTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kHMoveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, // width + 1, kOpPrefix, ots::kHMoveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kHMoveTo, + 1, 2, kOpPrefix, ots::kHMoveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestVMoveTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, // width + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, kOpPrefix, ots::kVMoveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestRLineTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, kOpPrefix, ots::kRLineTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, kOpPrefix, ots::kRLineTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, kOpPrefix, ots::kRLineTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kRLineTo, // can't be the first op. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestHLineTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, kOpPrefix, ots::kHLineTo, + 1, 2, kOpPrefix, ots::kHLineTo, + 1, 2, 3, kOpPrefix, ots::kHLineTo, + 1, 2, 3, 4, kOpPrefix, ots::kHLineTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kHLineTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kHLineTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kHLineTo, // can't be the first op. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestVLineTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, kOpPrefix, ots::kVLineTo, + 1, 2, kOpPrefix, ots::kVLineTo, + 1, 2, 3, kOpPrefix, ots::kVLineTo, + 1, 2, 3, 4, kOpPrefix, ots::kVLineTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kVLineTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kVLineTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVLineTo, // can't be the first op. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestRRCurveTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, kOpPrefix, ots::kRRCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, kOpPrefix, ots::kRRCurveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kRRCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, 5, 6, kOpPrefix, ots::kRRCurveTo, // can't be the first op. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestHHCurveTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, kOpPrefix, ots::kHHCurveTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kHHCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kHHCurveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, kOpPrefix, ots::kHHCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, kOpPrefix, ots::kHHCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, 5, kOpPrefix, ots::kHHCurveTo, // can't be the first op. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestHVCurveTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + // The first form. + 1, 2, 3, 4, kOpPrefix, ots::kHVCurveTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kHVCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, kOpPrefix, ots::kHVCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + kOpPrefix, ots::kHVCurveTo, + // The second form. + 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kHVCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kHVCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + kOpPrefix, ots::kHVCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, kOpPrefix, ots::kHVCurveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, kOpPrefix, ots::kHVCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, kOpPrefix, ots::kHVCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, kOpPrefix, ots::kHVCurveTo, // can't be the first op. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestRCurveLine) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kRCurveLine, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + kOpPrefix, ots::kRCurveLine, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, kOpPrefix, ots::kRCurveLine, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + // can't be the first op. + 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kRCurveLine, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestRLineCurve) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kRLineCurve, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, kOpPrefix, ots::kRLineCurve, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, kOpPrefix, ots::kRLineCurve, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + // can't be the first op. + 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kRLineCurve, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestVHCurveTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + // The first form. + 1, 2, 3, 4, kOpPrefix, ots::kVHCurveTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kVHCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, kOpPrefix, ots::kVHCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + kOpPrefix, ots::kVHCurveTo, + // The second form. + 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kVHCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kVHCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + kOpPrefix, ots::kVHCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, kOpPrefix, ots::kVHCurveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, kOpPrefix, ots::kVHCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, kOpPrefix, ots::kVHCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, kOpPrefix, ots::kVHCurveTo, // can't be the first op. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestVVCurveTo) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, kOpPrefix, ots::kVVCurveTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kVVCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kVVCurveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kVVCurveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kVVCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, kOpPrefix, ots::kVVCurveTo, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, kOpPrefix, ots::kVVCurveTo, // can't be the first op. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestFlex) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, kOpPrefix, ots::kFlex, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kFlex, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, kOpPrefix, ots::kFlex, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, kOpPrefix, ots::kFlex, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestHFlex) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, kOpPrefix, ots::kHFlex, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kHFlex, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, kOpPrefix, ots::kHFlex, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, 5, 6, 7, kOpPrefix, ots::kHFlex, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestHFlex1) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kHFlex1, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kHFlex1, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kHFlex1, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kHFlex1, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestFlex1) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, kOpPrefix, ots::kFlex1, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kFlex1, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, kOpPrefix, ots::kFlex1, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, kOpPrefix, ots::kFlex1, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestEndChar) { + { + const int char_string[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr, + }; + const int local_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(Validate(char_string, ARRAYSIZE(char_string), + NULL, 0, + local_subrs, ARRAYSIZE(local_subrs))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr, + }; + const int global_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(Validate(char_string, ARRAYSIZE(char_string), + global_subrs, ARRAYSIZE(global_subrs), + NULL, 0)); + } +} + +TEST(ValidateTest, TestHStem) { + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 0, // width + 1, 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 0, 1, 2, kOpPrefix, ots::kHStem, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kHStem, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestVStem) { + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kVStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, kOpPrefix, ots::kVStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 0, // width + 1, 2, kOpPrefix, ots::kVStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 0, 1, 2, kOpPrefix, ots::kVStem, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kVStem, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestHStemHm) { + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kHStemHm, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, kOpPrefix, ots::kHStemHm, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 0, // width + 1, 2, kOpPrefix, ots::kHStemHm, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 0, 1, 2, kOpPrefix, ots::kHStemHm, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kHStemHm, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestVStemHm) { + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kVStemHm, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, kOpPrefix, ots::kVStemHm, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 0, // width + 1, 2, kOpPrefix, ots::kVStemHm, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 0, 1, 2, kOpPrefix, ots::kVStemHm, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kVMoveTo, + 1, 2, 3, 4, 5, kOpPrefix, ots::kVStemHm, // invalid + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestHintMask) { + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kHintMask, 0x00, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kHStem, + 3, 4, 5, 6, kOpPrefix, ots::kHintMask, 0x00, // vstem + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, ots::kHintMask, 0x00, // no stems to mask + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kHStem, + 3, 4, 5, kOpPrefix, ots::kHintMask, 0x00, // invalid vstem + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestCntrMask) { + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kCntrMask, 0x00, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kHStem, + 3, 4, 5, 6, kOpPrefix, ots::kCntrMask, 0x00, // vstem + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, ots::kCntrMask, 0x00, // no stems to mask + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, kOpPrefix, ots::kHStem, + 3, 4, 5, kOpPrefix, ots::kCntrMask, 0x00, // invalid vstem + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestAbs) { + { + const int char_string[] = { + -1, kOpPrefix, ots::kAbs, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, ots::kAbs, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestAdd) { + { + const int char_string[] = { + 0, 1, kOpPrefix, ots::kAdd, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kAdd, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestSub) { + { + const int char_string[] = { + 2, 1, kOpPrefix, ots::kSub, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kSub, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestDiv) { + // TODO(yusukes): Test div-by-zero. + { + const int char_string[] = { + 2, 1, kOpPrefix, ots::kDiv, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kDiv, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestNeg) { + { + const int char_string[] = { + -1, kOpPrefix, ots::kNeg, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, ots::kNeg, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestRandom) { + { + const int char_string[] = { + kOpPrefix, ots::kRandom, // OTS rejects the operator. + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestMul) { + { + const int char_string[] = { + 2, 1, kOpPrefix, ots::kMul, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kMul, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestSqrt) { + // TODO(yusukes): Test negative numbers. + { + const int char_string[] = { + 4, kOpPrefix, ots::kSqrt, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, ots::kSqrt, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestDrop) { + { + const int char_string[] = { + 1, 1, kOpPrefix, ots::kAdd, + kOpPrefix, ots::kDrop, + 1, 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, ots::kDrop, // invalid + 1, 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestExch) { + { + const int char_string[] = { + 1, 1, kOpPrefix, ots::kAdd, + kOpPrefix, ots::kDup, + kOpPrefix, ots::kExch, + kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 1, kOpPrefix, ots::kAdd, + kOpPrefix, ots::kExch, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestIndex) { + { + const int char_string[] = { + 1, 2, 3, -1, kOpPrefix, ots::kIndex, // OTS rejects the operator. + kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestRoll) { + { + const int char_string[] = { + 1, 2, 2, 1, kOpPrefix, ots::kRoll, // OTS rejects the operator. + kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestDup) { + { + const int char_string[] = { + 1, 1, kOpPrefix, ots::kAdd, + kOpPrefix, ots::kDup, + kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, ots::kDup, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestPut) { + { + const int char_string[] = { + 1, 10, kOpPrefix, ots::kPut, // OTS rejects the operator. + 1, 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestGet) { + { + const int char_string[] = { + 1, 10, kOpPrefix, ots::kGet, // OTS rejects the operator. + 1, 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestAnd) { + { + const int char_string[] = { + 2, 1, kOpPrefix, ots::kAnd, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kAnd, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestOr) { + { + const int char_string[] = { + 2, 1, kOpPrefix, ots::kOr, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kOr, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestNot) { + { + const int char_string[] = { + 1, kOpPrefix, ots::kNot, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, ots::kNot, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestEq) { + { + const int char_string[] = { + 2, 1, kOpPrefix, ots::kEq, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, kOpPrefix, ots::kEq, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestIfElse) { + { + const int char_string[] = { + 1, 2, 3, 4, kOpPrefix, ots::kIfElse, + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, kOpPrefix, ots::kIfElse, // invalid + 2, kOpPrefix, ots::kHStem, + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestCallSubr) { + // Call valid subr. + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr, + }; + const int local_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(Validate(char_string, ARRAYSIZE(char_string), + NULL, 0, + local_subrs, ARRAYSIZE(local_subrs))); + } + // Call undefined subr. + { + const int char_string[] = { + GET_SUBR_NUMBER(-1), kOpPrefix, ots::kCallSubr, + }; + const int local_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string), + NULL, 0, + local_subrs, ARRAYSIZE(local_subrs))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(1), kOpPrefix, ots::kCallSubr, + }; + const int local_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string), + NULL, 0, + local_subrs, ARRAYSIZE(local_subrs))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(-1), kOpPrefix, ots::kCallSubr, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(1), kOpPrefix, ots::kCallSubr, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestCallGSubr) { + // Call valid subr. + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr, + }; + const int global_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(Validate(char_string, ARRAYSIZE(char_string), + global_subrs, ARRAYSIZE(global_subrs), + NULL, 0)); + } + // Call undefined subr. + { + const int char_string[] = { + GET_SUBR_NUMBER(-1), kOpPrefix, ots::kCallGSubr, + }; + const int global_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string), + global_subrs, ARRAYSIZE(global_subrs), + NULL, 0)); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(1), kOpPrefix, ots::kCallGSubr, + }; + const int global_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string), + global_subrs, ARRAYSIZE(global_subrs), + NULL, 0)); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(-1), kOpPrefix, ots::kCallGSubr, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(1), kOpPrefix, ots::kCallGSubr, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestCallGSubrWithComputedValues) { + { + // OTS does not allow to call(g)subr with a subroutine number which is + // not a immediate value for safety. + const int char_string[] = { + 0, 0, kOpPrefix, ots::kAdd, + kOpPrefix, ots::kCallGSubr, + }; + const int global_subrs[] = { + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string), + global_subrs, ARRAYSIZE(global_subrs), + NULL, 0)); + } +} + +TEST(ValidateTest, TestInfiniteLoop) { + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr, + }; + const int local_subrs[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr, + }; + EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string), + NULL, 0, + local_subrs, ARRAYSIZE(local_subrs))); + } + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr, + }; + const int global_subrs[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr, + }; + EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string), + global_subrs, ARRAYSIZE(global_subrs), + NULL, 0)); + } + // mutual recursion which doesn't stop. + { + const int char_string[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr, + }; + const int global_subrs[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr, + }; + const int local_subrs[] = { + GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr, + }; + EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string), + global_subrs, ARRAYSIZE(global_subrs), + local_subrs, ARRAYSIZE(local_subrs))); + } +} + +TEST(ValidateTest, TestStackOverflow) { + { + const int char_string[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, + kOpPrefix, ots::kEndChar, + }; + EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, // overflow + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestDeprecatedOperators) { + { + const int char_string[] = { + kOpPrefix, 16, // 'blend'. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, (12 << 8) + 8, // 'store'. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + kOpPrefix, (12 << 8) + 13, // 'load'. + kOpPrefix, ots::kEndChar, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} + +TEST(ValidateTest, TestUnterminatedCharString) { + // No endchar operator. + { + const int char_string[] = { + 123, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 123, 456, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } + { + const int char_string[] = { + 123, 456, kOpPrefix, ots::kReturn, + }; + EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string))); + } +} diff --git a/gfx/ots/tests/layout_common_table_test.cc b/gfx/ots/tests/layout_common_table_test.cc new file mode 100644 index 000000000..91e429741 --- /dev/null +++ b/gfx/ots/tests/layout_common_table_test.cc @@ -0,0 +1,770 @@ +// Copyright (c) 2011-2017 The OTS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <cmath> +#include <vector> +#include <gtest/gtest.h> + +#include "layout.h" +#include "ots-memory-stream.h" + +namespace { + +const uint32_t kFakeTag = 0x00000000; +const size_t kScriptRecordSize = 6; +const size_t kLangSysRecordSize = 6; + +bool BuildFakeScriptListTable(ots::OTSStream *out, const uint16_t script_count, + const uint16_t langsys_count, + const uint16_t feature_count) { + if (!out->WriteU16(script_count)) { + return false; + } + const off_t script_record_end = out->Tell() + + kScriptRecordSize * script_count; + const size_t script_table_size = 4 + kLangSysRecordSize * langsys_count; + for (unsigned i = 0; i < script_count; ++i) { + if (!out->WriteU32(kFakeTag) || + !out->WriteU16(script_record_end + i * script_table_size)) { + return false; + } + } + + // Offsets to LangSys tables are measured from the beginning of each + // script table. + const off_t langsys_record_end = 4 + kLangSysRecordSize * langsys_count; + const size_t langsys_table_size = 6 + 2 * feature_count; + // Write Fake Script tables. + for (unsigned i = 0; i < script_count; ++i) { + if (!out->WriteU16(0x0000) || + !out->WriteU16(langsys_count)) { + return false; + } + for (unsigned j = 0; j < langsys_count; ++j) { + if (!out->WriteU32(kFakeTag) || + !out->WriteU16(langsys_record_end + j * langsys_table_size)) { + return false; + } + } + } + + // Write Fake LangSys tables. + for (unsigned i = 0; i < langsys_count; ++i) { + if (!out->WriteU16(0x0000) || + !out->WriteU16(0xFFFF) || + !out->WriteU16(feature_count)) { + return false; + } + for (unsigned j = 0; j < feature_count; ++j) { + if (!out->WriteU16(j)) { + return false; + } + } + } + return true; +} + +const size_t kFeatureRecordSize = 6; + +bool BuildFakeFeatureListTable(ots::OTSStream *out, + const uint16_t feature_count, + const uint16_t lookup_count) { + if (!out->WriteU16(feature_count)) { + return false; + } + const off_t feature_record_end = out->Tell() + + kFeatureRecordSize * feature_count; + const size_t feature_table_size = 4 + 2 * lookup_count; + for (unsigned i = 0; i < feature_count; ++i) { + if (!out->WriteU32(kFakeTag) || + !out->WriteU16(feature_record_end + i * feature_table_size)) { + return false; + } + } + + // Write FeatureTable + for (unsigned i = 0; i < feature_count; ++i) { + if (!out->WriteU16(0x0000) || + !out->WriteU16(lookup_count)) { + return false; + } + for (uint16_t j = 0; j < lookup_count; ++j) { + if (!out->WriteU16(j)) { + return false; + } + } + } + return true; +} + +bool BuildFakeLookupListTable(ots::OTSStream *out, const uint16_t lookup_count, + const uint16_t subtable_count) { + if (!out->WriteU16(lookup_count)) { + return false; + } + const off_t base_offset_lookup = out->Tell(); + if (!out->Pad(2 * lookup_count)) { + return false; + } + + std::vector<off_t> offsets_lookup(lookup_count, 0); + for (uint16_t i = 0; i < lookup_count; ++i) { + offsets_lookup[i] = out->Tell(); + if (!out->WriteU16(i + 1) || + !out->WriteU16(0) || + !out->WriteU16(subtable_count) || + !out->Pad(2 * subtable_count) || + !out->WriteU16(0)) { + return false; + } + } + + const off_t offset_lookup_table_end = out->Tell(); + // Allocate 256 bytes for each subtable. + if (!out->Pad(256 * lookup_count * subtable_count)) { + return false; + } + + if (!out->Seek(base_offset_lookup)) { + return false; + } + for (unsigned i = 0; i < lookup_count; ++i) { + if (!out->WriteU16(offsets_lookup[i])) { + return false; + } + } + + for (unsigned i = 0; i < lookup_count; ++i) { + if (!out->Seek(offsets_lookup[i] + 6)) { + return false; + } + for (unsigned j = 0; j < subtable_count; ++j) { + if (!out->WriteU16(offset_lookup_table_end + + 256*i*subtable_count + 256*j)) { + return false; + } + } + } + return true; +} + +bool BuildFakeCoverageFormat1(ots::OTSStream *out, const uint16_t glyph_count) { + if (!out->WriteU16(1) || !out->WriteU16(glyph_count)) { + return false; + } + for (uint16_t glyph_id = 1; glyph_id <= glyph_count; ++glyph_id) { + if (!out->WriteU16(glyph_id)) { + return false; + } + } + return true; +} + +bool BuildFakeCoverageFormat2(ots::OTSStream *out, const uint16_t range_count) { + if (!out->WriteU16(2) || !out->WriteU16(range_count)) { + return false; + } + uint16_t glyph_id = 1; + uint16_t start_coverage_index = 0; + for (unsigned i = 0; i < range_count; ++i) { + // Write consecutive ranges in which each range consists of two glyph id. + if (!out->WriteU16(glyph_id) || + !out->WriteU16(glyph_id + 1) || + !out->WriteU16(start_coverage_index)) { + return false; + } + glyph_id += 2; + start_coverage_index += 2; + } + return true; +} + +bool BuildFakeClassDefFormat1(ots::OTSStream *out, const uint16_t glyph_count) { + if (!out->WriteU16(1) || + !out->WriteU16(1) || + !out->WriteU16(glyph_count)) { + return false; + } + for (uint16_t class_value = 1; class_value <= glyph_count; ++class_value) { + if (!out->WriteU16(class_value)) { + return false; + } + } + return true; +} + +bool BuildFakeClassDefFormat2(ots::OTSStream *out, const uint16_t range_count) { + if (!out->WriteU16(2) || !out->WriteU16(range_count)) { + return false; + } + uint16_t glyph_id = 1; + for (uint16_t class_value = 1; class_value <= range_count; ++class_value) { + // Write consecutive ranges in which each range consists of one glyph id. + if (!out->WriteU16(glyph_id) || + !out->WriteU16(glyph_id + 1) || + !out->WriteU16(class_value)) { + return false; + } + glyph_id += 2; + } + return true; +} + +bool BuildFakeDeviceTable(ots::OTSStream *out, const uint16_t start_size, + const uint16_t end_size, const uint16_t format) { + if (!out->WriteU16(start_size) || + !out->WriteU16(end_size) || + !out->WriteU16(format)) { + return false; + } + + const unsigned num_values = std::abs(end_size - start_size) + 1; + const unsigned num_bits = (1 << format) * num_values; + const unsigned num_units = (num_bits - 1) / 16 + 1; + if (!out->Pad(num_units * 2)) { + return false; + } + return true; +} + +class TestStream : public ots::MemoryStream { + public: + TestStream() + : ots::MemoryStream(data_, sizeof(data_)), size_(0) { + std::memset(reinterpret_cast<char*>(data_), 0, sizeof(data_)); + } + + uint8_t* data() { return data_; } + size_t size() const { return size_; } + + virtual bool WriteRaw(const void *d, size_t length) { + if (Tell() + length > size_) { + size_ = Tell() + length; + } + return ots::MemoryStream::WriteRaw(d, length); + } + + private: + size_t size_; + uint8_t data_[4096]; +}; + +class TableTest : public ::testing::Test { + protected: + + virtual void SetUp() { + ots::FontFile *file = new ots::FontFile(); + file->context = new ots::OTSContext(); + font = new ots::Font(file); + } + + virtual void TearDown() { + delete font->file->context; + delete font->file; + delete font; + } + + TestStream out; + ots::Font *font; +}; + +class ScriptListTableTest : public TableTest { }; +class DeviceTableTest : public TableTest { }; +class CoverageTableTest : public TableTest { }; +class CoverageFormat1Test : public TableTest { }; +class CoverageFormat2Test : public TableTest { }; +class ClassDefTableTest : public TableTest { }; +class ClassDefFormat1Test : public TableTest { }; +class ClassDefFormat2Test : public TableTest { }; +class LookupSubtableParserTest : public TableTest { }; + +class FeatureListTableTest : public TableTest { + protected: + + virtual void SetUp() { + TableTest::SetUp(); + num_features = 0; + } + + uint16_t num_features; +}; + +bool fakeTypeParserReturnsTrue(const ots::Font*, const uint8_t *, + const size_t) { + return true; +} + +bool fakeTypeParserReturnsFalse(const ots::Font*, const uint8_t *, + const size_t) { + return false; +} + +const ots::LookupSubtableParser::TypeParser TypeParsersReturnTrue[] = { + {1, fakeTypeParserReturnsTrue}, + {2, fakeTypeParserReturnsTrue}, + {3, fakeTypeParserReturnsTrue}, + {4, fakeTypeParserReturnsTrue}, + {5, fakeTypeParserReturnsTrue} +}; + +// Fake lookup subtable parser which always returns true. +const ots::LookupSubtableParser FakeLookupParserReturnsTrue = { + 5, 5, TypeParsersReturnTrue, +}; + +const ots::LookupSubtableParser::TypeParser TypeParsersReturnFalse[] = { + {1, fakeTypeParserReturnsFalse} +}; + +// Fake lookup subtable parser which always returns false. +const ots::LookupSubtableParser FakeLookupParserReturnsFalse = { + 1, 1, TypeParsersReturnFalse +}; + +class LookupListTableTest : public TableTest { + protected: + + virtual void SetUp() { + TableTest::SetUp(); + num_lookups = 0; + } + + bool Parse() { + return ots::ParseLookupListTable(font, out.data(), out.size(), + &FakeLookupParserReturnsTrue, + &num_lookups); + } + + uint16_t num_lookups; +}; + +} // namespace + +TEST_F(ScriptListTableTest, TestSuccess) { + BuildFakeScriptListTable(&out, 1, 1, 1); + EXPECT_TRUE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestBadScriptCount) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set too large script count. + out.Seek(0); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestScriptRecordOffsetUnderflow) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set bad offset to ScriptRecord[0]. + out.Seek(6); + out.WriteU16(0); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestScriptRecordOffsetOverflow) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set bad offset to ScriptRecord[0]. + out.Seek(6); + out.WriteU16(out.size()); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestBadLangSysCount) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set too large langsys count. + out.Seek(10); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestLangSysRecordOffsetUnderflow) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set bad offset to LangSysRecord[0]. + out.Seek(16); + out.WriteU16(0); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestLangSysRecordOffsetOverflow) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set bad offset to LangSysRecord[0]. + out.Seek(16); + out.WriteU16(out.size()); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestBadReqFeatureIndex) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set too large feature index to ReqFeatureIndex of LangSysTable[0]. + out.Seek(20); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestBadFeatureCount) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set too large feature count to LangSysTable[0]. + out.Seek(22); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(ScriptListTableTest, TestBadFeatureIndex) { + BuildFakeScriptListTable(&out, 1, 1, 1); + // Set too large feature index to ReatureIndex[0] of LangSysTable[0]. + out.Seek(24); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseScriptListTable(font, out.data(), out.size(), 1)); +} + +TEST_F(FeatureListTableTest, TestSuccess) { + BuildFakeFeatureListTable(&out, 1, 1); + EXPECT_TRUE(ots::ParseFeatureListTable(font, out.data(), out.size(), 1, + &num_features)); + EXPECT_EQ(num_features, 1); +} + +TEST_F(FeatureListTableTest, TestSuccess2) { + BuildFakeFeatureListTable(&out, 5, 1); + EXPECT_TRUE(ots::ParseFeatureListTable(font, out.data(), out.size(), 1, + &num_features)); + EXPECT_EQ(num_features, 5); +} + +TEST_F(FeatureListTableTest, TestBadFeatureCount) { + BuildFakeFeatureListTable(&out, 1, 1); + // Set too large feature count. + out.Seek(0); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseFeatureListTable(font, out.data(), out.size(), 1, + &num_features)); +} + +TEST_F(FeatureListTableTest, TestOffsetFeatureUnderflow) { + BuildFakeFeatureListTable(&out, 1, 1); + // Set bad offset to FeatureRecord[0]. + out.Seek(6); + out.WriteU16(0); + EXPECT_FALSE(ots::ParseFeatureListTable(font, out.data(), out.size(), 1, + &num_features)); +} + +TEST_F(FeatureListTableTest, TestOffsetFeatureOverflow) { + BuildFakeFeatureListTable(&out, 1, 1); + // Set bad offset to FeatureRecord[0]. + out.Seek(6); + out.WriteU16(out.size()); + EXPECT_FALSE(ots::ParseFeatureListTable(font, out.data(), out.size(), 1, + &num_features)); +} + +TEST_F(FeatureListTableTest, TestBadLookupCount) { + BuildFakeFeatureListTable(&out, 1, 1); + // Set too large lookup count to FeatureTable[0]. + out.Seek(10); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseFeatureListTable(font, out.data(), out.size(), 1, + &num_features)); +} + +TEST_F(LookupListTableTest, TestSuccess) { + BuildFakeLookupListTable(&out, 1, 1); + EXPECT_TRUE(Parse()); + EXPECT_EQ(num_lookups, 1); +} + +TEST_F(LookupListTableTest, TestSuccess2) { + BuildFakeLookupListTable(&out, 5, 1); + EXPECT_TRUE(Parse()); + EXPECT_EQ(num_lookups, 5); +} + +TEST_F(LookupListTableTest, TestOffsetLookupTableUnderflow) { + BuildFakeLookupListTable(&out, 1, 1); + // Set bad offset to Lookup[0]. + out.Seek(2); + out.WriteU16(0); + EXPECT_FALSE(Parse()); +} + +TEST_F(LookupListTableTest, TestOffsetLookupTableOverflow) { + BuildFakeLookupListTable(&out, 1, 1); + // Set bad offset to Lookup[0]. + out.Seek(2); + out.WriteU16(out.size()); + EXPECT_FALSE(Parse()); +} + +TEST_F(LookupListTableTest, TestOffsetSubtableUnderflow) { + BuildFakeLookupListTable(&out, 1, 1); + // Set bad offset to SubTable[0] of LookupTable[0]. + out.Seek(10); + out.WriteU16(0); + EXPECT_FALSE(Parse()); +} + +TEST_F(LookupListTableTest, TestOffsetSubtableOverflow) { + BuildFakeLookupListTable(&out, 1, 1); + // Set bad offset to SubTable[0] of LookupTable[0]. + out.Seek(10); + out.WriteU16(out.size()); + EXPECT_FALSE(Parse()); +} + +TEST_F(LookupListTableTest, TesBadLookupCount) { + BuildFakeLookupListTable(&out, 1, 1); + // Set too large lookup count of LookupTable[0]. + out.Seek(0); + out.WriteU16(2); + EXPECT_FALSE(Parse()); +} + +TEST_F(LookupListTableTest, TesBadLookupType) { + BuildFakeLookupListTable(&out, 1, 1); + // Set too large lookup type of LookupTable[0]. + out.Seek(4); + out.WriteU16(6); + EXPECT_FALSE(Parse()); +} + +TEST_F(LookupListTableTest, TesBadLookupFlag) { + BuildFakeLookupListTable(&out, 1, 1); + // Set IgnoreBaseGlyphs(0x0002) to the lookup flag of LookupTable[0]. + out.Seek(6); + out.WriteU16(0x0002); + EXPECT_TRUE(Parse()); +} + +TEST_F(LookupListTableTest, TesBadSubtableCount) { + BuildFakeLookupListTable(&out, 1, 1); + // Set too large sutable count of LookupTable[0]. + out.Seek(8); + out.WriteU16(2); + EXPECT_FALSE(Parse()); +} + +TEST_F(CoverageTableTest, TestSuccessFormat1) { + BuildFakeCoverageFormat1(&out, 1); + EXPECT_TRUE(ots::ParseCoverageTable(font, out.data(), out.size(), 1)); +} + +TEST_F(CoverageTableTest, TestSuccessFormat2) { + BuildFakeCoverageFormat2(&out, 1); + EXPECT_TRUE(ots::ParseCoverageTable(font, out.data(), out.size(), 1)); +} + +TEST_F(CoverageTableTest, TestBadFormat) { + BuildFakeCoverageFormat1(&out, 1); + // Set bad format. + out.Seek(0); + out.WriteU16(3); + EXPECT_FALSE(ots::ParseCoverageTable(font, out.data(), out.size(), 1)); +} + +TEST_F(CoverageFormat1Test, TestBadGlyphCount) { + BuildFakeCoverageFormat1(&out, 1); + // Set too large glyph count. + out.Seek(2); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseCoverageTable(font, out.data(), out.size(), 1)); +} + +TEST_F(CoverageFormat1Test, TestBadGlyphId) { + BuildFakeCoverageFormat1(&out, 1); + // Set too large glyph id. + out.Seek(4); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseCoverageTable(font, out.data(), out.size(), 1)); +} + +TEST_F(CoverageFormat2Test, TestBadRangeCount) { + BuildFakeCoverageFormat2(&out, 1); + // Set too large range count. + out.Seek(2); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseCoverageTable(font, out.data(), out.size(), 1)); +} + +TEST_F(CoverageFormat2Test, TestBadRange) { + BuildFakeCoverageFormat2(&out, 1); + // Set reverse order glyph id to start/end fields. + out.Seek(4); + out.WriteU16(2); + out.WriteU16(1); + EXPECT_FALSE(ots::ParseCoverageTable(font, out.data(), out.size(), 1)); +} + +TEST_F(CoverageFormat2Test, TestRangeOverlap) { + BuildFakeCoverageFormat2(&out, 2); + // Set overlapping glyph id to an end field. + out.Seek(12); + out.WriteU16(1); + EXPECT_FALSE(ots::ParseCoverageTable(font, out.data(), out.size(), 2)); +} + +TEST_F(CoverageFormat2Test, TestRangeOverlap2) { + BuildFakeCoverageFormat2(&out, 2); + // Set overlapping range. + out.Seek(10); + out.WriteU16(1); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseCoverageTable(font, out.data(), out.size(), 2)); +} + +TEST_F(ClassDefTableTest, TestSuccessFormat1) { + BuildFakeClassDefFormat1(&out, 1); + EXPECT_TRUE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(ClassDefTableTest, TestSuccessFormat2) { + BuildFakeClassDefFormat2(&out, 1); + EXPECT_TRUE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(ClassDefTableTest, TestBadFormat) { + BuildFakeClassDefFormat1(&out, 1); + // Set bad format. + out.Seek(0); + out.WriteU16(3); + EXPECT_FALSE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(ClassDefFormat1Test, TestBadStartGlyph) { + BuildFakeClassDefFormat1(&out, 1); + // Set too large start glyph id. + out.Seek(2); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(ClassDefFormat1Test, TestBadGlyphCount) { + BuildFakeClassDefFormat1(&out, 1); + // Set too large glyph count. + out.Seek(4); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(ClassDefFormat1Test, TestBadClassValue) { + BuildFakeClassDefFormat1(&out, 1); + // Set too large class value. + out.Seek(6); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(ClassDefFormat2Test, TestBadRangeCount) { + BuildFakeClassDefFormat2(&out, 1); + // Set too large range count. + out.Seek(2); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(ClassDefFormat2Test, TestRangeOverlap) { + BuildFakeClassDefFormat2(&out, 2); + // Set overlapping glyph id to an end field. + out.Seek(12); + out.WriteU16(1); + EXPECT_FALSE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(ClassDefFormat2Test, TestRangeOverlap2) { + BuildFakeClassDefFormat2(&out, 2); + // Set overlapping range. + out.Seek(10); + out.WriteU16(1); + out.WriteU16(2); + EXPECT_FALSE(ots::ParseClassDefTable(font, out.data(), out.size(), 1, 1)); +} + +TEST_F(DeviceTableTest, TestDeltaFormat1Success) { + BuildFakeDeviceTable(&out, 1, 8, 1); + EXPECT_TRUE(ots::ParseDeviceTable(font, out.data(), out.size())); +} + +TEST_F(DeviceTableTest, TestDeltaFormat1Success2) { + BuildFakeDeviceTable(&out, 1, 9, 1); + EXPECT_TRUE(ots::ParseDeviceTable(font, out.data(), out.size())); +} + +TEST_F(DeviceTableTest, TestDeltaFormat1Fail) { + // Pass shorter length than expected. + BuildFakeDeviceTable(&out, 1, 8, 1); + EXPECT_FALSE(ots::ParseDeviceTable(font, out.data(), out.size() - 1)); +} + +TEST_F(DeviceTableTest, TestDeltaFormat1Fail2) { + // Pass shorter length than expected. + BuildFakeDeviceTable(&out, 1, 9, 1); + EXPECT_FALSE(ots::ParseDeviceTable(font, out.data(), out.size() - 1)); +} + +TEST_F(DeviceTableTest, TestDeltaFormat2Success) { + BuildFakeDeviceTable(&out, 1, 1, 2); + EXPECT_TRUE(ots::ParseDeviceTable(font, out.data(), out.size())); +} + +TEST_F(DeviceTableTest, TestDeltaFormat2Success2) { + BuildFakeDeviceTable(&out, 1, 8, 2); + EXPECT_TRUE(ots::ParseDeviceTable(font, out.data(), out.size())); +} + +TEST_F(DeviceTableTest, TestDeltaFormat2Fail) { + // Pass shorter length than expected. + BuildFakeDeviceTable(&out, 1, 8, 2); + EXPECT_FALSE(ots::ParseDeviceTable(font, out.data(), out.size() - 1)); +} + +TEST_F(DeviceTableTest, TestDeltaFormat2Fail2) { + // Pass shorter length than expected. + BuildFakeDeviceTable(&out, 1, 9, 2); + EXPECT_FALSE(ots::ParseDeviceTable(font, out.data(), out.size() - 1)); +} + +TEST_F(DeviceTableTest, TestDeltaFormat3Success) { + BuildFakeDeviceTable(&out, 1, 1, 3); + EXPECT_TRUE(ots::ParseDeviceTable(font, out.data(), out.size())); +} + +TEST_F(DeviceTableTest, TestDeltaFormat3Success2) { + BuildFakeDeviceTable(&out, 1, 8, 3); + EXPECT_TRUE(ots::ParseDeviceTable(font, out.data(), out.size())); +} + +TEST_F(DeviceTableTest, TestDeltaFormat3Fail) { + // Pass shorter length than expected. + BuildFakeDeviceTable(&out, 1, 8, 3); + EXPECT_FALSE(ots::ParseDeviceTable(font, out.data(), out.size() - 1)); +} + +TEST_F(DeviceTableTest, TestDeltaFormat3Fail2) { + // Pass shorter length than expected. + BuildFakeDeviceTable(&out, 1, 9, 3); + EXPECT_FALSE(ots::ParseDeviceTable(font, out.data(), out.size() - 1)); +} + +TEST_F(LookupSubtableParserTest, TestSuccess) { + { + EXPECT_TRUE(FakeLookupParserReturnsTrue.Parse(font, 0, 0, 1)); + } + { + EXPECT_TRUE(FakeLookupParserReturnsTrue.Parse(font, 0, 0, 5)); + } +} + +TEST_F(LookupSubtableParserTest, TestFail) { + { + // Pass bad lookup type which less than the smallest type. + EXPECT_FALSE(FakeLookupParserReturnsTrue.Parse(font, 0, 0, 0)); + } + { + // Pass bad lookup type which greater than the maximum type. + EXPECT_FALSE(FakeLookupParserReturnsTrue.Parse(font, 0, 0, 6)); + } + { + // Check the type parser failure. + EXPECT_FALSE(FakeLookupParserReturnsFalse.Parse(font, 0, 0, 1)); + } +} diff --git a/gfx/thebes/gfxUserFontSet.cpp b/gfx/thebes/gfxUserFontSet.cpp index 72c54d9b5..e1c55c334 100644 --- a/gfx/thebes/gfxUserFontSet.cpp +++ b/gfx/thebes/gfxUserFontSet.cpp @@ -180,18 +180,9 @@ public: virtual ots::TableAction GetTableAction(uint32_t aTag) override { // Preserve Graphite, color glyph and SVG tables - if ( -#ifdef RELEASE_OR_BETA // For Beta/Release, also allow OT Layout tables through - // unchecked, and rely on harfbuzz to handle them safely. - aTag == TRUETYPE_TAG('G', 'D', 'E', 'F') || + if (aTag == TRUETYPE_TAG('G', 'D', 'E', 'F') || aTag == TRUETYPE_TAG('G', 'P', 'O', 'S') || aTag == TRUETYPE_TAG('G', 'S', 'U', 'B') || -#endif - aTag == TRUETYPE_TAG('S', 'i', 'l', 'f') || - aTag == TRUETYPE_TAG('S', 'i', 'l', 'l') || - aTag == TRUETYPE_TAG('G', 'l', 'o', 'c') || - aTag == TRUETYPE_TAG('G', 'l', 'a', 't') || - aTag == TRUETYPE_TAG('F', 'e', 'a', 't') || aTag == TRUETYPE_TAG('S', 'V', 'G', ' ') || aTag == TRUETYPE_TAG('C', 'O', 'L', 'R') || aTag == TRUETYPE_TAG('C', 'P', 'A', 'L')) { |