OLD | NEW |
1 /* | 1 /* |
2 * Copyright © 2009,2010 Red Hat, Inc. | 2 * Copyright © 2009,2010 Red Hat, Inc. |
3 * Copyright © 2010,2011,2012 Google, Inc. | 3 * Copyright © 2010,2011,2012 Google, Inc. |
4 * | 4 * |
5 * This is part of HarfBuzz, a text shaping library. | 5 * This is part of HarfBuzz, a text shaping library. |
6 * | 6 * |
7 * Permission is hereby granted, without written agreement and without | 7 * Permission is hereby granted, without written agreement and without |
8 * license or royalty fees, to use, copy, modify, and distribute this | 8 * license or royalty fees, to use, copy, modify, and distribute this |
9 * software and its documentation for any purpose, provided that the | 9 * software and its documentation for any purpose, provided that the |
10 * above copyright notice and the following two paragraphs appear in | 10 * above copyright notice and the following two paragraphs appear in |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 static inline void | 394 static inline void |
395 hb_ot_substitute (hb_ot_shape_context_t *c) | 395 hb_ot_substitute (hb_ot_shape_context_t *c) |
396 { | 396 { |
397 hb_ot_substitute_default (c); | 397 hb_ot_substitute_default (c); |
398 hb_ot_substitute_complex (c); | 398 hb_ot_substitute_complex (c); |
399 } | 399 } |
400 | 400 |
401 /* Position */ | 401 /* Position */ |
402 | 402 |
403 static inline void | 403 static inline void |
| 404 zero_mark_widths_by_unicode (hb_buffer_t *buffer) |
| 405 { |
| 406 unsigned int count = buffer->len; |
| 407 for (unsigned int i = 0; i < count; i++) |
| 408 if (_hb_glyph_info_get_general_category (&buffer->info[i]) == HB_UNICODE_GEN
ERAL_CATEGORY_NON_SPACING_MARK) |
| 409 { |
| 410 buffer->pos[i].x_advance = 0; |
| 411 buffer->pos[i].y_advance = 0; |
| 412 } |
| 413 } |
| 414 |
| 415 static inline void |
| 416 zero_mark_widths_by_gdef (hb_buffer_t *buffer) |
| 417 { |
| 418 unsigned int count = buffer->len; |
| 419 for (unsigned int i = 0; i < count; i++) |
| 420 if ((buffer->info[i].glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK)) |
| 421 { |
| 422 buffer->pos[i].x_advance = 0; |
| 423 buffer->pos[i].y_advance = 0; |
| 424 } |
| 425 } |
| 426 |
| 427 static inline void |
404 hb_ot_position_default (hb_ot_shape_context_t *c) | 428 hb_ot_position_default (hb_ot_shape_context_t *c) |
405 { | 429 { |
406 hb_ot_layout_position_start (c->font, c->buffer); | 430 hb_ot_layout_position_start (c->font, c->buffer); |
407 | 431 |
408 unsigned int count = c->buffer->len; | 432 unsigned int count = c->buffer->len; |
409 for (unsigned int i = 0; i < count; i++) | 433 for (unsigned int i = 0; i < count; i++) |
410 { | 434 { |
411 c->font->get_glyph_advance_for_direction (c->buffer->info[i].codepoint, | 435 c->font->get_glyph_advance_for_direction (c->buffer->info[i].codepoint, |
412 c->buffer->props.direction, | 436 c->buffer->props.direction, |
413 &c->buffer->pos[i].x_advance, | 437 &c->buffer->pos[i].x_advance, |
414 &c->buffer->pos[i].y_advance); | 438 &c->buffer->pos[i].y_advance); |
415 c->font->subtract_glyph_origin_for_direction (c->buffer->info[i].codepoint, | 439 c->font->subtract_glyph_origin_for_direction (c->buffer->info[i].codepoint, |
416 c->buffer->props.direction, | 440 c->buffer->props.direction, |
417 &c->buffer->pos[i].x_offset, | 441 &c->buffer->pos[i].x_offset, |
418 &c->buffer->pos[i].y_offset); | 442 &c->buffer->pos[i].y_offset); |
419 | 443 |
420 } | 444 } |
421 | 445 |
422 /* Zero'ing mark widths by GDEF (as used in Myanmar spec) happens | |
423 * *before* GPOS. */ | |
424 switch (c->plan->shaper->zero_width_marks) | 446 switch (c->plan->shaper->zero_width_marks) |
425 { | 447 { |
426 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF: | 448 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY: |
427 for (unsigned int i = 0; i < count; i++) | 449 zero_mark_widths_by_gdef (c->buffer); |
428 » if ((c->buffer->info[i].glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK)) | |
429 » { | |
430 » c->buffer->pos[i].x_advance = 0; | |
431 » c->buffer->pos[i].y_advance = 0; | |
432 » } | |
433 break; | 450 break; |
434 | 451 |
| 452 /* Not currently used for any shaper: |
| 453 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY: |
| 454 zero_mark_widths_by_unicode (c->buffer); |
| 455 break; |
| 456 */ |
| 457 |
435 default: | 458 default: |
436 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE: | 459 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE: |
437 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE: | 460 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE: |
| 461 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE: |
438 break; | 462 break; |
439 } | 463 } |
440 } | 464 } |
441 | 465 |
442 static inline bool | 466 static inline bool |
443 hb_ot_position_complex (hb_ot_shape_context_t *c) | 467 hb_ot_position_complex (hb_ot_shape_context_t *c) |
444 { | 468 { |
445 bool ret = false; | 469 bool ret = false; |
446 unsigned int count = c->buffer->len; | 470 unsigned int count = c->buffer->len; |
447 | 471 |
(...skipping 13 matching lines...) Expand all Loading... |
461 for (unsigned int i = 0; i < count; i++) { | 485 for (unsigned int i = 0; i < count; i++) { |
462 c->font->subtract_glyph_origin_for_direction (c->buffer->info[i].codepoint
, | 486 c->font->subtract_glyph_origin_for_direction (c->buffer->info[i].codepoint
, |
463 HB_DIRECTION_LTR, | 487 HB_DIRECTION_LTR, |
464 &c->buffer->pos[i].x_offset, | 488 &c->buffer->pos[i].x_offset, |
465 &c->buffer->pos[i].y_offset)
; | 489 &c->buffer->pos[i].y_offset)
; |
466 } | 490 } |
467 | 491 |
468 ret = true; | 492 ret = true; |
469 } | 493 } |
470 | 494 |
471 /* Zero'ing mark widths by Unicode happens | |
472 * *after* GPOS. */ | |
473 switch (c->plan->shaper->zero_width_marks) | 495 switch (c->plan->shaper->zero_width_marks) |
474 { | 496 { |
475 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE: | 497 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE: |
476 for (unsigned int i = 0; i < count; i++) | 498 zero_mark_widths_by_unicode (c->buffer); |
477 » if (_hb_glyph_info_get_general_category (&c->buffer->info[i]) == HB_UNIC
ODE_GENERAL_CATEGORY_NON_SPACING_MARK) | 499 break; |
478 » { | 500 |
479 » c->buffer->pos[i].x_advance = 0; | 501 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE: |
480 » c->buffer->pos[i].y_advance = 0; | 502 zero_mark_widths_by_gdef (c->buffer); |
481 » } | |
482 break; | 503 break; |
483 | 504 |
484 default: | 505 default: |
485 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE: | 506 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE: |
486 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF: | 507 //case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY: |
| 508 case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY: |
487 break; | 509 break; |
488 } | 510 } |
489 | 511 |
490 hb_ot_layout_position_finish (c->font, c->buffer); | 512 hb_ot_layout_position_finish (c->font, c->buffer); |
491 | 513 |
492 return ret; | 514 return ret; |
493 } | 515 } |
494 | 516 |
495 static inline void | 517 static inline void |
496 hb_ot_position (hb_ot_shape_context_t *c) | 518 hb_ot_position (hb_ot_shape_context_t *c) |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 hb_set_t copy; | 667 hb_set_t copy; |
646 copy.init (); | 668 copy.init (); |
647 do { | 669 do { |
648 copy.set (glyphs); | 670 copy.set (glyphs); |
649 for (hb_codepoint_t lookup_index = -1; hb_set_next (&lookups, &lookup_index)
;) | 671 for (hb_codepoint_t lookup_index = -1; hb_set_next (&lookups, &lookup_index)
;) |
650 hb_ot_layout_lookup_substitute_closure (font->face, lookup_index, glyphs); | 672 hb_ot_layout_lookup_substitute_closure (font->face, lookup_index, glyphs); |
651 } while (!copy.is_equal (glyphs)); | 673 } while (!copy.is_equal (glyphs)); |
652 | 674 |
653 hb_shape_plan_destroy (shape_plan); | 675 hb_shape_plan_destroy (shape_plan); |
654 } | 676 } |
OLD | NEW |