PROGRAM Generate_transparent_pointers; USES crt; type mempointer = ^memtype; memtype = array[1..65535] of byte; transparent_type = ^Transparent_lookup; Transparent_lookup = Array[0..250,0..250] of byte; palettearray =array[0..768] of byte; const square_size = 20; brightness_adjust= 10; max_colours= 250; pcxfile ='empire.pcx'; palfile ='empire.pal'; VAR tp:transparent_lookup; trndata:transparent_type; segmem:word; memptr:mempointer; index,count,ticks:integer; diff:integer; counter:word; { Colour_pointer:array[0..max_colours,0..max_colours] of byte;} pal:palettearray; filename:string; f:file; f2:file of transparent_lookup; col1,col2:integer; c1r,c1g,c1b:integer; c2r,c2g,c2b:integer; ir,ig,ib:integer; ideal_col:integer; nearest_col:integer; nerest_total:integer; nearest_col_no:integer; nr,ng,nb:integer; cr,cg,cb:integer; temp:integer; error:longint; {***** LOAD PALETTE taken from Kevin A Lee's excellent MCGA256 library *} function LoadPalette(FileName: string; var Pal: PaletteArray): boolean; label quit; var f: file; i, NumRead: word; begin assign(f, FileName); {$I-} reset(f, 1); {$I+} if (IOResult <> 0) then begin { ErrFileNotFound } LoadPalette := FALSE; exit; end; {$I-} BlockRead(f, Pal, 768, NumRead); {$I+} if (IOResult <> 0) then goto quit; for i := 0 to 768 do Pal[i] := Pal[i] DIV 4; quit: close(f); LoadPalette := (IOResult = 0); end; {LoadPalette} procedure DACRemapColour(index, red, green, blue: byte); assembler; asm { N.B. no wiat for vertical retrace is done } mov dx, 3c8h { DAC set write mode } mov al, index out dx, al { set to write mode } mov dx, 3c9h { address of DAC read data } mov al, red out dx, al { set new red value } mov al, green out dx, al { set new green value } mov al, blue out dx, al { set new blue value } end; {DACRemapColour} procedure SetPalette(Pal: PaletteArray); var i: word; begin for i := 0 to 255 do DACRemapColour(i, Pal[i*3], Pal[i*3+1], Pal[i*3+2]); end; {SetPalette} {**************** GET THE COLOURS TOTAL *************************************} Function Col_total(offset:integer):integer; VAR buffer:integer; BEGIN offset:=offset*3; buffer:=pal[offset]; buffer:=buffer+ pal[offset+1]; buffer:=buffer+ pal[offset+2]; col_total:=buffer; End; FunCtion Red_val(offset:integer):byte; BEGIN red_val:=pal[offset*3]; End; Function green_val(offset:integer):byte; BEGIN green_val:=pal[(offset*3)+1]; End; Function blue_val(offset:integer):byte; BEGIN blue_val:=pal[(offset*3)+2]; End; procedure putpixel(d:word;x,y,c:integer); begin mem[d:x+y*320]:=c; end; {******************* PRESET COLOUR POINTERS *********************************} PROCEDURE colour_pointers; var ypos:integer; BEGIN error:=0; {Cycle through the first max_colours colours } {for count := 0 to 199 do mem[$A000:max_colours+(count*320)] := 15;} For index:=0 to max_colours do BEGIN writeln(max_colours-index,' colours to go '); {line(index,0,index,70,index);} ypos:=71; For count:=0 to max_colours DO BEGIN { putpixel($A000,index,ypos,count);} inc(ypos); if count = index then mem[segmem:index*256+count]:=index; if count <> index then BEGIN c1r:=red_val(index); c1g:=green_val(index); c1b:=blue_val(index); c2r:=red_val(count); c2g:=green_val(count); c2b:=blue_val(count); if (c1r =c2r) and (c1g =c2g) and (c1b =c2b) then BEGIN col1 := col2; mem[segmem:index*256+count]:= count; End; if (c1r > c2r) then ir := c2r+(c1r-c2r) div 2; if (c1r < c2r) then ir := c1r+(c2r-c1r) div 2; if (c1g > c2g) then ig := c2g+(c1g-c2g) div 2; if (c1g < c2g) then ig := c1g+(c2g-c1g) div 2; if (c1b > c2b) then ib := c2b+(c1b-c2b) div 2; if (c1b < c2b) then ib := c1b+(c2b-c1b) div 2; diff := 32000; nearest_col:=index; {Find the nearest colour} For ticks := 0 to 255 do BEGIN cr:=red_val(ticks); cg:=green_val(ticks); cb:=blue_val(ticks); temp :=0; temp := abs(cr-ir); temp := temp + abs(cg-ig); temp := temp + abs(cb-ib); if temp < diff then BEGIN diff := temp; nearest_col:=ticks; End; End; error:=error+diff; trndata^[count,index]:=nearest_col; END; end; End; End; BEGIN New(memptr); segmem:=seg(memptr^); new(trndata); writeln('Palette File ?'); readln(filename); if not loadpalette(filename,pal) then halt; writeln('Save file (*.TRN)'); readln(filename); assign(f2,filename); rewrite(f2); colour_pointers; counter:=0; tp:=trndata^; write(f2,tp); close(f2); textmode(co80); writeln('Error level=',diff); end.