Commit graph

100 commits

Author SHA1 Message Date
Behdad Esfahbod
8fbfb7f377 [scaled-font] Clean up font-options before copy 2023-01-19 13:42:23 -07:00
Adrian Johnson
745c3717aa Merge branch 'fix-shared-recording-surface' into 'master'
Fix shared use of recording surfaces

See merge request cairo/cairo!391
2023-01-16 08:59:32 +00:00
Adrian Johnson
7146358250 Fix shared use of recording surface with paginated targets
The problem is _cairo_recording_surface_replay_and_create_regions()
stores the cairo_recording_region_type_t in the same structure as the
recording commands. This does not work well when the recording surface
is used as source by multiple surfaces

Fix this by moving the cairo_recording_region_type_t into a separate
struct cairo_recording_regions_array_t. This struct is stored in a
list that allows multiple create regions results to be store in the
surface.

The new function _cairo_recording_surface_region_array_attach() is
used to create a new cairo_recording_regions_array_t, attach it to the
recording surface and return a unique region id.

The _cairo_recording_surface_replay_and_create_regions() and
_cairo_recording_surface_replay_region() functions use this region id
to identify the cairo_recording_regions_array_t.

To handle nested recording surfaces, when replaying a recording, the
region id is passed to the target as an extra parameter in the surface
pattern. The wrapper surface makes a temporary copy of the pattern to
ensure the snapshot pattern in the recording surface is not modified.

cairo_recording_regions_array_t has a reference count so the target
can hold on to the cairo_recording_regions_array_t after the paginated
surface has called _cairo_recording_surface_region_array_remove().
2023-01-15 19:29:28 +10:30
Adrian Johnson
d027f15075 Documentation fixes 2023-01-15 19:00:22 +10:30
Fujii Hironori
8520ef5221 Defining Windows version macros in meson.build
WINVER and _WIN32_WINNT macros were defined in each source files and
headers that were including <windows.h>. However, because DirectWrite
requires new Windows API, some files included <windows.h> without the
version macros. This inconsistency sometimes caused troubles.

Define the version macros in meson.build.
2023-01-13 05:47:03 +09:00
Fujii Hironori
a599720c88 DWrite: Don't call _controlfp_s with MCW_PC
GeometryRecorder class was calling _controlfp_s with MCW_PC to reset
the floating point precision to default. However, MCW_PC isn't
supported for ARM or x64 platforms. It reports an assertion failure
for them. And, Cairo isn't changing the MCW_PC setting. Removed the
calls. Also, removed `GetFixedX` and `GetFixedY` methods because they
called only `_cairo_fixed_from_double`.

Fixes cairo/cairo#566
2023-01-11 05:39:13 +09:00
Luca Bacci
8266d2d5f2 Pair usage of operator new[] with a corresponding delete[] 2022-09-03 14:16:04 +02:00
Uli Schlachter
1dc945863b Fix complaints from check-preprocessor-syntax.sh
Checking that public header files #include "cairo.h" first (or none)
Checking that private header files #include "some cairo header" first (or none)
Checking that source files #include "cairoint.h" first (or none)
./win32/cairo-dwrite-font-public.c:#include "cairo-win32-private.h"
Checking that there is no #include <cairo.*.h>
./win32/cairo-dwrite-font-public.c: * #include <cairo-win32.h>
Checking that feature conditionals are used with #if only (not #ifdef)

This adds a missing cairoint.h include and makes
check-preprocessor-syntax.sh slightly better in not warning about
includes in C comments.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2022-07-14 18:21:54 +02:00
Adrian Johnson
f0ba2165a6 Add color palette option 2022-06-17 20:42:43 +09:30
Adrian Johnson
7c037e5254 dwrite: Fix incorrect rendering of some SVG fonts
SVG fonts are returning DWRITE_GLYPH_IMAGE_FORMATS_NONE as well
as DWRITE_GLYPH_IMAGE_FORMATS_SVG in GetCurrentRun() resulting in the
outline glyph and color glyph both rendered to the same glyph image.
2022-05-08 20:28:41 +09:30
Adrian Johnson
4815949d2f Fix the scaled_glyph_init color glyph logic
and split _cairo_user_scaled_glyph_init() into multiple functions.

