📄 iedraw.c
字号:
HBRUSH colourbrush;
HBRUSH oldbrush;
HPEN colourpen;
HPEN oldpen;
COLORREF selected_colour;
COLORREF dithered;
short mousebutton;
WPI_PRES pres;
HWND hwnd;
short area_x;
short area_y;
short width;
short height;
short i;
short j;
WPI_POINT pt;
WPI_RECT rcclient;
wie_clrtype type;
int brushsize;
BOOL gridvisible;
hwnd = (HWND)GET_HWND_PARAM2( lparam );
mousebutton = currentMouseButton;
_wpi_getclientrect( hwnd, &rcclient );
brushsize = ImgedConfigInfo.brush_size;
gridvisible = ImgedConfigInfo.grid_on && (pointSize.x >= POINTSIZE_MIN &&
pointSize.y >= POINTSIZE_MIN);
if ((!gridvisible) && (toolType == IMGED_FREEHAND)) {
area_x = xpos * pointSize.x;
area_y = ypos * pointSize.y;
width = (short)pointSize.x;
height = (short)pointSize.y;
} else if ((!gridvisible) && (toolType == IMGED_BRUSH)) {
area_x = max(0, xpos-brushsize/2) * pointSize.x;
area_y = max(0, ypos-brushsize/2) * pointSize.y;
width = (short)(brushsize * pointSize.x);
height = (short)(brushsize * pointSize.y);
/*
* We just have to check that we don't spill over the image dimensions
*/
area_x = min( area_x, _wpi_getwidthrect(rcclient)-width );
area_y = min( area_y, _wpi_getheightrect(rcclient)-width );
} else if ((gridvisible) && (toolType == IMGED_FREEHAND)) {
area_x = xpos * pointSize.x+1;
area_y = ypos * pointSize.y+1;
width = (short)(pointSize.x-1);
height = (short)(pointSize.y-1);
} else {
area_x = max(0, xpos-brushsize/2) * pointSize.x+1;
area_y = max(0, ypos-brushsize/2) * pointSize.y+1;
width = (short)(pointSize.x - 1);
height = (short)(pointSize.y - 1);
/*
* We just have to check that we don't spill over the image dimensions
*/
area_x = min( area_x, _wpi_getwidthrect(rcclient) - pointSize.x *
brushsize+1 );
area_y = min( area_y, _wpi_getheightrect(rcclient) - pointSize.y *
brushsize+1 );
}
pres = _wpi_getpres( hwnd );
_wpi_torgbmode( pres );
dithered = GetSelectedColour( mousebutton, &selected_colour, &type );
colourbrush = _wpi_createsolidbrush( selected_colour );
oldbrush = _wpi_selectobject(pres, colourbrush);
colourpen = _wpi_createpen(PS_SOLID, 0, selected_colour);
oldpen = _wpi_selectobject(pres, colourpen);
if (gridvisible && (toolType == IMGED_BRUSH)) {
for (i=0; i < brushsize; ++i) {
for (j=0; j < brushsize; ++j) {
_wpi_patblt(pres, area_x+i*pointSize.x, area_y+j*pointSize.y,
width, height, PATCOPY);
}
}
} else {
_wpi_patblt(pres, area_x, area_y, width, height, PATCOPY);
}
_wpi_selectobject(pres, oldbrush);
_wpi_selectobject(pres, oldpen);
_wpi_releasepres( hwnd, pres );
_wpi_deleteobject( colourbrush );
_wpi_deleteobject( colourpen );
pt.x = area_x / pointSize.x;
pt.y = area_y / pointSize.y;
if (toolType == IMGED_BRUSH) {
if (type == SCREEN_CLR) {
BrushThePoints(selected_colour, BLACK, WHITE, &pt, brushsize);
} else if (type == INVERSE_CLR) {
BrushThePoints(selected_colour, WHITE, WHITE, &pt, brushsize);
} else {
BrushThePoints(selected_colour, selected_colour, BLACK, &pt,
brushsize);
}
} else {
if (type == SCREEN_CLR) {
DrawThePoints(selected_colour, BLACK, WHITE, &pt);
} else if (type == INVERSE_CLR) {
DrawThePoints(selected_colour, WHITE, WHITE, &pt);
} else {
DrawThePoints(selected_colour, selected_colour, BLACK, &pt);
}
}
} /* drawPt */
/*
* Paint - When the mouse button is down, we want to paint on the
* drawing area.
*/
void Paint( HWND hwnd, WPI_POINT *start_pt, WPI_POINT *end_pt, int mousebutton )
{
WPI_POINT s_pt;
WPI_POINT e_pt;
WPI_PARAM2 lparam;
WPI_LINEDDAPROC fp;
s_pt.x = MAKELOGPTX(start_pt->x);
s_pt.y = MAKELOGPTY(start_pt->y);
e_pt.x = MAKELOGPTX(end_pt->x);
e_pt.y = MAKELOGPTY(end_pt->y);
CheckBounds( hwnd, &s_pt );
CheckBounds( hwnd, &e_pt );
s_pt.x = s_pt.x / pointSize.x;
s_pt.y = s_pt.y / pointSize.y;
e_pt.x = e_pt.x / pointSize.x;
e_pt.y = e_pt.y / pointSize.y;
currentMouseButton = mousebutton;
SET_HWND_PARAM2( lparam, hwnd );
fp = _wpi_makelineddaprocinstance( drawPt, Instance );
_wpi_linedda( s_pt.x, s_pt.y, e_pt.x, e_pt.y, (WPI_LINEDDAPROC)fp, lparam);
_wpi_freeprocinstance( fp );
DrawSinglePoint( hwnd, end_pt, mousebutton );
memcpy(start_pt, end_pt, sizeof(WPI_POINT));
} /* Paint */
/*
* DrawLine - Draws a line on the drawing area.
*/
void DrawLine( HWND hwnd, WPI_POINT *start_pt, WPI_POINT *end_pt, int mousebutton )
{
COLORREF colour;
COLORREF dithered;
WPI_POINT imgstart_pt;
WPI_POINT imgend_pt;
wie_clrtype type;
img_node *node;
CheckBounds( hwnd, start_pt );
CheckBounds( hwnd, end_pt );
imgstart_pt.x = start_pt->x / pointSize.x;
imgstart_pt.y = start_pt->y / pointSize.y;
imgend_pt.x = end_pt->x / pointSize.x;
imgend_pt.y = end_pt->y / pointSize.y;
dithered = GetSelectedColour(mousebutton, &colour, &type);
if (type == SCREEN_CLR) {
LineXorAnd(BLACK, WHITE, &imgstart_pt, &imgend_pt);
} else if (type == INVERSE_CLR) {
LineXorAnd(WHITE, WHITE, &imgstart_pt, &imgend_pt);
} else {
LineXorAnd(colour, BLACK, &imgstart_pt, &imgend_pt);
}
node = SelectImage( hwnd );
InvalidateRect(node->viewhwnd, NULL, FALSE);
BlowupImage( hwnd, NULL );
} /* DrawLine */
/*
* OutlineLine - outlines the line before it is drawn.
*/
void OutlineLine( HWND hwnd, WPI_POINT *start_pt, WPI_POINT *end_pt,
WPI_POINT *prev_pt, BOOL firsttime )
{
WPI_POINT startpt;
WPI_POINT endpt;
WPI_POINT prevpt;
int prevROP2;
HPEN holdpen;
HPEN hwhitepen;
WPI_PRES pres;
CheckBounds( hwnd, start_pt );
CheckBounds( hwnd, end_pt );
startpt.x = MAKELOGPTX( start_pt->x ) + pointSize.x/2;
startpt.y = MAKELOGPTY( start_pt->y ) + pointSize.y/2;
endpt.x = MAKELOGPTX( end_pt->x ) + pointSize.x/2;
endpt.y = MAKELOGPTY( end_pt->y ) + pointSize.y/2;
pres = _wpi_getpres( hwnd );
_wpi_torgbmode( pres );
hwhitepen = _wpi_createpen( PS_SOLID, 0, WHITE );
holdpen = _wpi_selectobject( pres, hwhitepen );
prevROP2 = _wpi_setrop2( pres, R2_XORPEN );
if (!firsttime) {
CheckBounds( hwnd, prev_pt );
prevpt.x = MAKELOGPTX( prev_pt->x ) + pointSize.x/2;
prevpt.y = MAKELOGPTY( prev_pt->y ) + pointSize.y/2;
_wpi_movetoex( pres, &startpt, NULL );
_wpi_lineto( pres, &prevpt );
}
_wpi_movetoex( pres, &startpt, NULL );
_wpi_lineto( pres, &endpt );
_wpi_setrop2( pres, prevROP2 );
_wpi_selectobject( pres, holdpen );
_wpi_deleteobject( hwhitepen );
_wpi_releasepres( hwnd, pres );
} /* OutlineLine */
/*
* DisplayRegion - Draws the region (rectangle or ellipse) first in the view
* window, then in the draw area.
*/
void DisplayRegion( HWND hwnd, WPI_POINT *start_pt, WPI_POINT *end_pt, int mousebutton )
{
COLORREF colour;
COLORREF dithered;
COLORREF solid;
WPI_POINT imgstart_pt;
WPI_POINT imgend_pt;
WPI_RECT rect;
BOOL dofillrgn;
BOOL is_rect;
wie_clrtype type;
img_node *node;
CheckBounds( hwnd, start_pt );
CheckBounds( hwnd, end_pt );
imgstart_pt.x = min(start_pt->x / pointSize.x, end_pt->x / pointSize.x);
imgend_pt.x = max(start_pt->x / pointSize.x, end_pt->x / pointSize.x);
#ifdef __OS2_PM__
imgstart_pt.y = max(start_pt->y / pointSize.y, end_pt->y / pointSize.y);
imgend_pt.y = min(start_pt->y / pointSize.y, end_pt->y / pointSize.y) - 1;
#else
imgstart_pt.y = min(start_pt->y / pointSize.y, end_pt->y / pointSize.y);
imgend_pt.y = max(start_pt->y / pointSize.y, end_pt->y / pointSize.y) + 1;
#endif
imgend_pt.x += 1;
dithered = GetSelectedColour(mousebutton, &solid, &type);
switch (toolType) {
case IMGED_RECTO:
dofillrgn = FALSE;
is_rect = TRUE;
colour = solid;
break;
case IMGED_RECTF:
dofillrgn = TRUE;
is_rect = TRUE;
colour = dithered;
break;
case IMGED_CIRCLEO:
dofillrgn = FALSE;
is_rect = FALSE;
colour = solid;
break;
case IMGED_CIRCLEF:
dofillrgn = TRUE;
is_rect = FALSE;
colour = dithered;
break;
default:
return;
}
_wpi_setrectvalues(&rect, imgstart_pt.x, imgstart_pt.y, imgend_pt.x,
imgend_pt.y);
if (type == SCREEN_CLR) {
RegionXorAnd(BLACK, WHITE, dofillrgn, &rect, is_rect);
} else if (type == INVERSE_CLR) {
RegionXorAnd(WHITE, WHITE, dofillrgn, &rect, is_rect);
} else {
RegionXorAnd(colour, BLACK, dofillrgn, &rect, is_rect);
}
node = GetCurrentNode();
InvalidateRect( node->viewhwnd, NULL, FALSE );
BlowupImage( hwnd, NULL );
} /* DisplayRegion */
/*
* OutlineClip - displays the potential region to be clipped to the clip board
*/
void OutlineClip( HWND hwnd, WPI_POINT *start_pt, WPI_POINT *end_pt,
WPI_POINT *prev_pt, BOOL firsttime )
{
WPI_RECT newpos;
WPI_RECT oldpos;
short temp;
WPI_PRES pres;
IMGED_DIM left;
IMGED_DIM top;
IMGED_DIM right;
IMGED_DIM bottom;
CheckBounds( hwnd, start_pt );
CheckBounds( hwnd, end_pt );
CheckBounds( hwnd, prev_pt );
left = (IMGED_DIM)MAKELOGPTX(start_pt->x);
top = (IMGED_DIM)MAKELOGPTY(start_pt->y);
right = (IMGED_DIM)MAKELOGPTX(end_pt->x);
bottom = (IMGED_DIM)MAKELOGPTY(end_pt->y);
if (left > right) {
temp = right;
right = left + pointSize.x;
left = temp;
} else {
right += pointSize.x;
}
if (top > bottom) {
temp = bottom;
bottom = top + pointSize.y;
top = temp;
} else {
bottom += pointSize.y;
}
_wpi_setrectvalues( &newpos, left, top, right, bottom );
left = (IMGED_DIM)MAKELOGPTX( start_pt->x );
top = (IMGED_DIM)MAKELOGPTY( start_pt->y );
right = (IMGED_DIM)MAKELOGPTX( prev_pt->x );
bottom = (IMGED_DIM)MAKELOGPTY( prev_pt->y );
if (left > right) {
temp = right;
right = left + pointSize.x;
left = temp;
} else {
right += pointSize.x;
}
if (top > bottom) {
temp = bottom;
bottom = top + pointSize.y;
top = temp;
} else {
bottom += pointSize.y;
}
_wpi_setrectvalues( &oldpos, left, top, right, bottom );
pres = _wpi_getpres( hwnd );
OutlineRectangle( firsttime, pres, &oldpos, &newpos );
_wpi_releasepres( hwnd, pres );
} /* OutlineClip */
/*
* OutlineRegion - displays the potential region (rectangle or ellipse)
* on the draw area.
*/
void OutlineRegion( HWND hwnd, WPI_POINT *start_pt, WPI_POINT *end_pt,
WPI_POINT *prev_pt, BOOL firsttime )
{
WPI_POINT topleft;
WPI_POINT bottomright;
WPI_POINT prevtl; // previous top left point
WPI_POINT prevbr; // previous bottom right point
int prevROP2;
HBRUSH hbrush;
HBRUSH holdbrush;
HPEN hwhitepen;
HPEN holdpen;
int temp;
WPI_PRES pres;
CheckBounds( hwnd, start_pt );
CheckBounds( hwnd, end_pt );
CheckBounds( hwnd, prev_pt );
_wpi_setpoint(&topleft, MAKELOGPTX(start_pt->x), MAKELOGPTY(start_pt->y));
_wpi_setpoint(&bottomright, MAKELOGPTX(end_pt->x), MAKELOGPTY(end_pt->y));
if (topleft.x > bottomright.x) {
temp = (short)bottomright.x;
bottomright.x = topleft.x + pointSize.x;
topleft.x = temp;
} else {
bottomright.x += pointSize.x;
}
if (topleft.y > bottomright.y) {
temp = (int)bottomright.y;
bottomright.y = topleft.y + pointSize.y;
topleft.y = temp;
} else {
bottomright.y += pointSize.y;
}
prevtl.x = MAKELOGPTX( start_pt->x );
prevtl.y = MAKELOGPTY( start_pt->y );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -