操作系统与网络实现 之八
来源:互联网 发布:jq遍历json数组 radio 编辑:程序博客网 时间:2024/05/29 14:30
颜色的生成
前面我们使用了一个值0x7ff,将此值填入显卡地址后显示的是一个蓝色的点,那么这个值是怎么来的呢?
色彩是由红、绿、蓝三色按不同配比而组成的.不同色彩的值经过一定形式组合后,会产生各种不同的色彩。
三种颜色的值从0到255,代表三色的强弱,分别对应值0x0 - 0xff。每种颜色是8位,三种颜色就占24位,但是我们的图形模式是16位颜色,其中r:g:b是按5:6:5占位,共16位,24位颜色需要转换成16位颜色,用以下方法转换:
r强度值0-255,也就是256种强度值,占八位
要换算成占五位值表示,其值范围0-31,也就是一共32种强度值,那么换算方法是r除以256再乘以32,
等于r除以8,相当于右移三位
g强度值0-255,也就是256种强度值,占八位
要换算成占六位值表示,其值范围0-63,也就是一共64种强度值,那么换算方法是g除以256再乘以64,
等于g除以4,相当于右移二位
b强度值0-255,也就是256种强度值,占八位
要换算成占五位值表示,其值范围0-31,也就是一共32种强度值,那么换算方法是b除以256再乘以32,
等于b除以8,相当于右移三位
函数实现如下:
// rgb合成函数
unsignedshort rgb_mix(unsignedchar r,unsignedchar g,unsignedchar b)
{
union{
unsignedint color;
struct{
unsignedchar b:5;
unsignedchar g:6;
unsignedchar r:5;
}sa;
}ua;
ua.sa.r= r>>3;
ua.sa.g= g>>2;
ua.sa.b= b>>3;
return ua.color;
}
其中g出现了跨字节现象,g的高三位与b组合成了高八位,g的低三位与r组合成了低八位。
一些人说不能跨字节,这是不对的。
编译中会出现警告:note: offset of packed bit-field 'g' has changed in GCC 4.4
可以使用-Wno-packed-bitfield-compat来禁止这个警告。
- 操作系统与网络实现 之八
- 操作系统与网络实现 之四
- 操作系统与网络实现 之五
- 操作系统与网络实现 之二
- 操作系统与网络实现 之六
- 操作系统与网络实现 之三
- 操作系统与网络实现 之七
- 操作系统与网络实现 之九
- 操作系统与网络实现 之十
- 操作系统与网络实现 之十一
- 操作系统与网络实现 之十二
- 操作系统与网络实现 之十三
- 操作系统与网络实现 之十四
- 操作系统与网络实现 之十五
- 操作系统与网络实现 之十六
- 操作系统与网络实现 之十七
- 操作系统与网络实现 之十八(甲)
- 操作系统与网络实现 之十八(乙)
- My First Blog Article
- C++反射机制的实现
- 静态方法+工厂方法(静态方法用途)
- [Android开发]WebView里改变浏览字体大小
- Category theory
- 操作系统与网络实现 之八
- hdoj Secrete Master Plan 5540 (矩阵翻转)
- C++ new 动态数组初始化
- 我的CSDN博客开通了,好激动!
- JS 提交form表单
- C语言/单片机基础训练之数据结构
- js提交form表单,并传递参数
- C++ 中的static关键字
- form表单的两种提交方式,submit和button的用法