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

📄 grtry.c

📁 如何编写自己的图形开发包 利用tc2.0在DOS下编写一个功能完整的图形开发包。并有详细浅显的文章耐心逐步讲解。
💻 C
📖 第 1 页 / 共 2 页
字号:

        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++;
    }
}


/* 设置调色板       */
/* 0 失败           */
/* 1 成功           */
UINT8 SetSVGAPalette(INT8 *FillName)
{
    INT16   fp;
    INT16   i, j;
    UINT8   Buffer[768];
    RGBQUAD bmiColors[256];
    struct  REGPACK reg;

    if ((fp = open(FillName, O_RDONLY|O_BINARY)) == -1)
    {
        printf("can't open the file!");
        getch();
        return 0;
    }



    /*----------以下为设置调色板信息----------*/
    lseek(fp, 54L, SEEK_SET);
    if (read(fp, (char *)bmiColors, 1024) != 1024)  /* 读当前图片调色板数据     */
    {
        printf("Can't get palette !\n");
        close(fp);
        getch();
        return 0;
    }
    close(fp);

    
    SetSVGAPaletteKey = 1;                  /* 标记为设置过调色板   */
    for (i = 0, j = 0; i < 256; ++i, j +=3) /* 拼凑信息 */
    {
        Buffer[j] = bmiColors[i].b >> 2;
        Buffer[j + 1] = bmiColors[i].g >> 2;
        Buffer[j + 2] = bmiColors[i].r >> 2;
    }
    reg.r_ax = 0x1012;
    reg.r_bx = 0;
    reg.r_cx = 256;
    reg.r_es = FP_SEG(Buffer);
    reg.r_dx = FP_OFF(Buffer);
    intr(0x10, &reg);                       /* 使用中断完成设置     */

    return 1;
}



