顯示具有 gtk2hs 標籤的文章。 顯示所有文章
顯示具有 gtk2hs 標籤的文章。 顯示所有文章

2011年4月4日 星期一

[gtk2hs] re+install !

早上6:30就爬起來弄 XD

不知道是第幾次弄 gtk+
但是記得應該是第四次很認真的弄 gtk2hs

很久以前 gtk+ 就可以裝好了
不過我記得這邊還是會有點小問題
會需要自己去稍事調整, 例如說,
我記得我手動 brew install gdk-pixbuf 過

然後卡過 32/64 bit 的問題
也卡過 ghc 6.12 不相容的問題
不過這次隨著 ghc 7 的更新
似乎就兜起來了沒有問題

依序安裝 gtk+, ghc(x86_64) 和 haskell-platform

> brew install gtk+
> brew install ghc --64bit
> brew install haskell-platform

因為 ghc 改用 64bit 版
所以 haskell-platform 會需要 re-build
因此整體過程會比較花時間一點
需要多一點耐心 (不過完全比不上當年手動 build ghc 6.10 來的痛苦 XD)

接著參考上篇把 cabal 舊有東西清掉

接著就開始灌全套 gtk2hs
> cabal install gtk2hs-buildtools
> cabal install gtk

至此, 隨便去找個 gtk2hs 的 example 來跑就知道會不會 work
不過, 額外有一件事就是
我之前為了某個被我遺忘的原因而裝了 XQuartz
好像是因為原本 glib 還是 什麼 lib 之類的某些東西有問題
所以裝了XQuartz

是說 XQuartz 似乎真的比較好(完整)
但是因為它是 .pkg 所以這真的是有點囧
我現在沒辦法讓 gtk2hs 出來的程式用原本的 X11.app 去開
是說用 XQuartz 直接跑也沒有不好(似乎這樣才好?)
不過, 感覺如果拿到別的mac上去就葛屁了...



時代真的日新月異
以前這些都麻煩到翻天
每件事情都要自己手動去苦幹實幹
幹不下去了就只好投降
現在這些府住的東西真的越來越發達了
雖然說問題還是很多啦
例如說我一直可以看到 cabal install 時會顯示:
「warning: #warning Setup.hs is guessing the version of Cabal.」
這樣的警告訊息, 或是看到一些警語說「ooxx is experimental!」
這真的看了很抖呀...
感覺哪天會在哪裡突然出包然後解決不了..

2010年11月1日 星期一

[Note] The GUI Issue

gtk+,之前在Mac OSX上面跑太多次有問題,已經有點怕了說,不過這次用brew灌就可以用了!不過compile的時候要給的參數好多,照說應該link和load的路徑都不需要再給,改下次有空再來試好了。



裝qt,其實nokia往站上有binary可以裝,可是跑起來覺得怪彆扭的。重點是這樣就打壞了原本弄好的lib系統。所以還是看看homebrew有沒有,果然有,那就灌吧!
> brew install qt
然後,等超過一個半小時了還沒好,所以下次再寫qt筆記吧 XD



這兩天在弄gtk+,莫名其妙的弄半天以後發現,brew灌起來的gtk+應該是可以用。雖說會噴一個奇怪的error出來,但是至少有東西了(那個error好像和顯示裝置的驅動還是設定有關)。gtk可以跑,我當然一如往常的想去試一下多年的夢想「gtk2hs」!他官網晃一圈以後就想起一個慘忍的事實:gtk2hs在ghc 6.12上面有bug。Orz

好吧,只好忍痛和gtk2hs說掰掰。不甘心之餘又回頭去看看現在有什麼其他的GUI package可以用用看。東看西看,還是只有gtk2hs和wxHaskell比較大宗。Orz

無奈之下,試試看wxHaskell吧:
在開始裝wxhaskell之前,要先把mac os x內建的wxWidgets換掉:
> brew install wxmac
如果沒有做這一步,之後執行macosx-app出來的.app會不能執行(mac會該說這個東西格式不對)。

