KJAVA虚拟机Hack笔记-用GTK+实现绘图操作
892 views| 2008-12-08| 李先静| KVM hack notes| | 发表评论转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli@gmail.com>
绘图操作是在mutable image上进行的,也就是画在GdkPixmap上的,由于GdkPixmap没有画圆和椭圆的函数,我选择用cairo来实现。大部分函数的实现很直观,调用cairo相应的函数就行了,gxpport_draw_arc比较麻烦一点,因为gxpport_draw_arc支持画椭圆,而cairo没有函数直接对应,我们可以通过cairo的变换函数来实现:
void gxpport_draw_arc( jint pixel, const jshort *clip, gxpport_mutableimage_native_handle dst, int dotted, int x, int y, int width, int height, int startAngle, int arcAngle) { cairo_t* cr = gxpport_get_dst_cairo(dst); double start = ANGLE_FROM_DEGREE(startAngle); double arc = ANGLE_FROM_DEGREE(arcAngle); cairo_init_style(cr, pixel, clip, dotted); cairo_save (cr); cairo_translate (cr, x + width / 2.0, y + height / 2.0); cairo_scale (cr, width / 2.0, height / 2.0); cairo_arc(cr, 0.0, 0.0, 1., start, arc); cairo_restore (cr); cairo_stroke (cr); return; }
其它函数的实现类似,这里不再重复了。另外有两个问题值得一提:
o 目标pixmap可能为空,这时要画在当前的窗口上,我们调用自己实现的lfpport_get_active_screen来获得当前窗口。
o其次是与GTK的绘制机制有关。要往GdkWinow上绘制东西,只能在expose消息里做,在expose之前GTK会clear窗口上的内容,之后才把绘制的内容刷新到屏幕上。而JAVA的绘制操作显然不是在expose消息里执行的。为了解决这个问题,我们需要建立另外一个pixmap,JAVA先绘制到这个pixmap上,而在expose消息里从这个pixmap拷过去。
我们这样处理窗口的expose事件:
static gboolean frame_on_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { int w = 0; int h = 0; (void)event; (void)user_data; GdkDrawable* drawable = GDK_DRAWABLE(widget->window); GdkDrawable* back_buffer = g_object_get_data(G_OBJECT(drawable), "back_buffer"); GdkGC* gc = gdk_gc_new(drawable); if(back_buffer != NULL) { gdk_drawable_get_size(drawable, &w, &h); gdk_draw_drawable(drawable, gc, back_buffer, 0, 0, 0, 0, w, h); } g_object_unref(G_OBJECT(gc)); return TRUE; }
Share
Tags
Recent Posts
Most Viewed
- 系统程序员成长计划写作提纲 - 19,604 views
- Android IPC机制详解 - 6,277 views
- 系统程序员成长计划-走近专业程序员(上) - 6,253 views
- 系统程序员成长计划-写得又快又好的秘诀(一) - 5,390 views
- 系统程序员成长计划-背景知识 - 5,070 views
- i++循环与i–循环的执行效率 - 4,712 views
- 系统程序员成长计划-Write once, run anywhere(WORA)(上) - 4,700 views
- 系统程序员成长计划-走近专业程序员(下) - 4,254 views
- Linux下的调试工具 - 4,017 views
- Advanced Linux Sound Architecture (ALSA) 研究笔记 - 4,017 views
- 系统程序员成长计划-序 - 3,985 views
- 系统程序员成长计划-写得又快又好的秘诀(三) - 3,929 views
- 中国人与自由软件文化研究(搞笑版) - 3,735 views
- Android中的MessageQueue,Handler,Looper和Thread - 3,686 views
- 答复:我不会OOO,仍然可以XXX - 3,658 views
Categories
- Android (28)
- Broncho-A1-Hack (6)
- DirectFB (7)
- FTK(嵌入式GUI) (24)
- GTK+ (29)
- KVM hack notes (8)
- Linux Mobile (65)
- Management (5)
- Mozilla (9)
- Open Source (5)
- Programming (34)
- Tools (9)
- Uncategorized (23)
- Win32 (3)
- X Windows (31)
- 沉思录 (29)
- 系统程序员成长计划 (67)
Blogroll
gallery
Linux guru
推荐网站
Recent Comments
- Dig on 嵌入式GUI FTK设计与实现-事件源(FtkSource)
- 用心生活每一天 » GNU gprof: linux profiling tools 使用 on gcc profiling的工作原理
- JavaScript for: i++ vs i–-传播、沟通、分享-一直“有你” on i++循环与i–循环的执行效率
- Frankly Law on 嵌入式GUI FTK介绍(11)-交叉编译
- tracing on Linux下的调试工具
- ndljsn on FTK移植指南(初稿)
- tracing on 爬塘朗山
- tracing on GTK+(基于DirectFB)的字体处理
- Kely on 系统程序员成长计划写作提纲
- tracing on 爬塘朗山



December 8th, 2008