Reffont* rfget(int fix, int save, int setfont, char *name) { Reffont *r; Font *f; int i; r = nil; if(name == nil){ name = fontnames[fix]; r = reffonts[fix]; } if(r == nil){ for(i=0; i<nfontcache; i++) if(strcmp(name, fontcache[i]->f->name) == 0){ r = fontcache[i]; goto Found; } f = openfont(display, name); if(f == nil){ warning(nil, "can't open font file %s: %r\n", name); return nil; } r = emalloc(sizeof(Reffont)); r->f = f; fontcache = erealloc(fontcache, (nfontcache+1)*sizeof(Reffont*)); fontcache[nfontcache++] = r; } Found: if(save){ incref(&r->ref); if(reffonts[fix]) rfclose(reffonts[fix]); reffonts[fix] = r; if(name != fontnames[fix]){ free(fontnames[fix]); fontnames[fix] = estrdup(name); } } if(setfont){ reffont.f = r->f; incref(&r->ref); rfclose(reffonts[0]); font = r->f; reffonts[0] = r; incref(&r->ref); iconinit(); } incref(&r->ref); return r; }
void textclose(Text *t) { free(t->cache); frclear(t, 1); filedeltext(t->file, t); t->file = nil; rfclose(t->reffont); if(argtext == t) argtext = nil; if(typetext == t) typetext = nil; if(seltext == t) seltext = nil; if(mousetext == t) mousetext = nil; if(barttext == t) barttext = nil; }
int HFE_HDDD_A2_libWrite_DiskFile(HXCFLOPPYEMULATOR* floppycontext,FLOPPY * floppy,char * filename) { pictrack * track; FILE * hxcpicfile; picfileformatheader * FILEHEADER; unsigned char * mfmtracks0,*mfmtracks1,*mfmtrackfinal; unsigned char * offsettrack; int mfmsize,mfmsize2,i_conv; unsigned int i,j,k; unsigned int trackpos; unsigned int tracklistlen; unsigned int tracksize; unsigned short fm_pulses; floppycontext->hxc_printf(MSG_INFO_1,"Write HFE file %s for the standalone emulator (with HDDD A2 support).",filename); if(!floppy->floppyNumberOfTrack) { floppycontext->hxc_printf(MSG_ERROR,"Cannot create zero track HFE file"); return -1; } ramfile=0; ramfile_size=0; hxcpicfile=rfopen(filename,"wb"); if(hxcpicfile) { FILEHEADER=(picfileformatheader *) malloc(512); memset(FILEHEADER,0xFF,512); memcpy(&FILEHEADER->HEADERSIGNATURE,"HXCPICFE",8); FILEHEADER->number_of_track=(unsigned char)floppy->floppyNumberOfTrack; FILEHEADER->number_of_side=floppy->floppyNumberOfSide; if(floppy->floppyBitRate!=VARIABLEBITRATE) { FILEHEADER->bitRate=(floppy->floppyBitRate * 2)/1000; } else { if(floppy->tracks[0]->sides[0]->bitrate == VARIABLEBITRATE) FILEHEADER->bitRate=(unsigned short)((unsigned long)(floppy->tracks[0]->sides[0]->timingbuffer[ (floppy->tracks[0]->sides[0]->tracklen/8) / 2] * 2)/1000); else FILEHEADER->bitRate=(floppy->tracks[0]->sides[0]->bitrate * 2)/1000; } FILEHEADER->floppyRPM=0;//floppy->floppyRPM; FILEHEADER->floppyinterfacemode=(unsigned char)floppy->floppyiftype; floppycontext->hxc_printf(MSG_INFO_1,"Floppy interface mode %s (%s)", hxcfe_getFloppyInterfaceModeName(floppycontext,FILEHEADER->floppyinterfacemode), hxcfe_getFloppyInterfaceModeDesc(floppycontext,FILEHEADER->floppyinterfacemode) ); FILEHEADER->track_encoding=0; FILEHEADER->formatrevision=0; FILEHEADER->track_list_offset=1; FILEHEADER->write_protected=1; if(floppy->tracks[floppy->floppyNumberOfTrack/2]->sides[0]->track_encoding) { FILEHEADER->track_encoding=floppy->tracks[floppy->floppyNumberOfTrack/2]->sides[0]->track_encoding; } if( FILEHEADER->track_encoding == APPLEII_GCR1_ENCODING ) { FILEHEADER->track_encoding = APPLEII_HDDD_A2_GCR1_ENCODING; } if( FILEHEADER->track_encoding == APPLEII_GCR2_ENCODING ) { FILEHEADER->track_encoding = APPLEII_HDDD_A2_GCR2_ENCODING; } if(floppy->double_step) FILEHEADER->single_step=0x00; else FILEHEADER->single_step=0xFF; rfwrite(FILEHEADER,512,1,hxcpicfile); tracklistlen=((((((FILEHEADER->number_of_track)+1)*sizeof(pictrack))/512)+1)); offsettrack=(unsigned char*) malloc(tracklistlen*512); memset(offsettrack,0xFF,tracklistlen*512); i=0; trackpos=FILEHEADER->track_list_offset+tracklistlen; while(i<(FILEHEADER->number_of_track)) { mfmsize=0; mfmsize2=0; mfmsize=floppy->tracks[i]->sides[0]->tracklen * 2; if(mfmsize&7) mfmsize=(mfmsize/8)+1; else mfmsize=mfmsize/8; if(floppy->tracks[i]->number_of_side==2) { mfmsize2=floppy->tracks[i]->sides[1]->tracklen * 2; if(mfmsize2&7) mfmsize2=(mfmsize2/8)+1; else mfmsize2=mfmsize2/8; } if(mfmsize2>mfmsize) mfmsize=mfmsize2; if(mfmsize*2>0xFFFF) { floppycontext->hxc_printf(MSG_ERROR,"Argg!! track %d too long (%x) and shorten to 0xFFFF !",i,mfmsize*2); mfmsize=0x7FFF; } track=(pictrack *)(offsettrack+(i*sizeof(pictrack))); track->track_len=mfmsize*2; track->offset=trackpos; if((mfmsize*2)%512) trackpos=trackpos+(((mfmsize*2)/512)+1); else trackpos=trackpos+((mfmsize*2)/512); //trackpos=trackpos+(((mfmsize*2)/512)+1); i++; }; rfwrite(offsettrack,512*tracklistlen,1,hxcpicfile); i=0; while(i<(FILEHEADER->number_of_track)) { mfmsize=floppy->tracks[i]->sides[0]->tracklen * 2; if(mfmsize&7) mfmsize=(mfmsize/8)+1; else mfmsize=mfmsize/8; mfmsize2=0; if(floppy->tracks[i]->number_of_side==2) { mfmsize2=floppy->tracks[i]->sides[1]->tracklen * 2; if(mfmsize2&7) mfmsize2=(mfmsize2/8)+1; else mfmsize2=mfmsize2/8; } if(mfmsize>0x7FFF) { mfmsize=0x7FFF; } if(mfmsize2>0x7FFF) { mfmsize2=0x7FFF; } track=(pictrack *)(offsettrack+(i*sizeof(pictrack))); if(track->track_len%512) tracksize=((track->track_len&(~0x1FF))+0x200)/2;//(((track->track_len/512)+1)*512)/2; else tracksize=track->track_len/2; mfmtracks0=(unsigned char*) malloc(tracksize); mfmtracks1=(unsigned char*) malloc(tracksize); mfmtrackfinal=(unsigned char*) malloc(tracksize*2); memset(mfmtracks0,0x00,tracksize); memset(mfmtracks1,0x00,tracksize); memset(mfmtrackfinal,0x55,tracksize*2); for(i_conv=0;i_conv<(mfmsize/2);i_conv++) { // Add the FM Clocks fm_pulses = ext_a2_bit_expander[floppy->tracks[i]->sides[0]->databuffer[i_conv]] | 0x2222; mfmtracks0[(i_conv*2)+0] = fm_pulses >> 8; mfmtracks0[(i_conv*2)+1] = fm_pulses & 0xFF; } addpad(mfmtracks0,mfmsize,tracksize); if(floppy->tracks[i]->number_of_side==2) { for(i_conv=0;i_conv<(mfmsize2/2);i_conv++) { // Add the FM Clocks fm_pulses = ext_a2_bit_expander[floppy->tracks[i]->sides[1]->databuffer[i_conv]] | 0x2222; mfmtracks1[(i_conv*2)+0] = fm_pulses >> 8; mfmtracks1[(i_conv*2)+1] = fm_pulses & 0xFF; } addpad(mfmtracks1,mfmsize2,tracksize); } else { memset(mfmtracks1,0xAA,tracksize); } for(k=0;k<tracksize/256;k++) { for(j=0;j<256;j++) { // inversion des bits pour le EUSART du PIC. // head 0 mfmtrackfinal[(k*512)+j]= bit_inverter[mfmtracks0[(k*256)+j]]; // head 1 mfmtrackfinal[(k*512)+j+256]= bit_inverter[mfmtracks1[(k*256)+j]]; } } rfwrite(mfmtrackfinal,tracksize*2,1,hxcpicfile); free(mfmtracks0); free(mfmtracks1); free(mfmtrackfinal); i++; }; free(offsettrack); #ifdef FASTWRITE hxcpicfile=hxc_fopen(filename,"wb"); if(hxcpicfile) { fwrite(ramfile,ramfile_size,1,hxcpicfile); hxc_fclose(hxcpicfile); } else { rfclose(hxcpicfile); floppycontext->hxc_printf(MSG_ERROR,"Cannot create %s!",filename); return -1; } #endif rfclose(hxcpicfile); floppycontext->hxc_printf(MSG_INFO_1,"%d tracks written to the file",FILEHEADER->number_of_track); free(FILEHEADER); return 0; }