git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27071
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
public:
FontWidthCache() : m_scaleX(1), m_widths(NULL) { }
~FontWidthCache() { delete []m_widths; }
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);
- }
-
+
+ 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;
wxFont m_font;
double m_scaleX;
int *m_widths;
widths.Empty();
widths.Add(0, len);
int w, h;
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) ||
// reset the cache if font or horizontal scale have changed
if (!s_fontWidthCache.m_widths ||
(s_fontWidthCache.m_scaleX != m_scaleX) ||
// Calculate the position of each character based on the widths of
// the previous characters
// Calculate the position of each character based on the widths of
// the previous characters
{
const wxChar c = text[i];
unsigned int c_int = (unsigned int)c;
{
const wxChar c = text[i];
unsigned int c_int = (unsigned int)c;
- if ((c_int < FWC_SIZE) && (s_fontWidthCache.m_widths[c_int] != 0))
+ if ((c_int < FWC_SIZE) && (s_fontWidthCache.m_widths[c_int] != 0))
{
w = s_fontWidthCache.m_widths[c_int];
}
{
w = s_fontWidthCache.m_widths[c_int];
}
{
GetTextExtent(c, &w, &h);
if (c_int < FWC_SIZE)
{
GetTextExtent(c, &w, &h);
if (c_int < FWC_SIZE)
totalWidth += w;
widths[i] = totalWidth;
}
totalWidth += w;
widths[i] = totalWidth;
}
methods like (WinCE) wxDC::DoDrawArc(...).
CalculateEllipticPoints(...) fills a given list of wxPoints with some points
methods like (WinCE) wxDC::DoDrawArc(...).
CalculateEllipticPoints(...) fills a given list of wxPoints with some points
-of an elliptic arc. The algorithm is pixel-based: In every row (in flat
+of an elliptic arc. The algorithm is pixel-based: In every row (in flat
parts) or every column (in steep parts) only one pixel is calculated.
Trigonometric calculation (sin, cos, tan, atan) is only done if the
parts) or every column (in steep parts) only one pixel is calculated.
Trigonometric calculation (sin, cos, tan, atan) is only done if the
-starting angle is not equal to the ending angle. The calculation of the
+starting angle is not equal to the ending angle. The calculation of the
pixels is done using simple arithmetic only and should perform not too
bad even on devices without floating point processor. I didn't test this yet.
Rotate(...) rotates a list of point pixel-based, you will see rounding errors.
pixels is done using simple arithmetic only and should perform not too
bad even on devices without floating point processor. I didn't test this yet.
Rotate(...) rotates a list of point pixel-based, you will see rounding errors.
-For instance: an ellipse rotated 180 degrees is drawn
+For instance: an ellipse rotated 180 degrees is drawn
slightly different from the original.
slightly different from the original.
-The points are then moved to an array and used to draw a polyline and/or polygon
-(with center added, the pie).
+The points are then moved to an array and used to draw a polyline and/or polygon
+(with center added, the pie).
The result looks quite similar to the native ellipse, only e few pixels differ.
The performance on a desktop system (Athlon 1800, WinXP) is about 7 times
The result looks quite similar to the native ellipse, only e few pixels differ.
The performance on a desktop system (Athlon 1800, WinXP) is about 7 times
An rotated ellipse outside the clipping region takes nearly the same time,
while an native ellipse outside takes nearly no time to draw.
An rotated ellipse outside the clipping region takes nearly the same time,
while an native ellipse outside takes nearly no time to draw.
-If you draw an arc with this new method, you will see the starting and ending angles
+If you draw an arc with this new method, you will see the starting and ending angles
are calculated properly.
If you use DrawEllipticArc(...), you will see they are only correct for circles
and not properly calculated for ellipses.
are calculated properly.
If you use DrawEllipticArc(...), you will see they are only correct for circles
and not properly calculated for ellipses.
-void wxDCBase::DoDrawEllipticArcRot( wxCoord x, wxCoord y,
- wxCoord w, wxCoord h,
+void wxDCBase::DoDrawEllipticArcRot( wxCoord x, wxCoord y,
+ wxCoord w, wxCoord h,
double sa, double ea, double angle )
{
wxList list;
double sa, double ea, double angle )
{
wxList list;
int n = list.Number();
wxPoint *points = new wxPoint[n];
int i = 0;
int n = list.Number();
wxPoint *points = new wxPoint[n];
int i = 0;
for ( node = list.First(); node; node = node->Next(), i++ )
{
wxPoint *point = (wxPoint *)node->Data();
for ( node = list.First(); node; node = node->Next(), i++ )
{
wxPoint *point = (wxPoint *)node->Data();
for ( wxNode* node = points->First(); node; node = node->Next() )
{
wxPoint* point = (wxPoint*)node->Data();
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;
// transform coordinates, if necessary
if( center.x ) point->x -= center.x;
if( center.y ) point->y -= center.y;
-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;
double sa, double ea )
{
double pi = 3.1415926535;
wxCoord b = h/2;
// decrement 1 pixel if ellipse is smaller than 2*a, 2*b
int decrX = 0;
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;
- if( 2*b == h ) decrY = 1;
+ if( 2*b == h ) decrY = 1;
// center
wxCoord xCenter = xStart + a;
wxCoord yCenter = yStart + b;
// center
wxCoord xCenter = xStart + a;
wxCoord yCenter = yStart + b;
ear = ea * pi / 180.0;
// correct angle circle -> ellipse
sar = atan( -a/(double)b * tan( sar ) );
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
ear = atan( -a/(double)b * tan( ear ) );
if ( eq == 1 || eq == 2 ) ear += pi;
// coordinates of points
- // 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;
if( bNewPoint && x>1)
{
int x1 = x - 1;
pointsarray[3].Append( (wxObject*) new wxPoint( xCenter + x1 - decrX, yCenter + y_old - decrY ) );
} // set point
} // calculate point
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 ) );
// 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 ) );
{
// once: go to starting point in start quadrant
if( !bStarted &&
{
// 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
)
( (wxPoint*) node->Data() )->x > xsa-1 && q >= 2
)
{
if( q != eq || bForceTurn
||
{
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
)
{
( (wxPoint*) node->Data() )->x < xea-1 && q >= 2
)
{
}
else if( q == eq && !bForceTurn || ( (wxPoint*) node->Data() )->x == xea)
{
}
else if( q == eq && !bForceTurn || ( (wxPoint*) node->Data() )->x == xea)
{
wxPoint *p = (wxPoint *)node->Data();
delete p;
}
wxPoint *p = (wxPoint *)node->Data();
delete p;
}