gfx/cairo/expose-snapshot.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-analysis-surface-private.h b/gfx/cairo/cairo/src/cairo-analysis-surface-private.h
     2 --- a/gfx/cairo/cairo/src/cairo-analysis-surface-private.h
     3 +++ b/gfx/cairo/cairo/src/cairo-analysis-surface-private.h
     4 @@ -65,14 +65,11 @@ _cairo_analysis_surface_has_unsupported 
     5  cairo_private void
     6  _cairo_analysis_surface_get_bounding_box (cairo_surface_t *surface,
     7  					  cairo_box_t     *bbox);
     9  cairo_private cairo_int_status_t
    10  _cairo_analysis_surface_merge_status (cairo_int_status_t status_a,
    11  				      cairo_int_status_t status_b);
    13 -cairo_private cairo_surface_t *
    14 -_cairo_null_surface_create (cairo_content_t content);
    15 -
    16  CAIRO_END_DECLS
    18  #endif /* CAIRO_ANALYSIS_SURFACE_H */
    19 diff --git a/gfx/cairo/cairo/src/cairo-analysis-surface.c b/gfx/cairo/cairo/src/cairo-analysis-surface.c
    20 --- a/gfx/cairo/cairo/src/cairo-analysis-surface.c
    21 +++ b/gfx/cairo/cairo/src/cairo-analysis-surface.c
    22 @@ -902,17 +902,17 @@ static const cairo_surface_backend_t cai
    23      NULL, /* fill_stroke */
    24      NULL, /* create_solid_pattern_surface */
    25      NULL, /* can_repaint_solid_pattern_surface */
    26      NULL, /* has_show_text_glyphs */
    27      NULL  /* show_text_glyphs */
    28  };
    30  cairo_surface_t *
    31 -_cairo_null_surface_create (cairo_content_t content)
    32 +cairo_null_surface_create (cairo_content_t content)
    33  {
    34      cairo_surface_t *surface;
    36      surface = malloc (sizeof (cairo_surface_t));
    37      if (unlikely (surface == NULL)) {
    38  	return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
    39      }
    41 diff --git a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp
    42 --- a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp
    43 +++ b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp
    44 @@ -1951,24 +1951,24 @@ _cairo_d2d_create_brush_for_pattern(cair
    45  			rect = D2D1::RectU(1, 1, srcSurf->width + 1, srcSurf->height + 1);
    46  		    } else {
    47  			rect = D2D1::RectU(0, 0, srcSurf->width, srcSurf->height);
    48  		    }
    49  		    sourceBitmap->CopyFromMemory(&rect,
    50  						 srcSurf->data,
    51  						 srcSurf->stride);
    52  		    cairo_surface_t *nullSurf =
    53 -			_cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA);
    54 +			cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA);
    55  		    cachebitmap->refs++;
    56  		    cachebitmap->dirty = false;
    57  		    cairo_surface_set_user_data(nullSurf,
    58  						&bitmap_key_snapshot,
    59  						cachebitmap,
    60  						NULL);
    61 -		    _cairo_surface_attach_snapshot(surfacePattern->surface,
    62 +		    cairo_surface_attach_snapshot(surfacePattern->surface,
    63  						   nullSurf,
    64  						   _d2d_snapshot_detached);
    65  		}
    66  	    } else {
    67  		if (pattern->extend != CAIRO_EXTEND_NONE) {
    68  		    d2dsurf->rt->CreateBitmap(D2D1::SizeU(width, height),
    69  							  data + yoffset * stride + xoffset * Bpp,
    70  							  stride,
    71 @@ -2015,22 +2015,22 @@ _cairo_d2d_create_brush_for_pattern(cair
    72  		     * and one more in the user data structure.
    73  		     */
    74  		    cachebitmap->refs = 2;
    75  		    cairo_surface_set_user_data(surfacePattern->surface,
    76  						key,
    77  						cachebitmap,
    78  						_d2d_release_bitmap);
    79  		    cairo_surface_t *nullSurf =
    80 -			_cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA);
    81 +			cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA);
    82  		    cairo_surface_set_user_data(nullSurf,
    83  						&bitmap_key_snapshot,
    84  						cachebitmap,
    85  						NULL);
    86 -		    _cairo_surface_attach_snapshot(surfacePattern->surface,
    87 +		    cairo_surface_attach_snapshot(surfacePattern->surface,
    88  						   nullSurf,
    89  						   _d2d_snapshot_detached);
    90  		    cache_usage += _d2d_compute_bitmap_mem_size(sourceBitmap);
    91  		}
    92  		if (pix_image) {
    93  		    pixman_image_unref(pix_image);
    94    		}
    95  	    }
    96 diff --git a/gfx/cairo/cairo/src/cairo-recording-surface.c b/gfx/cairo/cairo/src/cairo-recording-surface.c
    97 --- a/gfx/cairo/cairo/src/cairo-recording-surface.c
    98 +++ b/gfx/cairo/cairo/src/cairo-recording-surface.c
    99 @@ -276,17 +276,17 @@ _cairo_recording_surface_acquire_source_
   100  				     -surface->extents.y);
   102      status = _cairo_recording_surface_replay (&surface->base, image);
   103      if (unlikely (status)) {
   104  	cairo_surface_destroy (image);
   105  	return status;
   106      }
   108 -    _cairo_surface_attach_snapshot (&surface->base, image, NULL);
   109 +    cairo_surface_attach_snapshot (&surface->base, image, NULL);
   111      *image_out = (cairo_image_surface_t *) image;
   112      *image_extra = NULL;
   113      return CAIRO_STATUS_SUCCESS;
   114  }
   116  static void
   117  _cairo_recording_surface_release_source_image (void			*abstract_surface,
   118 @@ -1046,17 +1046,17 @@ static cairo_status_t
   119  _recording_surface_get_ink_bbox (cairo_recording_surface_t *surface,
   120  				 cairo_box_t *bbox,
   121  				 const cairo_matrix_t *transform)
   122  {
   123      cairo_surface_t *null_surface;
   124      cairo_surface_t *analysis_surface;
   125      cairo_status_t status;
   127 -    null_surface = _cairo_null_surface_create (surface->content);
   128 +    null_surface = cairo_null_surface_create (surface->content);
   129      analysis_surface = _cairo_analysis_surface_create (null_surface);
   130      cairo_surface_destroy (null_surface);
   132      status = analysis_surface->status;
   133      if (unlikely (status))
   134  	return status;
   136      if (transform != NULL)
   137 diff --git a/gfx/cairo/cairo/src/cairo-surface-private.h b/gfx/cairo/cairo/src/cairo-surface-private.h
   138 --- a/gfx/cairo/cairo/src/cairo-surface-private.h
   139 +++ b/gfx/cairo/cairo/src/cairo-surface-private.h
   140 @@ -40,18 +40,16 @@
   142  #include "cairo.h"
   144  #include "cairo-types-private.h"
   145  #include "cairo-list-private.h"
   146  #include "cairo-reference-count-private.h"
   147  #include "cairo-clip-private.h"
   149 -typedef void (*cairo_surface_func_t) (cairo_surface_t *);
   150 -
   151  struct _cairo_surface {
   152      const cairo_surface_backend_t *backend;
   153      cairo_device_t *device;
   155      /* We allow surfaces to override the backend->type by shoving something
   156       * else into surface->type. This is for "wrapper" surfaces that want to
   157       * hide their internal type from the user-level API. */
   158      cairo_surface_type_t type;
   159 diff --git a/gfx/cairo/cairo/src/cairo-surface-snapshot.c b/gfx/cairo/cairo/src/cairo-surface-snapshot.c
   160 --- a/gfx/cairo/cairo/src/cairo-surface-snapshot.c
   161 +++ b/gfx/cairo/cairo/src/cairo-surface-snapshot.c
   162 @@ -209,17 +209,17 @@ _cairo_surface_snapshot (cairo_surface_t
   163  	    if (unlikely (status)) {
   164  		cairo_surface_destroy (snap);
   165  		return _cairo_surface_create_in_error (status);
   166  	    }
   168  	    snap->device_transform = surface->device_transform;
   169  	    snap->device_transform_inverse = surface->device_transform_inverse;
   171 -	    _cairo_surface_attach_snapshot (surface, snap, NULL);
   172 +	    cairo_surface_attach_snapshot (surface, snap, NULL);
   174  	    return snap;
   175  	}
   176      }
   178      snapshot = (cairo_surface_snapshot_t *)
   179  	_cairo_surface_has_snapshot (surface, &_cairo_surface_snapshot_backend);
   180      if (snapshot != NULL)
   181 @@ -242,14 +242,14 @@ _cairo_surface_snapshot (cairo_surface_t
   182      if (unlikely (status)) {
   183  	cairo_surface_destroy (&snapshot->base);
   184  	return _cairo_surface_create_in_error (status);
   185      }
   187      snapshot->base.device_transform = surface->device_transform;
   188      snapshot->base.device_transform_inverse = surface->device_transform_inverse;
   190 -    _cairo_surface_attach_snapshot (surface,
   191 +    cairo_surface_attach_snapshot (surface,
   192  				    &snapshot->base,
   193  				    _cairo_surface_snapshot_copy_on_write);
   195      return &snapshot->base;
   196  }
   197 diff --git a/gfx/cairo/cairo/src/cairo-surface-subsurface.c b/gfx/cairo/cairo/src/cairo-surface-subsurface.c
   198 --- a/gfx/cairo/cairo/src/cairo-surface-subsurface.c
   199 +++ b/gfx/cairo/cairo/src/cairo-surface-subsurface.c
   200 @@ -326,17 +326,17 @@ _cairo_surface_subsurface_acquire_source
   201  		_cairo_image_surface_create_with_content (meta->content,
   202  							  surface->extents.width,
   203  							  surface->extents.height);
   204  	    if (unlikely (image->base.status))
   205  		return image->base.status;
   207              cairo_surface_paint_to_target (&image->base, surface);
   209 -	    _cairo_surface_attach_snapshot (&surface->base, &image->base, NULL);
   210 +	    cairo_surface_attach_snapshot (&surface->base, &image->base, NULL);
   212  	    *image_out = image;
   213  	    *extra_out = NULL;
   214  	    return CAIRO_STATUS_SUCCESS;
   215  	}
   216      }
   218      extra = malloc (sizeof (struct extra));
   219 diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c
   220 --- a/gfx/cairo/cairo/src/cairo-surface.c
   221 +++ b/gfx/cairo/cairo/src/cairo-surface.c
   222 @@ -305,51 +305,51 @@ _cairo_surface_detach_mime_data (cairo_s
   223      if (! _cairo_surface_has_mime_data (surface))
   224  	return;
   226      _cairo_user_data_array_fini (&surface->mime_data);
   227      _cairo_user_data_array_init (&surface->mime_data);
   228  }
   230  static void
   231 -_cairo_surface_detach_snapshots (cairo_surface_t *surface)
   232 +cairo_surface_detach_snapshots (cairo_surface_t *surface)
   233  {
   234      while (_cairo_surface_has_snapshots (surface)) {
   235 -	_cairo_surface_detach_snapshot (cairo_list_first_entry (&surface->snapshots,
   236 +	cairo_surface_detach_snapshot (cairo_list_first_entry (&surface->snapshots,
   237  								cairo_surface_t,
   238  								snapshot));
   239      }
   240  }
   242  void
   243 -_cairo_surface_detach_snapshot (cairo_surface_t *snapshot)
   244 +cairo_surface_detach_snapshot (cairo_surface_t *snapshot)
   245  {
   246      assert (snapshot->snapshot_of != NULL);
   248      snapshot->snapshot_of = NULL;
   249      cairo_list_del (&snapshot->snapshot);
   251      if (snapshot->snapshot_detach != NULL)
   252  	snapshot->snapshot_detach (snapshot);
   254      cairo_surface_destroy (snapshot);
   255  }
   257  void
   258 -_cairo_surface_attach_snapshot (cairo_surface_t *surface,
   259 +cairo_surface_attach_snapshot (cairo_surface_t *surface,
   260  				 cairo_surface_t *snapshot,
   261  				 cairo_surface_func_t detach_func)
   262  {
   263      assert (surface != snapshot);
   264      assert (snapshot->snapshot_of != surface);
   266      cairo_surface_reference (snapshot);
   268      if (snapshot->snapshot_of != NULL)
   269 -	_cairo_surface_detach_snapshot (snapshot);
   270 +	cairo_surface_detach_snapshot (snapshot);
   272      snapshot->snapshot_of = surface;
   273      snapshot->snapshot_detach = detach_func;
   275      cairo_list_add (&snapshot->snapshot, &surface->snapshots);
   277      assert (_cairo_surface_has_snapshot (surface, snapshot->backend) == snapshot);
   278  }
   279 @@ -382,17 +382,17 @@ _cairo_surface_is_writable (cairo_surfac
   281  static void
   282  _cairo_surface_begin_modification (cairo_surface_t *surface)
   283  {
   284      assert (surface->status == CAIRO_STATUS_SUCCESS);
   285      assert (! surface->finished);
   286      assert (surface->snapshot_of == NULL);
   288 -    _cairo_surface_detach_snapshots (surface);
   289 +    cairo_surface_detach_snapshots (surface);
   290      _cairo_surface_detach_mime_data (surface);
   291  }
   293  void
   294  _cairo_surface_init (cairo_surface_t			*surface,
   295  		     const cairo_surface_backend_t	*backend,
   296  		     cairo_device_t			*device,
   297  		     cairo_content_t			 content)
   298 @@ -711,19 +711,19 @@ cairo_surface_finish (cairo_surface_t *s
   300      if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count))
   301  	return;
   303      if (surface->finished)
   304  	return;
   306      /* update the snapshots *before* we declare the surface as finished */
   307 -    _cairo_surface_detach_snapshots (surface);
   308 +    cairo_surface_detach_snapshots (surface);
   309      if (surface->snapshot_of != NULL)
   310 -	_cairo_surface_detach_snapshot (surface);
   311 +	cairo_surface_detach_snapshot (surface);
   313      cairo_surface_flush (surface);
   314      surface->finished = TRUE;
   316      /* call finish even if in error mode */
   317      if (surface->backend->finish) {
   318  	status = surface->backend->finish (surface);
   319  	if (unlikely (status))
   320 @@ -1106,17 +1106,17 @@ cairo_surface_flush (cairo_surface_t *su
   322      if (surface->status)
   323  	return;
   325      if (surface->finished)
   326  	return;
   328      /* update the current snapshots *before* the user updates the surface */
   329 -    _cairo_surface_detach_snapshots (surface);
   330 +    cairo_surface_detach_snapshots (surface);
   332      if (surface->backend->flush) {
   333  	status = surface->backend->flush (surface);
   334  	if (unlikely (status))
   335  	    status = _cairo_surface_set_error (surface, status);
   336      }
   337  }
   338  slim_hidden_def (cairo_surface_flush);
   339 @@ -1628,17 +1628,17 @@ _cairo_recording_surface_clone_similar (
   340  	    return similar->status;
   342  	status = _cairo_recording_surface_replay (src, similar);
   343  	if (unlikely (status)) {
   344  	    cairo_surface_destroy (similar);
   345  	    return status;
   346  	}
   348 -	_cairo_surface_attach_snapshot (src, similar, NULL);
   349 +	cairo_surface_attach_snapshot (src, similar, NULL);
   351  	src_x = src_y = 0;
   352      }
   354      *clone_out = similar;
   355      *clone_offset_x = src_x;
   356      *clone_offset_y = src_y;
   357      return CAIRO_STATUS_SUCCESS;
   358 diff --git a/gfx/cairo/cairo/src/cairo-vg-surface.c b/gfx/cairo/cairo/src/cairo-vg-surface.c
   359 --- a/gfx/cairo/cairo/src/cairo-vg-surface.c
   360 +++ b/gfx/cairo/cairo/src/cairo-vg-surface.c
   361 @@ -977,17 +977,17 @@ _vg_setup_surface_source (cairo_vg_conte
   362      status = _cairo_cache_insert (&context->snapshot_cache,
   363  				  &clone->snapshot_cache_entry);
   364      if (unlikely (status)) {
   365  	clone->snapshot_cache_entry.hash = 0;
   366  	cairo_surface_destroy (&clone->base);
   367  	return status;
   368      }
   370 -    _cairo_surface_attach_snapshot (spat->surface, &clone->base,
   371 +    cairo_surface_attach_snapshot (spat->surface, &clone->base,
   372  				    _vg_surface_remove_from_cache);
   374  DONE:
   375      cairo_surface_destroy (&context->source->base);
   376      context->source = clone;
   378      vgSetParameteri (context->paint, VG_PAINT_TYPE, VG_PAINT_TYPE_PATTERN);
   380 diff --git a/gfx/cairo/cairo/src/cairo-xcb-surface.c b/gfx/cairo/cairo/src/cairo-xcb-surface.c
   381 --- a/gfx/cairo/cairo/src/cairo-xcb-surface.c
   382 +++ b/gfx/cairo/cairo/src/cairo-xcb-surface.c
   383 @@ -560,17 +560,17 @@ _cairo_xcb_surface_acquire_source_image 
   384  	image = (cairo_image_surface_t *) cairo_surface_reference (&image->base);
   385  	goto DONE;
   386      }
   388      status = _get_image (surface, FALSE, &image);
   389      if (unlikely (status))
   390  	return status;
   392 -    _cairo_surface_attach_snapshot (&surface->base, &image->base, NULL);
   393 +    cairo_surface_attach_snapshot (&surface->base, &image->base, NULL);
   395  DONE:
   396      *image_out = image;
   397      *image_extra = NULL;
   398      return CAIRO_STATUS_SUCCESS;
   399  }
   401  static void
   402 @@ -713,17 +713,17 @@ _cairo_xcb_surface_flush (void *abstract
   403  	status = cairo_surface_status (surface->fallback);
   405  	if (status == CAIRO_STATUS_SUCCESS) {
   406  	    status = _put_image (surface,
   407  				 (cairo_image_surface_t *) surface->fallback);
   408  	}
   410  	if (status == CAIRO_STATUS_SUCCESS) {
   411 -	    _cairo_surface_attach_snapshot (&surface->base,
   412 +	    cairo_surface_attach_snapshot (&surface->base,
   413  					    surface->fallback,
   414  					    cairo_surface_finish);
   415  	}
   416      }
   418      cairo_surface_destroy (surface->fallback);
   419      surface->fallback = NULL;
   421 diff --git a/gfx/cairo/cairo/src/cairo.h b/gfx/cairo/cairo/src/cairo.h
   422 --- a/gfx/cairo/cairo/src/cairo.h
   423 +++ b/gfx/cairo/cairo/src/cairo.h
   424 @@ -214,16 +214,25 @@ typedef struct _cairo_pattern cairo_patt
   425   *
   426   * #cairo_destroy_func_t the type of function which is called when a
   427   * data element is destroyed. It is passed the pointer to the data
   428   * element and should free any memory and resources allocated for it.
   429   **/
   430  typedef void (*cairo_destroy_func_t) (void *data);
   432  /**
   433 + * cairo_surface_func_t:
   434 + * @surface: The surface being referred to.
   435 + *
   436 + * #cairo_surface_func_t the type of function which is used for callback
   437 + * when a surface needs to be apssed as a parameter.
   438 + */
   439 +typedef void (*cairo_surface_func_t) (cairo_surface_t *surface);
   440 +
   441 +/**
   442   * cairo_user_data_key_t:
   443   * @unused: not used; ignore.
   444   *
   445   * #cairo_user_data_key_t is used for attaching user data to cairo
   446   * data structures.  The actual contents of the struct is never used,
   447   * and there is no need to initialize the object; only the unique
   448   * address of a #cairo_data_key_t object is used.  Typically, you
   449   * would just use the address of a static #cairo_data_key_t object.
   450 @@ -2150,16 +2159,24 @@ cairo_surface_get_user_data (cairo_surfa
   451  			     const cairo_user_data_key_t *key);
   453  cairo_public cairo_status_t
   454  cairo_surface_set_user_data (cairo_surface_t		 *surface,
   455  			     const cairo_user_data_key_t *key,
   456  			     void			 *user_data,
   457  			     cairo_destroy_func_t	 destroy);
   459 +cairo_public void
   460 +cairo_surface_attach_snapshot (cairo_surface_t *surface,
   461 +				cairo_surface_t *snapshot,
   462 +				cairo_surface_func_t detach_func);
   463 +
   464 +cairo_public void
   465 +cairo_surface_detach_snapshot (cairo_surface_t *snapshot);
   466 +
   467  #define CAIRO_MIME_TYPE_JPEG "image/jpeg"
   468  #define CAIRO_MIME_TYPE_PNG "image/png"
   469  #define CAIRO_MIME_TYPE_JP2 "image/jp2"
   470  #define CAIRO_MIME_TYPE_URI "text/x-uri"
   472  cairo_public void
   473  cairo_surface_get_mime_data (cairo_surface_t		*surface,
   474                               const char			*mime_type,
   475 @@ -2328,16 +2345,21 @@ cairo_recording_surface_create (cairo_co
   477  cairo_public void
   478  cairo_recording_surface_ink_extents (cairo_surface_t *surface,
   479                                       double *x0,
   480                                       double *y0,
   481                                       double *width,
   482                                       double *height);
   484 +/* Null-surface functions */
   485 +
   486 +cairo_public cairo_surface_t *
   487 +cairo_null_surface_create (cairo_content_t content);
   488 +
   489  /* Pattern creation functions */
   491  cairo_public cairo_pattern_t *
   492  cairo_pattern_create_rgb (double red, double green, double blue);
   494  cairo_public cairo_pattern_t *
   495  cairo_pattern_create_rgba (double red, double green, double blue,
   496  			   double alpha);
   497 diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h
   498 --- a/gfx/cairo/cairo/src/cairoint.h
   499 +++ b/gfx/cairo/cairo/src/cairoint.h
   500 @@ -1770,27 +1770,19 @@ _cairo_surface_clone_similar (cairo_surf
   501  			      int               height,
   502  			      int              *clone_offset_x,
   503  			      int              *clone_offset_y,
   504  			      cairo_surface_t **clone_out);
   506  cairo_private cairo_surface_t *
   507  _cairo_surface_snapshot (cairo_surface_t *surface);
   509 -cairo_private void
   510 -_cairo_surface_attach_snapshot (cairo_surface_t *surface,
   511 -				cairo_surface_t *snapshot,
   512 -				cairo_surface_func_t detach_func);
   513 -
   514  cairo_private cairo_surface_t *
   515  _cairo_surface_has_snapshot (cairo_surface_t *surface,
   516 -			     const cairo_surface_backend_t *backend);
   517 -
   518 -cairo_private void
   519 -_cairo_surface_detach_snapshot (cairo_surface_t *snapshot);
   520 +		 	     const cairo_surface_backend_t *backend);
   522  cairo_private cairo_bool_t
   523  _cairo_surface_is_similar (cairo_surface_t *surface_a,
   524  	                   cairo_surface_t *surface_b);
   526  cairo_private cairo_bool_t
   527  _cairo_surface_get_extents (cairo_surface_t         *surface,
   528  			    cairo_rectangle_int_t   *extents);

mercurial