private FloatList logicalRangeToVisualRanges(int startOffset, int endOffset) {
      assert startOffset <= endOffset;
      FloatList result = new FloatArrayList();
      if (myDocument.getTextLength() == 0) {
        int minX = myCorrector.emptyTextX();
        result.add(minX);
        result.add(minX);
      }
      else {
        float lastX = -1;
        for (VisualLineFragmentsIterator.Fragment fragment : VisualLineFragmentsIterator.create(myView, startOffset, false, true)) {
          int minOffset = fragment.getMinOffset();
          int maxOffset = fragment.getMaxOffset();
          if (startOffset == endOffset) {
            lastX = fragment.getEndX();
            Inlay inlay = fragment.getCurrentInlay();
            if (inlay != null) {
              if (startOffset == minOffset && inlay.isRelatedToPrecedingText()) {
                float x = fragment.getStartX();
                result.add(x);
                result.add(x);
                break;
              }
              else {
                continue;
              }
            }
            if (startOffset >= minOffset && startOffset < maxOffset) {
              float x = fragment.offsetToX(startOffset);
              result.add(x);
              result.add(x);
              break;
            }
          }
          else if (startOffset < maxOffset && endOffset > minOffset) {
            float x1 = minOffset == maxOffset ? fragment.getStartX() : fragment.offsetToX(Math.max(minOffset, startOffset));
            float x2 = minOffset == maxOffset ? fragment.getEndX() : fragment.offsetToX(Math.min(maxOffset, endOffset));
            if (x1 > x2) {
              float tmp = x1;
              x1 = x2;
              x2 = tmp;
            }
            if (result.isEmpty() || x1 > result.getFloat(result.size() - 1)) {
              result.add(x1);
              result.add(x2);
            }
            else {
              result.set(result.size() - 1, x2);
            }
          }
        }
        if (startOffset == endOffset && result.isEmpty() && lastX >= 0) {
          result.add(lastX);
          result.add(lastX);
        }
      }
      return result;
    }
private FloatList logicalRangeToVisualRanges(int startOffset, int endOffset)