void IupCdSetFont(Ihandle* ih, cdCanvas *canvas, const char* font) { char* lastfont = iupAttribGetStr(ih, "_IUPLAST_FONT"); if (!lastfont || !iupStrEqual(lastfont, font)) { iupAttribSetStr(ih, "_IUPLAST_FONT", font); cdCanvasNativeFont(canvas, font); } }
void primUpdateAttrib_Text(tPrimNode *prim, cdCanvas *canvas) { cdCanvasSetForeground(canvas, prim->attrib.text.foreground); cdCanvasTextAlignment(canvas, prim->attrib.text.text_alignment); cdCanvasTextOrientation(canvas, prim->attrib.text.text_orientation); if (canvas->native_font[0]) cdCanvasNativeFont(canvas, prim->attrib.text.native_font); else cdCanvasFont(canvas, prim->attrib.text.font_type_face, prim->attrib.text.font_style, prim->attrib.text.font_size); }
/* Callback called when the tree is scrolled. */ static int iTreeScrollCB(Ihandle* ih) { if (ih->data->cddbuffer) { cdCanvasActivate(ih->data->cddbuffer); iupTreeEditCheckHidden(ih); cdCanvasNativeFont(ih->data->cddbuffer, IupGetAttribute(ih, "FONT")); iupTreeDrawTree(ih); cdCanvasFlush(ih->data->cddbuffer); } if(ih && ih->data->selected && ih->data->selected->visible == NO) iupTreeGSSetValue(ih, "PREVIOUS", 0); return IUP_DEFAULT; }
/* Callback called when the tree needs to be redrawn. */ int iupTreeRepaint(Ihandle* ih) { if(!ih->data->cddbuffer) return IUP_DEFAULT; cdCanvasActivate(ih->data->cddbuffer); cdCanvasNativeFont(ih->data->cddbuffer, IupGetAttribute(ih, "FONT")); iupTreeDrawTree(ih); /* TODO: split the calcsize from the redraw */ iTreeUpdateScrollPos(ih); cdCanvasActivate(ih->data->cddbuffer); iupTreeDrawTree(ih); cdCanvasFlush(ih->data->cddbuffer); if(ih && ih->data->selected && ih->data->selected->visible == NO) iupTreeGSSetValue(ih, "PREVIOUS", 1); return IUP_DEFAULT; }
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; }
static void iMatrixDrawSetFont(Ihandle* ih, int lin, int col) { cdCanvasNativeFont(ih->data->cddbuffer, iupMatrixDrawGetFont(ih, lin, col)); }
/* Put the cell contents in the screen, using the specified color and alignment. -> y1, y2 : vertical limits of the cell -> x1, x2 : horizontal limits of the complete cell -> alignment : alignment type (horizontal) assigned to the text. The options are: [IMAT_T_CENTER,IMAT_T_LEFT,IMAT_T_RIGHT] -> marked : mark state -> lin, col - cell coordinates */ static void iMatrixDrawCellValue(Ihandle* ih, int x1, int x2, int y1, int y2, int alignment, int marked, int active, int lin, int col, IFniiiiiiC draw_cb) { char *text; /* avoid drawing over the frame of the next cell */ x2 -= IMAT_FRAME_W/2; y2 -= IMAT_FRAME_H/2; /* avoid drawing over the frame of the cell */ x2 -= IMAT_FRAME_W/2; y2 -= IMAT_FRAME_H/2; if (lin==0 || col==0) { /* avoid drawing over the frame of the cell */ x1 += IMAT_FRAME_W/2; y1 += IMAT_FRAME_H/2; if (col==0) x1 += IMAT_FRAME_W/2; if (lin==0) y1 += IMAT_FRAME_H/2; } else if ((col==1 && ih->data->columns.sizes[0] == 0) || (lin==1 && ih->data->lines.sizes[0] == 0)) { /* avoid drawing over the frame of the cell */ x1 += IMAT_FRAME_W/2; y1 += IMAT_FRAME_H/2; } if (draw_cb && !iMatrixDrawCallDrawCB(ih, lin, col, x1, x2, y1, y2, draw_cb)) return; text = iupMatrixCellGetValue(ih, lin, col); /* Put the text */ if (text && *text) { int num_line, line_height, total_height; int charheight, ypos, hidden_text_marks = 0; num_line = iupStrLineCount(text); iupdrvFontGetCharSize(ih, NULL, &charheight); line_height = charheight; total_height = (line_height + IMAT_PADDING_H/2) * num_line - IMAT_PADDING_H/2 - IMAT_FRAME_H/2; if (lin==0 || ih->data->hidden_text_marks) { int text_w; iupdrvFontGetMultiLineStringSize(ih, text, &text_w, NULL); if (text_w > x2 - x1 + 1 - IMAT_PADDING_W - IMAT_FRAME_W) { if (lin == 0) alignment = IMAT_T_LEFT; if (ih->data->hidden_text_marks) hidden_text_marks = 1; } } /* Set the color used to draw the text */ if (!active) cdCanvasForeground(ih->data->cddbuffer, IMAT_CD_INACTIVE_FGCOLOR); else iMatrixDrawSetFgColor(ih, lin, col, marked); /* Set the clip area to the cell region informed, the text maybe greatter than the cell */ if (hidden_text_marks) { int crop = iupdrvFontGetStringWidth(ih, "...") + 2; iMatrixDrawSetCellClipping(ih, x1, x2-crop, y1, y2); } else iMatrixDrawSetCellClipping(ih, x1, x2, y1, y2); cdCanvasNativeFont(ih->data->cddbuffer, iupMatrixGetFont(ih, lin, col)); /* Create an space between text and cell frame */ x1 += IMAT_PADDING_W/2; x2 -= IMAT_PADDING_W/2; y1 += IMAT_PADDING_H/2; y2 -= IMAT_PADDING_H/2; if (alignment == IMAT_T_CENTER) cdCanvasTextAlignment(ih->data->cddbuffer, CD_CENTER); else if(alignment == IMAT_T_LEFT) cdCanvasTextAlignment(ih->data->cddbuffer, CD_WEST); else cdCanvasTextAlignment(ih->data->cddbuffer, CD_EAST); if (num_line == 1) { ypos = (int)((y1 + y2) / 2.0 - 0.5); /* Put the text */ if (alignment == IMAT_T_CENTER) iupMATRIX_TEXT(ih, (x1 + x2) / 2, ypos, text); else if(alignment == IMAT_T_LEFT) iupMATRIX_TEXT(ih, x1, ypos, text); else iupMATRIX_TEXT(ih, x2, ypos, text); } else { int i; char *p, *q, *newtext; newtext = iupStrDup(text); p = newtext; /* Get the position of the first text to be put in the screen */ ypos = (int)( (y1 + y2) / 2.0 - 0.5) - total_height/2 + line_height/2; for(i = 0; i < num_line; i++) { q = strchr(p, '\n'); if (q) *q = 0; /* Cut the string to contain only one line */ /* Draw the text */ if(alignment == IMAT_T_CENTER) iupMATRIX_TEXT(ih, (x1 + x2) / 2, ypos, p); else if(alignment == IMAT_T_LEFT) iupMATRIX_TEXT(ih, x1, ypos, p); else iupMATRIX_TEXT(ih, x2, ypos, p); /* Advance the string */ if (q) p = q + 1; /* Advance a line */ ypos += line_height + IMAT_PADDING_H/2; } free(newtext); } iMatrixDrawResetCellClipping(ih); if (hidden_text_marks) { cdCanvasTextAlignment(ih->data->cddbuffer, CD_EAST); ypos = (int)((y1 + y2) / 2.0 - 0.5); iupMATRIX_TEXT(ih, x2+IMAT_PADDING_W/2, ypos, "..."); } } }
static int cdplay(cdCanvas* canvas, int xmin, int xmax, int ymin, int ymax, void *data) { char* filename = (char*)data; FILE* file; char TextBuffer[512]; int iparam1, iparam2, iparam3, iparam4, iparam5, iparam6, iparam7, iparam8, iparam9, iparam10; int c, t, n, w, h, func; double dparam1, dparam2, dparam3, dparam4, dparam5, dparam6; unsigned char* stipple, * _stipple, *red, *green, *blue, *_red, *_green, *_blue, *index, *_index, *_alpha, *alpha; long int *pattern, *palette, *_pattern, *_palette, *colors, *_colors; int* dashes; double matrix[6]; const char * font_family[] = { "System", /* CD_SYSTEM */ "Courier", /* CD_COURIER */ "Times", /* CD_TIMES_ROMAN */ "Helvetica" /* CD_HELVETICA */ }; file = fopen(filename, "r"); if (!file) return CD_ERROR; func = -1; w = 0; h = 0; factorX = 1; factorY = 1; offsetX = 0; offsetY = 0; factorS = 1; fscanf(file, "%s %d %d", TextBuffer, &w, &h); if (strcmp(TextBuffer, "CDMF") != 0) { fclose(file); return CD_ERROR; } if (w>1 && h>1 && xmax!=0 && ymax!=0) { offsetX = xmin; offsetY = ymin; factorX = ((double)(xmax-xmin)) / (w-1); factorY = ((double)(ymax-ymin)) / (h-1); if (factorX < factorY) factorS = factorX; else factorS = factorY; } if (cdsizecb) { int err; err = cdsizecb(canvas, w, h, w, h); if (err) return CD_ERROR; } while (!feof(file)) { fscanf(file, "%d", &func); if (feof(file)) break; switch (func) { case CDMF_FLUSH: cdCanvasFlush(canvas); break; case CDMF_CLEAR: cdCanvasClear(canvas); break; case CDMF_CLIP: fscanf(file, "%d", &iparam1); cdCanvasClip(canvas, iparam1); break; case CDMF_CLIPAREA: fscanf(file, "%d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4); cdCanvasClipArea(canvas, sScaleX(iparam1), sScaleX(iparam2), sScaleY(iparam3), sScaleY(iparam4)); break; case CDMF_FCLIPAREA: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); cdfCanvasClipArea(canvas, sfScaleX(dparam1), sfScaleX(dparam2), sfScaleY(dparam3), sfScaleY(dparam4)); break; case CDMF_MATRIX: fscanf(file, "%lg %lg %lg %lg %lg %lg", &matrix[0], &matrix[1], &matrix[2], &matrix[3], &matrix[4], &matrix[5]); cdCanvasTransform(canvas, matrix); break; case CDMF_RESETMATRIX: cdCanvasTransform(canvas, NULL); break; case CDMF_WCLIPAREA: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); wdCanvasClipArea(canvas, dparam1, dparam2, dparam3, dparam4); break; case CDMF_LINE: fscanf(file, "%d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4); cdCanvasLine(canvas, sScaleX(iparam1), sScaleY(iparam2), sScaleX(iparam3), sScaleY(iparam4)); break; case CDMF_FLINE: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); cdfCanvasLine(canvas, sfScaleX(dparam1), sfScaleY(dparam2), sfScaleX(dparam3), sfScaleY(dparam4)); break; case CDMF_WLINE: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); wdCanvasLine(canvas, dparam1, dparam2, dparam3, dparam4); break; case CDMF_RECT: fscanf(file, "%d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4); cdCanvasRect(canvas, sScaleX(iparam1), sScaleX(iparam2), sScaleY(iparam3), sScaleY(iparam4)); break; case CDMF_FRECT: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); cdfCanvasRect(canvas, sfScaleX(dparam1), sfScaleX(dparam2), sfScaleY(dparam3), sfScaleY(dparam4)); break; case CDMF_WRECT: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); wdCanvasRect(canvas, dparam1, dparam2, dparam3, dparam4); break; case CDMF_BOX: fscanf(file, "%d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4); cdCanvasBox(canvas, sScaleX(iparam1), sScaleX(iparam2), sScaleY(iparam3), sScaleY(iparam4)); break; case CDMF_WBOX: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); wdCanvasBox(canvas, dparam1, dparam2, dparam3, dparam4); break; case CDMF_FBOX: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); cdfCanvasBox(canvas, sfScaleX(dparam1), sfScaleX(dparam2), sfScaleY(dparam3), sfScaleY(dparam4)); break; case CDMF_ARC: fscanf(file, "%d %d %d %d %lg %lg", &iparam1, &iparam2, &iparam3, &iparam4, &dparam1, &dparam2); cdCanvasArc(canvas, sScaleX(iparam1), sScaleY(iparam2), sScaleW(iparam3), sScaleH(iparam4), dparam1, dparam2); break; case CDMF_FARC: fscanf(file, "%lg %lg %lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4, &dparam5, &dparam6); cdfCanvasArc(canvas, sfScaleX(dparam1), sfScaleY(dparam2), sfScaleW(dparam3), sfScaleH(dparam4), dparam5, dparam6); break; case CDMF_WARC: fscanf(file, "%lg %lg %lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4, &dparam5, &dparam6); wdCanvasArc(canvas, dparam1, dparam2, dparam3, dparam4, dparam5, dparam6); break; case CDMF_SECTOR: fscanf(file, "%d %d %d %d %lg %lg", &iparam1, &iparam2, &iparam3, &iparam4, &dparam1, &dparam2); cdCanvasSector(canvas, sScaleX(iparam1), sScaleY(iparam2), sScaleW(iparam3), sScaleH(iparam4), dparam1, dparam2); break; case CDMF_FSECTOR: fscanf(file, "%lg %lg %lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4, &dparam5, &dparam6); cdfCanvasSector(canvas, sfScaleX(dparam1), sfScaleY(dparam2), sfScaleW(dparam3), sfScaleH(dparam4), dparam5, dparam6); break; case CDMF_WSECTOR: fscanf(file, "%lg %lg %lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4, &dparam5, &dparam6); wdCanvasSector(canvas, dparam1, dparam2, dparam3, dparam4, dparam5, dparam6); break; case CDMF_CHORD: fscanf(file, "%d %d %d %d %lg %lg", &iparam1, &iparam2, &iparam3, &iparam4, &dparam1, &dparam2); cdCanvasChord(canvas, sScaleX(iparam1), sScaleY(iparam2), sScaleW(iparam3), sScaleH(iparam4), dparam1, dparam2); break; case CDMF_FCHORD: fscanf(file, "%lg %lg %lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4, &dparam5, &dparam6); cdfCanvasChord(canvas, sfScaleX(dparam1), sfScaleY(dparam2), sfScaleW(dparam3), sfScaleH(dparam4), dparam5, dparam6); break; case CDMF_WCHORD: fscanf(file, "%lg %lg %lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4, &dparam5, &dparam6); wdCanvasChord(canvas, dparam1, dparam2, dparam3, dparam4, dparam5, dparam6); break; case CDMF_TEXT: fscanf(file, "%d %d %[^\n\r]", &iparam1, &iparam2, TextBuffer); cdCanvasText(canvas, sScaleX(iparam1), sScaleY(iparam2), TextBuffer); break; case CDMF_FTEXT: fscanf(file, "%lg %lg %[^\n\r]", &dparam1, &dparam2, TextBuffer); cdfCanvasText(canvas, sfScaleX(dparam1), sfScaleY(dparam2), TextBuffer); break; case CDMF_WTEXT: fscanf(file, "%lg %lg %[^\n\r]", &dparam1, &dparam2, TextBuffer); wdCanvasText(canvas, dparam1, dparam2, TextBuffer); break; case CDMF_BEGIN: fscanf(file, "%d", &iparam1); cdCanvasBegin(canvas, iparam1); break; case CDMF_VERTEX: fscanf(file, "%d %d", &iparam1, &iparam2); cdCanvasVertex(canvas, sScaleX(iparam1), sScaleY(iparam2)); break; case CDMF_FVERTEX: fscanf(file, "%lg %lg", &dparam1, &dparam2); cdfCanvasVertex(canvas, sfScaleX(dparam1), sfScaleY(dparam2)); break; case CDMF_WVERTEX: fscanf(file, "%lg %lg", &dparam1, &dparam2); wdCanvasVertex(canvas, dparam1, dparam2); break; case CDMF_END: cdCanvasEnd(canvas); break; case CDMF_MARK: fscanf(file, "%d %d", &iparam1, &iparam2); cdCanvasMark(canvas, sScaleX(iparam1), sScaleY(iparam2)); break; case CDMF_WMARK: fscanf(file, "%lg %lg", &dparam1, &dparam2); wdCanvasMark(canvas, dparam1, dparam2); break; case CDMF_BACKOPACITY: fscanf(file, "%d", &iparam1); cdCanvasBackOpacity(canvas, iparam1); break; case CDMF_WRITEMODE: fscanf(file, "%d", &iparam1); cdCanvasWriteMode(canvas, iparam1); break; case CDMF_LINESTYLE: fscanf(file, "%d", &iparam1); cdCanvasLineStyle(canvas, iparam1); break; case CDMF_LINEWIDTH: fscanf(file, "%d", &iparam1); cdCanvasLineWidth(canvas, sScaleS(iparam1)); break; case CDMF_LINECAP: fscanf(file, "%d", &iparam1); cdCanvasLineCap(canvas, iparam1); break; case CDMF_LINEJOIN: fscanf(file, "%d", &iparam1); cdCanvasLineJoin(canvas, iparam1); break; case CDMF_LINESTYLEDASHES: fscanf(file, "%d", &iparam1); dashes = (int*)malloc(iparam1*sizeof(int)); for (c = 0; c < iparam1; c++) fscanf(file, "%d", &dashes[c]); cdCanvasLineStyleDashes(canvas, dashes, iparam1); free(dashes); break; case CDMF_FILLMODE: fscanf(file, "%d", &iparam1); cdCanvasFillMode(canvas, iparam1); break; case CDMF_INTERIORSTYLE: fscanf(file, "%d", &iparam1); cdCanvasInteriorStyle(canvas, iparam1); break; case CDMF_HATCH: fscanf(file, "%d", &iparam1); cdCanvasHatch(canvas, iparam1); break; case CDMF_STIPPLE: fscanf(file, "%d %d", &iparam1, &iparam2); t = iparam1 * iparam2; stipple = (unsigned char*)malloc(t); _stipple = stipple; for (c = 0; c < t; c++) { fscanf(file, "%d", &iparam3); *_stipple++ = (unsigned char)iparam3; } cdCanvasStipple(canvas, iparam1, iparam2, stipple); free(stipple); break; case CDMF_PATTERN: fscanf(file, "%d %d", &iparam1, &iparam2); t = iparam1 * iparam2; pattern = (long int*)malloc(t * sizeof(long)); _pattern = pattern; for (c = 0; c < t; c++) { fscanf(file, "%d %d %d", &iparam3, &iparam4, &iparam5); *_pattern++ = cdEncodeColor((unsigned char)iparam3, (unsigned char)iparam4, (unsigned char)iparam5); } cdCanvasPattern(canvas, iparam1, iparam2, pattern); free(pattern); break; case CDMF_OLDFONT: fscanf(file, "%d %d %d", &iparam1, &iparam2, &iparam3); if (iparam1 < 0 || iparam1 > 3) break; if (iparam3 < 0) { iparam3 = -sScaleH(abs(iparam3)); if (iparam3 > -5) iparam3 = -5; } else { iparam3 = sScaleH(abs(iparam3)); if (iparam3 < 5) iparam3 = 5; } cdCanvasFont(canvas, font_family[iparam1], iparam2, iparam3); break; case CDMF_FONT: fscanf(file, "%d %d %[^\n\r]", &iparam2, &iparam3, TextBuffer); if (iparam3 < 0) { iparam3 = -sScaleH(abs(iparam3)); if (iparam3 > -5) iparam3 = -5; } else { iparam3 = sScaleH(abs(iparam3)); if (iparam3 < 5) iparam3 = 5; } cdCanvasFont(canvas, TextBuffer, iparam2, iparam3); break; case CDMF_NATIVEFONT: fscanf(file, "%[^\n\r]", TextBuffer); cdCanvasNativeFont(canvas, TextBuffer); break; case CDMF_TEXTALIGNMENT: fscanf(file, "%d", &iparam1); cdCanvasTextAlignment(canvas, iparam1); break; case CDMF_TEXTORIENTATION: fscanf(file, "%lg", &dparam1); cdCanvasTextOrientation(canvas, dparam1); break; case CDMF_MARKTYPE: fscanf(file, "%d", &iparam1); cdCanvasMarkType(canvas, iparam1); break; case CDMF_MARKSIZE: fscanf(file, "%d", &iparam1); cdCanvasMarkSize(canvas, sScaleS(iparam1)); break; case CDMF_PALETTE: fscanf(file, "%d %d", &iparam1, &iparam2); _palette = palette = (long int*)malloc(iparam1); for (c = 0; c < iparam1; c++) { fscanf(file, "%d %d %d", &iparam3, &iparam4, &iparam5); *_palette++ = cdEncodeColor((unsigned char)iparam3, (unsigned char)iparam4, (unsigned char)iparam5); } cdCanvasPalette(canvas, iparam1, palette, iparam2); free(palette); break; case CDMF_BACKGROUND: fscanf(file, "%d %d %d", &iparam1, &iparam2, &iparam3); cdCanvasSetBackground(canvas, cdEncodeColor((unsigned char)iparam1, (unsigned char)iparam2, (unsigned char)iparam3)); break; case CDMF_FOREGROUND: fscanf(file, "%d %d %d", &iparam1, &iparam2, &iparam3); cdCanvasSetForeground(canvas, cdEncodeColor((unsigned char)iparam1, (unsigned char)iparam2, (unsigned char)iparam3)); break; case CDMF_PUTIMAGERGB: fscanf(file, "%d %d %d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4, &iparam5, &iparam6); t = iparam1 * iparam2; _red = red = (unsigned char*) malloc(t); _green = green = (unsigned char*) malloc(t); _blue = blue = (unsigned char*) malloc(t); for (c = 0; c < t; c++) { fscanf(file, "%d %d %d", &iparam7, &iparam8, &iparam9); *_red++ = (unsigned char)iparam7; *_green++ = (unsigned char)iparam8; *_blue++ = (unsigned char)iparam9; } cdCanvasPutImageRectRGB(canvas, iparam1, iparam2, red, green, blue, sScaleX(iparam3), sScaleY(iparam4), sScaleW(iparam5), sScaleH(iparam6), 0, 0, 0, 0); free(red); free(green); free(blue); break; case CDMF_PUTIMAGERGBA: fscanf(file, "%d %d %d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4, &iparam5, &iparam6); t = iparam1 * iparam2; _red = red = (unsigned char*) malloc(t); _green = green = (unsigned char*) malloc(t); _blue = blue = (unsigned char*) malloc(t); _alpha = alpha = (unsigned char*) malloc(t); for (c = 0; c < t; c++) { fscanf(file, "%d %d %d %d", &iparam7, &iparam8, &iparam9, &iparam10); *_red++ = (unsigned char)iparam7; *_green++ = (unsigned char)iparam8; *_blue++ = (unsigned char)iparam9; *_alpha++ = (unsigned char)iparam10; } cdCanvasPutImageRectRGBA(canvas, iparam1, iparam2, red, green, blue, alpha, sScaleX(iparam3), sScaleY(iparam4), sScaleW(iparam5), sScaleH(iparam6), 0, 0, 0, 0); free(red); free(green); free(blue); free(alpha); break; case CDMF_PUTIMAGEMAP: fscanf(file, "%d %d %d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4, &iparam5, &iparam6); t = iparam1 * iparam2; n = 0; _index = index = (unsigned char*) malloc(t); for (c = 0; c < t; c++) { fscanf(file, "%d", &iparam7); *_index++ = (unsigned char)iparam7; if (iparam7 > n) n = iparam7; } _colors = colors = (long int*)malloc(n); for (c = 0; c < n; c++) { fscanf(file, "%d %d %d", &iparam7, &iparam8, &iparam9); *_colors++ = cdEncodeColor((unsigned char)iparam7, (unsigned char)iparam8, (unsigned char)iparam9); } cdCanvasPutImageRectMap(canvas, iparam1, iparam2, index, colors, sScaleX(iparam3), sScaleY(iparam4), sScaleW(iparam5), sScaleH(iparam6), 0, 0, 0, 0); free(index); free(colors); break; case CDMF_PIXEL: fscanf(file, "%d %d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4, &iparam5); cdCanvasPixel(canvas, sScaleX(iparam1), sScaleY(iparam2), cdEncodeColor((unsigned char)iparam3, (unsigned char)iparam4, (unsigned char)iparam5)); break; case CDMF_SCROLLAREA: fscanf(file, "%d %d %d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4, &iparam5, &iparam6); cdCanvasScrollArea(canvas, sScaleX(iparam1), sScaleX(iparam2), sScaleY(iparam3), sScaleY(iparam4), sScaleX(iparam5), sScaleY(iparam6)); break; case CDMF_WVECTORTEXT: fscanf(file, "%lg %lg %[^\n\r]", &dparam1, &dparam2, TextBuffer); wdCanvasVectorText(canvas, dparam1, dparam2, TextBuffer); break; case CDMF_WMULTILINEVECTORTEXT: fscanf(file, "%lg %lg %[^\n\r]", &dparam1, &dparam2, TextBuffer); wdCanvasVectorText(canvas, dparam1, dparam2, TextBuffer); break; case CDMF_VECTORTEXT: fscanf(file, "%d %d %[^\n\r]", &iparam1, &iparam2, TextBuffer); cdCanvasVectorText(canvas, iparam1, iparam2, TextBuffer); break; case CDMF_MULTILINEVECTORTEXT: fscanf(file, "%d %d %[^\n\r]", &iparam1, &iparam2, TextBuffer); cdCanvasVectorText(canvas, iparam1, iparam2, TextBuffer); break; case CDMF_WVECTORCHARSIZE: fscanf(file, "%lg", &dparam1); wdCanvasVectorCharSize(canvas, dparam1); break; case CDMF_WVECTORTEXTSIZE: fscanf(file, "%lg %lg %[^\n\r]", &dparam1, &dparam2, TextBuffer); wdCanvasVectorTextSize(canvas, dparam1, dparam2, TextBuffer); break; case CDMF_WVECTORTEXTDIRECTION: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); wdCanvasVectorTextDirection(canvas, dparam1, dparam2, dparam3, dparam4); break; case CDMF_VECTORCHARSIZE: fscanf(file, "%d", &iparam1); cdCanvasVectorCharSize(canvas, iparam1); break; case CDMF_VECTORTEXTSIZE: fscanf(file, "%d %d %[^\n\r]", &iparam1, &iparam2, TextBuffer); cdCanvasVectorTextSize(canvas, iparam1, iparam2, TextBuffer); break; case CDMF_VECTORTEXTDIRECTION: fscanf(file, "%d %d %d %d", &iparam1, &iparam2, &iparam3, &iparam4); cdCanvasVectorTextDirection(canvas, iparam1, iparam2, iparam3, iparam4); break; case CDMF_VECTORFONT: fscanf(file, "%[^\n\r]", TextBuffer); cdCanvasVectorFont(canvas, TextBuffer); break; case CDMF_VECTORTEXTTRANSFORM: fscanf(file, "%lg %lg %lg %lg %lg %lg", &matrix[0], &matrix[1], &matrix[2], &matrix[3], &matrix[4], &matrix[5]); cdCanvasVectorTextTransform(canvas, matrix); break; case CDMF_WINDOW: fscanf(file, "%lg %lg %lg %lg", &dparam1, &dparam2, &dparam3, &dparam4); wdCanvasWindow(canvas, dparam1, dparam2, dparam3, dparam4); break; default: fclose(file); return CD_ERROR; } } fclose(file); return CD_OK; }