packages feed

halide-haskell-0.0.2.0: src/Language/Halide/BoundaryConditions.hs

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}

-- |
-- Module      : Language.Halide.BoundaryConditions
-- Copyright   : (c) Tom Westerhout, 2023
module Language.Halide.BoundaryConditions
  ( repeatEdge
  , constantExterior
  )
where

import GHC.TypeLits
import Language.C.Inline.Unsafe qualified as CU
import Language.Halide.Buffer
import Language.Halide.Context
import Language.Halide.Expr
import Language.Halide.Func
import Language.Halide.Type
import Prelude hiding (min, tail)

importHalide

-- | Impose a boundary condition such that the nearest edge sample is returned everywhere outside the given region.
--
-- For more information, see [@Halide::repeat_edge@](https://halide-lang.org/docs/namespace_halide_1_1_boundary_conditions.html#a0548f23db36e4a8a03690bc8bee1e850).
repeatEdge :: (KnownNat n, IsHalideType a) => Func 'ParamTy n (Expr a) -> IO (Func 'FuncTy n (Expr a))
repeatEdge source =
  withBufferParam source $ \source' ->
    wrapCxxFunc
      =<< [CU.exp| Halide::Func* { new Halide::Func{
            Halide::BoundaryConditions::repeat_edge(*$(const Halide::ImageParam* source'))} } |]

-- | Impose a boundary condition such that a given expression is returned everywhere outside the boundary.
--
-- For more information, see [@Halide::constant_exterior@](https://halide-lang.org/docs/namespace_halide_1_1_boundary_conditions.html#aa4ed713b5f9a6f13e6323f2a21d41d5e).
constantExterior :: (KnownNat n, IsHalideType a) => Expr a -> Func 'ParamTy n (Expr a) -> IO (Func 'FuncTy n (Expr a))
constantExterior value source =
  withBufferParam source $ \source' ->
    asExpr value $ \value' ->
      wrapCxxFunc
        =<< [CU.exp| Halide::Func* { new Halide::Func{
              Halide::BoundaryConditions::constant_exterior(
                *$(const Halide::ImageParam* source'), *$(const Halide::Expr* value'))} } |]