void iupPlot::DrawBackground(cdCanvas* canvas) const { cdCanvasOrigin(canvas, 0, 0); cdCanvasClip(canvas, CD_CLIPOFF); cdCanvasSetForeground(canvas, mBack.mColor); cdCanvasBox(canvas, mViewportBack.mX, mViewportBack.mX + mViewportBack.mWidth - 1, mViewportBack.mY, mViewportBack.mY + mViewportBack.mHeight - 1); }
void iupPlot::DrawInactive(cdCanvas* canvas) const { cdCanvasOrigin(canvas, 0, 0); cdCanvasClip(canvas, CD_CLIPOFF); long inactive_color = cdEncodeAlpha(CD_GRAY, 96); cdCanvasSetForeground(canvas, inactive_color); cdCanvasBox(canvas, mViewportBack.mX, mViewportBack.mX + mViewportBack.mWidth - 1, mViewportBack.mY, mViewportBack.mY + mViewportBack.mHeight - 1); }
void cdCanvasRestoreState(cdCanvas* canvas, cdState* state) { assert(canvas); assert(state); if (!state || !_cdCheckCanvas(canvas)) return; /* clippling must be done in low level because origin and invert y axis */ canvas->clip_poly_n = state->clip_poly_n; if (canvas->clip_poly) { free(canvas->clip_poly); canvas->clip_poly = NULL; } if (canvas->clip_fpoly) { free(canvas->clip_fpoly); canvas->clip_fpoly = NULL; } if (state->clip_poly) { int size = state->clip_poly_n*sizeof(cdPoint); canvas->clip_poly = (cdPoint*)malloc(size); memcpy(canvas->clip_poly, state->clip_poly, size); } if (state->clip_fpoly) { int size = state->clip_poly_n*sizeof(cdfPoint); canvas->clip_fpoly = (cdfPoint*)malloc(size); memcpy(canvas->clip_fpoly, state->clip_fpoly, size); } cdCanvasClip(canvas, CD_CLIPOFF); if (canvas->clip_fpoly) canvas->cxFPoly(canvas->ctxcanvas, CD_CLIP, state->clip_fpoly, state->clip_poly_n); else if (canvas->clip_poly) canvas->cxPoly(canvas->ctxcanvas, CD_CLIP, state->clip_poly, state->clip_poly_n); cdCanvasClipArea(canvas, state->clip_rect.xmin, state->clip_rect.xmax, state->clip_rect.ymin, state->clip_rect.ymax); if (canvas->cxFClipArea) canvas->cxFClipArea(canvas->ctxcanvas, state->clip_frect.xmin, state->clip_frect.xmax, state->clip_frect.ymin, state->clip_frect.ymax); else if (canvas->cxClipArea) canvas->cxClipArea(canvas->ctxcanvas, state->clip_rect.xmin, state->clip_rect.xmax, state->clip_rect.ymin, state->clip_rect.ymax); cdCanvasClip(canvas, state->clip_mode); /* regular attributes */ cdCanvasSetBackground(canvas, state->background); cdCanvasSetForeground(canvas, state->foreground); cdCanvasBackOpacity(canvas, state->back_opacity); cdCanvasWriteMode(canvas, state->write_mode); cdCanvasLineStyle(canvas, state->line_style); cdCanvasLineWidth(canvas, state->line_width); cdCanvasLineCap(canvas, state->line_cap); cdCanvasLineJoin(canvas, state->line_join); cdCanvasFillMode(canvas, state->fill_mode); cdCanvasLineStyleDashes(canvas, state->line_dashes, state->line_dashes_count); cdCanvasHatch(canvas, state->hatch_style); if (state->stipple) cdCanvasStipple(canvas, state->stipple_w, state->stipple_h, state->stipple); if (state->pattern) cdCanvasPattern(canvas, state->pattern_w, state->pattern_h, state->pattern); cdCanvasInteriorStyle(canvas, state->interior_style); if (state->native_font[0]) cdCanvasNativeFont(canvas, state->native_font); else cdCanvasFont(canvas, state->font_type_face, state->font_style, state->font_size); cdCanvasTextAlignment(canvas, state->text_alignment); cdCanvasTextOrientation(canvas, state->text_orientation); cdCanvasMarkType(canvas, state->mark_type); cdCanvasMarkSize(canvas, state->mark_size); cdCanvasOrigin(canvas, state->origin.x, state->origin.y); if (state->use_matrix) cdCanvasTransform(canvas, state->matrix); wdCanvasWindow(canvas, state->window.xmin, state->window.xmax, state->window.ymin, state->window.ymax); wdCanvasViewport(canvas, state->viewport.xmin, state->viewport.xmax, state->viewport.ymin, state->viewport.ymax); cdCanvasSimulate(canvas, state->sim_mode); /* complex clipping regions are not saved */ /* driver internal attributes are not saved */ }
bool iupPlot::Render(cdCanvas* canvas) { if (!mRedraw) return true; // Shift the drawing area to the plot viewport cdCanvasOrigin(canvas, mViewport.mX, mViewport.mY); // There are no additional transformations set in the CD canvas, // all transformations are done here. cdCanvasClip(canvas, CD_CLIPAREA); // Draw the background, axis and grid restricted only by the viewport cdCanvasClipArea(canvas, 0, mViewport.mWidth - 1, 0, mViewport.mHeight - 1); // draw entire plot viewport DrawBackground(canvas); if (!mDataSetListCount) return true; cdCanvasNativeFont(canvas, IupGetAttribute(ih, "FONT")); ConfigureAxis(); if (!CalculateAxisRange()) return false; if (!CheckRange(mAxisX)) return false; if (!CheckRange(mAxisY)) return false; CalculateTitlePos(); // Must be before calculate margins CalculateTickSize(canvas, mAxisX.mTick); CalculateTickSize(canvas, mAxisY.mTick); CalculateMargins(canvas); iupPlotRect theDatasetArea; theDatasetArea.mX = mBack.mMargin.mLeft; theDatasetArea.mY = mBack.mMargin.mBottom; theDatasetArea.mWidth = mViewport.mWidth - mBack.mMargin.mLeft - mBack.mMargin.mRight; theDatasetArea.mHeight = mViewport.mHeight - mBack.mMargin.mTop - mBack.mMargin.mBottom; if (!CalculateTickSpacing(theDatasetArea, canvas)) return false; if (!CalculateXTransformation(theDatasetArea)) return false; if (!CalculateYTransformation(theDatasetArea)) return false; IFnC pre_cb = (IFnC)IupGetCallback(ih, "PREDRAW_CB"); if (pre_cb) pre_cb(ih, canvas); if (mBack.GetImage()) DrawBackgroundImage(canvas); if (!mGrid.DrawX(mAxisX.mTickIter, mAxisX.mTrafo, theDatasetArea, canvas)) return false; if (mGrid.mShowX) mGridMinor.DrawX(mAxisX.mTickIter, mAxisX.mTrafo, theDatasetArea, canvas); if (!mGrid.DrawY(mAxisY.mTickIter, mAxisY.mTrafo, theDatasetArea, canvas)) return false; if (mGrid.mShowY) mGridMinor.DrawY(mAxisY.mTickIter, mAxisY.mTrafo, theDatasetArea, canvas); if (!mAxisX.DrawX(theDatasetArea, canvas, mAxisY)) return false; if (!mAxisY.DrawY(theDatasetArea, canvas, mAxisX)) return false; if (mBox.mShow) mBox.Draw(theDatasetArea, canvas); // draw the datasets, legend, crosshair and selection restricted to the dataset area cdCanvasClipArea(canvas, theDatasetArea.mX, theDatasetArea.mX + theDatasetArea.mWidth - 1, theDatasetArea.mY, theDatasetArea.mY + theDatasetArea.mHeight - 1); IFniiddi drawsample_cb = (IFniiddi)IupGetCallback(ih, "DRAWSAMPLE_CB"); for (int ds = 0; ds < mDataSetListCount; ds++) { iupPlotDataSet* dataset = mDataSetList[ds]; if (drawsample_cb) { iupPlotSampleNotify inNotify = { ih, ds, drawsample_cb }; dataset->DrawData(mAxisX.mTrafo, mAxisY.mTrafo, canvas, &inNotify); } else dataset->DrawData(mAxisX.mTrafo, mAxisY.mTrafo, canvas, NULL); } if (mCrossHairH) DrawCrossHairH(theDatasetArea, canvas); else if (mCrossHairV) DrawCrossHairV(theDatasetArea, canvas); if (mShowSelectionBand) { if (mSelectionBand.mX < theDatasetArea.mX) { mSelectionBand.mWidth = mSelectionBand.mX + mSelectionBand.mWidth - theDatasetArea.mX; mSelectionBand.mX = theDatasetArea.mX; } if (mSelectionBand.mY < theDatasetArea.mY) { mSelectionBand.mHeight = mSelectionBand.mY + mSelectionBand.mHeight - theDatasetArea.mY; mSelectionBand.mY = theDatasetArea.mY; } if (mSelectionBand.mX + mSelectionBand.mWidth > theDatasetArea.mX + theDatasetArea.mWidth) mSelectionBand.mWidth = theDatasetArea.mX + theDatasetArea.mWidth - mSelectionBand.mX; if (mSelectionBand.mY + mSelectionBand.mHeight > theDatasetArea.mY + theDatasetArea.mHeight) mSelectionBand.mHeight = theDatasetArea.mY + theDatasetArea.mHeight - mSelectionBand.mY; mBox.Draw(mSelectionBand, canvas); } IFnC post_cb = (IFnC)IupGetCallback(ih, "POSTDRAW_CB"); if (post_cb) post_cb(ih, canvas); if (!DrawLegend(theDatasetArea, canvas, mLegend.mPos)) return false; // Draw title restricted only by the viewport cdCanvasClipArea(canvas, 0, mViewport.mWidth - 1, 0, mViewport.mHeight - 1); DrawTitle(canvas); if (!IupGetInt(ih, "ACTIVE")) DrawInactive(canvas); mRedraw = false; return true; }