{-# LANGUAGE FlexibleInstances, OverlappingInstances, UndecidableInstances #-}

module Data.Bitmap.Croppable
    ( BitmapCroppable(..)
    ) where

import Data.Bitmap.Class
import Data.Bitmap.Types

-- | Class for bitmaps that can be rectangularly cropped into (possibly) smaller sizes
--
-- Using the functions of the 'Bitmap' class,
-- default functions are be defined for each of
-- these; of course, implementations are free
-- to write more efficient versions.
class (Bitmap bmp) => BitmapCroppable bmp where
    crop :: bmp -> Coordinates (BIndexType bmp) -> Dimensions (BIndexType bmp) -> bmp
        -- ^ Crop a bitmap with the given dimensions (third argument) from a position (second argument)
        --
        -- Implementations can but are not required to assume that the result will be a (not necessarily proper) subset of the super bitmap only.  Implementations should properly handle the case where the result is as large as the passed super bitmap.

    crop super (cropRow, cropColumn) = constructPixels (\(row, column) -> getPixel super (row + cropRow, column + cropColumn))

instance (Bitmap a) => BitmapCroppable a