lcd.c

来自「Cirrus Logic EP7312处理器部分控制程序。」· C语言 代码 · 共 708 行 · 第 1/2 页

C
708
字号
//****************************************************************************
//
// LCD.C - General drawing routines.
//
// Copyright (c) 1998-2001 Cirrus Logic, Inc.
//
//****************************************************************************
#include "lib7312.h"
#include "font.h"

//****************************************************************************
//
// LCDLine and LCDColorLine draw a line from (lX1, lY1) to (lX2, lY2).  This
// is an implementation of Bresenham's line drawing algorithm; for details,
// see any reputable graphics book.
//
//****************************************************************************
void
LCDLine(long lX1, long lY1, long lX2, long lY2, char cColor)
{       
    long lX, lY, lXend, lYend, lDx, lDy, lD, lXinc, lYinc, lIncr1, lIncr2;

    lDx = lX2 > lX1 ? lX2 - lX1 : lX1 - lX2;
    lDy = lY2 > lY1 ? lY2 - lY1 : lY1 - lY2;
    
    if(lDx >= lDy)
    {
        if(lX1 > lX2)
        {
            lX = lX2;
            lY = lY2;
            lXend = lX1;

            if(lDy == 0)
            {
                lYinc = 0;
            }
            else
            {
                if(lY2 > lY1)
                {
                    lYinc = -1;
                }
                else
                {
                    lYinc = 1;
                }
            }
        }
        else
        {
            lX = lX1;
            lY = lY1;
            lXend = lX2;

            if(lDx == 0)
            {
                lYinc = 0;
            }
            else
            {
                if(lY2 > lY1)
                {
                    lYinc = 1;
                }
                else
                {
                    lYinc = -1;
                }
            }
        }

        lIncr1 = 2 * lDy;
        lD = lIncr1 - lDx;
        lIncr2 = 2 * (lDy - lDx);

        LCDSetPixel(lX, lY, cColor);

        while(lX < lXend)
        {
            lX++;

            if(lD < 0)
            {
                lD += lIncr1;
            }
            else
            {
                lY += lYinc;      
                lD += lIncr2;
            }

            LCDSetPixel(lX, lY, cColor);
        }
    }
    else
    {
        if(lY1 > lY2)
        {
            lX = lX2;
            lY = lY2;
            lYend = lY1;

            if(lDx == 0)
            {
                lXinc = 0;
            }
            else
            {
                if(lX2 > lX1)
                {
                    lXinc = -1;
                }
                else
                {
                    lXinc = 1;
                }
            }
        }
        else
        {
            lX = lX1;
            lY = lY1;
            lYend = lY2;

            if(lDx == 0)
            {
                lXinc = 0;
            }
            else
            {
                if(lX2 > lX1)
                {
                    lXinc = 1;
                }
                else
                {
                    lXinc = -1;
                }
            }
        }

        lIncr1 = 2 * lDx;
        lD = lIncr1 - lDy;
        lIncr2 = 2 * (lDx - lDy);

        LCDSetPixel(lX, lY, cColor);

        while(lY < lYend)
        {
            lY++;

            if(lD < 0)
            {
                lD += lIncr1;
            }
            else
            {
                lX += lXinc;
                lD += lIncr2;
            }

            LCDSetPixel(lX, lY, cColor);
        }
    }
}

void
LCDColorLine(long lX1, long lY1, long lX2, long lY2, CPixel sColor)
{       
    long lX, lY, lXend, lYend, lDx, lDy, lD, lXinc, lYinc, lIncr1, lIncr2;

    lDx = lX2 > lX1 ? lX2 - lX1 : lX1 - lX2;
    lDy = lY2 > lY1 ? lY2 - lY1 : lY1 - lY2;
    
    if(lDx >= lDy)
    {
        if(lX1 > lX2)
        {
            lX = lX2;
            lY = lY2;
            lXend = lX1;

            if(lDy == 0)
            {
                lYinc = 0;
            }
            else
            {
                if(lY2 > lY1)
                {
                    lYinc = -1;
                }
                else
                {
                    lYinc = 1;
                }
            }
        }
        else
        {
            lX = lX1;
            lY = lY1;
            lXend = lX2;

            if(lDx == 0)
            {
                lYinc = 0;
            }
            else
            {
                if(lY2 > lY1)
                {
                    lYinc = 1;
                }
                else
                {
                    lYinc = -1;
                }
            }
        }

        lIncr1 = 2 * lDy;
        lD = lIncr1 - lDx;
        lIncr2 = 2 * (lDy - lDx);

        LCDColorSetPixel(lX, lY, sColor);

        while(lX < lXend)
        {
            lX++;

            if(lD < 0)
            {
                lD += lIncr1;
            }
            else
            {
                lY += lYinc;      
                lD += lIncr2;
            }

            LCDColorSetPixel(lX, lY, sColor);
        }
    }
    else
    {
        if(lY1 > lY2)
        {
            lX = lX2;
            lY = lY2;
            lYend = lY1;

            if(lDx == 0)
            {
                lXinc = 0;
            }
            else
            {
                if(lX2 > lX1)
                {
                    lXinc = -1;
                }
                else
                {
                    lXinc = 1;
                }
            }
        }
        else
        {
            lX = lX1;
            lY = lY1;
            lYend = lY2;

            if(lDx == 0)
            {
                lXinc = 0;
            }
            else
            {
                if(lX2 > lX1)
                {
                    lXinc = 1;
                }
                else
                {
                    lXinc = -1;
                }
            }
        }

        lIncr1 = 2 * lDx;
        lD = lIncr1 - lDy;
        lIncr2 = 2 * (lDx - lDy);

        LCDColorSetPixel(lX, lY, sColor);

        while(lY < lYend)
        {
            lY++;

            if(lD < 0)
            {
                lD += lIncr1;
            }
            else
            {
                lX += lXinc;
                lD += lIncr2;
            }

            LCDColorSetPixel(lX, lY, sColor);
        }
    }
}

//****************************************************************************
//
// LCDCircle and LCDColorCircle draw a circle at the specified location.
// This is an implementation of Bresenham's circle drawing algorithm; for
// details, see any reputable graphics book.
//
//****************************************************************************
void
LCDCircle(long lX, long lY, long lRadius, char cColor)
{
    long lXpos, lYpos, lD;

    lXpos = 0;
    lYpos = lRadius;

    lD = 3 - (2 * lYpos);

    while(lYpos >= lXpos)
    {
        LCDSetPixel(lX + lXpos, lY + lYpos, cColor);
        LCDSetPixel(lX + lYpos, lY + lXpos, cColor);
        LCDSetPixel(lX + lXpos, lY - lYpos, cColor);
        LCDSetPixel(lX - lYpos, lY + lXpos, cColor);
        LCDSetPixel(lX - lXpos, lY - lYpos, cColor);
        LCDSetPixel(lX - lYpos, lY - lXpos, cColor);
        LCDSetPixel(lX - lXpos, lY + lYpos, cColor);
        LCDSetPixel(lX + lYpos, lY - lXpos, cColor);

        if(lD < 0)
        {
            lD += (4 * lXpos) + 6;
        }
        else
        {
            lD += 10 + (4 * (lXpos - lYpos));
            lYpos--;
        }

⌨️ 快捷键说明

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