ultimatepp/uppdev/LineClip/main.cpp
cxl 3cd394812c Merge continued
git-svn-id: svn://ultimatepp.org/upp/trunk@10263 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2016-10-04 08:34:39 +00:00

89 lines
1.9 KiB
C++

#include "LineClip.h"
bool LineClip::Clip(Painter& sw, double x1, double y1, double x2, double y2)
{
if(x1 < cliprect.left) {
if(x2 < cliprect.left)
return false;
y1 = (y2 - y1) * (cliprect.left - x1) / (x2 - x1) + y1;
x1 = cliprect.left;
}
else
if(x1 > cliprect.right) {
if(x2 > cliprect.right)
return false;
y1 = (y2 - y1) * (cliprect.right - x1) / (x2 - x1) + y1;
x1 = cliprect.right;
}
if(x2 < cliprect.left) {
y2 = (y2 - y1) * (cliprect.left - x1) / (x2 - x1) + y1;
x2 = cliprect.left;
}
else
if(x2 > cliprect.right) {
y2 = (y2 - y1) * (cliprect.right - x1) / (x2 - x1) + y1;
x2 = cliprect.right;
}
if(y1 < cliprect.top) {
if(y2 < cliprect.top)
return false;
x1 = (x2 - x1) * (cliprect.top - y1) / (y2 - y1) + x1;
y1 = cliprect.top;
}
else
if(y1 > cliprect.bottom) {
if(y2 > cliprect.bottom)
return false;
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;
}
sw.Move(x1, y1).Line(x2, y2).Stroke(1, LtRed());
return true;
}
void LineClip::Paint(Draw& w)
{
ImageBuffer ib(GetSize());
BufferPainter sw(ib);
sw.Clear(White());
sw.Rectangle(100, 100, 100, 100).Fill(WhiteGray());
sw.Move(x1, y1).Line(x2, y2).Stroke(1, Gray());
if(!Clip(sw, x1, y1, x2, y2))
sw.Text(0, 0, "No clip", Arial(20)).Fill(Black());
w.DrawImage(0, 0, ib);
}
void LineClip::LeftDown(Point p, dword keyflags)
{
x1 = p.x;
y1 = p.y;
Refresh();
}
void LineClip::MouseMove(Point p, dword keyflags)
{
x2 = p.x;
y2 = p.y;
Refresh();
}
LineClip::LineClip()
{
cliprect = RectfC(100, 100, 100, 100);
x1 = y1 = x2 = y2 = 0;
Refresh();
}
GUI_APP_MAIN
{
LineClip().Run();
}