/* * Item.h -- Header to access items' common state and functions. * * Authors : Patrick Lecoanet. * Creation date : * * $Id$ */ /* * Copyright (c) 1996 - 2005 CENA, Patrick Lecoanet -- * * See the file "Copyright" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #ifndef _Item_h #define _Item_h #include "PostScript.h" #include "Attrs.h" #include "Types.h" #include "List.h" #include "Field.h" #include #include /* * Types and constants for attribute processing. */ typedef struct _ZnAttrConfig { int type; char *name; Tk_Uid uid; int offset; int bool_bit; int flags; ZnBool read_only; } ZnAttrConfig; /* * When adding new type in the following enum * do not forget to update attribute_type_strings * in Item.c. */ #define ZN_CONFIG_END 0 #define ZN_CONFIG_BOOL 1 #define ZN_CONFIG_BITMAP 2 #define ZN_CONFIG_BITMAP_LIST 3 #define ZN_CONFIG_STRING 4 #define ZN_CONFIG_FONT 5 #define ZN_CONFIG_EDGE_LIST 6 #define ZN_CONFIG_RELIEF 7 #define ZN_CONFIG_DIM 8 #define ZN_CONFIG_PRI 9 #define ZN_CONFIG_ALIGNMENT 10 #define ZN_CONFIG_AUTO_ALIGNMENT 11 #define ZN_CONFIG_LINE_END 12 #define ZN_CONFIG_LABEL_FORMAT 13 #define ZN_CONFIG_LINE_STYLE 14 #define ZN_CONFIG_LINE_SHAPE 15 #define ZN_CONFIG_ITEM 16 #define ZN_CONFIG_ANGLE 17 #define ZN_CONFIG_INT 18 #define ZN_CONFIG_UINT 19 #define ZN_CONFIG_POINT 20 #define ZN_CONFIG_ANCHOR 21 #define ZN_CONFIG_TAG_LIST 22 #define ZN_CONFIG_MAP_INFO 23 #define ZN_CONFIG_IMAGE 24 #define ZN_CONFIG_LEADER_ANCHORS 25 #define ZN_CONFIG_JOIN_STYLE 26 #define ZN_CONFIG_CAP_STYLE 27 #define ZN_CONFIG_GRADIENT 28 #define ZN_CONFIG_GRADIENT_LIST 29 #define ZN_CONFIG_WINDOW 30 #define ZN_CONFIG_ALPHA 31 #define ZN_CONFIG_FILL_RULE 32 #define ZN_CONFIG_SHORT 33 #define ZN_CONFIG_USHORT 34 #define ZN_CONFIG_CHAR 35 #define ZN_CONFIG_UCHAR 36 #define ZN_DRAW_FLAG 1 << 0 #define ZN_COORDS_FLAG 1 << 1 #define ZN_TRANSFO_FLAG 1 << 2 #define ZN_REPICK_FLAG 1 << 3 #define ZN_BORDER_FLAG 1 << 4 #define ZN_CLFC_FLAG 1 << 5 /* Clear Label Format Cache. */ #define ZN_IMAGE_FLAG 1 << 6 /* Update image pointer. */ #define ZN_VIS_FLAG 1 << 7 /* Visibility has changed. */ #define ZN_MOVED_FLAG 1 << 8 /* Item has moved. */ #define ZN_ITEM_FLAG 1 << 9 /* Signal a change in an item type attribute. */ #define ZN_MAP_INFO_FLAG 1 << 10/* Update mapinfo pointer. */ #define ZN_LAYOUT_FLAG 1 << 11 /* A layout need update. */ #define ZN_POLAR_FLAG 1 << 12 /* Signal a cartesian to polar change. */ #define ZN_CARTESIAN_FLAG 1 << 13 /* Signal a polar to cartesian change. */ #define ZN_TILE_FLAG 1 << 14 /* Update tile pointer. */ #define ZN_WINDOW_FLAG 1 << 15 /* Signal a change in a window type attribute. */ /* * This constant marks a non existant item */ #define ZN_NO_ITEM NULL /* * Constants for item parts. The item indexable parts (named fields) are coded * as positive or null integers. The item specific parts (not indexable) are * coded as negatives beginning at -2 up to -9 which is the current limit. The * -1 value is reserved to indicate no part. */ #define ZnPartToBit(part) (1 << (ABS(part)-2)) #define ZN_NO_PART -1 /* * Some flags macros. */ #define ISSET(var, mask) ((var) & (mask)) #define ISCLEAR(var, mask) (((var) & (mask)) == 0) #define SET(var,mask) ((var) |= (mask)) #define CLEAR(var, mask) ((var) &= ~(mask)) #define ASSIGN(var, mask, bool) ((bool) ? SET((var), (mask)) : CLEAR((var), (mask))) /* * Item flags values. */ #define ZN_VISIBLE_BIT (1<<0) #define ZN_SENSITIVE_BIT (1<<1) #define ZN_UPDATE_DEPENDENT_BIT (1<<2) #define ZN_COMPOSE_SCALE_BIT (1<<3) #define ZN_COMPOSE_ROTATION_BIT (1<<4) #define ZN_COMPOSE_ALPHA_BIT (1<<5) /* * Must be kept one greater than the last flag shift count. */ #define ZN_PRIVATE_FLAGS_OFFSET 6 /* * Operator constants for the coord method. */ #define ZN_COORDS_READ 0 #define ZN_COORDS_READ_ALL 1 #define ZN_COORDS_REPLACE 2 #define ZN_COORDS_REPLACE_ALL 3 #define ZN_COORDS_ADD 4 #define ZN_COORDS_ADD_LAST 5 #define ZN_COORDS_REMOVE 6 struct _ZnWInfo; struct _ZnTransfo; /* * Item record header -- */ typedef struct _ZnItemStruct { /* Private data */ unsigned int id; ZnList tags; struct _ZnWInfo *wi; /* The widget this item is on */ struct _ZnItemClassStruct *class; /* item class */ struct _ZnItemStruct *previous; /* previous item in group list */ struct _ZnItemStruct *next; /* next item in group list */ struct _ZnItemStruct *parent; ZnBBox item_bounding_box; /* device item bounding box */ /* Common attributes */ unsigned short flags; unsigned short part_sensitive; /* Currently limited to 16 parts per item */ unsigned short inv_flags; unsigned short priority; struct _ZnTransfo *transfo; struct _ZnItemStruct *connected_item; /* Item this item is connected to */ #ifdef GL #ifdef GL_LIST GLuint gl_list; /* Display list storing the item graphics */ #endif #endif } ZnItemStruct, *ZnItem; typedef struct _ZnToAreaStruct { Tk_Uid tag_uid; ZnBool enclosed; ZnItem in_group; ZnBool report; ZnBool recursive; ZnBool override_atomic; ZnBBox *area; } ZnToAreaStruct, *ZnToArea; typedef struct _ZnPickStruct { int aperture; ZnItem in_group; ZnItem start_item; ZnBool recursive; ZnBool override_atomic; ZnPoint *point; ZnItem a_item; int a_part; } ZnPickStruct, *ZnPick; /* * Item class record -- */ typedef int (*ZnItemInitMethod)(ZnItem item, int *argc, Tcl_Obj *CONST *args[]); typedef int (*ZnItemConfigureMethod)(ZnItem item, int argc, Tcl_Obj *CONST args[], int *flags); typedef int (*ZnItemQueryMethod)(ZnItem item, int argc, Tcl_Obj *CONST args[]); typedef void (*ZnItemCloneMethod)(ZnItem item); typedef void (*ZnItemDestroyMethod)(ZnItem item); typedef void (*ZnItemDrawMethod)(ZnItem item); typedef void (*ZnItemRenderMethod)(ZnItem item); typedef void (*ZnItemComputeCoordinatesMethod)(ZnItem item, ZnBool force); typedef int (*ZnItemToAreaMethod)(ZnItem item, ZnToArea ta); typedef ZnReal (*ZnItemPickMethod)(ZnItem item, ZnPick ps); typedef ZnBool (*ZnItemIsSensitiveMethod)(ZnItem item, int part); typedef struct _ZnFieldSetStruct* (*ZnItemGetFieldSetMethod)(ZnItem item); typedef int (*ZnItemContourMethod)(ZnItem item, int cmd, int index, ZnPoly *poly); typedef void (*ZnItemPickVertexMethod)(ZnItem item, ZnPoint *p, int *contour, int *vertex, int *o_vertex); typedef void (*ZnItemGetAnchorMethod)(ZnItem item, Tk_Anchor anchor, ZnPoint *p); typedef ZnBool (*ZnItemGetClipVerticesMethod)(ZnItem item, ZnTriStrip *tristrip); typedef ZnBool (*ZnItemGetContoursMethod)(ZnItem item, ZnPoly *poly); typedef int (*ZnItemCoordsMethod)(ZnItem item, int contour, int index, int cmd, ZnPoint **points, char **controls, unsigned int *num_points); typedef void (*ZnItemInsertCharsMethod)(ZnItem item, int field, int *index, char *chars); typedef void (*ZnItemDeleteCharsMethod)(ZnItem item, int field, int *first, int *last); typedef void (*ZnItemCursorMethod)(ZnItem item, int field, int index); typedef int (*ZnItemIndexMethod)(ZnItem item, int field, Tcl_Obj *index_spec, int *index); typedef int (*ZnItemPartMethod)(ZnItem item, Tcl_Obj **part_spec, int *part); typedef int (*ZnItemSelectionMethod)(ZnItem item, int field, int offset, char *chars, int max_chars); typedef int (*ZnItemPostScriptMethod)(ZnItem item, ZnBool prepass, ZnBBox *area); typedef void *ZnItemClassId; #define ZN_CLASS_HAS_ANCHORS (1<<0) #define ZN_CLASS_ONE_COORD (1<<1) typedef struct _ZnItemClassStruct { char *name; unsigned int size; ZnAttrConfig *attr_desc; unsigned int num_parts; /* 0 if no special parts, else * gives how many parts exist. */ int flags; /* HAS_ANCHORS, ONE_COORD */ int pos_offset; /* Offset of -position attrib, */ /* if any, -1 otherwise. */ ZnItemInitMethod Init; ZnItemCloneMethod Clone; ZnItemDestroyMethod Destroy; ZnItemConfigureMethod Configure; ZnItemQueryMethod Query; ZnItemGetFieldSetMethod GetFieldSet; ZnItemGetAnchorMethod GetAnchor; ZnItemGetClipVerticesMethod GetClipVertices; ZnItemGetContoursMethod GetContours; ZnItemCoordsMethod Coords; ZnItemInsertCharsMethod InsertChars; ZnItemDeleteCharsMethod DeleteChars; ZnItemCursorMethod Cursor; ZnItemIndexMethod Index; ZnItemPartMethod Part; ZnItemSelectionMethod Selection; ZnItemContourMethod Contour; ZnItemComputeCoordinatesMethod ComputeCoordinates; ZnItemToAreaMethod ToArea; ZnItemDrawMethod Draw; ZnItemRenderMethod Render; ZnItemIsSensitiveMethod IsSensitive; ZnItemPickMethod Pick; ZnItemPickVertexMethod PickVertex; ZnItemPostScriptMethod PostScript; } ZnItemClassStruct, *ZnItemClass; /* ********************************************************************************** * * Generic methods for all items. * ********************************************************************************** */ extern struct _ZnITEM { ZnItem (*CloneItem)(ZnItem model); void (*DestroyItem)(ZnItem item); int (*ConfigureItem)(ZnItem item, int field, int argc, Tcl_Obj *CONST args[], ZnBool init); int (*QueryItem)(ZnItem item, int field, int argc, Tcl_Obj *CONST args[]); void (*InsertItem)(ZnItem item, ZnItem group, ZnItem mark_item, ZnBool before); void (*UpdateItemPriority)(ZnItem item, ZnItem mark_item, ZnBool before); void (*UpdateItemDependency)(ZnItem item, ZnItem old_connection); void (*ExtractItem)(ZnItem item); void (*SetId)(ZnItem item); void (*FreeId)(ZnItem item); void (*AddTag)(ZnItem item, Tk_Uid tag); void (*RemoveTag)(ZnItem item, Tk_Uid tag); void (*FreeTags)(ZnItem item); ZnBool (*HasTag)(ZnItem item, Tk_Uid tag); void (*ResetTransfo)(ZnItem item); void (*SetTransfo)(ZnItem item, struct _ZnTransfo *t); void (*TranslateItem)(ZnItem item, ZnReal tx, ZnReal ty, ZnBool abs); void (*ScaleItem)(ZnItem item, ZnReal sx, ZnReal sy, ZnPoint *p); void (*SkewItem)(ZnItem item, ZnReal x_skew, ZnReal y_skew); void (*RotateItem)(ZnItem item, ZnReal angle, ZnBool deg, ZnPoint *p); void (*Invalidate)(ZnItem item, int reason); void (*InvalidateItems)(ZnItem group, ZnItemClass item_class); void (*GetItemTransform)(ZnItem item, struct _ZnTransfo *t); } ZnITEM; /* ********************************************************************************** * * Methods defined in Item.c useful for writing items. * ********************************************************************************** */ void ZnItemInit(); ZnItem ZnCreateItem(struct _ZnWInfo *wi, ZnItemClass item_class, int *argc, Tcl_Obj *CONST *args[]); void ZnAddItemClass(ZnItemClass class); ZnItemClass ZnLookupItemClass(char *class_name); ZnList ZnItemClassList(); int ZnConfigureAttributes(struct _ZnWInfo *wi, ZnItem item, void *record, ZnAttrConfig *attr_desc, int argc, Tcl_Obj *CONST args[], int *flags); int ZnAttributesInfo(Tcl_Interp *interp, void *record, ZnAttrConfig *attr_desc, int argc, Tcl_Obj *CONST args[]); int ZnQueryAttribute(Tcl_Interp *interp, void *record, ZnAttrConfig *attr_desc, Tcl_Obj *attr_name); void ZnInitTransformStack(struct _ZnWInfo *wi); void ZnFreeTransformStack(struct _ZnWInfo *wi); void ZnResetTransformStack(struct _ZnWInfo *wi); void ZnPushTransform(struct _ZnWInfo *wi, struct _ZnTransfo *transfo, ZnPoint *pos, ZnBool compose_scale, ZnBool compose_rot); void ZnPopTransform(struct _ZnWInfo *wi); void ZnInitClipStack(struct _ZnWInfo *wi); void ZnFreeClipStack(struct _ZnWInfo *wi); void ZnResetClipStack(struct _ZnWInfo *wi); void ZnPushClip(struct _ZnWInfo *wi, ZnTriStrip *tristrip, ZnBool simple, ZnBool set_gc); void ZnPopClip(struct _ZnWInfo *wi, ZnBool set_gc); ZnBool ZnCurrentClip(struct _ZnWInfo *wi, TkRegion *reg, ZnBBox **clip_box, ZnBool *simple); void ZnUpdateItemImage(void *client_data); extern ZnItemClassId ZnArc; extern ZnItemClassId ZnMap; extern ZnItemClassId ZnTabular; extern ZnItemClassId ZnCurve; extern ZnItemClassId ZnBezier; extern ZnItemClassId ZnTriangles; extern ZnItemClassId ZnRectangle; extern ZnItemClassId ZnReticle; extern ZnItemClassId ZnTrack; extern ZnItemClassId ZnWayPoint; extern ZnItemClassId ZnGroup; extern ZnItemClassId ZnIcon; extern ZnItemClassId ZnText; extern ZnItemClassId ZnWindow; #endif /* _Item_h */