Commit graph

516 commits

Author SHA1 Message Date
Adrian Johnson
5635c75a2c dwrite: add color font support 2022-02-27 20:20:24 +10:30
Matthias Clasen
65d4325e6f Fix mixed color clusters
When rendering clusters that have colored and non-colored
glyphs, we were falling back to using show_text_glyphs,
rendering all glyphs in the cluster without color.
Instead, make composite_one_color_glyph smart enough
to handle non-color glyphs, and only skip clusters
that are entirely non-color.

Testcase: hb-view AmiriQuranColored.otf -u 627,64e
2022-02-12 21:19:39 -06:00
Matthias Clasen
603cdf939f Fix rtl handling for color glyphs
When the run contains a mix of color and non-color
glyphs, composite_color_glyphs returns the non-color
glyphs unhandled in the same array. In the rtl case,
the glyphs are processed from the end and the unhandled
glyphs are accumulated at the end as well, and we
need to move them to the beginning of the array before
we return. Add the missing memmove call to do that.

Fixes: #533
2022-02-11 05:47:01 -05:00
Adrian Johnson
fea2463107 Support color fonts that use the foreground color
COLR fonts can have a layer with the same color as the current text
color. This change passes the current color (if solid) through to
the font backend where it can be used to render color fonts.

scaled_glyph_lookup checks if the foreground color has changed (for
glyph that require it) and requests a new color surface if required.

This also fixes a bug where scaled_glyph_lookup would always request a
color surface for glyphs for glyphs in color fonts that do not have
color.
2021-08-28 18:07:01 +09:30
Adrian Johnson
d0a2031c5c Merge branch 'fix-color-glyph-compositing' into 'master'
Fix compositing non-color glyphs in one case

See merge request cairo/cairo!224
2021-08-14 12:08:32 +00:00
Adrian Johnson
1e446cb31e Fix color fonts when antialias == SUBPIXEL or NONE 2021-08-14 07:06:34 +00:00
Adrian Johnson
62cc53f9b8 Add color user-font support
Adds new API cairo_user_font_face_set_render_color_glyph_func()
to set a color glyph renderer.
2021-08-14 06:06:19 +00:00
Matthias Clasen
4e859ddb19 Fix compositing non-color glyphs in one case
The intention here is: "if show_text_glyphs is unsupported,
try show_gyphs". We need to make sure to set the status to
unsupported before checking it, otherwise we end up looking
at the status that was set by composite_color_glyphs if
show_text_glyphs is NULL.

This showed up in https://github.com/harfbuzz/harfbuzz/issues/2675
2021-08-02 12:37:27 -04:00
Adrian Johnson
1c64d2635b Remove all gstate from _cairo_surface_tag
The gstate is not required and was causing some tag operations to be
ignored.
2021-07-18 18:13:10 +09:30
Uli Schlachter
a7c49ec861 Fix _cairo_surface_paint not setting is_clear
In commit 10e58a4a I changed the code in cairo-surface.c to avoid
setting surface->is_clear = FALSE; in some situations where it was not
necessary, because the operation did not actually modify anything (it
returned CAIRO_INT_STATUS_NOTHING_TO_DO). However, that change
accidentally also caused _cairo_surface_paint() not to set
surface->is_clear = TRUE; in similar cases. That was unintended.

This commit fixes that by always setting is_clear = TRUE when necessary,
but keeps the optimisation of not setting is_clear = FALSE when not
necessary.

The connection to the below issue is that the issue happened with
surfaces with width=0. Clearing such a surface with CAIRO_OPERATOR_CLEAR
causes CAIRO_INT_STATUS_NOTHING_TO_DO and thus is_clear = TRUE was not
set. This error was later caught by a failed assertion.

Fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/283
Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-01-11 18:37:52 +01:00
Uli Schlachter
91b5761acd Merge branch 'master' of gitlab.freedesktop.org:sgerwk/cairo 2020-07-20 18:42:01 +02:00
luzpaz
2982adec76 Fix documentation typo in src/cairo-surface.c 2019-12-20 11:10:19 +00:00
sgerwk
1a6a26be56 a surface may also be checked for status after finishing 2019-10-14 12:25:43 +02:00
Matthias Clasen
aa263f881f Fix a thinko in composite_color_glyphs
We can't just move around the contents of the
passed-in string, we need to make a copy. This
was showing up as memory corruption in pango.

See https://gitlab.gnome.org/GNOME/pango/issues/346
2019-07-18 14:38:47 -07:00
Adrian Johnson
2a21ed0293 tags: Don't ignore tag on empty pages
Issue 357
2019-02-01 19:47:00 +10:30
Adrian Johnson
1998239387 Use _cairo_malloc instead of malloc
_cairo_malloc(0) always returns NULL, but has not been used
consistently.  This patch replaces many calls to malloc() with
_cairo_malloc().

Fixes:  fdo# 101547
CVE: CVE-2017-9814 Heap buffer overflow at cairo-truetype-subset.c:1299
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
2018-05-07 16:35:51 -07:00
Matthias Clasen
17871c52ef Don't leak patterns when compositing color glyphs
We were forgetting to free the pattern here.
2018-01-04 23:25:09 -05:00
Matthias Clasen
903b0de539 Fix a logic error in color glyph compositing
When a color glyph is completely clipped away, we
get the non-zero status 'nothing to do'. In that case,
we must not exit early, since there might still be work
to do for the other color glyphs.

This bug was showing up as color glyphs stopping to render
in GTK+ entries that are scrolled to the right, and also
as color glyphs not rendering inside the selection sometimes.

See https://bugzilla.gnome.org/show_bug.cgi?id=790255 and
https://bugzilla.gnome.org/show_bug.cgi?id=788071.
2017-12-17 21:36:17 -05:00
Adrian Johnson
5ffbaf9e2f ps: add CAIRO_MIME_TYPE_EPS mime type for embedding EPS files 2017-11-09 22:02:05 +10:30
Adrian Johnson
d5cb45013b pdf: fix mime-unique-id jpeg attached to recording test
- Restructure the emit_surface code so that mime types are checked first.

- Add a test parameter to emit_surface to test if the surface will be emitted
  as an image or recording instead checking the surface type as the attached
  mime may override this.

- Mark surface as not clear when mime is attached to avoid optimizing away
  "clear" surfaces that have mime attached.

- Include entire surface in analysis if mime attached (also fixes bug with
  calculating the extents CONTENT_COLOR surfaces)
2017-11-09 22:01:40 +10:30
Adrian Johnson
bff47b43c4 pdf: fix mime-unique-id unbounded recording test
PDF XObjects need to specify the bounding box. Emit unbounded surfaces
when finishing as at this point the extents of all uses of the
unbounded surface are known.
2017-11-09 20:52:36 +10:30
Adrian Johnson
e1a02b180d Add CCITT_FAX mime type for PDF and PS surfaces
This completes the full set of PDF/PS image filters allowing image
data to be passed though without decompressing then recompresssing in
a less efficient format.

The difficulty with CCITT_FAX is it needs some decoding parameters
that are not stored inside the image data. This is achieved by using
an additional mime type CCITT_FAX_PARAMS that contains the params in
key=value format.
2017-10-22 08:42:36 +10:30
Behdad Esfahbod
99427c3f4f Handle SOURCE and CLEAR operators when painting color glyphs
In cairo, most operators are composited this way:

  ((src IN mask) OP dst) LERP_clip dst

but SOURCE and CLEAR operators are composited this way:

  (src OP dst) LERP_(clip IN mask) dst

(why is this not specified anywhere in the docs or source tree?)

With color glyphs, we were not special-casing SOURCE and CLEAR.
We do now.

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=102661
2017-09-12 01:35:15 -04:00
Guillermo Rodriguez
339fe9a768 Remove redundant check.
Spotted by David Kastrup <dak@gnu.org>.

Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
2017-08-21 16:29:10 -07:00
Behdad Esfahbod
495cb9a0a7 Fix uninitialized status! 2017-07-29 17:40:34 +01:00
Matthias Clasen
5e3350e4d1 Simplify things a bit
Do away with the separate check for color glyphs - we can just
do the filtering, and if there are no color glyphs, it is a
no-op. As long as we only do this for fonts with color glyphs,
it should be fine.

Reduce repetition in composite_color_glyphs by breaking out
some helper functions.
2017-07-29 12:30:50 +01:00
Matthias Clasen
db14d6d707 Render color glyphs as source, not as mask
Use paint instead of show_glyphs for color glyphs. To avoid
overhead, we only check for color glyphs if the font is known
to contain any. Paint clusters containing only color glyphs
and rewrite the inputs to remove the handled clusters and
glyphs.
2017-07-29 12:30:50 +01:00
Debarshi Ray
cffa452f44 doc: Clarify when the device scale is inherited and when it isn't
In short, cairo_surface_create_similar inherits it, while
cairo_surface_create_similar_image doesn't. It wasn't obvious without
reading the code or explicitly checking the device scale of the new
surface.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=99094

Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
2017-03-15 20:26:22 -07:00
Debarshi Ray
1192f97388 doc: Fix the units used by cairo_surface_create_similar_image
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=99094

Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
2017-03-15 20:26:18 -07:00
Bryce Harrington
9d2983175e Fix grammar in cairo_*_reference() function documentation.
"can be get" is incorrect grammar; "can be gotten" would be better, but
active voice is best.

Signed-off-by: Bryce Harrington <bryce@bryceharrington.org>
2016-10-10 14:39:19 -07:00
Adrian Johnson
dcbfb72647 pdf: structured text and hyperlink support 2016-10-01 22:05:42 +09:30
Adrian Johnson
4e70815b34 Add tag functions to cairo_t and cairo_surface_t
The cairo_tag_begin/cairo_tag_end API is for supporting hyperlinks and
creating tagged PDF files.

