视频子系统中构基本概念和常用数据结
视频子系统中构基本概念和常用数据结
视频子系统中基本概念:
1.坐标系统
SDL视频子系统的坐标系统,SDL坐标是以屏幕左上角作为坐标原点,x轴向右增长,y轴向下增长。象这样:
SDL坐标系统 |
这和我们以前知道的笛卡尔坐标系不一样,大家要牢记这一点。再者,SDL中任意一个表面(包括显示表面)的左上角是坐标原点,任意一个表面都用一个矩形来表示大小。
2. 像素(Pixel)
屏幕上一个个光点称为像素,是屏幕显示的最小单位,我们所说的屏幕分辨率1024*768,就是指一屏有个768行,每行有1024个像素。如果只显示黑白色,一个像素只需要0,1即可表示,但大多数情况下,屏幕不只显示黑白两色,而是可以显示各种颜色的图像,而每个图像都是由像素组成的,所以像素格式有多种,分别满足不同的显示需要,像素可以使用8bit、16bit、24bit、32bit来表示,这叫做bpp(bitsperpixel),即每像素的位数。
美术绘画一般使用红色、黄色和蓝色这三种原色生成不同的颜色,这些颜色就定义了一个色彩空间。和美术绘画有不一样,程序表示色彩空间虽也用三种分量,但使用红色、绿色和蓝色,也就是常称的RGB三基色。
SDL中一个像素也是由三基色:红色(R)、绿色(G)、蓝色(B)来表示,有的还要加上一个alpha,像素有直接色和间接色两种格式,如下图所示。
像素其结构有两种:一种是由uint32_t类型32位值;第二种是由SDL_PixelFormat结构来表示,这个结构可以保存从uint32_t位值解析出的RGB值。
直接色 |
通常每个像素有16位或24位 | |
间接色 |
通常每个像素有8位 |
8位像素格式是一种间接色,使用一个调色板查询颜色值,调色板也就是Look-Up Table,8位可以表示256中颜色,所以调色板里有256种颜色。
高于8位的像素格式使用的是直接色,不用调色板,也称真彩色。我们以16位和32位为例看一下如何用一个整数表示像素的颜色值。
第一种像素格式,16位像素结构如下图所示。
0-4位是蓝色,5-10位是绿色,11-16位是红色,如果你想显示一个红色的点,则只需将0-10位置0,11-16位置1得到:1111 1000 0000 0000 b
这个数就是十进制整数63488,十六进制数是 F800。
32位像素结构如下图所示。
其中,A代表alpha,用户在位块传输时的像素融合。 |
第二种像素结构我们在下面详述。
3. 显示屏幕
屏幕是由一些列像素点组成的,我们假定屏幕尺寸是640*480,这也就是说屏幕垂直方向有480行,水平方向每行有640个像素点,所以屏幕是由像素点组成二维显示区域。行和列都从0开始。
屏幕像素格式 |
所以屏幕上显示的图像,无非就是指定某些点的颜色,有这些点组成一幅图像,我们就可以看到了,每个像素的地址和像素格式都有专门的数据结构表示,我们将在下面详述。
在SDL中常常会见到很多C语言中没有的数据结构,常用的有:
1. 基本值类型
1 基本数据结构 |
|
Uint8 |
8 bits 正整数: 0 ~ 255 |
Sint8 |
8 bits整数: -128 ~ 127 |
Uint16 |
16 bits 正整数: 0 ~ 65535 |
Sint16 |
16 bits整数: -32768 ~ 32767 |
Uint32 |
32 bits 正整数: 0 ~ 232 – 1 |
Sint32 |
32 bits整数: - 231 ~ 231 – 1 |
2. SDL_Rect
SDL_Rect描述的是一个矩形结构,在视频子系统中,屏幕上显示的任何一个图片的位置都是用一个矩形来表示的,这个结构是视频子系统中用的最多的结构,其定义如下:
2 SDL_Rect结构描述 | |
typedef struct{
Sint16 x, y; // 矩形左上角座标 Uint16 w, h; // 宽度与高度 } SDL_Rect; |
SDL_Rect描述的矩形和屏幕是平行的,下面图显示了SDL_Rect能够描述的矩形和不能描述的矩形
3. SDL_Color
SDL颜色使用自定义的结构体表示:
SDL_Color描述一个像素点颜色信息,任何一个像素点颜色都可以用RGB来描述。其中,R、G、B的取值为0-255。
typedef struct{
Uint8 r; //红色信息部分(范围0-255)
Uint8 g; //绿色信息部分(范围0-255)
Uint8 b; //蓝色信息部分(范围0-255)
Uint8 unused;//保留
} SDL_Color;
4. SDL_Surface
SDL_Surface是绘图表面的存储结构,代表一块图形内存。
typedef struct SDL_Surface {
Uint32 flags; /* 只读 */
SDL_PixelFormat *format; /* 只读 */
int w, h; /* 只读 */
Uint16 pitch; /* 只读 */
void *pixels; /* 可读写 */
SDL_Rect clip_rect; /* 只读 剪切矩形*/
int refcount; /* 只读 引用计数--用于释放表面 */
} SDL_Surface;
其中,flags是位标,其值为下列常量:
SDL_SWSURFACE | 使用内存构建表面 |
SDL_HWSURFACE | 在显存内构建表面 |
SDL_ASYNCBLIT | 异步传输表面 |
SDL_ANYFORMAT | 允许任何像素模式 (只用于显示表面) |
SDL_HWPALETTE | 表面有单独的调色板 |
SDL_DOUBLEBUF | 双缓冲 (只用于显示表面) |
SDL_FULLSCREEN | 全屏 (只用于显示表面) |
SDL_OPENGL | 使用OpenGL(只用于显示表面) |
SDL_OPENGLBLIT | 支持OpenGL位块传输 (只用于显示表面) |
SDL_RESIZABLE | 可变表面(只用于显示表面) |
SDL_HWACCEL | 硬件加速位块传输 |
SDL_SRCCOLORKEY | 可以使用透明位块传输 |
SDL_RLEACCEL | 使用RLE加速透明位块传输 |
SDL_SRCALPHA | 使用alpha混合位块传输 |
SDL_PREALLOC | 允许预先分配内存 |
format指表面的像素格式,像素格式在下面将有详细描述。
w、h指表面宽度和高度。
pitch指每行像素所占字节数,如果每个像素占2字节,每行有640个像素,则pitch值为1280字节。
pixels是指向组成表面的像素的数组的指针。如果是8-bit像素格式,你可以将它转换成Uint8*访问。
clip_rect是位图传送(blit)时用来裁剪区域,如果你需要显示表面的一部分,可以用剪切矩形来传输这一部分内容。
refcount 引用计数,一个表面可能被多个对象引用,那么什么时候可以释放它呢,我们可以这样做,每引用一次refcount的值加1,每释放一次引用计数减1,当引用计数为0,这是可以free它。
5. SDL_PixelFormat
SDL_PixelFormat是从uint32_t位值解析出的结构,是SDL_Surface结构中一个字段。
像素结构 |
typedef struct{ SDL_Palette *palette; //调色盒指针 Uint8 BitsPerPixel; //每个像素所占二进制位数,通常是8、16、24、32 Uint8 BytesPerPixel;//每个像素所占字节数,通常为1、2、3、4 Uint32 Rmask, Gmask, Bmask, Amask;//二进制掩码 Uint8 Rshift, Gshift, Bshift, Ashift;偏移量 Uint8 Rloss, Gloss, Bloss, Aloss;//损失数 Uint32 colorkey;//透明像素的像素值 Uint8 alpha;//alpha值 } SDL_PixelFormat; |
如果BitsPerPixel为8,则调色板palette不为空,其他成员的值都是0,也就是说将使用间接色(8bit)表示一个点。否则,调色板为空,其他成员不为空。