vs2008\drivers\opengl2.h.c 模拟灰色320*320屏幕

/****OpenGL模拟320*320灰色显示屏****/
/***************************************************************************************************
                                    OpenGL模拟320*320灰色显示屏
文 件 名: opengl2.h
说    明: 将opengl改为了灰色显示
***************************************************************************************************/
#ifndef __OPENGLLCD2__H
#define __OPENGLLCD2__H
/**************************************************************************************************/
#ifndef u16
    #define u16 unsigned short                  //数据长度。
#endif
#ifndef u32
    #define u32 unsigned int                    //数据长度。
#endif
#ifndef u8
    #define u8 unsigned char                    //数据长度。
#endif
    #define X_SIZE 320
    #define Y_SIZE 320
#define GL2_FREASH_TIME()    Sleep(1)           //屏幕刷新时间间隔 1000/1/10=100Hz 建议不要改次设置
//**************************************************************************************************
extern  u16 Gl2DisBuff[Y_SIZE][X_SIZE];          //显存区。向此写入数据即可改变颜色.与显示屏的接口。
/***************************************************************************************************
                                    颜色定义
***************************************************************************************************/
#define COLOUR_CLEAR2 0                         //初始化颜色
void    Gl2DisPoint(u32 x,u32 y, u8 Color);
u16     Gl2DisPointGet(u32 x,u32 y);
void    Gl2DisClear(void);
void    GlDisHB(void);
/***************************************************************************************************
                                    功能函数
***************************************************************************************************/
void    Gl2Init(void);                          //初始化后即会创建2个windows线程,以运行GL。
//----------------------------------显示------------------------------------------------------------
void    Gl2DisTset(void);                       //测试
/**************************************************************************************************/
#endif

