Commit graph

7488 commits

Author SHA1 Message Date
Bryce Harrington
19b31bbe70 image: Fix bad HTML generation in code docs for cairo-format-stride-for-width
Patch from Simon Kågedal Reimer

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=63257
2014-02-26 18:36:15 -08:00
Bryce Harrington
7b50883577 gl: Handle PIXMAN_a8r8g8b8_sRGB format in switch
Fixes the following compiler warning:

  cairo-gl-surface.c:182:5: warning: enumeration value
  ‘PIXMAN_a8r8g8b8_sRGB’ not handled in switch

Same fix as done for image in 1d0055078.

Chris Wilson <chris@chris-wilson.co.uk>
2014-02-25 12:14:36 -08:00
Bryce Harrington
44a09f462c mesh: Avoid theoretical infinite loops
This quells this warning:

  src/cairo-mesh-pattern-rasterizer.c:731:5: warning: cannot
  optimize possibly infinite loops

I guess the compiler's complaining because if vsteps were negative or
equal to UINT_MAX the loop could cycle infinitely.  Silly compiler.

Fix as suggested by Chris Wilson <chris@chris-wilson.co.uk>
2014-02-25 12:14:09 -08:00
Bryce Harrington
19f412bb1f xml: constify source objects for emit routines
This quells the following warnings:

  src/cairo-xml-surface.c:576:5: warning: passing argument 2 of
  ‘_cairo_xml_surface_emit_clip_boxes’ discards ‘const’ qualifier from
  pointer target type
  src/cairo-xml-surface.c:462:1: note: expected ‘struct cairo_clip_t
  *’ but argument is of type ‘const struct cairo_clip_t *’

Most of the cairo_xml*emit* routines const their source objects;
these should follow suit.

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
2014-02-25 12:13:56 -08:00
Bryce Harrington
dc8ca191f5 xml: Drop unused variable
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
2014-02-25 12:13:50 -08:00
Ryan Lortie
4144307dbf cairo-version: fix docs build
We do some evil things in this doc comment by closing a <para> tag further up.
Make sure we reopen it at the end so that gtk-doc's attempt to close it again
doesn't result in an imbalance.
2014-02-05 08:40:38 -05:00
Behdad Esfahbod
5de25951a4 Preserve current-point in copy_path()/append_path() sequence
Fixes path-currentpoint test.
2014-01-27 17:34:00 -05:00
Uli Schlachter
2a7f133639 cairo svg: Use \n instead of /n in bitmap fonts
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-01-19 20:06:25 +01:00
Adrian Johnson
b56b971141 type1: strip space from end of font name 2014-01-11 21:03:58 +10:30
Adrian Johnson
ee0e2b9272 ps: add font DSC comments 2014-01-11 21:03:58 +10:30
Adrian Johnson
2d3ee70ed3 ps: cairo_set_page_size does not need to be in eps output 2014-01-11 20:57:34 +10:30
Adrian Johnson
26d0edbc35 ps: use setpagedevice to set page size
https://bugs.freedesktop.org/show_bug.cgi?id=73452
2014-01-11 10:46:46 +10:30
Marek Kasik
97f6e2005d font: Generate PDFs with correct font names
Escape PostScript names of loaded fonts. These can not
contain white spaces and delimiter characters when saving
them to a PostScript file or a PDF file.
2014-01-10 20:51:08 +10:30
Adrian Johnson
f81b140675 ps: fix imagemask with pattern source failure on some printers
When /PaintProc is invoked the pattern dict is pushed onto the stack.
Ensure this dict is removed.

https://bugs.freedesktop.org/show_bug.cgi?id=69485
2014-01-08 07:45:20 +10:30
Adrian Johnson
2afc941d7f ps: remove duplicate /Interpolate from image dictionary
http://lists.freedesktop.org/archives/poppler/2014-January/010748.html
2014-01-03 22:19:40 +10:30
Adrian Johnson
5cafaa7b3b pdf: fix rectangle stroke with non rectilinear pen 2013-12-26 15:28:29 +10:30
Behdad Esfahbod
040a9f678b Check for XRenderSolidFill() 2013-12-16 19:27:38 -05:00
Adrian Johnson
dcbe16eb40 pdf/ps: avoid outputting excess decimal places in matrices
Sometimes as a result of rounding errors in matrix transformations the
matrices in ps/pdf output look like:

    0.000000000000000061 1 1 -0.000000000000000061 0 842 cm

