zoukankan      html  css  js  c++  java
  • 视频子系统中构基本概念和常用数据结

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

      视频子系统中基本概念:

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

  • 相关阅读:
    SpringCloud高可用和高并发
    时间重要性,我们需要如何利用极致
    Spring是什么 包括SpringBean SpringMVC SpringBoot SpringCloud
    Java 线程的基本使用
    JVM 内存模型
    Java 8 ArrayList 详解
    Java 8 HashMap 源码解析
    Docker 运行 MySQL,使用 docker-compose
    Spring Boot 主从读写分离
    Spring Boot 整合 MyBatis 实现乐观锁和悲观锁
  • 原文地址:https://www.cnblogs.com/landmark/p/2486033.html
Copyright © 2011-2022 走看看