unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Spin; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; FontDialog1: TFontDialog; Image1: TImage; ListBox1: TListBox; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; SpinEdit1: TSpinEdit; SpinEdit2: TSpinEdit; SpinEdit3: TSpinEdit; SpinEdit4: TSpinEdit; SpinEdit5: TSpinEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormResize(Sender: TObject); procedure Image1Click(Sender: TObject); procedure SpinEdit1Change(Sender: TObject); procedure SpinEdit2Change(Sender: TObject); private w,h, xMinMin,xMaxMax, yMinMin,yMaxMax, xMin,xMax, yMin,yMax: longint; public end; var Form1: TForm1; implementation {$R *.lfm} uses math; { TForm1 } procedure TForm1.SpinEdit1Change(Sender: TObject); var c: char; i,j, xOf,yOf: longint; b: boolean; begin image1.canvas.font.size:=spinEdit1.value; h:=image1.canvas.textHeight('X'); w:=image1.canvas.textWidth('X'); xMin:=w div 2; xMax:=w div 2; yMin:=h div 2; yMax:=h div 2; xMinMin:=-(w div 2); xMaxMax:=w + (w div 2); yMinMin:=-(h div 2); yMaxMax:=h + (h div 2); image1.canvas.rectangle(-1,-1,image1.width+1,image1.height+1); for c:=#32 to #126 do begin xOf:=2*w*(ord(c) mod 16)+w; yOf:=2*h*(ord(c) div 16)+h; image1.canvas.textOut(xOf,yOf,c); if not (c in ['0'..'9','a'..'z','A'..'Z']) then continue; for i:=xMin downto xMinMin do begin b:=false; for j:=yMinMin to yMaxMax do b:=b or (image1.picture.bitmap.canvas.pixels[xOf+i,yOf+j]<>$ffffff); if not b then begin xMin:=min(xMin,i+1); break; end; end; for i:=xMax to xMaxMax do begin b:=false; for j:=yMinMin to yMaxMax do b:=b or (image1.picture.bitmap.canvas.pixels[xOf+i,yOf+j]<>$ffffff); if not b then begin xMax:=max(xMax,i-1); break; end; end; for i:=yMin downto yMinMin do begin b:=false; for j:=xMinMin to xMaxMax do b:=b or (image1.picture.bitmap.canvas.pixels[xOf+j,yOf+i]<>$ffffff); if not b then begin yMin:=min(yMin,i+1); break; end; end; for i:=yMax to yMaxMax do begin b:=false; for j:=xMinMin to xMaxMax do b:=b or (image1.picture.bitmap.canvas.pixels[xOf+j,yOf+i]<>$ffffff); if not b then begin yMax:=max(yMax,i-1); break; end; end; end; form1.caption:=intToStr(w)+'x'+intToStr(h)+' ('+intToStr(xMin)+'..'+intToStr(xMax)+'x'+intToStr(yMin)+'..'+intToStr(yMax)+')'; end; procedure TForm1.SpinEdit2Change(Sender: TObject); var c: char; i,j,xOf,yOf: longint; warn: byte; s: string; begin s:=''; for c:=#32 to #126 do begin xOf:=2*w*(ord(c) mod 16)+w+spinEdit2.value; yOf:=2*h*(ord(c) div 16)+h+spinEdit3.value; warn:=0; for i:=xMinMin to -1 do for j:=yMinMin to yMaxMax do warn:=warn or byte(image1.picture.bitmap.canvas.pixels[xOf+i,yOf+j]<>$ffffff); if spinEdit4.value>0 then for i:=spinEdit4.value to xMaxMax do for j:=yMinMin to yMaxMax do warn:=warn or (byte(image1.picture.bitmap.canvas.pixels[xOf+i,yOf+j]<>$ffffff) shl 2); for i:=yMinMin to -1 do for j:=xMinMin to xMaxMax do warn:=warn or (byte(image1.picture.bitmap.canvas.pixels[xOf+j,yOf+i]<>$ffffff) shl 3); if spinEdit5.value>0 then for i:=spinEdit5.value to yMaxMax do for j:=xMinMin to xMaxMax do warn:=warn or (byte(image1.picture.bitmap.canvas.pixels[xOf+j,yOf+i]<>$ffffff) shl 1); if warn<>0 then s:=s+''''+c+''': '+intToStr(warn)+#13; end; if s<>'' then messageDlg(s,mtInformation,[mbOk],0); end; procedure TForm1.Button1Click(Sender: TObject); var f: textFile; c,d: char; i,j,xOf,yOf: longint; begin if saveDialog1.execute then case listBox1.itemIndex of 0: image1.picture.saveToFile(saveDialog1.fileName); 1: begin assignFile(f,saveDialog1.fileName); rewrite(f); writeln(f,'char const symbols['+intToStr(126+1-32)+'*'+intToStr(spinEdit4.value)+'] = {'); for c:=#32 to #126 do begin xOf:=2*w*(ord(c) mod 16)+w+spinEdit2.value; yOf:=2*h*(ord(c) div 16)+h+spinEdit3.value; write(f,' '); for i:=0 to spinEdit4.value-1 do begin d:=#0; for j:=0 to min(7,spinEdit5.value) do if image1.picture.bitmap.canvas.pixels[xOf+i,yOf+j] and $ff<$80 then d:=char(ord(d) or (1 shl j)); write(f,'0x'+intToHex(ord(d),2)); if i