Skip to content

Commit 321da3d

Browse files
jjgriegodpwiz
authored andcommitted
expose SDL_{Get,Set}TextureScaleMode in recent-ish builds
1 parent cde36f4 commit 321da3d

File tree

4 files changed

+81
-1
lines changed

4 files changed

+81
-1
lines changed

sdl2.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ library
137137
-DRECENT_ISH
138138
if flag(pkgconfig)
139139
pkgconfig-depends:
140-
sdl2 >= 2.0.10
140+
sdl2 >= 2.0.14
141141
else
142142
if flag(pkgconfig)
143143
pkgconfig-depends:

src/SDL/Raw/Enum.hsc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,15 @@ module SDL.Raw.Enum (
691691
pattern SDL_SYSTEM_CURSOR_IBEAM,
692692
pattern SDL_SYSTEM_CURSOR_WAIT,
693693

694+
#ifdef RECENT_ISH
695+
-- ** Scale mode
696+
ScaleMode,
697+
-- NB. no idea why this enum uses camel case instead of scream case
698+
pattern SDL_ScaleModeNearest,
699+
pattern SDL_ScaleModeLinear,
700+
pattern SDL_ScaleModeBest,
701+
#endif
702+
694703
-- ** System Cursor
695704
SystemCursor,
696705
pattern SDL_SYSTEM_CURSOR_CROSSHAIR,
@@ -978,6 +987,9 @@ type LogPriority = (#type SDL_LogPriority)
978987
type PowerState = (#type SDL_PowerState)
979988
type RendererFlip = (#type SDL_RendererFlip)
980989
type Scancode = (#type SDL_Scancode)
990+
#ifdef RECENT_ISH
991+
type ScaleMode = (#type SDL_ScaleMode)
992+
#endif
981993
type SystemCursor = (#type SDL_SystemCursor)
982994
type ThreadPriority = (#type SDL_ThreadPriority)
983995

@@ -1621,6 +1633,12 @@ pattern SDL_SCANCODE_APP1 = (#const SDL_SCANCODE_APP1) :: Scancode
16211633
pattern SDL_SCANCODE_APP2 = (#const SDL_SCANCODE_APP2) :: Scancode
16221634
pattern SDL_NUM_SCANCODES = (#const SDL_NUM_SCANCODES) :: Scancode
16231635

1636+
#ifdef RECENT_ISH
1637+
pattern SDL_ScaleModeNearest = (#const SDL_ScaleModeNearest) :: ScaleMode
1638+
pattern SDL_ScaleModeLinear = (#const SDL_ScaleModeLinear) :: ScaleMode
1639+
pattern SDL_ScaleModeBest = (#const SDL_ScaleModeBest) :: ScaleMode
1640+
#endif
1641+
16241642
pattern SDL_SYSTEM_CURSOR_ARROW = (#const SDL_SYSTEM_CURSOR_ARROW) :: SystemCursor
16251643
pattern SDL_SYSTEM_CURSOR_IBEAM = (#const SDL_SYSTEM_CURSOR_IBEAM) :: SystemCursor
16261644
pattern SDL_SYSTEM_CURSOR_WAIT = (#const SDL_SYSTEM_CURSOR_WAIT) :: SystemCursor

src/SDL/Raw/Video.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ module SDL.Raw.Video (
132132
renderFillRectsF,
133133
renderGeometry,
134134
renderGeometryRaw,
135+
getTextureScaleMode,
136+
setTextureScaleMode,
135137
#endif
136138
renderGetClipRect,
137139
renderGetIntegerScale,
@@ -365,6 +367,8 @@ foreign import ccall "SDL.h SDL_RenderFillRectF" renderFillRectFFFI :: Renderer
365367
foreign import ccall "SDL.h SDL_RenderFillRectsF" renderFillRectsFFFI :: Renderer -> Ptr FRect -> CInt -> IO CInt
366368
foreign import ccall "SDL.h SDL_RenderGeometry" renderGeometryFFI :: Renderer -> Texture -> Ptr Vertex -> CInt -> Ptr CInt -> CInt -> IO CInt
367369
foreign import ccall "SDL.h SDL_RenderGeometryRaw" renderGeometryRawFFI :: Renderer -> Texture -> Ptr FPoint -> CInt -> Ptr Color -> CInt -> Ptr FPoint -> CInt -> CInt -> Ptr () -> CInt -> CInt -> IO CInt
370+
foreign import ccall "SDL.h SDL_GetTextureScaleMode" getTextureScaleModeFFI :: Texture -> Ptr ScaleMode -> IO CInt
371+
foreign import ccall "SDL.h SDL_SetTextureScaleMode" setTextureScaleModeFFI :: Texture -> ScaleMode -> IO CInt
368372
#endif
369373
foreign import ccall "sqlhelper.c SDLHelper_RenderFillRectEx" renderFillRectExFFI :: Renderer -> CInt -> CInt -> CInt -> CInt -> IO CInt
370374
foreign import ccall "SDL.h SDL_RenderFillRects" renderFillRectsFFI :: Renderer -> Ptr Rect -> CInt -> IO CInt
@@ -964,6 +968,15 @@ renderGeometry v1 v2 v3 v4 v5 v6 = liftIO $ renderGeometryFFI v1 v2 v3 v4 v5 v6
964968
renderGeometryRaw :: MonadIO m => Renderer -> Texture -> Ptr FPoint -> CInt -> Ptr Color -> CInt -> Ptr FPoint -> CInt -> CInt -> Ptr () -> CInt -> CInt -> m CInt
965969
renderGeometryRaw v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 = liftIO $ renderGeometryRawFFI v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12
966970
{-# INLINE renderGeometryRaw #-}
971+
972+
getTextureScaleMode :: MonadIO m => Texture -> Ptr ScaleMode -> m CInt
973+
getTextureScaleMode t ps = liftIO $ getTextureScaleModeFFI t ps
974+
{-# INLINE getTextureScaleMode #-}
975+
976+
setTextureScaleMode :: MonadIO m => Texture -> ScaleMode -> m CInt
977+
setTextureScaleMode t s = liftIO $ setTextureScaleModeFFI t s
978+
{-# INLINE setTextureScaleMode #-}
979+
967980
#endif
968981

969982

src/SDL/Video/Renderer.hs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ module SDL.Video.Renderer
118118
, textureBlendMode
119119
, BlendMode(..)
120120
, textureColorMod
121+
#ifdef RECENT_ISH
122+
, textureScaleMode
123+
, ScaleMode(..)
124+
#endif
121125

122126
-- ** Accessing 'Texture' Data
123127
, lockTexture
@@ -1335,6 +1339,51 @@ textureBlendMode (Texture t) = makeStateVar getTextureBlendMode setTextureBlendM
13351339
throwIfNeg_ "SDL.Video.Renderer.setTextureBlendMode" "SDL_SetTextureBlendMode" $
13361340
Raw.setTextureBlendMode t (toNumber bm)
13371341

1342+
#ifdef RECENT_ISH
1343+
1344+
-- | Scale modes used in copy operations
1345+
data ScaleMode
1346+
= ScaleModeNearest
1347+
-- ^ Nearest-neighbor scaling
1348+
| ScaleModeLinear
1349+
-- ^ Linear scaling
1350+
| ScaleModeBest
1351+
-- ^ anisotropic filtering
1352+
deriving (Bounded, Data, Enum, Eq, Generic, Ord, Read, Show, Typeable)
1353+
1354+
instance FromNumber ScaleMode Word32 where
1355+
fromNumber n = case n of
1356+
Raw.SDL_ScaleModeNearest -> ScaleModeNearest
1357+
Raw.SDL_ScaleModeLinear -> ScaleModeLinear
1358+
Raw.SDL_ScaleModeBest -> ScaleModeBest
1359+
_ -> error $ "fromNumber <ScaleMode>: unkonwn scale mode: " ++ (show n)
1360+
1361+
instance ToNumber ScaleMode Word32 where
1362+
toNumber ScaleModeNearest = Raw.SDL_ScaleModeNearest
1363+
toNumber ScaleModeLinear = Raw.SDL_ScaleModeLinear
1364+
toNumber ScaleModeBest = Raw.SDL_ScaleModeBest
1365+
1366+
-- | Get or set the scale mode use for texture scale operations.
1367+
--
1368+
-- This 'StateVar' can be modified using '$=' and the current value retrieved with 'get'.
1369+
--
1370+
-- See @<https://wiki.libsdl.org/SDL2/SDL_GetTextureScaleMode SDL_GetTextureScaleMode>@ and @<https://wiki.libsdl.org/SDL2/SDL_SetTextureScaleMode SDL_SetTextureScaleMode>@
1371+
textureScaleMode :: Texture -> StateVar ScaleMode
1372+
textureScaleMode (Texture t) = makeStateVar getTextureScaleMode setTextureScaleMode
1373+
where
1374+
getTextureScaleMode =
1375+
alloca $ \x -> do
1376+
throwIfNeg_ "SDL.Video.Renderer.getTextureScaleMode" "SDL_GetTextureScaleMode" $
1377+
Raw.getTextureScaleMode t x
1378+
fromNumber <$> peek x
1379+
1380+
setTextureScaleMode sm =
1381+
throwIfNeg_ "SDL.Video.Renderer.setTextureScaleMode" "SDL_SetTextureScaleMode" $
1382+
Raw.setTextureScaleMode t (toNumber sm)
1383+
1384+
#endif
1385+
1386+
13381387
-- | Get or set the blend mode used for blit operations.
13391388
--
13401389
-- This 'StateVar' can be modified using '$=' and the current value retrieved with 'get'.

0 commit comments

Comments
 (0)