2010-11-02 07:54:50 -04:00
< ? php
2010-11-04 07:58:51 -04:00
function sprintf3 ( $str , $vars , $delim = '%' ) {
$replaces = array ();
foreach ( $vars as $k => $v ) {
$replaces [ $delim . $k . $delim ] = $v ;
2010-11-04 07:30:23 -04:00
}
2010-11-04 07:58:51 -04:00
return str_replace ( array_keys ( $replaces ),
array_values ( $replaces ), $str );
}
2010-11-02 06:57:33 -04:00
function sql_open () {
global $sql ;
$sql = @ mysql_connect ( MY_SERVER , MY_USER , MY_PASSWORD ) or error ( 'Database error.' );
@ mysql_select_db ( MY_DATABASE , $sql ) or error ( 'Database error.' );
}
function sql_close () {
global $sql ;
@ mysql_close ( $sql );
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
function mysql_safe_array ( & $array ) {
foreach ( $array as & $item ) {
$item = mysql_real_escape_string ( $item );
}
}
2010-11-30 04:24:09 -05:00
function setupBoard ( $array ) {
global $board ;
$board = Array (
'id' => $array [ 'id' ],
'uri' => $array [ 'uri' ],
'name' => $array [ 'title' ],
'title' => $array [ 'subtitle' ]);
$board [ 'dir' ] = sprintf ( BOARD_PATH , $board [ 'uri' ]);
$board [ 'url' ] = sprintf ( BOARD_ABBREVIATION , $board [ 'uri' ]);
if ( ! file_exists ( $board [ 'dir' ])) mkdir ( $board [ 'dir' ], 0777 );
if ( ! file_exists ( $board [ 'dir' ] . DIR_IMG )) @ mkdir ( $board [ 'dir' ] . DIR_IMG , 0777 ) or error ( " Couldn't create " . DIR_IMG . " . Check permissions. " , true );
if ( ! file_exists ( $board [ 'dir' ] . DIR_THUMB )) @ mkdir ( $board [ 'dir' ] . DIR_THUMB , 0777 ) or error ( " Couldn't create " . DIR_THUMB . " . Check permissions. " , true );
if ( ! file_exists ( $board [ 'dir' ] . DIR_RES )) @ mkdir ( $board [ 'dir' ] . DIR_RES , 0777 ) or error ( " Couldn't create " . DIR_RES . " . Check permissions. " , true );
}
2010-11-30 04:38:36 -05:00
function openBoard ( $uri ) {
2010-11-30 04:44:53 -05:00
global $sql ;
2010-11-30 07:12:54 -05:00
$boards_res = mysql_query ( sprintf (
" SELECT * FROM `boards` WHERE `uri` = '%s' LIMIT 1 " ,
mysql_real_escape_string ( $uri )
), $sql ) or error ( mysql_error ( $sql ));
2010-11-30 04:38:36 -05:00
if ( $_board = mysql_fetch_array ( $boards_res )) {
setupBoard ( $_board );
return true ;
} else return false ;
}
2010-11-30 07:12:54 -05:00
function threadExists ( $id ) {
global $sql ;
$thread_res = mysql_query ( sprintf (
" SELECT 1 FROM `posts` WHERE `id` = '%d' AND `thread` IS NULL LIMIT 1 " ,
$id
), $sql ) or error ( mysql_error ( $sql ));
if ( mysql_num_rows ( $thread_res ) > 0 ) {
return true ;
} else return false ;
}
2010-11-04 07:58:51 -04:00
function post ( $post , $OP ) {
2010-11-30 03:12:35 -05:00
global $sql , $board ;
2010-11-04 07:58:51 -04:00
if ( $OP ) {
mysql_query (
2010-11-30 03:12:35 -05:00
sprintf ( " INSERT INTO `posts` VALUES ( NULL, '%d', NULL, '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%s', '%s', '%s', '%s' ) " ,
$board [ 'id' ],
2010-11-04 07:58:51 -04:00
$post [ 'subject' ],
$post [ 'email' ],
$post [ 'name' ],
$post [ 'trip' ],
$post [ 'body' ],
time (),
time (),
$post [ 'thumb' ],
$post [ 'thumbwidth' ],
$post [ 'thumbheight' ],
$post [ 'file' ],
$post [ 'width' ],
$post [ 'height' ],
$post [ 'filesize' ],
$post [ 'filename' ],
$post [ 'filehash' ],
$post [ 'password' ],
mysql_real_escape_string ( $_SERVER [ 'REMOTE_ADDR' ])
), $sql ) or error ( mysql_error ( $sql ));
return mysql_insert_id ( $sql );
} else {
mysql_query (
2010-11-30 03:12:35 -05:00
sprintf ( " INSERT INTO `posts` VALUES ( NULL, '%d', '%d', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%s', '%s', '%s', '%s' ) " ,
$board [ 'id' ],
2010-11-04 07:58:51 -04:00
$post [ 'thread' ],
$post [ 'subject' ],
$post [ 'email' ],
$post [ 'name' ],
$post [ 'trip' ],
$post [ 'body' ],
time (),
time (),
$post [ 'has_file' ] ? $post [ 'thumb' ] : null ,
$post [ 'has_file' ] ? $post [ 'thumbwidth' ] : null ,
$post [ 'has_file' ] ? $post [ 'thumbheight' ] : null ,
$post [ 'has_file' ] ? $post [ 'file' ] : null ,
$post [ 'has_file' ] ? $post [ 'width' ] : null ,
$post [ 'has_file' ] ? $post [ 'height' ] : null ,
$post [ 'has_file' ] ? $post [ 'filesize' ] : null ,
$post [ 'has_file' ] ? $post [ 'filename' ] : null ,
$post [ 'has_file' ] ? $post [ 'filehash' ] : null ,
$post [ 'password' ],
mysql_real_escape_string ( $_SERVER [ 'REMOTE_ADDR' ])
), $sql ) or error ( mysql_error ( $sql ));
return mysql_insert_id ( $sql );
}
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
function index ( $page ) {
global $sql , $board ;
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$body = '' ;
$offset = round ( $page * THREADS_PER_PAGE - THREADS_PER_PAGE );
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
sql_open ();
2010-11-30 03:57:32 -05:00
$query = mysql_query ( sprintf (
" SELECT * FROM `posts` WHERE `thread` IS NULL AND `board` = '%d' ORDER BY `bump` DESC LIMIT %d,%d " ,
$board [ 'id' ],
$offset ,
THREADS_PER_PAGE
), $sql ) or error ( mysql_error ( $sql ));
2010-11-02 06:57:33 -04:00
if ( mysql_num_rows ( $query ) < 1 && $page > 1 ) return false ;
while ( $th = mysql_fetch_array ( $query )) {
$thread = new Thread ( $th [ 'id' ], $th [ 'subject' ], $th [ 'email' ], $th [ 'name' ], $th [ 'trip' ], $th [ 'body' ], $th [ 'time' ], $th [ 'thumb' ], $th [ 'thumbwidth' ], $th [ 'thumbheight' ], $th [ 'file' ], $th [ 'filewidth' ], $th [ 'fileheight' ], $th [ 'filesize' ], $th [ 'filename' ]);
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$newposts = mysql_query ( sprintf (
2010-11-30 06:59:24 -05:00
" SELECT `id`, `subject`, `email`, `name`, `trip`, `body`, `time`, `thumb`, `thumbwidth`, `thumbheight`, `file`, `filewidth`, `fileheight`, `filesize`, `filename` FROM `posts` WHERE `board` = '%d' AND `thread` = '%s' ORDER BY `time` DESC LIMIT %d " ,
$board [ 'id' ],
2010-11-30 03:57:32 -05:00
$th [ 'id' ],
THREADS_PREVIEW
2010-11-02 06:57:33 -04:00
), $sql ) or error ( mysql_error ( $sql ));
if ( mysql_num_rows ( $newposts ) == THREADS_PREVIEW ) {
$count_query = mysql_query ( sprintf (
2010-11-30 06:59:24 -05:00
" SELECT COUNT(`id`) as `num` FROM `posts` WHERE `board` = '%d' AND `thread` = '%s' " ,
$board [ 'id' ],
$th [ 'id' ]
2010-11-02 06:57:33 -04:00
), $sql ) or error ( mysql_error ( $sql ));
$count = mysql_fetch_array ( $count_query );
$omitted = $count [ 'num' ] - THREADS_PREVIEW ;
$thread -> omitted = $omitted ;
mysql_free_result ( $count_query );
unset ( $count );
unset ( $omitted );
}
while ( $po = mysql_fetch_array ( $newposts )) {
$thread -> add ( new Post ( $po [ 'id' ], $th [ 'id' ], $po [ 'subject' ], $po [ 'email' ], $po [ 'name' ], $po [ 'trip' ], $po [ 'body' ], $po [ 'time' ], $po [ 'thumb' ], $po [ 'thumbwidth' ], $po [ 'thumbheight' ], $po [ 'file' ], $po [ 'filewidth' ], $po [ 'fileheight' ], $po [ 'filesize' ], $po [ 'filename' ]));
}
mysql_free_result ( $newposts );
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$thread -> posts = array_reverse ( $thread -> posts );
$body .= $thread -> build ( true );
}
mysql_free_result ( $query );
return Array ( 'button' => BUTTON_NEWTOPIC , 'board' => $board , 'body' => $body , 'post_url' => POST_URL , 'index' => ROOT );
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
function buildIndex () {
2010-11-30 03:57:32 -05:00
global $sql , $board ;
2010-11-02 06:57:33 -04:00
sql_open ();
2010-11-04 10:39:02 -04:00
2010-11-30 06:59:24 -05:00
$res = mysql_query ( sprintf (
" SELECT COUNT(`id`) as `num` FROM `posts` WHERE `board` = '%d' AND `thread` IS NULL " ,
$board [ 'id' ]
), $sql ) or error ( mysql_error ( $sql ));
2010-11-02 06:57:33 -04:00
$arr = mysql_fetch_array ( $res );
2010-11-03 04:16:21 -04:00
$count = floor (( THREADS_PER_PAGE + $arr [ 'num' ] - 1 ) / THREADS_PER_PAGE );
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$pages = Array ();
2010-11-03 04:14:59 -04:00
for ( $x = 0 ; $x < $count && $x < MAX_PAGES ; $x ++ ) {
2010-11-30 04:00:48 -05:00
$pages [] = Array ( 'num' => $x + 1 , 'link' => $x == 0 ? ROOT . $board [ 'dir' ] . FILE_INDEX : ROOT . $board [ 'dir' ] . sprintf ( FILE_PAGE , $x + 1 ));
2010-11-03 04:14:59 -04:00
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
mysql_free_result ( $res );
unset ( $arr );
unset ( $count );
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$page = 1 ;
while ( $page <= MAX_PAGES && $content = index ( $page )) {
2010-11-30 03:57:32 -05:00
$filename = $board [ 'dir' ] . ( $page == 1 ? FILE_INDEX : sprintf ( FILE_PAGE , $page ));
2010-11-02 07:54:08 -04:00
if ( file_exists ( $filename )) $md5 = md5_file ( $filename );
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$content [ 'pages' ] = $pages ;
2010-11-02 07:58:19 -04:00
@ file_put_contents ( $filename , Element ( 'index.html' , $content )) or error ( " Couldn't write to file. " );
2010-11-30 03:57:32 -05:00
2010-11-02 07:54:08 -04:00
if ( isset ( $md5 ) && $md5 == md5_file ( $filename )) {
2010-11-02 06:57:33 -04:00
break ;
}
$page ++ ;
}
if ( $page < MAX_PAGES ) {
for (; $page <= MAX_PAGES ; $page ++ ) {
$filename = $page == 1 ? FILE_INDEX : sprintf ( FILE_PAGE , $page );
2010-11-02 07:54:08 -04:00
@ unlink ( $filename );
2010-11-02 06:57:33 -04:00
}
}
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
function markup ( & $body ) {
global $sql ;
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
if ( AUTO_UNICODE ) {
$body = str_replace ( '...' , '…' , $body );
$body = str_replace ( '<--' , '←' , $body );
2010-11-05 12:11:42 -04:00
// En and em- dashes are rendered exactly the same in
// most monospace fonts (they look the same in code
// editors).
$body = str_replace ( '---' , '—' , $body ); // em dash
2010-11-05 13:37:11 -04:00
$body = str_replace ( '--' , '– ' , $body ); // en dash
2010-11-02 06:57:33 -04:00
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$body = utf8tohtml ( $body , true );
2010-11-04 10:39:02 -04:00
2010-11-04 03:22:57 -04:00
// Cites
if ( preg_match_all ( '/(^|\s)>>([0-9]+?)(\s|$)/' , $body , $cites )) {
$previousPosition = 0 ;
$temp = '' ;
2010-11-02 06:57:33 -04:00
sql_open ();
2010-11-04 03:22:57 -04:00
for ( $index = 0 ; $index < count ( $cites [ 0 ]); $index ++ ) {
$cite = $cites [ 2 ][ $index ];
$whitespace = Array (
strlen ( $cites [ 1 ][ $index ]),
strlen ( $cites [ 3 ][ $index ]),
);
2010-11-04 10:39:02 -04:00
2010-11-30 06:59:24 -05:00
$result = mysql_query ( sprintf (
" SELECT `thread`,`id` FROM `posts` WHERE `board` = '%d' AND `id` = '%d' LIMIT 1 " ,
$board [ 'id' ],
$cite
), $sql ) or error ( mysql_error ( $sql ));
2010-11-04 03:22:57 -04:00
if ( $post = mysql_fetch_array ( $result )) {
2010-11-30 03:57:32 -05:00
$replacement = '<a onclick="highlightReply(\'' . $cite . '\');" href="' . ROOT . $board [ 'dir' ] . DIR_RES . ( $post [ 'thread' ] ? $post [ 'thread' ] : $post [ 'id' ]) . '.html#' . $cite . '">>>' . $cite . '</a>' ;
2010-11-04 03:22:57 -04:00
} else {
$replacement = " >> { $cite } " ;
}
mysql_free_result ( $result );
2010-11-04 10:39:02 -04:00
2010-11-04 03:22:57 -04:00
// Find the position of the cite
$position = strpos ( $body , $cites [ 0 ][ $index ]);
// Replace the found string with "xxxx[...]". (allows duplicate tags). Keeps whitespace.
$body = substr_replace ( $body , str_repeat ( 'x' , strlen ( $cites [ 0 ][ $index ]) - $whitespace [ 0 ] - $whitespace [ 1 ]), $position + $whitespace [ 0 ], strlen ( $cites [ 0 ][ $index ]) - $whitespace [ 0 ] - $whitespace [ 1 ]);
2010-11-04 10:39:02 -04:00
2010-11-04 03:22:57 -04:00
$temp .= substr ( $body , $previousPosition , $position - $previousPosition ) . $cites [ 1 ][ $index ] . $replacement . $cites [ 3 ][ $index ];
$previousPosition = $position + strlen ( $cites [ 0 ][ $index ]);
2010-11-02 06:57:33 -04:00
}
2010-11-04 03:25:23 -04:00
// The rest
$temp .= substr ( $body , $previousPosition );
2010-11-04 10:39:02 -04:00
2010-11-04 03:22:57 -04:00
$body = $temp ;
2010-11-02 06:57:33 -04:00
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$body = str_replace ( " \r " , '' , $body );
2010-11-04 10:39:02 -04:00
2010-11-03 05:44:51 -04:00
if ( MARKUP_URLS )
$body = preg_replace ( URL_REGEX , " <a href= \" $ 0 \" > $ 0</a> " , $body );
2010-11-02 06:57:33 -04:00
$body = preg_replace ( " /(^| \n )([ \ s]+)?(>)([^ \n ]+)?( $ | \n )/m " , '$1$2<span class="quote">$3$4</span>$5' , $body );
2010-11-26 04:41:35 -05:00
if ( WIKI_MARKUP ) {
$body = preg_replace ( " /(^| \n )==(.+?)== \n ?/m " , " <h2> $ 2</h2> " , $body );
$body = preg_replace ( " /'''(.+?)'''/m " , " <strong> $ 1</strong> " , $body );
$body = preg_replace ( " /''(.+?)''/m " , " <em> $ 1</em> " , $body );
}
2010-11-02 06:57:33 -04:00
$body = preg_replace ( " / \n / " , '<br/>' , $body );
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
function utf8tohtml ( $utf8 , $encodeTags = true ) {
$result = '' ;
for ( $i = 0 ; $i < strlen ( $utf8 ); $i ++ ) {
$char = $utf8 [ $i ];
$ascii = ord ( $char );
if ( $ascii < 128 ) {
// one-byte character
$result .= ( $encodeTags ) ? htmlentities ( $char ) : $char ;
} else if ( $ascii < 192 ) {
// non-utf8 character or not a start byte
} else if ( $ascii < 224 ) {
// two-byte character
$result .= htmlentities ( substr ( $utf8 , $i , 2 ), ENT_QUOTES , 'UTF-8' );
$i ++ ;
} else if ( $ascii < 240 ) {
// three-byte character
$ascii1 = ord ( $utf8 [ $i + 1 ]);
$ascii2 = ord ( $utf8 [ $i + 2 ]);
$unicode = ( 15 & $ascii ) * 4096 +
( 63 & $ascii1 ) * 64 +
( 63 & $ascii2 );
$result .= " &# $unicode ; " ;
$i += 2 ;
} else if ( $ascii < 248 ) {
// four-byte character
$ascii1 = ord ( $utf8 [ $i + 1 ]);
$ascii2 = ord ( $utf8 [ $i + 2 ]);
$ascii3 = ord ( $utf8 [ $i + 3 ]);
$unicode = ( 15 & $ascii ) * 262144 +
( 63 & $ascii1 ) * 4096 +
( 63 & $ascii2 ) * 64 +
( 63 & $ascii3 );
$result .= " &# $unicode ; " ;
$i += 3 ;
}
}
return $result ;
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
function buildThread ( $id ) {
global $sql , $board ;
$id = round ( $id );
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$query = mysql_query ( sprintf (
2010-11-30 06:59:24 -05:00
" SELECT `id`,`thread`,`subject`,`name`,`email`,`trip`,`body`,`time`,`thumb`,`thumbwidth`,`thumbheight`,`file`,`filewidth`,`fileheight`,`filesize`,`filename` FROM `posts` WHERE `board` = '%d' AND ((`thread` IS NULL AND `id` = '%s') OR `thread` = '%s') ORDER BY `thread`,`time` " ,
$board [ 'id' ],
$id ,
$id
2010-11-02 06:57:33 -04:00
), $sql ) or error ( mysql_error ( $sql ));
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
while ( $post = mysql_fetch_array ( $query )) {
if ( ! isset ( $thread )) {
$thread = new Thread ( $post [ 'id' ], $post [ 'subject' ], $post [ 'email' ], $post [ 'name' ], $post [ 'trip' ], $post [ 'body' ], $post [ 'time' ], $post [ 'thumb' ], $post [ 'thumbwidth' ], $post [ 'thumbheight' ], $post [ 'file' ], $post [ 'filewidth' ], $post [ 'fileheight' ], $post [ 'filesize' ], $post [ 'filename' ], false );
} else {
$thread -> add ( new Post ( $post [ 'id' ], $thread -> id , $post [ 'subject' ], $post [ 'email' ], $post [ 'name' ], $post [ 'trip' ], $post [ 'body' ], $post [ 'time' ], $post [ 'thumb' ], $post [ 'thumbwidth' ], $post [ 'thumbheight' ], $post [ 'file' ], $post [ 'filewidth' ], $post [ 'fileheight' ], $post [ 'filesize' ], $post [ 'filename' ]));
}
2010-11-30 03:57:32 -05:00
@ file_put_contents ( $board [ 'dir' ] . DIR_RES . $id . '.html' , Element ( 'thread.html' , Array ( 'button' => BUTTON_REPLY , 'board' => $board , 'body' => $thread -> build (), 'post_url' => POST_URL , 'index' => ROOT , 'id' => $id ))) or error ( " Couldn't write to file. " );
2010-11-02 06:57:33 -04:00
}
mysql_free_result ( $query );
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
// A lot of the bellow of from BBSchan (An old project by savetheinternet)
function generate_tripcode ( $name , $length = 10 ) {
$name = stripslashes ( $name );
$t = explode ( '#' , $name );
$nameo = $t [ 0 ];
if ( isset ( $t [ 1 ] ) || isset ( $t [ 2 ] ) ) {
$trip = ( ( strlen ( $t [ 1 ] ) > 0 ) ? $t [ 1 ] : $t [ 2 ] );
if ( ( function_exists ( 'mb_convert_encoding' ) ) ) {
# mb_substitute_character('none');
$recoded_cap = mb_convert_encoding ( $trip , 'Shift_JIS' , 'UTF-8' );
}
$trip = ( ( ! empty ( $recoded_cap ) ) ? $recoded_cap : $trip );
$salt = substr ( $trip . 'H.' , 1 , 2 );
$salt = preg_replace ( '/[^\.-z]/' , '.' , $salt );
$salt = strtr ( $salt , ':;<=>?@[\]^_`' , 'ABCDEFGabcdef' );
if ( isset ( $t [ 2 ] ) ) {
// secure
$trip = '!!' . substr ( crypt ( $trip , '@#$%^&*()' ), ( - 1 * $length ) );
} else {
// insecure
$trip = '!' . substr ( crypt ( $trip , $salt ), ( - 1 * $length ) );
}
}
if ( isset ( $trip ) ) {
return array ( $nameo , $trip );
} else {
return array ( $nameo );
}
}
2010-11-04 10:39:02 -04:00
2010-11-04 00:40:39 -04:00
// Highest common factor
function hcf ( $a , $b ){
$gcd = 1 ;
if ( $a > $b ) {
$a = $a + $b ;
$b = $a - $b ;
$a = $a - $b ;
}
if ( $b == ( round ( $b / $a )) * $a )
$gcd = $a ;
else {
for ( $i = round ( $a / 2 ); $i ; $i -- ) {
if ( $a == round ( $a / $i ) * $i && $b == round ( $b / $i ) * $i ) {
$gcd = $i ;
$i = false ;
}
}
}
return $gcd ;
}
2010-11-03 12:10:47 -04:00
function fraction ( $numerator , $denominator , $sep ) {
2010-11-04 00:40:39 -04:00
$gcf = hcf ( $numerator , $denominator );
$numerator = $numerator / $gcf ;
$denominator = $denominator / $gcf ;
2010-11-04 10:39:02 -04:00
2010-11-04 00:40:39 -04:00
return " { $numerator } { $sep } { $denominator } " ;
2010-11-03 12:10:47 -04:00
}
2010-11-02 06:57:33 -04:00
/*********************************************/
/* Fonction: imagecreatefrombmp */
/* Author: DHKold */
/* Contact: admin@dhkold.com */
/* Date: The 15th of June 2005 */
/* Version: 2.0B */
/*********************************************/
function imagecreatefrombmp ( $filename ) {
if ( ! $f1 = fopen ( $filename , " rb " )) return FALSE ;
$FILE = unpack ( " vfile_type/Vfile_size/Vreserved/Vbitmap_offset " , fread ( $f1 , 14 ));
if ( $FILE [ 'file_type' ] != 19778 ) return FALSE ;
$BMP = unpack ( 'Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel' .
'/Vcompression/Vsize_bitmap/Vhoriz_resolution' .
'/Vvert_resolution/Vcolors_used/Vcolors_important' , fread ( $f1 , 40 ));
$BMP [ 'colors' ] = pow ( 2 , $BMP [ 'bits_per_pixel' ]);
if ( $BMP [ 'size_bitmap' ] == 0 ) $BMP [ 'size_bitmap' ] = $FILE [ 'file_size' ] - $FILE [ 'bitmap_offset' ];
$BMP [ 'bytes_per_pixel' ] = $BMP [ 'bits_per_pixel' ] / 8 ;
$BMP [ 'bytes_per_pixel2' ] = ceil ( $BMP [ 'bytes_per_pixel' ]);
$BMP [ 'decal' ] = ( $BMP [ 'width' ] * $BMP [ 'bytes_per_pixel' ] / 4 );
$BMP [ 'decal' ] -= floor ( $BMP [ 'width' ] * $BMP [ 'bytes_per_pixel' ] / 4 );
$BMP [ 'decal' ] = 4 - ( 4 * $BMP [ 'decal' ]);
if ( $BMP [ 'decal' ] == 4 ) $BMP [ 'decal' ] = 0 ;
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$PALETTE = array ();
if ( $BMP [ 'colors' ] < 16777216 )
{
$PALETTE = unpack ( 'V' . $BMP [ 'colors' ], fread ( $f1 , $BMP [ 'colors' ] * 4 ));
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$IMG = fread ( $f1 , $BMP [ 'size_bitmap' ]);
$VIDE = chr ( 0 );
$res = imagecreatetruecolor ( $BMP [ 'width' ], $BMP [ 'height' ]);
$P = 0 ;
$Y = $BMP [ 'height' ] - 1 ;
while ( $Y >= 0 )
{
$X = 0 ;
while ( $X < $BMP [ 'width' ])
{
if ( $BMP [ 'bits_per_pixel' ] == 24 )
$COLOR = unpack ( " V " , substr ( $IMG , $P , 3 ) . $VIDE );
elseif ( $BMP [ 'bits_per_pixel' ] == 16 )
{
$COLOR = unpack ( " n " , substr ( $IMG , $P , 2 ));
$COLOR [ 1 ] = $PALETTE [ $COLOR [ 1 ] + 1 ];
}
elseif ( $BMP [ 'bits_per_pixel' ] == 8 )
{
$COLOR = unpack ( " n " , $VIDE . substr ( $IMG , $P , 1 ));
$COLOR [ 1 ] = $PALETTE [ $COLOR [ 1 ] + 1 ];
}
elseif ( $BMP [ 'bits_per_pixel' ] == 4 )
{
$COLOR = unpack ( " n " , $VIDE . substr ( $IMG , floor ( $P ), 1 ));
if (( $P * 2 ) % 2 == 0 ) $COLOR [ 1 ] = ( $COLOR [ 1 ] >> 4 ) ; else $COLOR [ 1 ] = ( $COLOR [ 1 ] & 0x0F );
$COLOR [ 1 ] = $PALETTE [ $COLOR [ 1 ] + 1 ];
}
elseif ( $BMP [ 'bits_per_pixel' ] == 1 )
{
$COLOR = unpack ( " n " , $VIDE . substr ( $IMG , floor ( $P ), 1 ));
if (( $P * 8 ) % 8 == 0 ) $COLOR [ 1 ] = $COLOR [ 1 ] >> 7 ;
elseif (( $P * 8 ) % 8 == 1 ) $COLOR [ 1 ] = ( $COLOR [ 1 ] & 0x40 ) >> 6 ;
elseif (( $P * 8 ) % 8 == 2 ) $COLOR [ 1 ] = ( $COLOR [ 1 ] & 0x20 ) >> 5 ;
elseif (( $P * 8 ) % 8 == 3 ) $COLOR [ 1 ] = ( $COLOR [ 1 ] & 0x10 ) >> 4 ;
elseif (( $P * 8 ) % 8 == 4 ) $COLOR [ 1 ] = ( $COLOR [ 1 ] & 0x8 ) >> 3 ;
elseif (( $P * 8 ) % 8 == 5 ) $COLOR [ 1 ] = ( $COLOR [ 1 ] & 0x4 ) >> 2 ;
elseif (( $P * 8 ) % 8 == 6 ) $COLOR [ 1 ] = ( $COLOR [ 1 ] & 0x2 ) >> 1 ;
elseif (( $P * 8 ) % 8 == 7 ) $COLOR [ 1 ] = ( $COLOR [ 1 ] & 0x1 );
$COLOR [ 1 ] = $PALETTE [ $COLOR [ 1 ] + 1 ];
}
else
return FALSE ;
imagesetpixel ( $res , $X , $Y , $COLOR [ 1 ]);
$X ++ ;
$P += $BMP [ 'bytes_per_pixel' ];
}
$Y -- ;
$P += $BMP [ 'decal' ];
}
fclose ( $f1 );
return $res ;
}
2010-11-03 08:37:28 -04:00
function createimage ( $type , $source_pic ) {
2010-11-04 05:01:20 -04:00
$image = false ;
2010-11-02 06:57:33 -04:00
switch ( $type ) {
case 'jpg' :
case 'jpeg' :
2010-11-04 05:01:20 -04:00
if ( ! $image = @ imagecreatefromjpeg ( $source_pic )) {
unlink ( $source_pic );
error ( ERR_INVALIDIMG );
}
2010-11-02 06:57:33 -04:00
break ;
case 'png' :
2010-11-04 05:01:20 -04:00
if ( ! $image = @ imagecreatefrompng ( $source_pic )) {
unlink ( $source_pic );
error ( ERR_INVALIDIMG );
}
2010-11-02 06:57:33 -04:00
break ;
case 'gif' :
2010-11-04 05:01:20 -04:00
if ( ! $image = @ imagecreatefromgif ( $source_pic )) {
unlink ( $source_pic );
error ( ERR_INVALIDIMG );
}
2010-11-02 06:57:33 -04:00
break ;
case 'bmp' :
2010-11-04 05:01:20 -04:00
if ( ! $image = @ imagecreatefrombmp ( $source_pic )) {
unlink ( $source_pic );
error ( ERR_INVALIDIMG );
}
2010-11-02 06:57:33 -04:00
break ;
default :
error ( 'Unknwon file extension.' );
}
2010-11-04 05:01:20 -04:00
return $image ;
2010-11-03 08:37:28 -04:00
}
2010-11-04 10:39:02 -04:00
2010-11-03 08:37:28 -04:00
function resize ( $src , $width , $height , $destination_pic , $max_width , $max_height ) {
$return = Array ();
2010-11-02 06:57:33 -04:00
$x_ratio = $max_width / $width ;
$y_ratio = $max_height / $height ;
if (( $width <= $max_width ) && ( $height <= $max_height )) {
$tn_width = $width ;
$tn_height = $height ;
} elseif (( $x_ratio * $height ) < $max_height ) {
$tn_height = ceil ( $x_ratio * $height );
$tn_width = $max_width ;
} else {
$tn_width = ceil ( $y_ratio * $width );
$tn_height = $max_height ;
}
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
$return [ 'width' ] = $tn_width ;
$return [ 'height' ] = $tn_height ;
2010-11-04 10:39:02 -04:00
2010-11-02 09:08:03 -04:00
$tmp = imagecreatetruecolor ( $tn_width , $tn_height );
imagecolortransparent ( $tmp , imagecolorallocatealpha ( $tmp , 0 , 0 , 0 , 0 ));
imagealphablending ( $tmp , false );
imagesavealpha ( $tmp , true );
2010-11-04 10:39:02 -04:00
2010-11-02 09:08:03 -04:00
imagecopyresampled ( $tmp , $src , 0 , 0 , 0 , 0 , $tn_width , $tn_height , $width , $height );
2010-11-04 10:39:02 -04:00
2010-11-02 09:08:03 -04:00
imagepng ( $tmp , $destination_pic , 4 );
2010-11-02 06:57:33 -04:00
imagedestroy ( $src );
imagedestroy ( $tmp );
2010-11-04 10:39:02 -04:00
2010-11-02 06:57:33 -04:00
return $return ;
}
2010-11-04 10:39:02 -04:00
2010-11-04 04:40:51 -04:00
function imagebmp ( & $img , $filename = '' ) {
$widthOrig = imagesx ( $img );
$widthFloor = (( floor ( $widthOrig / 16 )) * 16 );
$widthCeil = (( ceil ( $widthOrig / 16 )) * 16 );
$height = imagesy ( $img );
2010-11-04 10:39:02 -04:00
2010-11-04 04:40:51 -04:00
$size = ( $widthCeil * $height * 3 ) + 54 ;
2010-11-04 10:39:02 -04:00
2010-11-04 04:40:51 -04:00
// Bitmap File Header
$result = 'BM' ; // header (2b)
$result .= int_to_dword ( $size ); // size of file (4b)
$result .= int_to_dword ( 0 ); // reserved (4b)
$result .= int_to_dword ( 54 ); // byte location in the file which is first byte of IMAGE (4b)
// Bitmap Info Header
$result .= int_to_dword ( 40 ); // Size of BITMAPINFOHEADER (4b)
$result .= int_to_dword ( $widthCeil ); // width of bitmap (4b)
$result .= int_to_dword ( $height ); // height of bitmap (4b)
$result .= int_to_word ( 1 ); // biPlanes = 1 (2b)
$result .= int_to_word ( 24 ); // biBitCount = {1 (mono) or 4 (16 clr ) or 8 (256 clr) or 24 (16 Mil)} (2b
$result .= int_to_dword ( 0 ); // RLE COMPRESSION (4b)
$result .= int_to_dword ( 0 ); // width x height (4b)
$result .= int_to_dword ( 0 ); // biXPelsPerMeter (4b)
$result .= int_to_dword ( 0 ); // biYPelsPerMeter (4b)
$result .= int_to_dword ( 0 ); // Number of palettes used (4b)
$result .= int_to_dword ( 0 ); // Number of important colour (4b)
2010-11-04 10:39:02 -04:00
2010-11-04 04:40:51 -04:00
// is faster than chr()
$arrChr = array ();
for ( $i = 0 ; $i < 256 ; $i ++ ){
$arrChr [ $i ] = chr ( $i );
}
2010-11-04 10:39:02 -04:00
2010-11-04 04:40:51 -04:00
// creates image data
$bgfillcolor = array ( 'red' => 0 , 'green' => 0 , 'blue' => 0 );
2010-11-04 10:39:02 -04:00
2010-11-04 04:40:51 -04:00
// bottom to top - left to right - attention blue green red !!!
$y = $height - 1 ;
for ( $y2 = 0 ; $y2 < $height ; $y2 ++ ) {
for ( $x = 0 ; $x < $widthFloor ; ) {
$rgb = imagecolorsforindex ( $img , imagecolorat ( $img , $x ++ , $y ));
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
$rgb = imagecolorsforindex ( $img , imagecolorat ( $img , $x ++ , $y ));
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
$rgb = imagecolorsforindex ( $img , imagecolorat ( $img , $x ++ , $y ));
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
$rgb = imagecolorsforindex ( $img , imagecolorat ( $img , $x ++ , $y ));
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
$rgb = imagecolorsforindex ( $img , imagecolorat ( $img , $x ++ , $y ));
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
$rgb = imagecolorsforindex ( $img , imagecolorat ( $img , $x ++ , $y ));
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
$rgb = imagecolorsforindex ( $img , imagecolorat ( $img , $x ++ , $y ));
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
$rgb = imagecolorsforindex ( $img , imagecolorat ( $img , $x ++ , $y ));
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
}
for ( $x = $widthFloor ; $x < $widthCeil ; $x ++ ) {
$rgb = ( $x < $widthOrig ) ? imagecolorsforindex ( $img , imagecolorat ( $img , $x , $y )) : $bgfillcolor ;
$result .= $arrChr [ $rgb [ 'blue' ]] . $arrChr [ $rgb [ 'green' ]] . $arrChr [ $rgb [ 'red' ]];
}
$y -- ;
}
2010-11-04 10:39:02 -04:00
2010-11-04 04:40:51 -04:00
// see imagegif
if ( $filename == '' ) {
echo $result ;
} else {
$file = fopen ( $filename , 'wb' );
fwrite ( $file , $result );
fclose ( $file );
}
}
// imagebmp helpers
2010-11-04 05:01:20 -04:00
function int_to_dword ( $n ) {
2010-11-04 04:40:51 -04:00
return chr ( $n & 255 ) . chr (( $n >> 8 ) & 255 ) . chr (( $n >> 16 ) & 255 ) . chr (( $n >> 24 ) & 255 );
}
2010-11-04 05:01:20 -04:00
function int_to_word ( $n ) {
2010-11-04 04:40:51 -04:00
return chr ( $n & 255 ) . chr (( $n >> 8 ) & 255 );
}
2010-11-15 08:34:39 -05:00
?>