Update user-font test to test changing foreground text color.
2022-04-25 17:08:07 +09:30
Adrian Johnson
e15a1e9a06 Fix mingw warning
it doesn't like '%lld' in snprintf
2022-04-19 19:58:44 +09:30
Adrian Johnson
90e6f2a9f7 DWrite: Replace manual or missing ref counting with RefPtr 2022-04-19 19:58:44 +09:30
Adrian Johnson
3998a79cc2 DWrite: check 'head' table as well as 'name' when comparing fonts
There may be different versions of fonts with the same name. As an
additional check, compare the 'head' table wich contains the checksum
for the font.

Also, load the DWrite tables directly to avoid the memcpy in
load_truetype_table.
2022-04-19 19:58:44 +09:30
Adrian Johnson
2b355954a8 DWrite: ensure all private functions are static 2022-04-19 19:58:44 +09:30
Adrian Johnson
655a8a40a7 Dwrite glyph_path fails when the font matrix is not a positive uniform scale 2022-04-19 19:58:44 +09:30
Adrian Johnson
b4014daedf DWrite: Use twin font if default font not found
If the default font is not found, return CAIRO_INT_STATUS_UNSUPPORTED
to cause _cairo_toy_font_face_create_impl_face to create the Twin user
font fallback.
2022-04-19 19:58:44 +09:30
Adrian Johnson
672c92e19c Fix DWrite error handling
- Fix a few cases of incorrect error handling
- Use a consistent style and variable names for errors
2022-04-19 19:58:40 +09:30
Adrian Johnson
d2f65a7306 Dwrite: implement is_synthetic() 2022-04-19 19:56:32 +09:30
Adrian Johnson
136bf8c191 Ensure DWrite toy fonts can not fail if font name not found 2022-03-22 04:54:05 +10:30
Adrian Johnson
989d368dc5 DWrite font docs 2022-03-05 16:56:56 +10:30
Adrian Johnson
fa3a1bca7d Remove the extra API from the mozilla DWrite 2022-02-27 20:40:52 +10:30
Adrian Johnson
5635c75a2c dwrite: add color font support 2022-02-27 20:20:24 +10:30
Adrian Johnson
fdf2a9b4c0 dwrite_font param is not used 2022-02-27 15:44:58 +10:30
Adrian Johnson
7e644409ea Fix dwrite toy fonts 2022-02-27 15:44:58 +10:30
Adrian Johnson
fa76ebec03 Fix some warnings and use _cairo_malloc where applicable 2022-02-27 15:44:58 +10:30
Adrian Johnson
28ce8463af Fix check doc errors 2022-02-27 15:44:58 +10:30
Adrian Johnson
90ca635472 Import win32 dwrite font backend from
https://hg.mozilla.org/mozilla-central/file/7338d7d940913147f8a1b1e8bd2b25ab255f4373/gfx/cairo/cairo/src

and add to the meson build. I've omitted the
cairo_surface_set_subpixel_antialiasing() API and its use in quartz
and dwrite. Not sure if that is needed.

It compiles. Not tested.
2022-02-27 15:44:58 +10:30
Adrian Johnson
23815978cc Merge branch 'master' into color-font-foreground-color 2021-09-17 06:25:07 +09:30
Adrian Johnson
2822728f2a Fix some MinGW warnings
The FT change is because my MinGW build is using a more recent version
of FT.

Remove the disabled _cairo_win32_scaled_font_text_to_glyphs() code to
fix the defined but not used warning.

_cairo_win32_scaled_font_text_to_glyphs() was diabled in d9408041aa with
the comment:

  "Currently disable the win32-font text_to_glyphs(), until that one
   is updated.  Or better yet, remove it and implement
   ucs4_to_index().  It's the toy font API afterall."

_cairo_win32_scaled_font_ucs4_to_index() was added in d1c619bc7d.
2021-09-02 21:14:51 +09:30
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
c773060195 Merge branch 'HairlineStroke' into 'master'
Added hairline support to cairo

