Beispiel #1
0
/* Do the conversion */
char *cnv_execute(FILE *infile, FILE *outfile)
{	
	int rv, x;
	PSF_FILE psf;
	ZXF_FILE zxf;

	psf_file_new(&psf);
	rv = psf_file_read(&psf, infile);	
	if (rv != PSF_E_OK) return psf_error_string(rv);

	if (psf.psf_height != 8 || psf.psf_width != 8)
	{
		psf_file_delete(&psf);
		return "PSF characters must be 8x8 for a Spectrum font.";
	}
	if (mode == -1)
	{
		if (psf_is_unicode(&psf)) mode = MD_MERGE1;
		else			  mode = MD_BARE;
	}

	zxf_file_new(&zxf);
	if (rv == PSF_E_OK) rv = zxf_file_create(&zxf);	
	if (rv == PSF_E_OK)
	{
            if (mode == MD_BARE)
		 for (x = 32; x <= 127; x++) copychar(&psf, &zxf, x, x);
            else for (x = 32; x <= 127; x++) switch(x)
                {
                case 0x5E: copychar(&psf, &zxf, 0x2191, x); break; 
                case 0x60: copychar(&psf, &zxf, 0xA3, x); break;
                case 0x7F: copychar(&psf, &zxf, 0xA9, x); break;
                default:   copychar(&psf, &zxf, x, x);    break;
                }
	    rv = zxf_file_write(&zxf, outfile, zxf_format, auxfile);
	}
	psf_file_delete(&psf);
	
	if (rv != ZXF_E_OK)
	{
		zxf_file_delete(&zxf);
		return zxf_error_string(rv);
	}
	zxf_file_delete(&zxf);
	if (auxfile) free(auxfile);
	return NULL;
}
Beispiel #2
0
/* Do the conversion */
char *cnv_multi(int nfiles, char **infiles, FILE *outfile)
{ 
        int rv, nf, nc;
	psf_dword mc;
        FILE *fp;
	int w = -1, h = -1;
	psf_unicode_dirent *ude;

/* Load all the source files */
	psf_in = malloc(nfiles * sizeof(PSF_FILE));
	if (!psf_in) return "Out of memory";
        for (nf = 0; nf < nfiles; nf++)
        { 
		psf_file_new(&psf_in[nf]);
                if (!strcmp(infiles[nf], "-")) fp = stdin;
                else  fp = fopen(infiles[nf], "rb");
          
                if (!fp) 
		{ 
			perror(infiles[nf]); 
			return "Cannot open font file."; 
		}
		rv = psf_file_read(&psf_in[nf], fp);
                if (fp != stdin) fclose(fp);
		if (rv != PSF_E_OK) 
		{
			sprintf(msgbuf, "%s: %s", infiles[nf],
					psf_error_string(rv));
			return msgbuf;
		}
		if (w == -1 && h == -1)
		{
			w = psf_in[nf].psf_width;
			h = psf_in[nf].psf_height;
		}
		else if (w != psf_in[nf].psf_width || h != psf_in[nf].psf_height)
		{
			return "All fonts must have the same dimensions.";
		}
		if (!psf_is_unicode(&psf_in[nf]))
		{
			sprintf(msgbuf, "%s has no Unicode table.", infiles[nf]);
			return msgbuf;
		}
	}
/* Work out how many unique characters there are */
        for (nf = 0; nf < nfiles; nf++)
        { 
		for (nc = 0; nc < psf_in[nf].psf_length; nc++)
		{
			/* Skip characters with no Unicode mapping */
			if (!psf_in[nf].psf_dirents_used[nc]) continue;
			rv = unicode_add(psf_in[nf].psf_dirents_used[nc]);
			if (rv) 
			{
				free_buffers();
				return psf_error_string(rv);
			}
		}
	}
	rv = psf_file_create(&psf_out, w, h, unicodes_count, 1);
	if (rv) 
	{
		free_buffers();
		return psf_error_string(rv);
	}
        for (nf = 0; nf < nfiles; nf++)
        { 
		for (nc = 0; nc < psf_in[nf].psf_length; nc++)
		{
			/* Skip characters with no Unicode mapping */
			if (!psf_in[nf].psf_dirents_used[nc]) continue;
			mc = unicode_lookup(psf_in[nf].psf_dirents_used[nc]);
			memcpy(psf_out.psf_data + mc * psf_out.psf_charlen,
			       psf_in[nf].psf_data + nc * psf_in[nf].psf_charlen,
			       psf_out.psf_charlen);
		}
	}
	/* Do the Unicode directory */
	rv = 0;
	for (nf = 0; nf < unicodes_count; nf++)
	{
		for (ude = unicodes[nf]; ude != NULL; ude = ude->psfu_next)
		{
			rv = psf_unicode_add(&psf_out, nf, ude->psfu_token);
			if (rv) break;
		}
		if (rv) break;
	}
	if (!rv) rv = psf_file_write(&psf_out, outfile);
	psf_file_delete(&psf_out);
	free_buffers();
        for (nf = 0; nf < nfiles; nf++)
        { 
		psf_file_delete(&psf_in[nf]);
	}
	free(psf_in);
	if (rv) return psf_error_string(rv);
	return NULL;
}
Beispiel #3
0
char *cnv_execute(FILE *infile, FILE *outfile)
{	
	int rv, n, max;
	psf_dword ch, f, l, z, glyph;
//	int ofile = fileno (outfile);

	psf_file_new(&psf);
        rv = psf_file_read(&psf, infile);

	if (rv != PSF_E_OK) return psf_error_string(rv);
	if (codepage && !psf_is_unicode(&psf))
	{
		psf_file_delete(&psf);
		return "Cannot extract by codepage; source file has no Unicode table";
	}

	/* Most systems that use raw fonts depend on the font being 1 byte 
	 * wide */
	if (psf.psf_width > 8) 
		fprintf(stderr, "Warning: Font is wider than 8 bits.\n");

	f = (first >= 0) ? first : 0;
	l = (last  >= 0) ? last  :((int)(psf.psf_length - 1));
	if (codepage && l >= 256) l = 255;
	if (l >= psf.psf_length) l = psf.psf_length;
	
	struct XFF xff;
	xff.w = psf.psf_width;
	xff.h = psf.psf_height;
	xff.w_byte = (xff.w + 7) / 8;
	xff.glyph_size = xff.h * xff.w_byte;
	xff.nGlyphs = l-f+1;
	xff.chkxor = 0;
	xff.reserved = 2;
	fwrite (&xff, sizeof(xff), 1, outfile);

	if (doflip)
	{
		max = (last+1) * psf.psf_charlen;
		for (n = first * psf.psf_charlen; n < max; n++)
		{
			psf.psf_data[n] = flip(psf.psf_data[n]);
		}
	}
	for (ch = f; ch <= l; ch++)
	{
		psf_byte *src;

		if (codepage)
		{
			if (ch < 256 && !psf_unicode_lookupmap(&psf, codepage, 
						ch, &glyph, NULL))
			{
				src = psf.psf_data + glyph * psf.psf_charlen;
			}
			else
			{
				if (ch < 256 && !psf_unicode_banned(codepage->psfm_tokens[ch][0])) fprintf(stderr, "Warning: U+%04lx not found in font\n", codepage->psfm_tokens[ch][0]);
				src = NULL;
			}
		}
		else	src = psf.psf_data + ch * psf.psf_charlen;
		
		if (!src) for (z = 0; z < psf.psf_charlen; z++)
		{
			if (fputc(0, outfile) == EOF)
			{
				psf_file_delete(&psf);
				return "Could not write to output.";
			}	
		}	
		else if (fwrite(src, 1, psf.psf_charlen, outfile) < 
				psf.psf_charlen)
		{
			psf_file_delete(&psf);
			return "Could not write to output.";
		}
		// padding
	}	
	
	long int pos = ftell(outfile);
	unsigned char buf;
	unsigned char chkxor = 0;
	fseek (outfile, 0, SEEK_SET);
	while (fread(&buf, 1,1,outfile)) {
		chkxor ^= buf;
	}
	printf ("%hhx\n", chkxor);
	fseek(outfile, 6, SEEK_SET);
	fwrite(&chkxor, 1, 1, outfile);
	fseek(outfile, pos, SEEK_SET);
	psf_file_delete(&psf);	
	return NULL;
}
Beispiel #4
0
char *cnv_execute(FILE *fpin, FILE *fpout)
{	
	int rv;
	PSF_FILE psf;
	psf_dword ch;
	psf_dword y, wb;

	psf_file_new(&psf);
	rv = psf_file_read(&psf, fpin);	
	if (rv != PSF_E_OK) return psf_error_string(rv);

	if (psf.psf_width > 8)
	{
		fprintf(stderr, "Warning: Input file is wider than 8 pixels. Truncating at 8.\n");
	}
	if (height > MAX_H)
	{
		fprintf(stderr, "Warning: Height cannot exceed %d. Truncating.\n", MAX_H);
		height = MAX_H;
	}
	if ((psf.psf_length - 1) < first) first = psf.psf_length - 1;
	if ((psf.psf_length - 1) < last)  last  = psf.psf_length - 1;

	/* wb = number of bytes per line */	
	wb = psf.psf_charlen / psf.psf_height;	
	for (ch = first; ch <= last; ch++)
	{
		memset(charbuf, 0, sizeof(charbuf));

		/* Populate character buffer */
		for (y = 0; y < psf.psf_height; y++)
		{
			if (y >= MAX_H) break;
			charbuf[y] = psf.psf_data[ch * psf.psf_charlen + 
			       			  y * wb];	
		}
		fputc(0x1B, fpout);		// ESC
		fputc('c',  fpout);		// c
		fputc('A',  fpout);		// A  : Redefine
		fputc(bank + '0', fpout);	// Bank
		fprintf(fpout, "%02x", dest);	// Dest cell
		for (y = 0; y < height; y++)
		{
			fprintf(fpout, "%02x", charbuf[y]);	// Char shape
		}
		fputc(0x19, fpout);		// End of char definition
		for (y = 0; y < nulls; y++)
		{
			fputc(0, fpout);
		}
		++dest;
		if (dest == 0x80)
		{
			dest = 0;
			++bank;
			if (bank > 3) break;
		}
	}

	psf_file_delete(&psf);
	return 0;
}