/* $Revision Header * Header built automatically - do not edit! ************* * * (C) Copyright 1990 by MXM * * Name .....: FontConvert.c * Created ..: Tuesday 25-Sep-90 20:43 * Revision .: 0 * * Date Author Comment * ========= ======== ==================== * 25-Sep-90 Olsen Created this file! * * $Revision Header ********************************************************/ /* Global and shared library identifiers. */ extern struct ExecBase *SysBase; struct ReqLib *ReqBase; struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Library *DiskfontBase; struct Library *LayersBase; /* Process and associated data. */ struct Process *ThisProcess; APTR SavePtr; /* Data associated with the font conversion. */ struct TextFont *DiskFont; struct BitMap RasterBitMap; struct RastPort RasterPort; struct BitMap TextBitMap; struct Layer_Info *TextLayerInfo; struct Layer *TextLayer; /* Global output file. */ BPTR GlobalOut; /* Window data. */ struct Window *Window; struct RastPort *RPort; struct IntuiMessage *Massage; ULONG Class,Code,GadgetID; /* The font requester. */ struct FileRequester FontFileReq; char FontName[FCHARS],DirectoryName[DSIZE],Buffer[FCHARS + DSIZE + 2]; /* Printer IO data. */ struct IOStdReq *PrintRequest; struct MsgPort *PrintPort; /* Capture file requester. */ struct FileRequester CaptureFileReq; char CaptureName[FCHARS],CaptureDirName[DSIZE],CaptureBuffer[FCHARS + DSIZE + 2]; /* Seven select buttons. */ struct TwoImageGadget Buttons[7]; /* At lease one of these bytes is set TRUE if the character * is contained in the font set. */ BYTE FontFlag[256]; /* Which character belongs to a printer character (dreaded * IBM font). */ UBYTE CharTable[217] = { 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126, 0, 199,252,233,226,228,231,229, 0,234,235,232,239,238,236,196,197, 201,230,198,244,246,242,251,249,255,214,220,162,163,165, 0, 0, 225,237,243,250,241,209,170,186,191, 0,172,189,188,161,171,187, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,223, 0, 0, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176 }; /* Select button image data. */ USHORT ButtonData[32] = { 0xFFFE,0xC006,0xC006,0xC006,0xC006,0xC006,0xFFFE,0x0000, 0xFFFE,0xC006,0xC006,0xC006,0xC006,0xC006,0xFFFE,0x0000, 0xFFFE,0xC006,0xCFE6,0xCFE6,0xCFE6,0xC006,0xFFFE,0x0000, 0xFFFE,0xC006,0xCFE6,0xCFE6,0xCFE6,0xC006,0xFFFE,0x0000 }; /* The texts for the seven buttons. */ char *ButtonText[7] = { "Make the font underlined", "Make the font bold", "Make the font italicized", "Convert 256 characters", "Capture to file", "Send font to printer", "Start Conversion" }; /* An empty disk attribute. */ struct TextAttr DiskAttribute = { (STRPTR)NULL, 8, FS_NORMAL, FPF_DISKFONT }; /* Our window. */ struct NewWindow NewWindow = { 0,11, 224,88, -1,-1, CLOSEWINDOW | GADGETUP | MOUSEBUTTONS, ACTIVATE | RMBTRAP | WINDOWDEPTH | WINDOWDRAG | WINDOWCLOSE, (struct Gadget *)NULL, (struct Image *)NULL, (STRPTR)"FontConvert 1.0", (struct Screen *)NULL, (struct BitMap *)NULL, ~0,~0, ~0,~0, WBENCHSCREEN }; /* The wait pointer. */ USHORT ElecArtsWaitPointer[(22 + 2) * 2] = { 0x0000,0x0000, 0x6700,0xC000, 0xCFA0,0xC700, 0xBFF0,0x0FA0, 0x70F8,0x3FF0, 0x7DFC,0x3FF8, 0xFBFC,0x7FF8, 0x70FC,0x3FF8, 0x7FFE,0x3FFC, 0x7F0E,0x3FFC, 0x3FDF,0x1FFE, 0x7FBE,0x3FFC, 0x3F0E,0x1FFC, 0x1FFC,0x07F8, 0x07F8,0x01E0, 0x01E0,0x0080, 0x07C0,0x0340, 0x0FE0,0x07C0, 0x0740,0x0200, 0x0000,0x0000, 0x0070,0x0020, 0x0078,0x0038, 0x0038,0x0010, 0x0000,0x0000 }; /* Use this macro to attach the sprite pointer to the * window. */ #define SetWait(Window) SetPointer(Window,ElecArtsWaitPointer,22,16,0,0) /* Calculate the amount of bytes needed to represent a single * display line. */ #define byte(Width) (((Width + 15) >> 4) << 1) /* CloseAll(): * * Closes devices and libraries and locks the shop. */ VOID CloseAll(BYTE ReturnCode) { if(PrintRequest) { if(PrintRequest -> io_Device) CloseDevice(PrintRequest); DeleteStdIO(PrintRequest); } if(PrintPort) DeletePort(PrintPort); if(RasterBitMap . Planes[0]) FreeMem(RasterBitMap . Planes[0],byte(24) * 36); if(DiskFont) CloseFont(DiskFont); if(Window) { ThisProcess -> pr_WindowPtr = SavePtr; CloseWindow(Window); } if(DiskfontBase) CloseLibrary(DiskfontBase); if(LayersBase) CloseLibrary(LayersBase); if(ReqBase) { PurgeFiles(&FontFileReq); PurgeFiles(&CaptureFileReq); CloseLibrary(ReqBase); } exit(ReturnCode); } /* OpenAll(): * * Opens libraries, devices, the window, the tin can, * the door and various assorted items. */ VOID OpenAll() { SHORT i; if(!(ReqBase = (struct ReqLib *)OpenLibrary("req.library",0))) CloseAll(RETURN_FAIL + 0); if(!(LayersBase = (struct Library *)OpenLibrary("layers.library",0))) { SimpleRequest("Couldn't open \"layers.library\"!"); CloseAll(RETURN_FAIL + 1); } if(!(DiskfontBase = (struct Library *)OpenLibrary("diskfont.library",34))) { SimpleRequest("Couldn't open \"diskfont.library\" (at least 1.3 required)!"); CloseAll(RETURN_FAIL + 2); } IntuitionBase = (struct IntuitionBase *)ReqBase -> IntuiLib; GfxBase = (struct GfxBase *)ReqBase -> GfxLib; Center(&NewWindow,NewWindow . Width >> 1,NewWindow . Height >> 1); if(!(Window = (struct Window *)OpenWindow(&NewWindow))) { SimpleRequest("Couldn't open window!"); CloseAll(RETURN_FAIL + 3); } RPort = Window -> RPort; SetAPen(RPort,3); SetDrMd(RPort,JAM2); DrawBox(RPort,4,11,NewWindow . Width - 5,11 + 10); SetAPen(RPort,1); /* Dynamically create the gadget interface. */ for(i = 0 ; i < 7 ; i++) { MakeButton(&Buttons[i],&ButtonData[0],&ButtonData[16],16,8,12); Buttons[i] . Gadget . LeftEdge = 4; Buttons[i] . Gadget . TopEdge = 12 + 11 + 8 * i; if(i != 6) Buttons[i] . Gadget . Activation |= TOGGLESELECT; if(i > 3) Buttons[i] . Gadget . TopEdge += 8; AddGadget(Window,&Buttons[i] . Gadget,-1); Move(RPort,Buttons[i] . Gadget . LeftEdge + 24,Buttons[i] . Gadget . TopEdge + 6); Text(RPort,ButtonText[i],strlen(ButtonText[i])); Buttons[i] . Gadget . GadgetID = i; } Buttons[5] . Gadget . Flags |= SELECTED; RefreshGadgets(Window -> FirstGadget,Window,NULL); ThisProcess = (struct Process *)SysBase -> ThisTask; SavePtr = ThisProcess -> pr_WindowPtr; ThisProcess -> pr_WindowPtr = (APTR)Window; InitRastPort(&RasterPort); RasterPort . BitMap = &RasterBitMap; InitBitMap(&RasterBitMap,1,24,36); if(!(RasterBitMap . Planes[0] = (PLANEPTR)AllocMem(byte(24) * 36,MEMF_CHIP))) { SimpleRequest("Not enough memory for character matrix!"); CloseAll(RETURN_FAIL + 4); } if(!(PrintPort = (struct MsgPort *)CreatePort(NULL,0))) { SimpleRequest("Printer I/O failure!"); CloseAll(RETURN_FAIL + 5); } if(!(PrintRequest = (struct IOStdReq *)CreateStdIO(PrintPort))) { SimpleRequest("Printer I/O failure!"); CloseAll(RETURN_FAIL + 6); } if(OpenDevice("printer.device",0,PrintRequest,0)) { SimpleRequest("Couldn't open \"printer.device\"\n(printer already in use?)!"); CloseAll(RETURN_FAIL + 7); } FontFileReq . PathName = Buffer; FontFileReq . Title = "Load a disk font"; FontFileReq . fontnamescolor = 3; FontFileReq . fontsizescolor = 3; FontFileReq . Window = Window; FontFileReq . Dir = DirectoryName; FontFileReq . File = FontName; FontFileReq . Flags = FRQCACHINGM | FRQINFOGADGETM | FRQNOHALFCACHEM | FRQGETFONTSM; FontFileReq . blockcolor = 1; CaptureFileReq . PathName = CaptureBuffer; CaptureFileReq . Title = "Select font capture file"; CaptureFileReq . Window = Window; CaptureFileReq . dirnamescolor = 3; CaptureFileReq . devicenamescolor = 3; CaptureFileReq . Dir = CaptureDirName; CaptureFileReq . File = CaptureName; CaptureFileReq . Flags = FRQCACHINGM | FRQINFOGADGETM | FRQNOHALFCACHEM | FRQSAVINGM | FRQCACHEPURGEM; CaptureFileReq . blockcolor = 3; strcpy(DirectoryName,"FONTS:"); DiskAttribute . ta_Name = (UBYTE *)Buffer; SetAPen(&RasterPort,1); SetBPen(&RasterPort,0); SetDrMd(&RasterPort,JAM1); } /* PrintWrite(): * * Send a string to the printer, do the necessary data * conversion on the way. */ VOID PrintWrite(char *String) { PrintRequest -> io_Command = CMD_WRITE; PrintRequest -> io_Data = String; PrintRequest -> io_Length = -1; DoIO(PrintRequest); } /* PrintRawWrite(): * * Send a string to the printer, don't convert * anything! */ VOID PrintRawWrite(APTR String,SHORT Length) { /* Are we to send the string to the capture file? */ if(Buttons[4] . Gadget . Flags & SELECTED) { if(GlobalOut) { if(Write(GlobalOut,String,Length) != Length) { SimpleRequest("Error writing to capture file!"); Close(GlobalOut); GlobalOut = NULL; DeleteFile(CaptureBuffer); } } } if(Buttons[5] . Gadget . Flags & SELECTED) { PrintRequest -> io_Command = PRD_RAWWRITE; PrintRequest -> io_Data = String; PrintRequest -> io_Length = Length; DoIO(PrintRequest); } } VOID _wb_parse(VOID) {} VOID _cli_parse(VOID) {} /* main(): * * This follows one of the largest main routines ever! */ void main() { SHORT ReadX,ReadY,WriteX,WriteY,AspectRatio,MaxWidth,i; char TempString[20]; UBYTE Shuttle[2]; UBYTE *Bits,Data[3]; OpenAll(); /* Some more setups. */ Shuttle[1] = 0; Move(RPort,(Window -> Width >> 1) - 8 * (3),11 + 2 + 6); Text(RPort,"Ready.",6); FOREVER { WaitPort(Window -> UserPort); while(Massage = (struct IntuiMessage *)GetMsg(Window -> UserPort)) { Class = Massage -> Class; Code = Massage -> Code; GadgetID = ((struct Gadget *)Massage -> IAddress) -> GadgetID; ReplyMsg(Massage); /* User made the mistake to press the * right mouse button! */ if(Class == MOUSEBUTTONS && Code == MENUUP) { SimpleRequest(" FontConvert 1.0\n\n\ (c) Copyright 1990 by MXM,\n\ all rights reserved.\n\n\ This program is SHARE-WARE. If you like\n\ and use it frequently, please send a\n\ contribution of at least 10$ US or DM\n\ 15,- to:\n\n\ Olaf Barthel, MXM\n\ Brabeckstrasse 35\n\ D-3000 Hannover 71\n\n\ Federal Republic of Germany\n"); continue; } /* Close the window and terminate the * program? */ if(Class == CLOSEWINDOW) { if(TwoGadRequest("Really quit FontConvert 1.0?")) { ClearPointer(Window); CloseAll(RETURN_OK); } } /* One of those gadgets has been * selected. */ if(Class == GADGETUP) { /* Capture the printer data * to a disk file? */ if(GadgetID == 4) { if(Buttons[4] . Gadget . Flags & SELECTED) { if(FileRequester(&CaptureFileReq)) continue; } Buttons[4] . Gadget . Flags &= ~SELECTED; RefreshGadgets(&Buttons[4] . Gadget,Window,NULL); } /* Start the font conversion? */ if(GadgetID == 6) { if(!(Buttons[4] . Gadget . Flags & SELECTED) && !(Buttons[5] . Gadget . Flags & SELECTED)) { SimpleRequest("Font must be sent to a file or\nto the printer!"); continue; } /* Turn the window off. */ SetWait(Window); for(i = 0 ; i < 7 ; i++) OffGadget(&Buttons[i] . Gadget,Window,NULL); /* Did we get a font? */ if(FileRequester(&FontFileReq)) { /* Fill in name and size. */ DiskAttribute . ta_YSize = FontFileReq . FontYSize; DiskAttribute . ta_Style = FontFileReq . FontStyle; /* Open the font. */ if(!(DiskFont = (struct TextFont *)OpenDiskFont(&DiskAttribute))) SimpleRequest("Couldn't load font \"%s/%ld\"!",DiskAttribute . ta_Name,DiskAttribute . ta_YSize); else { SHORT i,j,CharSpace,Style = 0; /* Erase the message window. */ SetAPen(RPort,0); RectFill(RPort,4 + 1,11 + 1,NewWindow . Width - 5 - 1,11 + 10 - 1); SetAPen(RPort,1); /* Open the capture file? */ if(Buttons[4] . Gadget . Flags & SELECTED) { if(!(GlobalOut = Open(CaptureBuffer,MODE_NEWFILE))) { if(!TwoGadRequest("Couldn't open capture file! Do you want\nto continue?")) continue; } } /* Clear the font flags. */ for(i = 0 ; i < 256 ; i++) FontFlag[i] = FALSE; /* Clear the printer font raster. */ SetFont(&RasterPort,DiskFont); /* Set the approriate style bits. */ if(Buttons[0] . Gadget . Flags & SELECTED) Style |= FSF_UNDERLINED; if(Buttons[1] . Gadget . Flags & SELECTED) Style |= FSF_BOLD; if(Buttons[2] . Gadget . Flags & SELECTED) Style |= FSF_ITALIC; SetSoftStyle(&RasterPort,Style,~0); /* Fill in the font flags and determine the * width of each character. */ for(i = DiskFont -> tf_LoChar, MaxWidth = 0 ; i <= DiskFont -> tf_HiChar ; i++) { Shuttle[0] = i; if((CharSpace = TextLength(&RasterPort,(char *)Shuttle,1)) > MaxWidth) MaxWidth = CharSpace; if(CharSpace > 0) FontFlag[i] = TRUE; } /* Rescale the font height until it fits into * the raster. */ AspectRatio = 24; while((AspectRatio * MaxWidth) / DiskFont -> tf_YSize > 36) AspectRatio--; /* Initialize the dummy raster port. */ InitBitMap(&TextBitMap,1,MaxWidth,DiskFont -> tf_YSize); if(TextBitMap . Planes[0] = AllocMem(byte(MaxWidth) * DiskFont -> tf_YSize,MEMF_CHIP | MEMF_PUBLIC)) { if(TextLayerInfo = (struct Layer_Info *)NewLayerInfo()) { if(TextLayer = (struct Layer *)CreateBehindLayer(TextLayerInfo,&TextBitMap,0,0,MaxWidth - 1,DiskFont -> tf_YSize - 1,LAYERSIMPLE,NULL)) { SHORT LastChar; /* Setup the necessary things to * convert the font. */ SetAPen(TextLayer -> rp,1); SetBPen(TextLayer -> rp,0); SetDrMd(TextLayer -> rp,JAM2); SetFont(TextLayer -> rp,DiskFont); SetSoftStyle(TextLayer -> rp,Style,~0); /* Are we to convert the whole graphics * character set? */ if(Buttons[3] . Gadget . Flags & SELECTED) { LastChar = 217; PrintRawWrite("\33@\33!\2\33:\0\0\0\33&\0\40\331",15); } else { LastChar = 95; PrintRawWrite("\33@\33!\2\33:\0\0\0\33&\0\40\176",15); } /* Go into conversion loop... */ for(i = 0 ; i < LastChar ; i++) { /* Empy character? Send a row of blanks. */ if(!CharTable[i] || !FontFlag[CharTable[i]]) { PrintRawWrite("\0\1\0\0\0\0",6); continue; } /* Right mouse button pressed? */ if(Massage = (struct IntuiMessage *)GetMsg(Window -> UserPort)) { Class = Massage -> Class; Code = Massage -> Code; ReplyMsg((struct Message *)Massage); if(Class == MOUSEBUTTONS && Code == MENUUP) { if(TwoGadRequest("Really stop font conversion?")) { /* Send blanks for the following * characters and reset the printer. */ for(j = i ; j < LastChar ; j++) PrintRawWrite("\0\1\0\0\0\0",6); PrintRawWrite("\33@",2); break; } } } Shuttle[0] = CharTable[i]; CharSpace = TextLength(TextLayer -> rp,(char *)Shuttle,1); /* Clear the font raster port and * draw the character. */ SetRast(TextLayer -> rp,0); Move(TextLayer -> rp,0,DiskFont -> tf_Baseline); Text(TextLayer -> rp,(char *)Shuttle,1); /* Say where we are... */ Format(TempString,"%03ld '%lc' %2ld × %2ld",Shuttle[0],Shuttle[0],(AspectRatio * CharSpace) / DiskFont -> tf_YSize,AspectRatio); Move(RPort,(Window -> Width >> 1) - 8 * (7) + 4,11 + 2 + 6); Text(RPort,TempString,15); SetRast(&RasterPort,0); /* Scan the character line by line including * rescaling. */ for(ReadY = WriteY = 0 ; ReadY < DiskFont -> tf_YSize ; ReadY = ((++WriteY) * DiskFont -> tf_YSize) / AspectRatio) { for(ReadX = WriteX = 0 ; ReadX < CharSpace ; ReadX = ((++WriteX) * DiskFont -> tf_YSize) / AspectRatio) { if(ReadPixel(TextLayer -> rp,ReadX,ReadY)) WritePixel(&RasterPort,WriteY,WriteX); } } /* Say how wide the character is. */ Data[0] = Data[2] = 0; Data[1] = (AspectRatio * CharSpace) / DiskFont -> tf_YSize; PrintRawWrite(Data,3); /* Send the character bits. */ for(j = 0 ; j < Data[1] ; j++) { Bits = (UBYTE *)((ULONG)RasterBitMap . Planes[0] + RasterBitMap . BytesPerRow * j); PrintRawWrite(Bits,3); } } /* Turn on the use font. */ PrintRawWrite("\33%1",3); /* Say that we are done. */ Move(RPort,(Window -> Width >> 1) - 8 * (12),11 + 2 + 6); Text(RPort,"Font conversion finished",24); /* Test the printer font? */ if(Buttons[5] . Gadget . Flags & SELECTED) { if(TwoGadRequest("Font conversion completed.\nTest new printer font?")) { PrintWrite("\nFont \""); PrintWrite(Buffer); PrintWrite("\":\n"); PrintWrite("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\n\n"); } } /* Clean up the font stuff... */ DeleteLayer(TextLayerInfo,TextLayer); } else SimpleRequest("Not enough memory for font work area!"); DisposeLayerInfo(TextLayerInfo); } else SimpleRequest("Not enough memory for font work area!"); FreeMem(TextBitMap . Planes[0],byte(MaxWidth) * DiskFont -> tf_YSize); } else SimpleRequest("Not enough memory for font work area!"); CloseFont(DiskFont); DiskFont = NULL; /* Dump file still open? */ if(GlobalOut) { Close(GlobalOut); GlobalOut = NULL; } } } /* Reenable the window? */ for(i = 0 ; i < 7 ; i++) OnGadget(&Buttons[i] . Gadget,Window,NULL); ClearPointer(Window); } } } } }