⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grtry.c

📁 如何编写自己的图形开发包 利用tc2.0在DOS下编写一个功能完整的图形开发包。并有详细浅显的文章耐心逐步讲解。
💻 C
字号:
#include "MyType.h"
#include "GrTry.h"

/* 设置好寄存器,并完成初始化   */
void SetSVGAMode(INT16 vmode)
{
    switch (vmode)                      /* 记录当前的分辨率     */                      
    {
        case TRY320X200X256:
            COLS = 320;
            ROWS = 200;
            break;

        case TRY640X480X256:
            COLS = 640;
            ROWS = 480;
            break;

        case TRY800X600X256:
            COLS = 800;
            ROWS = 600;
            break;

        case TRY1024X768X256:
            COLS = 1024;
            ROWS = 768;
            break;
    }


    _AX = 0x4f02;           
    _BX = vmode;
    __int__(0x10);          
}

/* 获取当前模式         */
INT16 GetSVGAMode()         
{
    _AX = 0x4f03;
    __int__(0x10);

    return _BX;
}

/* 画点函数         */
void Dot(INT16 x, INT16 y, UINT8 color)
{
    static  UINT8 OldPage = 0;
    UINT32  PageAll1, PageAll2;
    UINT8   NewPage;

    if (x > -1 && x < COLS && y > -1 && y < ROWS)
    {
        PageAll1 = PageAll2 = (UINT32)y*(UINT32)COLS+(UINT32)x;
        NewPage = PageAll1 >> 16;
        if (NewPage != OldPage)
        {
            OldPage = NewPage;
            SelectPage(NewPage);
        }

        VideoBuffer[PageAll2] = color;
    }
}

/* 图形初始化       */
void InitSVGA()
{
    OldSMode = GetSVGAMode();
}


/* 回到原来模式     */
void ExitSVGA()
{
    SetSVGAMode(OldSMode);
}

/* 换页函数         */
void SelectPage(register UINT8 page)
{
    _BX = 0;
    _DX = page;
    _AX = 0x4f05;
    __int__(0x10);
}

/* 画线函数         */
void Line(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 color)
{
    INT32   dx;                         /* 直线x轴差值变量                              */
    INT32   dy;                         /* 直线y轴差值变量                              */
    INT8    dx_sym;                     /* x轴增长方向,为-1时减值方向,为1时增值方向   */
    INT8    dy_sym;                     /* y轴增长方向,为-1时减值方向,为1时增值方向   */
    INT32   dx_x2;                      /* dx*2值变量,用于加快运算速度                 */
    INT32   dy_x2;                      /* dy*2值变量,用于加快运算速度                 */
    INT32   di;                         /* 决策变量                                     */

    if (x0 == x1)                       /* 画垂直线                                     */
    {
        if (y0 > y1)
        {
            dx = y0;
            y0 = y1;
            y1 = dx;
        }
        for (dx = y0; dx < y1+1; dx++)
        {
            Dot(x0, dx, color);
        }

        return ;
    }
    
    if (y0 == y1)                       /* 画水平线                                     */
    {
        if(x0 > x1)
        {
            dy = x0;
            x0 = x1;
            x1 = dy;
        }
        for (dy = x0; dy < x1+1; dy++)
        {
            Dot(dy, y0, color);
        }

        return;
    }

                                        /* 画斜线                   */
    dx = x1-x0;                         /* 求取两点之间的差值       */          
    dy = y1-y0;
    if (dx > 0)                         /* 判断x轴方向              */
    {  
        dx_sym = 1;                     /* dx>0,设置dx_sym=1       */
    }
    else
    {  
        if (dx < 0)
        {  
            dx_sym = -1;                /* dx<0,设置dx_sym=-1      */
        }
    }
   
    if (dy > 0)                         /* 判断y轴方向              */
    {  
        dy_sym = 1;                     /* dy>0,设置dy_sym=1       */
    }
    else
    {  
        if (dy < 0)
        {  
            dy_sym = -1;                /* dy<0,设置dy_sym=-1      */
        }
    }
    
                                
    dx = dx_sym * dx;                   /* 将dx、dy取绝对值         */
    dy = dy_sym * dy;                       
    dx_x2 = dx*2;                       /* 计算2倍的dx及dy值        */
    dy_x2 = dy*2;
   
                                        /* 使用Bresenham法进行画直线    */
    if (dx >= dy)                       /* 对于dx>=dy,则使用x轴为基准  */
    {  
        di = dy_x2 - dx;
        while(x0!=x1)
        {  
            Dot(x0, y0, color);
            x0 += dx_sym;
            if (di < 0)
            {  
                di += dy_x2;            /* 计算出下一步的决策值         */
            }
            else
            {  
                di += dy_x2 - dx_x2;
                y0 += dy_sym;
            }
        }
        Dot(x0, y0, color);             /* 显示最后一点                 */
   }
   else                                 /* 对于dx<dy,则使用y轴为基准   */
   {  
        di = dx_x2 - dy;
        while(y0!=y1)
        {  
            Dot(x0, y0, color);
            y0 += dy_sym;
            if (di < 0)
            {
                di += dx_x2;
            }
            else
            {
                di += dx_x2 - dy_x2;
                x0 += dx_sym;
            }
        }
        Dot(x0, y0, color);             /* 显示最后一点                 */
   } 
}

