Screenshots C Source Code

Get the source code here: simple.zip.

 

void SimpleDraw(cdCanvas* canvas)

{

int w, h;

int *dashes;

int irect[8];

double drect[8];

 

/* Get size in pixels to be used for computing coordinates. */

cdCanvasGetSize(canvas, &w, &h, NULL, NULL);

/* Clear the background to be white */

cdCanvasBackground(canvas, CD_WHITE);

cdCanvasClear(canvas);

 

/* Draw a reactangle and a polyline at the bottom-left area,

   using a thick line with transparency.

   Notice that transparency is only supported in a few drivers,

   and line join is not supported in the IMAGERGB driver. */

cdCanvasLineWidth(canvas, 3);

cdCanvasLineStyle(canvas, CD_CONTINUOUS);

cdCanvasForeground(canvas, cdEncodeAlpha(CD_DARK_MAGENTA, 128));

cdCanvasRect(canvas, 100, 200, 100, 200);

cdCanvasBegin(canvas, CD_OPEN_LINES);

cdCanvasVertex(canvas, 300, 250);

cdCanvasVertex(canvas, 320, 270);

cdCanvasVertex(canvas, 350, 260);

cdCanvasVertex(canvas, 340, 200);

cdCanvasVertex(canvas, 310, 210);

cdCanvasEnd(canvas);

/* Draw the red diagonal line with a custom line style.

   Notice that line styles are not supported in the IMAGERGB driver. */

cdCanvasForeground(canvas, CD_RED);

cdCanvasLineWidth(canvas, 3);

dashes = {20, 15, 5, 5};

cdCanvasLineStyleDashes(canvas, dashes, 4);

cdCanvasLineStyle(canvas, CD_CUSTOM);

cdCanvasLine(canvas, 0, 0, w-1, h-1);

 

/* Draw the blue diagonal line with a pre-defined line style.

   Notice that the pre-defined line style is dependent on the driver. */

cdCanvasForeground(canvas, CD_BLUE);

cdCanvasLineWidth(canvas, 10);

cdCanvasLineStyle(canvas, CD_DOTTED);

cdCanvasLine(canvas, 0, h-1, w-1, 0);

 

/* Reset line style and width */

cdCanvasLineStyle(canvas, CD_CONTINUOUS);

cdCanvasLineWidth(canvas, 1);

/* Draw an arc at bottom-left, and a sector at bottom-right.

   Notice that counter-clockwise orientation of both. */

cdCanvasInteriorStyle(canvas, CD_SOLID);

cdCanvasForeground(canvas, CD_MAGENTA);

cdCanvasSector(canvas, w-100, 100, 100, 100, 50, 180);

cdCanvasForeground(canvas, CD_RED);

cdCanvasArc(canvas, 100, 100, 100, 100, 50, 180);

 

/* Draw a solid filled rectangle at center. */

cdCanvasForeground(canvas, CD_YELLOW);

cdCanvasBox(canvas, w/2 - 100, w/2 + 100, h/2 - 100, h/2 + 100);

 

/* Prepare font for text. */

cdCanvasTextAlignment(canvas, CD_CENTER);

cdCanvasTextOrientation(canvas, 70);

cdCanvasFont(canvas, "Times", CD_BOLD, 24);

 

/* Draw text at center, with orientation,

   and draw its bounding box.

   Notice that in some drivers the bounding box is not precise. */

cdCanvasGetTextBounds(canvas, w/2, h/2, "cdMin Draw (ηγν)", irect);

cdCanvasForeground(canvas, CD_RED);

cdCanvasBegin(canvas, CD_CLOSED_LINES);

cdCanvasVertex(canvas, irect[0], irect[1]);

cdCanvasVertex(canvas, irect[2], irect[3]);

cdCanvasVertex(canvas, irect[4], irect[5]);

cdCanvasVertex(canvas, irect[6], irect[7]);

cdCanvasEnd(canvas);

cdCanvasForeground(canvas, CD_BLUE);

cdCanvasText(canvas, w/2, h/2, "cdMin Draw (ηγν)");

 

/* Prepare World Coordinates */

wdCanvasViewport(canvas, 0,w-1,0,h-1);

if (w>h)

    wdCanvasWindow(canvas, 0,(double)w/(double)h,0,1);

else

    wdCanvasWindow(canvas, 0,1,0,(double)h/(double)w);

 

/* Draw a filled blue rectangle in WC */

wdCanvasBox(canvas, 0.20, 0.30, 0.40, 0.50);

cdCanvasForeground(canvas, CD_RED);

 

/* Draw the diagonal of that rectangle in WC */

wdCanvasLine(canvas, 0.20, 0.40, 0.30, 0.50);

 

/* Prepare Vector Text in WC. */

wdCanvasVectorCharSize(canvas, 0.07);

 

/* Draw vector text, and draw its bounding box.

   We also use this text to show when we are using a contextplus driver. */

cdCanvasForeground(canvas, CD_RED);

if (contextplus)

    wdCanvasGetVectorTextBounds(canvas, "WDj-Plus", 0.25, 0.35, drect);

else

    wdCanvasGetVectorTextBounds(canvas, "WDj", 0.25, 0.35, drect);

cdCanvasBegin(canvas, CD_CLOSED_LINES);

wdCanvasVertex(canvas, drect[0], drect[1]);

wdCanvasVertex(canvas, drect[2], drect[3]);

wdCanvasVertex(canvas, drect[4], drect[5]);

wdCanvasVertex(canvas, drect[6], drect[7]);

cdCanvasEnd(canvas);

cdCanvasLineWidth(canvas, 2);

cdCanvasLineStyle(canvas, CD_CONTINUOUS);

if (contextplus)

    wdCanvasVectorText(canvas, 0.25, 0.35, "WDj-Plus");

else

    wdCanvasVectorText(canvas, 0.25, 0.35, "WDj");

 

/* Reset line width */

cdCanvasLineWidth(canvas, 1);

 

/* Draw a filled path at center-right (looks like a weird fish).

   Notice that in PDF the arc is necessarily a circle arc, and not an ellipse. */

cdCanvasForeground(canvas, CD_GREEN);

cdCanvasBegin(canvas, CD_PATH);

cdCanvasPathSet(canvas, CD_PATH_MOVETO);

cdCanvasVertex(canvas, w/2 + 200, h/2);

cdCanvasPathSet(canvas, CD_PATH_LINETO);

cdCanvasVertex(canvas, w/2 + 230, h/2 + 50);

cdCanvasPathSet(canvas, CD_PATH_LINETO);

cdCanvasVertex(canvas, w/2 + 250, h/2 + 50);

cdCanvasPathSet(canvas, CD_PATH_CURVETO);

cdCanvasVertex(canvas, w/2+150+150, h/2+200-50); /* control point for start */

cdCanvasVertex(canvas, w/2+150+180, h/2+250-50); /* control point for end */

cdCanvasVertex(canvas, w/2+150+180, h/2+200-50); /* end point */

cdCanvasPathSet(canvas, CD_PATH_CURVETO);

cdCanvasVertex(canvas, w/2+150+180, h/2+150-50);

cdCanvasVertex(canvas, w/2+150+150, h/2+100-50);

cdCanvasVertex(canvas, w/2+150+300, h/2+100-50);

cdCanvasPathSet(canvas, CD_PATH_LINETO);

cdCanvasVertex(canvas, w/2+150+300, h/2-50);

cdCanvasPathSet(canvas, CD_PATH_ARC);

cdCanvasVertex(canvas, w/2+300, h/2); /* center */

cdCanvasVertex(canvas, 200, 100); /* width, height */

cdCanvasVertex(canvas, -30*1000, -170*1000); /* start angle, end angle (degrees / 1000) */

cdCanvasPathSet(canvas, CD_PATH_FILL);

cdCanvasEnd(canvas);

 

/* Draw 3 pixels at center left. */

cdCanvasPixel(canvas, 10, h/2+0, CD_RED);

cdCanvasPixel(canvas, 11, h/2+1, CD_GREEN);

cdCanvasPixel(canvas, 12, h/2+2, CD_BLUE);

 

/* Draw 4 mark types, distributed near each corner. */

cdCanvasForeground(canvas, CD_RED);

cdCanvasMarkSize(canvas, 30);

cdCanvasMarkType(canvas, CD_PLUS);

cdCanvasMark(canvas, 200, 200);

cdCanvasMarkType(canvas, CD_CIRCLE);

cdCanvasMark(canvas, w - 200, 200);

cdCanvasMarkType(canvas, CD_HOLLOW_CIRCLE);

cdCanvasMark(canvas, 200, h - 200);

cdCanvasMarkType(canvas, CD_DIAMOND);

cdCanvasMark(canvas, w - 200, h - 200);

 

/* Draw all the line style possibilities at bottom.

   Notice that they have some small differences between drivers. */

cdCanvasLineWidth(canvas, 1);

cdCanvasLineStyle(canvas, CD_CONTINUOUS);

cdCanvasLine(canvas, 0, 10, w, 10);

cdCanvasLineStyle(canvas, CD_DASHED);

cdCanvasLine(canvas, 0, 20, w, 20);

cdCanvasLineStyle(canvas, CD_DOTTED);

cdCanvasLine(canvas, 0, 30, w, 30);

cdCanvasLineStyle(canvas, CD_DASH_DOT);

cdCanvasLine(canvas, 0, 40, w, 40);

cdCanvasLineStyle(canvas, CD_DASH_DOT_DOT);

cdCanvasLine(canvas, 0, 50, w, 50);

 

/* Draw all the hatch style possibilities in the top-left corner.

   Notice that they have some small differences between drivers. */

cdCanvasHatch(canvas, CD_VERTICAL);

cdCanvasBox(canvas, 0, 50, h - 60, h);

cdCanvasHatch(canvas, CD_FDIAGONAL);

cdCanvasBox(canvas, 50, 100, h - 60, h);

cdCanvasHatch(canvas, CD_BDIAGONAL);

cdCanvasBox(canvas, 100, 150, h - 60, h);

cdCanvasHatch(canvas, CD_CROSS);

cdCanvasBox(canvas, 150, 200, h - 60, h);

cdCanvasHatch(canvas, CD_HORIZONTAL);

cdCanvasBox(canvas, 200, 250, h - 60, h);

cdCanvasHatch(canvas, CD_DIAGCROSS);

cdCanvasBox(canvas, 250, 300, h - 60, h);

 

/* Draw 4 regions, in diamond shape,

   at top, bottom, left, right,

   using different interior styles. */

 

/* At top, not filled polygon, notice that the last line style is used. */

cdCanvasBegin(canvas, CD_CLOSED_LINES);

cdCanvasVertex(canvas, w/2, h - 100);

cdCanvasVertex(canvas, w/2 + 50, h - 150);

cdCanvasVertex(canvas, w/2, h - 200);

cdCanvasVertex(canvas, w/2 - 50, h - 150);

cdCanvasEnd(canvas);

 

/* At left, hatch filled polygon */

cdCanvasHatch(canvas, CD_DIAGCROSS);

cdCanvasBegin(canvas, CD_FILL);

cdCanvasVertex(canvas, 100, h/2);

cdCanvasVertex(canvas, 150, h/2 + 50);

cdCanvasVertex(canvas, 200, h/2);

cdCanvasVertex(canvas, 150, h/2 - 50);

cdCanvasEnd(canvas);

 

/* At right, pattern filled polygon */

cdCanvasPattern(canvas, STYLE_SIZE, STYLE_SIZE, pattern);

cdCanvasBegin(canvas, CD_FILL);

cdCanvasVertex(canvas, w - 100, h/2);

cdCanvasVertex(canvas, w - 150, h/2 + 50);

cdCanvasVertex(canvas, w - 200, h/2);

cdCanvasVertex(canvas, w - 150, h/2 - 50);

cdCanvasEnd(canvas);

/* At bottom, stipple filled polygon */

cdCanvasStipple(canvas, STYLE_SIZE, STYLE_SIZE, stipple);

cdCanvasBegin(canvas, CD_FILL);

cdCanvasVertex(canvas, w/2, 100);

cdCanvasVertex(canvas, w/2 + 50, 150);

cdCanvasVertex(canvas, w/2, 200);

cdCanvasVertex(canvas, w/2 - 50, 150);

cdCanvasEnd(canvas);

 

/* Draw two beziers at bottom-left */

cdCanvasBegin(canvas, CD_BEZIER);

cdCanvasVertex(canvas, 100, 100);

cdCanvasVertex(canvas, 150, 200);

cdCanvasVertex(canvas, 180, 250);

cdCanvasVertex(canvas, 180, 200);

cdCanvasVertex(canvas, 180, 150);

cdCanvasVertex(canvas, 150, 100);

cdCanvasVertex(canvas, 300, 100);

cdCanvasEnd(canvas);

 

/* Draw the image on the top-right corner but increasing its actual size,

   and uses the complete image */

cdCanvasPutImageRectRGBA(canvas, IMAGE_SIZE, IMAGE_SIZE, red, green, blue, alpha,

                         w - 400, h - 310, 3*IMAGE_SIZE, 3*IMAGE_SIZE, 0, 0, 0, 0);

 

/* Adds a new page, or

   flushes the file, or

   flushes the screen, or

   swap the double buffer. */

cdCanvasFlush(canvas);

}