wxmac要build好一會兒(10~20分鐘左右)。然後就可以用cabal來install正主兒:
> cabal install wxcore
build的時候,有滿坑滿谷的cpp deprecated warning Orz。為保安全,紀錄下g++的version:
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
Copyright (C) 2007 Free Software Foundation, Inc.
然後 > cabal install wx
我也不知道我幹麼分兩段裝,一定是白爛病發作了XD。裝好以後確定一下東西有進去ghc-pkg。
> ghc-pkg list
/usr/local/Cellar/ghc/6.12.3/lib/ghc/package.conf.d
..[略]..
/Users/Jaiyalas/.ghc/i386-darwin-6.12.3/package.conf.d
wx-0.12.1.6
wxcore-0.12.1.6
wxdirect-0.12.1.3

接下來才是問題所在,gui的東西似乎在mac上面都特別刁鑽。wx同樣也不是可以讓你乖乖跑一下就有結果可以開開心心用的。用ghc compile以後直接執行他會噴error如下,並且會跑出一個只能看不能用的視窗。
10:46:15: Debug: wxColour::Set - couldn't set to colour string 'GREY'
[Debug] 10:46:15: Adding duplicate image handler for 'PNG file'
[Debug] 10:46:15: Adding duplicate image handler for 'JPEG file'
[Debug] 10:46:15: Adding duplicate image handler for 'TIFF file'
[Debug] 10:46:15: Adding duplicate image handler for 'GIF file'
[Debug] 10:46:15: Adding duplicate image handler for 'PNM file'
[Debug] 10:46:15: Adding duplicate image handler for 'PCX file'
[Debug] 10:46:15: Adding duplicate image handler for 'Windows icon file'
[Debug] 10:46:15: Adding duplicate image handler for 'Windows cursor file'
[Debug] 10:46:15: Adding duplicate image handler for 'Windows animated cursor file'
[Debug] 10:46:15: Adding duplicate image handler for 'TGA file'
[Debug] 10:46:15: Adding duplicate image handler for 'XPM file'

解決的辦法是把原本的executable file包成.app再去打開它。不過這之前就需要macosx-app來作這件事。細節可以參考stackoverflow上的說明。這邊作個簡單的描述:
抓下macosx-app的模板順便改名字和操作模式
> wget http://code.haskell.org/wxhaskell/bin/macosx-app-template
> mv macosx-app-template macosx-app
> chmod a+x macosx-app
然後開個順手的editor把下面這段加到macosx-app的最上面:
#!/bin/sh

libdir=""

wxrezcomp="`wx-config --rezflags`"
wxrezfile=""
if test "$wxrezcomp"; then
for word in $wxrezcomp; do
temp="`echo $word | grep '[^_]*_mac-[^r]*r'`"
if test "$temp"; then
wxrezfile="$temp"
fi
done
fi

if test "$wxrezfile"; then
wxrezdir="`echo $wxrezfile | sed -e 's|\(.*\)/libwx_mac.*|\1|'`"
wxinstallrezcomp="`echo \"${wxrezcomp}\" | sed -e \"s|${wxrezdir}|${libdir}|g\"`"
wxinstallrezfile="`echo \"${wxrezfile}\" | sed -e \"s|${wxrezdir}|${libdir}|g\"`"
fi

rezcomp="$wxinstallrezcomp"
rezfile="$wxinstallrezfile"

直接執行macosx-app的話會看到他噴出一些warning
> ./macosx-app
Warning: --rezflags, along with Mac OS classic resource building is deprecated. You should remove this from your Makefile and build .app bundles instead.
error: you need to specify a program. Use "--help" to show valid options.
這邊可以不用理他(其實是我也不知道怎要怎麼解決,反正可以用 Orz)

以上都準備好以後就可以直接
> ghc -package wx -o helloworld HelloWorld.hs
> macosx-app -v helloworld
> open helloworld.app
感人的小視窗就會跳出來惹 OvQ

2008年9月7日 星期日

[GTK2HS] Cairo Notes

/*以下前半段主要整理自Cairo官網的Tutorial及其他*/

有關任何function的參數/行為細節等請查閱這裡

CairoGraphics主要有兩個基本的概念NounsVerbs