This patch rounds to zero matrix elements that are very small compared to
other elements in the same matrix.
2013-12-07 15:54:49 +10:30
Uli Schlachter
31eff5c6eb Correct usage of CAIRO_STACK_ARRAY_LENGTH
This macro wants the array type as its argument and calls sizeof() on it
internally.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-11-16 19:05:35 +01:00
Henry Song
8c73949e44 gl: Fix one off issue in context cleanup
ctx->vertex_shaders is only CAIRO_GL_VAR_TYPE_MAX large, so we should
abort the loop before the index is equal to CAIRO_GL_VAR_TYPE_MAX.

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
2013-11-13 17:09:29 -08:00
Kouhei Sutou
66f4140e73 cairo_create(): Add finished surface check
Without this change, the following program crashes:

    #include <cairo.h>
    #include <cairo-svg.h>

    int
    main(int argc, char **argv)
    {
      cairo_t *cr;
      cairo_surface_t *finished_surface;

      finished_surface = cairo_svg_surface_create ("/tmp/xxx.svg", 1.0, 1.0);
      cairo_surface_finish (finished_surface);

      cr = cairo_create (finished_surface);
      cairo_destroy (cr);

      cairo_surface_destroy (finished_surface);

      return 0;
    }

Reviewed-by: Bryce Harrington <b.harrington@samsung.com>
2013-10-31 20:34:04 -07:00
egag
b9263fea14 Fixes stroke-clipped, i.c. of a dashed stroke
Similar to 1f4d05b55c
 'Fix calling '_cairo_spline_intersect' for in-bounds checking of splines'

Reviewed-by: Bryce Harrington <b.harrington@samsung.com>
2013-10-31 20:33:33 -07:00
Søren Sandmann Pedersen
98fef3cef2 _cairo_color_double_to_short(): Use standard rounding algorithm
The _cairo_color_double_to_short() function converts a double
precision floating point value in the range of [0.0, 1.0] to a
uint16_t integer by dividing the [0.0, 1.0] range into 65536
equal-sized intervals and then associating each interval with an
integer.

Under the assumption that an integer i corresponds to the real value i
/ 65535.0 this algorithm introduces more error than necessary as can
be seen from the following picture showing the analogous
transformation for two-bit integers:

    +-----------+-----------+-----------+-----------+
   0b00         |  0b01     |      0b10 |          0b11
    +-----------+-----------+-----------+-----------+

which shows that some floating point values are not converted to the
integer that would minimize the error in value that that integer
corresponds to.

Instead, this patch uses standard rounding, which makes the diagram
look like this:

    +-------+---------------+---------------+-------+
   0b00     |      0b01     |      0b10     |      0b11
    +-------+---------------+---------------+-------+

It's clear that if the values corresponding to the given integers are
fixed, then it's not possible to decrease the resulting error by
moving any of the interval boundaries.

See this thread for more information:

    http://lists.freedesktop.org/archives/cairo/2013-October/024691.html

Reference images updated:

  pthread-similar.ref.png
  record-paint-alpha.ref.png
  record90-paint-alpha.argb32.ref
  record90-paint-alpha.rgb24.ref.png
  xcb-huge-image-shm.ref.png
  xcb-huge-subimage.ref.png

All of these have only one-step differences to the old images.
2013-10-22 14:27:43 -04:00
Adrian Johnson
6f05ecf488 type1-subset: don't rename glyphs used by seac operator
Bug 70364
2013-10-11 19:59:50 +10:30
Chris Wilson
f1eefee985 win32: Reorder font declarations to be in natural order
Reported-by: John Emmas <johne53@tiscali.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2013-10-06 09:57:44 +01:00
Uli Schlachter
49366c5e9e cairo-xlib: Fix out of bounds array access in format cache
The cairo-xlib backend maintains a mapping form cairo_format_t to xrender
formats. This is done via an array. The size of this array is
CAIRO_FORMAT_RGB16_565 + 1 which evaluates to 5.

