Difference between revisions of "C.php"
m |
m |
||
Line 1: | Line 1: | ||
<? | <? | ||
# SWF Compiler for XmlWiki Environment | # SWF Compiler for XmlWiki Environment | ||
− | $article = "test"; | + | |
+ | $server = $_SERVER['HTTP_HOST']; | ||
+ | $htdocs = $_SERVER['DOCUMENT_ROOT']; | ||
+ | if ( !ereg( "\\/$", $htdocs ) ) $htdocs .= '/'; | ||
+ | |||
+ | # if format is embed, just convert the content to an object-tag referring to raw-compiled-swf | ||
+ | if ( $format == 'embed' ) { | ||
+ | $article = "test"; | ||
+ | } | ||
+ | |||
+ | else { | ||
+ | |||
+ | # Compile the script into a binary SWF | ||
+ | # - also builds hard wired common vector shapes (later converted to Ming from SVG) | ||
+ | |||
+ | # Check weather required extentions are available (GD2 and Ming) | ||
+ | $ext = get_loaded_extensions(); | ||
+ | if ( !in_array( 'ming', $ext ) ) xwMessage( 'Ming extention not loaded! (at least version 0.3 required)', 'red' ); | ||
+ | |||
+ | ming_useswfversion( $version ); | ||
+ | global $lib, $swf; | ||
+ | $lib = array(); | ||
+ | $swf = new SWFMovie(); | ||
+ | $swf->setDimension( $width, $height ); | ||
+ | eregi( '^#?([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$' , $background, $m ); | ||
+ | list(,$r,$g,$b) = $m; | ||
+ | $swf->setBackground( hexdec($r), hexdec($g), hexdec($b) ); | ||
+ | $swf->setRate( $fps ); | ||
+ | xwMessage( "SWF movie created from \"$title\": $width"." x $height @ $fps".'fps' ); | ||
+ | |||
+ | # Don't redeclare (happens if more than one compile on same page) | ||
+ | if ( !isset( $GLOBALS[$tTitle] ) ) { | ||
+ | |||
+ | $GLOBALS[$tTitle] = true; | ||
+ | |||
+ | # Make symbol library available at runtime in library array | ||
+ | function libAdd( $item, $name ) { | ||
+ | global $lib, $swf; | ||
+ | $sym = new SWFSprite(); | ||
+ | $sym->add( $item ); | ||
+ | $sym->nextFrame(); | ||
+ | $swf->addExport( $sym, $lib[] = $name ); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | # Import images | ||
+ | foreach ( xwGetListByTagname( $properties, 'import', $import ) as $image ) { | ||
+ | $ref = strtolower( trim( ereg_replace( '^.*/', '', $image ) ) ); | ||
+ | $ref = ereg_replace( '\\..+$', '', $ref ); | ||
+ | $w = $htdocs.'wiki'; | ||
+ | shell_exec( "$w/png2dbl $htdocs$image $w/$ref.dbl" ); | ||
+ | # investigate creating a unix level pipe and reading a la /dev | ||
+ | #$img = new SWFBitmap( popen( "$w/png2dbl $w$image $w/stream.dbl", 'rb' ) ); | ||
+ | $img = new SWFBitmap( fopen( "$w/$ref.dbl", 'rb' ) ); | ||
+ | libAdd( $img, $ref ); | ||
+ | } | ||
+ | |||
+ | $grad = new SWFGradient(); | ||
+ | for ( $n = 0; $n <= 10; $n++ ) { | ||
+ | $i = ( 2 - log( $n + 1 ) * 0.95 ) * 125; | ||
+ | if ( $i > 255 ) $i = 255; else if ( $i < 0 ) $i = 0; | ||
+ | $grad->addEntry( $n / 10, 255, 255, 255, $i ); | ||
+ | } | ||
+ | $shape = new SWFShape(); | ||
+ | $fill = $shape->addFill( $grad, SWFFILL_RADIAL_GRADIENT ); | ||
+ | $fill->scaleTo( 0.17 ); | ||
+ | $shape->setRightFill( $fill ); | ||
+ | $shape->drawCircle( 100 ); | ||
+ | libAdd( $shape, 'star' ); | ||
+ | |||
+ | # Add compile.as common code | ||
+ | $article = xwArticleContent( 'compile.as' ).$article; | ||
+ | |||
+ | # Write exports and make all available at runtime in library array | ||
+ | $swf->writeExports(); | ||
+ | $article = 'library=array("'.join( '","', $lib )."\");\n$article"; | ||
+ | if ( count( $lib ) ) xwMessage( 'Pre-compiled symbols: "'.join( '", "', $lib ).'"' ); | ||
+ | |||
+ | # Flashvars aren't working just compile assignments into script for now | ||
+ | foreach( split( '&', $flashvars ) as $var ) | ||
+ | if ( ereg( '^(.+)=(.+)$', $var, $m ) ) | ||
+ | $article = "$m[1]='$m[2]';\n$article"; | ||
+ | |||
+ | # Replace #Include statements with content | ||
+ | $includes = array(); | ||
+ | $more = true; | ||
+ | while ( $more ) { | ||
+ | $more = count( $includes ); | ||
+ | $article = preg_replace( | ||
+ | '/^\\s*#include\\s+[\'"](.+?)[\'"].*?$/emi', | ||
+ | 'xwArticleContent($includes["$1"]="$1",true);', | ||
+ | $article ); | ||
+ | $more = count( $includes ) > $more; | ||
+ | } | ||
+ | if ( count( $includes ) ) xwMessage( 'Included articles: "'.join( '", "', array_keys( $includes ) ).'"' ); | ||
+ | |||
+ | # Fix the ^= operator which doesn't work in Ming but does in Flash | ||
+ | $article = preg_replace( '/([a-z_]+[a-z_0-9.]+)\\s*\\^=/i', '$1=$1^', $article ); | ||
+ | |||
+ | # Add actionscript in frames 1-3 | ||
+ | $swf->add( new SWFAction( $article ) ); | ||
+ | $swf->nextFrame(); | ||
+ | $swf->add( new SWFAction( 'internal_reduce();' ) ); | ||
+ | $swf->nextFrame(); | ||
+ | $swf->add( new SWFAction( 'gotoAndPlay(2);' ) ); | ||
+ | $swf->nextFrame(); | ||
+ | |||
+ | if ( $format == 'raw' ) { | ||
+ | # Send the raw SWF back to the client and die | ||
+ | ob_end_clean(); | ||
+ | header( 'Content-Type: application/x-shockwave-flash' ); | ||
+ | $swf->output(9); | ||
+ | die(); | ||
+ | } | ||
+ | else { | ||
+ | # Write the SWF to $url and render a link to it | ||
+ | |||
+ | $swf->save( "$htdocs$url" ,9 ); | ||
+ | $article = "\n[[$title]] successfully compiled to [http://$server/$url $server/$url]\n"; | ||
+ | } | ||
+ | |||
+ | } | ||
?> | ?> |
Revision as of 01:44, 23 June 2006
<?
- SWF Compiler for XmlWiki Environment
$server = $_SERVER['HTTP_HOST']; $htdocs = $_SERVER['DOCUMENT_ROOT']; if ( !ereg( "\\/$", $htdocs ) ) $htdocs .= '/';
- if format is embed, just convert the content to an object-tag referring to raw-compiled-swf
if ( $format == 'embed' ) { $article = "test"; }
else {
- Compile the script into a binary SWF
- - also builds hard wired common vector shapes (later converted to Ming from SVG)
- Check weather required extentions are available (GD2 and Ming)
$ext = get_loaded_extensions(); if ( !in_array( 'ming', $ext ) ) xwMessage( 'Ming extention not loaded! (at least version 0.3 required)', 'red' );
ming_useswfversion( $version ); global $lib, $swf; $lib = array(); $swf = new SWFMovie(); $swf->setDimension( $width, $height ); eregi( '^#?([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$' , $background, $m ); list(,$r,$g,$b) = $m; $swf->setBackground( hexdec($r), hexdec($g), hexdec($b) ); $swf->setRate( $fps ); xwMessage( "SWF movie created from \"$title\": $width"." x $height @ $fps".'fps' );
- Don't redeclare (happens if more than one compile on same page)
if ( !isset( $GLOBALS[$tTitle] ) ) {
$GLOBALS[$tTitle] = true;
# Make symbol library available at runtime in library array function libAdd( $item, $name ) { global $lib, $swf; $sym = new SWFSprite(); $sym->add( $item ); $sym->nextFrame(); $swf->addExport( $sym, $lib[] = $name ); }
}
- Import images
foreach ( xwGetListByTagname( $properties, 'import', $import ) as $image ) { $ref = strtolower( trim( ereg_replace( '^.*/', , $image ) ) ); $ref = ereg_replace( '\\..+$', , $ref ); $w = $htdocs.'wiki'; shell_exec( "$w/png2dbl $htdocs$image $w/$ref.dbl" ); # investigate creating a unix level pipe and reading a la /dev #$img = new SWFBitmap( popen( "$w/png2dbl $w$image $w/stream.dbl", 'rb' ) ); $img = new SWFBitmap( fopen( "$w/$ref.dbl", 'rb' ) ); libAdd( $img, $ref ); }
$grad = new SWFGradient(); for ( $n = 0; $n <= 10; $n++ ) { $i = ( 2 - log( $n + 1 ) * 0.95 ) * 125; if ( $i > 255 ) $i = 255; else if ( $i < 0 ) $i = 0; $grad->addEntry( $n / 10, 255, 255, 255, $i ); } $shape = new SWFShape(); $fill = $shape->addFill( $grad, SWFFILL_RADIAL_GRADIENT ); $fill->scaleTo( 0.17 ); $shape->setRightFill( $fill ); $shape->drawCircle( 100 ); libAdd( $shape, 'star' );
- Add compile.as common code
$article = xwArticleContent( 'compile.as' ).$article;
- Write exports and make all available at runtime in library array
$swf->writeExports(); $article = 'library=array("'.join( '","', $lib )."\");\n$article"; if ( count( $lib ) ) xwMessage( 'Pre-compiled symbols: "'.join( '", "', $lib ).'"' );
- Flashvars aren't working just compile assignments into script for now
foreach( split( '&', $flashvars ) as $var ) if ( ereg( '^(.+)=(.+)$', $var, $m ) ) $article = "$m[1]='$m[2]';\n$article";
- Replace #Include statements with content
$includes = array(); $more = true; while ( $more ) { $more = count( $includes ); $article = preg_replace( '/^\\s*#include\\s+[\'"](.+?)[\'"].*?$/emi', 'xwArticleContent($includes["$1"]="$1",true);', $article ); $more = count( $includes ) > $more; } if ( count( $includes ) ) xwMessage( 'Included articles: "'.join( '", "', array_keys( $includes ) ).'"' );
- Fix the ^= operator which doesn't work in Ming but does in Flash
$article = preg_replace( '/([a-z_]+[a-z_0-9.]+)\\s*\\^=/i', '$1=$1^', $article );
- Add actionscript in frames 1-3
$swf->add( new SWFAction( $article ) ); $swf->nextFrame(); $swf->add( new SWFAction( 'internal_reduce();' ) ); $swf->nextFrame(); $swf->add( new SWFAction( 'gotoAndPlay(2);' ) ); $swf->nextFrame();
if ( $format == 'raw' ) { # Send the raw SWF back to the client and die ob_end_clean(); header( 'Content-Type: application/x-shockwave-flash' ); $swf->output(9); die(); } else { # Write the SWF to $url and render a link to it
$swf->save( "$htdocs$url" ,9 ); $article = "\n$title successfully compiled to $server/$url\n"; }
} ?>