/* Listing 10 */ #include #include #include #include #include #include #define W(r) ((r).MaxX - (r).MinX) #define H(r) ((r).MaxY - (r).MinY) struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Library *DiskfontBase; void border(struct RastPort *rp, struct Rectangle *r); struct TagItem mytags[]={{TA_DeviceDPI, 5<<16 | 4}, TAG_DONE}; struct TTextAttr tta={0, 0, FS_NORMAL | FSF_TAGGED, FPF_DISKFONT, mytags}; int main(int argc, char *argv[]) { check_os(OS_20); if (argc!=2) return 10; /* Brak argumentu */ IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library", 37); GfxBase=(struct GfxBase*)OpenLibrary("graphics.library", 37); if (DiskfontBase=OpenLibrary("diskfont.library", 36)) { struct Window *window; if (window=OpenWindowTags(0, WA_Flags, WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_DEPTHGADGET | WFLG_ACTIVATE | WFLG_RMBTRAP, WA_IDCMP, IDCMP_CLOSEWINDOW, WA_Title, "Test czcionek czyli fontow.", TAG_END)) { struct TextFont *tf; struct TextExtent te; struct Rectangle miejsce; long len, error=FALSE; miejsce.MinX=window->BorderLeft; miejsce.MinY=window->BorderTop; miejsce.MaxX=window->Width-window->BorderRight; miejsce.MaxY=window->Height-window->BorderBottom; tta.tta_Name=argv[1]; for (tta.tta_YSize=H(miejsce)/2; tta.tta_YSize>=4 && W(miejsce)>2 && H(miejsce)>=2+tta.tta_YSize && !error; tta.tta_YSize>>=1) { do { if (tf=OpenDiskFont((struct TextAttr*)&tta)) { SetFont(window->RPort, tf); /* Podlaczenie czcionki do RP */ SetSoftStyle(window->RPort, tta.tta_Style, AskSoftStyle(window->RPort)); if (len=TextFit(window->RPort, argv[1], strlen(argv[1]), &te, NULL, 1, W(miejsce)-2, H(miejsce)-2)) { Move(window->RPort, miejsce.MinX-te.te_Extent.MinX+1, miejsce.MinY-te.te_Extent.MinY+1); miejsce.MinX+=2+W(te.te_Extent); if (W(miejsce)>=2) /* rysujemy tylko gdy jest miejsce */ { te.te_Extent.MinX--; te.te_Extent.MinY--; te.te_Extent.MaxX++; te.te_Extent.MaxY++; SetAPen(window->RPort, 3); border(window->RPort, &te.te_Extent); SetAPen(window->RPort, 1); Text(window->RPort, argv[1], len); tta.tta_Style++; /* Nastepny styl */ tta.tta_Style &= FSF_ITALIC | FSF_BOLD | FSF_UNDERLINED | FSF_TAGGED; } } CloseFont(tf); } else error=TRUE; } while (len && !error && W(miejsce)>0); miejsce.MinY+=tta.tta_YSize+2; miejsce.MinX=window->BorderLeft; } if (!error) WaitPort(window->UserPort); /* Czekamy na klikniecie na gadzet zamykania */ CloseWindow(window); } CloseLibrary(DiskfontBase); } CloseLibrary((struct Library*)GfxBase); CloseLibrary((struct Library*)IntuitionBase); return 0; } void border(struct RastPort *rp, struct Rectangle *r) { #define X rp->cp_x #define Y rp->cp_y Move(rp, X+r->MinX, Y+r->MinY); Draw(rp, X-r->MinX+r->MaxX, Y); Draw(rp, X, Y-r->MinY+r->MaxY); Draw(rp, X+r->MinX-r->MaxX, Y); Draw(rp, X, Y+r->MinY-r->MaxY); Move(rp, X-r->MinX, Y-r->MinY); #undef X #undef Y }