The source, ctm, and stroke style are passed to the backend to allow
these parameters to be used to specify hyperlink border attributes.
2016-10-01 17:14:28 +09:30
Adrian Johnson
747cab741c Add CAIRO_STATUS_WIN32_GDI_ERROR for GDI errors 2016-03-26 22:18:05 +10:30
Adrian Johnson
cdd5c92ced Add CAIRO_STATUS_FREETYPE_ERROR for errors returned by libfreetype 2016-03-26 21:45:59 +10:30
Adrian Johnson
c5ee3f11b5 Add CAIRO_STATUS_PNG_ERROR for errors returned by libpng 2016-03-26 19:04:44 +10:30
Adrian Johnson
b1192beac7 Don't cull very thin lines on vector surfaces
On vector surfaces, use a minimum line width when calculating extents.

Bug 77298
2015-10-17 18:39:18 +10:30
Bryce Harrington
904f1fdc1d surface: Clarify flush documentation 2015-03-18 15:49:41 -07:00
Adrian Johnson
f05e9332b3 Update mime type documentation. 2014-10-17 22:04:39 +10:30
Bryce Harrington
3e41f7b381 NEWS: Flesh out docs for new APIs 2014-10-13 18:30:23 -07:00
jimmyfrasche
2d89cbb30e Add more info to cairo_surface_set_mime_data docs.
Explains how to use cairo_surface_set_mime_data so that the image always
gets used even if the MIME data cannot be.

Signed-off-by: jimmyfrasche <soapboxcicero@gmail.com>
2014-06-05 13:14:11 -07:00
Bryce Harrington
8d0abb4a94 surface: Make parameter naming consistent between header and impl
This fixes this set of distcheck errors generating docs:

  src/cairo-surface.c:1668: warning: Parameter described in source code
  comment block but does not exist. FUNCTION:
  cairo_surface_set_device_scale Parameter: sx.

  src/cairo-surface.c:1668: warning: Parameter described in source code
  comment block but does not exist. FUNCTION:
  cairo_surface_set_device_scale Parameter: sy.

  src/cairo-surface.c:1668: warning: Parameter description for
  cairo_surface_set_device_scale::x_scale is missing in source code
  comment block.

  src/cairo-surface.c:1668: warning: Parameter description for
  cairo_surface_set_device_scale::y_scale is missing in source code
  comment block.

Signed-off-by: Bryce Harrington <b.harrington@samsung.com>
2014-03-13 15:13:34 -07:00
Bryce Harrington
e555dfc717 Add explanation to _cairo_surface_create_in_error
Patch by Homer Hsing

Bugzilla:  https://bugs.freedesktop.org/show_bug.cgi?id=50413
2014-02-26 18:42:41 -08:00
Adrian Johnson
5c0caa6f82 pdf: support JBIG2 mime data
JBIG2 images may have shared global data that is stored in a separate
stream in PDF. The CAIRO_MIME_TYPE_JBIG2 mime type is for the JBIG2
data for each image. All images that use global data must also set
CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID to a unique identifier. One of the
images must also set CAIRO_MIME_TYPE_JBIG2_GLOBAL to the global
data. The global data will be shared by all JBIG2 images with the same
CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID.
2013-09-15 20:50:46 +09:30
Alexander Larsson
935c64a434 surface: Inherit device scale in cairo_surface_create_similar()
Without this most code that uses similar surfaces for offscreen
rendering will render in a pixelized fashion if the final
target uses a device scale.
2013-09-05 16:11:10 +01:00
Alexander Larsson
bc792a5e0e surface: Merge scratch construction into _cairo_surface_create_scratch
We merge _cairo_surface_create_similar_scratch and
_cairo_surface_create_similar_solid into a single function named
_cairo_surface_create_scratch, to avoid confusion with
cairo_surface_create_similar which now will have a different
behaviour wrt the sizes and the device-scale.

_create_scratch assumes the width and height are in backend
coordinates, while create_similar does not.
2013-09-05 16:11:09 +01:00
Alexander Larsson
bdccf4fe51 surface: Opencode create_similar
We copy the _cairo_surface_create_similar_solid code into
cairo_surface_create_similar so that we can separate these later
as one wants to use backend sizes and one not.
2013-09-05 16:11:08 +01:00
Alexander Larsson
7ab34f302b surface: expose the device scale
This adds the new public functions
cairo_surface_set_device_scale and cairo_surface_get_device_scale and
updates old users of the internal functions.
2013-09-05 16:08:19 +01:00
Alexander Larsson
900fc4a890 gstate: Move device-scale font scaling to gstate
If we do this in surface it will be applied twice then
we chain to a different surface, like e.g. a subsurface.

We also remove a hack in cairo-surface-wrapper where it compensated
for the device scale not being applied.

v2: Compute the backend CTM in ensure_scaled_font().
2013-09-05 16:08:19 +01:00
Uli Schlachter
54a51968e8 surface_get_extents: Reject finished or error surface
This fixes a crash in the api-special-cases with xlib-xcb when calling
cairo_clip_extents() on a context that refers to a finished surface.

The crash was a simple NULL pointer dereference, because the underlying xcb
surface that was used in xlib-xcb was gone and set to NULL already.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-08-13 19:25:17 +02:00
Uli Schlachter
18633b0810 surface: Error out on finished surfaces
Finished surfaces and surfaces with an error status must not be usable anymore,
so refuse to work on them.

This improves the result for api-special-cases.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=68014

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-08-13 19:21:02 +02:00