http://bugs.winehq.org/show_bug.cgi?id=3907
Summary: Crash in extFloodFill after a resize event. Product: Wine Version: 0.9.1. Platform: PC OS/Version: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: wine-gdi-(printing) AssignedTo: wine-bugs@winehq.org ReportedBy: andrew7webb@comcast.net
PROBLEM: extFloodFill crashes. It can work, but as soon as the window is resized, it will crash every time. I isolated the problem from the canvas sample code of Smartwin++.
OS is Xandros.
OUTPUT OF PROGRAM: wine canvas.exe.so fixme:system:SystemParametersInfoW Unimplemented action: 4159 (SPI_SETUIEFFECTS) extFloodFill( 190, 5 ... ) done. extFloodFill( 190, 5 ... ) done. [I resized the window horizontally at this point] extFloodFill( 188, 5 ... )X Error of failed request: BadMatch (invalid parameter attributes) Major opcode of failed request: 73 (X_GetImage) Serial number of failed request: 266 Current serial number in output stream: 266
Note that the "done" did not appear on the third call to extFloodFill, but the crash info did. The code area that crashed is:
std::cout << "extFloodFill( " << x4 << ", " << y + 5 << " ... )"; c.extFloodFill( x4, y + 5, color, false ); std::cout << " done." << std::endl;
The canvas class's implementation of extFlodFill is just a wrapper around the WIN32 gdi call:
bool Canvas::extFloodFill( int x, int y, COLORREF color, bool fillTilColorFound ) { return ::ExtFloodFill( itsHdc, x, y, color, fillTilColorFound?FLOODFILLBORDER:FLOODFILLSURFACE ) != FALSE; }
So it will fill while we find the color. FLOODFILLSURFACE
COMPLETE SOURCE OF PROGRAM: /* A demonstration of the use of SmartWin::PaintCanvas and UpdateCanvas. */ #include "SmartWin.h" using namespace SmartWin;
#include <iostream>
class CanvasWidget : public WidgetFactory< WidgetWindow, CanvasWidget > { //WidgetMenuPtr ptrSysMenu; WidgetMenuPtr ptrMainMenu; public: void init( ) { createWindow( );
setText( _T("Crash while doing extFloodFill after resize.") ); onSized( &CanvasWidget::isResized );
thecolor = 0x0000FFFF; // Defaulting to yellow...
onPainting( &CanvasWidget::painting ); updateWidget(); }
private: COLORREF thecolor;
COLORREF RandColor() { return( RGB( rand()%255, rand()%255, rand()%255 ) ); }
void painting( SmartWin::Canvas & c ) { // rc.pos is the upper left point, rc.size is the lower right point. SmartWin::Rectangle rc( getClientAreaSize() );
// Divide the dimensions into halves, quarters and eighths int x1= rc.size.x, x2= x1/2, x4= x2/2, x8= x4/2, y1= rc.size.y, y2= y1/2, y4= y2/2, y8= y4/2;
// Use this color until pen and brush goes out of scope. SmartWin::Pen pen( c, thecolor ); SmartWin::Brush brush( c, thecolor );
// Use the existing background for text
c.setBkColor( c.getPixel( 0,y2 ) );
// Do a number of Graphics operations, and show the calls
int items=2;
int spacing = 10; int yinc = ( y1 -( items * spacing ) ) / items; int x = 0; int y = 0;
// Draw the same triangle, and then fill it with our color. c.line( 0, y, x2, y ); c.lineTo( x4, y + yinc ); c.lineTo( 0, y );
COLORREF color = c.getPixel( x4, y+5); c.extTextOut( _T(" c.extFloodFill( x4, y+5, color, false );"), x2, y ); std::cout << "extFloodFill( " << x4 << ", " << y + 5 << " ... )"; c.extFloodFill( x4, y + 5, color, false ); // Fill while we find the color. FLOODFILLSURFACE std::cout << " done." << std::endl; y += yinc + spacing; }
// There are new dimensions to the window because the user resized the window. void isResized( const SmartWin::WidgetSizedEventResult & sz ) { updateWidget(); }
};
// Application entry point just like all other SmartWin applications... int SmartWinMain( Application & app ) { CanvasWidget * cw = new CanvasWidget(); cw->init(); return( app.run() ); }
________________________________
HOW TO BUILD IT: See bug ID 3900 and just replace Main.cpp with the above source. Or build the the Canvas sample.
best regards, Andrew Webb