# HG changeset patch # User Frank Benoit # Date 1217891264 -7200 # Node ID 3f53ebb05b5ba8d6e2ee497287841217fc64c008 # Parent f18872e0f2322ff5d172cf7763db4bf9262631c5 Fix: make MARK copy work correctly mit multiple chars. Fix: getLocation, getOffset (codepoint vs. chars) Fix: itemize() translation of utf16 to utf8 indices diff -r f18872e0f232 -r 3f53ebb05b5b dwt/graphics/TextLayout.d --- a/dwt/graphics/TextLayout.d Tue Aug 05 00:54:11 2008 +0200 +++ b/dwt/graphics/TextLayout.d Tue Aug 05 01:07:44 2008 +0200 @@ -33,6 +33,7 @@ import dwt.graphics.TextStyle; import tango.text.convert.Format; +import Utf = tango.text.convert.Utf; import dwt.dwthelper.utils; import dwt.dwthelper.System; @@ -92,7 +93,9 @@ int[] lineOffset, lineY, lineWidth; void* mLangFontLink2; - static const wchar LTR_MARK = '\u200E', RTL_MARK = '\u200F'; + static const dchar LTR_MARK = '\u200E', RTL_MARK = '\u200F'; + static const String STR_LTR_MARK = "\u200E", STR_RTL_MARK = "\u200F"; + static const int MARK_SIZE = 3; static const int SCRIPT_VISATTR_SIZEOF = 2; static const int GOFFSET_SIZEOF = 8; private static byte[16] CLSID_CMultiLanguage; @@ -119,6 +122,7 @@ class StyleItem { TextStyle style; + // DWT: start, lenght relative to segmentsText int start, length; bool lineBreak, softBreak, tab; @@ -1791,7 +1795,8 @@ } else if (run.tab) { width = (trailing || (offset is length)) ? run.width : 0; } else { - int runOffset = offset - run.start; + // DWT: runOffset now in codepoints + int runOffset = segmentsText[ run.start .. $ ].indexToCodepointIndex( offset - run.start ); int cChars = run.length; int gGlyphs = run.glyphCount; int piX; @@ -1839,8 +1844,8 @@ if ((movement & DWT.MOVEMENT_CHAR) !is 0) return offset + step; length = segmentsText.length; offset = translateOffset(offset); - SCRIPT_LOGATTR* logAttr = new SCRIPT_LOGATTR(); - SCRIPT_PROPERTIES* properties = new SCRIPT_PROPERTIES(); + SCRIPT_LOGATTR* logAttr; + SCRIPT_PROPERTIES* properties; int i = forward ? 0 : allRuns.length - 1; offset = validadeOffset(offset, step); do { @@ -1848,12 +1853,12 @@ if (run.start <= offset && offset < run.start + run.length) { if (run.lineBreak && !run.softBreak) return untranslateOffset(run.start); if (run.tab) return untranslateOffset(run.start); - OS.MoveMemory(properties, device.scripts[run.analysis.eScript], SCRIPT_PROPERTIES.sizeof); + properties = device.scripts[run.analysis.eScript]; bool isComplex = properties.fNeedsCaretInfo || properties.fNeedsWordBreaking; if (isComplex) breakRun(run); while (run.start <= offset && offset < run.start + run.length) { if (isComplex) { - OS.MoveMemory(logAttr, run.psla + (offset - run.start), SCRIPT_LOGATTR.sizeof); + logAttr = run.psla + (offset - run.start); } switch (movement) { case DWT.MOVEMENT_CLUSTER: { @@ -1957,6 +1962,7 @@ checkLayout(); computeRuns(null); if (trailing !is null && trailing.length < 1) DWT.error(DWT.ERROR_INVALID_ARGUMENT); + int line; int lineCount = runs.length; for (line=0; line 2) { for (int i = 0; i < segments.length; i++) { if (translateOffset(segments[i]) - 1 is offset) { @@ -3026,7 +3061,7 @@ if (segments[0] is 0 && segments[1] is length) return offset; } for (int i = 0; i < nSegments && offset - i >= segments[i]; i++) { - offset++; + offset+=MARK_SIZE; } return offset; } @@ -3041,7 +3076,7 @@ if (segments[0] is 0 && segments[1] is length) return offset; } for (int i = 0; i < nSegments && offset > segments[i]; i++) { - offset--; + offset-=MARK_SIZE; } return offset; }