为什么这条Haskell SDL线是青色的,而它应该是白色的?

为什么这条Haskell SDL线是青色的,而它应该是白色的?,haskell,sdl,Haskell,Sdl,下面是一些使用SDL和Haskell绘制对角线的代码。我得到一个青色线时,RGB显然应该是白色的。这是在Ubuntu上。我做错什么了吗 import qualified Graphics.UI.SDL as SDL import qualified Graphics.UI.SDL.Primitives as SDLP main = do SDL.init [SDL.InitEverything] SDL.setVideoMode 640 480 32 [] SDL.se

下面是一些使用SDL和Haskell绘制对角线的代码。我得到一个青色线时,RGB显然应该是白色的。这是在Ubuntu上。我做错什么了吗

import qualified Graphics.UI.SDL as SDL
import qualified Graphics.UI.SDL.Primitives as SDLP

main = do
    SDL.init [SDL.InitEverything]
    SDL.setVideoMode 640 480 32 []
    SDL.setCaption "My Window" "My Test"
    surf0 <- SDL.getVideoSurface
    white <- SDL.mapRGB (SDL.surfaceGetPixelFormat surf0) 255 255 255
    SDLP.line surf0 0 0 640 480 white 
    SDL.flip surf0
    eventLoop
    SDL.quit
    print "done"
    where
    eventLoop = SDL.waitEventBlocking >>= checkEvent
    checkEvent (SDL.KeyUp _) = return ()
    checkEvent _ = eventLoop
将合格的Graphics.UI.SDL导入为SDL
将合格的Graphics.UI.SDL.Primitives作为SDLP导入
main=do
SDL.init[SDL.InitEverything]
SDL.setVideoMode 640 480 32[]
SDL.setCaption“我的窗口”“我的测试”
surf0=检查事件
checkEvent(SDL.KeyUp)=返回()
checkEvent u=事件循环

我在我的系统上遇到了同样的问题(对于行和其他原语),直接使用
像素
构造函数而不是
mapRGB
似乎给出了正确的颜色

例如,如果我将
Graphics.UI.SDL.Color
作为
SDLC
导入,然后
let white'=SDLC.Pixel maxBound
,我会得到一条白线,正如预期的那样。使用
SDLC.Pixel 4278190335
(或
255*2^24+255
,红色的合理值),我得到一条红线

这显然不是一个真正的解决方案或答案,但它可能会提出一些起点

还有一件奇怪的事:如果我像这样打印你的和我的:

print =<< SDL.getRGBA white (SDL.surfaceGetPixelFormat surf0)
print =<< SDL.getRGBA white' (SDL.surfaceGetPixelFormat surf0)
print white
print white'

因此,通过
getRGBA
,它们看起来是一样的,但实际的
像素值却不同。

我观察到ATI HD2400和radeon驱动程序对Lucid的效果是一样的(如果这很重要的话)。但有一个解决办法

此示例绘制了一条白线:

import qualified Graphics.UI.SDL as SDL
import qualified Graphics.UI.SDL.Primitives as SDLP

import Control.Applicative ((<$>))

main = do
    SDL.init [SDL.InitEverything]
    sbase <- SDL.setVideoMode 640 480 24 []  -- draw here
    -- an ugly hack to get pixel format from an RGB surface:
    rgbPF <- SDL.surfaceGetPixelFormat <$> SDL.createRGBSurfaceEndian [] 1 1 24
    white <- SDL.mapRGB rgbPF (-1) (-1) (-1)
    SDLP.line sbase 0 0 (640-1) (480-1) white
    SDL.flip sbase
    eventLoop
    SDL.quit
  where
    eventLoop = SDL.waitEventBlocking >>= checkEvent
    checkEvent (SDL.KeyDown _) = return ()
    checkEvent _ = eventLoop
将合格的Graphics.UI.SDL导入为SDL
将合格的Graphics.UI.SDL.Primitives作为SDLP导入
导入控件。应用程序(())
main=do
SDL.init[SDL.InitEverything]
sbase可能是一个不那么肮脏的黑客(尽管可能取决于平台/实现):


它是否仍然发生在一条垂直线上,以及在整个屏幕上绘画?只是一个理智的检查,以确保一些疯狂的反走样没有进行或什么。这是不是一个大的小endian的问题?您没有将alpha通道设置为使255 0变为0 255(如果您反转字节顺序)?mb14:否。使用mapRGB和使用255做相同的事情。SDL绑定中可能存在错误?
import qualified Graphics.UI.SDL as SDL
import qualified Graphics.UI.SDL.Primitives as SDLP

import Control.Applicative ((<$>))

main = do
    SDL.init [SDL.InitEverything]
    sbase <- SDL.setVideoMode 640 480 24 []  -- draw here
    -- an ugly hack to get pixel format from an RGB surface:
    rgbPF <- SDL.surfaceGetPixelFormat <$> SDL.createRGBSurfaceEndian [] 1 1 24
    white <- SDL.mapRGB rgbPF (-1) (-1) (-1)
    SDLP.line sbase 0 0 (640-1) (480-1) white
    SDL.flip sbase
    eventLoop
    SDL.quit
  where
    eventLoop = SDL.waitEventBlocking >>= checkEvent
    checkEvent (SDL.KeyDown _) = return ()
    checkEvent _ = eventLoop
import GHC.Word
import Data.Bits

fi a = fromIntegral a

rgbColor::Word8→ Word8→ Word8→ Pixel
rgbColor r g b = Pixel (shiftL (fi r) 24 .|. shiftL (fi g) 16 .|. shiftL (fi b) 8 .|. (fi 255))