# HG changeset patch # User Frank Benoit # Date 1211229033 -7200 # Node ID b74b74ce5c7deaeafa4cf679fb03e9340c74da99 # Parent 53c57b061fd9ec59e2fda2f713e4e270c56e6178 reworked TextLayout diff -r 53c57b061fd9 -r b74b74ce5c7d dwt/graphics/TextLayout.d --- a/dwt/graphics/TextLayout.d Mon May 19 22:28:57 2008 +0200 +++ b/dwt/graphics/TextLayout.d Mon May 19 22:30:33 2008 +0200 @@ -36,6 +36,7 @@ import dwt.dwthelper.utils; import dwt.dwthelper.System; + /** * TextLayout is a graphic object that represents * styled text. @@ -52,8 +53,21 @@ * @since 3.0 */ public final class TextLayout : Resource { + alias Resource.init_ init_; +/++ + DWT doku + The styles has at minimum 2 member, each with a start. The last element is the end marker. +++/ + + invariant{ + assert( stylesCount >= 2 ); + assert( stylesCount <= styles.length ); + assert( styles[stylesCount-1] ); + assert( styles[stylesCount-1].start is text.length ); + } + Font font; String text, segmentsText; int lineSpacing; @@ -1383,11 +1397,11 @@ public Rectangle getBounds (int start, int end) { checkLayout(); computeRuns(null); - int length_ = text.length; - if (length_ is 0) return new Rectangle(0, 0, 0, 0); + int length = text.length; + if (length is 0) return new Rectangle(0, 0, 0, 0); if (start > end) return new Rectangle(0, 0, 0, 0); - start = Math.min(Math.max(0, start), length_ - 1); - end = Math.min(Math.max(0, end), length_ - 1); + start = Math.min(Math.max(0, start), length - 1); + end = Math.min(Math.max(0, end), length - 1); start = translateOffset(start); end = translateOffset(end); int left = 0x7fffffff, right = 0; @@ -1540,8 +1554,8 @@ public int getLevel (int offset) { checkLayout(); computeRuns(null); - int length_ = text.length; - if (!(0 <= offset && offset <= length_)) DWT.error(DWT.ERROR_INVALID_RANGE); + int length = text.length; + if (!(0 <= offset && offset <= length)) DWT.error(DWT.ERROR_INVALID_RANGE); offset = translateOffset(offset); for (int i=1; i offset) { @@ -1639,8 +1653,8 @@ public int getLineIndex (int offset) { checkLayout(); computeRuns(null); - int length_ = text.length; - if (!(0 <= offset && offset <= length_)) DWT.error(DWT.ERROR_INVALID_RANGE); + int length = text.length; + if (!(0 <= offset && offset <= length)) DWT.error(DWT.ERROR_INVALID_RANGE); offset = translateOffset(offset); for (int line=0; line offset) { @@ -1737,16 +1751,16 @@ public Point getLocation (int offset, bool trailing) { checkLayout(); computeRuns(null); - int length_ = text.length; - if (!(0 <= offset && offset <= length_)) DWT.error(DWT.ERROR_INVALID_RANGE); - length_ = segmentsText.length; + int length = text.length; + if (!(0 <= offset && offset <= length)) DWT.error(DWT.ERROR_INVALID_RANGE); + length = segmentsText.length; offset = translateOffset(offset); int line; for (line=0; line offset) break; } line = Math.min(line, runs.length - 1); - if (offset is length_) { + if (offset is length) { return new Point(getLineIndent(line) + lineWidth[line], lineY[line]); } int low = -1; @@ -1764,7 +1778,7 @@ GlyphMetrics metrics = run.style.metrics; width = metrics.width * (offset - run.start + (trailing ? 1 : 0)); } else if (run.tab) { - width = (trailing || (offset is length_)) ? run.width : 0; + width = (trailing || (offset is length)) ? run.width : 0; } else { int runOffset = offset - run.start; int cChars = run.length; @@ -1806,16 +1820,16 @@ int _getOffset(int offset, int movement, bool forward) { computeRuns(null); - int length_ = text.length; - if (!(0 <= offset && offset <= length_)) DWT.error(DWT.ERROR_INVALID_RANGE); - if (forward && offset is length_) return length_; + int length = text.length; + if (!(0 <= offset && offset <= length)) DWT.error(DWT.ERROR_INVALID_RANGE); + if (forward && offset is length) return length; if (!forward && offset is 0) return 0; int step = forward ? 1 : -1; if ((movement & DWT.MOVEMENT_CHAR) !is 0) return offset + step; - length_ = segmentsText.length; + length = segmentsText.length; offset = translateOffset(offset); - SCRIPT_LOGATTR* logAttr; - SCRIPT_PROPERTIES* properties; + SCRIPT_LOGATTR* logAttr = new SCRIPT_LOGATTR(); + SCRIPT_PROPERTIES* properties = new SCRIPT_PROPERTIES(); int i = forward ? 0 : allRuns.length - 1; offset = validadeOffset(offset, step); do { @@ -1823,12 +1837,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); - properties = device.scripts[run.analysis.eScript]; + OS.MoveMemory(properties, device.scripts[run.analysis.eScript], SCRIPT_PROPERTIES.sizeof); bool isComplex = properties.fNeedsCaretInfo || properties.fNeedsWordBreaking; if (isComplex) breakRun(run); while (run.start <= offset && offset < run.start + run.length) { if (isComplex) { - logAttr = run.psla + (offset - run.start); + OS.MoveMemory(logAttr, run.psla + (offset - run.start), SCRIPT_LOGATTR.sizeof); } switch (movement) { case DWT.MOVEMENT_CLUSTER: { @@ -1872,7 +1886,7 @@ } } i += step; - } while (0 <= i && i < allRuns.length - 1 && 0 <= offset && offset < length_); + } while (0 <= i && i < allRuns.length - 1 && 0 <= offset && offset < length); return forward ? text.length : 0; } @@ -2125,8 +2139,8 @@ */ public TextStyle getStyle (int offset) { checkLayout(); - int length_ = text.length; - if (!(0 <= offset && offset < length_)) DWT.error(DWT.ERROR_INVALID_RANGE); + int length = text.length; + if (!(0 <= offset && offset < length)) DWT.error(DWT.ERROR_INVALID_RANGE); for (int i=1; i offset) { return styles[i - 1].style; @@ -2228,10 +2242,10 @@ */ StyleItem[] itemize () { segmentsText = getSegmentsText(); - int length_ = segmentsText.length; + int length = segmentsText.length; SCRIPT_CONTROL scriptControl; SCRIPT_STATE scriptState; - final int MAX_ITEM = length_ + 1; + final int MAX_ITEM = length + 1; if ((orientation & DWT.RIGHT_TO_LEFT) !is 0) { scriptState.uBidiLevel = 1; @@ -2272,14 +2286,14 @@ item.start = start; item.style = styles[styleIndex].style; runs[count++] = item; - *scriptItem = items[itemIndex]; + OS.MoveMemory(scriptItem, (cast(void*)items) + itemIndex * SCRIPT_ITEM.sizeof, SCRIPT_ITEM.sizeof); item.analysis = scriptItem.a; if (linkBefore) { item.analysis.fLinkBefore = true; linkBefore = false; } //scriptItem.a = new SCRIPT_ANALYSIS(); - *scriptItem = items[ itemIndex + 1]; + OS.MoveMemory(scriptItem, (cast(void*)items) + (itemIndex + 1) * SCRIPT_ITEM.sizeof, SCRIPT_ITEM.sizeof); int itemLimit = scriptItem.iCharPos; int styleLimit = translateOffset(styles[styleIndex + 1].start); if (styleLimit <= itemLimit) { @@ -2302,7 +2316,7 @@ } StyleItem item = new StyleItem(); item.start = end; - *scriptItem = items[ itemCount ]; + OS.MoveMemory(scriptItem, (cast(void*)items) + itemCount * SCRIPT_ITEM.sizeof, SCRIPT_ITEM.sizeof); item.analysis = scriptItem.a; runs[count++] = item; if (runs.length !is count) { @@ -2588,11 +2602,11 @@ */ public void setStyle (TextStyle style, int start, int end) { checkLayout(); - int length_ = text.length; - if (length_ is 0) return; + int length = text.length; + if (length is 0) return; if (start > end) return; - start = Math.min(Math.max(0, start), length_ - 1); - end = Math.min(Math.max(0, end), length_ - 1); + start = Math.min(Math.max(0, start), length - 1); + end = Math.min(Math.max(0, end), length - 1); int low = -1; int high = stylesCount; while (high - low > 1) { @@ -2609,7 +2623,7 @@ if (style is null) { if (item.style is null) return; } else { - if (style ==/*eq*/ item.style) return; + if (style.opEquals(item.style)) return; } } } @@ -2709,7 +2723,7 @@ checkLayout(); //PORTING_CHANGE: allow null argument //if (text is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); - if (text==/*eq*/this.text) return; + if (text.equals(this.text)) return; freeRuns(); this.text = text; styles = new StyleItem[2]; @@ -3000,10 +3014,10 @@ if (segments is null) return offset; int nSegments = segments.length; if (nSegments <= 1) return offset; - int length_ = text.length; - if (length_ is 0) return offset; + int length = text.length; + if (length is 0) return offset; if (nSegments is 2) { - if (segments[0] is 0 && segments[1] is length_) return offset; + if (segments[0] is 0 && segments[1] is length) return offset; } for (int i = 0; i < nSegments && offset - i >= segments[i]; i++) { offset++; @@ -3015,10 +3029,10 @@ if (segments is null) return offset; int nSegments = segments.length; if (nSegments <= 1) return offset; - int length_ = text.length; - if (length_ is 0) return offset; + int length = text.length; + if (length is 0) return offset; if (nSegments is 2) { - if (segments[0] is 0 && segments[1] is length_) return offset; + if (segments[0] is 0 && segments[1] is length) return offset; } for (int i = 0; i < nSegments && offset > segments[i]; i++) { offset--;