However, CAIRO_FORMAT_RGB30 has the numeric value 5, too. Thus, using this value
as an index into the array would actually read the following force_precision
field from cairo_xlib_display_t.

This could be triggered by passing CAIRO_FORMAT_RGB30 to
_cairo_xlib_display_get_xrender_format(). From a quick look, I didn't find any
code which would allow doing this, but neither did I find anything allowing
CAIRO_FORMAT_RGB16_565, so it's better to handle this correctly than assert()ing
for this to never happen.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-10-03 17:53:34 +02:00
Uli Schlachter
217bed84dd Revert "[xlib] Fast-path the likely case of retrieving a known xrender_format"
This reverts commit 09a2b2ed31.

Back in 2009, _cairo_xlib_display_get_xrender_format() had to acquire a lock to
do its job. The above commit added a fast-path which avoided the lock in most
cases.

However, in 2010 commit f74ad37e66 modified the
locking in the cairo-xlib backend and now this function never takes any locks.

Thus, the fast-path that was added a year earlier now just does the same thing
that the regular code does and the list of cached formats was checked twice.
Reverting the earlier commit fixes this.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-10-03 17:44:27 +02:00
Adrian Johnson
5e6e453671 pdf: stencil masks may be opaque 2013-09-29 22:23:31 +09:30
Adrian Johnson
d3a8d5a9c2 pdf: Support stencil masks with jpeg/jpx/jbig2 embedding 2013-09-29 22:18:06 +09:30
Adrian Johnson
07940ecd60 pdf: combine source and mask images into single image
Since PDF stores the alpha component of images in a separate stream
which can have a different resolution and encoding to the color
components we can optimize the case where the source and mask are both images.

If the source and mask are both images with the same extents and the
source is opaque, combine the images into a single PDF image (ie the
source is written the the image stream and the mask is written to the
smask stream).
2013-09-29 13:08:02 +09:30
Uli Schlachter
0c2faf6621 fill_reduces_to_source(): Handle failure of color_to_pixel()
The function color_to_pixel() can fail for unsupported pixman image formats, but
fill_reduces_to_source() ignored this possibility.

Fix this by using the return value of color_to_pixel():

Fixes the following compiler warnings:

cairo-image-compositor.c: In function 'fill_boxes':
cairo-image-compositor.c:349:15: warning: 'pixel' may be used uninitialized in this function [-Wmaybe-uninitialized]
cairo-image-compositor.c: In function 'fill_rectangles':
cairo-image-compositor.c:304:18: warning: 'pixel' may be used uninitialized in this function [-Wmaybe-uninitialized]

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-09-27 15:42:24 +02:00
Chris Wilson
337ab1f8d9 font: Push the last reference dec into the backend->destroy() callback
In order to close a race between locking the backend and resurrecting a
font via the cache, we need to keep the font face alive until after we
take the backend lock. Once we have that lock, we can drop our reference
and test if that was the last. Otherwise we must abort the destroy().

This fixes the double-free exposed by multithreaded applications trying
to create and destroy the same font concurrently.

Reported-by: Weeble <clockworksaint@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=69470
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2013-09-17 16:37:47 +01:00
Uli Schlachter
9c75065ece xcb: Remove useless error handling
All the *_reply() functions in XCB return a pointer to their result and as last
argument they get a xcb_generic_error_t** where pointers to errors are stored,
if any occurs.

However, a request can either fail or succeed. This means that if the returned
result is a NULL pointer, then an error occurred and the other way around: If
the error pointer is set to non-NULL, then the function must have returned NULL.

Thus, all the code, which just checks if an error occurred and which does not
care about the exact error code, does not need to get the error pointer at all.
In this case, xcb will free() the error internally.

