docs: def crop(self, image, geometry, crop):
          """
          Crops the given ``image``, with dimensions specified in ``geometry``,
          according to the value(s) in ``crop``. Returns the cropped image.
  
          :param Image image: This is your engine's ``Image`` object. For
              PIL it's PIL.Image.
          :param tuple geometry: Geometry of the image in the format of (x,y).
          :param str crop: A cropping offset string. This is either one or two
              space-separated values. If only one value is specified, the cropping
              amount (pixels or percentage) for both X and Y dimensions is the
              amount given. If two values are specified, X and Y dimension cropping
              may be set independently. Some examples: '50% 50%', '50px 20px',
              '50%', '50px'.
          :returns: The cropped image. The returned type depends on your
              choice of Engine.
          """
          if not crop:
              return image
  
          x_image, y_image = self.get_image_size(image)
          x_offset, y_offset = parse_crop(crop, (x_image, y_image), geometry)
  
          return self._crop(image, geometry[0], geometry[1], x_offset, y_offset)