mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
106 lines
2.6 KiB
C++
106 lines
2.6 KiB
C++
#include "Painter.h"
|
|
|
|
#define LLOG(x) // DLOG(x)
|
|
|
|
namespace Upp {
|
|
|
|
void Rasterizer::CvLine(double x1, double y1, double x2, double y2)
|
|
{
|
|
LLOG("CvLine " << x1 << ", " << y1 << " - " << x2 << ", " << y2);
|
|
LineRaw(Q8X(x1), Q8Y(y1), Q8X(x2), Q8Y(y2));
|
|
}
|
|
|
|
void Rasterizer::LineClip(double x1, double y1, double x2, double y2)
|
|
{
|
|
if(IsNull(x1) || IsNull(y1) || IsNull(x2) || IsNull(y2))
|
|
return;
|
|
|
|
if(y1 < cliprect.top) {
|
|
if(y2 < cliprect.top)
|
|
return;
|
|
x1 = (x2 - x1) * (cliprect.top - y1) / (y2 - y1) + x1;
|
|
y1 = cliprect.top;
|
|
}
|
|
else
|
|
if(y1 > cliprect.bottom) {
|
|
if(y2 > cliprect.bottom)
|
|
return;
|
|
x1 = (x2 - x1) * (cliprect.bottom - y1) / (y2 - y1) + x1;
|
|
y1 = cliprect.bottom;
|
|
}
|
|
if(y2 < cliprect.top) {
|
|
x2 = (x2 - x1) * (cliprect.top - y1) / (y2 - y1) + x1;
|
|
y2 = cliprect.top;
|
|
}
|
|
else
|
|
if(y2 > cliprect.bottom) {
|
|
x2 = (x2 - x1) * (cliprect.bottom - y1) / (y2 - y1) + x1;
|
|
y2 = cliprect.bottom;
|
|
}
|
|
double y, yy;
|
|
if(x1 < cliprect.left) {
|
|
if(x2 < cliprect.left) {
|
|
CvLine(cliprect.left, y1, cliprect.left, y2);
|
|
return;
|
|
}
|
|
y = (y2 - y1) * (cliprect.left - x1) / (x2 - x1) + y1;
|
|
if(x2 > cliprect.right) {
|
|
yy = (y2 - y1) * (cliprect.right - x1) / (x2 - x1) + y1;
|
|
CvLine(cliprect.left, y1, cliprect.left, y);
|
|
CvLine(cliprect.left, y, cliprect.right, yy);
|
|
CvLine(cliprect.right, yy, cliprect.right, y2);
|
|
return;
|
|
}
|
|
CvLine(cliprect.left, y1, cliprect.left, y);
|
|
CvLine(cliprect.left, y, x2, y2);
|
|
return;
|
|
}
|
|
else
|
|
if(x1 > cliprect.right) {
|
|
if(x2 > cliprect.right) {
|
|
CvLine(cliprect.right, y1, cliprect.right, y2);
|
|
return;
|
|
}
|
|
y = (y2 - y1) * (cliprect.right - x1) / (x2 - x1) + y1;
|
|
if(x2 < cliprect.left) {
|
|
yy = (y2 - y1) * (cliprect.left - x1) / (x2 - x1) + y1;
|
|
CvLine(cliprect.right, y1, cliprect.right, y);
|
|
CvLine(cliprect.right, y, cliprect.left, yy);
|
|
CvLine(cliprect.left, yy, cliprect.left, y2);
|
|
return;
|
|
}
|
|
CvLine(cliprect.right, y1, cliprect.right, y);
|
|
CvLine(cliprect.right, y, x2, y2);
|
|
return;
|
|
}
|
|
if(x2 < cliprect.left) {
|
|
y = (y2 - y1) * (cliprect.left - x1) / (x2 - x1) + y1;
|
|
CvLine(x1, y1, cliprect.left, y);
|
|
CvLine(cliprect.left, y, cliprect.left, y2);
|
|
return;
|
|
}
|
|
else
|
|
if(x2 > cliprect.right) {
|
|
y = (y2 - y1) * (cliprect.right - x1) / (x2 - x1) + y1;
|
|
CvLine(x1, y1, cliprect.right, y);
|
|
CvLine(cliprect.right, y, cliprect.right, y2);
|
|
return;
|
|
}
|
|
CvLine(x1, y1, x2, y2);
|
|
}
|
|
|
|
void Rasterizer::Move(const Pointf& p)
|
|
{
|
|
LLOG("Rasterizer::Move " << p);
|
|
p0 = p;
|
|
}
|
|
|
|
void Rasterizer::Line(const Pointf& p)
|
|
{
|
|
PAINTER_TIMING("Line");
|
|
LLOG("Rasterizer::Line " << p);
|
|
LineClip(p0.x, p0.y, p.x, p.y);
|
|
p0 = p;
|
|
}
|
|
|
|
}
|