From 87558ba01d8bf9241dee20a76b8ae7fd4db3ece4 Mon Sep 17 00:00:00 2001 From: koldo Date: Thu, 7 Feb 2013 22:10:38 +0000 Subject: [PATCH] ScatterDraw: Now runs on 64 bits too. Included bug fixes and SetLegendWidth() git-svn-id: svn://ultimatepp.org/upp/trunk@5769 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/ScatterDraw/DataSource.cpp | 2 +- uppsrc/ScatterDraw/DataSource.h | 137 +++++++++++++++-------------- uppsrc/ScatterDraw/ScatterDraw.cpp | 33 +++---- uppsrc/ScatterDraw/ScatterDraw.h | 31 ++++--- 4 files changed, 103 insertions(+), 100 deletions(-) diff --git a/uppsrc/ScatterDraw/DataSource.cpp b/uppsrc/ScatterDraw/DataSource.cpp index 5a590b498..664c570ad 100644 --- a/uppsrc/ScatterDraw/DataSource.cpp +++ b/uppsrc/ScatterDraw/DataSource.cpp @@ -14,7 +14,7 @@ double DataSource::Min(Getdatafun getdata) } return minVal; } - + double DataSource::Max(Getdatafun getdata) { double maxVal = DOUBLE_NULL; diff --git a/uppsrc/ScatterDraw/DataSource.h b/uppsrc/ScatterDraw/DataSource.h index cf49c37cb..a33bdea7d 100644 --- a/uppsrc/ScatterDraw/DataSource.h +++ b/uppsrc/ScatterDraw/DataSource.h @@ -5,15 +5,16 @@ NAMESPACE_UPP class DataSource { public: - typedef double (DataSource::*Getdatafun)(int id); + typedef double (DataSource::*Getdatafun)(ptrdiff_t id); DataSource() : isParam(false) {} - virtual ~DataSource() {}; - virtual double z(int id){return Null;}; - virtual double y(int id){return Null;}; - virtual double x(int id){return Null;}; - virtual int GetCount() {return Null;}; - bool IsParam() {return isParam;}; + virtual ~DataSource() {} + virtual double z(ptrdiff_t id) {return Null;} + virtual double y(ptrdiff_t id) {return Null;} + virtual double x(ptrdiff_t id) {return Null;} + virtual ptrdiff_t GetCount() {return Null;} + virtual ptrdiff_t GetCount(int series) {return Null;} + bool IsParam() {return isParam;} virtual double MinX() {return Min(&DataSource::x);} virtual double MinY() {return Min(&DataSource::y);} @@ -38,17 +39,17 @@ protected: class CArray : public DataSource { private: double *xData, *yData, *zData; - int numData; + ptrdiff_t numData; double x0, deltaX; public: - CArray(double *yData, int numData, double x0, double deltaX) : yData(yData), numData(numData), x0(x0), deltaX(deltaX) { xData = NULL; }; - CArray(double *xData, double *yData, int numData) : xData(xData), yData(yData), numData(numData) { zData = NULL; x0 = deltaX = 0; }; - CArray(double *xData, double *yData, double *zData, int numData) : xData(xData), yData(yData), zData(zData), numData(numData) { x0 = deltaX = 0; }; - virtual inline double z(int id) {ASSERT(zData); return zData[id];}; - virtual inline double y(int id) {return yData[id];}; - virtual inline double x(int id) {return xData ? xData[id] : id*deltaX + x0;}; - virtual inline int GetCount() {return numData;}; + CArray(double *yData, int numData, double x0, double deltaX) : yData(yData), numData(numData), x0(x0), deltaX(deltaX) { xData = NULL; } + CArray(double *xData, double *yData, int numData) : xData(xData), yData(yData), numData(numData) { zData = NULL; x0 = deltaX = 0; } + CArray(double *xData, double *yData, double *zData, int numData) : xData(xData), yData(yData), zData(zData), numData(numData) { x0 = deltaX = 0; } + virtual inline double z(ptrdiff_t id) {ASSERT(zData); return zData[id];} + virtual inline double y(ptrdiff_t id) {return yData[id];} + virtual inline double x(ptrdiff_t id) {return xData ? xData[id] : id*deltaX + x0;} + virtual inline ptrdiff_t GetCount() {return numData;} }; template @@ -57,10 +58,10 @@ private: Vector *yData; public: - VectorY(Vector &yData) : yData(&yData) {}; - virtual inline double y(int id) {return (*yData)[id];}; - virtual inline double x(int id) {return id;}; - virtual inline int GetCount() {return yData->GetCount();}; + VectorY(Vector &yData) : yData(&yData) {} + virtual inline double y(ptrdiff_t id) {return (*yData)[id];} + virtual inline double x(ptrdiff_t id) {return id;} + virtual inline ptrdiff_t GetCount() {return yData->GetCount();} }; template @@ -69,10 +70,10 @@ private: Upp::Array *yData; public: - ArrayY(Upp::Array &yData) : yData(&yData) {}; - virtual inline double y(int id) {return (*yData)[id];}; - virtual inline double x(int id) {return id;}; - virtual inline int GetCount() {return yData->GetCount();}; + ArrayY(Upp::Array &yData) : yData(&yData) {} + virtual inline double y(ptrdiff_t id) {return (*yData)[id];} + virtual inline double x(ptrdiff_t id) {return id;} + virtual inline ptrdiff_t GetCount() {return yData->GetCount();} }; class VectorDouble : public DataSource { @@ -80,10 +81,10 @@ private: const Vector *xData, *yData; public: - VectorDouble(const Vector &xData, Vector &yData) : xData(&xData), yData(&yData) {}; - virtual inline double y(int id) {return (*yData)[id];}; - virtual inline double x(int id) {return (*xData)[id];}; - virtual inline int GetCount() {return xData->GetCount();}; + VectorDouble(const Vector &xData, Vector &yData) : xData(&xData), yData(&yData) {} + virtual inline double y(ptrdiff_t id) {return (*yData)[int(id)];} + virtual inline double x(ptrdiff_t id) {return (*xData)[int(id)];} + virtual inline ptrdiff_t GetCount() {return xData->GetCount();} }; class ArrayDouble : public DataSource { @@ -91,10 +92,10 @@ private: const Upp::Array *xData, *yData; public: - ArrayDouble(const Upp::Array &xData, Upp::Array &yData) : xData(&xData), yData(&yData) {}; - virtual inline double y(int id) {return (*yData)[id];}; - virtual inline double x(int id) {return (*xData)[id];}; - virtual inline int GetCount() {return xData->GetCount();}; + ArrayDouble(const Upp::Array &xData, Upp::Array &yData) : xData(&xData), yData(&yData) {} + virtual inline double y(ptrdiff_t id) {return (*yData)[int(id)];} + virtual inline double x(ptrdiff_t id) {return (*xData)[int(id)];} + virtual inline ptrdiff_t GetCount() {return xData->GetCount();} }; class VectorPointf : public DataSource { @@ -102,11 +103,11 @@ private: const Vector *data; public: - VectorPointf(const Vector &data) : data(&data) {}; - VectorPointf(Vector *data) : data(data) {}; - virtual inline double y(int id) {return (*data)[id].y;}; - virtual inline double x(int id) {return (*data)[id].x;}; - virtual inline int GetCount() {return data->GetCount();}; + VectorPointf(const Vector &data) : data(&data) {} + VectorPointf(Vector *data) : data(data) {} + virtual inline double y(ptrdiff_t id) {return (*data)[int(id)].y;} + virtual inline double x(ptrdiff_t id) {return (*data)[int(id)].x;} + virtual inline ptrdiff_t GetCount() {return data->GetCount();} }; class ArrayPointf : public DataSource { @@ -114,10 +115,10 @@ private: Upp::Array *data; public: - ArrayPointf(Upp::Array &data) : data(&data) {}; - virtual inline double y(int id) {return (*data)[id].y;}; - virtual inline double x(int id) {return (*data)[id].x;}; - virtual inline int GetCount() {return data->GetCount();}; + ArrayPointf(Upp::Array &data) : data(&data) {} + virtual inline double y(ptrdiff_t id) {return (*data)[int(id)].y;} + virtual inline double x(ptrdiff_t id) {return (*data)[int(id)].x;} + virtual inline ptrdiff_t GetCount() {return data->GetCount();} }; template @@ -126,10 +127,10 @@ private: VectorMap *data; public: - VectorMapXY(VectorMap &data) : data(&data) {}; - virtual inline double y(int id) {return (*data)[id];}; - virtual inline double x(int id) {return (*data).GetKey(id);}; - virtual inline int GetCount() {return data->GetCount();}; + VectorMapXY(VectorMap &data) : data(&data) {} + virtual inline double y(ptrdiff_t id) {return (*data)[int(id)];} + virtual inline double x(ptrdiff_t id) {return (*data).GetKey(int(id));} + virtual inline ptrdiff_t GetCount() {return data->GetCount();} }; template @@ -138,21 +139,21 @@ private: ArrayMap *data; public: - ArrayMapXY(ArrayMap &data) : data(&data) {}; - virtual inline double y(int id) {return (*data)[id];}; - virtual inline double x(int id) {return (*data).GetKey(id);}; - virtual inline int GetCount() {return data->GetCount();}; + ArrayMapXY(ArrayMap &data) : data(&data) {} + virtual inline double y(ptrdiff_t id) {return (*data)[id];} + virtual inline double x(ptrdiff_t id) {return (*data).GetKey(id);} + virtual inline ptrdiff_t GetCount() {return data->GetCount();} }; - + class FuncSource : public DataSource { private: double (*function)(double); public: - FuncSource(double (*function)(double)) : function(function) {}; - virtual inline double y(int t) {return function(t);}; - virtual inline double x(int t) {return t;}; - virtual inline int GetCount() {return Null;}; + FuncSource(double (*function)(double)) : function(function) {} + virtual inline double y(ptrdiff_t t) {return function(double(t));} + virtual inline double x(ptrdiff_t t) {return double(t);} + virtual inline ptrdiff_t GetCount() {return Null;} }; class FuncSourcePara : public DataSource { @@ -169,21 +170,21 @@ public: lastT = Null; isParam = true; } - virtual inline double y(int t) { + virtual inline double y(ptrdiff_t t) { if (IsNull(lastT) || t != lastT) { lastPointf = function(minT + t*(maxT-minT)/numPoints); - lastT = t; + lastT = double(t); } return lastPointf.y; } - virtual inline double x(int t) { + virtual inline double x(ptrdiff_t t) { if (IsNull(lastT) || t != lastT) { lastPointf = function(minT + t*(maxT-minT)/numPoints); - lastT = t; + lastT = double(t); } return lastPointf.x; } - virtual inline int GetCount() {return numPoints;}; + virtual inline ptrdiff_t GetCount() {return numPoints;} }; typedef Callback2 PlotFunc; @@ -194,11 +195,11 @@ private: PlotFunc function; public: - PlotFuncSource() {}; - PlotFuncSource(PlotFunc &function) : function(function) {}; - virtual inline double y(int t) {double y; function(y, t); return y;}; - virtual inline double x(int t) {return t;}; - virtual inline int GetCount() {return Null;}; + PlotFuncSource() {} + PlotFuncSource(PlotFunc &function) : function(function) {} + virtual inline double y(ptrdiff_t t) {double y; function(y, double(t)); return y;} + virtual inline double x(ptrdiff_t t) {return double(t);} + virtual inline ptrdiff_t GetCount() {return -1;} }; class PlotParamFuncSource : public DataSource { @@ -215,22 +216,22 @@ public: lastT = Null; isParam = true; } - inline double y(int t) { + inline double y(ptrdiff_t t) { if (IsNull(lastT) || t != lastT) { function(lastPointf, minT + t*(maxT-minT)/numPoints); - lastT = t; + lastT = double(t); } return lastPointf.y; } - inline double x(int t) { + inline double x(ptrdiff_t t) { if (IsNull(lastT) || t != lastT) { function(lastPointf, minT + t*(maxT-minT)/numPoints); - lastT = t; + lastT = double(t); } return lastPointf.x; } - virtual inline int GetCount() {return numPoints;}; + virtual inline ptrdiff_t GetCount() {return numPoints;} }; END_UPP_NAMESPACE diff --git a/uppsrc/ScatterDraw/ScatterDraw.cpp b/uppsrc/ScatterDraw/ScatterDraw.cpp index e3dba0cf4..66a45c8d2 100644 --- a/uppsrc/ScatterDraw/ScatterDraw.cpp +++ b/uppsrc/ScatterDraw/ScatterDraw.cpp @@ -145,9 +145,9 @@ ScatterDraw& ScatterDraw::ShowLegend(const bool& show) return *this; } -ScatterDraw& ScatterDraw::SetLegendWeight(const int& weight) +ScatterDraw& ScatterDraw::SetLegendWidth(const int& width) { - legendWeight = weight; + legendWidth = width; return *this; } @@ -171,7 +171,7 @@ ScatterDraw &ScatterDraw::SetDrawY2Reticle(bool set) void ScatterDraw::DrawLegend(Draw& w, const int& scale) const { - int nmr = fround((GetSize().cx - 2*(hPlotLeft + hPlotRight))/legendWeight); //max number of labels per row + int nmr = fround((GetSize().cx - 2*(hPlotLeft + hPlotRight))/legendWidth); //max number of labels per row if (nmr <= 0) return; int nLab = series.GetCount(); //number of labels @@ -194,16 +194,16 @@ void ScatterDraw::DrawLegend(Draw& w, const int& scale) const } for(int i = start; i < end; i++) { Vector vp; - vp << Point(scale*(i-start)*legendWeight, scale*(4-12*(j+1))) << - Point(scale*(i-start)*legendWeight+scale*23, scale*(4-12*(j+1))); + vp << Point(scale*(i-start)*legendWidth, scale*(4-12*(j+1))) << + Point(scale*(i-start)*legendWidth + scale*23, scale*(4-12*(j+1))); if (series[i].opacity > 0 && series[i].seriesPlot) DrawPolylineOpa(w, vp, scale, 1, scale*series[i].thickness, series[i].color, series[i].dash); - Point p(scale*((i-start)*legendWeight+7),scale*(4-12*(j+1))/*+scale*Thick.At(i)/12*/); + Point p(scale*((i-start)*legendWidth+7),scale*(4-12*(j+1))/*+scale*Thick.At(i)/12*/); if (series[i].markWidth >= 1 && series[i].markPlot) series[i].markPlot->Paint(w, scale, p, series[i].markWidth, series[i].markColor); Font scaledFont; scaledFont.Height(scale*StdFont().GetHeight()); - DrawText(w, scale*(i-start)*legendWeight+scale*25, scale*(-2-12*(j+1)), 0, + DrawText(w, scale*(i-start)*legendWidth+scale*25, scale*(-2-12*(j+1)), 0, series[i].legend, scaledFont, series[i].color); } } @@ -340,9 +340,13 @@ void ScatterDraw::FitToData(bool vertical) { xMin -= deltaX; xMinUnit += deltaX; AdjustMinUnitX(); - if (maxx == minx) - xRange = 2*maxx; - else + if (maxx == minx) { + if (maxx == 0) { + xRange = 2; + xMin = -1; + } else + xRange = 2*maxx; + } else xRange = maxx - minx; } if (vertical) { @@ -640,7 +644,7 @@ void ScatterDraw::_InsertSeries(int index, DataSource *data) Refresh(); } -int ScatterDraw::GetCount(int index) +ptrdiff_t ScatterDraw::GetCount(int index) { ASSERT(IsValid(index)); if (series[index].PointsData()->IsParam()) @@ -987,9 +991,9 @@ void ScatterDraw::RemoveAllSeries() Drawing ScatterDraw::GetDrawing() { - DrawingDraw ddw(6*GetSize()); + DrawingDraw ddw(3*GetSize()); - SetDrawing (ddw, 6); + SetDrawing(ddw, 3); return ddw; } @@ -1207,13 +1211,12 @@ ScatterDraw::ScatterDraw() hPlotLeft = hPlotRight = vPlotTop = vPlotBottom = 30; xRange = yRange = yRange2 = 100.0; xMin = yMin = yMin2 = xMinUnit = yMinUnit = yMinUnit2 = 0.0; - logX = logY = logY2 = false; gridColor = SColorDkShadow(); gridWidth = 1; drawXReticle = true; drawYReticle = true; drawY2Reticle = false; drawVGrid = drawHGrid = showLegend = true; - legendWeight = 80; + legendWidth = 80; minXZoom = maxXZoom = minYZoom = maxYZoom = -1; fastViewX = false; sequentialXAll = false; diff --git a/uppsrc/ScatterDraw/ScatterDraw.h b/uppsrc/ScatterDraw/ScatterDraw.h index 01a93c9bf..0db9d98c2 100644 --- a/uppsrc/ScatterDraw/ScatterDraw.h +++ b/uppsrc/ScatterDraw/ScatterDraw.h @@ -128,7 +128,7 @@ public: ScatterDraw& ShowHGrid(const bool& show); ScatterDraw& ShowLegend(const bool& show = true); - ScatterDraw& SetLegendWeight(const int& weight); + ScatterDraw& SetLegendWidth(const int& width); ScatterDraw& SetMode(int _mode = MD_ANTIALIASED) {mode = _mode; Refresh(); return *this;}; int GetMode() {return mode;}; @@ -248,7 +248,7 @@ public: template void InsertSeries(int index, ArrayMap &data) {_InsertSeries(index, new ArrayMapXY(data));} - int GetCount(int index); + ptrdiff_t GetCount(int index); void GetValues(int index, int idata, double &x, double &y); double GetValueX(int index, int idata); double GetValueY(int index, int idata); @@ -342,10 +342,6 @@ public: void SaveAsMetafile(const char* file) const; #endif - ScatterDraw& LogX(const bool& logx=true) {logX=logx; return *this;} - ScatterDraw& LogY(const bool& logy=true) {logY=logy; return *this;} - ScatterDraw& LogY2(const bool& logy=true) {logY2=logy; return *this;} - ScatterDraw& SetMinZoom(double x, double y = -1) {minXZoom = x; minYZoom = y; return *this;} ScatterDraw& SetMaxZoom(double x, double y = -1) {maxXZoom = x; maxYZoom = y; return *this;} @@ -370,6 +366,7 @@ protected: String title; Font titleFont; Color titleColor; + int titleHeight; String xLabel, yLabel, yLabel2; Font labelsFont; @@ -404,7 +401,7 @@ protected: Vector series; bool showLegend; - int legendWeight; + int legendWidth; void DrawLegend(Draw& w,const int& scale) const; @@ -440,8 +437,6 @@ protected: void AdjustMinUnitY(); void AdjustMinUnitY2(); - bool logX, logY, logY2; - private: Size size; static void ParseTextMultiline(const String &text, Font fnt, @@ -463,7 +458,7 @@ void ScatterDraw::SetDrawing(T& w, const int& scale) Size sz(0, 0); - int titleHeight = !title.IsEmpty() ? scale*titleFont.GetHeight() : 0; + titleHeight = !title.IsEmpty() ? scale*titleFont.GetHeight() : 0; if(titleHeight > 0) { Font fontTitle6; @@ -562,6 +557,8 @@ void ScatterDraw::SetDrawing(T& w, const int& scale) ClipEnd(w); } +void kk(); + template void ScatterDraw::Plot(T& w, const int& scale, const int& plotW, const int& plotH) { @@ -592,7 +589,7 @@ void ScatterDraw::Plot(T& w, const int& scale, const int& plotW, const int& plot if (series[j].opacity == 0 || (!series[j].seriesPlot && !series[j].markPlot)) continue; Vector p1; - int imin, imax; + ptrdiff_t imin, imax; if (series[j].sequential) { imin = imax = Null; for (int i = 1; i < series[j].PointsData()->GetCount() - 1; ++i) { @@ -611,19 +608,19 @@ void ScatterDraw::Plot(T& w, const int& scale, const int& plotW, const int& plot } else if (series[j].PointsData()->IsParam()) { // It is a param function imin = 0; imax = series[j].PointsData()->GetCount(); - } else if (IsNull(series[j].PointsData()->GetCount())) { // It is a function + } else if (IsNull(series[j].PointsData()->GetCount())) { // It is a function imin = fround(xMin) - 1; imax = fround(xMin + xRange) + 1; } else { imin = 0; imax = series[j].PointsData()->GetCount(); } - int numV; + ptrdiff_t numV; if (fastViewX) numV = 1 + (imax - imin)/plotW; else numV = 1; - for (int i = imin; i < imax; i += numV) { + for (ptrdiff_t i = imin; i < imax; i += numV) { double xx, yy; if (fastViewX && numV > 1) { yy = 0; @@ -634,10 +631,12 @@ void ScatterDraw::Plot(T& w, const int& scale, const int& plotW, const int& plot xx = (series[j].PointsData()->x(i) + series[j].PointsData()->x(i + ii - 1))/2; } else { xx = series[j].PointsData()->x(i); + DUMP(i); + DUMP(series[j].PointsData()->x(i)); yy = series[j].PointsData()->y(i); } - int ix, iy; - ix = fround(plotW*(xx - xMin)/xRange); + int ix = fround(plotW*(xx - xMin)/xRange); + int iy; if (series[j].primaryY) iy = fround(plotH*(yy - yMin)/yRange); else