gpt4 book ai didi

haskell - 如何在 haskell 应用程序中使用 cairo 渲染成 gtk3 状态图标?

转载 作者:行者123 更新时间:2023-12-02 18:41:32 26 4
gpt4 key购买 nike

我想渲染到 statusicon我的应用程序。

我知道我可以通过设置 statusIconPixbuf 使状态图标显示 pixbuf .

我可以通过 pixbufNew 创建一个空的 pixbuf并执行诸如用单一颜色填充之类的操作。

但是如何使用 cairo 渲染到该 pixbuf 中?

或者 pixbuf 不适合使用吗?有没有更好的方法来渲染状态图标?

最佳答案

使用 Pixbuf 我需要一种渲染它的方法。

以下解决方案采用 cairo 渲染 render::Render a以及(方形)Pixbuf 所需的 X 和 Y 尺寸(如果您需要创建非方形 Pixbuf,则可以更改此值。)

import qualified Foreign.Ptr as Pointer
import qualified ByteString as B

renderPixbuf :: Int -> Render a -> IO Pixbuf
renderPixbuf size render = withImageSurface FormatARGB32 size size $ \surface -> do
renderWith surface render
stride <- imageSurfaceGetStride surface
surfaceData <- swapRB stride <$> imageSurfaceGetData surface
B.useAsCStringLen surfaceData $ \(pointer, _) -> do
let pointer' = Pointer.castPtr pointer
pixbufNewFromData pointer' ColorspaceRgb True 8 size size stride

它使用函数withImageSurface创建一个表面供 cairo 渲染,然后调用 renderWith执行 render 指定的实际渲染。

接下来的两行提取图像步幅,即一行中的字节数和 ByteString 形式的实际图像数据。

swapRB 是一个转换 ByteString 的函数,因为不知何故红色和蓝色 channel 的顺序错误。请参阅下文了解如何完成此操作。

B.useAsCStringLen它变得低级:它采用 imageSurfaceGetData 返回的 ByteString并将其转换为 Ptr CUChar 以使用 pixbufNewFromData 创建一个新的 Pixbuf .

就是这样。

swapRB 定义如下:

import Data.Word (Word8)
import Data.List (unfoldr)

splitAtIfNotNull :: Int -> B.ByteString -> Maybe (B.ByteString,B.ByteString)
splitAtIfNotNull i string
| B.null string = Nothing
| otherwise = Just $ B.splitAt i string

mapChunks :: (B.ByteString -> B.ByteString) -> Int -> B.ByteString -> B.ByteString
mapChunks mapper chunkSize = B.concat . map mapper . unfoldr (splitAtIfNotNull chunkSize)

swapRB :: Int -> B.ByteString -> B.ByteString
swapRB = mapChunks swapRBforLine
where swapRBforLine :: B.ByteString -> B.ByteString
swapRBforLine = mapChunks (B.pack . swapRBforPixel . B.unpack) 4
swapRBforPixel :: [Word8] -> [Word8]
swapRBforPixel [b,g,r,a] = [r,g,b,a]
swapRBforPixel other = other

它将像素数据的字节字符串分割成行,然后将行分割成像素,每个像素由 4 个字节组成:红色、绿色、蓝色、alpha channel 各一个字节。最里面是实际的交换:

swapRBforPixel [b,g,r,a] = [r,g,b,a]

关于haskell - 如何在 haskell 应用程序中使用 cairo 渲染成 gtk3 状态图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40672750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com