{-# LANGUAGE NoImplicitPrelude #-}
module Codec.QRCode.Code.Intermediate
( toIntermediate
, fromIntermediate
) where
import Codec.QRCode.Base
import Codec.QRCode.Code.Data
import Codec.QRCode.Code.Image
import Codec.QRCode.Code.Mask
import qualified Codec.QRCode.Data.ByteStreamBuilder as BSB
import Codec.QRCode.Data.Mask
import qualified Codec.QRCode.Data.MQRImage as MI
import Codec.QRCode.Data.QRCodeOptions
import Codec.QRCode.Data.QRImage
import Codec.QRCode.Data.QRIntermediate.Internal
import Codec.QRCode.Data.QRSegment.Internal
import Codec.QRCode.Data.Result
toIntermediate :: QRCodeOptions -> QRSegment -> Result QRIntermediate
{-# INLINE toIntermediate #-}
toIntermediate :: QRCodeOptions -> QRSegment -> Result QRIntermediate
toIntermediate = QRCodeOptions -> QRSegment -> Result QRIntermediate
calcVersionAndErrorLevel
fromIntermediate :: QRIntermediate -> QRImage
{-# INLINE fromIntermediate #-}
fromIntermediate :: QRIntermediate -> QRImage
fromIntermediate = QRInternal [Word8] -> QRImage
generateQRImage forall b c a. (b -> c) -> (a -> b) -> a -> c
. QRInternal ByteStreamBuilder -> QRInternal [Word8]
appendErrorCorrection forall b c a. (b -> c) -> (a -> b) -> a -> c
. QRIntermediate -> QRInternal ByteStreamBuilder
appendEndAndPadding
generateQRImage :: QRInternal [Word8] -> QRImage
generateQRImage :: QRInternal [Word8] -> QRImage
generateQRImage (Version
v, ErrorLevel
e, [Word8]
bs, Maybe Mask
mmask) = forall a. (forall s. ST s a) -> a
runST forall a b. (a -> b) -> a -> b
$ do
MQRImage1 s
img1 <- forall (m :: * -> *).
PrimMonad m =>
Version -> ErrorLevel -> m (MQRImage1 (PrimState m))
MI.new Version
v ErrorLevel
e
forall (m :: * -> *).
PrimMonad m =>
MQRImage1 (PrimState m) -> m ()
drawFunctionPatterns MQRImage1 s
img1
MQRImage2 s
img2 <- forall (m :: * -> *).
PrimMonad m =>
MQRImage1 (PrimState m) -> m (MQRImage2 (PrimState m))
MI.unsafeConvert MQRImage1 s
img1
forall (m :: * -> *).
PrimMonad m =>
MQRImage2 (PrimState m) -> [Bool] -> m ()
drawCodeWords MQRImage2 s
img2 ([Word8] -> [Bool]
BSB.toBitStream [Word8]
bs)
case Maybe Mask
mmask of
Just Mask
m -> do
MQRImage3 s
img3 <- forall (m :: * -> *).
PrimMonad m =>
MQRImage2 (PrimState m) -> m (MQRImage3 (PrimState m))
MI.clone MQRImage2 s
img2
forall (m :: * -> *).
PrimMonad m =>
MQRImage3 (PrimState m) -> Mask -> m ()
applyMask MQRImage3 s
img3 Mask
m
forall (m :: * -> *).
PrimMonad m =>
MQRImage3 (PrimState m) -> m QRImage
MI.unsafeFreeze MQRImage3 s
img3
Maybe Mask
Nothing -> do
[(Int, QRImage)]
rs <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [Mask
Mask0 .. Mask
Mask7] forall a b. (a -> b) -> a -> b
$ \Mask
m -> do
MQRImage3 s
img3 <- forall (m :: * -> *).
PrimMonad m =>
MQRImage2 (PrimState m) -> m (MQRImage3 (PrimState m))
MI.clone MQRImage2 s
img2
forall (m :: * -> *).
PrimMonad m =>
MQRImage3 (PrimState m) -> Mask -> m ()
applyMask MQRImage3 s
img3 Mask
m
QRImage
qrimg <- forall (m :: * -> *).
PrimMonad m =>
MQRImage3 (PrimState m) -> m QRImage
MI.unsafeFreeze MQRImage3 s
img3
forall (m :: * -> *) a. Monad m => a -> m a
return (QRImage -> Int
getPenaltyScore QRImage
qrimg, QRImage
qrimg)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn forall a b. (a, b) -> a
fst [(Int, QRImage)]
rs