While doing this, I noticed that _cairo_xcb_connection_get_image() always
succeeds and thus its return value can be replaced with the GetImage result.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-09-16 12:59:03 +02:00
Uli Schlachter
1d00550784 image: Handle PIXMAN_a8r8g8b8_sRGB in switch
Fixes the following compiler warning:

cairo-image-surface.c: In function '_cairo_format_from_pixman_format':
cairo-image-surface.c:93: warning: enumeration value 'PIXMAN_a8r8g8b8_sRGB' not
handled in switch

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=58726
Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-09-16 12:58:38 +02:00
Uli Schlachter
966bf2fe6a check-doc-syntax: Don't hardcode path to awk
Instead of expecting awk in /usr/bin, this commit changes the code to call awk
through a shell so that $PATH is searched.

Since this awk script shouldn't really be called manually, this is done by
removing the shebang from the awk script, marking it non-executable and fixing
up the caller.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67674
Reviewed-by: Bryce Harrington <b.harrington@samsung.com>
Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-09-16 12:57:57 +02: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
Adrian Johnson
2d6705671a ps: fix embedding of mime data 2013-09-13 22:14:49 +09:30
Adrian Johnson
266d6e7156 pdf: fix embedding of mime data that has been broken since 0a10982f
For some reason the mime-data test is not detecting this failure.
2013-09-13 22:01:02 +09:30
Martin Robinson
7270f22af3 gl: Extend oversize check to cairo_gl_surface_create_for_texture
If a texture is too large to render to via a framebuffer, then eagerly
fail with an error surface.
2013-09-11 08:52:31 -07:00
Uli Schlachter
279d5a2ed1 recording: Correctly determine alpha of all surfaces
This code has special cases for recording and image surfaces. For all other
kinds of source surfaces, has_bilevel_alpha was not modified, even though the
source surface could have an alpha channel.

Fix this by using the same checks as in the general path at the end of this
function.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-09-11 15:28:29 +02:00
Uli Schlachter
a6f51fed98 recording: Fix unitialized variable 'free_me'
This variable should be NULL by default and gets set only if a new reference to
a surface was acquired through _cairo_surface_snapshot_get_target(). This works,
because cairo_surface_destroy(NULL) is well-defined and doesn't do anything.

Fixes the following compiler warning:

cairo-recording-surface.c:1642:24: warning: 'free_me' may be used uninitialized
in this function [-Wmaybe-uninitialized]

Signed-off-by: Uli Schlachter <psychon@znc.in>
2013-09-11 15:24:53 +02:00
Adrian Johnson
8addb4798c pdf: avoid making groups a transparency group if not required
If the group contains only a combination of clear and opaque alpha and
only OPERATOR_OVER is used in the group and to paint the group, a
transparency group is not required. This allows the pdf viewer to
replay the group in place.
2013-09-11 21:18:45 +09:30
Adrian Johnson
f52165a7bb svg: Don't embed CMYK Jpeg images
None of the SVG viewers I tried (rsvg, firefox, inkscape) support CMYK
Jpeg images.

Bug 68965
2013-09-06 08:00: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
Chris Wilson
38217d67fc spans,traps: Undo device transform from source matrix for recording replays
As the replay of the recording surface applies the device_transform of
the matrix once again to all its operations, we end up with a repeated
transform through the source matrix of the recording surface. We need to
remove one of these, and the easiest way to do that appears to be to
undo the application to the source matrix.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2013-09-05 16:08:19 +01:00
Alexander Larsson
f0e2cd4494 gstate: Handle device scale on surface as source
When creating a transformed pattern we must apply the device
transform *before* the transform set on the pattern itself, otherwise
e.g. its translation will not be affected by the device scale.

We also fix up the device_transform related handling in
_cairo_default_context_pop_group().  With a device scale we can
no longer just use the device_transform_inverse to unset the
device offset for the extents, so we make that a simple translate
instead.

We also remove some weird code that tries to handle the device
transform but seems unnecessary (maybe a workaround for applying
the device transform in the wrong order?). With that code removed
things work fine, but with it things get translated wrongly when
there is a scale.
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