gfx/cairo/dasharray-zero-gap.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-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c
     2 --- a/gfx/cairo/cairo/src/cairo-quartz-surface.c
     3 +++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c
     4 @@ -2573,29 +2573,43 @@ static cairo_int_status_t
     6      if (style->dash && style->num_dashes) {
     7  #define STATIC_DASH 32
     8  	cairo_quartz_float_t sdash[STATIC_DASH];
     9  	cairo_quartz_float_t *fdash = sdash;
    10  	unsigned int max_dashes = style->num_dashes;
    11  	unsigned int k;
    13 -	if (style->num_dashes%2)
    14 -	    max_dashes *= 2;
    15 -	if (max_dashes > STATIC_DASH)
    16 -	    fdash = _cairo_malloc_ab (max_dashes, sizeof (cairo_quartz_float_t));
    17 -	if (fdash == NULL)
    18 -	    return _cairo_error (CAIRO_STATUS_NO_MEMORY);
    19 -
    20 -	for (k = 0; k < max_dashes; k++)
    21 -	    fdash[k] = (cairo_quartz_float_t) style->dash[k % style->num_dashes];
    22 -
    23 -	CGContextSetLineDash (surface->cgContext, style->dash_offset, fdash, max_dashes);
    24 -	if (fdash != sdash)
    25 -	    free (fdash);
    26 +	bool set_line_dash = false;
    27 +	if (style->num_dashes % 2 == 0) {
    28 +	    for (k = 1; k < max_dashes; k++) {
    29 +		if (style->dash[k]) {
    30 +		    set_line_dash = true;
    31 +		    break;
    32 +		}
    33 +	    }
    34 +	} else
    35 +	    set_line_dash = true;
    36 +
    37 +	if (set_line_dash) {
    38 +	    if (style->num_dashes%2)
    39 +		max_dashes *= 2;
    40 +	    if (max_dashes > STATIC_DASH)
    41 +		fdash = _cairo_malloc_ab (max_dashes, sizeof (cairo_quartz_float_t));
    42 +	    if (fdash == NULL)
    43 +		return _cairo_error (CAIRO_STATUS_NO_MEMORY);
    44 +
    45 +	    for (k = 0; k < max_dashes; k++)
    46 +		fdash[k] = (cairo_quartz_float_t) style->dash[k % style->num_dashes];
    47 +
    48 +	    CGContextSetLineDash (surface->cgContext, style->dash_offset, fdash, max_dashes);
    49 +	    if (fdash != sdash)
    50 +		free (fdash);
    51 +	} else
    52 +	    CGContextSetLineDash (state.context, 0, NULL, 0);
    53      } else
    54  	CGContextSetLineDash (state.context, 0, NULL, 0);
    57      _cairo_quartz_cairo_path_to_quartz_context (path, state.context);
    59      _cairo_quartz_cairo_matrix_to_quartz (ctm, &strokeTransform);
    60      CGContextConcatCTM (state.context, strokeTransform);

mercurial