/***************************************************************************************************
                                    OpenGL模拟320*320灰色显示屏
文 件 名: opengl2.c
编译环境:VS2008 win C/C++控制台空项目
注    意:不能与opengl一起使用 在opengl上改进
编    者:张永辉 2013年9月3日
***************************************************************************************************/
#include<Windows.h>
#include<process.h>                     //_beginthread
#include <GL\glut.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut32.lib")
#include "opengl2.h"
/**************************************************************************************************/
//静态变量
static u32   FreshFlg = 0;
static const GLint      ImageWidth =X_SIZE;         //使用OpenGL的GLint类型,它是32位的。
static const GLint      ImageHeight=Y_SIZE;
static GLint            ImagelLength;               //图像缓冲占的字节长度
static GLubyte*         ImageDataP2;                //图像缓冲区指针更改该区域的值即可改变图像
static u32              SysTimeMs;                  //记录系统开机以来运行了的时间。与GL_FREASH_TIME相关
static int              TouchADx;                   //使用鼠标按下模拟触摸屏
static int              TouchADy;
u16     Gl2DisBuff[Y_SIZE][X_SIZE];                 //显存区 每个字(16bit)表示一个颜色,0==白 1==黑
int  static IsGlTaskDisBuffCopyOK = 0;              //指示该任务已经开始工作了
u16     Gl2DisBuff[Y_SIZE][X_SIZE];                 //显存区 160*160个点==160*160 byte  ==1时亮 ==0时不亮
//两个任务
void static Gl2TaskStart (void * arg);
void static Gl2TaskDisBuffCopy(void * arg);
/***************************************************************************************************
                                任务函数:GlTaskStart
任务:GL将内存的颜色显示到显示屏
***************************************************************************************************/
void Opengl2Test(void)
{
    while(1)
    {
        GL2_FREASH_TIME();
        Sleep(1000);
        Gl2DisClear();
        Sleep(1000);
        GlDisHB();
    }
}
//显示黑白相间的图像,用于测试
void GlDisHB(void)
{
    int x = 0;
    int y = 0;
    for(x = 0;x < X_SIZE/3; x++)
    {
        for(y = 0;y <= Y_SIZE;y++)
        {
            Gl2DisPoint(x,y,0);
        }
    }
    for(x = X_SIZE/3; x < 2*X_SIZE/3; x++)
    {
        for(y = 0;y <= Y_SIZE;y++)
        {
            Gl2DisPoint(x,y,1);
        }
    }
    for(x = 2*X_SIZE/3; x < X_SIZE; x++)
    {
        for(y = 0;y <= Y_SIZE;y++)
        {
            Gl2DisPoint(x,y,0);
        }
    }
}
/***************************************************************************************************
                                    初始化函数
***************************************************************************************************/
void Gl2Init(void)
{
    static u32 flg;
    u32 x , y;

    //防止重复初始化
    if(flg)
    {
        return;
    }
    flg = 1;
    //--------------------显示屏初始化----------------------
    //给背景色
    for(y = 0; y < Y_SIZE ; y++)
    {
        for(x = 0; x < X_SIZE ; x++)
        {
            Gl2DisBuff[y][x] = COLOUR_CLEAR2;
        }
    }
    //任务:GL将显存的颜色显示到显示屏
    //      设置键盘按键回调函数
    _beginthread(Gl2TaskStart,0,NULL);

    //任务:将GlDisBuff的颜色刷新到显存
    _beginthread(Gl2TaskDisBuffCopy,0,NULL);

    while(IsGlTaskDisBuffCopyOK==0)
    {
        Sleep(1);
    }
    Sleep(1000);
}
/***************************************************************************************************
                                    功能函数集
***************************************************************************************************/
//----------------------------------显示------------------------------------------------------------
//函数功能:清屏
void Gl2DisClear(void)
{
    u32 x , y;
    for(y = 0; y < Y_SIZE ; y++)
    {
        for(x = 0; x < X_SIZE ; x++)
        {
            Gl2DisBuff[y][x] = 0;
        }
    }
}
//函数功能:在屏幕上画点
//      x :    x坐标位置 0... X_SIZE-1
//      y :    y坐标位置 0... Y_SIZE-1
//      C :    ==0 or ==1黑色
//坐 标 系:左上角(0,0)  右下角(X_SIZE,Y_SIZE)
void    Gl2DisPoint(u32 x,u32 y, u8 Color)
{
    if(x >= X_SIZE || y >= Y_SIZE)
    {
        return;
    }
    Gl2DisBuff[y][x] = Color;
}
u16   Gl2DisPointGet(u32 x,u32 y)
{
    if(x >= X_SIZE || y >= Y_SIZE)
    {
        return 0;
    }
    if(Gl2DisBuff[y][x]==0)
    {
        return 0;
    }
    return 1;
}
/***************************************************************************************************
                                任务函数:GlTaskDisBuffCopy
任务:将GlDisBuff的颜色刷新到显存
***************************************************************************************************/
void static Gl2TaskDisBuffCopy(void * arg)
{
    GLint post,ypost;
    GLubyte fr,fg,fb;
    u32 x , y;
    //u16 Color;
    arg = arg;
    //等待 GlTaskStart() 给ImageDataP分配储存空间后才能对ImageDataP操作。
    GL2_FREASH_TIME();
    GL2_FREASH_TIME();

    while(1)
    {
        //决定刷新频率
        GL2_FREASH_TIME();
        SysTimeMs++;
        if (SysTimeMs%10 != 0)
        {
            continue;
        }
        //把颜色从GlDisBuff复制到ImageDataP
        for(y = 0; y < Y_SIZE ; y++)
        {
            ypost = (Y_SIZE-1-y)*X_SIZE;    //计算y坐标
            for(x = 0; x < X_SIZE ; x++)
            {
                //颜色变换 将565变成24位模式
                /*Color = Gl2DisBuff[y][x];
                fr = (GLubyte)((Color >> 8)|(0x07));
                fg = (GLubyte)((Color >> 3)|(0x03));
                fb = (GLubyte)((Color << 3));*/

                if(Gl2DisBuff[y][x]!=0)
                {
                    fr = 35;            //黑
                    fg = 40;
                    fb = 30;
                }else
                {
                    fr = 235;           //白
                    fg = 240;
                    fb = 230;
                }
                //坐标变换 ImageDataP坐标是:按笛卡尔坐标系的第一象限,x=[0 ... X_SIZE-1]  y=[0 ... Y_SIZE-1]
                post = (ypost + x)*3;
                //向缓冲区写入一个点的颜色
                ImageDataP2[post]   = fr;    //R
                ImageDataP2[post+1] = fg;    //G
                ImageDataP2[post+2] = fb;    //B
            }
        }
        FreshFlg = 1;                       //与GlTaskStart()任务保持同步
        IsGlTaskDisBuffCopyOK = 1;
    }
}
/***************************************************************************************************
                                任务函数:GlTaskStart
任务:GL将内存的颜色显示到显示屏
***************************************************************************************************/
void static GL2_Display(void);       //显示处理回调函数
void static GL2_Idle(void);          //CPU空闲时自动回调用的函数
//--------------------------------------------------------------------------------------------------
//函数功能:GL任务
void static Gl2TaskStart (void * arg)
{
    arg = arg;
    //-------------------图形配置---------------------------
    //计算图像大小
    ImagelLength = ImageWidth *  3;                 //每个像素3字节
    while(  ImagelLength % 4 != 0 )                 //修正LineLength使其为4的倍数
    {
        ++ImagelLength;                             //每一行像素数据的长度若不是4的倍数则填充数据使它是4的倍数
    }
    ImagelLength *=  ImageHeight;                   //PixelLength = ImageWidth*3*ImageHeight

    //申请图像缓冲区
    ImageDataP2 = (GLubyte*)malloc(ImagelLength);

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);    //修改了参数为GLUT_DOUBLE
    glutInitWindowPosition(100+500, 100);
    glutInitWindowSize(X_SIZE,  Y_SIZE);
    glutCreateWindow("COG模拟器");                      //窗口标题
    glutDisplayFunc(&GL2_Display);
    glutIdleFunc(&GL2_Idle);                         //新加入了这句
    FreshFlg = 1;
    //------------------按键配置----------------------------
    //glutKeyboardFunc(GlKeyCallBacdk);               //设置回调函数即可
    //------------------鼠标配置----------------------------
    //glutPassiveMotionFunc(GlMouseMoveCallBack);     //鼠标位置跟踪
    //glutMotionFunc(GlMouseClickMoveCallBack);       //鼠标位置跟踪 有按下后
    //glutMouseFunc(GlMouseClickCallBack);            //鼠标按下,放开
    //-------------------配置完成---------------------------
    glutMainLoop();
    free(ImageDataP2);

    while (1)
    {
        GL2_FREASH_TIME();
    }
}
void static GL2_Display(void)
{
    //glClear(GL_COLOR_BUFFER_BIT);//可以不要清屏,因为每次绘制时,画面都覆盖整个屏幕
    //绘制像素
    glDrawPixels(ImageWidth, ImageHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE,ImageDataP2);
    //完成绘制
    glutSwapBuffers();
}
void static GL2_Idle(void)
{
    //在CPU空闲时调用. 在这里可以添加程序,使扫描速度降低。
    if(FreshFlg == 0)
    {
        return;
    }
    FreshFlg = 0;
    GL2_Display();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值