fix compact annotation array routine
[jalview.git] / src / jalview / datamodel / AlignmentAnnotation.java
index cc4308d..87c113f 100755 (executable)
@@ -357,12 +357,18 @@ Loading...
    */
   public void restrict(int startRes, int endRes)
   {
+    if (startRes<0)
+      startRes=0;
+    if (startRes>=annotations.length)
+      startRes = annotations.length-1;
+    if (endRes>=annotations.length)
+      endRes = annotations.length-1;
     if (annotations==null)
       return;
     Annotation[] temp = new Annotation[endRes-startRes+1];
     if (startRes<annotations.length)
     {
-      System.arraycopy(annotations, startRes, temp, 0, Math.min(endRes, annotations.length-1)-startRes+1);
+      System.arraycopy(annotations, startRes, temp, 0, endRes-startRes+1);
     }
     if (sequenceRef!=null) {
       // Clip the mapping, if it exists.
@@ -548,18 +554,23 @@ Loading...
    * number of non-null annotation elements.
    * @return
    */
-  private int compactAnnotationArray() {
-    int j=0;
-    for (int i=0;i<annotations.length; i++) {
-      if (annotations[i]!=null && j!=i) {
-        annotations[j++] = annotations[i];
+  public int compactAnnotationArray() {
+    int i=0,iSize=annotations.length;
+    while (i<iSize)
+    {
+      if (annotations[i]==null) {
+        if (i+1<iSize)
+          System.arraycopy(annotations, i+1, annotations, i, iSize-i-1);
+        iSize--;
+      } else {
+        i++;
       }
     }
     Annotation[] ann = annotations;
-    annotations = new Annotation[j];
-    System.arraycopy(ann, 0, annotations, 0, j);
+    annotations = new Annotation[i];
+    System.arraycopy(ann, 0, annotations, 0, i);
     ann = null;
-    return j;
+    return iSize;
   }
 
   /**