wxRect2DDouble wxGraphicsPath::GetBox() const { wxDouble x,y,w,h; GetBox(&x,&y,&w,&h); return wxRect2DDouble( x,y,w,h ); }
wxPlotMarkerRefData(int type = 0, const wxRect2DDouble& rect = wxRect2DDouble()) : wxObjectRefData(), m_markerType(type), m_rect(rect), m_size(wxSize(-1, -1)) {}
wxRect2DDouble wxPlotMarker::GetPlotRect() const { wxCHECK_MSG(Ok(), wxRect2DDouble(), wxT("Invalid plot marker")); return M_PMARKERDATA->m_rect; }
void wxPlotDrawerDataCurve::Draw(wxDC *dc, wxPlotData* curve, int curve_index) { wxCHECK_RET(dc && m_owner && curve && curve->Ok(), wxT("invalid curve")); INITIALIZE_FAST_GRAPHICS wxRect dcRect(GetDCRect()); wxRect2DDouble viewRect( GetPlotViewRect() ); //m_viewRect ); wxRect2DDouble subViewRect( m_owner->GetPlotRectFromClientRect(dcRect) ); wxRect2DDouble curveRect( curve->GetBoundingRect() ); if (!wxPlotRect2DDoubleIntersects(curveRect, subViewRect)) return; /* // FIXME - drawing symbol bitmaps in MSW is very slow wxBitmap bitmap; if (curve == GetActiveCurve()) bitmap = curve->GetSymbol(wxPLOTPEN_ACTIVE); else bitmap = curve->GetSymbol(wxPLOTPEN_NORMAL); if (!bitmap.Ok()) { if (curve == GetActiveCurve()) bitmap = wxPlotSymbolCurrent; else bitmap = wxPlotSymbolNormal; } int bitmapHalfWidth = bitmap.GetWidth()/2; int bitmapHalfHeight = bitmap.GetHeight()/2; */ // find the starting and ending indexes into the data curve int n, n_start, n_end; bool x_ordered = curve->GetIsXOrdered(); if (x_ordered) { n_start = curve->GetIndexFromX(subViewRect.GetLeft(), wxPlotData::index_floor); n_end = curve->GetIndexFromX(subViewRect.GetRight(), wxPlotData::index_ceil); n_end++; // for statement comparison is < } else { n_start = 0; n_end = curve->GetCount(); } // set the pens to draw with wxPen currentPen = (curve_index == m_owner->GetActiveIndex()) ? curve->GetPen(wxPLOTPEN_ACTIVE).GetPen() : curve->GetPen(wxPLOTPEN_NORMAL).GetPen(); wxPen selectedPen = curve->GetPen(wxPLOTPEN_SELECTED).GetPen(); if (m_pen_scale != 1) { currentPen.SetWidth(int(currentPen.GetWidth() * m_pen_scale)); selectedPen.SetWidth(int(selectedPen.GetWidth() * m_pen_scale)); } dc->SetPen(currentPen); // handle the selected ranges and initialize the starting range const wxArrayRangeInt &ranges = m_owner->GetDataCurveSelection(curve_index)->GetRangeArray(); int n_range = 0, range_count = ranges.GetCount(); int min_sel = -1, max_sel = -1; for (n_range=0; n_range<range_count; n_range++) { const wxRangeInt& range = ranges[n_range]; if ((range.m_max >= n_start) || (range.m_min >= n_start)) { min_sel = range.m_min; max_sel = range.m_max; if (range.Contains(n_start)) dc->SetPen( selectedPen ); break; } } // data variables const double *x_data = &curve->GetXData()[n_start]; const double *y_data = &curve->GetYData()[n_start]; int i0, j0, i1, j1; // curve coords in pixels double x0, y0, x1, y1; // original curve coords double xx0, yy0, xx1, yy1; // clipped curve coords x0 = *x_data; y0 = *y_data; int clipped = ClippedNeither; bool draw_lines = m_owner->GetDrawLines(); bool draw_symbols = m_owner->GetDrawSymbols(); bool draw_spline = m_owner->GetDrawSpline(); SplineDrawer sd; wxRangeDoubleSelection dblRangeSel; if (draw_spline) { wxRangeDouble viewRange(viewRect.m_x, viewRect.GetRight()); wxRangeDouble dcRange(dcRect.x, dcRect.GetRight()); for (int r = n_range; r < range_count; r++) { wxRangeDouble plotRange(curve->GetXValue(ranges[r].m_min), curve->GetXValue(ranges[r].m_max)); if (viewRange.Intersects(plotRange)) { double min_x = m_owner->GetClientCoordFromPlotX(plotRange.m_min); double max_x = m_owner->GetClientCoordFromPlotX(plotRange.m_max); dblRangeSel.SelectRange(wxRangeDouble(min_x, max_x)); } else break; } // spline starts 2 points back for smoothness int s_start = n_start > 1 ? -2 : n_start > 0 ? -1 : 0; sd.Create(dc, currentPen, selectedPen, wxRect2DDouble(dcRect.x, dcRect.y, dcRect.width, dcRect.height), &dblRangeSel, m_owner->GetClientCoordFromPlotX(x_data[s_start]), m_owner->GetClientCoordFromPlotY(y_data[s_start]), m_owner->GetClientCoordFromPlotX(x_data[s_start+1]), m_owner->GetClientCoordFromPlotY(y_data[s_start+1])); } for (n = n_start; n < n_end; n++) { x1 = *x_data++; y1 = *y_data++; if (draw_spline) sd.DrawSpline(m_owner->GetClientCoordFromPlotX(x1), m_owner->GetClientCoordFromPlotY(y1)); xx0 = x0; yy0 = y0; xx1 = x1; yy1 = y1; clipped = ClipLineToRect(xx0, yy0, xx1, yy1, viewRect); if (clipped != ClippedOut) { i0 = m_owner->GetClientCoordFromPlotX(xx0); j0 = m_owner->GetClientCoordFromPlotY(yy0); i1 = m_owner->GetClientCoordFromPlotX(xx1); j1 = m_owner->GetClientCoordFromPlotY(yy1); if (draw_lines && ((i0 != i1) || (j0 != j1))) { wxPLOTCTRL_DRAW_LINE(dc, window, pen, i0, j0, i1, j1); } if (n == min_sel) dc->SetPen( selectedPen ); if (draw_symbols && !((clipped & ClippedSecond) != 0) && ((i0 != i1) || (j0 != j1) || (n == min_sel) || (n == n_start))) { //dc->DrawBitmap( bitmap, i1 - bitmapHalfWidth, j1 - bitmapHalfHeight, true ); wxPLOTCTRL_DRAW_ELLIPSE(dc, window, pen, i1, j1, 2, 2); } } else if (n == min_sel) { dc->SetPen( selectedPen ); } if (n == max_sel) { dc->SetPen( currentPen ); if (n_range < range_count - 1) { n_range++; min_sel = ranges[n_range].m_min; max_sel = ranges[n_range].m_max; } } x0 = x1; y0 = y1; } if (draw_spline) { // want an extra point at the end to smooth it out if (n_end < (int)curve->GetCount() - 1) sd.DrawSpline(m_owner->GetClientCoordFromPlotX(*x_data), m_owner->GetClientCoordFromPlotY(*y_data)); sd.EndSpline(); } dc->SetPen(wxNullPen); }