/* 画矩形函数       */
void Rect(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 color)
{
    INT16   i;

    if (x0 > x1)
    {   
        i = x0;
        x0 = x1;
        x1 = i;
    }
    if (y0 > y1)
    {   
        i = y0;
        y0 = y1;
        y1 = i;
    }
    
    for (i = x0; i < x1+1; i++)
    {
        Dot(i, y0, color);
        Dot(i, y1, color);
    }
    
    for (i = y0; i < y1+1; i++)
    {
        Dot(x0, i, color);
        Dot(x1, i, color);
    }
}

/* 画矩形块函数     */
void Rectfill(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 color)
{
    INT16   i, j;

    if (x0 > x1)
    {   
        i = x0;
        x0 = x1;
        x1 = i;
    }
    if (y0 > y1)
    {   
        i = y0;
        y0 = y1;
        y1 = i;
    }

    for(i = y0; i < y1+1; i++)
    {
        for(j = x0; j < x1+1; j++)
        {
            Dot(j, i, color);
        }
    }
}

/* 画圆函数         */
void Circle(INT16 x1, INT16 y1, UINT16 r, UINT8 color)
{
    INT16   x, y, d;
    x = 0;
    y = r;
    d = 1-r;                    /* 计算初始值                                           */

    while (x <= y)
    {
                                /* 绘制点(x,y)及其在八分圆中的另外7个对称点             */
        Dot(x1+x, y1+y, color);
        Dot(x1+y, y1+x, color);
        Dot(x1-y, y1+x, color);
        Dot(x1-x, y1+y, color);
        Dot(x1-x, y1-y, color);
        Dot(x1-y, y1-x, color);
        Dot(x1+y, y1-x, color);
        Dot(x1+x, y1-y, color);

        if (d < 0)
        {
            d += 2*x+3;         /* 根据误差项d的判断,决定非最大位移方向上是走还是不走   */
        }
        else
        {
            d += 2*(x-y)+5;
            y--;
        }
        x++;
    }
}

/* 画实心圆函数         */
void Circlefill(INT16 x1, INT16 y1, UINT16 r, UINT8 color)
{
    INT16   i, x, y, d;
    x = 0;
    y = r;
    d = 1-r;                    /* 计算初始值                                           */

    while (x <= y)
    {
                                /* 绘制点(x,y)及其在八分圆中的另外7个对称点             */
        Line(x1+x, y1+y, x1-x, y1+y, color);
        Line(x1+x, y1-y, x1-x, y1-y, color);
        Line(x1+y, y1+x, x1-y, y1+x, color);
        Line(x1+y, y1-x, x1-y, y1-x, color);


        if (d < 0)
        {
            d += 2*x+3;         /* 根据误差项d的判断,决定非最大位移方向上是走还是不走   */
        }
        else
        {
            d += 2*(x-y)+5;
            y--;
        }
        x++;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -