Simple Graphics Package (SGP) Documentation ------------------------------------------- Documentation and Software Written by Kevin Rosenberg Copyright (c) 1984, Kevin Rosenberg OVERVIEW -------- +------------------------+ | World Coordinate level | +-----------+------------+ | | +------------+-------------+ | Convert to Normalized | | device coordinates (NDC) | +------------+-------------+ | | +------+-------+ +--------------+ | Segmentation +-----------+ Disk Storage | +------+-------+ +--------------+ | +------------+-------------+ | Convert to Physical | | device coordinates (PDC) | +--------------------------+ World Coordinate Level ---------------------- initgrf2 () Initialize 2 dimensional graphics termgrf2 () Terminate 2 dimensional graphics window2 (xmin, ymin, xmax, ymax) Set window for world coord viewprt2 (xmin, ymin, xmax, ymax) Viewport for window in NDC moveabs2 (x, y) Move graphics cursor moverel2 (dx, dy) pntabs2 (x, y) Plot point at current position pntrel2 (dx, dy) lineabs2 (x, y) Draw line from current point to point linerel2 (dx, dy) markabs2 (x, y) Draw marker at current position markrel2 (dx, dy) polylnabs (x[], y[], n) Draw a set of lines polylnrel (dx[]. dy[]. n) wc_to_ndc (xwc, ywc, xndc, yndc) Convert from world coord to NDC ndc_to_wc (xndc, yndc, xwc, ywc) Convert from NDC to world coord drawtext (str) Draw text string at current positon INTERNAL: calc_map () Calculate wc to ndc factors clip(rectangle[4], x1, y1, x2, y2) Clip a line againt rectangle Normalized Coordinate level -------------------------- stylus (x, y, beam) Draw a line from current position opendevice (device) Open a device for output closedevice (device) Close a device for output flushdevice (device) Put all pending data on device inqdev (device, xmax, ymax) Return data on device setcolor (color) Set current drawing color setlinestyle (style) Set current line style setlinewidth (width) Set current line width settext (h, w, orientation, dir, font) Set text attributes settextclr (foreground, background) If back=-1, then transparent backg inqtext(h, w, o, dir, font, fore, back) Get current text attributes charndc (c, xndc, yndc) Draw char at NDC position textndc (str, xndc, yndc) Draw text string at NDC position setmarker (marker_type, color) Set marker attibutes markndc (xndc, yndc) Draw marker at NDC position ndc_to_pdc (device, xndc, yndc, xpdc, ypdc) savescrn (filename, xmin, ymin, xmax, ymax) readscrn (filename) Physical Device Level --------------------- crtdot (x, y, c) crtline (x1, y1, x2, y2, color, style) wrtchar (char, x, y, dotfunc()) wrttext (str, x, y, dotfunc()) readblock (array, xmin, ymin, xmax, ymax) writeblock (array, xmin, ymin, mode) prtdot (x, y, c) prtline (func, x1, y1, x2, y2, color, style) Input Functions --------------- Physical device level joystk (sticknum, x, y) Normalized Coordinate level readloc (xndc, yndc) inithcur (height, width, color) Initialize haircross cursor movhcurabs (xndc, yndc) Move haircross cursor to point movhcurrel (dxndc, dyndc) Move relatively termhcur () Turn off haircross cursor readpnt (xndc, yndc) Have cursor track joystick User press button at desired point DATA STRUCTURES --------------- struct DEVICE { int xsize, ysize; Size of device in pixels int xmax, ymax; Maximum coordinates int colormax; Maximum color number of device int style; Current linestyle of device int width; Current width of device int color; Current color of device int curx, cury; Current position int charwidth, charheight; Size of characters in pixels float aspt Aspect ratio Multiple coord int (*dot)(); Dot function for device int (*line)(); Line function for device int mode; Device mode }; struct CHARSPEC { float width, height; size of characters in NDC int dirflag, orientflag text direction, character orientation int fore, back; foreground & background color }; struct CURRENT { int color; int linestyle; int linewidth; float xndc, yndc; } Map directly from world coords to physical device coords -------------------------------------------------------- Window: xwmin, xwmax, ywmin, ywmax Viewport: xvmin, xvmax, yvmin, yvmax Physical: xpmax, ypmax To convert from wc to ndc: xndc = xvmin + (xwc - xwmin) / (xwmax - xwmin) yndc = yvmin + (ywc - ywmin) / (ywmax - ywmin) To convert from ndc to pdc: xpdc = xndc * xpmax ypdc = yndc * ypmax So, for each device set up the following composite transformation: xpdc = xpmax * (xvmin + (xwc - xwmin) / (xwmax - xwmin)) ypdc = ypmax * (yvmin + (ywc - ywmin) / (ywmax - ywmin)) xpdc = xpmax * xvmin + (xwc - xwmin) * (xpmax / (xwmax - xwmin)) = xadd + (xwc - xsub) * xfact Characters ---------- Fonts: NORMAL Regular character set BOLD Overstike chars with x offset by 1 pixel ITALICS Shear characters along character height NORMAL BOLD ITALICS X XX X XXX XXXX XXX X X XX XX X X X X XX XX X X XXXXX XXXXXX XXXXX X X XX XX X X X X XX XX X X