gfx/cairo/copyarea-with-alpha.patch

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface.c b/gfx/cairo/cairo/src/cairo-xlib-surface.c
     2 --- a/gfx/cairo/cairo/src/cairo-xlib-surface.c
     3 +++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c
     4 @@ -1722,30 +1722,31 @@ _surface_has_alpha (cairo_xlib_surface_t
     5  	else
     6  	    return FALSE;
     7      } else {
     8  	/* In the no-render case, we never have alpha */
     9  	return FALSE;
    10      }
    11  }
    13 -/* Returns true if the given operator and source-alpha combination
    14 - * requires alpha compositing to complete.
    15 +/* Returns true if the given operator and alpha combination requires alpha
    16 + * compositing to complete on source and destination surfaces with the same
    17 + * format.  i.e. if a simple bitwise copy is not appropriate.
    18   */
    19  static cairo_bool_t
    20  _operator_needs_alpha_composite (cairo_operator_t op,
    21 -				 cairo_bool_t     destination_has_alpha,
    22 -				 cairo_bool_t     source_has_alpha)
    23 +				 cairo_bool_t     surfaces_have_alpha)
    24  {
    25 -    if (op == CAIRO_OPERATOR_SOURCE ||
    26 -	(! source_has_alpha &&
    27 -	 (op == CAIRO_OPERATOR_OVER ||
    28 -	  op == CAIRO_OPERATOR_ATOP ||
    29 -	  op == CAIRO_OPERATOR_IN)))
    30 -	return destination_has_alpha;
    31 +    if (op == CAIRO_OPERATOR_SOURCE)
    32 +	return FALSE;
    33 +
    34 +    if (op == CAIRO_OPERATOR_OVER ||
    35 +	op == CAIRO_OPERATOR_IN ||
    36 +	op == CAIRO_OPERATOR_ATOP)
    37 +	return surfaces_have_alpha;
    39      return TRUE;
    40  }
    42  /* There is a bug in most older X servers with compositing using a
    43   * untransformed repeating source pattern when the source is in off-screen
    44   * video memory, and another with repeated transformed images using a
    45   * general transform matrix. When these bugs could be triggered, we need a
    46 @@ -1843,24 +1844,24 @@ _categorize_composite_operation (cairo_x
    47   */
    48  static composite_operation_t
    49  _recategorize_composite_operation (cairo_xlib_surface_t	      *dst,
    50  				   cairo_operator_t	       op,
    51  				   cairo_xlib_surface_t	      *src,
    52  				   cairo_surface_attributes_t *src_attr,
    53  				   cairo_bool_t		       have_mask)
    54  {
    55 -    /* Can we use the core protocol? */
    56 +    /* Can we use the core protocol?  (If _surfaces_compatible, then src and
    57 +     * dst have the same format and _surface_has_alpha is the same for each.)
    58 +     */
    59      if (! have_mask &&
    60          src->owns_pixmap &&
    61 -	src->depth == dst->depth &&
    62 +	_surfaces_compatible (src, dst) &&
    63  	_cairo_matrix_is_integer_translation (&src_attr->matrix, NULL, NULL) &&
    64 -	! _operator_needs_alpha_composite (op,
    65 -					   _surface_has_alpha (dst),
    66 -					   _surface_has_alpha (src)))
    67 +	! _operator_needs_alpha_composite (op, _surface_has_alpha (dst)))
    68      {
    69  	if (src_attr->extend == CAIRO_EXTEND_NONE)
    70  	    return DO_XCOPYAREA;
    72  	if (dst->buggy_repeat && src_attr->extend == CAIRO_EXTEND_REPEAT)
    73  	    return DO_XTILE;
    74      }
    76 @@ -2211,34 +2212,28 @@ _cairo_xlib_surface_composite (cairo_ope
    77      cairo_surface_attributes_t	src_attr, mask_attr;
    78      cairo_xlib_surface_t	*dst = abstract_dst;
    79      cairo_xlib_surface_t	*src;
    80      cairo_xlib_surface_t	*mask;
    81      cairo_int_status_t		status;
    82      composite_operation_t       operation;
    83      int				itx, ity;
    84      cairo_bool_t		is_integer_translation;
    85 -    cairo_bool_t		needs_alpha_composite;
    86      GC				gc;
    88      if (mask_pattern != NULL && ! CAIRO_SURFACE_RENDER_HAS_COMPOSITE (dst))
    89  	return UNSUPPORTED ("no support for masks");
    91      operation = _categorize_composite_operation (dst, op, src_pattern,
    92  						 mask_pattern != NULL);
    93      if (operation == DO_UNSUPPORTED)
    94  	return UNSUPPORTED ("unsupported operation");
    96      X_DEBUG ((dst->dpy, "composite (dst=%x)", (unsigned int) dst->drawable));
    98 -    needs_alpha_composite =
    99 -	_operator_needs_alpha_composite (op,
   100 -					 _surface_has_alpha (dst),
   101 -					 ! _cairo_pattern_is_opaque (src_pattern));
   102 -
   103      _cairo_xlib_display_notify (dst->display);
   105      status =
   106  	_cairo_xlib_surface_acquire_pattern_surfaces (dst,
   107  						      src_pattern, mask_pattern,
   108  						      src_x, src_y,
   109  						      mask_x, mask_y,
   110  						      width, height,

mercurial