BUG: Polygon ROM CALLs Top-Justify Within Their Rectangle (59319)






This article was previously published under Q59319

SYMPTOMS

The vertical position of a polygon manipulated by the ERASEPOLY, INVERTPOLY, PAINTPOLY, and FILLPOLY Toolbox ROM routines is directly related to the y coordinate of the upper-left corner of the rectangle enclosing the polygon that is passed to those routines. This is not the case with FRAMEPOLY.

Microsoft has confirmed this to be a bug with Microsoft QuickBasic Version 1.00 for the Macintosh . We are currently researching this problem and will post further information here as it becomes available.

MORE INFORMATION

In other words, if the y coordinate of the upper-left corner of the rectangle enclosing the polygon is less than the y coordinate of the uppermost point of the specified polygon, then the y coordinate of the uppermost point of the polygon will be drawn as having the same value as the y coordinate of the upper-left corner of the rectangle enclosing the polygon. The y coordinates of the remaining points in the polygon will be adjusted upwards accordingly.

For example, assume the y coordinate of the uppermost point in a polygon is 200 and the y coordinate of the upper-left corner of the rectangle enclosing the polygon is passed to the polygon-drawing routines as 100. When FRAMEPOLY is called, the y coordinate of the uppermost point in the polygon actually drawn will be 200. However, when FILLPOLY, INVERTPOLY, ERASEPOLY, or PAINTPOLY are called, the y coordinate of the uppermost point in the polygon drawn will be converted to 100 because that is the value of the y coordinate of the upper-left corner of the rectangle enclosing the polygon. Remember that the coordinates of this rectangle are passed to the routines as a parameter and it is possible (and workable in the case of FRAMEPOLY) to pass a rectangle whose sides the polygon won't come close to touching.

To avoid this behavior, make sure that the y coordinate of the upper-left corner of the rectangle passed to the FILLPOLY, INVERTPOLY, ERASEPOLY, and PAINTPOLY routines is the same as the y coordinate of the highest point in the polygon. Another workaround is to invoke the equivalent ROM routines FramePgon, FillPgon, InvertPgon, ErasePgon, and PaintPgon with QuickBasic's ToolBox statement to draw polygons. The problem does not occur with these routines.

The following example program illustrates the problem. It first uses FRAMEPOLY to draw a polygon and then prompts the user to perform other operations (FILLPOLY, INVERTPOLY, ERASEPOLY, and PAINTPOLY) on the same polygon. These other operations will affect another region above the original polygon even though the same polygon coordinates are given. This is because the y coordinate of the upper-left corner of the rectangle enclosing the polygon that is passed to the routines (100) is less than the y coordinate of the uppermost point in the polygon (200). The same problem does NOT occur if QuickBasic's ToolBox statement is used to directly invoke the ROM routines FramePgon, FillPgon, InvertPgon, ErasePgon, and PaintPgon in a similar manner.

Code Example

DIM polygon%(12)
DIM pattern%(3)

polygon%(0)  = 26                         'Number of bytes in array.

polygon%(1)  = 100 : polygon%(2)  = 10    'Coordinates of rectangle
polygon%(3)  = 300 : polygon%(4)  = 500   'enclosing the polygon.

polygon%(5)  = 200 : polygon%(6)  = 180   'Coordinates of the
polygon%(7)  = 260 : polygon%(8)  = 220   'endpoints of the polygon.
polygon%(9)  = 290 : polygon%(10) = 390
polygon%(11) = 200 : polygon%(12) = 180

FOR i = 0 to 3          'Create a pattern for use with FILLPOLY.
   pattern%(i) = 1234
NEXT i

FRAMEPOLY VARPTR(polygon%(0))

LOCATE 1,1
PRINT "Click to fill the polygon."
WHILE MOUSE(0) <> -1
WEND
FILLPOLY VARPTR(polygon%(0)),VARPTR(pattern%(0))

LOCATE 2,1
PRINT "Click to invert the polygon."
WHILE MOUSE(0) <> -1
WEND
INVERTPOLY VARPTR(polygon%(0))

LOCATE 3,1
PRINT "Click to erase the polygon."
WHILE MOUSE(0) <> -1
WEND
ERASEPOLY VARPTR(polygon%(0))

LOCATE 4,1
PRINT "Click to paint the polygon."
WHILE MOUSE(0) <> -1
WEND
PAINTPOLY VARPTR(polygon%(0))

LOCATE 5,1
PRINT "Click to end."
WHILE MOUSE(0) <> -1
WEND
				

Modification Type: Minor Last Reviewed: 1/8/2003
Keywords: kbbug KB59319