See merge request cairo/cairo!21
2021-08-15 06:58:54 +00:00
Rick Yorgason
ecec0419f8 Added hairline support to cairo 2021-08-15 06:58:54 +00:00
Adrian Johnson
76331f654e Fix some mingw warnings and correct the value of R_OK 2021-08-07 15:44:21 +09:30
Jonathan Kew
67c91db455 Check correctly for surface_pattern being a snapshot/recording in _cairo_win32_printing_surface_paint_pattern.
(Corrected patch as proposed by Uli Schlachter.)

Fixes poor-quality print output on Windows reported in https://bugzilla.mozilla.org/show_bug.cgi?id=1721127.
2021-08-04 11:58:49 +01:00
Adrian Johnson
9fbf427548 Use uintptr_t for all casts between pointer and integer
On 64-bit windows, long is 32-bit. When compiling there are a large
number of warnings about mismatched sizes when casting long to/from a
pointer.

Use the (u)intptr_t type for any integer that will have a pointer stored
in it. Use a (u)intptr_t cast when integers are stored in pointers to
silence warnings.

Fixes #263
2021-07-25 11:01:20 +09:30
Heiko Lewin
518ba13779 Fix undefined left-shifts 2021-03-31 12:20:34 +02:00
Heiko Lewin
d49d855819 Merge branch 'win32-get-dc' into 'master'
cairo_win32_surface_get_dc: Return NULL for error surfaces

Closes #405

See merge request cairo/cairo!106
2021-01-19 11:06:44 +00:00
Uli Schlachter
0134ac5a3d cairo_win32_surface_get_dc: Return NULL for error surfaces
Surfaces from _cairo_surface_create_in_error() have no backend. This
commit fixes a NULL pointer dereference in cairo_win32_surface_get_dc().

Fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/405
Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-01-13 16:26:18 +01:00
Yongsu Park
e2ba2e00a9 win32: Make font dc thread local 2020-03-11 21:13:09 +09:00
luz.paz
6d93bddbd6 Misc. typos
Found via `codespell -i 3 -w -I ../cairo-word-whitelist.txt -L tim,ned,uint`
Follow up of 12cb59be7d

Reviewed-by: Bryce Harrington <bryce@bryceharrington.org>
2019-01-31 17:37:15 -08:00
Bryce Harrington
3a03c1ba4b win32: Fix regression with text containing space character
Converting a series of glyphs to a path triggers an out of memory error
if there is a space glyph (bytesGlyph==0).  The regression was
introduced by commit 19982393 in cairo-win32-font.c:107.

The behavior of malloc(0) is not well defined - it can return NULL on
some platforms, or an arbitrary (non-allocated) pointer on other
platforms.  Commit 19982393 introduced sanity by enforcing that NULL is
always returned in this situation, which inappropriately triggers the
OOM check in _cairo_win32_scaled_font_init_glyph_path().  Instead,
special case the handling for bytesGlyph==0.

Patch authored by Uli Schlachter, based on fix proposed by lb90.

Fixes:  https://gitlab.freedesktop.org/cairo/cairo/issues/339
Reference:  https://gitlab.gnome.org/GNOME/pango/issues/323
Reviewed-by: Bryce Harrington <bryce@bryceharrington.org>
2018-10-17 17:32:10 -07:00
Bryce Harrington
c6e12d33bf win32: Copyedit recent comments 2018-05-31 18:31:12 -07:00
Vasily Galkin
d4355ecee2 win32: Allow GDI operations for argb32 surfaces (allowed by surface flags)
This finishes a patch series to speed up CAIRO_OPERATOR_SOURCE when used
to copy data to a argb32 cairo surface corresponding to a win32 dc from
a "backbuffer" - DibSection-based cairo surface created with
cairo_surface_create_similar().

This final patch allows the GDI compositor to be used on argb32
surfaces.  For display surfaces, only copying is allowed with gdi (by
BitBlt), since other operations are filtered by flags in
implementations.

