changeset 227:b74b74ce5c7d

reworked TextLayout
author Frank Benoit <benoit@tionex.de>
date Mon, 19 May 2008 22:30:33 +0200
parents 53c57b061fd9
children 628e9518870e
files dwt/graphics/TextLayout.d
diffstat 1 files changed, 55 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- 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;
 
+
 /**
  * <code>TextLayout</code> 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<allRuns.length; i++) {
         if (allRuns[i].start > 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<runs.length; line++) {
         if (lineOffset[line + 1] > 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<runs.length; line++) {
         if (lineOffset[line + 1] > 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<stylesCount; i++) {
         if (styles[i].start > 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--;