Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
VG(3)			    Library Functions Manual			 VG(3)

NAME
       VG -- agar vector graphics interface

SYNOPSIS
       #include	<agar/core.h>
       #include	<agar/gui.h>
       #include	<agar/vg.h>

DESCRIPTION
       The  VG interface allows	applications to	construct, display, export and
       import vector drawings, which are composed of entities  (i.e.,  VG_Node
       objects)	from simple primitives to more complex or application-specific
       items.

       There  is  no notion of coordinates in VG.  Entities are	organized in a
       tree structure where elements are connected by  linear  transformations
       (such  as  translations or rotations).  References between the entities
       are allowed.  For example, a VG_Line(3) is fully	 described  by	refer-
       ences to	two independent	VG_Point(3) entities.

       The  VG_View(3)	widget	is  almost always used to display VG drawings.
       VG_View also provides a simple tool registration	interface which	allows
       the editor to be	extended.

BUILT-IN NODE CLASSES
       A number	of simple primitives entities are built	into the library:

       VG_Point(3)     Single point
       VG_Line(3)      Line segment
       VG_Circle(3)    Circle
       VG_Arc(3)       Arc (centerpoint	/ angle)
       VG_Polygon(3)   Filled polygon
       VG_Text(3)      Text label

VG INTERFACE
       void VG_InitSubsystem(void)

       void VG_DestroySubsystem(void)

       VG * VG_New(Uint	flags)

       void VG_Init(VG *vg, Uint flags)

       void VG_Destroy(VG *vg)

       void VG_Clear(VG	*vg)

       void VG_ClearNodes(VG *vg)

       void VG_ClearColors(VG *vg)

       void VG_Lock(VG *vg)

       void VG_Unlock(VG *vg)

       VG_Layer	* VG_PushLayer(VG *vg, const char *layer)

       void VG_PopLayer(VG *vg)

       The VG_InitSubsystem() function initalizes the VG library and should be
       invoked before any other	function is used.   VG_DestroySubsystem()  re-
       leases resources	allocated by the VG library.

       The  VG_New()  function	allocates  and initializes a new VG structure.
       VG_Init() initializes an	existing one.  Acceptable flags	include:

       VG_NO_ANTIALIAS	 Disable anti-aliasing rendering methods.

       VG_Destroy() releases all resources allocated by	the given  VG  object.
       The structure itself is not freed.

       VG_Clear() reinitializes	the VG structures.  VG_ClearNodes() reinitial-
       izes only the node trees.  VG_ClearColors() reinitializes the color ta-
       ble.

       VG_Lock()  acquires the lock which protects a VG	against	modifications.
       VG_Unlock() releases the	lock.  The VG interface	is thread-safe	so  it
       is  not	necessary  for user applications to use	these functions	unless
       documented.  For	example, a VG_FindNode()  immediately  followed	 by  a
       VG_NodeDetach() requires	the use	of VG_Lock()).

       VG  drawings  are organized in layers, which are	useful for determining
       the z-order of graphical	entities.  It is also possible to mask	layers
       or  blend layer-specific	colors.	 VG_PushLayer()	creates	a new layer of
       the given name and returns a pointer  to	 the  newly  created  VG_Layer
       structure.  VG_PopLayer() pops the highest layer	off the	stack.

