Почему линия Haskell SDL голубого цвета, когда она должна быть белой? - PullRequest
6 голосов
/ 20 июля 2010

Ниже приведен код для использования SDL с Haskell для рисования диагональной линии.Я получаю строку CYAN, когда 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

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Возможно, менее грязный хак (хотя, вероятно, зависит от платформы / реализации):

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))
2 голосов
/ 20 июля 2010

Я наблюдаю тот же эффект на Lucid с ATI HD2400 и драйвером Radeon (если это имеет значение). Но есть обходной путь.

Этот пример рисует белую линию:

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, поэтому я не могу сказать, как правильно его использовать.

1 голос
/ 20 июля 2010

В моей системе возникает та же проблема (как для линий, так и для других примитивов), и использование конструктора Pixel напрямую вместо 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'

Я получаю это:

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

Таким образом, они выглядят одинаково через getRGBA, но фактические значения Pixel отличаются.

...