Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(324)

Side by Side Diff: third_party/harfbuzz-ng/src/hb-shape-plan.cc

Issue 203543007: Merge 257509 "Fix unsafe shape_plan->face dependency" (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1847/src/
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright © 2012 Google, Inc. 2 * Copyright © 2012 Google, Inc.
3 * 3 *
4 * This is part of HarfBuzz, a text shaping library. 4 * This is part of HarfBuzz, a text shaping library.
5 * 5 *
6 * Permission is hereby granted, without written agreement and without 6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this 7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the 8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in 9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software. 10 * all copies of this software.
(...skipping 28 matching lines...) Expand all
39 static void 39 static void
40 hb_shape_plan_plan (hb_shape_plan_t *shape_plan, 40 hb_shape_plan_plan (hb_shape_plan_t *shape_plan,
41 const hb_feature_t *user_features, 41 const hb_feature_t *user_features,
42 unsigned int num_user_features, 42 unsigned int num_user_features,
43 const char * const *shaper_list) 43 const char * const *shaper_list)
44 { 44 {
45 const hb_shaper_pair_t *shapers = _hb_shapers_get (); 45 const hb_shaper_pair_t *shapers = _hb_shapers_get ();
46 46
47 #define HB_SHAPER_PLAN(shaper) \ 47 #define HB_SHAPER_PLAN(shaper) \
48 HB_STMT_START { \ 48 HB_STMT_START { \
49 » if (hb_##shaper##_shaper_face_data_ensure (shape_plan->face)) { \ 49 » if (hb_##shaper##_shaper_face_data_ensure (shape_plan->face_unsafe)) { \
50 HB_SHAPER_DATA (shaper, shape_plan) = \ 50 HB_SHAPER_DATA (shaper, shape_plan) = \
51 HB_SHAPER_DATA_CREATE_FUNC (shaper, shape_plan) (shape_plan, user_ features, num_user_features); \ 51 HB_SHAPER_DATA_CREATE_FUNC (shaper, shape_plan) (shape_plan, user_ features, num_user_features); \
52 shape_plan->shaper_func = _hb_##shaper##_shape; \ 52 shape_plan->shaper_func = _hb_##shaper##_shape; \
53 shape_plan->shaper_name = #shaper; \ 53 shape_plan->shaper_name = #shaper; \
54 return; \ 54 return; \
55 } \ 55 } \
56 } HB_STMT_END 56 } HB_STMT_END
57 57
58 if (likely (!shaper_list)) { 58 if (likely (!shaper_list)) {
59 for (unsigned int i = 0; i < HB_SHAPERS_COUNT; i++) 59 for (unsigned int i = 0; i < HB_SHAPERS_COUNT; i++)
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 110
111 if (unlikely (!face)) 111 if (unlikely (!face))
112 face = hb_face_get_empty (); 112 face = hb_face_get_empty ();
113 if (unlikely (!props || hb_object_is_inert (face))) 113 if (unlikely (!props || hb_object_is_inert (face)))
114 return hb_shape_plan_get_empty (); 114 return hb_shape_plan_get_empty ();
115 if (!(shape_plan = hb_object_create<hb_shape_plan_t> ())) 115 if (!(shape_plan = hb_object_create<hb_shape_plan_t> ()))
116 return hb_shape_plan_get_empty (); 116 return hb_shape_plan_get_empty ();
117 117
118 hb_face_make_immutable (face); 118 hb_face_make_immutable (face);
119 shape_plan->default_shaper_list = shaper_list == NULL; 119 shape_plan->default_shaper_list = shaper_list == NULL;
120 shape_plan->face = hb_face_reference (face); 120 shape_plan->face_unsafe = face;
121 shape_plan->props = *props; 121 shape_plan->props = *props;
122 122
123 hb_shape_plan_plan (shape_plan, user_features, num_user_features, shaper_list) ; 123 hb_shape_plan_plan (shape_plan, user_features, num_user_features, shaper_list) ;
124 124
125 return shape_plan; 125 return shape_plan;
126 } 126 }
127 127
128 /** 128 /**
129 * hb_shape_plan_get_empty: 129 * hb_shape_plan_get_empty:
130 * 130 *
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 **/ 183 **/
184 void 184 void
185 hb_shape_plan_destroy (hb_shape_plan_t *shape_plan) 185 hb_shape_plan_destroy (hb_shape_plan_t *shape_plan)
186 { 186 {
187 if (!hb_object_destroy (shape_plan)) return; 187 if (!hb_object_destroy (shape_plan)) return;
188 188
189 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, shape_plan); 189 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, shape_plan);
190 #include "hb-shaper-list.hh" 190 #include "hb-shaper-list.hh"
191 #undef HB_SHAPER_IMPLEMENT 191 #undef HB_SHAPER_IMPLEMENT
192 192
193 hb_face_destroy (shape_plan->face);
194
195 free (shape_plan); 193 free (shape_plan);
196 } 194 }
197 195
198 /** 196 /**
199 * hb_shape_plan_set_user_data: (skip) 197 * hb_shape_plan_set_user_data: (skip)
200 * @shape_plan: a shape plan. 198 * @shape_plan: a shape plan.
201 * @key: 199 * @key:
202 * @data: 200 * @data:
203 * @destroy: 201 * @destroy:
204 * @replace: 202 * @replace:
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 hb_font_t *font, 255 hb_font_t *font,
258 hb_buffer_t *buffer, 256 hb_buffer_t *buffer,
259 const hb_feature_t *features, 257 const hb_feature_t *features,
260 unsigned int num_features) 258 unsigned int num_features)
261 { 259 {
262 if (unlikely (hb_object_is_inert (shape_plan) || 260 if (unlikely (hb_object_is_inert (shape_plan) ||
263 hb_object_is_inert (font) || 261 hb_object_is_inert (font) ||
264 hb_object_is_inert (buffer))) 262 hb_object_is_inert (buffer)))
265 return false; 263 return false;
266 264
267 assert (shape_plan->face == font->face); 265 assert (shape_plan->face_unsafe == font->face);
268 assert (hb_segment_properties_equal (&shape_plan->props, &buffer->props)); 266 assert (hb_segment_properties_equal (&shape_plan->props, &buffer->props));
269 267
270 #define HB_SHAPER_EXECUTE(shaper) \ 268 #define HB_SHAPER_EXECUTE(shaper) \
271 HB_STMT_START { \ 269 HB_STMT_START { \
272 return HB_SHAPER_DATA (shaper, shape_plan) && \ 270 return HB_SHAPER_DATA (shaper, shape_plan) && \
273 hb_##shaper##_shaper_font_data_ensure (font) && \ 271 hb_##shaper##_shaper_font_data_ensure (font) && \
274 _hb_##shaper##_shape (shape_plan, font, buffer, features, num_f eatures); \ 272 _hb_##shaper##_shape (shape_plan, font, buffer, features, num_f eatures); \
275 } HB_STMT_END 273 } HB_STMT_END
276 274
277 if (0) 275 if (0)
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 386
389 node->shape_plan = shape_plan; 387 node->shape_plan = shape_plan;
390 node->next = cached_plan_nodes; 388 node->next = cached_plan_nodes;
391 389
392 if (!hb_atomic_ptr_cmpexch (&face->shape_plans, cached_plan_nodes, node)) { 390 if (!hb_atomic_ptr_cmpexch (&face->shape_plans, cached_plan_nodes, node)) {
393 hb_shape_plan_destroy (shape_plan); 391 hb_shape_plan_destroy (shape_plan);
394 free (node); 392 free (node);
395 goto retry; 393 goto retry;
396 } 394 }
397 395
398 /* Release our reference on face. */
399 hb_face_destroy (face);
400
401 return hb_shape_plan_reference (shape_plan); 396 return hb_shape_plan_reference (shape_plan);
402 } 397 }
403 398
404 /** 399 /**
405 * hb_shape_plan_get_shaper: 400 * hb_shape_plan_get_shaper:
406 * @shape_plan: a shape plan. 401 * @shape_plan: a shape plan.
407 * 402 *
408 * 403 *
409 * 404 *
410 * Return value: (transfer none): 405 * Return value: (transfer none):
411 * 406 *
412 * Since: 1.0 407 * Since: 1.0
413 **/ 408 **/
414 const char * 409 const char *
415 hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan) 410 hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan)
416 { 411 {
417 return shape_plan->shaper_name; 412 return shape_plan->shaper_name;
418 } 413 }
OLDNEW
« no previous file with comments | « third_party/harfbuzz-ng/src/hb-ot-shape-private.hh ('k') | third_party/harfbuzz-ng/src/hb-shape-plan-private.hh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698