Region XPolygonRegion(XPoint *points, int n, int rule) { Region region; int i; GR_POINT * local; region = (Region)Xcalloc(1, sizeof(Region *)); if (!region) return NULL; /* must copy points, since dimensions differ*/ local = ALLOCA(n * sizeof(GR_POINT)); if (!local) { Xfree(region); return 0; } for (i=0; i < n; i++) { local[i].x = points[i].x; local[i].y = points[i].y; } /* convert rule to NX format*/ rule = (rule == EvenOddRule)? GR_POLY_EVENODD: GR_POLY_WINDING; region->rid = GrNewPolygonRegion(rule, n, local); FREEA(local); return region; }
static void GrNewPolygonRegionWrapper(void *r) { GR_REGION_ID region; nxNewPolygonRegionReq *req = r; int count; /* FIXME: unportable method, depends on sizeof(int) in GR_POINT*/ count = GetReqVarLen(req) / sizeof(GR_POINT); region = GrNewPolygonRegion(req->mode, count, (GR_POINT *)GetReqData(req)); GsWriteType(current_fd, GrNumNewPolygonRegion); GsWrite(current_fd, ®ion, sizeof(region)); }
GR_GC_ID setup_simple_poly_region(void) { GR_GC_ID gc; GR_REGION_ID rg; GR_POINT points[] = { {15, 0}, {45, 0}, {60, 15}, {60, 45}, {45, 60}, {15, 60}, {0, 45}, {0, 15} }; gc = GrNewGC(); GrSetGCForeground(gc, GR_COLOR_PURPLE); GrSetGCBackground(gc, GR_COLOR_WHITE); rg = GrNewPolygonRegion(GR_POLY_WINDING, 8, points); GrSetGCRegion(gc, rg); GrSetGCClipOrigin(gc, 25, 95); return gc; }
GR_GC_ID setup_complex_poly_region(void) { GR_GC_ID gc; GR_REGION_ID rg; GR_POINT points[] = { {0, 0}, {99, 0}, {99, 99}, {0, 99}, {0, 19}, {79, 19}, {79, 79}, {19, 79}, {19, 39}, {59, 39}, {59, 49}, {29, 49}, {29, 69}, {69, 69}, {69, 29}, {9, 29}, {9, 89}, {89, 89}, {89, 9}, {0, 9} }; gc = GrNewGC(); GrSetGCForeground(gc, GR_COLOR_ORANGE); GrSetGCBackground(gc, GR_COLOR_WHITE); rg = GrNewPolygonRegion(GR_POLY_EVENODD, 20, points); GrSetGCRegion(gc, rg); GrSetGCClipOrigin(gc, 25, 180); return gc; }
int main(int ac, char **av) { GR_WINDOW_ID window; GR_GC_ID gc; GR_FONT_ID fontid; int x, y, fnum; GR_REGION_ID regionid; #if CLIP_POLYGON GR_POINT points[] = { {20, 20}, {300, 20}, {300, 300}, {20, 300} }; #else GR_RECT clip_rect = { 20, 20, 300, 300 }; #endif if (GrOpen() < 0) exit(1); window = GrNewWindowEx(GR_WM_PROPS_APPWINDOW, "t1demo loadable fonts (truetype, t1lib, pcf, mgl, hzk)", GR_ROOT_WINDOW_ID, 50, 50, WIDTH, HEIGHT, BLACK); GrSelectEvents(window, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_CLOSE_REQ); GrMapWindow(window); gc = GrNewGC(); GrSetGCUseBackground(gc, GR_FALSE); GrSetGCBackground(gc, BLACK); #if CLIP_POLYGON /* polygon clip region */ regionid = GrNewPolygonRegion(MWPOLY_EVENODD, 3, points); #else /* rectangle clip region */ regionid = GrNewRegion(); GrUnionRectWithRegion(regionid, &clip_rect); #endif GrSetGCRegion(gc, regionid); srand(time(0)); while (1) { GR_EVENT event; GrCheckNextEvent(&event); if (event.type == GR_EVENT_TYPE_CLOSE_REQ) { GrClose(); exit(0); } fontid = GrCreateFontEx(names[fnum=RAND(MAXFONTS)], 0, 0, NULL); GrSetFontSizeEx(fontid, RAND(80) + 1, RAND(80) + 1); GrSetFontRotation(fontid, 330); /* 33 degrees */ GrSetFontAttr(fontid, GR_TFKERNING | GR_TFANTIALIAS, 0); GrSetGCFont(gc, fontid); GrSetGCForeground(gc, rand() & 0xffffff); /*GrSetGCBackground(gc, rand() & 0xffffff); */ x = RAND(WIDTH); y = RAND(HEIGHT); #if HAVE_HZK_SUPPORT { #if HZKBIG5 /* hzk big5 unicode-16 test*/ static unsigned short buffer[] = { 0x9060, 0x898b, 0x79d1, 0x6280, 0x0061, 0x0041, 0 }; GrText(window, gc, x, y, buffer, 7, GR_TFUC16); /* hzk big5 dbcs test #1*/ x = RAND(WIDTH); y = RAND(HEIGHT); GrText(window, gc, x, y, "Microwindows,Åwªï¨Ï¥Î¤¤^¤åÂI°}¦rÅé", -1, GR_TFASCII); /* hzk big5 dbcs test #2*/ x = RAND(WIDTH); y = RAND(HEIGHT); GrText(window, gc, x, y, "£t£u£v£w£¸£¹£º", -1, GR_TFASCII); #else #if 0 /* hzk test #1*/ static char buffer[] = { 0x6c, 0x49, 0x73, 0x8b, 0x79, 0xd1, 0x62, 0x80, 0x61, 0x00, 0x41, 0x00, 0x00, 0xa1, 0x00, 0xa6, 0x6c, 0x49, 0, 0 }; /* *static unsigned short buffer[] = { 0x496c, 0x8b73, 0xd179, 0x8062, 0x0061, 0x0041, 0xa100, 0xa600, 0x496c, 0 };***/ GrText(window, gc, x, y, buffer, 9, GR_TFUC16); #endif /* HZK Metrix font test, includes Chinese and English */ x = RAND(WIDTH); y = RAND(HEIGHT); GrText(window, gc, x, y, "Microwindows,»¶ÓʹÓÃÖÐÓ¢ÎĵãÕó×ÖÌå", -1, GR_TFASCII); #endif /* HZKBIG5*/ } #elif HAVE_BIG5_SUPPORT /* encoding BIG5 test 61 B1 64 B1 64 61 */ GrText(window, gc, x, y, "\151\261\144\261\144\151", 6, MWTF_DBCS_BIG5); #elif HAVE_GB2312_SUPPORT /* encoding GB2312 test BD A1 BD A1 */ GrText(window, gc, x, y, "\275\241\275\241", 4, MWTF_DBCS_GB); #elif HAVE_EUCJP_SUPPORT /* encoding EUC_JP test A2 A1 */ GrText(window, gc, x, y, "ï¿½Þ¥ï¿½ï¿½ï¿½ï¿½í¥¦ï¿½ï¿½ï¿½ï¿½ï¿½É¥ï¿½ï¿½ï¿½ï¿½Ø¤è¤¦ï¿½ï¿½ï¿½ï¿½!", -1, MWTF_DBCS_EUCJP); #elif HAVE_JISX0213_SUPPORT /* encoding JISX0213 test A2 A1 */ GrText(window, gc, x, y, "\242\241", 2, MWTF_DBCS_JIS); #elif HAVE_KSC5601_SUPPORT /* encoding KSC5601 test B0 B0 */ GrText(window, gc, x, y, "\273\273", 2, MWTF_DBCS_EUCKR); #elif HAVE_FREETYPE_2_SUPPORT /* ASCII test */ GrText(window, gc, x, y, "Microwindows", -1, GR_TFASCII); #elif HAVE_PCF_SUPPORT /* note: large PCF fonts require XCHAR2B, this is not figured out yet for these fonts. FIXME */ if (fnum == 3) { /* japanese jiskan24*/ unsigned short text[] = { 0x213a, 0x213b, 0x2170, 0x2276, 0x2339 }; GrText(window, gc, x,y, text, 5, GR_TFUC16); } else if (fnum == 4) { /* chinese gb24st*/ unsigned short text[] = /* FIXME: why doesn't first row index correctly?*/ /*{ 0x7765, 0x7766, 0x7767, 0x777a, 0x777e };*/ { 0x2129, 0x212a, 0x212b, 0x212c, 0x212d }; GrText(window, gc, x,y, text, 5, GR_TFUC16); } else GrText(window, gc, x,y, "Microwindows", -1, GR_TFASCII); #elif HAVE_FNT_SUPPORT /* UC16 test */ if (fnum == 2 || fnum == 3) { /* japanese jiskan24, jiskan16-2000-1*/ unsigned short text[] = { 0x213a, 0x213b, 0x2170, 0x2276, 0x2339 }; GrText(window, gc, x,y, text, 5, GR_TFUC16); } else if (fnum == 4) { /* chinese gbk16-xke*/ unsigned short text[] = { 0x8144, 0x8147, 0x8148, 0xfe4e, 0xfe4f }; GrText(window, gc, x,y, text, 5, GR_TFUC16); } else GrText(window, gc, x,y, "Microwindows", -1, GR_TFASCII); #else /* ASCII test */ GrText(window, gc, x, y, "Microwindows", -1, GR_TFASCII); #endif GrFlush(); GrDestroyFont(fontid); } GrDestroyRegion(regionid); GrClose(); return 0; }
int main() { GR_WINDOW_ID window; GR_EVENT event; GR_GC_ID gc; GR_FONT_ID fontid; int i, x, y; GR_REGION_ID regionid = 0; #if CLIP_POLYGON GR_POINT points[]={ {100, 100}, {300, 100}, {300, 300}, {100, 300}}; #else GR_RECT clip_rect={100,100,300,300}; #endif srand(time(0)); GrOpen(); window = GrNewWindow(GR_ROOT_WINDOW_ID, 50,50, MAXW,MAXH, 4, BLACK,BLUE); GrMapWindow(window); gc = GrNewGC(); #if CLIP_POLYGON /* polygon clip region*/ regionid = GrNewPolygonRegion(MWPOLY_EVENODD, 3, points); #else /* rectangle clip region*/ regionid = GrNewRegion(); GrUnionRectWithRegion(regionid, &clip_rect); #endif GrSetGCRegion(gc, regionid); GrSelectEvents(window,GR_EVENT_MASK_ALL); GrSetGCUseBackground(gc,GR_FALSE); GrSetGCBackground(gc, GR_RGB(0, 0, 0)); while(1) { GrCheckNextEvent(&event); i = (int)((float)MAXFONTS * rand() / (RAND_MAX + 1.0)); fontid = GrCreateFont(names[i], 20, NULL); GrSetFontSize(fontid, 1+(int)(80.0 * rand() / (RAND_MAX+1.0))); GrSetFontRotation(fontid, 330); /* 33 degrees*/ GrSetFontAttr(fontid, GR_TFKERNING | GR_TFANTIALIAS, 0); GrSetGCFont(gc, fontid); /*GrSetGCBackground(gc, rand() & 0xffffff);*/ GrSetGCForeground(gc, rand() & 0xffffff); x = (int) ((MAXW * 1.0) *rand()/(RAND_MAX+1.0)); y = (int) ((MAXH * 1.0) *rand()/(RAND_MAX+1.0)); #if HAVE_HZK_SUPPORT { /* to test Unicode 16 chinese characters display ,use HZK font Bitmap font (Metrix font). */ #ifndef BIG5 char buffer[256]; buffer[0]=0x6c; buffer[1]=0x49; buffer[2]=0x73; buffer[3]=0x8b; buffer[4]=0x79; buffer[5]=0xd1; buffer[6]=0x62; buffer[7]=0x80; buffer[8]=0x61; buffer[9]=0x00; buffer[10]=0x41; buffer[11]=0x00; buffer[12]=0x00; buffer[13]=0xa1; buffer[14]=0x00; buffer[15]=0xa6; buffer[16]=0x6c; buffer[17]=0x49; buffer[18]=0x0; buffer[19]=0x0; GrText(window, gc,x,y+20, buffer,17, GR_TFUC16); x=0;y=16; GrText(window, gc,x,y+20, buffer,17, GR_TFUC16); #else unsigned short buffer[7]; buffer[0]=0x9060; buffer[1]=0x898b; buffer[2]=0x79d1; buffer[3]=0x6280; buffer[4]=0x0061; buffer[5]=0x0041; buffer[6]=0x0; GrText(window, gc,x,y+20, buffer,7, GR_TFUC16); x=0;y=16; GrText(window, gc,x,y+20, buffer,7, GR_TFUC16); #endif } #ifndef BIG5 x=0;y=16; /* HZK Metrix font test, includes Chinese and English*/ GrText(window, gc,x,y, "Microwindows,欢迎使用中英文点阵字体", -1, GR_TFASCII); #else GrText(window, gc,x,y, "Microwindows,舧ㄏノい璣ゅ翴皚砰", -1, GR_TFASCII); x=0;y=16*3+4; GrText(window, gc,x,y, "89:", -1, GR_TFASCII); #endif GrFlush(); #else /* !HZK_FONT_SUPPORT*/ #if HAVE_BIG5_SUPPORT /* ENCODING_BIG5 test*/ GrText(window, gc,x,y, "眃眃", -1, GR_TFASCII); #else #if HAVE_GB2312_SUPPORT /* ENCODING_GB2312 test*/ GrText(window, gc,x,y, "\275\241\275\241", -1, GR_TFASCII); #else /* ASCII test*/ GrText(window, gc,x,y, "Microwindows", -1, GR_TFASCII); #endif #endif #endif /* HZK_FONT_SUPPORT*/ GrDestroyFont(fontid); if(event.type == GR_EVENT_TYPE_CLOSE_REQ) { GrClose(); exit(0); } } GrDestroyRegion(regionid); GrClose(); }