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

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

Issue 70193010: Update harfbuzz-ng to 0.9.24 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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 © 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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « third_party/harfbuzz-ng/src/hb-buffer.h ('k') | third_party/harfbuzz-ng/src/hb-buffer-private.hh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698