tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

11-quartz-surface-tags.patch (3489B)


      1 # HG changeset patch
      2 # User Jonathan Kew <jkew@mozilla.com>
      3 # Date 1713889788 -3600
      4 #      Tue Apr 23 17:29:48 2024 +0100
      5 # Node ID 0421354d816b993767e2409c425aaa95a5291a26
      6 # Parent  2a04d0b05957b4db2cd9e97f29d28565badca201
      7 Bug 1892913 - patch 13 - Apply 11-quartz-surface-tags.patch
      8 
      9 diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c
     10 --- a/gfx/cairo/cairo/src/cairo-quartz-surface.c
     11 +++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c
     12 @@ -48,6 +48,7 @@
     13 #include "cairo-surface-backend-private.h"
     14 #include "cairo-surface-clipper-private.h"
     15 #include "cairo-recording-surface-private.h"
     16 +#include "cairo-tag-attributes-private.h"
     17 
     18 #include <dlfcn.h>
     19 
     20 @@ -2190,6 +2191,70 @@ static cairo_status_t
     21     return CAIRO_STATUS_SUCCESS;
     22 }
     23 
     24 +static cairo_int_status_t
     25 +_cairo_quartz_surface_tag (void			       *abstract_surface,
     26 +			   cairo_bool_t                 begin,
     27 +			   const char                  *tag_name,
     28 +			   const char                  *attributes,
     29 +			   const cairo_pattern_t       *source,
     30 +			   const cairo_stroke_style_t  *style,
     31 +			   const cairo_matrix_t	       *ctm,
     32 +			   const cairo_matrix_t	       *ctm_inverse,
     33 +			   const cairo_clip_t	       *clip)
     34 +{
     35 +    cairo_link_attrs_t link_attrs;
     36 +    cairo_int_status_t status = CAIRO_STATUS_SUCCESS;
     37 +    int i, num_rects;
     38 +    cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface;
     39 +
     40 +    /* Currently the only tag we support is "Link" */
     41 +    if (strcmp (tag_name, "Link"))
     42 +        return CAIRO_INT_STATUS_UNSUPPORTED;
     43 +
     44 +    /* We only process the 'begin' tag, and expect a rect attribute;
     45 +       using the extents of the drawing operations enclosed by the begin/end
     46 +       link tags to define the clickable area is not implemented. */
     47 +    if (!begin)
     48 +        return status;
     49 +
     50 +    status = _cairo_tag_parse_link_attributes (attributes, &link_attrs);
     51 +    if (unlikely (status))
     52 +	return status;
     53 +
     54 +    num_rects = _cairo_array_num_elements (&link_attrs.rects);
     55 +    if (num_rects > 0) {
     56 +        CFURLRef url = CFURLCreateWithBytes (NULL,
     57 +                                             (const UInt8 *) link_attrs.uri,
     58 +                                             strlen (link_attrs.uri),
     59 +                                             kCFStringEncodingUTF8,
     60 +                                             NULL);
     61 +
     62 +        for (i = 0; i < num_rects; i++) {
     63 +            CGRect link_rect;
     64 +            cairo_rectangle_t rectf;
     65 +
     66 +            _cairo_array_copy_element (&link_attrs.rects, i, &rectf);
     67 +
     68 +            link_rect =
     69 +                CGRectMake (rectf.x,
     70 +                            surface->extents.height - rectf.y - rectf.height,
     71 +                            rectf.width,
     72 +                            rectf.height);
     73 +
     74 +            CGPDFContextSetURLForRect (surface->cgContext, url, link_rect);
     75 +        }
     76 +
     77 +        CFRelease (url);
     78 +    }
     79 +
     80 +    _cairo_array_fini (&link_attrs.rects);
     81 +    free (link_attrs.dest);
     82 +    free (link_attrs.uri);
     83 +    free (link_attrs.file);
     84 +
     85 +    return status;
     86 +}
     87 +
     88 // XXXtodo implement show_page; need to figure out how to handle begin/end
     89 
     90 static const cairo_surface_backend_t cairo_quartz_surface_backend = {
     91 @@ -2226,7 +2291,7 @@ static const cairo_surface_backend_t cai
     92     NULL, /* has_show_text_glyphs */
     93     NULL, /* show_text_glyphs */
     94     NULL, /* get_supported_mime_types */
     95 -    NULL, /* tag */
     96 +    _cairo_quartz_surface_tag   /* tag */
     97 };
     98 
     99 cairo_quartz_surface_t *