Skia and framebuffer

根據 Jserv 大的淺談 Google Skia 圖形處理引擎,得知 skia 只能畫在 Memory buffer 上,那麼,可以直接畫在 Framebuffer 上嗎??

Jserv 大文章裡的例子,SkBitmap 得先呼叫 allocPixels() 來配置所需要的 Memory buffer,根據 SkBitmap.h 裡的宣告,allocPixels 事實上是使用 allocator 來配置所需要的 Memory buffer,如果未指定,會以 stdalloc(HeapAllocator) 來進行配置。因此如果要直接使用 framebuffer,可以繼承 SkBitmap::Allocator 類別之後,改寫 allocPixelRef() 來達到目的。

大致的代碼就像這樣子:[c]
#include “SkTypes.h”
#include “SkRefCnt.h”
#include “SkBitmap.h”
#include “SkDevice.h”
#include “SkPaint.h”
#include “SkRect.h”
#include “SkMallocPixelRef.h”
class FrameBufferAllocator: public SkBitmap::Allocator
{
public:
FrameBufferAllocator();
virtual ~FrameBufferAllocator();
virtual bool allocPixelRef(SkBitmap*, SkColorTable*);
private:
char* m_addr;
int fd;
};
FrameBufferAllocator::FrameBufferAllocator()
{
}
FrameBufferAllocator::~FrameBufferAllocator()
{
// munmap framebuffer pointer.
// close the framebuffer device we opened
}
bool FrameBufferAllocator::allocPixelRef(SkBitmap* dst, SkColorTable* ctable)
{
size_t size = dst->getSize();
// open framebuffer
fd = open( “/dev/fb0”, O_RDWR );
// setup framebuffer device via ioctl.
// mmap framebuffer
m_addr = (char *)mmap(0, screensize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
// call original procedures in HeapAllocator::
dst->setPixelRef(new SkMallocPixelRef(m_addr, size, ctable))->unref();
dst->lockPixels();
return true;
}
[/c]

接著,Jserv 大的範例只要修改一行:[c]
bitmap.allocPixels( new FrameBufferAllocator, NULL );
[/c]
就可以順利運作了。

p.s. 在 link libskia.a 時,遇到很鳥的狀況,skia 的 Makefile 在製作時,是直接以帶有路徑的 .o 去作,而我 toolchain 的 gcc 居然無法處理,必須要以沒有路徑的 .o 去重新製作,這樣才能 link 成功。

石碇

106縣道往平溪方向,在石碇的地方叉出106乙,下面這幾張照片就是在這個三叉口的路邊拍的。照片不是很清楚,這是因為我沒帶數位相機,所以只能拿手機湊合著用。
20090626-石碇-0120090626-石碇-0220090626-石碇-03

電影流水帳(2009/6/24~2009/6/27)

聽海角七號原聲帶之後才看電影,然後才明白為什麼原聲帶裡有這些曲目,這樣也挺有趣的。

  • Star Trek(IMDB, Wikipedia),中譯:星際爭霸戰。之前看到中譯片名時,我還聯想不到這是星艦系列的片子。看完這部片以後,我開始有點痛恨時空因果律了,因為我開始搞不清楚因果關係,最後甚至老Spock跟年輕的Spock也碰面了,這是怎樣??
  • 海角七號(IMDB, Wikipedia)。終於把去年的熱門片看完了,看到最後暖場時,真的有熱血的感覺出來。不過為什麼,看完以後我腦海裡只記得李佩甄露出好身材的那幾個片段??在網路找IMDB檔案時,赫然發現片名是以台語發音-Hái-kak chhit-ho,有趣。
  • Paul Blart: Mall Cop(IMDB, Wikipedia),中譯:百貨戰警。我想這是我第一次看到Segway亂跑的畫面,這部片裡,是拿來當作賣場警衛的代步工具,真的很酷。除此之外,這部片子很普通…很普通…很普通…簡單說就是一個胖子警衛靠著喜歡某人的熱情而單槍匹馬解決掉賣場危機。
  • Zack and Miri Make a Porno(IMDB, Wikipedia),中譯:淫幕初體驗。這是我第一次挑戰完全沒有字幕的電影,老實說,片裡的對話我了解不到四成吧,所以有些笑點,就不是那麼的了解。這是一部浪漫喜劇,最後也是男女主角大和解的結局。

C 的 && 與 ||

前一陣子看Javascript 語言精髓與編程實踐這本書的時候,發現可以用 && 來達到 if ,用 || 達到 if not 的效果,所以下面是以 C/C++ 實驗的結果:

#include <stdio.h>
int say_hello( void )
{
printf("Hello world!!\n");
return 0;
}
int main( int argc, char* argv[] )
{
int flag=0;
printf("flag=0\n");
flag && say_hello(); // say_hello() won't be invoked
flag || say_hello(); // say_hello() will be invoked
printf("flag=1\n");
flag=1;
flag && say_hello(); // say_hello() will be invoked
flag || say_hello(); // say_hello() won't be invoked
return 0;
}

不過坦白說,這樣寫的結果是導致可讀性變差,只有自己維護這份 code 時,那是可以用,很多人維護一份 code 時,最好還是避免,或者,加上註解比較好。
我想 c# / java 應該也可以這樣作。
p.s. 如果不是呼叫函數的話,記得要使用 ( ),例如:

i && (j=100);

這就等同於:

if(i) j=100;

電影流水帳(2009/6/13~2009/6/23)

媽媽,謝謝你生我、養我,也謝謝你幫我照顧小孩,你辛苦了。過一陣子我再拿洗好的孫子照片給妳。

  • パコと魔法の絵本(Wikipedia, IMDB),中譯:幸福的魔法繪本。說是幸福的,有點太過,不過這部電影是真的很好看,在誇張的敘事之下,娓娓道出每個人的故事,實在是很吸引人,再加上動畫與真人的穿插,我不得不說這是我最近看過最好看的電影之一。
  • Juno(IMDB, Wikipedia),中譯:鴻孕當頭,又是一個爛中譯名字。很不錯的電影,裡面的女主角很幸運,有支持她的父母、朋友,也找到家境小康的收養家庭,讓她能把孩子生下來,繼續完成高中學業與夢想。每個月都會收到勵馨的報紙,報導一些故事,就實在是讓人很唏噓。以後如果我小孩也搞出這種事情,他會願意告訴我嗎?而我會不會很生氣呢?
  • シャカリキ!(Wikipedia(漫畫)),中譯:鐵馬頑童。很熱血的電影,看了這片我才比較知道自行車競賽的規則,不過除了熱血以外,好像就沒剩下什麼了啊~除了對主角有比較明顯的刻劃以外,其他人幾乎都是輕輕帶過,連最後教練的面授機宜都沒什麼交代,算是普通的熱血片吧~

cvs diff with meld

公司還在用 CVS,Windows 下有 wincvs 這個方便的軟體,Linux 下,我還是習慣用 console 介面,console 介面下,很多事情就要自己來了。

wincvs 可以選用自訂的軟體來比對。但在 console 下,只能用 cvs diff,cvs diff 的話,只會列出 diff 的結果,沒辦法以視覺化的方式呈現比對結果。

所以只好刻一個,簡單的說就是利用 cvs update -p -r(revision) 將結果輸出到暫存檔,再用 meld 來比對這暫存檔與目前檔案:

#!/bin/bash
# author: elleryq
# version: 0.1
# distro: ubuntu
# dependency: cvsnt
if [ ! -e $1 ]; then
echo "$1 is not existed, run 'cvs update $1' first!"
exit -1
fi
[ -z $DIFF ] && DIFF=meld
function usage() {
prog=`basename $0`
echo "Usage:"
echo "    $prog filename revision"
exit 0
}
[ -z $1 ] && usage
if [ -z $2 ]; then
revision=`cvs log $1 | grep head | awk '{print $2;}'`
else
revision=$2
fi
tmpfile=/tmp/$1.$revision
cvs update -r $revision -p $1 > $tmpfile
$DIFF $tmpfile $1
rm -f $tmpfile
exit 0

你可以自訂 diff 軟體,只要設置好 DIFF 這個環境變數即可,預設是 meld

Firefox 附加元件收藏集

最近 Mozilla 推的 Firefox 附加元件收藏集 真的是好東西。
年初趁重裝 Firefox 3.1 的時候,很有心地用 Google docs 整理了一份附加元件的清單,只是後來又安裝/移除了一些元件以後,就忘了再去維護。現在有了 Firefox 附加元件收藏集 就可以方便地管理自己的附加元件了。另外,也可以訂閱別人的收藏集,來找到適合自己的附加元件,這個收藏集的功能實在是很感心啦~
這是目前我的收藏集:elleryq’s collection,也就是我公司 Firefox 有裝的附加元件,居然也不知不覺地裝了 35 個…XD…

電影流水帳(2009/6/2~2009/6/12)

好像對電影失去感動了,是因為看了太多亂七八糟的片子嗎?是不是應該開始謹慎挑選要看的片子呢?

  • The Mother of Tears(Wikipedia),中譯:木乃伊博物館。不知所謂的恐怖片,我有點後悔看了這片。片裡是蠻血腥的啦,只是劇情實在太無厘頭…
  • The Horsemen(Wikipedia),中譯:天啟騎士。想不到這片是翻拍1971年的舊片,劇情還不錯,不會出人意料,看到一半我大概已經猜到最後的白騎士是主角的兒子了,最後算是完滿的結局嗎?不知道,因為沒有交待主角大兒子最後是否有救回來。總的來說,算是普普通通吧。

電影流水帳(2009/5/23~2009/6/1)

最近看電影都預先排好要看些什麼,要看的時候,就依序看下去,省得浪費時間選。我發現這樣挺不錯的,可以省下不少時間。

  • Crank High Voltage(IMDB, Wikipedia),中譯:快克殺手2:極速電擊。極盡惡搞之能事的片子,完全延續第一集的 style,這裡不多說了,還是要自己看過一遍。本集有白靈超乎想像的演出,後面居然還有模擬電玩怪獸大戰的畫面,真是夠了。看到最後時,我個人認為,還有機會拍第三集。
  • いま、会いにゆきます,中譯:現在,很想見你。很感人的故事。男主角把女主角時,用筆忘記拿當作約會的藉口,這招真是不錯~看到後面時,發現驚人的巧合,原來女主角也企圖使用同一招想要跟男主角再次見面。片子的最後說明了謎底,原來是 20 歲的女主角因車禍而來到未來跟她的小孩和男主角一起生活,雨季結束之後,就回到醫院的床上了。有氣質的女主角原來就是竹內結子,因為這片跟男主角中村結婚,生下小孩以後,旋即又離婚…