But since copying pixels is the only operation used in the most common
scenario (prepare an offscreen image and send it to the screen) - this
is important for presenting argb32 windows with Cairo directly or with
gtk+gdk (which nowadays always creates argb32 windows).

Before this patch pixel copy worked by:
1. mapping image to memory (by copying data from window dc to system
   memory which is very slow on windows maybe due to gpu or interprocess
   access)
2. copying new data over that image.
3. copying updated image from system memory back to window dc.

After this patch there is only one step:

2+3. Copying new data over window dc.

Completely eliminating step 1 gives a very huge speedup and allows
argb32 cairo drawing be as fast as typical dibsection-buffered gdi
drawing.

There is quick & dirty cairo-vs-gdi perf test made for this patch set:
https://gitlab.gnome.org/galkinvv/cairo/snippets/109
See the Cairo mailing list for April 2018 for data and discussion of
performance improvements.

End-user visible speedup does present too - it relates to the following bug

https://gitlab.gnome.org/GNOME/meld/issues/133

This Cairo speedup allows more simultaneous meld windows
without eating 100% of cpu core time on spinner rendering.
2018-05-31 17:34:17 -07:00
Vasily Galkin
0cb7aad2a3 win32: CAIRO_WIN32_SURFACE_CAN_RGB_BRUSH and other argb32 flags set+check
This belongs to a patch series that speeds up CAIRO_OPERATOR_SOURCE when
used to copy data to an argb32 cairo surface corresponding to a win32 dc
from a "backbuffer" - DibSection-based cairo surface created with
cairo_surface_create_similar().

This patch introduces checks to ensure that no solid brush GDI operations
are attempted when using argb32 surfaces.  Doing this allows enabling
usage of the GDI compositor when these surfaces are in use.

To make these checks work, _cairo_win32_flags_for_dc disables
STRETCHBLT, STRETCHDIB and RGB_BRUSH in the argb32 flag.

_cairo_win32_flags_for_dc() is also refactored to make the distinction
between rgb24 and argb32 more readable.  All logic & flags for rgb24
surfaces are retained, except for the addition of
CAIRO_WIN32_SURFACE_CAN_RGB_BRUSH.

The logic of forbidding AlphaBlend on display surfaces is also
kept as is without investigation.
2018-05-31 17:29:26 -07:00
Vasily Galkin
884275c3ab win32: Introduce new flag to mark surfaces that support solid brush drawing
This is part of a patch series to speed up CAIRO_OPERATOR_SOURCE when
used to copy data to an argb32 cairo surface corresponding to a win32 dc
from a "backbuffer" - DibSection-based cairo surface created with
cairo_surface_create_similar().

This initial patch presents only private header changes without changing
any implementation logic.

The big problem with argb32 surfaces and GDI is that GDI is unable to
correctly set the alpha channel when using operations other than BitBlt
and AlphaBlend.

To solve this, a CAIRO_WIN32_SURFACE_CAN_RGB_BRUSH flag is introduced in
this commit to be mark surfaces that correctly handle such brushes
- essentially all surface types except argb32.
The _cairo_win32_flags_for_dc() call receives a new argument that is
used to calculate the flag.
2018-05-31 17:24:50 -07:00
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
Bryce Harrington
62b724ac84 win32: Fix a few typos in comments 2018-02-06 15:13:00 -08:00
Bryce Harrington
dbe3d9ea51 win32: Whitespace cleanup 2018-02-06 15:13:00 -08:00
Eric Hoffman
4d07b57c16 win32: Fix multi-monitor virtual desktop with negative monitor coords
Under Win32, when you have a multiple-monitor setup, Windows creates a
'virtual desktop', which is a rectangle surface that extends across all
monitors.

The primary monitor always starts with the top-left corner at coordinate
(0,0).  If you have any other monitors which extend to the left or
above the primary monitor, the virtual desktop's top-left corner will
actually have coordinates which are negative.

This creates an issue in Cairo with the desktop DC, i.e. when you use a
DC from the function GetDC(NULL).  The same thing can occur with other
third party libraries like GTK, when you access the Cairo surface from
the root window.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=100793
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
2018-02-06 15:12:33 -08:00