视频子系统中构基本概念和常用数据结

 视频子系统中构基本概念和常用数据结  

  视频子系统中基本概念:

   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)表示一个点。否则,调色板为空,其他成员不为空。

posted @ 2012-05-08 17:28  成少雷  阅读(2244)  评论(0编辑  收藏  举报