diff --git a/src/lib/aqdiagram/graph/w_viewport.c b/src/lib/aqdiagram/graph/w_viewport.c index 11ad098..c581eac 100644 --- a/src/lib/aqdiagram/graph/w_viewport.c +++ b/src/lib/aqdiagram/graph/w_viewport.c @@ -34,12 +34,6 @@ static void _drawCurves(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc); static void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, double minValueX, double maxValueX, double minValueY, double maxValueY, int pen); -static void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, - double minValueX, double maxValueX, double minValueY, double maxValueY, - int pen); -static void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, - double minValueX, double maxValueX, double minValueY, double maxValueY, - int pen); static void _drawVerticalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc); static void _drawHorizontalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc); static int _screenDistBetweenLevelTicksX(const AQDG_GRAPH_TICK_LIST *tickList, int lvl, @@ -47,6 +41,16 @@ static int _screenDistBetweenLevelTicksX(const AQDG_GRAPH_TICK_LIST *tickList, i static int _screenDistBetweenLevelTicksY(const AQDG_GRAPH_TICK_LIST *tickList, int lvl, int contentSize, double minValue, double maxValue); +static void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen); +static void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen); +static void _drawCurveStepLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen); + /* ------------------------------------------------------------------------------------------------ @@ -185,6 +189,9 @@ void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *c case AQDG_GRAPH_TYPE_POINTS: _drawCurvePoints(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen); break; + case AQDG_GRAPH_TYPE_STEPLINE: + _drawCurveStepLines(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen); + break; case AQDG_GRAPH_TYPE_BARS: default: break; @@ -193,87 +200,6 @@ void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *c -void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, - double minValueX, double maxValueX, double minValueY, double maxValueY, - int pen) -{ - int width; - int height; - const AQDG_GRAPH_DATAPAIR_LIST *dpList; - const AQDG_GRAPH_DATAPAIR *dp; - int absX; - int absY; - int lastX=-1; - int lastY=-1; - - absX=AQDG_Object_GetAbsoluteX(o); - absY=AQDG_Object_GetAbsoluteY(o); - width=AQDG_Object_GetWidth(o); - height=AQDG_Object_GetHeight(o); - dpList=AQDG_Graph_Curve_GetDataPairs(curve); - dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL; - while(dp) { - int xPos; - int yPos; - double xValue; - double yValue; - - xValue=AQDG_Graph_DataPair_GetValueX(dp); - yValue=AQDG_Graph_DataPair_GetValueY(dp); - - xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX); - yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY); - if (lastX>=0 && lastY>=0) - AQDG_Draw_Context_DrawLine(dc, pen, absX+lastX, absY+lastY, absX+xPos, absY+yPos); - AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos-2, absX+xPos+2, absY+yPos+2); - AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos+2, absX+xPos+2, absY+yPos-2); - lastX=xPos; - lastY=yPos; - dp=AQDG_Graph_DataPair_List_Next(dp); - } -} - - - -void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, - double minValueX, double maxValueX, double minValueY, double maxValueY, - int pen) -{ - int width; - int height; - const AQDG_GRAPH_DATAPAIR_LIST *dpList; - const AQDG_GRAPH_DATAPAIR *dp; - int absX; - int absY; - - absX=AQDG_Object_GetAbsoluteX(o); - absY=AQDG_Object_GetAbsoluteY(o); - width=AQDG_Object_GetWidth(o); - height=AQDG_Object_GetHeight(o); - dpList=AQDG_Graph_Curve_GetDataPairs(curve); - dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL; - while(dp) { - int xPos; - int yPos; - double xValue; - double yValue; - - xValue=AQDG_Graph_DataPair_GetValueX(dp); - yValue=AQDG_Graph_DataPair_GetValueY(dp); - - xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX); - yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY); - AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos-4, absX+xPos+4, absY+yPos+4); - AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos+4, absX+xPos+4, absY+yPos-4); - dp=AQDG_Graph_DataPair_List_Next(dp); - } -} - - - - - - void _drawVerticalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc) { AQDG_WIDGET_VIEWPORT *xo; @@ -418,3 +344,138 @@ int _screenDistBetweenLevelTicksY(const AQDG_GRAPH_TICK_LIST *tickList, int lvl, + + + +/* ------------------------------------------------------------------------------------------------ + * graph drawing + * ------------------------------------------------------------------------------------------------ + */ + + + +void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen) +{ + int width; + int height; + const AQDG_GRAPH_DATAPAIR_LIST *dpList; + const AQDG_GRAPH_DATAPAIR *dp; + int absX; + int absY; + int lastX=-1; + int lastY=-1; + + absX=AQDG_Object_GetAbsoluteX(o); + absY=AQDG_Object_GetAbsoluteY(o); + width=AQDG_Object_GetWidth(o); + height=AQDG_Object_GetHeight(o); + dpList=AQDG_Graph_Curve_GetDataPairs(curve); + dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL; + while(dp) { + int xPos; + int yPos; + double xValue; + double yValue; + + xValue=AQDG_Graph_DataPair_GetValueX(dp); + yValue=AQDG_Graph_DataPair_GetValueY(dp); + + xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX); + yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY); + if (lastX>=0 && lastY>=0) + AQDG_Draw_Context_DrawLine(dc, pen, absX+lastX, absY+lastY, absX+xPos, absY+yPos); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos-2, absX+xPos+2, absY+yPos+2); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos+2, absX+xPos+2, absY+yPos-2); + lastX=xPos; + lastY=yPos; + dp=AQDG_Graph_DataPair_List_Next(dp); + } +} + + + +void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen) +{ + int width; + int height; + const AQDG_GRAPH_DATAPAIR_LIST *dpList; + const AQDG_GRAPH_DATAPAIR *dp; + int absX; + int absY; + + absX=AQDG_Object_GetAbsoluteX(o); + absY=AQDG_Object_GetAbsoluteY(o); + width=AQDG_Object_GetWidth(o); + height=AQDG_Object_GetHeight(o); + dpList=AQDG_Graph_Curve_GetDataPairs(curve); + dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL; + while(dp) { + int xPos; + int yPos; + double xValue; + double yValue; + + xValue=AQDG_Graph_DataPair_GetValueX(dp); + yValue=AQDG_Graph_DataPair_GetValueY(dp); + + xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX); + yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos-4, absX+xPos+4, absY+yPos+4); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos+4, absX+xPos+4, absY+yPos-4); + dp=AQDG_Graph_DataPair_List_Next(dp); + } +} + + + +void _drawCurveStepLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen) +{ + int width; + int height; + const AQDG_GRAPH_DATAPAIR_LIST *dpList; + const AQDG_GRAPH_DATAPAIR *dp; + int absX; + int absY; + int lastX=-1; + int lastY=-1; + + absX=AQDG_Object_GetAbsoluteX(o); + absY=AQDG_Object_GetAbsoluteY(o); + width=AQDG_Object_GetWidth(o); + height=AQDG_Object_GetHeight(o); + dpList=AQDG_Graph_Curve_GetDataPairs(curve); + dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL; + while(dp) { + int xPos; + int yPos; + double xValue; + double yValue; + + xValue=AQDG_Graph_DataPair_GetValueX(dp); + yValue=AQDG_Graph_DataPair_GetValueY(dp); + + xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX); + yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY); + if (lastX>=0 && lastY>=0) { + AQDG_Draw_Context_DrawLine(dc, pen, absX+lastX, absY+lastY, absX+xPos, absY+lastY); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos, absY+lastY, absX+xPos, absY+yPos); + } + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos-2, absX+xPos+2, absY+yPos+2); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos+2, absX+xPos+2, absY+yPos-2); + lastX=xPos; + lastY=yPos; + dp=AQDG_Graph_DataPair_List_Next(dp); + } +} + + + + + +