X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2c8f21f867ed5b7e7ce9d6c9ef939f34e83a7213..02255e07d75191d1146e21d4218835a79214a970:/samples/drawing/drawing.cpp diff --git a/samples/drawing/drawing.cpp b/samples/drawing/drawing.cpp index 99b6b86dc3..021de6387b 100644 --- a/samples/drawing/drawing.cpp +++ b/samples/drawing/drawing.cpp @@ -70,6 +70,7 @@ enum ScreenToShow Show_Brushes, Show_Polygons, Show_Mask, + Show_Mask_Stretch, Show_Ops, Show_Regions, Show_Circles, @@ -178,11 +179,17 @@ public: #endif protected: + enum DrawMode + { + Draw_Normal, + Draw_Stretch + }; + void DrawTestLines( int x, int y, int width, wxDC &dc ); void DrawTestPoly(wxDC& dc); void DrawTestBrushes(wxDC& dc); void DrawText(wxDC& dc); - void DrawImages(wxDC& dc); + void DrawImages(wxDC& dc, DrawMode mode); void DrawWithLogicalOps(wxDC& dc); #if wxUSE_GRAPHICS_CONTEXT void DrawAlpha(wxDC& dc); @@ -227,6 +234,7 @@ enum File_ShowBrushes, File_ShowPolygons, File_ShowMask, + File_ShowMaskStretch, File_ShowOps, File_ShowRegions, File_ShowCircles, @@ -310,6 +318,7 @@ bool MyApp::LoadImages() wxPathList pathList; pathList.Add(_T(".")); pathList.Add(_T("..")); + pathList.Add(_T("../..")); wxString path = pathList.FindValidPath(_T("pat4.bmp")); if ( !path ) @@ -353,6 +362,9 @@ bool MyApp::LoadImages() // `Main program' equivalent: the program execution "starts" here bool MyApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + // Create the main application window MyFrame *frame = new MyFrame(_T("Drawing sample"), wxPoint(50, 50), wxSize(550, 340)); @@ -778,9 +790,9 @@ void MyCanvas::DrawText(wxDC& dc) dc.DrawText( _T("This is Swiss 18pt text."), 110, 40 ); - long length; - long height; - long descent; + wxCoord length; + wxCoord height; + wxCoord descent; dc.GetTextExtent( _T("This is Swiss 18pt text."), &length, &height, &descent ); text.Printf( wxT("Dimensions are length %ld, height %ld, descent %ld"), length, height, descent ); dc.DrawText( text, 110, 80 ); @@ -832,7 +844,7 @@ static const struct { wxT("wxXOR"), wxXOR }, }; -void MyCanvas::DrawImages(wxDC& dc) +void MyCanvas::DrawImages(wxDC& dc, DrawMode mode) { dc.DrawText(_T("original image"), 0, 0); dc.DrawBitmap(*gs_bmpNoMask, 0, 20, 0); @@ -854,7 +866,15 @@ void MyCanvas::DrawImages(wxDC& dc) dc.DrawText(rasterOperations[n].name, x, y - 20); memDC.SelectObject(*gs_bmpWithColMask); - dc.Blit(x, y, cx, cy, &memDC, 0, 0, rasterOperations[n].rop, true); + if ( mode == Draw_Stretch ) + { + dc.StretchBlit(x, y, cx, cy, &memDC, 0, 0, cx/2, cy/2, + rasterOperations[n].rop, true); + } + else + { + dc.Blit(x, y, cx, cy, &memDC, 0, 0, rasterOperations[n].rop, true); + } } } @@ -909,32 +929,32 @@ void MyCanvas::DrawAlpha(wxDC& dc) wxDouble margin = 20 ; wxDouble width = 180 ; wxDouble radius = 30 ; - + dc.SetPen( wxPen( wxColour( 128, 0, 0, 255 ),12, wxSOLID)); dc.SetBrush( wxBrush( wxColour( 255, 0, 0, 255),wxSOLID)); - + wxRect r(margin,margin+width*0.66,width,width) ; - + dc.DrawRoundedRectangle( r.x, r.y, r.width, r.width, radius ) ; - + dc.SetPen( wxPen( wxColour( 0, 0, 128, 255 ),12, wxSOLID)); dc.SetBrush( wxBrush( wxColour( 0, 0, 255, 255),wxSOLID)); - + r.Offset( width * 0.8 , - width * 0.66 ) ; - + dc.DrawRoundedRectangle( r.x, r.y, r.width, r.width, radius ) ; - + dc.SetPen( wxPen( wxColour( 128, 128, 0, 255 ),12, wxSOLID)); dc.SetBrush( wxBrush( wxColour( 192, 192, 0, 255),wxSOLID)); r.Offset( width * 0.8 , width *0.5 ) ; - + dc.DrawRoundedRectangle( r.x, r.y, r.width, r.width, radius ) ; - + dc.SetPen( *wxTRANSPARENT_PEN ) ; dc.SetBrush( wxBrush( wxColour(255,255,128,128) ) ); dc.DrawRoundedRectangle( 0 , margin + width / 2 , width * 3 , 100 , radius) ; - + dc.SetTextForeground( wxColour(255,255,0,128) ); dc.SetFont( wxFont( 40, wxFONTFAMILY_SWISS, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL ) ); dc.DrawText( wxT("Hello!"), 120, 80 ); @@ -973,9 +993,9 @@ void MyCanvas::DrawCircles(wxDC& dc) dc.DrawEllipticArc(x + r, y, 2*r, r, 90, 180); dc.DrawEllipticArc(x + 3*r, y, 2*r, r, 180, 270); dc.DrawEllipticArc(x + 5*r, y, 2*r, r, 270, 360); - + // same as above, just transparent brush - + dc.SetPen( *wxRED_PEN ); dc.SetBrush( *wxTRANSPARENT_BRUSH ); @@ -1002,7 +1022,7 @@ void MyCanvas::DrawCircles(wxDC& dc) dc.DrawEllipticArc(x + r, y, 2*r, r, 90, 180); dc.DrawEllipticArc(x + 3*r, y, 2*r, r, 180, 270); dc.DrawEllipticArc(x + 5*r, y, 2*r, r, 270, 360); - + } void MyCanvas::DrawSplines(wxDC& dc) @@ -1139,6 +1159,37 @@ void MyCanvas::DrawGradients(wxDC& dc) dc.DrawText(_T("Blue in bottom right corner"), r.x, r.y); r.Offset(0, TEXT_HEIGHT); dc.GradientFillConcentric(r, *wxBLUE, *wxWHITE, wxPoint(r.width, r.height)); + + // check that the area filled by the gradient is exactly the interior of + // the rectangle + r.x = 350; + r.y = 30; + dc.DrawText("The interior should be filled but", r.x, r.y); + r.y += 15; + dc.DrawText(" the red border should remain visible:", r.x, r.y); + r.y += 15; + + r.width = + r.height = 50; + wxRect r2 = r; + r2.x += 60; + wxRect r3 = r; + r3.y += 60; + wxRect r4 = r2; + r4.y += 60; + dc.SetPen(wxPen(wxColour(255, 0, 0))); + dc.DrawRectangle(r); + r.Deflate(1); + dc.GradientFillLinear(r, wxColour(0,255,0), wxColour(0,0,0), wxNORTH); + dc.DrawRectangle(r2); + r2.Deflate(1); + dc.GradientFillLinear(r2, wxColour(0,0,0), wxColour(0,255,0), wxSOUTH); + dc.DrawRectangle(r3); + r3.Deflate(1); + dc.GradientFillLinear(r3, wxColour(0,255,0), wxColour(0,0,0), wxEAST); + dc.DrawRectangle(r4); + r4.Deflate(1); + dc.GradientFillLinear(r4, wxColour(0,0,0), wxColour(0,255,0), wxWEST); } void MyCanvas::DrawRegions(wxDC& dc) @@ -1277,13 +1328,17 @@ void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) break; case Show_Mask: - DrawImages(dc); + DrawImages(dc, Draw_Normal); + break; + + case Show_Mask_Stretch: + DrawImages(dc, Draw_Stretch); break; case Show_Ops: DrawWithLogicalOps(dc); break; - + #if wxUSE_GRAPHICS_CONTEXT case Show_Alpha: DrawAlpha(dc); @@ -1352,6 +1407,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuFile->Append(File_ShowBrushes, _T("&Brushes screen\tF4")); menuFile->Append(File_ShowPolygons, _T("&Polygons screen\tF5")); menuFile->Append(File_ShowMask, _T("&Mask screen\tF6")); + menuFile->Append(File_ShowMaskStretch, _T("1/&2 scaled mask\tShift-F6")); menuFile->Append(File_ShowOps, _T("&ROP screen\tF7")); menuFile->Append(File_ShowRegions, _T("Re&gions screen\tF8")); menuFile->Append(File_ShowCircles, _T("&Circles screen\tF9"));