Example #1
0
static PyObject *
GetAttr(PaxFontObject *self, char *name)
{
    struct Fontattr *p;
    PyObject *result;
    if (name[0] == '_' && strcmp(name, "__members__") == 0)
	return MemberList();
    result = Py_FindMethod(FontMethods, (PyObject *)self, name);
    if (result != NULL)
	return result;
    PyErr_Clear();
    for (p = Fontattrdefs; ; p++)
    {
	if (p->name == NULL)
	{
	    PyErr_SetString(PyExc_AttributeError, name);
	    return NULL;
	}
	if (strcmp(name, p->name) == 0)
	    break;
    }
    if (p->type[0] == 'X')
    {
	PyErr_SetString(PyExc_AttributeError,
			"non-int attr not yet supported");
	return NULL;
    }
    return PyInt_FromLong(*(int *)((char *)(self->font_struct) + p->offset));
}
Example #2
0
/***************************************************************************
*									   *
* FUNCTION:	AppendList						   *
*									   *
*  PURPOSE:	Append a list to another one.				   *
*									   *
*   PARAMS:	The two lists to append.				   *
*									   *
*   RETURN:	The first list modified if successful.			   *
*		NULL else.						   *
*									   *
*  IMPORTS:	None							   *
*									   *
*    NOTES:	This function modify the first of lists passed,	appending  *
*		all the object of second list. It is assumed that the two  *
*		lists contain object of the same type.			   *
*		All the objects in L2 are inserted (if not presents) in L1.*
*									   *
***************************************************************************/
List AppendList(List L1, List L2)
{
 pointer object;

 if(!L1 || !L2) ErrorNULL("AppendList, not initialized List.\n");

 PushCurrList(L2);
 TailList(L2);
 while(NextList(&object, L2))
	if(!MemberList(object, L1)) InsertList(object, L2);
 PopCurrList(L2);
 return L1;
}
Example #3
0
List IntersectList(List L0, List L1)
{
 List InterList;
 pointer object;

 if(!L0 || !L1) ErrorNULL("IntersectList, not initialized List.\n");

 InterList=CopyList(L0);

 TailList(InterList);
 while(NextList(&object, InterList))
	if(!MemberList(object, L1)) DeleteList(object, InterList);

 return InterList;
}
Example #4
0
List UnionList(List L0, List L1)
{
 List UList;
 pointer object;

 if(!L0 || !L1) ErrorNULL("UnionList, not initialized List.\n");

 UList=CopyList(L0);

 TailList(L1);
 while(NextList(&object, L1))
	if(!MemberList(object, UList)) InsertList(object, UList);

 return UList;
}
boolean DeleteList(pointer object, List l)
{
 boolean result=FALSE;
 ListElem *OldCurr=l->C;
 ListElem *OldCurrNext=NULL;

 if(l->C) OldCurrNext = l->C->next;

 if(MemberList(object,l)) result=DeleteCurrList(l);
 else result=FALSE;

 if(OldCurrNext!=l->C) l->C=OldCurr;

 return result;
}
Example #6
0
void DeWall(Point3 *v[], Point3 *BaseV, int *UsedPoint, int n, List Q, List T, enum Axis a)
{
 List Ln=NULL_LIST,
      La=NULL_LIST,
      Lp=NULL_LIST;

 Tetra *t;
 ShortTetra *st;
 Face  *f;
 int i,j;
 UG g;
 Plane alpha;

 alpha.N.x=0;
 alpha.N.y=0;
 alpha.N.z=0;
 alpha.off=0;

 if(n>20)
 if(UGScaleFlag) BuildUG(v,UsedPoint,n, (int)(n*UGScale),&g); 	/* Initialize Uniform Grid */
	   else BuildUG(v,UsedPoint,n,      n,&g);

 Ln=NewList(FIFO,sizeof(Face));			/* Initialize Active Face */
 ChangeEqualObjectList(EqualFace,Ln);		/* List Ln.		  */
 if(n>40) HashList(n/4,HashFace,Ln);

 La=NewList(FIFO,sizeof(Face));			/* Initialize Active Face */
 ChangeEqualObjectList(EqualFace,La);		/* List La.		  */
 if(n>40) HashList(n/4,HashFace,La);

 Lp=NewList(FIFO,sizeof(Face));			/* Initialize Active Face */
 ChangeEqualObjectList(EqualFace,Lp);		/* List Lp.		  */
 if(n>40) HashList(n/4,HashFace,Lp);


 switch(a)
  {
   case XAxis :	qsort((void *)v, (size_t)n, sizeof(Point3 *),
				 (int (*)(const void *,const void *))XComp);
		alpha.N.x = 1;
		alpha.off = (v[n/2-1]->x+v[n/2]->x)/2;
		break;

   case YAxis : qsort((void *)v, (size_t)n, sizeof(Point3 *), 
				 (int (*)(const void *,const void *))YComp);
		alpha.N.y = 1;
		alpha.off = (v[n/2-1]->y+v[n/2]->y)/2;
		break;

   case ZAxis : qsort((void *)v, (size_t)n, sizeof(Point3 *),
				 (int (*)(const void *,const void *))ZComp);
		alpha.N.z = 1;
		alpha.off = (v[n/2-1]->z+v[n/2]->z)/2;
		break;
  }

 if(CountList(Q)==0)
 {
  t=FirstTetra(v,n);

  for(i=0;i<4;i++)
    {
      switch (Intersect(t->f[i],&alpha))
	{
	case  0 :     InsertList(t->f[i], La);	 break;
	case  1 :     InsertList(t->f[i], Lp);	 break;
	case -1 :     InsertList(t->f[i], Ln);	 break;
	}
      for(j=0;j<3;j++)
	if(t->f[i]->v[j]->mark==-1)  t->f[i]->v[j]->mark=1;
	else t->f[i]->v[j]->mark++;
    }
  st=Tetra2ShortTetra(t,BaseV);
  free(t);
  InsertList(st,T);
  SI.Face+=4;
 }
 else
 {
  while(ExtractList(&f,Q))
    switch (Intersect(f,&alpha))
    {
      case  0 :     InsertList(f, La);	 break;
      case  1 :     InsertList(f, Lp);	 break;
      case -1 :     InsertList(f, Ln);	 break;
    }
 }

 while(ExtractList(&f,La))
 {
  if(n>20) t=FastMakeTetra(f,v,n,&g);
      else t=MakeTetra(f,v,n);
  if(t==NULL) SI.CHFace++;
  else
     {
      st=Tetra2ShortTetra(t,BaseV);

      if(SafeTetraFlag) if(MemberList(st, T))
			Error("Cyclic Tetrahedra Creation\n",EXIT);
      InsertList(st,T);

      SI.Face+=3;
      SI.Tetra++;

      if(UpdateFlag)
	 if(SI.Tetra%50 == 0) printf("Tetrahedra Built %i\r",SI.Tetra++);

      for(i=1;i<4;i++)
	 switch (Intersect(t->f[i],&alpha))
	  {
	   case	0 :	if(MemberList(t->f[i],La))
			  {
			   DeleteCurrList(La);
			   
			   SI.Face--;
			   for(j=0;j<3;j++)
			     t->f[i]->v[j]->mark--;
			   free(t->f[i]);
			  }
			else 
			  {
			    InsertList(t->f[i],La);
			    for(j=0;j<3;j++)
			      if(t->f[i]->v[j]->mark==-1)  t->f[i]->v[j]->mark=1;
			      else t->f[i]->v[j]->mark++;
			    
			  }
	     break;
	   case 1 :	if(MemberList(t->f[i],Lp))
			  {
			    DeleteCurrList(Lp);
			  
			    SI.Face--;
			    for(j=0;j<3;j++)
			      t->f[i]->v[j]->mark--;
			    free(t->f[i]);
			  }
	                else 
			  {
			    InsertList(t->f[i],Lp);
			    for(j=0;j<3;j++)
			      if(t->f[i]->v[j]->mark==-1)  t->f[i]->v[j]->mark=1;
			      else t->f[i]->v[j]->mark++;
			    
			  }
	     break;
	   case -1:	if(MemberList(t->f[i],Ln))
			  {
			    DeleteCurrList(Ln);
	
			    SI.Face--;
			    for(j=0;j<3;j++)
			      t->f[i]->v[j]->mark--;		
			    free(t->f[i]);

			  }
			else 
			  {
			    InsertList(t->f[i],Ln);
			    for(j=0;j<3;j++)
			      if(t->f[i]->v[j]->mark==-1)  t->f[i]->v[j]->mark=1;
			      else t->f[i]->v[j]->mark++;
			    
			  }
			break;
	  }

      free(t->f[0]);
      free(t);
     }
  free(f);
 }
 if(SI.WallSize==0) SI.WallSize=SI.Tetra;
 /* if(n>20) EraseUG(&g); */ 

 switch(a)
  {
   case XAxis : if(CountList(Ln)>0) DeWall(v,	     BaseV,UsedPoint,n/2,    Ln,T,YAxis);
		if(CountList(Lp)>0) DeWall(&(v[n/2]),BaseV,UsedPoint,n-(n/2),Lp,T,YAxis);
		break;
   case YAxis : if(CountList(Ln)>0) DeWall(v,	     BaseV,UsedPoint,n/2,    Ln,T,ZAxis);
		if(CountList(Lp)>0) DeWall(&(v[n/2]),BaseV,UsedPoint,n-(n/2),Lp,T,ZAxis);
		break;
   case ZAxis : if(CountList(Ln)>0) DeWall(v,	     BaseV,UsedPoint,n/2,    Ln,T,XAxis);
		if(CountList(Lp)>0) DeWall(&(v[n/2]),BaseV,UsedPoint,n-(n/2),Lp,T,XAxis);
		break;
  }

 EraseList(Ln);
 EraseList(La);
 EraseList(Lp);
}