Exemplo n.º 1
0
/*!
* \return	Woolz error code.
* \ingroup	WlzBoundary
* \brief	decomposes a boundary into it's component polygons.
* \param	bndObj		Given boundary.
* \param	dstNumObjs	Destination pointer for the number of polygons.
* \param	dstObjArray	Destination pointer for the array of polygons.
*/
WlzErrorNum WlzBoundaryToPolyObjArray(
  WlzObject	*bndObj,
  int		*dstNumObjs,
  WlzObject	***dstObjArray)
{
  WlzErrorNum	errNum=WLZ_ERR_NONE;
  WlzDomain	domain;
  WlzValues	values;
  WlzObject	*obj, **objs;
  WlzPolygonDomain	**polyArray;
  int 		i, numPolys;

  /* check inputs */
  if( bndObj == NULL ){
    errNum = WLZ_ERR_OBJECT_NULL;
  }
  else if((dstNumObjs == NULL) || (dstObjArray == NULL)){
    errNum = WLZ_ERR_PARAM_NULL;
  }
  else {
    /* generate array of poly domains */
    errNum = WlzBoundObjToPolyDomArray(bndObj, &numPolys, &polyArray);
  }

  /* convert to polygon objects */
  if( errNum == WLZ_ERR_NONE ){
    if((objs = (WlzObject **) AlcMalloc(sizeof(WlzObject *)*numPolys)) == NULL){
      errNum = WLZ_ERR_MEM_ALLOC;
      for(i=0; i < numPolys; i++){
	WlzFreePolyDmn(polyArray[i]);
      }
      AlcFree(polyArray);
      numPolys = 0;
    }
    else {
      for(i=0; i < numPolys; i++){
	domain.poly = polyArray[i];
	values.core = NULL;
	obj = WlzMakeMain(WLZ_2D_POLYGON, domain, values,
			  NULL, NULL, &errNum);
	objs[i] = WlzAssignObject(obj, NULL);
	WlzFreePolyDmn(polyArray[i]);
      }
      AlcFree(polyArray);
    }
  }
  
  *dstNumObjs = numPolys;
  *dstObjArray = objs;
  return errNum;
}
Exemplo n.º 2
0
void MAPaintTabletQuit(
  ThreeDViewStruct	*view_struct)
{
  /* do nothing if tablet NULL */
  if( !tablet ){
    return;
  }

  /* stop the tablet */
  TabletStop(tablet);

  /* remove it as an input source */
  XtRemoveInput(tabletInputId);

  /* close it */
  TabletClose(tablet);
  tablet = NULL;

  /* clear the global polyline */
  if( tabletPoly ){
    WlzFreePolyDmn(tabletPoly);
    tabletPoly = NULL;
  }

  return;
}
Exemplo n.º 3
0
/*! 
* \ingroup      WlzAllocation
* \brief        Recursively free a boundary list.
*
* \return       Error number, values: WLZ_ERR_NONE and from WlzUnlink().
* \param    b	Boundary list structure to be freed (note this will call WlzFreeBoundList recursively).
* \par      Source:
*                WlzFreeSpace.c
*/
WlzErrorNum WlzFreeBoundList(WlzBoundList *b)
{
  WlzErrorNum	errNum = WLZ_ERR_NONE;

  /* check the object pointer and linkcount */
  if (b == NULL){
    return( WLZ_ERR_NONE );
  }

  if( WlzUnlink(&(b->linkcount), &errNum) ){
    errNum |= WlzFreePolyDmn(b->poly);
    errNum |= WlzFreeBoundList(b->next);
    errNum |= WlzFreeBoundList(b->down);
    AlcFree((void *) b);
  }

  return( errNum );
}
Exemplo n.º 4
0
static void TabletPolyNextPoint(
  int	x,
  int	y)
{
  int	lastVtx;
  WlzPolygonDomain	*tmpPoly;

  /* create the polygon if required */
  if( tabletPoly == NULL ){
    tabletPoly = WlzMakePolygonDomain(WLZ_POLYGON_INT,
				      0, NULL, 256, 1, NULL);
    tabletPoly->vtx[0].vtX = x;
    tabletPoly->vtx[0].vtY = y;
    tabletPoly->nvertices = 1;
    return;
  }

  /* check if this point differs from the last */
  lastVtx = tabletPoly->nvertices;
  if((tabletPoly->vtx[lastVtx-1].vtX == x) &&
     (tabletPoly->vtx[lastVtx-1].vtY == y)){
    return;
  }

  /* check if more points needed */
  if( lastVtx >= tabletPoly->maxvertices ){
    tmpPoly = WlzMakePolygonDomain(WLZ_POLYGON_INT, lastVtx,
				   tabletPoly->vtx,
				   lastVtx + 256, 1, NULL);
    WlzFreePolyDmn(tabletPoly);
    tabletPoly = tmpPoly;
  }

  /* add the next point */
  tabletPoly->vtx[lastVtx].vtX = x;
  tabletPoly->vtx[lastVtx].vtY = y;
  tabletPoly->nvertices++;

  return;
}
Exemplo n.º 5
0
/*!
* \return	Woolz error code.
* \ingroup	WlzDomainOps
* \brief	Creates a new boundary list containing only the boundaries
* 		in the given bounary list who's polygons intersect the given
* 		pixel domain.
* \param	gBnd		Given boundary list pointer.
* \param	gDom		Given pixel domain.
* \param	dstErr		Destination error pointer, may be NULL.
*/
static WlzBoundList		*WlzDomFill3DDoBound2D(
				  WlzBoundList *gBnd,
				  WlzDomain gDom,
				  WlzErrorNum *dstErr)
{
  WlzBoundList	*rBnd = NULL,
  		*pBnd = NULL;
  WlzErrorNum	errNum = WLZ_ERR_NONE;

  while(gBnd)
  {
    int		isn = 0;
    WlzPolygonDomain *gPly;

    if((gPly = gBnd->poly) != NULL)
    {
      int	i;
      WlzIVertex2 *vtx;

      vtx = gPly->vtx;
      for(i = 0; i < gPly->nvertices; ++i)
      {
	isn = WlzInsideDomain2D(gDom.i, vtx[i].vtY,  vtx[i].vtX, NULL);
	if(isn)
	{
	  break;
	}
      }
    }
    if(isn)
    {
      WlzPolygonDomain *nPly;
      WlzBoundList *nBnd = NULL;

      /* Copy Boundary. */
      nPly = WlzMakePolygonDomain(gPly->type, gPly->nvertices, gPly->vtx,
				  gPly->maxvertices, 1, &errNum);
      if(nPly)
      {
	nBnd = WlzMakeBoundList(gBnd->type, gBnd->wrap, nPly, &errNum);
	if(rBnd == NULL)
	{
	  rBnd = nBnd;
	}
	if(pBnd)
	{
	  pBnd->next = nBnd;
	}
	pBnd = nBnd;
      }
      if((nBnd == NULL) && nPly)
      {
	(void )WlzFreePolyDmn(nPly);
      }
      /* Do down boundaries. */
      if((errNum == WLZ_ERR_NONE) && (gBnd->down != NULL))
      {
        nBnd->down = WlzDomFill3DDoBound2D(gBnd->down, gDom, dstErr);
	if(nBnd->down)
	{
	  nBnd->down->up = nBnd;
	}
      }
    }
    gBnd = gBnd->next;
  }
  if(dstErr)
  {
    *dstErr = errNum;
  }
  return(rBnd);
}
Exemplo n.º 6
0
/*! 
* \ingroup      WlzAllocation
* \brief        Free space allocated to a woolz object.
*
* \return       Error number, values: WLZ_ERR_NONE, WLZ_ERR_MEM_FREE
* \param    obj	Object to be freed.
* \par      Source:
*                WlzFreeSpace.c
*/
WlzErrorNum WlzFreeObj(WlzObject *obj)
{
  int 			i;
  WlzCompoundArray	*ca = (WlzCompoundArray *) obj;
  WlzErrorNum		errNum = WLZ_ERR_NONE;

  WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_FN|WLZ_DBG_LVL_1),
  	  ("WlzFreeObj FE %p\n",
	   obj));

  /* check the object pointer and linkcount */
  if (obj == NULL){
    return( WLZ_ERR_NONE );
  }

  if( WlzUnlink(&(obj->linkcount), &errNum) ){    /* Check linkcount */

    switch( obj->type ){

    case WLZ_2D_DOMAINOBJ:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
	      ("WlzFreeObj %p WLZ_2D_DOMAINOBJ "
	       "%p %d %p %d %p\n",
	       obj, (obj->domain.i),
	       (obj->domain.i?obj->domain.i->linkcount: 0),
	       (obj->values.core),
	       ((obj->values.core)? obj->values.core->linkcount: 0),
	       (obj->plist)));
      errNum = WlzFreeDomain(obj->domain);
      if((errNum == WLZ_ERR_NONE) && (obj->values.core != NULL)) {
	if(WlzGreyTableIsTiled(obj->values.core->type) == WLZ_GREY_TAB_TILED) {
	  errNum = WlzFreeTiledValues(obj->values.t);
	}
	else {
	  errNum = WlzFreeValueTb(obj->values.v);
	}
      }
      if(errNum == WLZ_ERR_NONE) {
        errNum = WlzFreePropertyList(obj->plist);
      }
      if(errNum == WLZ_ERR_NONE) {
        errNum = WlzFreeObj(obj->assoc);
      }
      break;

    case WLZ_3D_DOMAINOBJ:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_3D_DOMAINOBJ %p, "
	       "%d %p %d %p\n",
	       obj, obj->domain.i,
	       (obj->domain.p? obj->domain.p->linkcount: 0),
	       obj->values.core,
	       (obj->values.core? obj->values.core->linkcount: 0),
	       obj->plist));
      errNum = WlzFreePlaneDomain(obj->domain.p);
      if((errNum == WLZ_ERR_NONE) && (obj->values.core != NULL)){
	if(WlzGreyTableIsTiled(obj->values.core->type) == WLZ_GREY_TAB_TILED) {
	  errNum = WlzFreeTiledValues(obj->values.t);
	}
	else {
	  errNum = WlzFreeVoxelValueTb(obj->values.vox);
	}
      }
      if(errNum == WLZ_ERR_NONE) {
        errNum = WlzFreePropertyList(obj->plist);
      }
      if(errNum == WLZ_ERR_NONE) {
        errNum = WlzFreeObj(obj->assoc);
      }
      break;

    case WLZ_TRANS_OBJ:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_TRANS_OBJ %p, "
	       "%d %p %d %p\n",
	       obj, obj->domain.t,
	       ((obj->domain.t)?(obj->domain.t)->linkcount: 0),
	       obj->values.obj,
	       ((obj->values.obj)?(obj->values.obj)->linkcount: 0),
	       obj->plist));
      if( WlzFreeAffineTransform(obj->domain.t) ||
	  WlzFreeObj(obj->values.obj) ||
	  WlzFreePropertyList(obj->plist) ||
	  WlzFreeObj(obj->assoc) ){
	errNum = WLZ_ERR_MEM_FREE;
      }
      break;

    case WLZ_2D_POLYGON:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_2D_POLYGON %p\n",
	       obj, obj->domain.poly));
      errNum = WlzFreePolyDmn(obj->domain.poly);
      break;

    case WLZ_BOUNDLIST:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_BOUNDLIST %p\n",
	       obj, obj->domain.b));
      errNum = WlzFreeBoundList(obj->domain.b);
      break;

    case WLZ_CONTOUR:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_CONTOUR %p\n",
	       obj, obj->domain.ctr));
      errNum = WlzFreeContour(obj->domain.ctr);
      break;

    case WLZ_CONV_HULL:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_CONV_HULL %p %p\n",
	       obj, obj->domain.core, obj->values.core));
      if(obj->domain.core) {
        switch(obj->domain.core->type) {
	  case WLZ_CONVHULL_DOMAIN_2D:
	    errNum = WlzFreeConvexHullDomain2(obj->domain.cvh2);
	    break;
	  case WLZ_CONVHULL_DOMAIN_3D:
	    errNum = WlzFreeConvexHullDomain3(obj->domain.cvh3);
	    break;
	  default:
	    errNum = WLZ_ERR_DOMAIN_TYPE;
	    break;
	}
      }
      break;

    case WLZ_CMESH_2D:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_CMESH_2D %p, "
	       "%d %p %d %p\n",
	       obj, obj->domain.cm2,
	       ((obj->domain.cm2)? (obj->domain.cm2)->linkcount: 0),
	       obj->values.x,
	       ((obj->values.x)? (obj->values.x)->linkcount: 0),
	       obj->plist));
      errNum = WlzCMeshFree2D(obj->domain.cm2);
      if((errNum == WLZ_ERR_NONE) && (obj->values.core != NULL))
      {
	errNum = WlzFreeIndexedValues(obj->values.x);
      }
      if((errNum == WLZ_ERR_NONE) && (obj->plist != NULL))
      {
	errNum = WlzFreePropertyList(obj->plist);
      }
      if((errNum == WLZ_ERR_NONE) && (obj->assoc != NULL))
      {
	errNum = WlzFreeObj(obj->assoc);
      }
      break;
    case WLZ_CMESH_2D5:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_CMESH_2D5 %p, "
	       "%d %p %d %p\n",
	       obj, obj->domain.cm2d5,
	       ((obj->domain.cm2d5)? (obj->domain.cm2d5)->linkcount: 0),
	       obj->values.x,
	       ((obj->values.x)? (obj->values.x)->linkcount: 0),
	       obj->plist));
      errNum = WlzCMeshFree2D5(obj->domain.cm2d5);
      if((errNum == WLZ_ERR_NONE) && (obj->values.core != NULL))
      {
	errNum = WlzFreeIndexedValues(obj->values.x);
      }
      if((errNum == WLZ_ERR_NONE) && (obj->plist != NULL))
      {
	errNum = WlzFreePropertyList(obj->plist);
      }
      if((errNum == WLZ_ERR_NONE) && (obj->assoc != NULL))
      {
	errNum = WlzFreeObj(obj->assoc);
      }
      break;

    case WLZ_CMESH_3D:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_CMESH_3D %p, "
	       "%d %p %d %p\n",
	       obj, obj->domain.cm3,
	       ((obj->domain.cm3)?(obj->domain.cm3)->linkcount: 0),
	       obj->values.x,
	       ((obj->values.x)?(obj->values.x)->linkcount: 0),
	       obj->plist));
      errNum = WlzCMeshFree3D(obj->domain.cm3);
      if((errNum == WLZ_ERR_NONE) && (obj->values.core != NULL))
      {
	errNum = WlzFreeIndexedValues(obj->values.x);
      }
      if((errNum == WLZ_ERR_NONE) && (obj->plist != NULL))
      {
	errNum = WlzFreePropertyList(obj->plist);
      }
      if((errNum == WLZ_ERR_NONE) && (obj->assoc != NULL))
      {
	errNum = WlzFreeObj(obj->assoc);
      }
      break;

    case WLZ_POINTS:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_POINTS %p\n",
	       obj, obj->domain.pts));
      errNum = WlzFreeDomain(obj->domain);
      if((errNum == WLZ_ERR_NONE) && (obj->values.core != NULL))
      {
        errNum = WlzFreePointValues(obj->values.pts);
      }
      if((errNum == WLZ_ERR_NONE) && (obj->plist != NULL))
      {
        errNum = WlzFreePropertyList(obj->plist);
      }
      if((errNum == WLZ_ERR_NONE) && (obj->assoc != NULL))
      {
	errNum = WlzFreeObj(obj->assoc);
      }
      break;

    case WLZ_HISTOGRAM:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_CONV_HULL %p\n",
	       obj, obj->domain.hist));
      errNum = WlzFreeDomain(obj->domain);
      break;

    case WLZ_RECTANGLE:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_RECTANGLE %p\n",
	       obj, obj->domain.r));
      errNum = WlzFreeDomain(obj->domain);
      break;

    case WLZ_AFFINE_TRANS:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_AFFINE_TRANS\n",
	       obj));
      errNum = WlzFreeAffineTransform(obj->domain.t);
      break;

    case WLZ_LUT:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
              ("WlzFreeObj %p WLZ_LUT\n",
	      obj));
      errNum = WlzFreeDomain(obj->domain);
      if(errNum == WLZ_ERR_NONE)
      {
        errNum = WlzFreeLUTValues(obj->values);
      }
      break;

    case WLZ_COMPOUND_ARR_1:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_COMPOUND_ARR_1\n",
	       ca));
      for (i=0; i<ca->n; i++){
	if( WlzFreeObj(ca->o[i]) != WLZ_ERR_NONE ){
	  errNum = WLZ_ERR_MEM_FREE;
	}
      }
      break;

    case WLZ_COMPOUND_ARR_2:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_COMPOUND_ARR_2\n",
	       ca));
      for (i=0; i<ca->n; i++){
	if( WlzFreeObj(ca->o[i]) != WLZ_ERR_NONE ){
	  errNum = WLZ_ERR_MEM_FREE;
	}
      }
      break;

    case WLZ_PROPERTY_OBJ:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_PROPERTY_OBJ\n",
	       obj));
      errNum = WlzFreePropertyList(obj->plist);
      break;

    case WLZ_EMPTY_OBJ:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p WLZ_EMPTY_OBJ\n",
	       obj));
      break;

    default:
      WLZ_DBG((WLZ_DBG_ALLOC|WLZ_DBG_LVL_1),
      	      ("WlzFreeObj %p %d\n",
	       obj, (int )(obj->type)));
      errNum = WLZ_ERR_OBJECT_TYPE;
      break;

    }    /* End of switch */

    AlcFree((void *) obj);
  }

  return( errNum );
}
Exemplo n.º 7
0
/*! 
* \ingroup      WlzAllocation
* \brief        Free a planedomain
*
* \return       Error number, values: WLZ_ERR_NONE and errors from
 WlzFreeAffineTransform(), WlzFreeDomain(), WlzFreeBoundList(),
 WlzFreePolyDmn().
* \param    planedm	Pointer to planedomain structure to be freed.
* \par      Source:
*                WlzFreeSpace.c
*/
WlzErrorNum WlzFreePlaneDomain(WlzPlaneDomain *planedm)
{
  WlzDomain	*domains;
  int 		nplanes;
  WlzErrorNum	errNum = WLZ_ERR_NONE;

  /* check the object pointer and linkcount */
  if (planedm == NULL){
    return( WLZ_ERR_NONE );
  }

  if( WlzUnlink(&(planedm->linkcount), &errNum) ){

    nplanes = planedm->lastpl - planedm->plane1 + 1;
    domains = planedm->domains;

    switch( planedm->type ){

    case WLZ_PLANEDOMAIN_DOMAIN:
      while( nplanes-- ){
	errNum |= WlzFreeDomain( *domains );
	domains++;
      }
      break;

    case WLZ_PLANEDOMAIN_POLYGON:
      while( nplanes-- ){
	errNum |= WlzFreePolyDmn((*domains).poly);
	domains++;
      }
      break;

    case WLZ_PLANEDOMAIN_BOUNDLIST:
      while( nplanes-- ){
	errNum |= WlzFreeBoundList((*domains).b);
	domains++;
      }
      break;

    case WLZ_PLANEDOMAIN_HISTOGRAM:
      while( nplanes-- ){
	errNum |= WlzFreeDomain(*domains);
	domains++;
      }
      break;

    case WLZ_PLANEDOMAIN_AFFINE:
      while( nplanes-- ){
	errNum |= WlzFreeAffineTransform((*domains).t);
	domains++;
      }
      break;

    default:
      return( WLZ_ERR_PLANEDOMAIN_TYPE );

    }
    AlcFree((void *) planedm->domains);
    AlcFree((void *) planedm);
  }

  return( errNum );
}
Exemplo n.º 8
0
void MAPaintTabletCb(
  Widget	w,
  XtPointer	client_data,
  XtPointer	call_data)
{
  ThreeDViewStruct	*view_struct = (ThreeDViewStruct *) client_data;
  XmAnyCallbackStruct	*cbs = (XmAnyCallbackStruct *) call_data;
  WlzObject		*obj, *obj1;

  switch( cbs->event->type ){

  case ButtonPress:
    switch( cbs->event->xbutton.button ){
    case Button1:
    case Button2:
      /* do nothing if shift pressed - magnify option */
      if( cbs->event->xbutton.state & ButtonStateIgnoreMask ){
	break;
      }
      break;

    default:
      break;

    }
    break;

  case ButtonRelease:
    switch( cbs->event->xbutton.button ){
    case Button1:
    case Button2:
      break;

    case Button3:
      if( tabletDrawingFlag ){
	if( quitDrawingTrigger ){
	  tabletDrawingFlag = 0;
	  quitDrawingTrigger = 0;
	}
	/* install the new domain */
	if( tabletPoly ){
	  obj = WlzPolyToObj(tabletPoly, WLZ_SIMPLE_FILL, NULL);
	  /* reset the painted object and redisplay */
	  if( obj ){
	    obj1 =
	      WlzShiftObject(obj,
			     view_struct->painted_object->domain.i->kol1,
			     view_struct->painted_object->domain.i->line1,
			     0, NULL);
	    setDomainIncrement(obj1, view_struct, currDomain, delFlag);
	    WlzFreeObj( obj );
	    WlzFreeObj( obj1 );
	  }
	  WlzFreePolyDmn(tabletPoly);
	  tabletPoly = NULL;
	}	  
      }
      break;
    }
    break;

  case MotionNotify:
    break;

  case KeyPress:
    /* check for modifier key events */
    switch( XLookupKeysym(&(cbs->event->xkey), 0) ){
    case XK_Shift_L:
    case XK_Shift_R:
      modifiers |= ShiftMask;
      break;
    case XK_Control_L:
    case XK_Control_R:
      modifiers |= ControlMask;
      break;
    case XK_Meta_L:
    case XK_Meta_R:
      modifiers |= Mod4Mask;
      break;
    case XK_Alt_L:
    case XK_Alt_R:
      modifiers |= Mod1Mask;
      break;
    }
    break;

  case KeyRelease:
    /* check for modifier key events */
    switch( XLookupKeysym(&(cbs->event->xkey), 0) ){
    case XK_Shift_L:
    case XK_Shift_R:
      modifiers &= ~ShiftMask;
      break;
    case XK_Control_L:
    case XK_Control_R:
      modifiers &= ~ControlMask;
      break;
    case XK_Meta_L:
    case XK_Meta_R:
      modifiers &= ~Mod4Mask;
      break;
    case XK_Alt_L:
    case XK_Alt_R:
      modifiers &= ~Mod1Mask;
      break;
    }
    break;

  case TabletButtonPress:
    switch( cbs->event->xbutton.button ){
    case Button1:
    case Button2:
      /* set the drawing flag */
      if( !tabletDrawingFlag ){
	/* save the current domain selection and meta button state */
	currDomain = globals.current_domain;
	delFlag = ((modifiers & Mod1Mask) ||
		   (cbs->event->xbutton.button == Button2));
      
	tabletDrawingFlag = 1;
      }
      /* set the next point */
      TabletPolyNextPoint(cbs->event->xbutton.x, cbs->event->xbutton.y);
      break;

    case Button3:
      if( tabletDrawingFlag ){
	quitDrawingTrigger = 1;
      }
      else {
	canvas_2D_painting_cb(w, client_data, call_data);
      }
      break;
    }
    break;

  case TabletButtonRelease:
    switch( cbs->event->xbutton.button ){
    case Button1:
    case Button2:
      break;

    case Button3:
      if( tabletDrawingFlag ){
	if( quitDrawingTrigger ){
	  tabletDrawingFlag = 0;
	  quitDrawingTrigger = 0;
	}
	/* install the new domain */
	if( tabletPoly ){
	  obj = WlzPolyToObj(tabletPoly, WLZ_SIMPLE_FILL, NULL);
	  /* reset the painted object and redisplay */
	  if( obj ){
	    obj1 =
	      WlzShiftObject(obj,
			     view_struct->painted_object->domain.i->kol1,
			     view_struct->painted_object->domain.i->line1,
			     0, NULL);
	    setDomainIncrement(obj1, view_struct, currDomain, delFlag);
	    WlzFreeObj( obj );
	    WlzFreeObj( obj1 );
	  }
	  WlzFreePolyDmn(tabletPoly);
	  tabletPoly = NULL;
	}	  
      }
      else {
	canvas_2D_painting_cb(w, client_data, call_data);
      }
      break;
    }
    break;

  case TabletMotionNotify:
    if( tabletDrawingFlag ){
      if( cbs->event->xmotion.state & (Button1Mask|Button2Mask) ){
	/* if buttons 1 or 2 pressed then set next point */
	TabletPolyNextPoint(cbs->event->xmotion.x, cbs->event->xmotion.y);
      }
      else {
	/* rubber band from last point */
	/* don't need this since the user is looking at the tablet */
      }
    }
    else {
      canvas_2D_painting_cb(w, client_data, call_data);
    }
    break;

  default:
    break;
  }

  return;
}
Exemplo n.º 9
0
void MAPaintTabletInit(
  ThreeDViewStruct	*view_struct)
{
  TabletEvent	event;
  int		quitFlag;
  Widget	dialog;
  XmString	text, title;
  WlzDVertex2	tabVtxs[2], wlzVtxs[2];
  Widget	slider;
  WlzAffineTransform	*trans;

  /* ignore if already open */
  if( tablet ){
    return;
  }

  /* open the tablet */
  if( (tablet = TabletOpen(WACOM_IV_TABLET_TYPE,
			   "/dev/term/b", NULL)) == NULL ){
    HGU_XmUserError(globals.topl,
		    "Open Wacom Tablet:\n"
		    "    Failed to open the tablet, please check\n"
		    "    the tablet is connected to serial line b\n"
		    "    and switched on, then try again.",
		    XmDIALOG_FULL_APPLICATION_MODAL);
    return;
  }

  /* set tilt mode and start the tablet */
  TabletSetMode(tablet, TABLET_TILTMODE_MASK);
  tablet->cntrlMode2 |= TABLET_CORRECT_TILT_MASK;
  tablet->cntrlMode2 |= TABLET_TRANSFORM_MASK;
  TabletStart(tablet);

  /* if the tablet needs the coordinates set then do so here */
  if( !view_struct->tablet_initialised ){
    /* get first coordinate */
    /* put up an application modal dialog to request first
       coordinate */
    dialog = XmCreateMessageDialog(view_struct->canvas,
				   "MAPaint Message", NULL, 0);
    XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON));
    XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON));
    XtSetSensitive(XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON),
		   False);
    text  = XmStringCreateLtoR("Input tablet reference point 1 please",
			       XmSTRING_DEFAULT_CHARSET);
    title = XmStringCreateSimple("MAPaint Tablet Message");

    XtVaSetValues(dialog,
		  XmNmessageString,	text,
		  XmNdialogTitle,	title,
		  XmNdialogStyle,	XmDIALOG_FULL_APPLICATION_MODAL,
		  NULL);

    XmStringFree( text );
    XmStringFree( title );

    /* popup widget and process events */
    XtManageChild( dialog );
    XSync(XtDisplay(view_struct->canvas), False);
    quitFlag = 0;
    while( quitFlag < 100 ){
      if((XtAppPending(globals.app_con) > 0) ){
	XtAppProcessEvent(globals.app_con, XtIMAll);
      }
      else {
	XSync(XtDisplay(view_struct->canvas), False);
	usleep(1000);
	quitFlag++;
      }
    }
    
    quitFlag = 0;
    while( !quitFlag ){
      if( TabletNextEvent(tablet, &event) == TABLET_ERR_NONE ){
	if(event.buttonPressed && 
	   ((event.buttons == 1) || (event.buttons == 3))){
	  tabVtxs[0].vtX = event.x;
	  tabVtxs[0].vtY = event.y;
	  quitFlag = 1;
	  XBell(XtDisplay(view_struct->canvas), 100);
	  XFlush(XtDisplay(view_struct->canvas));
	}
      }
      else {
	TabletClose(tablet);
	tablet = NULL;
	XtDestroyWidget(dialog);
	return;
      }
    }

    /* get second coordinate */
    text  = XmStringCreateLtoR("Input tablet reference point 2 please",
			       XmSTRING_DEFAULT_CHARSET);

    XtVaSetValues(dialog,
		  XmNmessageString,	text,
		  NULL);

    XmStringFree( text );

    /* popup widget and process events */
    XtManageChild( dialog );
    XSync(XtDisplay(view_struct->canvas), False);
    while( (XtAppPending(globals.app_con) > 0) ){
      XtAppProcessEvent(globals.app_con, XtIMAll);
      XSync(XtDisplay(view_struct->canvas), False);
    }
    
    quitFlag = 0;
    sleep(1);
    TabletClearEvents(tablet);
    while( !quitFlag ){
      if( TabletNextEvent(tablet, &event) == TABLET_ERR_NONE ){
	if(event.buttonPressed && 
	   ((event.buttons == 1) || (event.buttons == 3))){
	  tabVtxs[1].vtX = event.x;
	  tabVtxs[1].vtY = event.y;
	  quitFlag = 1;
	  XBell(XtDisplay(view_struct->canvas), 100);
	  XFlush(XtDisplay(view_struct->canvas));
	}
      }
      else {
	TabletClose(tablet);
	XtDestroyWidget(dialog);
	tablet = NULL;
	return;
      }
    }
    TabletStop(tablet);
    XtDestroyWidget(dialog);
    usleep(10000);
    TabletClearEvents(tablet);

    /* set the reference coordinates */
    view_struct->ref1.vtX = tabVtxs[0].vtX;
    view_struct->ref1.vtY = tabVtxs[0].vtY;
    view_struct->ref2.vtX = tabVtxs[1].vtX;
    view_struct->ref2.vtY = tabVtxs[1].vtY;
  }
  else {
    tabVtxs[0].vtX = view_struct->ref1.vtX;
    tabVtxs[0].vtY = view_struct->ref1.vtY;
    tabVtxs[1].vtX = view_struct->ref2.vtX;
    tabVtxs[1].vtY = view_struct->ref2.vtY;
  }

  /* set tablet transform parameters */
  if((slider = XtNameToWidget(tablet_controls, "*.x1")) )
  {
    wlzVtxs[0].vtX = HGU_XmGetSliderValue(slider);
  }
  if((slider = XtNameToWidget(tablet_controls, "*.y1")) )
  {
    wlzVtxs[0].vtY = HGU_XmGetSliderValue(slider);
  }
  if((slider = XtNameToWidget(tablet_controls, "*.x2")) )
  {
    wlzVtxs[1].vtX = HGU_XmGetSliderValue(slider);
  }
  if( (slider = XtNameToWidget(tablet_controls, "*.y2")))
  {
    wlzVtxs[1].vtY = HGU_XmGetSliderValue(slider);
  }
  trans = WlzAffineTransformLSq2D(2, tabVtxs, 2, wlzVtxs, 0, NULL,
				  WLZ_TRANSFORM_2D_NOSHEAR, NULL);
  tablet->xTrans[0] = trans->mat[0][0];
  tablet->xTrans[1] = trans->mat[0][1];
  tablet->xTrans[2] = trans->mat[0][2];
  tablet->yTrans[0] = trans->mat[1][0];
  tablet->yTrans[1] = trans->mat[1][1];
  tablet->yTrans[2] = trans->mat[1][2];
  WlzFreeAffineTransform(trans);
  view_struct->tablet_initialised = 1;

  /* initialise the globals */
  modifiers = 0;
  tabletDrawingFlag = 0;
  quitDrawingTrigger = 0;
  if( tabletPoly ){
    WlzFreePolyDmn(tabletPoly);
    tabletPoly = NULL;
  }

  /* now add the tablet stream as an event input source */
  TabletStart(tablet);
  TabletClearEvents(tablet);
  tabletInputId = XtAppAddInput(globals.app_con, tablet->fd,
				(XtPointer) XtInputReadMask,
				tabletInputProc, (XtPointer) view_struct);

  return;
}
Exemplo n.º 10
0
void conformal_input_cb(
  Widget		w,
  XtPointer		client_data,
  XtPointer		call_data)
{
  ThreeDViewStruct	*view_struct = (ThreeDViewStruct *) client_data;
  WlzThreeDViewStruct	*wlzViewStr= view_struct->wlzViewStr;
  XmAnyCallbackStruct	*cbs = (XmAnyCallbackStruct *) call_data;
  int			x, y;
  int			i;
  WlzPolygonDomain	*startPoly;
  WlzFVertex2		fpVtx, *fvtxs;
  WlzObject		*polygon;
  WlzErrorNum		errNum=WLZ_ERR_NONE;

  /* switch on event type */
  switch( cbs->event->type ){

   case ButtonPress:
     switch( cbs->event->xbutton.button ){

      case Button1:
	specialTriggered = 1;

	/* get the polyline, rescale as required */
	fpVtx.vtX = cbs->event->xbutton.x;
	fpVtx.vtY = cbs->event->xbutton.y;
	fvtxs = &fpVtx;
	startPoly = WlzAssignPolygonDomain(
	  WlzMakePolygonDomain(WLZ_POLYGON_FLOAT, 1,
			       (WlzIVertex2 *) fvtxs,
			       1, 1, NULL), &errNum);
	if( confPoly ){
	  WlzFreePolyDmn(confPoly);
	}
	globals.paint_action_quit_flag = 0;
	confPoly = HGU_XGetPolyDomain(XtDisplay(view_struct->canvas),
				  XtWindow(view_struct->canvas),
				  0, NULL, startPoly);
	WlzFreePolyDmn(startPoly);
	if( confPoly == NULL ){
	  break;
	}

	/* convert to an 8-connected polyline */
	if((polygon = WlzPolyTo8Polygon(confPoly, 1, &errNum))){
	  WlzFreePolyDmn(confPoly);
	  if((confPoly = WlzAssignPolygonDomain(
	    WlzMakePolygonDomain(WLZ_POLYGON_INT, 
			   polygon->domain.poly->nvertices,
			   polygon->domain.poly->vtx,
			   polygon->domain.poly->nvertices,
				 1, &errNum), NULL))){
	    confPoly->type = WLZ_POLYGON_FLOAT;
	    fvtxs = (WlzFVertex2 *) confPoly->vtx;
	    for(i=0; i < confPoly->nvertices; i++){
	      fvtxs[i].vtX = (float) confPoly->vtx[i].vtX;
	      fvtxs[i].vtY = (float) confPoly->vtx[i].vtY;
	    }
	  }
	}

	/* determine the conformal approximate coordinate mesh */
	conformalCalculateMeshCb(w, client_data, call_data);

	/* display the polyline and mesh */
	conformalDisplayPolysCb(w, client_data, call_data);

	break;

      case Button2:
	break;

      case Button3:		/* unused */
      default:
	break;

     }
     break;

   case ButtonRelease:
     switch( cbs->event->xbutton.button ){

      case Button1:
	break;

     case Button2:
       x = cbs->event->xbutton.x / wlzViewStr->scale;
       y = cbs->event->xbutton.y / wlzViewStr->scale;
       display_pointer_feedback_information(view_struct, x, y);
       break;

     case Button3:
       /* check if have been drawing */
       if( specialTriggered ){
	 specialTriggered = 0;
	 break;
       }

       /* revert to normal mode */
       view_struct->noPaintingFlag = 0;
       view_struct->titleStr = "Section view";
       set_view_dialog_title(view_struct->dialog,
			     wlzViewStr->theta,
			     wlzViewStr->phi);
       /* set sensitivities */
       XtSetSensitive(view_struct->controls, True);
       XtSetSensitive(view_struct->slider, True);
       setControlButtonsSensitive(view_struct, True);

       /* swap the callbacks to special mode */
       XtRemoveCallback(view_struct->canvas, XmNexposeCallback,
			conformalDisplayPolysCb, view_struct);
       XtRemoveCallback(view_struct->canvas, XmNinputCallback,
			conformal_input_cb, client_data);
       XtAddCallback(view_struct->canvas, XmNinputCallback,
		     canvas_input_cb, client_data);

       /* clear the polyline */
       if( confPoly ){
	 WlzFreePolyDmn(confPoly);
	 confPoly = NULL;
       }

       break;

     default:
       break;

     }
     break;

   case MotionNotify:
     if( cbs->event->xmotion.state & Button1Mask ){
     }

     if( cbs->event->xmotion.state & Button2Mask )
     {
	x = cbs->event->xmotion.x / wlzViewStr->scale;
	y = cbs->event->xmotion.y / wlzViewStr->scale;
	display_pointer_feedback_information(view_struct, x, y);
     }
     break;

  case KeyPress:
    switch( XLookupKeysym(&(cbs->event->xkey), 0) ){
	
    case XK_Right:
    case XK_KP_Right:
    case XK_f:
      break;

    case XK_Up:
    case XK_p:
      break;

    case XK_Left:
    case XK_KP_Left:
    case XK_b:
      break;

    case XK_Down:
    case XK_n:
      break;

    }
    break;

  default:
    break;
  }

  if( errNum != WLZ_ERR_NONE ){
    MAPaintReportWlzError(globals.topl, "conformal_input_cb", errNum);
  }
  return;
}