          """
          height = self.dimensions[1]
          visible = (max(0, floor(height * self._canvas.yview()[0]) - self._face_size),
                     ceil(height * self._canvas.yview()[1]))
          logger.trace("visible: %s", visible)
          y_points = self._grid[3, :, 1]
          top = np.searchsorted(y_points, visible[0], side="left")
          bottom = np.searchsorted(y_points, visible[1], side="right")
          return top, bottom
  
 
</s> remove         if point_x > self._grid.dimensions[0]:
 </s> add         if not self._grid.is_valid or point_x > self._grid.dimensions[0]: </s> remove         logger.debug("existing rows: %s, required_rows: %s, base_coords: %s",
 </s> add         logger.trace("existing rows: %s, required_rows: %s, base_coords: %s", </s> remove         return np.array(self._canvas.coords(self._images[0][0]), dtype="int")
 </s> add         if self._images is None or not np.any(self._images):
            retval = [0, 0]
        else:
            retval = self._canvas.coords(self._images[0][0])
        return np.array(retval, dtype="int")
        logger.trace("height: %s, yview: %s, face_size: %s, visible: %s",
                     height, self._canvas.yview(), self._face_size, visible)
          """
          height = self.dimensions[1]
          visible = (max(0, floor(height * self._canvas.yview()[0]) - self._face_size),
                     ceil(height * self._canvas.yview()[1]))
        logger.trace("height: %s, yview: %s, face_size: %s, visible: %s",
                     height, self._canvas.yview(), self._face_size, visible)
          y_points = self._grid[3, :, 1]
          top = np.searchsorted(y_points, visible[0], side="left")
          bottom = np.searchsorted(y_points, visible[1], side="right")
          return top, bottom
  
keep keep keep keep replace keep keep keep keep keep
 Bugfix - Manual Tool
  - Fix non-appearing landmark annotations in face viewer 
tools/manual/faceviewer/frame.py