+
+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 its full area */
+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);
+
+
+