X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/63b9e659ef655526cd9ed69113280e864f7e2210..1a83b9bd10b7d92520c202e6ed6cff2015f13315:/src/common/dcbase.cpp?ds=inline diff --git a/src/common/dcbase.cpp b/src/common/dcbase.cpp index 75b4c6ac79..10c928e505 100644 --- a/src/common/dcbase.cpp +++ b/src/common/dcbase.cpp @@ -5,7 +5,7 @@ // Modified by: // Created: 05/25/99 // RCS-ID: $Id$ -// Copyright: (c) wxWindows team +// Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -32,7 +32,7 @@ #include -// bool wxDCBase::sm_cacheing = FALSE; +// bool wxDCBase::sm_cacheing = false; // ============================================================================ // implementation @@ -108,14 +108,14 @@ void wxDCBase::DrawPolygon(const wxList *list, void wxDCBase::DoDrawPolyPolygon(int n, - int start[], + int count[], wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle) { if ( n == 1 ) { - DoDrawPolygon(start[0], points, xoffset, yoffset, fillStyle); + DoDrawPolygon(count[0], points, xoffset, yoffset, fillStyle); return; } @@ -126,14 +126,14 @@ wxDCBase::DoDrawPolyPolygon(int n, for (i = j = lastOfs = 0; i < n; i++) { lastOfs = j; - j += start[i]; + j += count[i]; } pts = new wxPoint[j+n-1]; for (i = 0; i < j; i++) pts[i] = points[i]; for (i = 2; i <= n; i++) { - lastOfs -= start[n-i]; + lastOfs -= count[n-i]; pts[j++] = pts[lastOfs]; } @@ -143,10 +143,10 @@ wxDCBase::DoDrawPolyPolygon(int n, SetPen(pen); for (i = j = 0; i < n; i++) { - DoDrawLines(start[i], pts+j, xoffset, yoffset); - j += start[i]; + DoDrawLines(count[i], pts+j, xoffset, yoffset); + j += count[i]; } - delete pts; + delete[] pts; } // ---------------------------------------------------------------------------- @@ -291,7 +291,7 @@ static bool wx_spline_add_point(double x, double y) point->x = (int) x; point->y = (int) y; wx_spline_point_list.Append((wxObject*)point); - return TRUE; + return true; } static void wx_spline_draw_point_array(wxDCBase *dc) @@ -365,6 +365,85 @@ void wxDCBase::DoDrawSpline( wxList *points ) #endif // wxUSE_SPLINES +// ---------------------------------------------------------------------------- +// Partial Text Extents +// ---------------------------------------------------------------------------- + + +// Each element of the widths array will be the width of the string up to and +// including the coresponding character in text. This is the generic +// implementation, the port-specific classes should do this with native APIs +// if available and if faster. Note: pango_layout_index_to_pos is much slower +// than calling GetTextExtent!! + +#define FWC_SIZE 256 + +class FontWidthCache +{ +public: + FontWidthCache() : m_scaleX(1), m_widths(NULL) { } + ~FontWidthCache() { delete []m_widths; } + + void Reset() + { + if (!m_widths) + m_widths = new int[FWC_SIZE]; + + memset(m_widths, 0, sizeof(int)*FWC_SIZE); + } + + wxFont m_font; + double m_scaleX; + int *m_widths; +}; + +static FontWidthCache s_fontWidthCache; + +bool wxDCBase::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const +{ + int totalWidth = 0; + + size_t i, len = text.Length(); + widths.Empty(); + widths.Add(0, len); + int w, h; + + // reset the cache if font or horizontal scale have changed + if (!s_fontWidthCache.m_widths || + (s_fontWidthCache.m_scaleX != m_scaleX) || + (s_fontWidthCache.m_font != GetFont())) + { + s_fontWidthCache.Reset(); + s_fontWidthCache.m_font = GetFont(); + s_fontWidthCache.m_scaleX = m_scaleX; + } + + // Calculate the position of each character based on the widths of + // the previous characters + for (i=0; iNext(), i++ ) { wxPoint *point = (wxPoint *)node->Data(); @@ -689,7 +768,7 @@ void wxDCBase::Rotate( wxList* points, double angle, wxPoint center ) for ( wxNode* node = points->First(); node; node = node->Next() ) { wxPoint* point = (wxPoint*)node->Data(); - + // transform coordinates, if necessary if( center.x ) point->x -= center.x; if( center.y ) point->y -= center.y; @@ -706,9 +785,9 @@ void wxDCBase::Rotate( wxList* points, double angle, wxPoint center ) } } -void wxDCBase::CalculateEllipticPoints( wxList* points, - wxCoord xStart, wxCoord yStart, - wxCoord w, wxCoord h, +void wxDCBase::CalculateEllipticPoints( wxList* points, + wxCoord xStart, wxCoord yStart, + wxCoord w, wxCoord h, double sa, double ea ) { double pi = 3.1415926535; @@ -728,9 +807,9 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, wxCoord b = h/2; // decrement 1 pixel if ellipse is smaller than 2*a, 2*b int decrX = 0; - if( 2*a == w ) decrX = 1; + if( 2*a == w ) decrX = 1; int decrY = 0; - if( 2*b == h ) decrY = 1; + if( 2*b == h ) decrY = 1; // center wxCoord xCenter = xStart + a; wxCoord yCenter = yStart + b; @@ -754,7 +833,7 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, ear = ea * pi / 180.0; // correct angle circle -> ellipse sar = atan( -a/(double)b * tan( sar ) ); - if ( sq == 1 || sq == 2 ) sar += pi; + if ( sq == 1 || sq == 2 ) sar += pi; ear = atan( -a/(double)b * tan( ear ) ); if ( eq == 1 || eq == 2 ) ear += pi; // coordinates of points @@ -793,7 +872,7 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, y2 = y2-y-y+1; --y; } - // old y now to big: set point with old y, old x + // old y now to big: set point with old y, old x if( bNewPoint && x>1) { int x1 = x - 1; @@ -804,7 +883,7 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, pointsarray[3].Append( (wxObject*) new wxPoint( xCenter + x1 - decrX, yCenter + y_old - decrY ) ); } // set point } // calculate point - + // Starting and/or ending points for the quadrants, first quadrant gets both. pointsarray[0].Insert( (wxObject*) new wxPoint( xCenter + a - decrX, yCenter ) ); pointsarray[0].Append( (wxObject*) new wxPoint( xCenter, yCenter - b ) ); @@ -828,12 +907,12 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, { // once: go to starting point in start quadrant if( !bStarted && - ( - ( (wxPoint*) node->Data() )->x < xsa+1 && q <= 1 - || + ( + ( (wxPoint*) node->Data() )->x < xsa+1 && q <= 1 + || ( (wxPoint*) node->Data() )->x > xsa-1 && q >= 2 ) - ) + ) { bStarted = true; } @@ -843,8 +922,8 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, { if( q != eq || bForceTurn || - ( (wxPoint*) node->Data() )->x > xea+1 && q <= 1 - || + ( (wxPoint*) node->Data() )->x > xea+1 && q <= 1 + || ( (wxPoint*) node->Data() )->x < xea-1 && q >= 2 ) { @@ -854,7 +933,7 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, } else if( q == eq && !bForceTurn || ( (wxPoint*) node->Data() )->x == xea) { - bReady = true; + bReady = true; } } } // for node @@ -873,8 +952,7 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, wxPoint *p = (wxPoint *)node->Data(); delete p; } - } - + } } else {