qrcode-core-0.9.0: src/Codec/QRCode/Data/MQRImage.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE RecordWildCards #-}
module Codec.QRCode.Data.MQRImage
( MQRImage1(..)
, MQRImage2(..)
, MQRImage3(..)
, new
, unsafeConvert
, clone
, unsafeFreeze
) where
import Codec.QRCode.Base
import Control.Monad.Primitive (PrimMonad, PrimState)
import qualified Data.Vector.Unboxed as UV
import qualified Data.Vector.Unboxed.Mutable as MUV
import Codec.QRCode.Code.Data
import Codec.QRCode.Data.ErrorLevel
import Codec.QRCode.Data.QRImage
import Codec.QRCode.Data.Version
data MQRImage1 s
= MQRImage1
{ mqrImage1Size :: !Int
, mqrImage1Data :: !(MUV.MVector s Bool)
, mqrImage1Fixed :: !(MUV.MVector s Bool)
, mqrImage1Version :: !Version
, mqrImage1ErrorLevel :: !ErrorLevel
}
data MQRImage2 s
= MQRImage2
{ mqrImage2Size :: !Int
, mqrImage2Data :: !(MUV.MVector s Bool)
, mqrImage2Fixed :: !(UV.Vector Bool)
, mqrImage2Version :: !Version
, mqrImage2ErrorLevel :: !ErrorLevel
}
data MQRImage3 s
= MQRImage3
{ mqrImage3Size :: !Int
, mqrImage3Data :: !(MUV.MVector s Bool)
, mqrImage3Fixed :: !(UV.Vector Bool)
, mqrImage3Version :: !Version
, mqrImage3ErrorLevel :: !ErrorLevel
}
new :: PrimMonad m => Version -> ErrorLevel -> m (MQRImage1 (PrimState m))
new v e = do
let
size = qrSize v
img <- MUV.new (size * size)
MUV.set img False
fix <- MUV.new (size * size)
MUV.set fix False
return
MQRImage1
{ mqrImage1Size = size
, mqrImage1Data = img
, mqrImage1Fixed = fix
, mqrImage1Version = v
, mqrImage1ErrorLevel = e
}
unsafeConvert :: PrimMonad m => MQRImage1 (PrimState m) -> m (MQRImage2 (PrimState m))
unsafeConvert MQRImage1{..} = do
fix <- UV.unsafeFreeze mqrImage1Fixed
return
MQRImage2
{ mqrImage2Size = mqrImage1Size
, mqrImage2Data = mqrImage1Data
, mqrImage2Fixed = fix
, mqrImage2Version = mqrImage1Version
, mqrImage2ErrorLevel = mqrImage1ErrorLevel
}
clone :: PrimMonad m => MQRImage2 (PrimState m) -> m (MQRImage3 (PrimState m))
clone MQRImage2{..} = do
img <- MUV.clone mqrImage2Data
return
MQRImage3
{ mqrImage3Size = mqrImage2Size
, mqrImage3Data = img
, mqrImage3Fixed = mqrImage2Fixed
, mqrImage3Version = mqrImage2Version
, mqrImage3ErrorLevel = mqrImage2ErrorLevel
}
unsafeFreeze :: PrimMonad m => MQRImage3 (PrimState m) -> m QRImage
unsafeFreeze MQRImage3{..} = do
img <- UV.unsafeFreeze mqrImage3Data
return
QRImage
{ qrVersion = unVersion mqrImage3Version
, qrErrorLevel = mqrImage3ErrorLevel
, qrImageSize = mqrImage3Size
, qrImageData = img
}