X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/213ad8e72cb6e838d15bf54145d661b081dca308..f1f5f16f780bb41aa2ea24ccbf728f14c86cc475:/src/common/dcbase.cpp diff --git a/src/common/dcbase.cpp b/src/common/dcbase.cpp index 3326bbda29..9f875dd04d 100644 --- a/src/common/dcbase.cpp +++ b/src/common/dcbase.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/dcbase.cpp +// Name: src/common/dcbase.cpp // Purpose: generic methods of the wxDC Class // Author: Vadim Zeitlin // Modified by: @@ -25,14 +25,23 @@ #endif #include "wx/dc.h" -#include "wx/math.h" +#include "wx/dcbuffer.h" // for IMPLEMENT_DYNAMIC_CLASS + +#ifndef WX_PRECOMP + #include "wx/math.h" +#endif // bool wxDCBase::sm_cacheing = false; +IMPLEMENT_ABSTRACT_CLASS(wxDCBase, wxObject) + // ============================================================================ // implementation // ============================================================================ +IMPLEMENT_DYNAMIC_CLASS(wxBufferedDC, wxMemoryDC) +IMPLEMENT_ABSTRACT_CLASS(wxBufferedPaintDC, wxBufferedDC) + #if WXWIN_COMPATIBILITY_2_6 void wxDCBase::BeginDrawing() { @@ -55,8 +64,9 @@ void wxDCBase::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord x2 = x1 + width, y2 = y1 + height; - // this is to yield width of 3 for width == height == 10 - SetPen(wxPen(GetTextForeground(), (width + height + 1) / 7, wxSOLID)); + // the pen width is calibrated to give 3 for width == height == 10 + wxDCPenChanger pen((wxDC&)*this, + wxPen(GetTextForeground(), (width + height + 1)/7)); // we're drawing a scaled version of wx/generic/tick.xpm here wxCoord x3 = x1 + (4*width) / 10, // x of the tick bottom @@ -321,7 +331,7 @@ void wxDCBase::DoDrawSpline( wxList *points ) double x1, y1, x2, y2; wxList::compatibility_iterator node = points->GetFirst(); - if (node == wxList::compatibility_iterator()) + if (!node) // empty list return; @@ -412,7 +422,7 @@ bool wxDCBase::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) { int totalWidth = 0; - const size_t len = text.Length(); + const size_t len = text.length(); widths.Empty(); widths.Add(0, len); @@ -461,7 +471,7 @@ void wxDCBase::GetMultiLineTextExtent(const wxString& text, wxCoord *x, wxCoord *y, wxCoord *h, - wxFont *font) + wxFont *font) const { wxCoord widthTextMax = 0, widthLine, heightTextTotal = 0, heightLineDefault = 0, heightLine = 0; @@ -688,13 +698,14 @@ void wxDCBase::DoGradientFillLinear(const wxRect& rect, { // save old pen wxPen oldPen = m_pen; - - wxUint8 nR1 = destColour.Red(); - wxUint8 nG1 = destColour.Green(); - wxUint8 nB1 = destColour.Blue(); - wxUint8 nR2 = initialColour.Red(); - wxUint8 nG2 = initialColour.Green(); - wxUint8 nB2 = initialColour.Blue(); + wxBrush oldBrush = m_brush; + + wxUint8 nR1 = initialColour.Red(); + wxUint8 nG1 = initialColour.Green(); + wxUint8 nB1 = initialColour.Blue(); + wxUint8 nR2 = destColour.Red(); + wxUint8 nG2 = destColour.Green(); + wxUint8 nB2 = destColour.Blue(); wxUint8 nR, nG, nB; if ( nDirection == wxEAST || nDirection == wxWEST ) @@ -723,12 +734,14 @@ void wxDCBase::DoGradientFillLinear(const wxRect& rect, else nB = nB1 + (nB2-nB1)*(w-x)/w; - SetPen(wxPen(wxColour(nR, nG, nB), 1, wxSOLID)); + wxColour colour(nR,nG,nB); + SetPen(wxPen(colour, 1, wxSOLID)); + SetBrush(wxBrush(colour)); if(nDirection == wxEAST) - DrawRectangle(rect.GetLeft()+x, rect.GetTop(), + DrawRectangle(rect.GetRight()-x-xDelta, rect.GetTop(), xDelta, rect.GetHeight()); else //nDirection == wxWEST - DrawRectangle(rect.GetRight()-x-xDelta, rect.GetTop(), + DrawRectangle(rect.GetLeft()+x, rect.GetTop(), xDelta, rect.GetHeight()); } } @@ -758,7 +771,9 @@ void wxDCBase::DoGradientFillLinear(const wxRect& rect, else nB = nB1 + (nB2-nB1)*(w-y)/w; - SetPen(wxPen(wxColour(nR, nG, nB), 1, wxSOLID)); + wxColour colour(nR,nG,nB); + SetPen(wxPen(colour, 1, wxSOLID)); + SetBrush(wxBrush(colour)); if(nDirection == wxNORTH) DrawRectangle(rect.GetLeft(), rect.GetTop()+y, rect.GetWidth(), yDelta); @@ -769,9 +784,10 @@ void wxDCBase::DoGradientFillLinear(const wxRect& rect, } SetPen(oldPen); + SetBrush(oldBrush); } -void wxDCBase::GradientFillConcentric(const wxRect& rect, +void wxDCBase::DoGradientFillConcentric(const wxRect& rect, const wxColour& initialColour, const wxColour& destColour, const wxPoint& circleCenter) @@ -788,12 +804,6 @@ void wxDCBase::GradientFillConcentric(const wxRect& rect, wxUint8 nR, nG, nB; - //offsets of the current pixel - wxInt32 x, y; - - //Color difference - wxInt32 nGradient; - //Radius wxInt32 cx = rect.GetWidth() / 2; wxInt32 cy = rect.GetHeight() / 2; @@ -807,28 +817,25 @@ void wxDCBase::GradientFillConcentric(const wxRect& rect, wxInt32 nCircleOffX = circleCenter.x - (rect.GetWidth() / 2); wxInt32 nCircleOffY = circleCenter.y - (rect.GetHeight() / 2); - for (x = 0; x < rect.GetWidth(); x++) + for ( wxInt32 x = 0; x < rect.GetWidth(); x++ ) { - for (y = 0; y < rect.GetHeight(); y++) + for ( wxInt32 y = 0; y < rect.GetHeight(); y++ ) { //get color difference - nGradient = ( - (nRadius - - (wxInt32)sqrt( - pow(x - cx - nCircleOffX, 2) + - pow(y - cy - nCircleOffY, 2) - ) - ) * 100 - ) / nRadius; + wxInt32 nGradient = ((nRadius - + (wxInt32)sqrt( + pow((double)(x - cx - nCircleOffX), 2) + + pow((double)(y - cy - nCircleOffY), 2) + )) * 100) / nRadius; //normalize Gradient if (nGradient < 0 ) nGradient = 0; //get dest colors - nR = nR1 + ((nR2 - nR1) * nGradient / 100); - nG = nG1 + ((nG2 - nG1) * nGradient / 100); - nB = nB1 + ((nB2 - nB1) * nGradient / 100); + nR = (wxUint8)(nR1 + ((nR2 - nR1) * nGradient / 100)); + nG = (wxUint8)(nG1 + ((nG2 - nG1) * nGradient / 100)); + nB = (wxUint8)(nB1 + ((nB2 - nB1) * nGradient / 100)); //set the pixel m_pen.SetColour(wxColour(nR,nG,nB)); @@ -894,13 +901,13 @@ void wxDCBase::DoDrawEllipticArcRot( wxCoord x, wxCoord y, list.Append( (wxObject*) new wxPoint( x+w/2, y+h/2 ) ); // copy list into array and delete list elements - int n = list.Number(); + int n = list.GetCount(); wxPoint *points = new wxPoint[n]; int i = 0; wxNode* node = 0; - for ( node = list.First(); node; node = node->Next(), i++ ) + for ( node = list.GetFirst(); node; node = node->GetNext(), i++ ) { - wxPoint *point = (wxPoint *)node->Data(); + wxPoint *point = (wxPoint *)node->GetData(); points[i].x = point->x; points[i].y = point->y; delete point; @@ -933,9 +940,9 @@ void wxDCBase::Rotate( wxList* points, double angle, wxPoint center ) double pi(M_PI); double dSinA = -sin(angle*2.0*pi/360.0); double dCosA = cos(angle*2.0*pi/360.0); - for ( wxNode* node = points->First(); node; node = node->Next() ) + for ( wxNode* node = points->GetFirst(); node; node = node->GetNext() ) { - wxPoint* point = (wxPoint*)node->Data(); + wxPoint* point = (wxPoint*)node->GetData(); // transform coordinates, if necessary if( center.x ) point->x -= center.x; @@ -1071,14 +1078,14 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, bool bForceTurn = ( sq == eq && sa > ea ); while( !bReady ) { - for( wxNode *node = pointsarray[q].First(); node; node = node->Next() ) + for( wxNode *node = pointsarray[q].GetFirst(); node; node = node->GetNext() ) { // once: go to starting point in start quadrant if( !bStarted && ( - ( (wxPoint*) node->Data() )->x < xsa+1 && q <= 1 + ( (wxPoint*) node->GetData() )->x < xsa+1 && q <= 1 || - ( (wxPoint*) node->Data() )->x > xsa-1 && q >= 2 + ( (wxPoint*) node->GetData() )->x > xsa-1 && q >= 2 ) ) { @@ -1090,16 +1097,16 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, { if( q != eq || bForceTurn || - ( (wxPoint*) node->Data() )->x > xea+1 && q <= 1 + ( (wxPoint*) node->GetData() )->x > xea+1 && q <= 1 || - ( (wxPoint*) node->Data() )->x < xea-1 && q >= 2 + ( (wxPoint*) node->GetData() )->x < xea-1 && q >= 2 ) { // copy point - wxPoint* pPoint = new wxPoint( *((wxPoint*) node->Data() ) ); + wxPoint* pPoint = new wxPoint( *((wxPoint*) node->GetData() ) ); points->Append( (wxObject*) pPoint ); } - else if( q == eq && !bForceTurn || ( (wxPoint*) node->Data() )->x == xea) + else if( q == eq && !bForceTurn || ( (wxPoint*) node->GetData() )->x == xea) { bReady = true; } @@ -1115,38 +1122,38 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, // delete points for( q = 0; q < 4; ++q ) { - for( wxNode *node = pointsarray[q].First(); node; node = node->Next() ) + for( wxNode *node = pointsarray[q].GetFirst(); node; node = node->GetNext() ) { - wxPoint *p = (wxPoint *)node->Data(); + wxPoint *p = (wxPoint *)node->GetData(); delete p; } } } else { + wxNode* node; // copy whole ellipse, wxPoints will be deleted outside - for( wxNode *node = pointsarray[0].First(); node; node = node->Next() ) + for( node = pointsarray[0].GetFirst(); node; node = node->GetNext() ) { - wxObject *p = node->Data(); + wxObject *p = node->GetData(); points->Append( p ); } - for( node = pointsarray[1].First(); node; node = node->Next() ) + for( node = pointsarray[1].GetFirst(); node; node = node->GetNext() ) { - wxObject *p = node->Data(); + wxObject *p = node->GetData(); points->Append( p ); } - for( node = pointsarray[2].First(); node; node = node->Next() ) + for( node = pointsarray[2].GetFirst(); node; node = node->GetNext() ) { - wxObject *p = node->Data(); + wxObject *p = node->GetData(); points->Append( p ); } - for( node = pointsarray[3].First(); node; node = node->Next() ) + for( node = pointsarray[3].GetFirst(); node; node = node->GetNext() ) { - wxObject *p = node->Data(); + wxObject *p = node->GetData(); points->Append( p ); } } // not iUseAngles } // CalculateEllipticPoints #endif -