/* 显示位图函数     */
void ShowBmp(INT8 *FillName)
{
    INT16   fp;
    INT16   i, j;
    UINT32  Width, Height, Linebytes;
    UINT8   Buffer[1024];


    if ((fp = open(FillName, O_RDONLY|O_BINARY)) == -1)
    {
        printf("can't open the file!");
        getch();
        return;
    }
    lseek(fp, 18L, SEEK_SET);       /* 读取文件宽高     */
    read(fp, &Width, 4);
    read(fp, &Height, 4);


    /* 若尺寸不对 */
    if ((Width != COLS) || (Height != ROWS))
    {
        printf("the bmp size wrong!");
        close(fp);
        getch();
        return;  
    }



    if (Width%4)                    /* 拼凑4字节倍数    */
    {
        Linebytes = Width+(4-Width%4);
    }
    else
    {
        Linebytes = Width;
    }


    /*----------以下为设置调色板信息----------*/
    if (!SetSVGAPaletteKey)
    {
        if (!SetSVGAPalette(FillName))
        {
            printf("can't Set the Palette!");
            close(fp);
            getch();
            return;
        }
    }


    lseek(fp, 1078L, SEEK_SET);     /* 开始读取图形数据 */
    switch (COLS+ROWS)
    {
        case 320+200: SelectPage(0); break;
        case 640+480: SelectPage(4); break;
        case 800+600: SelectPage(7);break;
        /*case 1024+768: SelectPage(11); break;*/
    }


    for (i = Height-1; i >= 0; i--)
    {
        read(fp, Buffer, Linebytes);/* 一次读取一行     */


        if ((COLS+ROWS) == (320+200))
        {
            movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(320*i)), FP_OFF(VideoBuffer+(320*i)), 320);
        }



        if ((COLS+ROWS) == (640+480))
        {
            switch (i)
            {
                case 102:
                    movedata(FP_SEG(Buffer+256), FP_OFF(Buffer+256), FP_SEG(VideoBuffer+(640*i)+256), FP_OFF(VideoBuffer+(640*i)+256), 384);
                    SelectPage(0);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 256);
                    break;

                case 204:
                    movedata(FP_SEG(Buffer+512), FP_OFF(Buffer+512), FP_SEG(VideoBuffer+(640*i)+512), FP_OFF(VideoBuffer+(640*i)+512), 128);
                    SelectPage(1);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 512);
                    break;

                case 307:
                    movedata(FP_SEG(Buffer+128), FP_OFF(Buffer+128), FP_SEG(VideoBuffer+(640*i)+128), FP_OFF(VideoBuffer+(640*i)+128), 512);
                    SelectPage(2);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 128);
                    break;

                case 409:
                    movedata(FP_SEG(Buffer+384), FP_OFF(Buffer+384), FP_SEG(VideoBuffer+(640*i)+384), FP_OFF(VideoBuffer+(640*i)+384), 256);
                    SelectPage(3);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 384);
                    break;

                default:
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), Linebytes);
            }
        }



        if ((COLS+ROWS) == (800+600))
        {
            switch (i)
            {
                case 81:
                    movedata(FP_SEG(Buffer+736), FP_OFF(Buffer+736), FP_SEG(VideoBuffer+(800*i)+736), FP_OFF(VideoBuffer+(800*i)+736), 64);
                    SelectPage(0);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(800*i)), FP_OFF(VideoBuffer+(800*i)), 736);
                    break;

                case 163:
                    movedata(FP_SEG(Buffer+672), FP_OFF(Buffer+672), FP_SEG(VideoBuffer+(800*i)+672), FP_OFF(VideoBuffer+(800*i)+672), 128);
                    SelectPage(1);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(800*i)), FP_OFF(VideoBuffer+(800*i)), 672);
                    break;

                case 245:
                    movedata(FP_SEG(Buffer+608), FP_OFF(Buffer+608), FP_SEG(VideoBuffer+(800*i)+608), FP_OFF(VideoBuffer+(800*i)+608), 192);
                    SelectPage(2);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(800*i)), FP_OFF(VideoBuffer+(800*i)), 608);
                    break;

                case 327:
                    movedata(FP_SEG(Buffer+544), FP_OFF(Buffer+544), FP_SEG(VideoBuffer+(800*i)+544), FP_OFF(VideoBuffer+(800*i)+544), 256);
                    SelectPage(3);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(800*i)), FP_OFF(VideoBuffer+(800*i)), 544);
                    break;


                case 409:
                    movedata(FP_SEG(Buffer+480), FP_OFF(Buffer+480), FP_SEG(VideoBuffer+(800*i)+480), FP_OFF(VideoBuffer+(800*i)+480), 320);
                    SelectPage(4);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(800*i)), FP_OFF(VideoBuffer+(800*i)), 480);
                    break;


                case 491:
                    movedata(FP_SEG(Buffer+416), FP_OFF(Buffer+416), FP_SEG(VideoBuffer+(800*i)+416), FP_OFF(VideoBuffer+(800*i)+416), 384);
                    SelectPage(5);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(800*i)), FP_OFF(VideoBuffer+(800*i)), 416);
                    break;
            
                case 573:
                    movedata(FP_SEG(Buffer+352), FP_OFF(Buffer+352), FP_SEG(VideoBuffer+(800*i)+352), FP_OFF(VideoBuffer+(800*i)+352), 448);
                    SelectPage(6);
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(800*i)), FP_OFF(VideoBuffer+(800*i)), 352);
                    break;
                
                default:
                    movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(800*i)), FP_OFF(VideoBuffer+(800*i)), Linebytes);
            }
        }

        if ((COLS+ROWS) == (1024+768))
        {
            if ((i+1)%64 == 0) SelectPage(i/64);
            movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(1024*i)), FP_OFF(VideoBuffer+(1024*i)), Linebytes);
        }

    }

    /*
        81.92   736
        163.84  672
        245.76  608
        327.68  544
        409.6   480
        491.52  416
        573.44  352
    */
    close(fp);
}

⌨️ 快捷键说明

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