Changeset 182:721afe91f448
- Timestamp:
- 03/02/08 12:39:35
(7 months ago)
- Author:
- Frank Benoit <benoit@tionex.de>
- branch:
- default
- Message:
Fix: several utf8 awareness problems
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r150 |
r182 |
|
| 1305 | 1305 | while (index < length_ && string[index] !is '&') index++; |
|---|
| 1306 | 1306 | if (++index >= length_) return '\0'; |
|---|
| 1307 | | if (string[index] !is '&') return CharacterToLower(getFirstCodepoint( string[index..$])); |
|---|
| | 1307 | if (string[index] !is '&') return CharacterFirstToLower(string[index..$]); |
|---|
| 1308 | 1308 | index++; |
|---|
| 1309 | 1309 | } while (index < length_); |
|---|
| r108 |
r182 |
|
| 1 | | /******************************************************************************* |
|---|
| | 1 | /******************************************************************************* |
|---|
| 2 | 2 | * Copyright (c) 2000, 2007 IBM Corporation and others. |
|---|
| 3 | 3 | * All rights reserved. This program and the accompanying materials |
|---|
| … | … | |
| 890 | 890 | gapLine = getLineAtPhysicalOffset(gapStart); |
|---|
| 891 | 891 | } |
|---|
| 892 | | } |
|---|
| | 892 | |
|---|
| | 893 | /++ |
|---|
| | 894 | + DWT extension |
|---|
| | 895 | +/ |
|---|
| | 896 | int utf8AdjustOffset( int offset ){ |
|---|
| | 897 | if (textStore is null) |
|---|
| | 898 | return offset; |
|---|
| | 899 | if (offset is 0) |
|---|
| | 900 | return offset; |
|---|
| | 901 | if( offset >= textStore.length ){ |
|---|
| | 902 | return offset; |
|---|
| | 903 | } |
|---|
| | 904 | if (!gapExists() || (offset < gapStart)){ |
|---|
| | 905 | while( textStore[offset] & 0xC0 is 0x80 ){ |
|---|
| | 906 | offset--; |
|---|
| | 907 | } |
|---|
| | 908 | return offset; |
|---|
| | 909 | } |
|---|
| | 910 | int gapLength= gapEnd - gapStart; |
|---|
| | 911 | if( offset+gapLength >= textStore.length ){ |
|---|
| | 912 | return offset; |
|---|
| | 913 | } |
|---|
| | 914 | while( textStore[offset+gapLength] & 0xC0 is 0x80 ){ |
|---|
| | 915 | offset--; |
|---|
| | 916 | } |
|---|
| | 917 | return offset; |
|---|
| | 918 | } |
|---|
| | 919 | |
|---|
| | 920 | |
|---|
| | 921 | } |
|---|
| r108 |
r182 |
|
| 1 | | /******************************************************************************* |
|---|
| | 1 | /******************************************************************************* |
|---|
| 2 | 2 | * Copyright (c) 2000, 2004 IBM Corporation and others. |
|---|
| 3 | 3 | * All rights reserved. This program and the accompanying materials |
|---|
| r170 |
r182 |
|
| 91 | 91 | alias tango.text.Text.Text!(char) StringBuffer; |
|---|
| 92 | 92 | private alias char[] String; |
|---|
| 93 | | |
|---|
| 94 | 93 | |
|---|
| 95 | 94 | /** |
|---|
| … | … | |
| 841 | 840 | */ |
|---|
| 842 | 841 | void write(String string, int start, int end) { |
|---|
| 843 | | wchar[] wstring = tango.text.convert.Utf.toString16( string[ start .. end ] ); |
|---|
| 844 | 842 | start = 0; |
|---|
| 845 | | end = wstring.length; |
|---|
| 846 | | for (int index = start; index < end; index++) { |
|---|
| 847 | | wchar ch = wstring[index]; |
|---|
| | 843 | end = string.length; |
|---|
| | 844 | int incr = 1; |
|---|
| | 845 | for (int index = start; index < end; index+=incr) { |
|---|
| | 846 | dchar ch = firstCodePoint( string[index .. $], incr ); |
|---|
| 848 | 847 | if (ch > 0xFF && WriteUnicode) { |
|---|
| 849 | 848 | // write the sub string from the last escaped character |
|---|
| 850 | 849 | // to the current one. Fixes bug 21698. |
|---|
| 851 | 850 | if (index > start) { |
|---|
| 852 | | write(tango.text.convert.Utf.toString(wstring[start .. index ])); |
|---|
| | 851 | write( string[start .. index ] ); |
|---|
| 853 | 852 | } |
|---|
| 854 | 853 | write("\\u"); |
|---|
| 855 | 854 | write( to!(char[])( cast(short)ch )); |
|---|
| 856 | 855 | write(' '); // control word delimiter |
|---|
| 857 | | start = index + 1; |
|---|
| | 856 | start = index + incr; |
|---|
| 858 | 857 | } else if (ch is '}' || ch is '{' || ch is '\\') { |
|---|
| 859 | 858 | // write the sub string from the last escaped character |
|---|
| 860 | 859 | // to the current one. Fixes bug 21698. |
|---|
| 861 | 860 | if (index > start) { |
|---|
| 862 | | write(tango.text.convert.Utf.toString(wstring[start .. index])); |
|---|
| | 861 | write(string[start .. index]); |
|---|
| 863 | 862 | } |
|---|
| 864 | 863 | write('\\'); |
|---|
| … | … | |
| 870 | 869 | // Fixes bug 21698. |
|---|
| 871 | 870 | if (start < end) { |
|---|
| 872 | | write(tango.text.convert.Utf.toString(wstring[ start .. end])); |
|---|
| | 871 | write(string[ start .. end]); |
|---|
| 873 | 872 | } |
|---|
| 874 | 873 | } |
|---|
| … | … | |
| 2234 | 2233 | * @param key the character typed by the user |
|---|
| 2235 | 2234 | */ |
|---|
| 2236 | | void doContent(char key) { |
|---|
| | 2235 | void doContent(dchar key) { |
|---|
| 2237 | 2236 | if (textLimit > 0 && |
|---|
| 2238 | 2237 | content.getCharCount() - (selection.y - selection.x) >= textLimit) { |
|---|
| … | … | |
| 2258 | 2257 | // end of the line |
|---|
| 2259 | 2258 | if (event.end < lineOffset + line.length) { |
|---|
| 2260 | | event.end++; |
|---|
| 2261 | | } |
|---|
| 2262 | | event.text = [key]; |
|---|
| | 2259 | event.end+=dcharToString( key ).length; |
|---|
| | 2260 | } |
|---|
| | 2261 | event.text = dcharToString( key ); |
|---|
| 2263 | 2262 | } else { |
|---|
| 2264 | | event.text = [key]; |
|---|
| | 2263 | event.text = dcharToString( key ); |
|---|
| 2265 | 2264 | } |
|---|
| 2266 | 2265 | if (event.text !is null) { |
|---|
| … | … | |
| 2976 | 2975 | int offsetInLine = caretOffset - lineOffset; |
|---|
| 2977 | 2976 | caretAlignment = OFFSET_LEADING; |
|---|
| | 2977 | |
|---|
| 2978 | 2978 | if (offsetInLine > 0) { |
|---|
| 2979 | 2979 | caretOffset = getClusterPrevious(caretOffset, caretLine); |
|---|
| … | … | |
| 5624 | 5624 | while (index < length_ && string[index] !is '&') index++; |
|---|
| 5625 | 5625 | if (++index >= length_) return '\0'; |
|---|
| 5626 | | if (string[index] !is '&') return CharacterToLower(getFirstCodepoint( string[index .. $ ] )); |
|---|
| | 5626 | if (string[index] !is '&') return CharacterFirstToLower(string[index .. $ ] ); |
|---|
| 5627 | 5627 | index++; |
|---|
| 5628 | 5628 | } while (index < length_); |
|---|
| … | … | |
| 7686 | 7686 | void setSelection(int start, int length, bool sendEvent) { |
|---|
| 7687 | 7687 | int end = start + length; |
|---|
| | 7688 | start = content.utf8AdjustOffset(start); |
|---|
| | 7689 | end = content.utf8AdjustOffset(end); |
|---|
| 7688 | 7690 | if (start > end) { |
|---|
| 7689 | 7691 | int temp = end; |
|---|
| r108 |
r182 |
|
| 1 | | /******************************************************************************* |
|---|
| | 1 | /******************************************************************************* |
|---|
| 2 | 2 | * Copyright (c) 2000, 2006 IBM Corporation and others. |
|---|
| 3 | 3 | * All rights reserved. This program and the accompanying materials |
|---|
| … | … | |
| 206 | 206 | */ |
|---|
| 207 | 207 | public void setText(char[] text); |
|---|
| | 208 | |
|---|
| | 209 | /++ |
|---|
| | 210 | + DWT Extension |
|---|
| | 211 | +/ |
|---|
| | 212 | int utf8AdjustOffset( int offset ); |
|---|
| | 213 | |
|---|
| 208 | 214 | } |
|---|
| r108 |
r182 |
|
| 1 | | /******************************************************************************* |
|---|
| | 1 | /******************************************************************************* |
|---|
| 2 | 2 | * Copyright (c) 2000, 2004 IBM Corporation and others. |
|---|
| 3 | 3 | * All rights reserved. This program and the accompanying materials |
|---|
| r170 |
r182 |
|
| 72 | 72 | PangoAttrList* attrList; |
|---|
| 73 | 73 | int[] invalidOffsets; |
|---|
| 74 | | static const wchar LTR_MARK = '\u200E', RTL_MARK = '\u200F', ZWS = '\u200B', ZWNBS = '\uFEFF'; |
|---|
| | 74 | // LTR_MARK LEFT-TO-RIGHT MARK |
|---|
| | 75 | // RTL_MARK RIGHT-TO-LEFT MARK |
|---|
| | 76 | // ZWS ZERO WIDTH SPACE |
|---|
| | 77 | // ZWNBS ZERO WIDTH NO-BREAK SPACE |
|---|
| | 78 | static const dchar LTR_MARK = '\u200E', RTL_MARK = '\u200F', ZWS = '\u200B', ZWNBS = '\uFEFF'; |
|---|
| | 79 | static const char[] STR_LTR_MARK = "\u200E", STR_RTL_MARK = "\u200F", STR_ZWS = "\u200B", STR_ZWNBS = "\uFEFF"; |
|---|
| 75 | 80 | |
|---|
| 76 | 81 | /** |
|---|
| … | … | |
| 124 | 129 | attrList = OS.pango_attr_list_new(); |
|---|
| 125 | 130 | //PangoAttribute* attribute = new PangoAttribute(); |
|---|
| 126 | | wchar[] charsW = null; |
|---|
| 127 | | wchar[] segmentsTextW = toString16( segmentsText ); |
|---|
| 128 | | int segementsWLength = segmentsTextW.length; |
|---|
| 129 | | if ((ascent !is -1 || descent !is -1) && segementsWLength > 0) { |
|---|
| | 131 | char[] chars = null; |
|---|
| | 132 | int segementsLength = segmentsText.length; |
|---|
| | 133 | if ((ascent !is -1 || descent !is -1) && segementsLength > 0) { |
|---|
| 130 | 134 | auto iter = OS.pango_layout_get_iter(layout); |
|---|
| 131 | 135 | if (iter is null) DWT.error(DWT.ERROR_NO_HANDLES); |
|---|
| … | … | |
| 134 | 138 | rect.height = (Math.max(0, ascent) + Math.max(0, descent)) * OS.PANGO_SCALE; |
|---|
| 135 | 139 | int lineCount = OS.pango_layout_get_line_count(layout); |
|---|
| 136 | | charsW = new wchar[segementsWLength + lineCount * 2]; |
|---|
| | 140 | chars = new char[segementsLength + lineCount * 6/*2*/]; |
|---|
| 137 | 141 | int oldPos = 0, count = 0; |
|---|
| 138 | 142 | do { |
|---|
| … | … | |
| 148 | 152 | attr.end_index = bytePos + offset + 6; |
|---|
| 149 | 153 | OS.pango_attr_list_insert(attrList, attr); |
|---|
| 150 | | int pos = OS.g_utf8_pointer_to_offset(ptr, ptr + bytePos); |
|---|
| 151 | | charsW[pos + count * 2] = ZWS; |
|---|
| 152 | | charsW[pos + count * 2 + 1] = ZWNBS; |
|---|
| 153 | | charsW[ oldPos + count*2 .. oldPos + count*2 + pos - oldPos ] = |
|---|
| 154 | | segmentsTextW[ oldPos .. pos ]; |
|---|
| 155 | | //segmentsTextW.getChars(oldPos, pos, chars, oldPos + count * 2); |
|---|
| | 154 | int pos = bytePos;//OS.g_utf8_pointer_to_offset(ptr, ptr + bytePos); |
|---|
| | 155 | chars[pos + count * 6 +0 .. pos + count * 6 + 3] = STR_ZWS; |
|---|
| | 156 | chars[pos + count * 6 +3 .. pos + count * 6 + 6] = STR_ZWNBS; |
|---|
| | 157 | chars[ oldPos + count*6 .. oldPos + count*6 + pos - oldPos ] = |
|---|
| | 158 | segmentsText[ oldPos .. pos ]; |
|---|
| 156 | 159 | oldPos = pos; |
|---|
| 157 | 160 | count++; |
|---|
| 158 | 161 | } while (OS.pango_layout_iter_next_line(iter)); |
|---|
| 159 | 162 | OS.pango_layout_iter_free (iter); |
|---|
| 160 | | charsW[ oldPos + count*2 .. oldPos + count*2 + segementsWLength - oldPos ] = |
|---|
| 161 | | segmentsTextW[ oldPos .. segementsWLength ]; |
|---|
| 162 | | //segmentsTextW.getChars(oldPos, segementsWLength, chars, oldPos + count * 2); |
|---|
| 163 | | char[] buffer = .toString( charsW );// Converter.wcsToMbcs(null, chars, false); |
|---|
| | 163 | chars[ oldPos + count*6 .. oldPos + count*6 + segementsLength - oldPos ] = |
|---|
| | 164 | segmentsText[ oldPos .. segementsLength ]; |
|---|
| | 165 | char[] buffer = chars;// Converter.wcsToMbcs(null, chars, false); |
|---|
| | 166 | |
|---|
| 164 | 167 | OS.pango_layout_set_text (layout, buffer.ptr, buffer.length); |
|---|
| 165 | 168 | ptr = OS.pango_layout_get_text(layout); |
|---|
| 166 | 169 | } else { |
|---|
| 167 | | charsW = segmentsTextW.dup; |
|---|
| | 170 | chars = segmentsText.dup; |
|---|
| 168 | 171 | } |
|---|
| 169 | 172 | int offsetCount = 0; |
|---|
| 170 | | for (int i = 0; i < charsW.length; i++) { |
|---|
| 171 | | wchar c = charsW[i]; |
|---|
| 172 | | if (c is LTR_MARK || c is RTL_MARK || c is ZWNBS || c is ZWS) { |
|---|
| 173 | | offsetCount++; |
|---|
| | 173 | { |
|---|
| | 174 | int i = 0; |
|---|
| | 175 | while( i < chars.length ){ |
|---|
| | 176 | int incr; |
|---|
| | 177 | dchar c = firstCodePoint( chars[ i .. $ ], incr ); |
|---|
| | 178 | if (c is LTR_MARK || c is RTL_MARK || c is ZWNBS || c is ZWS) { |
|---|
| | 179 | offsetCount+=3; |
|---|
| | 180 | } |
|---|
| | 181 | i += incr; |
|---|
| 174 | 182 | } |
|---|
| 175 | 183 | } |
|---|
| 176 | 184 | invalidOffsets = new int[offsetCount]; |
|---|
| 177 | 185 | offsetCount = 0; |
|---|
| 178 | | for (int i = 0; i < charsW.length; i++) { |
|---|
| 179 | | wchar c = charsW[i]; |
|---|
| 180 | | if (c is LTR_MARK || c is RTL_MARK || c is ZWNBS || c is ZWS) { |
|---|
| 181 | | invalidOffsets[offsetCount++] = i; |
|---|
| | 186 | { |
|---|
| | 187 | int i = 0; |
|---|
| | 188 | while( i < chars.length ){ |
|---|
| | 189 | int incr; |
|---|
| | 190 | dchar c = firstCodePoint( chars[ i .. $ ], incr ); |
|---|
| | 191 | if (c is LTR_MARK || c is RTL_MARK || c is ZWNBS || c is ZWS) { |
|---|
| | 192 | invalidOffsets[offsetCount++] = i; |
|---|
| | 193 | invalidOffsets[offsetCount++] = i+1; |
|---|
| | 194 | invalidOffsets[offsetCount++] = i+2; |
|---|
| | 195 | } |
|---|
| | 196 | i += incr; |
|---|
| 182 | 197 | } |
|---|
| 183 | 198 | } |
|---|
| … | … | |
| 189 | 204 | int start = translateOffset(styleItem.start); |
|---|
| 190 | 205 | int end = translateOffset(styles[i+1].start - 1); |
|---|
| 191 | | int byteStart = (OS.g_utf8_offset_to_pointer(ptr, start) - ptr); |
|---|
| 192 | | int byteEnd = (OS.g_utf8_offset_to_pointer(ptr, end + 1) - ptr); |
|---|
| | 206 | int byteStart = start;//(OS.g_utf8_offset_to_pointer(ptr, start) - ptr); |
|---|
| | 207 | int byteEnd = end+1;//(OS.g_utf8_offset_to_pointer(ptr, end + 1) - ptr); |
|---|
| 193 | 208 | byteStart = Math.min(byteStart, slen); |
|---|
| 194 | 209 | byteEnd = Math.min(byteEnd, slen); |
|---|
| … | … | |
| 371 | 386 | if (OS.pango_layout_iter_next_line(iter)) { |
|---|
| 372 | 387 | int bytePos = OS.pango_layout_iter_get_index(iter); |
|---|
| 373 | | lineEnd = OS.g_utf8_pointer_to_offset(ptr, ptr + bytePos); |
|---|
| | 388 | lineEnd = bytePos;//OS.g_utf8_pointer_to_offset(ptr, ptr + bytePos); |
|---|
| 374 | 389 | } else { |
|---|
| 375 | 390 | lineEnd = OS.g_utf8_strlen(ptr, -1); |
|---|
| … | … | |
| 440 | 455 | } else { |
|---|
| 441 | 456 | auto ptr = OS.pango_layout_get_text(layout); |
|---|
| 442 | | int byteSelStart = (OS.g_utf8_offset_to_pointer(ptr, selectionStart) - ptr); |
|---|
| 443 | | int byteSelEnd = (OS.g_utf8_offset_to_pointer(ptr, selectionEnd + 1) - ptr); |
|---|
| | 457 | int byteSelStart = selectionStart;//(OS.g_utf8_offset_to_pointer(ptr, selectionStart) - ptr); |
|---|
| | 458 | int byteSelEnd = selectionEnd + 1;//(OS.g_utf8_offset_to_pointer(ptr, selectionEnd + 1) - ptr); |
|---|
| 444 | 459 | int slen = strlen(ptr); |
|---|
| 445 | 460 | byteSelStart = Math.min(byteSelStart, slen); |
|---|
| … | … | |
| 583 | 598 | end = translateOffset(end); |
|---|
| 584 | 599 | auto ptr = OS.pango_layout_get_text(layout); |
|---|
| 585 | | int byteStart = (OS.g_utf8_offset_to_pointer (ptr, start) - ptr); |
|---|
| 586 | | int byteEnd = (OS.g_utf8_offset_to_pointer (ptr, end + 1) - ptr); |
|---|
| | 600 | auto cont = fromStringz(ptr); |
|---|
| | 601 | start = cont.utf8AdjustOffset( start ); |
|---|
| | 602 | end = cont.utf8AdjustOffset( end ); |
|---|
| | 603 | int incr = 1; |
|---|
| | 604 | if( end < cont.length ){ |
|---|
| | 605 | incr = cont.getRelativeCodePointOffset( end, 1 ); |
|---|
| | 606 | } |
|---|
| | 607 | int byteStart = start;//(OS.g_utf8_offset_to_pointer (ptr, start) - ptr); |
|---|
| | 608 | int byteEnd = end + incr;//(OS.g_utf8_offset_to_pointer (ptr, end + 1) - ptr); |
|---|
| 587 | 609 | int slen = strlen(ptr); |
|---|
| 588 | 610 | byteStart = Math.min(byteStart, slen); |
|---|
| … | … | |
| 719 | 741 | PangoLayoutRun* run = new PangoLayoutRun(); |
|---|
| 720 | 742 | auto ptr = OS.pango_layout_get_text(layout); |
|---|
| 721 | | auto byteOffset = OS.g_utf8_offset_to_pointer(ptr, offset) - ptr; |
|---|
| | 743 | auto byteOffset = offset;//OS.g_utf8_offset_to_pointer(ptr, offset) - ptr; |
|---|
| 722 | 744 | int slen = strlen(ptr); |
|---|
| 723 | 745 | byteOffset = Math.min(byteOffset, slen); |
|---|
| … | … | |
| 809 | 831 | int line = 0; |
|---|
| 810 | 832 | auto ptr = OS.pango_layout_get_text(layout); |
|---|
| 811 | | auto byteOffset = OS.g_utf8_offset_to_pointer(ptr,offset) - ptr; |
|---|
| | 833 | auto byteOffset = offset;//OS.g_utf8_offset_to_pointer(ptr,offset) - ptr; |
|---|
| 812 | 834 | int slen = strlen(ptr); |
|---|
| 813 | 835 | byteOffset = Math.min(byteOffset, slen); |
|---|
| … | … | |
| 883 | 905 | do { |
|---|
| 884 | 906 | int bytePos = OS.pango_layout_iter_get_index(iter); |
|---|
| 885 | | int pos = OS.g_utf8_pointer_to_offset(ptr, ptr + bytePos); |
|---|
| | 907 | int pos = bytePos;//OS.g_utf8_pointer_to_offset(ptr, ptr + bytePos); |
|---|
| 886 | 908 | offsets[i++] = untranslateOffset(pos); |
|---|
| 887 | 909 | } while (OS.pango_layout_iter_next_line(iter)); |
|---|
| … | … | |
| 914 | 936 | offset = translateOffset(offset); |
|---|
| 915 | 937 | auto ptr = OS.pango_layout_get_text(layout); |
|---|
| 916 | | int byteOffset = (OS.g_utf8_offset_to_pointer(ptr, offset) - ptr); |
|---|
| 917 | | int slen = strlen(ptr); |
|---|
| | 938 | auto cont = fromStringz(ptr); |
|---|
| | 939 | offset = cont.utf8AdjustOffset(offset); |
|---|
| | 940 | // leading ZWS+ZWNBS are 2 codepoints in 6 bytes, so we miss 4 bytes here |
|---|
| | 941 | int byteOffset = offset;//(OS.g_utf8_offset_to_pointer(ptr, offset) - ptr); |
|---|
| | 942 | int slen = cont.length; |
|---|
| 918 | 943 | byteOffset = Math.min(byteOffset, slen); |
|---|
| 919 | 944 | PangoRectangle* pos = new PangoRectangle(); |
|---|
| … | … | |
| 957 | 982 | if (offset is 0) return 0; |
|---|
| 958 | 983 | } |
|---|
| | 984 | auto cont = OS.pango_layout_get_text(layout); |
|---|
| | 985 | assert( cont ); |
|---|
| | 986 | auto dcont = fromStringz(cont); |
|---|
| 959 | 987 | int step = forward ? 1 : -1; |
|---|
| 960 | | if ((movement & DWT.MOVEMENT_CHAR) !is 0) return offset + step; |
|---|
| | 988 | if ((movement & DWT.MOVEMENT_CHAR) !is 0){ |
|---|
| | 989 | //PORTING take care of utf8 |
|---|
| | 990 | int toffset = translateOffset(offset); |
|---|
| | 991 | toffset = dcont.utf8AdjustOffset( toffset ); |
|---|
| | 992 | int incr = dcont.getRelativeCodePointOffset( toffset, step ); |
|---|
| | 993 | return offset + incr; |
|---|
| | 994 | } |
|---|
| 961 | 995 | PangoLogAttr* attrs; |
|---|
| 962 | 996 | int nAttrs; |
|---|
| 963 | 997 | OS.pango_layout_get_log_attrs(layout, &attrs, &nAttrs); |
|---|
| 964 | 998 | if (attrs is null) return offset + step; |
|---|
| 965 | | length = OS.g_utf8_strlen(OS.pango_layout_get_text(layout), -1); |
|---|
| | 999 | length = OS.g_utf8_strlen(cont, -1); |
|---|
| 966 | 1000 | offset = translateOffset(offset); |
|---|
| | 1001 | offset = dcont.utf8AdjustOffset( offset ); |
|---|
| 967 | 1002 | PangoLogAttr* logAttr = new PangoLogAttr(); |
|---|
| 968 | | offset = validateOffset(offset, step); |
|---|
| | 1003 | offset = validateOffset( dcont, offset, step); |
|---|
| 969 | 1004 | while (0 < offset && offset < length) { |
|---|
| 970 | 1005 | *logAttr = attrs[ offset ]; |
|---|
| … | … | |
| 983 | 1018 | if (logAttr.bitfield0 & (1<<6/*is_word_end*/)) break; |
|---|
| 984 | 1019 | } |
|---|
| 985 | | offset = validateOffset(offset, step); |
|---|
| | 1020 | offset = validateOffset( dcont, offset, step); |
|---|
| 986 | 1021 | } |
|---|
| 987 | 1022 | OS.g_free(attrs); |
|---|
| … | … | |
| 1074 | 1109 | OS.pango_layout_xy_to_index(layout, x * OS.PANGO_SCALE, y * OS.PANGO_SCALE, &index, &piTrailing); |
|---|
| 1075 | 1110 | auto ptr = OS.pango_layout_get_text(layout); |
|---|
| 1076 | | int offset = OS.g_utf8_pointer_to_offset(ptr, ptr + index); |
|---|
| | 1111 | int offset = index;//OS.g_utf8_pointer_to_offset(ptr, ptr + index); |
|---|
| 1077 | 1112 | if (trailing !is null) trailing[0] = piTrailing; |
|---|
| 1078 | 1113 | return untranslateOffset(offset); |
|---|
| … | … | |
| 1173 | 1208 | } |
|---|
| 1174 | 1209 | char[] oldChars = text[0..len].dup; |
|---|
| 1175 | | char[] newChars = new char[len + nSegments]; |
|---|
| | 1210 | char[] newChars = new char[len + nSegments*3]; |
|---|
| 1176 | 1211 | int charCount = 0, segmentCount = 0; |
|---|
| 1177 | | wchar separator = getOrientation() is DWT.RIGHT_TO_LEFT ? RTL_MARK : LTR_MARK; |
|---|
| | 1212 | char[] separator = getOrientation() is DWT.RIGHT_TO_LEFT ? STR_RTL_MARK : STR_LTR_MARK; |
|---|
| 1178 | 1213 | while (charCount < len) { |
|---|
| 1179 | 1214 | if (segmentCount < nSegments && charCount is segments[segmentCount]) { |
|---|
| 1180 | | newChars[charCount + segmentCount++] = separator; |
|---|
| | 1215 | newChars[charCount + segmentCount .. charCount + segmentCount + separator.length ] = separator; |
|---|
| | 1216 | segmentCount+=separator.length; |
|---|
| 1181 | 1217 | } else { |
|---|
| 1182 | | newChars[charCount + segmentCount] = oldChars[charCount++]; |
|---|
| | 1218 | newChars[charCount + segmentCount] = oldChars[charCount]; |
|---|
| | 1219 | charCount++; |
|---|
| 1183 | 1220 | } |
|---|
| 1184 | 1221 | } |
|---|
| 1185 | 1222 | if (segmentCount < nSegments) { |
|---|
| 1186 | 1223 | segments[segmentCount] = charCount; |
|---|
| 1187 | | newChars[charCount + segmentCount++] = separator; |
|---|
| | 1224 | newChars[charCount + segmentCount .. charCount + segmentCount + separator.length ] = separator; |
|---|
| | 1225 | segmentCount+=separator.length; |
|---|
| 1188 | 1226 | } |
|---|
| 1189 | 1227 | return newChars[ 0 .. Math.min(charCount + segmentCount, newChars.length) ]; |
|---|
| … | … | |
| 1425 | 1463 | if (font !is null && font.isDisposed()) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
|---|
| 1426 | 1464 | if (this.font is font) return; |
|---|
| 1427 | | if (font !is null && font ==/*eq*/ this.font ) return; |
|---|
| | 1465 | if (font !is null && font.opEquals(this.font)) return; |
|---|
| 1428 | 1466 | this.font = font; |
|---|
| 1429 | 1467 | OS.pango_layout_set_font_description(layout, font !is null ? font.handle : null); |
|---|
| … | … | |
| 1555 | 1593 | */ |
|---|
| 1556 | 1594 | public void setStyle (TextStyle style, int start, int end) { |
|---|
| | 1595 | char[] styleTxt = "<null>"; |
|---|
| | 1596 | if( style !is null ){ |
|---|
| | 1597 | styleTxt = style.toString; |
|---|
| | 1598 | } |
|---|
| 1557 | 1599 | checkLayout(); |
|---|
| 1558 | 1600 | int length = text.length; |
|---|
| … | … | |
| 1561 | 1603 | start = Math.min(Math.max(0, start), length - 1); |
|---|
| 1562 | 1604 | end = Math.min(Math.max(0, end), length - 1); |
|---|
| | 1605 | start = text.utf8AdjustOffset( start ); |
|---|
| | 1606 | end = text.utf8AdjustOffset( end ); |
|---|
| | 1607 | |
|---|
| 1563 | 1608 | |
|---|
| 1564 | 1609 | /* |
|---|
| … | … | |
| 1569 | 1614 | * NOTE that fix only LamAlef ligatures. |
|---|
| 1570 | 1615 | */ |
|---|
| 1571 | | if (start > 0 && isAlef(text[start]) && isLam(text[start - 1])) { |
|---|
| 1572 | | start--; |
|---|
| 1573 | | } |
|---|
| 1574 | | if (end < length - 1 && isLam(text[end]) && isAlef(text[end + 1])) { |
|---|
| 1575 | | end++; |
|---|
| | 1616 | int relIndex; |
|---|
| | 1617 | if ((start > 0 ) && isAlef(text[ start .. $ ].firstCodePoint()) && isLam(text.getRelativeCodePoint( start, -1, relIndex ))) { |
|---|
| | 1618 | start += relIndex; |
|---|
| | 1619 | } |
|---|
| | 1620 | if ((end < length - 1) && isLam(text[ end .. $ ].firstCodePoint()) && isAlef(text.getRelativeCodePoint(end, 1,relIndex))) { |
|---|
| | 1621 | end += relIndex; |
|---|
| 1576 | 1622 | } |
|---|
| 1577 | 1623 | |
|---|
| … | … | |
| 1592 | 1638 | if (item.style is null) return; |
|---|
| 1593 | 1639 | } else { |
|---|
| 1594 | | if (style ==/*eq*/ item.style) return; |
|---|
| | 1640 | if (style.opEquals(item.style)) return; |
|---|
| 1595 | 1641 | } |
|---|
| 1596 | 1642 | } |
|---|
| … | … | |
| 1695 | 1741 | public void setText (char[] text) { |
|---|
| 1696 | 1742 | checkLayout (); |
|---|
| 1697 | | if (text ==/*eq*/this.text) return; |
|---|
| | 1743 | if (text.equals(this.text)) return; |
|---|
| 1698 | 1744 | freeRuns(); |
|---|
| 1699 | 1745 | this.text = text; |
|---|
| … | … | |
| 1793 | 1839 | } |
|---|
| 1794 | 1840 | |
|---|
| 1795 | | int validateOffset(int offset, int step) { |
|---|
| | 1841 | int validateOffset( char[] cont, int offset, int step) { |
|---|
| 1796 | 1842 | if (invalidOffsets is null) return offset + step; |
|---|
| 1797 | 1843 | int i = step > 0 ? 0 : invalidOffsets.length - 1; |
|---|
| 1798 | 1844 | do { |
|---|
| 1799 | | offset += step; |
|---|
| | 1845 | if( offset is 0 && step < 0 ){ |
|---|
| | 1846 | offset += step; |
|---|
| | 1847 | } |
|---|
| | 1848 | else{ |
|---|
| | 1849 | offset += cont.getRelativeCodePointOffset( offset, step ); |
|---|
| | 1850 | } |
|---|
| 1800 | 1851 | while (0 <= i && i < invalidOffsets.length) { |
|---|
| 1801 | 1852 | if (invalidOffsets[i] is offset) break; |
|---|