80) { $position_x=80; } $loop+=$ansi_sequence_loop+2; break; } /*****************************************************************************/ /* CURSOR BACKWARD */ /*****************************************************************************/ if ($ansi_sequence_character=='D') { if ($ansi_sequence=='') { $ansi_sequence=1; } $position_x=$position_x-$ansi_sequence; if ($position_x<0) { $position_x=0; } $loop+=$ansi_sequence_loop+2; break; } /*****************************************************************************/ /* SAVE CURSOR POSITION */ /*****************************************************************************/ if ($ansi_sequence_character=='s') { $saved_position_y=$position_y; $saved_position_x=$position_x; $loop+=$ansi_sequence_loop+2; break; } /*****************************************************************************/ /* RESTORE CURSOR POSITION */ /*****************************************************************************/ if ($ansi_sequence_character=='u') { $position_y=$saved_position_y; $position_x=$saved_position_x; $loop+=$ansi_sequence_loop+2; break; } /*****************************************************************************/ /* ERASE DISPLAY */ /*****************************************************************************/ if ($ansi_sequence_character=='J') { if ($ansi_sequence==2) { unset($ansi_buffer); $position_x=0; $position_y=0; $position_x_max=0; $position_y_max=0; } $loop+=$ansi_sequence_loop+2; break; } /*****************************************************************************/ /* SET GRAPHIC RENDITION */ /*****************************************************************************/ if ($ansi_sequence_character=='m') { $ansi_sequence_exploded=explode(";",$ansi_sequence); sort($ansi_sequence_exploded); for ($loop_ansi_sequence=0;$loop_ansi_sequence29 && $ansi_sequence_value<38) { $color_foreground=$ansi_sequence_value-30; if ($bold) { $color_foreground+=8; } } if ($ansi_sequence_value>39 && $ansi_sequence_value<48) { $color_background=$ansi_sequence_value-40; if ($blink && $icecolors) { $color_background+=8; } } } $loop+=$ansi_sequence_loop+2; break; } /*****************************************************************************/ /* CURSOR DE/ACTIVATION (AMIGA ANSI) */ /*****************************************************************************/ if ($ansi_sequence_character=='p') { $loop+=$ansi_sequence_loop+2; break; } /*****************************************************************************/ /* SKIPPING SET MODE AND RESET MODE SEQUENCES */ /*****************************************************************************/ if ($ansi_sequence_character=='h' || $ansi_sequence_character=='l') { $loop+=$ansi_sequence_loop+2; break; } $ansi_sequence.=$ansi_sequence_character; } } elseif ($current_character!=10 && $current_character!=13 && $current_character!=9) { /*****************************************************************************/ /* RECORD NUMBER OF COLUMNS AND LINES USED */ /*****************************************************************************/ if ($position_x>$position_x_max) { $position_x_max=$position_x; } if ($position_y>$position_y_max) { $position_y_max=$position_y; } /*****************************************************************************/ /* WRITE CURRENT CHARACTER INFO IN A TEMPORARY ARRAY */ /*****************************************************************************/ if (!$font_amiga || ($current_character!=12 && $current_character!=13)) { $ansi_buffer.=chr($color_background); $ansi_buffer.=chr($color_foreground); $ansi_buffer.=chr($current_character); $ansi_buffer.=chr($bold); $ansi_buffer.=chr($italics); $ansi_buffer.=chr($underline); $ansi_buffer.=chr($position_x); $ansi_buffer.=chr($position_y & 0xFF); $ansi_buffer.=chr($position_y>>8); $position_x++; } } $loop++; } /*****************************************************************************/ /* ALLOCATE IMAGE BUFFER MEMORY */ /*****************************************************************************/ $position_x_max++; $position_y_max++; if ($ced) { $columns=78; } for ($loop=0;$loop=1) { $output_file=$output.SPLIT_SEPARATOR.str_pad($loop,4,"0",STR_PAD_LEFT).".png"; } else { $output_file=$output.".png"; } $output_files[]=$output_file; if ($transparent) { imagecolortransparent($split,$background_canvas); } ImagePNG($split,$output_file); imagedestroy($split); } } } } /*****************************************************************************/ /* FREE MEMORY */ /*****************************************************************************/ imagedestroy($ansi); imagedestroy($background); imagedestroy($font); return $output_files; } /*****************************************************************************/ /* LOAD PCBOARD */ /*****************************************************************************/ function load_pcboard($input,$output,$font,$bits) { check_libraries(); /*****************************************************************************/ /* CHECK PARAMETERS AND FORCE DEFAULT VALUES IF INVALID INPUT IS DETECTED */ /*****************************************************************************/ $columns=80; if ($bits=='thumbnail') { $thumbnail=TRUE; } if ($bits!=8 && $bits!=9) { $bits=8; } switch($font) { case '80x25': $font_file='ansilove_font_pc_80x25.png'; $font_size_x=9; $font_size_y=16; break; case '80x50': $font_file='ansilove_font_pc_80x50.png'; $font_size_x=9; $font_size_y=8; break; default: $font_file='ansilove_font_pc_80x25.png'; $font_size_x=9; $font_size_y=16; } /*****************************************************************************/ /* LOAD INPUT FILE */ /*****************************************************************************/ if (!$input_file = fopen($input,'r')) { error("Can't open file $input"); } $input_file_sauce=load_sauce($input); if ($input_file_sauce!=NULL) { $input_file_size=$input_file_sauce['FileSize']; } else { $input_file_size=filesize($input); } if (!$input_file_buffer = fread($input_file,$input_file_size)) { error("Can't read file $input"); } fclose($input_file); /*****************************************************************************/ /* LOAD BACKGROUND/FONT */ /*****************************************************************************/ if (!$background = imagecreatefrompng(dirname(__FILE__).'/fonts/ansilove_background.png')) { error("Can't open file ansilove_background.png"); } if (!$font = imagecreatefrompng(dirname(__FILE__).'/fonts/'.$font_file)) { error("Can't open file $font_file"); } imagecolortransparent($font,20); /*****************************************************************************/ /* ALLOCATE BACKGROUND/FOREGROUND COLOR ARRAYS */ /*****************************************************************************/ $pcb_colors[48]=0; $pcb_colors[49]=4; $pcb_colors[50]=2; $pcb_colors[51]=6; $pcb_colors[52]=1; $pcb_colors[53]=5; $pcb_colors[54]=3; $pcb_colors[55]=7; $pcb_colors[56]=8; $pcb_colors[57]=12; $pcb_colors[65]=10; $pcb_colors[66]=14; $pcb_colors[67]=9; $pcb_colors[68]=13; $pcb_colors[69]=11; $pcb_colors[70]=15; /*****************************************************************************/ /* STRIP UNWANTED PCBOARD CODES (DEFINED IN CONFIG FILE) */ /*****************************************************************************/ $pcboard_strip_codes_exploded=explode(",",PCBOARD_STRIP_CODES); for ($loop=0;$loop$position_x_max) { $position_x_max=$position_x; } if ($position_y>$position_y_max) { $position_y_max=$position_y; } /*****************************************************************************/ /* WRITE CURRENT CHARACTER INFO IN A TEMPORARY ARRAY */ /*****************************************************************************/ $pcboard_buffer[]=$position_x; $pcboard_buffer[]=$position_y; $pcboard_buffer[]=$color_background; $pcboard_buffer[]=$color_foreground; $pcboard_buffer[]=$current_character; $position_x++; } $loop++; } /*****************************************************************************/ /* ALLOCATE IMAGE BUFFER MEMORY */ /*****************************************************************************/ $position_x_max++; $position_y_max++; if (!$pcboard = imagecreate($columns*$bits,($position_y_max)*$font_size_y)) { error("Can't allocate buffer image memory"); } imagecolorallocate($pcboard,0,0,0); /*****************************************************************************/ /* RENDER PCB */ /*****************************************************************************/ for ($loop=0;$loop>4]; $color_foreground=$binary_colors[$attribute & 15]; if ($color_background>8 && $icecolors==0) { $color_background-=8; } imagecopy($binary,$background,$position_x*$bits,$position_y*$font_size_y,$color_background*9,0,$bits,$font_size_y); imagecopy($binary,$font,$position_x*$bits,$position_y*$font_size_y,$character*$font_size_x,$color_foreground*$font_size_y,$bits,$font_size_y); $position_x++; $loop+=2; } /*****************************************************************************/ /* CREATE OUTPUT FILE */ /*****************************************************************************/ if ($thumbnail) { $position_y_max=($input_file_size/2)/$columns; thumbnail($binary,$output,$columns,$font_size_y,$position_y_max); } else { if ($output=='online') { Header("Content-type: image/png"); ImagePNG($binary); } else { ImagePNG($binary,$output); } } /*****************************************************************************/ /* FREE MEMORY */ /*****************************************************************************/ imagedestroy($binary); imagedestroy($background); imagedestroy($font); } /*****************************************************************************/ /* LOAD ADF */ /*****************************************************************************/ function load_adf($input,$output,$bits) { check_libraries(); if ($bits=='thumbnail') { $thumbnail=TRUE; } /*****************************************************************************/ /* LOAD INPUT FILE */ /*****************************************************************************/ if (!$input_file = fopen($input,'r')) { error("Can't open file $input"); } $input_file_sauce=load_sauce($input); if ($input_file_sauce!=NULL) { $input_file_size=$input_file_sauce['FileSize']; } else { $input_file_size=filesize($input); } if (!$input_file_buffer = fread($input_file,$input_file_size)) { error("Can't read file $input"); } fclose($input_file); /*****************************************************************************/ /* ALLOCATE BACKGROUND/FONT IMAGE BUFFER MEMORY */ /*****************************************************************************/ if (!$background = imagecreate(128,16)) { error("Can't allocate background buffer image memory"); } if (!$font = imagecreate(2048,256)) { error("Can't allocate font buffer image memory"); } if (!$font_inverted = imagecreate(2048,16)) { error("Can't allocate temporary font buffer image memory"); } /*****************************************************************************/ /* PROCESS ADF PALETTE */ /*****************************************************************************/ $adf_colors=array(0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63); for ($loop=0;$loop<16;$loop++) { $index=($adf_colors[$loop]*3)+1; $colors[$loop]=imagecolorallocate($background,(ord($input_file_buffer[$index])<<2 | ord($input_file_buffer[$index])>>4),(ord($input_file_buffer[$index+1])<<2 | ord($input_file_buffer[$index+1])>>4),(ord($input_file_buffer[$index+2])<<2 | ord($input_file_buffer[$index+2])>>4)); } imagepalettecopy($font,$background); imagepalettecopy($font_inverted,$background); $color_index=imagecolorsforindex($background, 0); $colors[16]=imagecolorallocate($font,$color_index['red'],$color_index['green'],$color_index['blue']); $colors[20]=imagecolorallocate($font_inverted,200,220,169); for ($loop=0;$loop<16;$loop++) { imagefilledrectangle($background,$loop<<3,0,($loop<<3)+8,16,$colors[$loop]); } /*****************************************************************************/ /* PROCESS ADF FONT */ /*****************************************************************************/ imagefilledrectangle($font_inverted,0,0,2048,16,$colors[20]); imagecolortransparent($font_inverted,$colors[20]); for ($loop=0;$loop<256;$loop++) { for ($adf_font_size_y=0;$adf_font_size_y<16;$adf_font_size_y++) { $adf_character_line=ord($input_file_buffer[193+$adf_font_size_y+($loop*16)]); for ($loop_column=0;$loop_column<8;$loop_column++) { if (($adf_character_line & 0x80>>$loop_column)==0) { imagesetpixel($font_inverted,($loop*8)+$loop_column,$adf_font_size_y,$colors[0]); } } } } for ($loop=1;$loop<16;$loop++) { imagefilledrectangle($font,0,$loop*16,2048,($loop*16)+16,$colors[$loop]); } imagefilledrectangle($font,0,0,2048,15,$colors[16]); for ($loop=0;$loop<16;$loop++) { imagecopy($font,$font_inverted,0,$loop*16,0,0,2048,16); } imagecolortransparent($font,$colors[0]); /*****************************************************************************/ /* ALLOCATE IMAGE BUFFER MEMORY */ /*****************************************************************************/ if (!$adf = imagecreate(640,((($input_file_size-192-4096-1)/2)/80)*16)) { error("Can't allocate buffer image memory"); } imagecolorallocate($adf,0,0,0); /*****************************************************************************/ /* PROCESS ADF */ /*****************************************************************************/ $loop=192+4096+1; while ($loop<$input_file_size) { if ($position_x==80) { $position_x=0; $position_y++; } $character=ord($input_file_buffer[$loop]); $attribute=ord($input_file_buffer[$loop+1]); $color_background=($attribute & 240)>>4; $color_foreground=$attribute & 15; imagecopy($adf,$background,$position_x*8,$position_y*16,$color_background*8,0,8,16); imagecopy($adf,$font,$position_x*8,$position_y*16,$character*8,$color_foreground*16,8,16); $position_x++; $loop+=2; } /*****************************************************************************/ /* CREATE OUTPUT FILE */ /*****************************************************************************/ if ($thumbnail) { $position_y_max=(($input_file_size-192-4096-1)/2)/80; $columns=80; $font_size_y=16; thumbnail($adf,$output,$columns,$font_size_y,$position_y_max); } else { if ($output=='online') { Header("Content-type: image/png"); ImagePNG($adf); } else { ImagePNG($adf,$output); } } /*****************************************************************************/ /* FREE MEMORY */ /*****************************************************************************/ imagedestroy($adf); imagedestroy($background); imagedestroy($font); imagedestroy($font_inverted); } /*****************************************************************************/ /* LOAD IDF */ /*****************************************************************************/ function load_idf($input,$output,$bits) { check_libraries(); if ($bits=='thumbnail') { $thumbnail=TRUE; } /*****************************************************************************/ /* LOAD INPUT FILE */ /*****************************************************************************/ if (!$input_file = fopen($input,'r')) { error("Can't open file $input"); } $input_file_sauce=load_sauce($input); if ($input_file_sauce!=NULL) { $input_file_size=$input_file_sauce['FileSize']; } else { $input_file_size=filesize($input); } if (!$input_file_buffer = fread($input_file,$input_file_size)) { error("Can't read file $input"); } fclose($input_file); /*****************************************************************************/ /* EXTRACT IDF HEADER */ /*****************************************************************************/ $idf_header['ID']=substr($input_file_buffer,0,4); $idf_header=array_merge($idf_header,unpack('vx1/vy1/vx2/vy2',substr($input_file_buffer,4,8))); /*****************************************************************************/ /* ALLOCATE BACKGROUND/FONT IMAGE BUFFER MEMORY */ /*****************************************************************************/ if (!$background = imagecreate(128,16)) { error("Can't allocate background buffer image memory"); } if (!$font = imagecreate(2048,256)) { error("Can't allocate font buffer image memory"); } if (!$font_inverted = imagecreate(2048,16)) { error("Can't allocate temporary font buffer image memory"); } /*****************************************************************************/ /* PROCESS IDF PALETTE */ /*****************************************************************************/ for ($loop=0;$loop<16;$loop++) { $index=($loop*3)+$input_file_size-48; $colors[$loop]=imagecolorallocate($background,(ord($input_file_buffer[$index])<<2 | ord($input_file_buffer[$index])>>4),(ord($input_file_buffer[$index+1])<<2 | ord($input_file_buffer[$index+1])>>4),(ord($input_file_buffer[$index+2])<<2 | ord($input_file_buffer[$index+2])>>4)); } imagepalettecopy($font,$background); imagepalettecopy($font_inverted,$background); $color_index=imagecolorsforindex($background,0); $colors[16]=imagecolorallocate($font,$color_index['red'],$color_index['green'],$color_index['blue']); $colors[20]= imagecolorallocate($font_inverted,200,220,169); for ($loop=0;$loop<16;$loop++) { imagefilledrectangle($background,$loop<<3,0,($loop<<3)+8,16,$colors[$loop]); } /*****************************************************************************/ /* PROCESS IDF FONT */ /*****************************************************************************/ imagefilledrectangle($font_inverted,0,0,2048,16,$colors[20]); imagecolortransparent($font_inverted,$colors[20]); for ($loop=0;$loop<256;$loop++) { for ($idf_font_size_y=0;$idf_font_size_y<16;$idf_font_size_y++) { $idf_character_line=ord($input_file_buffer[$input_file_size-48-4096+$idf_font_size_y+($loop*16)]); for ($loop_column=0;$loop_column<8;$loop_column++) { if (($idf_character_line & 0x80>>$loop_column)==0) { imagesetpixel($font_inverted,($loop*8)+$loop_column,$idf_font_size_y,$colors[0]); } } } } for ($loop=1;$loop<16;$loop++) { imagefilledrectangle($font,0,$loop*16,2048,($loop*16)+16,$colors[$loop]); } imagefilledrectangle($font,0,0,2048,15,$colors[16]); for ($loop=0;$loop<16;$loop++) { imagecopy($font,$font_inverted,0,$loop*16,0,0,2048,16); } imagecolortransparent($font,$colors[0]); /*****************************************************************************/ /* PROCESS IDF */ /*****************************************************************************/ $loop=12; while ($loop<$input_file_size-4096-48) { $idf_data=unpack('vdata',substr($input_file_buffer,$loop,2)); if ($idf_data['data']==1) { $idf_data=unpack('vlength',substr($input_file_buffer,$loop+2,2)); $idf_sequence_length=$idf_data['length'] & 255; $idf_data=unpack('Ccharacter/Cattribute',substr($input_file_buffer,$loop+4,2)); for ($idf_sequence_loop=0;$idf_sequence_loop<$idf_sequence_length;$idf_sequence_loop++) { $idf_buffer[]=$idf_data['character']; $idf_buffer[]=$idf_data['attribute']; } $loop+=4; } else { $idf_data=unpack('Ccharacter/Cattribute',substr($input_file_buffer,$loop,2)); $idf_buffer[]=$idf_data['character']; $idf_buffer[]=$idf_data['attribute']; } $loop+=2; } /*****************************************************************************/ /* ALLOCATE IMAGE BUFFER MEMORY */ /*****************************************************************************/ if (!$idf = imagecreate(($idf_header['x2']+1)*8,(sizeof($idf_buffer)/2/80)*16)) { error("Can't allocate buffer image memory"); } imagecolorallocate($idf,0,0,0); /*****************************************************************************/ /* RENDER IDF */ /*****************************************************************************/ for ($loop=0;$loop>4; $color_foreground=$attribute & 15; imagecopy($idf,$background,$position_x*8,$position_y*16,$color_background*8,0,8,16); imagecopy($idf,$font,$position_x*8,$position_y*16,$character*8,$color_foreground*16,8,16); $position_x++; } /*****************************************************************************/ /* CREATE OUTPUT FILE */ /*****************************************************************************/ if ($thumbnail) { $position_y_max=$position_y; $columns=80; $font_size_y=16; thumbnail($idf,$output,$columns,$font_size_y,$position_y_max); } else { if ($output=='online') { Header("Content-type: image/png"); ImagePNG($idf); } else { ImagePNG($idf,$output); } } /*****************************************************************************/ /* FREE MEMORY */ /*****************************************************************************/ imagedestroy($idf); imagedestroy($background); imagedestroy($font); imagedestroy($font_inverted); } /*****************************************************************************/ /* LOAD TUNDRA */ /*****************************************************************************/ function load_tundra($input,$output,$font,$bits) { check_libraries(); /*****************************************************************************/ /* CHECK PARAMETERS AND FORCE DEFAULT VALUES IF INVALID INPUT IS DETECTED */ /*****************************************************************************/ $columns=80; if ($bits=='thumbnail') { $thumbnail=TRUE; } if ($bits!=8 && $bits!=9) { $bits=8; } switch($font) { case '80x25': $font_file='ansilove_font_pc_80x25.png'; $font_size_x=9; $font_size_y=16; break; case '80x50': $font_file='ansilove_font_pc_80x50.png'; $font_size_x=9; $font_size_y=8; break; default: $font_file='ansilove_font_pc_80x25.png'; $font_size_x=9; $font_size_y=16; } /*****************************************************************************/ /* LOAD INPUT FILE */ /*****************************************************************************/ if (!$input_file = fopen($input,'r')) { error("Can't open file $input"); } $input_file_sauce=load_sauce($input); if ($input_file_sauce!=NULL) { $input_file_size=$input_file_sauce['FileSize']; } else { $input_file_size=filesize($input); } if (!$input_file_buffer = fread($input_file,$input_file_size)) { error("Can't read file $input"); } fclose($input_file); /*****************************************************************************/ /* EXTRACT TUNDRA HEADER */ /*****************************************************************************/ $tundra_header['value']=$input_file_buffer[0]; $tundra_header['string']=substr($input_file_buffer,1,8); if (ord($tundra_header['value'])!=24 || $tundra_header['string']!='TUNDRA24') { error("$input is not a TUNDRA file"); } /*****************************************************************************/ /* LOAD BACKGROUND/FONT AND ALLOCATE IMAGE BUFFER MEMORY */ /*****************************************************************************/ if (!$background = imagecreatefrompng(dirname(__FILE__).'/fonts/ansilove_background.png')) { error("Can't open file ansilove_background.png"); } if (!$font = imagecreatefrompng(dirname(__FILE__).'/fonts/'.$font_file)) { error("Can't open file $font_file"); } imagecolorset($font,20,0,0,0); /*****************************************************************************/ /* READ TUNDRA FILE A FIRST TIME TO FIND THE IMAGE SIZE */ /*****************************************************************************/ $loop=9; while ($loop<$input_file_size) { if ($position_x==80) { $position_x=0; $position_y++; } $character=ord($input_file_buffer[$loop]); if ($character==1) { $tundra_position_array=unpack('Nposition_y/Nposition_x',substr($input_file_buffer,$loop+1,8)); $position_y=$tundra_position_array['position_y']; $position_x=$tundra_position_array['position_x']; $loop+=8; } if ($character==2) { $loop+=5; } if ($character==4) { $loop+=5; } if ($character==6) { $loop+=9; } if ($character!=1 && $character!=2 && $character!=4 && $character!=6) { $position_x++; } $loop++; } $position_y++; /*****************************************************************************/ /* ALLOCATE IMAGE BUFFER MEMORY */ /*****************************************************************************/ if (!$tundra = imagecreate($columns*$bits,($position_y)*$font_size_y)) { error("Can't allocate buffer image memory"); } imagecolorallocate($tundra,0,0,0); /*****************************************************************************/ /* PROCESS TUNDRA FILE */ /*****************************************************************************/ $position_x=0; $position_y=0; $loop=9; while ($loop<$input_file_size) { if ($position_x==$columns) { $position_x=0; $position_y++; } $character=ord($input_file_buffer[$loop]); if ($character==1) { $tundra_position_array=unpack('Nposition_y/Nposition_x',substr($input_file_buffer,$loop+1,8)); $position_y=$tundra_position_array['position_y']; $position_x=$tundra_position_array['position_x']; $loop+=8; } if ($character==2) { $tundra_color_array=unpack('Ncolor_foreground',substr($input_file_buffer,$loop+2,4)); $color_foreground=$tundra_color_array['color_foreground']; $red=($color_foreground>>16) & 0x000000FF; $green=($color_foreground>>8) & 0x000000FF; $blue=$color_foreground & 0x000000FF; imagecolorset($font,0,$red,$green,$blue); $character=ord($input_file_buffer[$loop+1]); $loop+=5; } if ($character==4) { $tundra_color_array=unpack('Ncolor_background',substr($input_file_buffer,$loop+2,4)); $color_background=$tundra_color_array['color_background']; $red=($color_background>>16) & 0x000000FF; $green=($color_background>>8) & 0x000000FF; $blue=$color_background & 0x000000FF; imagecolorset($font,20,$red,$green,$blue); $character=ord($input_file_buffer[$loop+1]); $loop+=5; } if ($character==6) { $tundra_color_array=unpack('Ncolor_foreground/Ncolor_background',substr($input_file_buffer,$loop+2,8)); $color_foreground=$tundra_color_array['color_foreground']; $red=($color_foreground>>16) & 0x000000FF; $green=($color_foreground>>8) & 0x000000FF; $blue=$color_foreground & 0x000000FF; imagecolorset($font,0,$red,$green,$blue); $color_background=$tundra_color_array['color_background']; $red=($color_background>>16) & 0x000000FF; $green=($color_background>>8) & 0x000000FF; $blue=$color_background & 0x000000FF; imagecolorset($font,20,$red,$green,$blue); $character=ord($input_file_buffer[$loop+1]); $loop+=9; } if ($character!=1 && $character!=2 && $character!=4 && $character!=6) { imagecopy($tundra,$font,$position_x*$bits,$position_y*$font_size_y,$character*$font_size_x,0,$bits,$font_size_y); $position_x++; } $loop++; } /*****************************************************************************/ /* CREATE OUTPUT FILE */ /*****************************************************************************/ if ($thumbnail) { $position_y_max=$position_y; thumbnail($tundra,$output,$columns,$font_size_y,$position_y_max); } else { if ($output=='online') { Header("Content-type: image/png"); ImagePNG($tundra); } else { ImagePNG($tundra,$output); } } /*****************************************************************************/ /* FREE MEMORY */ /*****************************************************************************/ imagedestroy($tundra); imagedestroy($background); imagedestroy($font); } /*****************************************************************************/ /* LOAD XBIN */ /*****************************************************************************/ function load_xbin($input,$output,$bits) { check_libraries(); if ($bits=='thumbnail') { $thumbnail=TRUE; } /*****************************************************************************/ /* LOAD INPUT FILE */ /*****************************************************************************/ if (!$input_file = fopen($input,'r')) { error("Can't open file $input"); } $input_file_sauce=load_sauce($input); if ($input_file_sauce!=NULL) { $input_file_size=$input_file_sauce['FileSize']; } else { $input_file_size=filesize($input); } if (!$input_file_buffer = fread($input_file,$input_file_size)) { error("Can't read file $input"); } fclose($input_file); /*****************************************************************************/ /* EXTRACT XBIN HEADER */ /*****************************************************************************/ $xbin_header['ID']=substr($input_file_buffer,0,4); if ($xbin_header['ID']!='XBIN') { error("$input is not a XBiN file"); } $xbin_header=array_merge($xbin_header,unpack('CEofChar/vWidth/vHeight/CFontsize/CFlags',substr($input_file_buffer,4,7))); if (($xbin_header['Flags'] & 1)==1) { $xbin_flags['palette']=1; } if (($xbin_header['Flags'] & 2)==2) { $xbin_flags['font']=1; } if (($xbin_header['Flags'] & 4)==4) { $xbin_flags['compress']=1; } if (($xbin_header['Flags'] & 8)==8) { $xbin_flags['nonblink']=1; } if (($xbin_header['Flags'] & 16)==16) { $xbin_flags['512chars']=1; } /*****************************************************************************/ /* PROCESS XBIN PALETTE */ /*****************************************************************************/ if ($xbin_flags['palette']==1) { if (!$background = imagecreate(128,16)) { error("Can't allocate background buffer image memory"); } for ($loop=0;$loop<16;$loop++) { $index=($loop*3)+11; $colors[$loop]=imagecolorallocate($background,(ord($input_file_buffer[$index])<<2 | ord($input_file_buffer[$index])>>4),(ord($input_file_buffer[$index+1])<<2 | ord($input_file_buffer[$index+1])>>4),(ord($input_file_buffer[$index+2])<<2 | ord($input_file_buffer[$index+2])>>4)); } for ($loop=0;$loop<16;$loop++) { imagefilledrectangle($background,$loop<<3,0,($loop<<3)+8,16,$colors[$loop]); } $background_size_x=8; } else { if (!$background = imagecreatefrompng(dirname(__FILE__).'/fonts/ansilove_background.png')) { error("Can't open file ansilove_background.png"); } $background_size_x=9; } /*****************************************************************************/ /* PROCESS XBIN FONT */ /*****************************************************************************/ if ($xbin_flags['font']==1) { if (!$font = imagecreate(2048,$xbin_header['Fontsize']*16)) { error("Can't allocate font buffer image memory"); } if (!$font_inverted = imagecreate(2048,$xbin_header['Fontsize'])) { error("Can't allocate temporary font buffer image memory"); } imagepalettecopy($font,$background); imagepalettecopy($font_inverted,$background); $color_index=imagecolorsforindex($background,0); $colors[16]=imagecolorallocate($font,$color_index['red'],$color_index['green'],$color_index['blue']); $colors[20]=imagecolorallocate($font_inverted,200,220,169); imagefilledrectangle($font_inverted,0,0,2048,$xbin_header['Fontsize'],$colors[20]); imagecolortransparent($font_inverted,$colors[20]); for ($loop=0;$loop<256;$loop++) { for ($xbin_font_size_y=0;$xbin_font_size_y<$xbin_header['Fontsize'];$xbin_font_size_y++) { $xbin_character_line=ord($input_file_buffer[11+$xbin_flags['palette']*48+$xbin_font_size_y+($loop*$xbin_header['Fontsize'])]); for ($loop_column=0;$loop_column<8;$loop_column++) { if (($xbin_character_line & 0x80>>$loop_column)==0) { imagesetpixel($font_inverted,($loop*8)+$loop_column,$xbin_font_size_y,$colors[0]); } } } } for ($loop=1;$loop<16;$loop++) { imagefilledrectangle($font,0,$loop*$xbin_header['Fontsize'],2048,($loop*$xbin_header['Fontsize'])+$xbin_header['Fontsize'],$loop); } imagefilledrectangle($font,0,0,2048,$xbin_header['Fontsize']-1,$colors[16]); for ($loop=0;$loop<16;$loop++) { imagecopy ($font, $font_inverted, 0,$loop*$xbin_header['Fontsize'],0,0,2048,$xbin_header['Fontsize']); } imagecolortransparent($font,$colors[0]); $font_size_x=8; $font_size_y=$xbin_header['Fontsize']; } else { if (!$font = imagecreatefrompng (dirname(__FILE__).'/fonts/ansilove_font_pc_80x25.png')) { error("Can't open file $font_file"); } $font_size_x=9; $font_size_y=16; imagecolortransparent($font,20); } /*****************************************************************************/ /* PROCESS XBIN */ /*****************************************************************************/ $loop=11+$xbin_flags['palette']*48+$xbin_flags['font']*256*$xbin_header['Fontsize']; if ($xbin_flags['compress']==1) { while ($loop<$input_file_size) { $character=ord($input_file_buffer[$loop]); $compression=$character & 192; $repeat=1+($character & 63); if ($compression==0) { for ($i=0;$i<$repeat*2;$i++) { $xbin_buffer[]=ord($input_file_buffer[$loop+1+$i]); } $loop=$loop+1+($repeat*2); } if ($compression==64) { for ($i=0;$i<$repeat;$i++) { $xbin_buffer[]=ord($input_file_buffer[$loop+1]); $xbin_buffer[]=ord($input_file_buffer[$loop+2+$i]); } $loop=$loop+2+$repeat; } if ($compression==128) { for ($i=0;$i<$repeat;$i++) { $xbin_buffer[]=ord($input_file_buffer[$loop+2+$i]); $xbin_buffer[]=ord($input_file_buffer[$loop+1]); } $loop=$loop+2+$repeat; } if ($compression==192) { for ($i=0;$i<$repeat;$i++) { $xbin_buffer[]=ord($input_file_buffer[$loop+1]); $xbin_buffer[]=ord($input_file_buffer[$loop+2]); } $loop+=3; } } } else { while ($loop<$input_file_size) { $xbin_buffer[]=ord($input_file_buffer[$loop]); $loop++; } } /*****************************************************************************/ /* ALLOCATE IMAGE BUFFER MEMORY */ /*****************************************************************************/ if (!$xbin = imagecreatetruecolor($xbin_header['Width']*8,$xbin_header['Height']*$font_size_y)) { error("Can't allocate buffer image memory"); } imagecolorallocate($xbin,0,0,0); /*****************************************************************************/ /* RENDER XBIN */ /*****************************************************************************/ for ($loop=0;$loop>4; $color_foreground=$attribute & 15; imagecopy($xbin, $background,$position_x*8,$position_y*$font_size_y,$color_background*$background_size_x,0,8,$font_size_y); imagecopy($xbin,$font,$position_x*8,$position_y*$font_size_y,$character*$font_size_x,$color_foreground*$font_size_y,8,$font_size_y); $position_x++; } /*****************************************************************************/ /* CREATE OUTPUT FILE */ /*****************************************************************************/ if ($thumbnail) { $position_y_max=$xbin_header['Height']; $columns=$xbin_header['Width']; thumbnail($xbin,$output,$columns,$font_size_y,$position_y_max); } else { if ($output=='online') { Header("Content-type: image/png"); ImagePNG($xbin); } else { ImagePNG($xbin,$output); } } /*****************************************************************************/ /* FREE MEMORY */ /*****************************************************************************/ imagedestroy($xbin); imagedestroy($background); imagedestroy($font); if ($xbin_flags['font']==1) { imagedestroy($font_inverted); } } /*****************************************************************************/ /* LOAD SAUCE */ /*****************************************************************************/ function load_sauce($input) { /*****************************************************************************/ /* LOAD INPUT FILE */ /*****************************************************************************/ if (!$input_file = fopen ($input,'r')) { error("Can't open file $input"); } $input_file_size=filesize($input); /*****************************************************************************/ /* PROCESS SAUCE */ /*****************************************************************************/ if ($input_file_size>=128) { fseek($input_file,$input_file_size-128); $input_file_buffer=fread($input_file,128); $sauce['ID']=substr($input_file_buffer,0,5); $sauce['Version']=substr($input_file_buffer,5,2); $sauce['Title']=substr($input_file_buffer,7,35); $sauce['Author']=substr($input_file_buffer,42,20); $sauce['Group']=substr($input_file_buffer,62,20); $sauce['Date']=substr($input_file_buffer,82,8); $sauce=array_merge($sauce,unpack('lFileSize/CDataType/CFileType/v4TInfo/CComments/CFlags',substr($input_file_buffer,90,16))); $sauce['Filler']=substr($input_file_buffer,106,22); } /*****************************************************************************/ /* PROCESS SAUCE COMMENTS */ /*****************************************************************************/ $sauce_comment_lines=$sauce['Comments']; if ($sauce_comment_lines!=0) { if ($input_file_size>=128+5+($sauce_comment_lines*64)) { fseek($input_file,($input_file_size-128-5-($sauce_comment_lines*64))); $comment_id=fread($input_file,5); if ($comment_id=='COMNT') { for ($loop=0;$loop<$sauce_comment_lines;$loop++) { fseek($input_file,($input_file_size-128-($sauce_comment_lines*64)+($loop*64))); $comment_line="Comment_Line_"; if ($loop<9) { $comment_line.="0"; } $comment_line.=($loop+1); $sauce[$comment_line]=fread($input_file,64); } } } } fclose($input_file); /*****************************************************************************/ /* RETURN SAUCE */ /*****************************************************************************/ if ($sauce['ID']=='SAUCE') { return($sauce); } } ?>