2010-07-20 55 views
6

下面是一些使用SDL和Haskell繪製對角線的代碼。當RGB顯然應該是白色時,我會得到一條CYAN線。這是在Ubuntu上。難道我做錯了什麼?爲什麼Haskell SDL應該是白色的青色線?

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 
+1

是否仍與垂直線發生,並與畫整個屏幕?只是一個健全的檢查,以確保一些瘋狂的反鋸齒不會發生或什麼。 – luqui 2010-07-20 07:48:58

+0

這是不是一個大 - 小端的問題?你不設置alpha通道255 255 255 0變爲0 255 255 255(如果你顛倒了字節順序)? – mb14 2010-07-30 14:33:16

+0

mb14:NO。使用mapRGB並使用255 255 255 255做同樣的事情。 – qrest 2010-07-30 16:12:43

回答

1

我得到了同樣的問題,我的系統上(兩條線路等原語),並直接使用,而不是mapRGBPixel構造似乎給正確的色彩。

例如,如果我導入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' 

我得到這個:

(255,255,255,255) 
(255,255,255,255) 
Pixel 16777215 
Pixel 4294967295 

因此,他們通過getRGBA看起來是一樣的,但實際Pixel值是不同的。

2

我觀察到與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 

我接受,這是一個醜陋的黑客攻擊,但似乎默認面」的像素格式不是RGB,並且使用的像素格式(?)已知是RGB的表面有助於。我沒有使用SDL的經驗,所以我不知道使用它的正確方法是什麼。

3

也許不那麼骯髒的黑客(雖然可能平臺/實現有關):

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)) 
相關問題