// twicon.c // // by John D. de Boer #include "twist.h" picture DPI, // default person icon DEI; // default event icon bitmap *DPB, *DEB; static stringlist UNList; // names of unrecognised icons // Initialisation void InitTwIcon(void) { initstringlist(&UNList); DPI=getpicture("person"); if (!DPI) error("InitTwIcon() error #1"); DPB=extractbitmap(DPI); DEI=getpicture("event"); if (!DEI) error("InitTwIcon() error #2"); DEB=extractbitmap(DEI); } void PurgeIcons(void) { purgestringlist(&UNList); } // Associating icons with occupations & event types static void UnknownIconName(const char *S) { if (stringisinlist(&UNList,S)) return; WarnOld(cat(0,"Unrecognised icon name: ",(char *)S)); addstringtolist(&UNList,copyof(S)); } picture IconFromName(const char *S) { picture P; P=getpicture(S); if (P) return P; UnknownIconName(S); return NULL; } picture DefaultPersonIcon(void) { return DPI; } picture DefaultEventIcon(void) { return DEI; } bitmap *DefaultPersonBitmap(void) { return DPB; } bitmap *DefaultEventBitmap(void) { return DEB; } void ReleaseIcon(picture P, bitmap *B) { if (P==DPI || P==DEI) return; if (B==DPB || B==DEB) return; if (!P || !B) return; oldpicture(P); oldbitmap(B); } // Drawing icons /* static void IconMaskRegion(CIconHandle Icon, Point P, RgnHandle R) { CIconPtr MP; OSErr ERR; if (!Icon || !*Icon || !R) return; lock(Icon); MP=*Icon; MP->iconMask.baseAddr=(char *)(MP->iconMaskData); ERR=BitMapToRegion(R,&(MP->iconMask)); if (ERR) { unlock(Icon); SetEmptyRgn(R); return; } OffsetRgn(R,P.h - 32,P.v - 32); unlock(Icon); }*/ void DrawIcon(window *W, picture Im, point P, float Mag) { float Size; rect R; if (!Im) return; Size= Mag * 32.0; setrect(&R,P.x - Size,P.y,Size,Size); drawpicture(W,Im,R); //B=newbitmap(CGImageGetWidth(Im),CGImageGetHeight(Im)); if (!B) return; //CGContextDrawImage(B->context,B->rect,Im); //drawbitmap(B,W->q2d,R); //oldbitmap(B); } /* void OutlineIcon(CIconHandle Icon, Point P) { IconMaskRegion(Icon,P,Mask); CopyRgn(Mask,M2); InsetRgn(M2,-1,-1); DiffRgn(M2,Mask,M2); ocolour(black); PaintRgn(M2); }*/ // Mouse hits bool BitmapHit(bitmap *B, point P, float Mag) { float Size; rect R,Nat; colour C; if (!B) return 0; Size= Mag * 32.0; setrect(&R,-Size,0.0,Size,Size); setrect(&Nat,-32,0,32,32); P=mappoint(P,R,Nat); P.x+=32; if (!getpixel(B,P.x,P.y,&C)) return 0; setrect(&Nat,16,0,16,16); return pointinrect(P,Nat); return C.c[3]>0.1; }