※※※ Nouns ※※※
大多是一些抽象的surface,是構成整個Cairo畫面的基本元件

  • Destination
    或稱Destination Surface,是我們基本的作畫平面
    可以是一個像素陣列或是一些檔案(.SVG,.PDF,etc...)

  • Source
    相當於顏料(paint)
    但是Source除了單色以外,還可以是更複雜的形式
    例如另一個Destination或是樣式(Pattern)
    也還可以加上透明度(Transparency)

  • Mask
    Mask是介於Source和Destination之間的過濾版
    僅有被Mask允許的地方Source才能投影/映射到Destination上面

  • Path
    路徑(Path)的資訊會被紀錄在文本(Context)之上
    直到我們使用繪出(Draw)之類的動詞之時,
    Context中的Path才會直接轉換成一個Mask
    並且透過這個Mask將Source投影到Destination上面

  • Context
    Context是一個資料載體
    其包含了該圖片絕大多數的資訊
    context紀錄所有會被動詞(Verbs)影響的資訊/名詞
    例如當前的Destination,Source,Mask,以及一些其他的資訊
    像是筆觸(Stroke),位移(Translate)等等
    最重要的,Context紀錄了上一個動詞之後到目前為止所有的Path


  • ※※※ Verbs ※※※
    是由數個實際存在的function合稱而成
    主要的功能就是將目前Context的內容pop出來並且根據不同的Verb執行不同的繪畫

  • Stroke
    Stroke就是沿著Path畫線

  • Fill
    單純的把Path內部填滿Source上的顏色或圖片

  • Text/Glyphs
    做為動詞,我目前僅知showText這個方法
    另外也可以用textPath和glyphPath配合fill來間接產生文字

  • Paint
    就是單純的全頁面Source覆蓋
    有兩種形式:無透明的paint和有透明的paintWithAlpha


  • Mask
    作為Verb的Mask相當單純,就相當於覆蓋(Paint)
    唯一的差別是執行Mask還需要一個Pattern來當作Mask(名詞)
    另外還需要注意Compositing Operator對於Mask動作的影響


  • 接下來是更多的整理和常用工具的列表

    ※※※ Pattern ※※※
    Pattern大致上有三種
    withRGBPattern/withRGBAPattern
    withLinearPattern
    withRadialPattern
    分別是單色樣式,線性漸層樣式,圓形漸層樣式
    漸層樣式可以使用patternAddColorStopRGB(RGBA)來增加漸層色點

    Pattern有兩種用途
    作為Mask動作的Mask(名詞) : (mask pattern)
    或是直接轉換作為Source : (setSource pattern)

    實做上面則需要注意一點
    withXXXPattern的最後一個參數都是一個(Pattern -> Render a)的function
    這可以視為withXXXPattern會產生一個只存在於該function內的Pattern實體
    也就是說所有需要這個Pattern的動作都要在這個function中完成
    看個例子就很好理解
    withRadialPattern 45.0 45.0 10.0 45.0 45.0 40.0 (\pattern -> do
        patternAddColorStopRGBA pattern 0.0 1.0 1.0 1.0 1.0
        patternAddColorStopRGBA pattern 1.0 0.5 0.5 0.0 0.5
        mask pattern)

    關於Mask和Clip這篇Notes中並沒有細談
    因筆者個人需求問題所以暫時沒有計畫去研究這個部份
    有興趣可以自己參考這裡或是這裡

    ※※※ Setting Stroke ※※※
    Stroke有一些基本常見的設定
    setLineWidth 設定線寬
    setDash 設定虛線
    setLineCap CAP 設定端點
    setLineJoin JOIN 設定接點(折點)

    CAP(端點)有三種選擇
    LineCapButt 平面
    LineCapRound 圓角
    LineCapSquare 方塊

    JOIN(接點)也有三種選擇
    LintJoinMiter 尖角
    LintJoinBevel 斜切角
    LintJoinRound 圓角

    ※※※ Save/Restore ※※※
    Save和Restore是一組很好用的工具
    Save會紀錄下現在Context中的State資訊(不包含Path)
    Restore則是會回到上一次Save的狀態

    這組工具在需要來回切換數組狀態時相當方便
    例如說
    setSourceRGB 1.0 0.0 0.0
    moveTo 0.0 0.0
    lineTo 5.0 5.0
    stroke
    save
    setSourceRGB 0.0 0.0 1.0
    moveTo 5.0 5.0
    lineTo 10.0 10.0
    stroke
    restore
    moveTo 10.0 10.0
    lineTo 15.0 15.0
    stroke

    會畫出一條紅-藍-紅的線段

    ※※※ Transformation/Matrix ※※※
    基本的轉換大致有三種
    translate 平移
    scale 縮放
    rotate 旋轉
    中心點都是在圖形的左上角
    transformation也是save/restore的對象

    另外,Matrix也可以用來做transformation
    Cairo裡面另外有專門做Matrix運算的package: Graphics.Rendering.Cairo.Matrix

    該package裡面有很多function可以產生/修改一個Matrix實體
    (參考這裡)
    而自行產生的Matrix實體可以由transform來執行
    或是由setMatrix/getMatrix來運用

    ※※※ Path Tool ※※※
    moveTo 移動
    lineTo 直線
    curveTo 曲線
    relMoveTo 相對移動
    relLineTo 相對直線
    relCurveTo 相對曲線
    arc 弧線
    arcNegative 負角度的弧線
    rectangle 矩形Path
    textPath 產生字串的Path
    closePath 封閉現在的Path
    newPath 清除之前的Path


    最後一個,也是最複雜的重點
    ※※※ Compositing Operator ※※※
    Compositing Operator是Cairo在進行影像合成時的模式
    不同的Operator會造成兩個圖形合成出不一樣的結果
    主要是影響透明度和彩度
    官方的說明在這裡

    以下完全是根據自己的理解整理出來的 XD
    (Surface都是指Destination)

    { "較"單純的Operator }
  • OperatorClear (Bounded)
    將source當作橡皮擦,把交集的部份清除
  • OperatorSource (Bounded)
    完全無視Source的透明度,直接蓋上去
  • OperatorDest (Both)
    禁畫模式,source畫什麼都會失敗
  • OperatorXOR (Both)
    看半天看不懂,太複雜了 Orz
    不懂他的公式怎樣出來的?
    又代表什麼意思 ?
  • OperatorAdd (Both)
    透明度直接加總(最大到1)
    彩度上,兩者都根據自己原本的透明度而縮小之後再相加
    換句話說,越不透明就用能保有較多的彩度
    最標準的融合模式!!
  • OperatorSaturate (Both)
    透明度取直接加總(最大到1)
    顏色上,兩者都縮小之後再加成
    但是source會縮的比surface小(也就是說,會以surface的原色為重)
    有點類似於把source當作浮水印蓋上去


  • { 有相反模式的Operator }("不會"吃掉surface或是source的圖)
  • OperatorOver (Both)
    彩度和透明度都是 以source基礎,加上surface的弱化
    是Cairo的Default Operator
  • OperatorDestOver (Both)
    彩度和透明度都是 以surface基礎,加上source的弱化


  • { 有相反模式的Operator }(但是""吃掉surface或是source的圖)
  • OperatorOut (Unbounded)
    圖形使用source給的(surface但非交集的部份全部砍掉)
    彩度按照source不變
    透明度是根據surface的透明度而更加透明
    surface透明度=0 -> 完全按照source透明度
    surface透明度=1 -> 透明度0
  • OperatorDestOut (Both)
    完全顛倒於OperatorOut
    圖形使用surface
    彩度照surface
    透明度根據surface的透明度而更加透明
    Out 有點像是把surface當作一塊會造成透明化的板子,然後兩者疊合
    DestOut 則是將source當作那塊透明化板


  • OperatorIn (Unbounded)
    只會繪出新舊交集之處
    透明度是原本兩者相乘 = 變小
    彩度按照Source
  • OperatorDestIn (Unbounded)
    完全同上,只是彩度改成按照Surface

  • OperatorAtop (Unbounded)
    只繪出surface
    透明度完全照surface
    顏色基本上是兩者加總,但是會根據source的透明度加成
    source透明度=0 -> 以surface色彩為準
    source透明度=1 -> 以source色彩為準
  • OperatorDestAtop (Unbounded)
    只繪出source
    透明度完全照source,
    基本上是兩者加總,但是會根據surface的透明度加成
    surface透明度=0 -> 以source色彩為準
    surface透明度=1 -> 以surface色彩為準
    就像是在交集的地方多塗上一層對方的顏料
    而這個顏料的濃度則是根據對方的透明度決定


  • 題外一下
    我自己測試Mask只有在下面四個Operator有效果
    Add, DestOver
    Out, DestAtop
    不過其實這裡還有很多細節要另外去研究
    所以不是很肯定(簡單說就是不懂 XD)

    以上,是我最近幾天在試的東西 :)
    有待研究的主要是Mask和Clip
    還有如何在GTK+的元件上面繪圖

    2008年9月4日 星期四

    [GTK2HS] Taste of Cairo

    因為某個自己要用的軟體想要輸出簡單的SVG圖片來讓html開
    所以從SVG的wiki找上了Cairo
    連過去看赫然發現他有Haskell Binding
    高興之餘就想說來測試看看
    如果可以用就把之前的ruby版改成haskell版
    就算失敗了,Cairo也有ruby binding. XD

    結果在Cairo網站裡看半天也沒有看到說哪有haskell binding
    最後東連連西連連才發現
    原來是被放進gtk2hs裡面了
    所以又回頭去翻了一下gtk2hs的網站
    最後找是找到了,不過沒有太詳細的說明
    和gtk2hs本身一樣,都要自己花不少時間去摸 @@


    在Haskell,或說在GTK2HS的Cairo binding裡面
    首先是要先產生我們的Surface(此處相當於Destination的同義詞)
    然後把這個Surface傳進真正會執行Drawing的function裡面
    Context的產生也會在這個function中出現
    (怎麼有種Continuation的味道? XD)

    來個簡單的範例吧
    module Main where
        import Graphics.Rendering.Cairo
        main :: IO ()
        main = do
            withSVGSurface "sample.svg" (fromInteger 90) (fromInteger 90) myDraw
        myDraw :: Surface -> IO ()
        myDraw surface = renderWith surface $ do
            setSourceRGB 0.0 1.0 1.0
            moveTo 10.0 10.0
            relLineTo 70.0 0.0
            relLineTo 0.0 70.0
            relLineTo (-70.0) 0.0
            relLineTo 0.0 (-70.0)
            stroke

    因為我是想要做SVG檔
    所以這個程式就是輸出.svg
    以下是輸出的截圖

    更多細節請參考XXX一文

    2008年5月15日 星期四

    [GTK2HS] Testing

    今天早上終於考完我的期中考惹
    其實沒什麼念
    但是卻寫的蠻順的
    感覺logic那些東西有碰有差 @@
    阿,雖說還是有幾個地方的證明想不出來

    扯遠了
    總之晚上喬好pre-ProG的事以後
    趁著大腦很累的時候玩了一下gtk2hs

    compiler > ghc 6.8.2
    package > gtk2hs 0.9.12.1
    gtk > x11/gtk2 2.12.9


    跑起來長做這樣..
    不太好看的感覺 @@
    但是也不算太醜啦
    只是X11實在是有那麼點遲鈍


    2008年5月10日 星期六

    [GTK2HS] Install on Mac OS X

    一時興起
    灌了wxHaskell和gtk2hs來用

    不過wxHaskell不知道為甚麼不能跑
    我猜是某個東西的版本不對
    不過我暫時也懶得去找問題了
    也許哪天用Arch來灌灌看(?) 
    有.空.的.話.啦... XD

    回到正題
    gtk2hs官方網站上的tutorial
    不知道為啥是用一個叫做Glade的軟體當作開發環境

    然後我試著去抓下來build
    不過build到一半有問題然後就卡住了
    看起來是我有少東西
    但是,懶散如我
    我另外去google一下有沒有其他的tutorial
    果不其然,找到了這個 
    一個gtk2hs的toturial
    (不過後來我也在gtk2hs官網上看到一樣的helloworld sample囧)

    簡單講一下helloworld的作法

    首先create一個檔案:
        import Graphics.UI.Gtk
        main 
    :: IO ()
        main 
    = do
          
    initGUI
          window 
    <- windowNew
          button 
    <- buttonNew
          
    set window [ containerBorderWidth := 10,
                       
    containerChild := button ]
          
    set button [ buttonLabel := "Hello World"]
          
    onClicked button (putStrLn "Hello World")
          
    onDestroy window mainQuit
          
    widgetShowAll window
          
    mainGUI



    然後用ghc compile一下
    > ghc --make gtktry.hs -o hello
    > ./hello
    這樣就好了
    因為是在mac os上
    所以會開出X11來
    有點醜,但是也只能忍耐了 T^T

    題外話1
    後來我用macport弄到了Glade3
    不過暫時沒有意願去測
    雖說看起好像還不錯用的說
    (port好強呀,什麼都有Orz)

    題外話2
    據說有個叫做HOC的東西
    (Haskell to Object-C binding)
    顧名思義,可以連接haskell和object-c
    然後據說可以藉此使用mac上的cocoa
    不過,cocoa我完全不熟
    (其實完全沒碰過沒用過)
    所以只是隨口提一下 XD