소스 검색

applyMarkerAction take 2

dsehnal 3 년 전
부모
커밋
c64851492c
1개의 변경된 파일12개의 추가작업 그리고 9개의 파일을 삭제
  1. 12 9
      src/mol-util/marker-action.ts

+ 12 - 9
src/mol-util/marker-action.ts

@@ -68,11 +68,19 @@ export function applyMarkerAction(array: Uint8Array, set: OrderedSet, action: Ma
     if (Interval.is(set)) {
         const start = Interval.start(set);
         const end = Interval.end(set);
-        const view = new Uint32Array(array.buffer, 0, array.buffer.byteLength >> 2);
-
         const viewStart = (start + 3) >> 2;
         const viewEnd = viewStart + ((end - 4 * viewStart) >> 2);
 
+        if (viewEnd <= viewStart) {
+            // avoid edge cases with overlapping front/end intervals
+            for (let i = start; i < end; ++i) {
+                applyMarkerActionAtPosition(array, i, action);
+            }
+            return true;
+        }
+
+        const view = new Uint32Array(array.buffer, 0, array.buffer.byteLength >> 2);
+
         const frontStart = start;
         const frontEnd = Math.min(4 * viewStart, end);
         const backStart = Math.max(start, 4 * viewEnd);
@@ -105,13 +113,8 @@ export function applyMarkerAction(array: Uint8Array, set: OrderedSet, action: Ma
             applyMarkerActionAtPosition(array, i, action);
         }
 
-        // to prevent applying "toggle" twice check for edge case where
-        // viewEnd <= viewStart, which resolves to the "front" and "back"
-        // intervals being the same range
-        if (frontStart !== backStart) {
-            for (let i = backStart; i < backEnd; ++i) {
-                applyMarkerActionAtPosition(array, i, action);
-            }
+        for (let i = backStart; i < backEnd; ++i) {
+            applyMarkerActionAtPosition(array, i, action);
         }
     } else {
         switch (action) {