📄 lcd.c
字号:
//****************************************************************************
//
// 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -