The surface size and clip needs to be saved before and restored after
replaying meta surface patterns back to the analysis surface. The clip
is reset and the correct surface size is set before replaying the meta
surface.
The FT_Set_Char_Size() docs say it replaces sizes smaller than 1.0 with 1.0.
So, we can't use x_scale and y_scale values less than one. The fix is easy thouh,
cap them to 1.0 and let the FT transform do the scaling down.
For A8 and A1 masks, the embedded mask image doesn't have an alpha channel.
In this case, the feColorMatrix should not be used, since it's goal is to
discard the color channels and to only keep the alpha one (which is what
we want when we have an ARGB32 mask image, since SVG uses all the channels
for the mask operation, where cairo only use the alpha channel).
SVG doesn't support extend reflect for image pattern, and there isn't
any trivial way to emulate this feature. So we use the image fallback
for now. This fix also forces an image fallback for extend-reflect, but
in the end, it generates more or less the same file (one big image for
the pattern). No other test is forced to use an image fallback by this
patch.
This avoids unnecessary rasterization in many cases when using
cairo_surface_create_similar with an SVG surface. Because of that
it eliminates test-suite failures for the -similar cases where we
have svg-specific reference images. Namely:
font-matrix-translation, ft-text-vertical-layout-type1,
ft-text-vertical-layout-type3, mask, meta-surface-pattern,
paint-source-alpha, paint-with-alpha, rotate-image-surface-paint,
scale-source-surface-paint, source-clip-scale, text-pattern,
text-rotate
In all of these cases the test suite was kindly noticing that we
weren't getting the same 'native' SVG output that was desired.
This prepares for analyze_operation to be able to return more than
just two values, (which will allow the svg backend to take advantage
of CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY).
This reverts commit 7f21bfb0a8.
We don't yet have consensus on whether this is a good change or not.
So for now, we're favoring the existing behavior until we can work
that out.
Sometimes > rather than >= can make a bug difference. The infinite loop
was noticed here:
Infinite loop when scaling very small values using 24.8
http://bugs.freedesktop.org/show_bug.cgi?id=14280
Note that that particular test case only exposes the infinite
loop when using 24.8 instead of 16.16 fixed-point values by
setting CAIRO_FIXED_FRAC_BITS to 8.
These two functions were hiding away some important details
about strictness of inequalities. Also, the callers differ
on the strictness they need. Everything is cleaner and more
flexible by making the callers just call _cairo_slope_compare
directly.
This was an initial attempt to fix the infinite loop bug
described here:
Infinite loop when scaling very small values using 24.8
http://bugs.freedesktop.org/show_bug.cgi?id=14280
This doesn't actually fix that bug, but having a more robust
comparison function can only be a good thing.
Remember to destroy the sub_font if we fail to reserve the .notdef glyph
during construction.
Whilst in the vicinity, adjust the function prototype to remove
duplicated calls to _cairo_error().
The PDF backend has always used "\r\n" for the newline character.
There was no particular reason for this choice. PDF allows "\n", "\r",
or "\r\n" as the end of line marker.
Since the PS backend (which uses "\n") has started sharing
cairo-pdf-operators.c with the PDF backend, the PS output has been
getting mixed "\n" and "\r\n" newlines.
Fix this by changing the PDF backend to use "\n".
The optimization to avoid sqrt() for horizontal/vertical lines in
_compute_normalized_device_slope was causing us to return a negative
magnitude with a positive slope for left-to-right and bottom-to-top
lines, instead of always returning a positive magnitude and a slope
with an appropriate sign.
Minor correction for a build failure on AIX:
"mozilla/gfx/cairo/cairo/src/cairo-gstate.c", line 45.43: 1506-294 (S)
Syntax error in expression on #if directive.
(Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=415867.)
In order to correctly report the error back to the user during the
creation of a scaled font, we need to support a nil object per error.
Instead of statically allocating all possible errors, lazily allocate
the nil object the first time we need to report a particular error.
This fixes the misreporting of an INVALID_MATRIX or NULL_POINTER that
are common user errors during the construction of a scaled font.
Partial revert of commit 0086db893c.
This is a follow to the earlier commit that allowed creation of scaled
fonts using a NULL font options (by interpreting the NULL as meaning
use the default options) to reflect the comments made by Behdad
(http://lists.cairographics.org/archives/cairo/2008-January/012714.html).
The intent is that the public font options getter/setter API has similar
defensive behaviour to that of the core objects - i.e. do not overwrite
the nil object and if the object is in error then return the default
value. For the indirect use of a NULL/nil font options (e.g. creation of
scaled fonts), then an error should be returned rather than crashing.
Only translate an UNSUPPORTED error into a SURFACE_TYPE_MISMATCH, all
others can be returned to the user unadulterated.
PNG doesn't support width==0 or height==0 and generates an error
whilst writing - which without further information is assumed to be
a NO_MEMORY error. So check the image size at the start and return a
WRITE_ERROR for a zero sized image.
Ensure the win32-printing surface has the same fixes for meta surface
patterns with more than one level of push/pop group that PS/PDF
received in 060f384310
When the emitted image is not inside a PS procedure we can use the
currentfile operator as the datasource instead of an array of strings.
This avoids having to read to entire image data into printer memory
before the image can be decoded. This improves the performance and
reduces the chance of running out of memory on printers with limited
memory.
To be able to use the currentfile operator we need to combine the
image data and mask data into the one data source. InterleaveType 2
scan line interleaves the image and data.
_ps_surface_fill() can also avoid using PS patterns for EXTEND_NONE
surface patterns. A clip path is set around the fill path then the
surface is painted.
This is the first of four patches intended to fix the bug reported in
http://lists.cairographics.org/archives/cairo/2007-December/012226.html
Previously the PS backend would draw all cairo patterns (except solid
colors) by emitting a PS pattern. As PS does not support non repeating
patterns, the PS backend would set a large repeat step to ensure that
only one copy of the pattern is on the page.
Some printers with limited memory are unable to print large images
inside a pattern. This was probably because when using patterns the
printer tries to keep the uncompressed image in memory so it can tile
the pattern.
When painting surface patterns with the extend mode EXTEND_NONE we do
not need to use PS patterns. The image or meta surface commands can be
emitted directly.
Changes include:
- Replace PS prolog with new prolog that emulates PDF operators
- Remove the [1 0 0 -1 0 height] ctm on each page. PS and PDF surfaces
now both transform all output to PS/PDF coordinates.
- Invert images to match PDF images where (0,0) is top left
- emit_surface_pattern now uses the same transform as PDF
- move the special dash handling into cairo-pdf-operators.c
This code is never used because outline glyphs that go through the
fallback path are always embedded with Type 1 fallback. The only fonts
that are embedded as Type 3 are bitmap fonts.
The PDF emit path orginally had two matrix transforms in the path
struct. One for strokes and one for fill/clip. As only one transform
at a time is ever used this can be simplified.