| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 1998-2004 David Turner and Werner Lemberg | 2 * Copyright © 1998-2004 David Turner and Werner Lemberg |
| 3 * Copyright © 2004,2007,2009,2010 Red Hat, Inc. | 3 * Copyright © 2004,2007,2009,2010 Red Hat, Inc. |
| 4 * Copyright © 2011,2012 Google, Inc. | 4 * Copyright © 2011,2012 Google, Inc. |
| 5 * | 5 * |
| 6 * This is part of HarfBuzz, a text shaping library. | 6 * This is part of HarfBuzz, a text shaping library. |
| 7 * | 7 * |
| 8 * Permission is hereby granted, without written agreement and without | 8 * Permission is hereby granted, without written agreement and without |
| 9 * license or royalty fees, to use, copy, modify, and distribute this | 9 * license or royalty fees, to use, copy, modify, and distribute this |
| 10 * software and its documentation for any purpose, provided that the | 10 * software and its documentation for any purpose, provided that the |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 { | 132 { |
| 133 assert (have_output); | 133 assert (have_output); |
| 134 | 134 |
| 135 out_info = (hb_glyph_info_t *) pos; | 135 out_info = (hb_glyph_info_t *) pos; |
| 136 memcpy (out_info, info, out_len * sizeof (out_info[0])); | 136 memcpy (out_info, info, out_len * sizeof (out_info[0])); |
| 137 } | 137 } |
| 138 | 138 |
| 139 return true; | 139 return true; |
| 140 } | 140 } |
| 141 | 141 |
| 142 void * | 142 bool |
| 143 hb_buffer_t::shift_forward (unsigned int count) |
| 144 { |
| 145 assert (have_output); |
| 146 if (unlikely (!ensure (len + count))) return false; |
| 147 |
| 148 memmove (info + idx + count, info + idx, (len - idx) * sizeof (info[0])); |
| 149 len += count; |
| 150 idx += count; |
| 151 |
| 152 return true; |
| 153 } |
| 154 |
| 155 hb_buffer_t::scratch_buffer_t * |
| 143 hb_buffer_t::get_scratch_buffer (unsigned int *size) | 156 hb_buffer_t::get_scratch_buffer (unsigned int *size) |
| 144 { | 157 { |
| 145 have_output = false; | 158 have_output = false; |
| 146 have_positions = false; | 159 have_positions = false; |
| 147 | 160 |
| 148 out_len = 0; | 161 out_len = 0; |
| 149 out_info = info; | 162 out_info = info; |
| 150 | 163 |
| 151 *size = allocated * sizeof (pos[0]); | 164 assert ((uintptr_t) pos % sizeof (scratch_buffer_t) == 0); |
| 152 return pos; | 165 *size = allocated * sizeof (pos[0]) / sizeof (scratch_buffer_t); |
| 166 return (scratch_buffer_t *) (void *) pos; |
| 153 } | 167 } |
| 154 | 168 |
| 155 | 169 |
| 156 | 170 |
| 157 /* HarfBuzz-Internal API */ | 171 /* HarfBuzz-Internal API */ |
| 158 | 172 |
| 159 void | 173 void |
| 160 hb_buffer_t::reset (void) | 174 hb_buffer_t::reset (void) |
| 161 { | 175 { |
| 162 if (unlikely (hb_object_is_inert (this))) | 176 if (unlikely (hb_object_is_inert (this))) |
| 163 return; | 177 return; |
| 164 | 178 |
| 165 hb_unicode_funcs_destroy (unicode); | 179 hb_unicode_funcs_destroy (unicode); |
| 166 unicode = hb_unicode_funcs_get_default (); | 180 unicode = hb_unicode_funcs_get_default (); |
| 167 | 181 |
| 168 clear (); | 182 clear (); |
| 169 } | 183 } |
| 170 | 184 |
| 171 void | 185 void |
| 172 hb_buffer_t::clear (void) | 186 hb_buffer_t::clear (void) |
| 173 { | 187 { |
| 174 if (unlikely (hb_object_is_inert (this))) | 188 if (unlikely (hb_object_is_inert (this))) |
| 175 return; | 189 return; |
| 176 | 190 |
| 177 hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT; | 191 hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT; |
| 178 props = default_props; | 192 props = default_props; |
| 179 flags = HB_BUFFER_FLAGS_DEFAULT; | 193 flags = HB_BUFFER_FLAG_DEFAULT; |
| 180 | 194 |
| 181 content_type = HB_BUFFER_CONTENT_TYPE_INVALID; | 195 content_type = HB_BUFFER_CONTENT_TYPE_INVALID; |
| 182 in_error = false; | 196 in_error = false; |
| 183 have_output = false; | 197 have_output = false; |
| 184 have_positions = false; | 198 have_positions = false; |
| 185 | 199 |
| 186 idx = 0; | 200 idx = 0; |
| 187 len = 0; | 201 len = 0; |
| 188 out_len = 0; | 202 out_len = 0; |
| 189 out_info = info; | 203 out_info = info; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 void | 352 void |
| 339 hb_buffer_t::copy_glyph (void) | 353 hb_buffer_t::copy_glyph (void) |
| 340 { | 354 { |
| 341 if (unlikely (!make_room_for (0, 1))) return; | 355 if (unlikely (!make_room_for (0, 1))) return; |
| 342 | 356 |
| 343 out_info[out_len] = info[idx]; | 357 out_info[out_len] = info[idx]; |
| 344 | 358 |
| 345 out_len++; | 359 out_len++; |
| 346 } | 360 } |
| 347 | 361 |
| 362 bool |
| 363 hb_buffer_t::move_to (unsigned int i) |
| 364 { |
| 365 if (!have_output) |
| 366 { |
| 367 assert (i <= len); |
| 368 idx = i; |
| 369 return true; |
| 370 } |
| 371 |
| 372 assert (i <= out_len + (len - idx)); |
| 373 |
| 374 if (out_len < i) |
| 375 { |
| 376 unsigned int count = i - out_len; |
| 377 if (unlikely (!make_room_for (count, count))) return false; |
| 378 |
| 379 memmove (out_info + out_len, info + idx, count * sizeof (out_info[0])); |
| 380 idx += count; |
| 381 out_len += count; |
| 382 } |
| 383 else if (out_len > i) |
| 384 { |
| 385 /* Tricky part: rewinding... */ |
| 386 unsigned int count = out_len - i; |
| 387 |
| 388 if (unlikely (idx < count && !shift_forward (count + 32))) return false; |
| 389 |
| 390 assert (idx >= count); |
| 391 |
| 392 idx -= count; |
| 393 out_len -= count; |
| 394 memmove (info + idx, out_info + out_len, count * sizeof (out_info[0])); |
| 395 } |
| 396 |
| 397 return true; |
| 398 } |
| 399 |
| 348 void | 400 void |
| 349 hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index) | 401 hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index) |
| 350 { | 402 { |
| 351 if (unlikely (out_info != info || out_len != idx)) { | 403 if (unlikely (out_info != info || out_len != idx)) { |
| 352 if (unlikely (!make_room_for (1, 1))) return; | 404 if (unlikely (!make_room_for (1, 1))) return; |
| 353 out_info[out_len] = info[idx]; | 405 out_info[out_len] = info[idx]; |
| 354 } | 406 } |
| 355 out_info[out_len].codepoint = glyph_index; | 407 out_info[out_len].codepoint = glyph_index; |
| 356 | 408 |
| 357 idx++; | 409 idx++; |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 } | 648 } |
| 597 | 649 |
| 598 void hb_buffer_t::deallocate_var_all (void) | 650 void hb_buffer_t::deallocate_var_all (void) |
| 599 { | 651 { |
| 600 memset (allocated_var_bytes, 0, sizeof (allocated_var_bytes)); | 652 memset (allocated_var_bytes, 0, sizeof (allocated_var_bytes)); |
| 601 memset (allocated_var_owner, 0, sizeof (allocated_var_owner)); | 653 memset (allocated_var_owner, 0, sizeof (allocated_var_owner)); |
| 602 } | 654 } |
| 603 | 655 |
| 604 /* Public API */ | 656 /* Public API */ |
| 605 | 657 |
| 658 /** |
| 659 * hb_buffer_create: (Xconstructor) |
| 660 * |
| 661 * |
| 662 * |
| 663 * Return value: (transfer full) |
| 664 * |
| 665 * Since: 1.0 |
| 666 **/ |
| 606 hb_buffer_t * | 667 hb_buffer_t * |
| 607 hb_buffer_create (void) | 668 hb_buffer_create (void) |
| 608 { | 669 { |
| 609 hb_buffer_t *buffer; | 670 hb_buffer_t *buffer; |
| 610 | 671 |
| 611 if (!(buffer = hb_object_create<hb_buffer_t> ())) | 672 if (!(buffer = hb_object_create<hb_buffer_t> ())) |
| 612 return hb_buffer_get_empty (); | 673 return hb_buffer_get_empty (); |
| 613 | 674 |
| 614 buffer->reset (); | 675 buffer->reset (); |
| 615 | 676 |
| 616 return buffer; | 677 return buffer; |
| 617 } | 678 } |
| 618 | 679 |
| 680 /** |
| 681 * hb_buffer_get_empty: |
| 682 * |
| 683 * |
| 684 * |
| 685 * Return value: (transfer full): |
| 686 * |
| 687 * Since: 1.0 |
| 688 **/ |
| 619 hb_buffer_t * | 689 hb_buffer_t * |
| 620 hb_buffer_get_empty (void) | 690 hb_buffer_get_empty (void) |
| 621 { | 691 { |
| 622 static const hb_buffer_t _hb_buffer_nil = { | 692 static const hb_buffer_t _hb_buffer_nil = { |
| 623 HB_OBJECT_HEADER_STATIC, | 693 HB_OBJECT_HEADER_STATIC, |
| 624 | 694 |
| 625 const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil), | 695 const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil), |
| 626 HB_SEGMENT_PROPERTIES_DEFAULT, | 696 HB_SEGMENT_PROPERTIES_DEFAULT, |
| 627 HB_BUFFER_FLAGS_DEFAULT, | 697 HB_BUFFER_FLAG_DEFAULT, |
| 628 | 698 |
| 629 HB_BUFFER_CONTENT_TYPE_INVALID, | 699 HB_BUFFER_CONTENT_TYPE_INVALID, |
| 630 true, /* in_error */ | 700 true, /* in_error */ |
| 631 true, /* have_output */ | 701 true, /* have_output */ |
| 632 true /* have_positions */ | 702 true /* have_positions */ |
| 633 | 703 |
| 634 /* Zero is good enough for everything else. */ | 704 /* Zero is good enough for everything else. */ |
| 635 }; | 705 }; |
| 636 | 706 |
| 637 return const_cast<hb_buffer_t *> (&_hb_buffer_nil); | 707 return const_cast<hb_buffer_t *> (&_hb_buffer_nil); |
| 638 } | 708 } |
| 639 | 709 |
| 710 /** |
| 711 * hb_buffer_reference: (skip) |
| 712 * @buffer: a buffer. |
| 713 * |
| 714 * |
| 715 * |
| 716 * Return value: (transfer full): |
| 717 * |
| 718 * Since: 1.0 |
| 719 **/ |
| 640 hb_buffer_t * | 720 hb_buffer_t * |
| 641 hb_buffer_reference (hb_buffer_t *buffer) | 721 hb_buffer_reference (hb_buffer_t *buffer) |
| 642 { | 722 { |
| 643 return hb_object_reference (buffer); | 723 return hb_object_reference (buffer); |
| 644 } | 724 } |
| 645 | 725 |
| 726 /** |
| 727 * hb_buffer_destroy: (skip) |
| 728 * @buffer: a buffer. |
| 729 * |
| 730 * |
| 731 * |
| 732 * Since: 1.0 |
| 733 **/ |
| 646 void | 734 void |
| 647 hb_buffer_destroy (hb_buffer_t *buffer) | 735 hb_buffer_destroy (hb_buffer_t *buffer) |
| 648 { | 736 { |
| 649 if (!hb_object_destroy (buffer)) return; | 737 if (!hb_object_destroy (buffer)) return; |
| 650 | 738 |
| 651 hb_unicode_funcs_destroy (buffer->unicode); | 739 hb_unicode_funcs_destroy (buffer->unicode); |
| 652 | 740 |
| 653 free (buffer->info); | 741 free (buffer->info); |
| 654 free (buffer->pos); | 742 free (buffer->pos); |
| 655 | 743 |
| 656 free (buffer); | 744 free (buffer); |
| 657 } | 745 } |
| 658 | 746 |
| 747 /** |
| 748 * hb_buffer_set_user_data: (skip) |
| 749 * @buffer: a buffer. |
| 750 * @key: |
| 751 * @data: |
| 752 * @destroy: |
| 753 * @replace: |
| 754 * |
| 755 * |
| 756 * |
| 757 * Return value: |
| 758 * |
| 759 * Since: 1.0 |
| 760 **/ |
| 659 hb_bool_t | 761 hb_bool_t |
| 660 hb_buffer_set_user_data (hb_buffer_t *buffer, | 762 hb_buffer_set_user_data (hb_buffer_t *buffer, |
| 661 hb_user_data_key_t *key, | 763 hb_user_data_key_t *key, |
| 662 void * data, | 764 void * data, |
| 663 hb_destroy_func_t destroy, | 765 hb_destroy_func_t destroy, |
| 664 hb_bool_t replace) | 766 hb_bool_t replace) |
| 665 { | 767 { |
| 666 return hb_object_set_user_data (buffer, key, data, destroy, replace); | 768 return hb_object_set_user_data (buffer, key, data, destroy, replace); |
| 667 } | 769 } |
| 668 | 770 |
| 771 /** |
| 772 * hb_buffer_get_user_data: (skip) |
| 773 * @buffer: a buffer. |
| 774 * @key: |
| 775 * |
| 776 * |
| 777 * |
| 778 * Return value: |
| 779 * |
| 780 * Since: 1.0 |
| 781 **/ |
| 669 void * | 782 void * |
| 670 hb_buffer_get_user_data (hb_buffer_t *buffer, | 783 hb_buffer_get_user_data (hb_buffer_t *buffer, |
| 671 hb_user_data_key_t *key) | 784 hb_user_data_key_t *key) |
| 672 { | 785 { |
| 673 return hb_object_get_user_data (buffer, key); | 786 return hb_object_get_user_data (buffer, key); |
| 674 } | 787 } |
| 675 | 788 |
| 676 | 789 |
| 790 /** |
| 791 * hb_buffer_set_content_type: |
| 792 * @buffer: a buffer. |
| 793 * @content_type: |
| 794 * |
| 795 * |
| 796 * |
| 797 * Since: 1.0 |
| 798 **/ |
| 677 void | 799 void |
| 678 hb_buffer_set_content_type (hb_buffer_t *buffer, | 800 hb_buffer_set_content_type (hb_buffer_t *buffer, |
| 679 hb_buffer_content_type_t content_type) | 801 hb_buffer_content_type_t content_type) |
| 680 { | 802 { |
| 681 buffer->content_type = content_type; | 803 buffer->content_type = content_type; |
| 682 } | 804 } |
| 683 | 805 |
| 806 /** |
| 807 * hb_buffer_get_content_type: |
| 808 * @buffer: a buffer. |
| 809 * |
| 810 * |
| 811 * |
| 812 * Return value: |
| 813 * |
| 814 * Since: 1.0 |
| 815 **/ |
| 684 hb_buffer_content_type_t | 816 hb_buffer_content_type_t |
| 685 hb_buffer_get_content_type (hb_buffer_t *buffer) | 817 hb_buffer_get_content_type (hb_buffer_t *buffer) |
| 686 { | 818 { |
| 687 return buffer->content_type; | 819 return buffer->content_type; |
| 688 } | 820 } |
| 689 | 821 |
| 690 | 822 |
| 823 /** |
| 824 * hb_buffer_set_unicode_funcs: |
| 825 * @buffer: a buffer. |
| 826 * @unicode_funcs: |
| 827 * |
| 828 * |
| 829 * |
| 830 * Since: 1.0 |
| 831 **/ |
| 691 void | 832 void |
| 692 hb_buffer_set_unicode_funcs (hb_buffer_t *buffer, | 833 hb_buffer_set_unicode_funcs (hb_buffer_t *buffer, |
| 693 » » » hb_unicode_funcs_t *unicode) | 834 » » » hb_unicode_funcs_t *unicode_funcs) |
| 694 { | 835 { |
| 695 if (unlikely (hb_object_is_inert (buffer))) | 836 if (unlikely (hb_object_is_inert (buffer))) |
| 696 return; | 837 return; |
| 697 | 838 |
| 698 if (!unicode) | 839 if (!unicode_funcs) |
| 699 unicode = hb_unicode_funcs_get_default (); | 840 unicode_funcs = hb_unicode_funcs_get_default (); |
| 700 | 841 |
| 701 | 842 |
| 702 hb_unicode_funcs_reference (unicode); | 843 hb_unicode_funcs_reference (unicode_funcs); |
| 703 hb_unicode_funcs_destroy (buffer->unicode); | 844 hb_unicode_funcs_destroy (buffer->unicode); |
| 704 buffer->unicode = unicode; | 845 buffer->unicode = unicode_funcs; |
| 705 } | 846 } |
| 706 | 847 |
| 848 /** |
| 849 * hb_buffer_get_unicode_funcs: |
| 850 * @buffer: a buffer. |
| 851 * |
| 852 * |
| 853 * |
| 854 * Return value: |
| 855 * |
| 856 * Since: 1.0 |
| 857 **/ |
| 707 hb_unicode_funcs_t * | 858 hb_unicode_funcs_t * |
| 708 hb_buffer_get_unicode_funcs (hb_buffer_t *buffer) | 859 hb_buffer_get_unicode_funcs (hb_buffer_t *buffer) |
| 709 { | 860 { |
| 710 return buffer->unicode; | 861 return buffer->unicode; |
| 711 } | 862 } |
| 712 | 863 |
| 864 /** |
| 865 * hb_buffer_set_direction: |
| 866 * @buffer: a buffer. |
| 867 * @direction: |
| 868 * |
| 869 * |
| 870 * |
| 871 * Since: 1.0 |
| 872 **/ |
| 713 void | 873 void |
| 714 hb_buffer_set_direction (hb_buffer_t *buffer, | 874 hb_buffer_set_direction (hb_buffer_t *buffer, |
| 715 hb_direction_t direction) | 875 hb_direction_t direction) |
| 716 | 876 |
| 717 { | 877 { |
| 718 if (unlikely (hb_object_is_inert (buffer))) | 878 if (unlikely (hb_object_is_inert (buffer))) |
| 719 return; | 879 return; |
| 720 | 880 |
| 721 buffer->props.direction = direction; | 881 buffer->props.direction = direction; |
| 722 } | 882 } |
| 723 | 883 |
| 884 /** |
| 885 * hb_buffer_get_direction: |
| 886 * @buffer: a buffer. |
| 887 * |
| 888 * |
| 889 * |
| 890 * Return value: |
| 891 * |
| 892 * Since: 1.0 |
| 893 **/ |
| 724 hb_direction_t | 894 hb_direction_t |
| 725 hb_buffer_get_direction (hb_buffer_t *buffer) | 895 hb_buffer_get_direction (hb_buffer_t *buffer) |
| 726 { | 896 { |
| 727 return buffer->props.direction; | 897 return buffer->props.direction; |
| 728 } | 898 } |
| 729 | 899 |
| 900 /** |
| 901 * hb_buffer_set_script: |
| 902 * @buffer: a buffer. |
| 903 * @script: |
| 904 * |
| 905 * |
| 906 * |
| 907 * Since: 1.0 |
| 908 **/ |
| 730 void | 909 void |
| 731 hb_buffer_set_script (hb_buffer_t *buffer, | 910 hb_buffer_set_script (hb_buffer_t *buffer, |
| 732 hb_script_t script) | 911 hb_script_t script) |
| 733 { | 912 { |
| 734 if (unlikely (hb_object_is_inert (buffer))) | 913 if (unlikely (hb_object_is_inert (buffer))) |
| 735 return; | 914 return; |
| 736 | 915 |
| 737 buffer->props.script = script; | 916 buffer->props.script = script; |
| 738 } | 917 } |
| 739 | 918 |
| 919 /** |
| 920 * hb_buffer_get_script: |
| 921 * @buffer: a buffer. |
| 922 * |
| 923 * |
| 924 * |
| 925 * Return value: |
| 926 * |
| 927 * Since: 1.0 |
| 928 **/ |
| 740 hb_script_t | 929 hb_script_t |
| 741 hb_buffer_get_script (hb_buffer_t *buffer) | 930 hb_buffer_get_script (hb_buffer_t *buffer) |
| 742 { | 931 { |
| 743 return buffer->props.script; | 932 return buffer->props.script; |
| 744 } | 933 } |
| 745 | 934 |
| 935 /** |
| 936 * hb_buffer_set_language: |
| 937 * @buffer: a buffer. |
| 938 * @language: |
| 939 * |
| 940 * |
| 941 * |
| 942 * Since: 1.0 |
| 943 **/ |
| 746 void | 944 void |
| 747 hb_buffer_set_language (hb_buffer_t *buffer, | 945 hb_buffer_set_language (hb_buffer_t *buffer, |
| 748 hb_language_t language) | 946 hb_language_t language) |
| 749 { | 947 { |
| 750 if (unlikely (hb_object_is_inert (buffer))) | 948 if (unlikely (hb_object_is_inert (buffer))) |
| 751 return; | 949 return; |
| 752 | 950 |
| 753 buffer->props.language = language; | 951 buffer->props.language = language; |
| 754 } | 952 } |
| 755 | 953 |
| 954 /** |
| 955 * hb_buffer_get_language: |
| 956 * @buffer: a buffer. |
| 957 * |
| 958 * |
| 959 * |
| 960 * Return value: |
| 961 * |
| 962 * Since: 1.0 |
| 963 **/ |
| 756 hb_language_t | 964 hb_language_t |
| 757 hb_buffer_get_language (hb_buffer_t *buffer) | 965 hb_buffer_get_language (hb_buffer_t *buffer) |
| 758 { | 966 { |
| 759 return buffer->props.language; | 967 return buffer->props.language; |
| 760 } | 968 } |
| 761 | 969 |
| 970 /** |
| 971 * hb_buffer_set_segment_properties: |
| 972 * @buffer: a buffer. |
| 973 * @props: |
| 974 * |
| 975 * |
| 976 * |
| 977 * Since: 1.0 |
| 978 **/ |
| 762 void | 979 void |
| 763 hb_buffer_set_segment_properties (hb_buffer_t *buffer, | 980 hb_buffer_set_segment_properties (hb_buffer_t *buffer, |
| 764 const hb_segment_properties_t *props) | 981 const hb_segment_properties_t *props) |
| 765 { | 982 { |
| 766 if (unlikely (hb_object_is_inert (buffer))) | 983 if (unlikely (hb_object_is_inert (buffer))) |
| 767 return; | 984 return; |
| 768 | 985 |
| 769 buffer->props = *props; | 986 buffer->props = *props; |
| 770 } | 987 } |
| 771 | 988 |
| 989 /** |
| 990 * hb_buffer_get_segment_properties: |
| 991 * @buffer: a buffer. |
| 992 * @props: |
| 993 * |
| 994 * |
| 995 * |
| 996 * Since: 1.0 |
| 997 **/ |
| 772 void | 998 void |
| 773 hb_buffer_get_segment_properties (hb_buffer_t *buffer, | 999 hb_buffer_get_segment_properties (hb_buffer_t *buffer, |
| 774 hb_segment_properties_t *props) | 1000 hb_segment_properties_t *props) |
| 775 { | 1001 { |
| 776 *props = buffer->props; | 1002 *props = buffer->props; |
| 777 } | 1003 } |
| 778 | 1004 |
| 779 | 1005 |
| 1006 /** |
| 1007 * hb_buffer_set_flags: |
| 1008 * @buffer: a buffer. |
| 1009 * @flags: |
| 1010 * |
| 1011 * |
| 1012 * |
| 1013 * Since: 1.0 |
| 1014 **/ |
| 780 void | 1015 void |
| 781 hb_buffer_set_flags (hb_buffer_t *buffer, | 1016 hb_buffer_set_flags (hb_buffer_t *buffer, |
| 782 hb_buffer_flags_t flags) | 1017 hb_buffer_flags_t flags) |
| 783 { | 1018 { |
| 784 if (unlikely (hb_object_is_inert (buffer))) | 1019 if (unlikely (hb_object_is_inert (buffer))) |
| 785 return; | 1020 return; |
| 786 | 1021 |
| 787 buffer->flags = flags; | 1022 buffer->flags = flags; |
| 788 } | 1023 } |
| 789 | 1024 |
| 1025 /** |
| 1026 * hb_buffer_get_flags: |
| 1027 * @buffer: a buffer. |
| 1028 * |
| 1029 * |
| 1030 * |
| 1031 * Return value: |
| 1032 * |
| 1033 * Since: 1.0 |
| 1034 **/ |
| 790 hb_buffer_flags_t | 1035 hb_buffer_flags_t |
| 791 hb_buffer_get_flags (hb_buffer_t *buffer) | 1036 hb_buffer_get_flags (hb_buffer_t *buffer) |
| 792 { | 1037 { |
| 793 return buffer->flags; | 1038 return buffer->flags; |
| 794 } | 1039 } |
| 795 | 1040 |
| 796 | 1041 |
| 1042 /** |
| 1043 * hb_buffer_reset: |
| 1044 * @buffer: a buffer. |
| 1045 * |
| 1046 * |
| 1047 * |
| 1048 * Since: 1.0 |
| 1049 **/ |
| 797 void | 1050 void |
| 798 hb_buffer_reset (hb_buffer_t *buffer) | 1051 hb_buffer_reset (hb_buffer_t *buffer) |
| 799 { | 1052 { |
| 800 buffer->reset (); | 1053 buffer->reset (); |
| 801 } | 1054 } |
| 802 | 1055 |
| 1056 /** |
| 1057 * hb_buffer_clear_contents: |
| 1058 * @buffer: a buffer. |
| 1059 * |
| 1060 * |
| 1061 * |
| 1062 * Since: 1.0 |
| 1063 **/ |
| 803 void | 1064 void |
| 804 hb_buffer_clear_contents (hb_buffer_t *buffer) | 1065 hb_buffer_clear_contents (hb_buffer_t *buffer) |
| 805 { | 1066 { |
| 806 buffer->clear (); | 1067 buffer->clear (); |
| 807 } | 1068 } |
| 808 | 1069 |
| 1070 /** |
| 1071 * hb_buffer_pre_allocate: |
| 1072 * @buffer: a buffer. |
| 1073 * @size: |
| 1074 * |
| 1075 * |
| 1076 * |
| 1077 * Return value: |
| 1078 * |
| 1079 * Since: 1.0 |
| 1080 **/ |
| 809 hb_bool_t | 1081 hb_bool_t |
| 810 hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size) | 1082 hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size) |
| 811 { | 1083 { |
| 812 return buffer->ensure (size); | 1084 return buffer->ensure (size); |
| 813 } | 1085 } |
| 814 | 1086 |
| 1087 /** |
| 1088 * hb_buffer_allocation_successful: |
| 1089 * @buffer: a buffer. |
| 1090 * |
| 1091 * |
| 1092 * |
| 1093 * Return value: |
| 1094 * |
| 1095 * Since: 1.0 |
| 1096 **/ |
| 815 hb_bool_t | 1097 hb_bool_t |
| 816 hb_buffer_allocation_successful (hb_buffer_t *buffer) | 1098 hb_buffer_allocation_successful (hb_buffer_t *buffer) |
| 817 { | 1099 { |
| 818 return !buffer->in_error; | 1100 return !buffer->in_error; |
| 819 } | 1101 } |
| 820 | 1102 |
| 1103 /** |
| 1104 * hb_buffer_add: |
| 1105 * @buffer: a buffer. |
| 1106 * @codepoint: |
| 1107 * @cluster: |
| 1108 * |
| 1109 * |
| 1110 * |
| 1111 * Since: 1.0 |
| 1112 **/ |
| 821 void | 1113 void |
| 822 hb_buffer_add (hb_buffer_t *buffer, | 1114 hb_buffer_add (hb_buffer_t *buffer, |
| 823 hb_codepoint_t codepoint, | 1115 hb_codepoint_t codepoint, |
| 824 unsigned int cluster) | 1116 unsigned int cluster) |
| 825 { | 1117 { |
| 826 buffer->add (codepoint, cluster); | 1118 buffer->add (codepoint, cluster); |
| 827 buffer->clear_context (1); | 1119 buffer->clear_context (1); |
| 828 } | 1120 } |
| 829 | 1121 |
| 1122 /** |
| 1123 * hb_buffer_set_length: |
| 1124 * @buffer: a buffer. |
| 1125 * @length: |
| 1126 * |
| 1127 * |
| 1128 * |
| 1129 * Return value: |
| 1130 * |
| 1131 * Since: 1.0 |
| 1132 **/ |
| 830 hb_bool_t | 1133 hb_bool_t |
| 831 hb_buffer_set_length (hb_buffer_t *buffer, | 1134 hb_buffer_set_length (hb_buffer_t *buffer, |
| 832 unsigned int length) | 1135 unsigned int length) |
| 833 { | 1136 { |
| 834 if (unlikely (hb_object_is_inert (buffer))) | 1137 if (unlikely (hb_object_is_inert (buffer))) |
| 835 return length == 0; | 1138 return length == 0; |
| 836 | 1139 |
| 837 if (!buffer->ensure (length)) | 1140 if (!buffer->ensure (length)) |
| 838 return false; | 1141 return false; |
| 839 | 1142 |
| 840 /* Wipe the new space */ | 1143 /* Wipe the new space */ |
| 841 if (length > buffer->len) { | 1144 if (length > buffer->len) { |
| 842 memset (buffer->info + buffer->len, 0, sizeof (buffer->info[0]) * (length -
buffer->len)); | 1145 memset (buffer->info + buffer->len, 0, sizeof (buffer->info[0]) * (length -
buffer->len)); |
| 843 if (buffer->have_positions) | 1146 if (buffer->have_positions) |
| 844 memset (buffer->pos + buffer->len, 0, sizeof (buffer->pos[0]) * (length -
buffer->len)); | 1147 memset (buffer->pos + buffer->len, 0, sizeof (buffer->pos[0]) * (length -
buffer->len)); |
| 845 } | 1148 } |
| 846 | 1149 |
| 847 buffer->len = length; | 1150 buffer->len = length; |
| 848 | 1151 |
| 849 if (!length) | 1152 if (!length) |
| 850 buffer->clear_context (0); | 1153 buffer->clear_context (0); |
| 851 buffer->clear_context (1); | 1154 buffer->clear_context (1); |
| 852 | 1155 |
| 853 return true; | 1156 return true; |
| 854 } | 1157 } |
| 855 | 1158 |
| 1159 /** |
| 1160 * hb_buffer_get_length: |
| 1161 * @buffer: a buffer. |
| 1162 * |
| 1163 * Returns the number of items in the buffer. |
| 1164 * |
| 1165 * Return value: buffer length. |
| 1166 * |
| 1167 * Since: 1.0 |
| 1168 **/ |
| 856 unsigned int | 1169 unsigned int |
| 857 hb_buffer_get_length (hb_buffer_t *buffer) | 1170 hb_buffer_get_length (hb_buffer_t *buffer) |
| 858 { | 1171 { |
| 859 return buffer->len; | 1172 return buffer->len; |
| 860 } | 1173 } |
| 861 | 1174 |
| 862 /* Return value valid as long as buffer not modified */ | 1175 /** |
| 1176 * hb_buffer_get_glyph_infos: |
| 1177 * @buffer: a buffer. |
| 1178 * @length: (out): output array length. |
| 1179 * |
| 1180 * Returns buffer glyph information array. Returned pointer |
| 1181 * is valid as long as buffer contents are not modified. |
| 1182 * |
| 1183 * Return value: (transfer none) (array length=length): buffer glyph information
array. |
| 1184 * |
| 1185 * Since: 1.0 |
| 1186 **/ |
| 863 hb_glyph_info_t * | 1187 hb_glyph_info_t * |
| 864 hb_buffer_get_glyph_infos (hb_buffer_t *buffer, | 1188 hb_buffer_get_glyph_infos (hb_buffer_t *buffer, |
| 865 unsigned int *length) | 1189 unsigned int *length) |
| 866 { | 1190 { |
| 867 if (length) | 1191 if (length) |
| 868 *length = buffer->len; | 1192 *length = buffer->len; |
| 869 | 1193 |
| 870 return (hb_glyph_info_t *) buffer->info; | 1194 return (hb_glyph_info_t *) buffer->info; |
| 871 } | 1195 } |
| 872 | 1196 |
| 873 /* Return value valid as long as buffer not modified */ | 1197 /** |
| 1198 * hb_buffer_get_glyph_positions: |
| 1199 * @buffer: a buffer. |
| 1200 * @length: (out): output length. |
| 1201 * |
| 1202 * Returns buffer glyph position array. Returned pointer |
| 1203 * is valid as long as buffer contents are not modified. |
| 1204 * |
| 1205 * Return value: (transfer none) (array length=length): buffer glyph position ar
ray. |
| 1206 * |
| 1207 * Since: 1.0 |
| 1208 **/ |
| 874 hb_glyph_position_t * | 1209 hb_glyph_position_t * |
| 875 hb_buffer_get_glyph_positions (hb_buffer_t *buffer, | 1210 hb_buffer_get_glyph_positions (hb_buffer_t *buffer, |
| 876 unsigned int *length) | 1211 unsigned int *length) |
| 877 { | 1212 { |
| 878 if (!buffer->have_positions) | 1213 if (!buffer->have_positions) |
| 879 buffer->clear_positions (); | 1214 buffer->clear_positions (); |
| 880 | 1215 |
| 881 if (length) | 1216 if (length) |
| 882 *length = buffer->len; | 1217 *length = buffer->len; |
| 883 | 1218 |
| 884 return (hb_glyph_position_t *) buffer->pos; | 1219 return (hb_glyph_position_t *) buffer->pos; |
| 885 } | 1220 } |
| 886 | 1221 |
| 1222 /** |
| 1223 * hb_buffer_reverse: |
| 1224 * @buffer: a buffer. |
| 1225 * |
| 1226 * Reverses buffer contents. |
| 1227 * |
| 1228 * Since: 1.0 |
| 1229 **/ |
| 887 void | 1230 void |
| 888 hb_buffer_reverse (hb_buffer_t *buffer) | 1231 hb_buffer_reverse (hb_buffer_t *buffer) |
| 889 { | 1232 { |
| 890 buffer->reverse (); | 1233 buffer->reverse (); |
| 891 } | 1234 } |
| 892 | 1235 |
| 1236 /** |
| 1237 * hb_buffer_reverse_clusters: |
| 1238 * @buffer: a buffer. |
| 1239 * |
| 1240 * Reverses buffer clusters. That is, the buffer contents are |
| 1241 * reversed, then each cluster (consecutive items having the |
| 1242 * same cluster number) are reversed again. |
| 1243 * |
| 1244 * Since: 1.0 |
| 1245 **/ |
| 893 void | 1246 void |
| 894 hb_buffer_reverse_clusters (hb_buffer_t *buffer) | 1247 hb_buffer_reverse_clusters (hb_buffer_t *buffer) |
| 895 { | 1248 { |
| 896 buffer->reverse_clusters (); | 1249 buffer->reverse_clusters (); |
| 897 } | 1250 } |
| 898 | 1251 |
| 1252 /** |
| 1253 * hb_buffer_guess_segment_properties: |
| 1254 * @buffer: a buffer. |
| 1255 * |
| 1256 * Sets unset buffer segment properties based on buffer Unicode |
| 1257 * contents. If buffer is not empty, it must have content type |
| 1258 * %HB_BUFFER_CONTENT_TYPE_UNICODE. |
| 1259 * |
| 1260 * If buffer script is not set (ie. is %HB_SCRIPT_INVALID), it |
| 1261 * will be set to the Unicode script of the first character in |
| 1262 * the buffer that has a script other than %HB_SCRIPT_COMMON, |
| 1263 * %HB_SCRIPT_INHERITED, and %HB_SCRIPT_UNKNOWN. |
| 1264 * |
| 1265 * Next, if buffer direction is not set (ie. is %HB_DIRECTION_INVALID), |
| 1266 * it will be set to the natural horizontal direction of the |
| 1267 * buffer script as returned by hb_script_get_horizontal_direction(). |
| 1268 * |
| 1269 * Finally, if buffer language is not set (ie. is %HB_LANGUAGE_INVALID), |
| 1270 * it will be set to the process's default language as returned by |
| 1271 * hb_language_get_default(). This may change in the future by |
| 1272 * taking buffer script into consideration when choosing a language. |
| 1273 * |
| 1274 * Since: 1.0 |
| 1275 **/ |
| 899 void | 1276 void |
| 900 hb_buffer_guess_segment_properties (hb_buffer_t *buffer) | 1277 hb_buffer_guess_segment_properties (hb_buffer_t *buffer) |
| 901 { | 1278 { |
| 902 buffer->guess_segment_properties (); | 1279 buffer->guess_segment_properties (); |
| 903 } | 1280 } |
| 904 | 1281 |
| 905 template <typename T> | 1282 template <typename T> |
| 906 static inline void | 1283 static inline void |
| 907 hb_buffer_add_utf (hb_buffer_t *buffer, | 1284 hb_buffer_add_utf (hb_buffer_t *buffer, |
| 908 const T *text, | 1285 const T *text, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 while (next < end && buffer->context_len[1] < buffer->CONTEXT_LENGTH) | 1338 while (next < end && buffer->context_len[1] < buffer->CONTEXT_LENGTH) |
| 962 { | 1339 { |
| 963 hb_codepoint_t u; | 1340 hb_codepoint_t u; |
| 964 next = hb_utf_next (next, end, &u); | 1341 next = hb_utf_next (next, end, &u); |
| 965 buffer->context[1][buffer->context_len[1]++] = u; | 1342 buffer->context[1][buffer->context_len[1]++] = u; |
| 966 } | 1343 } |
| 967 | 1344 |
| 968 buffer->content_type = HB_BUFFER_CONTENT_TYPE_UNICODE; | 1345 buffer->content_type = HB_BUFFER_CONTENT_TYPE_UNICODE; |
| 969 } | 1346 } |
| 970 | 1347 |
| 1348 /** |
| 1349 * hb_buffer_add_utf8: |
| 1350 * @buffer: a buffer. |
| 1351 * @text: (array length=text_length): |
| 1352 * @text_length: |
| 1353 * @item_offset: |
| 1354 * @item_length: |
| 1355 * |
| 1356 * |
| 1357 * |
| 1358 * Since: 1.0 |
| 1359 **/ |
| 971 void | 1360 void |
| 972 hb_buffer_add_utf8 (hb_buffer_t *buffer, | 1361 hb_buffer_add_utf8 (hb_buffer_t *buffer, |
| 973 const char *text, | 1362 const char *text, |
| 974 int text_length, | 1363 int text_length, |
| 975 unsigned int item_offset, | 1364 unsigned int item_offset, |
| 976 int item_length) | 1365 int item_length) |
| 977 { | 1366 { |
| 978 hb_buffer_add_utf (buffer, (const uint8_t *) text, text_length, item_offset, i
tem_length); | 1367 hb_buffer_add_utf (buffer, (const uint8_t *) text, text_length, item_offset, i
tem_length); |
| 979 } | 1368 } |
| 980 | 1369 |
| 1370 /** |
| 1371 * hb_buffer_add_utf16: |
| 1372 * @buffer: a buffer. |
| 1373 * @text: (array length=text_length): |
| 1374 * @text_length: |
| 1375 * @item_offset: |
| 1376 * @item_length: |
| 1377 * |
| 1378 * |
| 1379 * |
| 1380 * Since: 1.0 |
| 1381 **/ |
| 981 void | 1382 void |
| 982 hb_buffer_add_utf16 (hb_buffer_t *buffer, | 1383 hb_buffer_add_utf16 (hb_buffer_t *buffer, |
| 983 const uint16_t *text, | 1384 const uint16_t *text, |
| 984 int text_length, | 1385 int text_length, |
| 985 unsigned int item_offset, | 1386 unsigned int item_offset, |
| 986 » » int item_length) | 1387 » » int item_length) |
| 987 { | 1388 { |
| 988 hb_buffer_add_utf (buffer, text, text_length, item_offset, item_length); | 1389 hb_buffer_add_utf (buffer, text, text_length, item_offset, item_length); |
| 989 } | 1390 } |
| 990 | 1391 |
| 1392 /** |
| 1393 * hb_buffer_add_utf32: |
| 1394 * @buffer: a buffer. |
| 1395 * @text: (array length=text_length): |
| 1396 * @text_length: |
| 1397 * @item_offset: |
| 1398 * @item_length: |
| 1399 * |
| 1400 * |
| 1401 * |
| 1402 * Since: 1.0 |
| 1403 **/ |
| 991 void | 1404 void |
| 992 hb_buffer_add_utf32 (hb_buffer_t *buffer, | 1405 hb_buffer_add_utf32 (hb_buffer_t *buffer, |
| 993 const uint32_t *text, | 1406 const uint32_t *text, |
| 994 int text_length, | 1407 int text_length, |
| 995 unsigned int item_offset, | 1408 unsigned int item_offset, |
| 996 int item_length) | 1409 int item_length) |
| 997 { | 1410 { |
| 998 hb_buffer_add_utf (buffer, text, text_length, item_offset, item_length); | 1411 hb_buffer_add_utf (buffer, text, text_length, item_offset, item_length); |
| 999 } | 1412 } |
| 1000 | 1413 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1047 pos[start].x_advance += total_x_advance; | 1460 pos[start].x_advance += total_x_advance; |
| 1048 pos[start].y_advance += total_y_advance; | 1461 pos[start].y_advance += total_y_advance; |
| 1049 for (unsigned int i = start + 1; i < end; i++) { | 1462 for (unsigned int i = start + 1; i < end; i++) { |
| 1050 pos[i].x_offset -= total_x_advance; | 1463 pos[i].x_offset -= total_x_advance; |
| 1051 pos[i].y_offset -= total_y_advance; | 1464 pos[i].y_offset -= total_y_advance; |
| 1052 } | 1465 } |
| 1053 hb_bubble_sort (buffer->info + start + 1, end - start - 1, compare_info_code
point, buffer->pos + start + 1); | 1466 hb_bubble_sort (buffer->info + start + 1, end - start - 1, compare_info_code
point, buffer->pos + start + 1); |
| 1054 } | 1467 } |
| 1055 } | 1468 } |
| 1056 | 1469 |
| 1470 /** |
| 1471 * hb_buffer_normalize_glyphs: |
| 1472 * @buffer: a buffer. |
| 1473 * |
| 1474 * |
| 1475 * |
| 1476 * Since: 1.0 |
| 1477 **/ |
| 1057 void | 1478 void |
| 1058 hb_buffer_normalize_glyphs (hb_buffer_t *buffer) | 1479 hb_buffer_normalize_glyphs (hb_buffer_t *buffer) |
| 1059 { | 1480 { |
| 1060 assert (buffer->have_positions); | 1481 assert (buffer->have_positions); |
| 1061 assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); | 1482 assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); |
| 1062 | 1483 |
| 1063 bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); | 1484 bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); |
| 1064 | 1485 |
| 1065 unsigned int count = buffer->len; | 1486 unsigned int count = buffer->len; |
| 1066 if (unlikely (!count)) return; | 1487 if (unlikely (!count)) return; |
| 1067 hb_glyph_info_t *info = buffer->info; | 1488 hb_glyph_info_t *info = buffer->info; |
| 1068 | 1489 |
| 1069 unsigned int start = 0; | 1490 unsigned int start = 0; |
| 1070 unsigned int end; | 1491 unsigned int end; |
| 1071 for (end = start + 1; end < count; end++) | 1492 for (end = start + 1; end < count; end++) |
| 1072 if (info[start].cluster != info[end].cluster) { | 1493 if (info[start].cluster != info[end].cluster) { |
| 1073 normalize_glyphs_cluster (buffer, start, end, backward); | 1494 normalize_glyphs_cluster (buffer, start, end, backward); |
| 1074 start = end; | 1495 start = end; |
| 1075 } | 1496 } |
| 1076 normalize_glyphs_cluster (buffer, start, end, backward); | 1497 normalize_glyphs_cluster (buffer, start, end, backward); |
| 1077 } | 1498 } |
| OLD | NEW |