bool ClipLine()

in simulation/src/visualizer/model/pyviz.cc [1071:1470]


  bool ClipLine (Line &line)
  {
    uint8_t lineCode = 0;
 
    if (line.end.y < m_clipMin.y)
      lineCode |= 8;
    else if (line.end.y > m_clipMax.y)
      lineCode |= 4;
 
    if (line.end.x > m_clipMax.x)
      lineCode |= 2;
    else if (line.end.x < m_clipMin.x)
      lineCode |= 1;
 
    if (line.start.y < m_clipMin.y)
      lineCode |= 128;
    else if (line.start.y > m_clipMax.y)
      lineCode |= 64;
 
    if (line.start.x > m_clipMax.x)
      lineCode |= 32;
    else if (line.start.x < m_clipMin.x)
      lineCode |= 16;
 
    // 9 - 8 - A
    // |   |   |
    // 1 - 0 - 2
    // |   |   |
    // 5 - 4 - 6
    switch (lineCode)
      {
      // center
      case 0x00:
        return true;
 
      case 0x01:
        ClipEndLeft (line);
        return true;
 
      case 0x02:
        ClipEndRight (line);
        return true;
 
      case 0x04:
        ClipEndBottom (line);
        return true;
 
      case 0x05:
        ClipEndLeft (line);
        if (line.end.y > m_clipMax.y)
          ClipEndBottom (line);
        return true;
 
      case 0x06:
        ClipEndRight (line);
        if (line.end.y > m_clipMax.y)
          ClipEndBottom (line);
        return true;
 
      case 0x08:
        ClipEndTop (line);
        return true;
 
      case 0x09:
        ClipEndLeft (line);
        if (line.end.y < m_clipMin.y)
          ClipEndTop (line);
        return true;
 
      case 0x0A:
        ClipEndRight (line);
        if (line.end.y < m_clipMin.y)
          ClipEndTop (line);
        return true;
 
      // left
      case 0x10:
        ClipStartLeft (line);
        return true;
 
      case 0x12:
        ClipStartLeft (line);
        ClipEndRight (line);
        return true;
 
      case 0x14:
        ClipStartLeft (line);
        if (line.start.y > m_clipMax.y)
          return false;
        ClipEndBottom (line);
        return true;
 
      case 0x16:
        ClipStartLeft (line);
        if (line.start.y > m_clipMax.y)
          return false;
        ClipEndBottom (line);
        if (line.end.x > m_clipMax.x)
          ClipEndRight (line);
        return true;
 
      case 0x18:
        ClipStartLeft (line);
        if (line.start.y < m_clipMin.y)
          return false;
        ClipEndTop (line);
        return true;
 
      case 0x1A:
        ClipStartLeft (line);
        if (line.start.y < m_clipMin.y)
          return false;
        ClipEndTop (line);
        if (line.end.x > m_clipMax.x)
          ClipEndRight (line);
        return true;
 
      // right
      case 0x20:
        ClipStartRight (line);
        return true;
 
      case 0x21:
        ClipStartRight (line);
        ClipEndLeft (line);
        return true;
 
      case 0x24:
        ClipStartRight (line);
        if (line.start.y > m_clipMax.y)
          return false;
        ClipEndBottom (line);
        return true;
 
      case 0x25:
        ClipStartRight (line);
        if (line.start.y > m_clipMax.y)
          return false;
        ClipEndBottom (line);
        if (line.end.x < m_clipMin.x)
          ClipEndLeft (line);
        return true;
 
      case 0x28:
        ClipStartRight (line);
        if (line.start.y < m_clipMin.y)
          return false;
        ClipEndTop (line);
        return true;
 
      case 0x29:
        ClipStartRight (line);
        if (line.start.y < m_clipMin.y)
          return false;
        ClipEndTop (line);
        if (line.end.x < m_clipMin.x)
          ClipEndLeft (line);
        return true;
 
      // bottom
      case 0x40:
        ClipStartBottom (line);
        return true;
 
      case 0x41:
        ClipStartBottom (line);
        if (line.start.x < m_clipMin.x)
          return false;
        ClipEndLeft (line);
        if (line.end.y > m_clipMax.y)
          ClipEndBottom (line);
        return true;
 
      case 0x42:
        ClipStartBottom (line);
        if (line.start.x > m_clipMax.x)
          return false;
        ClipEndRight (line);
        return true;
 
      case 0x48:
        ClipStartBottom (line);
        ClipEndTop (line);
        return true;
 
      case 0x49:
        ClipStartBottom (line);
        if (line.start.x < m_clipMin.x)
          return false;
        ClipEndLeft (line);
        if (line.end.y < m_clipMin.y)
          ClipEndTop (line);
        return true;
 
      case 0x4A:
        ClipStartBottom (line);
        if (line.start.x > m_clipMax.x)
          return false;
        ClipEndRight (line);
        if (line.end.y < m_clipMin.y)
          ClipEndTop (line);
        return true;
 
      // bottom-left
      case 0x50:
        ClipStartLeft (line);
        if (line.start.y > m_clipMax.y)
          ClipStartBottom (line);
        return true;
 
      case 0x52:
        ClipEndRight (line);
        if (line.end.y > m_clipMax.y)
          return false;
        ClipStartBottom (line);
        if (line.start.x < m_clipMin.x)
          ClipStartLeft (line);
        return true;
 
      case 0x58:
        ClipEndTop (line);
        if (line.end.x < m_clipMin.x)
          return false;
        ClipStartBottom (line);
        if (line.start.x < m_clipMin.x)
          ClipStartLeft (line);
        return true;
 
      case 0x5A:
        ClipStartLeft (line);
        if (line.start.y < m_clipMin.y)
          return false;
        ClipEndRight (line);
        if (line.end.y > m_clipMax.y)
          return false;
        if (line.start.y > m_clipMax.y)
          ClipStartBottom (line);
        if (line.end.y < m_clipMin.y)
          ClipEndTop (line);
        return true;
 
      // bottom-right
      case 0x60:
        ClipStartRight (line);
        if (line.start.y > m_clipMax.y)
          ClipStartBottom (line);
        return true;
 
      case 0x61:
        ClipEndLeft (line);
        if (line.end.y > m_clipMax.y)
          return false;
        ClipStartBottom (line);
        if (line.start.x > m_clipMax.x)
          ClipStartRight (line);
        return true;
 
      case 0x68:
        ClipEndTop (line);
        if (line.end.x > m_clipMax.x)
          return false;
        ClipStartRight (line);
        if (line.start.y > m_clipMax.y)
          ClipStartBottom (line);
        return true;
 
      case 0x69:
        ClipEndLeft (line);
        if (line.end.y > m_clipMax.y)
          return false;
        ClipStartRight (line);
        if (line.start.y < m_clipMin.y)
          return false;
        if (line.end.y < m_clipMin.y)
          ClipEndTop (line);
        if (line.start.y > m_clipMax.y)
          ClipStartBottom (line);
        return true;
 
      // top
      case 0x80:
        ClipStartTop (line);
        return true;
 
      case 0x81:
        ClipStartTop (line);
        if (line.start.x < m_clipMin.x)
          return false;
        ClipEndLeft (line);
        return true;
 
      case 0x82:
        ClipStartTop (line);
        if (line.start.x > m_clipMax.x)
          return false;
        ClipEndRight (line);
        return true;
 
      case 0x84:
        ClipStartTop (line);
        ClipEndBottom (line);
        return true;
 
      case 0x85:
        ClipStartTop (line);
        if (line.start.x < m_clipMin.x)
          return false;
        ClipEndLeft (line);
        if (line.end.y > m_clipMax.y)
          ClipEndBottom (line);
        return true;
 
      case 0x86:
        ClipStartTop (line);
        if (line.start.x > m_clipMax.x)
          return false;
        ClipEndRight (line);
        if (line.end.y > m_clipMax.y)
          ClipEndBottom (line);
        return true;
 
      // top-left
      case 0x90:
        ClipStartLeft (line);
        if (line.start.y < m_clipMin.y)
          ClipStartTop (line);
        return true;
 
      case 0x92:
        ClipEndRight (line);
        if (line.end.y < m_clipMin.y)
          return false;
        ClipStartTop (line);
        if (line.start.x < m_clipMin.x)
          ClipStartLeft (line);
        return true;
 
      case 0x94:
        ClipEndBottom (line);
        if (line.end.x < m_clipMin.x)
          return false;
        ClipStartLeft (line);
        if (line.start.y < m_clipMin.y)
          ClipStartTop (line);
        return true;
 
      case 0x96:
        ClipStartLeft (line);
        if (line.start.y > m_clipMax.y)
          return false;
        ClipEndRight (line);
        if (line.end.y < m_clipMin.y)
          return false;
        if (line.start.y < m_clipMin.y)
          ClipStartTop (line);
        if (line.end.y > m_clipMax.y)
          ClipEndBottom (line);
        return true;
 
      // top-right
      case 0xA0:
        ClipStartRight (line);
        if (line.start.y < m_clipMin.y)
          ClipStartTop (line);
        return true;
 
      case 0xA1:
        ClipEndLeft (line);
        if (line.end.y < m_clipMin.y)
          return false;
        ClipStartTop (line);
        if (line.start.x > m_clipMax.x)
          ClipStartRight (line);
        return true;
 
      case 0xA4:
        ClipEndBottom (line);
        if (line.end.x > m_clipMax.x)
          return false;
        ClipStartRight (line);
        if (line.start.y < m_clipMin.y)
          ClipStartTop (line);
        return true;
 
      case 0xA5:
        ClipEndLeft (line);
        if (line.end.y < m_clipMin.y)
          return false;
        ClipStartRight (line);
        if (line.start.y > m_clipMax.y)
          return false;
        if (line.end.y > m_clipMax.y)
          ClipEndBottom (line);
        if (line.start.y < m_clipMin.y)
          ClipStartTop (line);
        return true;
      }
 
    return false;
  }