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.

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)