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 |