NODE CLASS REGISTRATION
       void VG_RegisterClass(VG_NodeOps	*class)

       void VG_UnregisterClass(VG_NodeOps *class)

       VG_NodeOps * VG_LookupClass(const char *className)

       Applications  and utilities are expected	to register node classes using
       VG_RegisterClass(), which registers the class described	by  the	 given
       VG_NodeOps   structure.	 VG_UnregisterClass()  unregisters  the	 given
       class.

       VG_LookupClass()	searches for a class of	the specified name and	return
       its  description,  or  NULL  if there is	no such	class.	The VG_NodeOps
       structure fully describes a VG node class.  All function	 pointers  are
       optional	and can	be set to NULL.

       typedef struct vg_node_ops {
	       const char *_Nonnull name;	       /* Display text */
	       struct ag_static_icon *_Nullable	icon;  /* Display icon */
	       AG_Size size;

	       void  (*init)(VG_Node *);
	       void  (*destroy)(VG_Node	*);
	       int   (*load)(VG_Node *,	AG_DataSource *, const AG_Version *);
	       void  (*save)(VG_Node *,	AG_DataSource *);
	       void  (*draw)(VG_Node *,	VG_View	*);
	       void  (*extent)(VG_Node *, VG_View *, VG_Vector *a,
			       VG_Vector *b);
	       float (*pointProximity)(VG_Node *, VG_View *, VG_Vector *p);
	       float (*lineProximity)(VG_Node *, VG_View *, VG_Vector *p1,
				      VG_Vector	*p2);
	       void  (*deleteNode)(VG_Node *);
	       void  (*moveNode)(VG_Node *, VG_Vector, VG_Vector);
	       void *(*edit)(VG_Node *,	VG_View	*);
       }

       The  name  field	is a string identifier for this	class.	icon is	an op-
       tional Agar icon	resource for GUI purposes.  size is the	full  size  in
       bytes  of the structure (derived	from VG_Node) which describes node in-
       stances.

       The init() operation initializes	a node instance	structure.   destroy()
       releases	resources allocated by the node	instance.

       load()  and  save() are used to (de)serialize the node instance from/to
       the given AG_DataSource(3).

       The draw() operation graphically	renders	the  entity  in	 a  VG_View(3)
       context,	typically using	the standard AG_Widget(3) draw routines.

       extent()	 computes the axis-aligned bounding box	of the entity, return-
       ing the absolute	VG coordinates of the upper-left corner	in a  and  the
       lower right corner in b.

       pointProximity()	computes the shortest distance between p (given	in ab-
       solute  VG  coordinates)	 and the entity.  This operation is needed for
       GUI selection tools to be effective.

       lineProximity() computes	the shortest distance between the line (as de-
       scribed by endpoints p1 and p2) and the entity.	This is	 an  optimiza-
       tion which is optional to the operation of GUI selection	tools.

       The deleteNode()	callback is invoked when the user deletes the node in-
       stance.	 It is used, for example, by VG_Line(3)	to call	VG_DelRef() on
       its two VG_Point(3) references (also calling VG_Delete()	if their  ref-
       erence count reaches zero).

       The  moveNode()	callback  is invoked by	VG_View(3) tools (usually "se-
       lect" tools) to perform a translation on	the entity.  vAbs is  the  de-
       sired  new  position  in	 absolute  VG  coordinates, vRel describes the
       change in position.  It is recommended to only rely on vRel.

       The edit() callback  is	invoked	 by  the  VG_EditNode()	 operation  of
       VG_View(3).   It	 is  expected to return	a container widget to which is
       attached	a number of widgets bound to various VG_Node instance  parame-
       ters.

NODE OPERATIONS
       void VG_NodeInit(VG_Node	*node, VG_NodeOps *class)

       int VG_NodeIsClass(void *p, const char *name)

       void VG_NodeAttach(VG_Node *parent, VG_Node *node)

       void VG_NodeDetach(VG_Node *node)

       int VG_Delete(VG_Node *node)

       void VG_AddRef(VG_Node *node, VG_Node *refNode)

       Uint VG_DelRef(VG_Node *node, VG_Node *refNode)

       void VG_SetSym(VG_Node *node, const char	*fmt, ...)

       void VG_SetLayer(VG_Node	*node, int layerIndex)

       void VG_SetColorv(VG_Node *node,	const VG_Color *cv)

       void VG_SetColorRGB(VG_Node *node, Uint8	r, Uint8 g, Uint8 b)

       void VG_SetColorRGBA(VG_Node *node, Uint8 r, Uint8 g, Uint8 b, Uint8 a)

       void VG_Select(VG_Node *node)

       void VG_Unselect(VG_Node	*node)

       void VG_SelectAll(VG *vg)

       void VG_UnselectAll(VG *vg)

       Uint32 VG_GenNodeName(VG	*vg, const char	*className)

       VG_Node * VG_FindNode(VG	*vg, Uint32 handle, const char *type)

       VG_Node * VG_FindNodeSym(VG *vg,	const char *sym)

       The  VG_NodeInit()  function completely initializes a VG_Node structure
       as an instance of the specified node class.

       VG_NodeIsClass()	returns	1 if the specified node	is an instance of  the
       given class, 0 otherwise.

       VG_NodeAttach() and VG_NodeDetach() are used to construct the hierarchy
       of  entities  in	 a drawing.  The relationship between parent and child
       nodes defines the order of linear transformations (i.e.,	 translations,
       rotations).   VG_NodeAttach()  attaches node to an existing node	parent
       (which is either	the root member	of the VG structure, or	any other  en-
       tity in the drawing).  VG_NodeDetach() detaches the specified node from
       its current parent.

       The  VG_Delete()	 function  detaches  and  frees	the specified node in-
       stance, along with any child nodes.  The	function can  fail  (returning
       -1) if the entity is in use.

       VG_AddRef() creates a new reference (dependency), where node depends on
       refNode.

       VG_DelRef()  removes  the  dependency  with refNode and returns the new
       reference count of refNode.  This allows	the referenced node to be  au-
       tomatically  deleted  when no longer referenced.	 Under multithreading,
       the return value	of VG_DelRef() is only valid as	long as	 VG_Lock()  is
       used.

       VG_SetSym() sets	the symbolic name of the node, an arbitrary user-spec-
       ified   string	which	allows	 the   node  to	 be  looked  up	 using
       VG_FindNodeSym().

       VG_SetLayer() assigns the node  to  the	specified  layer  number  (see
       VG_PushLayer() and VG_PopLayer()).

       VG_SetColorv()  sets the	node color from	a pointer to a VG_Color	struc-
       ture.  VG_SetColorRGB() sets the	node color from	the given RGB triplet.
       VG_SetColorRGBA() sets the node color from the given RGBA components.

       The VG_Select() and VG_Unselect() functions respectively	set and	 unset
       the  selection  flag  on	the node.  VG_SelectAll() and VG_UnselectAll()
       operate on all nodes in the drawing.

       Nodes are named by their	class name  followed  by  a  numerical	handle
       (e.g.,  the  first  line	 created  in a drawing will be named `Line0').
       VG_GenNodeName()	generates a new	name, unique in	the drawing,  for  use
       by a new	instance of the	specified class.

       The  VG_FindNode()  function  searches  for a node by name, returning a
       pointer	to  the	 specified  instance  or  NULL	if  not	 found.	   The
       VG_FindNodeSym()	 variant  searches  node  by their symbolic names (see
       VG_SetSym()).   Under  multithreading,  the  return   value   of	  both
       VG_FindNode()  and  VG_FindNodeSym()  only  remains  valid  as  long as
       VG_Lock() is used.

LINEAR TRANSFORMATIONS
       VG_Vector VG_Pos(VG_Node	*node)

       void VG_LoadIdentity(VG_Node *node)

       void VG_Translate(VG_Node *node,	VG_Vector v)

       void VG_SetPosition(VG_Node *node, VG_Vector v)

       void VG_SetPositionInParent(VG_Node *node, VG_Vector v)

       void VG_Scale(VG_Node *node, float s)

       void VG_Rotate(VG_Node *node, float radians)

       void VG_FlipVert(VG_Node	*node)

       void VG_FlipHoriz(VG_Node *node)

       void VG_NodeTransform(VG_Node *node, VG_Matrix *T)

       void VG_PushMatrix(VG *vg)

       void VG_PopMatrix(VG *vg)

       VG_Matrix VG_MatrixInvert(VG_Matrix M)

       Every node in a VG is associated	with an	invertible 3x3 matrix T, which
       defines a set of	transformations	on the coordinates.

       The VG_Pos() function computes the current absolute VG  coordinates  of
       the node.

       VG_LoadIdentity()  sets	the  transformation  matrix of the node	to the
       identity	matrix.

       VG_Translate() translates the node by the amount	specified in v.

       VG_SetPosition()	assigns	the node an absolute position v,  relative  to
       the VG origin.  VG_SetPositionInParent()	assigns	a position relative to
       the parent node.

       VG_Scale() uniformly scales the node by a factor	of s.

       VG_Rotate() rotates the node by the specified amount, given in radians.

       VG_FlipVert()  mirrors  the  node vertically and	VG_FlipHoriz() mirrors
       the node	horizontally.

       VG_NodeTransform() computes and returns	into  T	 the  product  of  the
       transformation matrices of the given node and those of its parents.

       VG_PushMatrix() and VG_PopMatrix() are called from the draw() operation
       of  nodes to manipulate the global matrix stack associated with a draw-
       ing during rendering.  VG_PushMatrix() grows the	stack, duplicating the
       top matrix.  VG_PopMatrix() discards the	top matrix.

       VG_MatrixInvert() computes the inverse of M.  Since VG matrices are re-
       quired to be non-singular, this operation cannot	fail.

SERIALIZATION
       void VG_Save(VG *vg, AG_DataSource *ds)

       int VG_Load(VG *vg, AG_DataSource *ds)

       VG_Vector VG_ReadVector(AG_DataSource *ds)

       void VG_WriteVector(AG_DataSource *ds, const VG_Vector *v)

       VG_Color	VG_ReadColor(AG_DataSource *ds)

       void VG_WriteColor(AG_DataSource	*ds, const VG_Color *c)

       void VG_WriteRef(AG_DataSource *ds, VG_Node *node)

       VG_Node *  VG_ReadRef(AG_DataSource  *ds,  VG_Node  *node,  const  char
       *className)

       The  VG_Save()  function	archives the contents of vg into the specified
       data source.  VG_Load() loads the  drawing  from	 a  data  source;  see
       AG_DataSource(3).

       VG_ReadVector()	and VG_WriteVector() are used to (de)serialize vectors
       (see "MATH ROUTINES" section).

       VG_ReadColor() and VG_WriteColor() are used to  (de)serialize  VG_Color
       structures.

       VG_WriteRef()  is  useful  for serializing a reference from one node to
       another.	 For example, the VG_Line(3) save() routine simply consists of
       VG_WriteRef() calls on its two VG_Point(3) references ) .

       VG_ReadRef() deserializes a node->node reference.  If className is pro-
       vided, the function will	fail and return	NULL if	the archived reference
       does not	match the specified class name.

COLOR OPERATIONS
       VG_Color	VG_GetColorRGB(Uint8 r,	Uint8 g, Uint8 b)

       VG_Color	VG_GetColorRGBA(Uint8 r, Uint8 g, Uint8	b, Uint8 a)

       AG_Color	VG_MapColorRGB(VG_Color	vc)

       AG_Color	VG_MapColorRGBA(VG_Color vc)

       void VG_BlendColors(VG_Color *cDst, VG_Color cSrc)

       void VG_SetBackgroundColor(VG *vg, VG_Color c)

       void VG_SetSelectionColor(VG *vg, VG_Color c)

       void VG_SetMouseOverColor(VG *vg, VG_Color c)

       VG_GetColorRGB()	returns	the VG_Color structure describing  the	speci-
       fied  RGB  triplet,  with the alpha component set to 1.0	(opaque).  The
       VG_GetColorRGBA() variant includes the alpha component.

       Functions VG_MapColorRGB()  and	VG_MapColorRGBA()  convert  the	 given
       color to	AG_Color(3) format.

       VG_BlendColors()	blends the two specified colors, returning the results
       in cDst.

       VG_SetBackgroundColor() configures the background color of the drawing.
       The VG_SetSelectionColor() and VG_SetMouseOverColor() functions config-
       ure the color which will	be blended into	the graphical rendering	of en-
       tities which are	selected or under the cursor, respectively.

MATH ROUTINES
       VG_Vector VG_GetVector(float x, float y)

       VG_Matrix VG_MatrixIdentity(void)

       VG_Vector VG_Add(VG_Vector v1, VG_Vector	v2)

       VG_Vector VG_Sub(VG_Vector v1, VG_Vector	v2)

       VG_Vector VG_ScaleVector(float c, VG_Vector v)

       float VG_DotProd(VG_Vector v1, VG_Vector	v2)

       float VG_Length(VG_Vector v)

       float VG_Distance(VG_Vector v1, VG_Vector v2)

       float VG_PointLineDistance(VG_Vector A, VG_Vector B, VG_Vector *pt)

       VG_Vector VG_IntersectLineV(float x, VG_Vector p1, VG_Vector p2)

       VG_Vector VG_IntersectLineH(float x, VG_Vector p1, VG_Vector p2)

       void VG_MultMatrix(VG_Matrix *A,	const VG_Matrix	*B)

       void  VG_MultMatrixByVector(VG_Vector  *Mv,  const  VG_Vector *v, const
       VG_Matrix *M)

       The VG_GetVector() function returns a VG_Vector structure  given	 x,  y
       values.

       The VG_MatrixIdentity() function	returns	the identity matrix.

       VG_Add()	returns	the sum	of vectors v1 and v2.

       VG_Sub()	returns	the difference of vectors v1 and v2.

       VG_ScaleVector()	multiplies vector v by a scalar	c.

       VG_DotProd() returns the	dot product of two vectors.

       VG_Length() returns the length of a vector.

       VG_Distance() returns the unsigned distance between two vectors.

       VG_PointLineDistance()  computes	 the minimal distance from a line (de-
       scribed by two points A and B) and a point pt.	The  function  returns
       the  distance,  and the closest point on	the line is returned back into
       pt.

       VG_IntersectLineV() computes the	intersection of	an infinite line  (de-
       scribed	by  p1	and p2)	against	a vertical line	(described by x).  The
       return  value  is  undefined   if   the	 two   lines   are   parallel.
       VG_IntersectLineH()  performs  the  same	operation against a horizontal
       line (described by y).

       VG_MultMatrix() computes	the product of matrices	A and B, returning the
       result into B.

       VG_MultMatrixByVector() computes	the product of matrix M	and vector  v,
       returning the result in Mv.

SEE ALSO
       AG_Intro(3),  SK(3),  SK_View(3),  VG_Arc(3), VG_Circle(3), VG_Line(3),
       VG_Point(3), VG_Polygon(3), VG_Text(3), VG_View(3)

HISTORY
       The VG interface	first appeared in Agar 1.3.3.

Agar 1.7		       December	21, 2022			 VG(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=VG&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help