Для этой работы с поверхностями SDL и привязками Haskell используйте surfaceGetPixels
, он возвращает Pixels
, который является псевдонимом типа для Ptr PixelData
, а PixelData
- пустое объявление данных.Причина в том, что поверхностный пиксельный формат SDL и количество бит на пиксель могут быть практически любыми.Таким образом, в основном, если у вас есть формат 32bpp, вы должны привести указатель Ptr Word32
, используя castPtr
.
Вот пример получения / установки пикселя:
getPixel32 :: MonadIO m => Surface -> Int -> Int -> m Pixel
getPixel32 s x y = liftIO $ do
ps <- surfaceGetPixels s
assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
Pixel `liftM` peekElemOff (castPtr ps :: Ptr Word32) offset
where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x
setPixel32 :: MonadIO m => Surface -> Int -> Int -> Pixel -> m ()
setPixel32 s x y (Pixel pixel) = liftIO $ do
ps <- surfaceGetPixels s
assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
pokeElemOff (castPtr ps :: Ptr Word32) offset pixel
where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x
Таким же образом вы можете привести указатель к определенному типу указателя и передать его glTexImage2D для загрузки текстуры.