GTK编程——视件和颜色表

视件和颜色表 硬件之间总存在差别。最原始的X服务器只支持两种颜色,每一个像素只能是on或off(开或关)。这就是“每像素一位”(bpp)显示模式。每像素一位的显示模式称为深度为1。多数高级的X服务器支持每像素24或32位,还允许以窗口为基础指定不同的深度。每像素24 位允许224(16777216)种像素,包含了比人眼能分辨的还要多的颜色。 从概念上说,位图显示由一个矩形的像素网格组成。每个像素由一些固定的位数组成;像素以一种硬件相关的方法映射为可视的颜色。考虑这种概念的一种方法就是想象一个二维的整数数组,整数的大小等于要求的位数。换一种说法,可以想象一种显示就像一个“位平面”栈,或“位”的二维数组。如果每个平面都平行于其他平面,那么一个像素就是一根在相同坐标处穿过每个平面的垂线,并且从每一个平面处获得一位。这就是术语“深度”的起源,因为每个像素的位数等于位平面栈的深度。 在X窗口系统中,像素代表在一个颜色查找表中的入口。一种颜色就是一组红、绿、蓝(RGB)值—监视器以一定比率混合红绿蓝光以显示每个像素。例如,考虑一种八位的显示模式:八位不足以为现实中的颜色编码,只可能为很少部分的RGB值编码。作为替代,数据位被解释为整数,用于为RGB颜色值做索引。这个颜色表称为colormap(颜色表),有时,你也可以修改它以包含要使用的颜色,虽然这样做是硬件相关的(一些colormap是只读的)。 视件(visual)用来决定像素的位模式如何转换为一个可见的颜色。因而,视件还定义了颜色表如何工作。在八位显示中,X服务器也许将每个像素解释为一个包含256种可能颜色值的颜色表的索引。典型情况下,24位视件有三个颜色表:一个是红色的浓淡值,一个是绿色的浓淡值,一个是蓝色的浓淡值。每个颜色表用一个八位的值索引;三个八位值组成24位的像素。视件定义了像素内容的含义,还定义了颜色表是只读的还是可修改的。 简而言之,视件就是特定X服务器的颜色容量的描述。在Xlib中,你得围绕视件做很多罗嗦的事,但是Gdk和Gtk+能极大地简化了这些繁琐工作。 16.3.1GdkVisual Xlib能报告一个所有可用的视件以及相关信息的列表;Gdk在一个称为GdkVisual的结构中保持一个这些信息的客户端拷贝。Gdk能报告可用的视件,并将它们以不同的方式分级。在多数时候,只需用gdk_visual_get_system()函数就可以了,它返回一个指向缺省视件的指针。如果正在写一个GtkWidget构件,gtk_widget_get_visual()函数将返回应该使用的视件。返回的视件不是一个拷贝,所以不需要释放它,Gdk将永久保存视件。 获取缺省视件 #include<gdk/gdk.h> GdkVisual*gdk_visual_get_system() 下面是GdkVisual结构的定义,大多数成员都用于由颜色计算像素值。 typedefstruct_GdkVisualGdkVisual; struct_GdkVisual { GdkVisualTypetype; gintdepth; GdkByteOrderbyte_order; gintcolormap_size; gintbits_per_rgb; guint32red_mask; gintred_shift; gintred_prec; guint32green_mask; gintgreen_shift; gintgreen_prec; guint32blue_mask; gintblue_shift; gintblue_prec; }; 16.3.2视件的类型 视件用不同的度量方法加以区分。它们可以是灰度级或者RGB值,颜色表可以是可修改的或者固定的,像素值可以是单个的颜色表或者包含了压缩的红、绿、蓝的索引值。下面是GdkVisualType的可能取值: GDK_VISUAL_STATIC_GRAY:意味着显示器是单色的或者灰度的,颜色表不能修改。一个像素值只是一个灰度级别,每个像素都是“硬编码”,分别代表一个确定的屏幕上的颜色。 GDK_VISUAL_GRAYSCALE:意味着显示器是可修改的,但是只有灰度的级别才可能修改。像素代表在颜色表中的一个入口,所以给定的像素在不同的时候能够代表不同的灰度级别。 GDK_VISUAL_STATIC_COLOR:代表一种颜色显示,它使用单个只读的颜色表而不是红、绿、蓝每种颜色各一个单独的颜色表。这种显示差不多就是12位或更少(使用单个颜色表的24位显示器需要一个带224个入口的颜色表,差不多有500MB)。这是一种恼人的视件,因为它的可用颜色太少,而且不能改变成它们的实际颜色。 GDK_VISUAL_PSEUDO_COLOR:从很多年前开始,就一直是低端PC硬件的常用视件。如果有一个1MB显存、256色的显示卡,这极有可能就是你的X服务器的视件。它代表一种具有读/写颜色表的颜色显示。像素只对单个颜色表索引。 GDK_VISUAL_TRUE_COLOR:是带三个只读颜色表的颜色显示,红、绿、蓝每种颜色有一个颜色表。一个像素包含三个索引,每个颜色表一个。在像素值和RGB三元组之间有固定的数学关系,可以用下面的公式从[0,255]间的红、绿、蓝值获取像素值: gulongpixel=(gulong)(red*65536+green*256+blue)。 GDK_VISUAL_DIRECT_COLOR:是一种有三个读写颜色表的颜色显示。如果使用Gdk颜色处理例程,它们只是简单地填充所有三个颜色表以模拟真彩显示。 … Continue reading

Posted in Linux操作系统 | Tagged , , | 1 Comment | 编辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值