Difference between revisions of "Swf.php"
From Organic Design wiki
(nearly there I think :-)) |
m |
||
(91 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
+ | {{legacy}} | ||
+ | <source lang="php"> | ||
<? | <? | ||
# SWF Compiler for XmlWiki Environment | # SWF Compiler for XmlWiki Environment | ||
+ | $server = $_SERVER['HTTP_HOST']; | ||
$htdocs = $_SERVER['DOCUMENT_ROOT']; | $htdocs = $_SERVER['DOCUMENT_ROOT']; | ||
− | $ | + | if ( !ereg( "\\/$", $htdocs ) ) $htdocs .= '/'; |
xwSetProperty( $properties, 'language', 'raw' ); | xwSetProperty( $properties, 'language', 'raw' ); | ||
Line 10: | Line 13: | ||
# - also supplies defaults | # - also supplies defaults | ||
# - and constructs link which requests the raw compiled SWF | # - and constructs link which requests the raw compiled SWF | ||
+ | # - also adds each property as a constant to the script | ||
+ | $t = ereg_replace( '\\.as$', '.swf', $title ); | ||
$tag = ereg( '(\\w+)$', $path, $m ) ? $m[1] : 'swf'; | $tag = ereg( '(\\w+)$', $path, $m ) ? $m[1] : 'swf'; | ||
$src = "$script?title=$title&xpath:/properties:language=raw&xpath:/properties:data=$tTitle&xpath:/properties:$tag"; | $src = "$script?title=$title&xpath:/properties:language=raw&xpath:/properties:data=$tTitle&xpath:/properties:$tag"; | ||
Line 19: | Line 24: | ||
'background' => 'ffffff', | 'background' => 'ffffff', | ||
'quality' => 'medium', | 'quality' => 'medium', | ||
− | ' | + | 'flashvars' => '', |
'format' => 'embed', | 'format' => 'embed', | ||
'version' => 6, | 'version' => 6, | ||
− | 'url' => | + | 'url' => "www/$t" |
) as $key => $value ) { | ) as $key => $value ) { | ||
if ( !xwGetProperty( $properties, "xpath:$path/$key", $$key ) ) $$key = $value; | if ( !xwGetProperty( $properties, "xpath:$path/$key", $$key ) ) $$key = $value; | ||
− | $src .= "&xpath:$path:$key=".( ( $key == 'format' ) ? 'raw' : $$key | + | $value = $$key; |
+ | $src .= "&xpath:$path:$key=".( ( $key == 'format' ) ? 'raw' : $value ); | ||
+ | $article = "$key='$value';\n$article"; | ||
} | } | ||
+ | |||
+ | # Have to add imports to src url | ||
+ | foreach ( xwGetListByTagname( $properties, 'import', $import ) as $image ) | ||
+ | $src .= "&xpath:$path:import=$image"; | ||
# if format is embed, just convert the content to an object-tag referring to raw-compiled-swf | # if format is embed, just convert the content to an object-tag referring to raw-compiled-swf | ||
Line 35: | Line 46: | ||
width=$width height=$height id=\"$src\" align=\"\" | width=$width height=$height id=\"$src\" align=\"\" | ||
type=\"application/x-shockwave-flash\" data=\"$src\"> | type=\"application/x-shockwave-flash\" data=\"$src\"> | ||
− | <param name=flashvars value=\"$ | + | <param name=flashvars value=\"$flashvars\"> |
<param name=movie value=\"$src\"> | <param name=movie value=\"$src\"> | ||
<param name=quality value=\"$quality\"> | <param name=quality value=\"$quality\"> | ||
− | <param name=bgcolor value=\"$ | + | <param name=bgcolor value=\"$background\"> |
− | <embed src=\"$src\" quality=\"$quality\" bgcolor=\"$ | + | <embed src=\"$src\" quality=\"$quality\" bgcolor=\"$background\" |
− | width=$width height=$height align=\"\" flashvars=\"$ | + | width=$width height=$height align=\"\" flashvars=\"$flashvars\" |
name=\"$src\" type=\"application/x-shockwave-flash\" | name=\"$src\" type=\"application/x-shockwave-flash\" | ||
pluginspage=\"http://www.macromedia.com/go/getflashplayer\" /> | pluginspage=\"http://www.macromedia.com/go/getflashplayer\" /> | ||
Line 56: | Line 67: | ||
ming_useswfversion( $version ); | ming_useswfversion( $version ); | ||
+ | global $lib, $swf; | ||
+ | $lib = array(); | ||
$swf = new SWFMovie(); | $swf = new SWFMovie(); | ||
$swf->setDimension( $width, $height ); | $swf->setDimension( $width, $height ); | ||
Line 61: | Line 74: | ||
list(,$r,$g,$b) = $m; | list(,$r,$g,$b) = $m; | ||
$swf->setBackground( hexdec($r), hexdec($g), hexdec($b) ); | $swf->setBackground( hexdec($r), hexdec($g), hexdec($b) ); | ||
− | $swf->setRate($ | + | $swf->setRate( $fps ); |
− | xwMessage( "SWF movie created | + | 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 | # Import images | ||
foreach ( xwGetListByTagname( $properties, 'import', $import ) as $image ) { | foreach ( xwGetListByTagname( $properties, 'import', $import ) as $image ) { | ||
− | $ref = strtolower( ereg_replace( '^.*/', '', $image ) ); | + | $ref = strtolower( trim( ereg_replace( '^.*/', '', $image ) ) ); |
$ref = ereg_replace( '\\..+$', '', $ref ); | $ref = ereg_replace( '\\..+$', '', $ref ); | ||
− | $ | + | $w = $htdocs.'wiki'; |
− | shell_exec( " | + | shell_exec( "$w/png2dbl $htdocs$image $w/$ref.dbl" ); |
− | $img = new SWFBitmap( | + | # 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(); | $shape = new SWFShape(); | ||
− | $shape-> | + | $fill = $shape->addFill( $grad, SWFFILL_RADIAL_GRADIENT ); |
− | $ | + | $fill->scaleTo( 0.17 ); |
− | $ | + | $shape->setRightFill( $fill ); |
− | $shape-> | + | $shape->drawCircle( 100 ); |
− | $ | + | libAdd( $shape, 'star' ); |
− | $shape-> | ||
− | |||
− | |||
− | |||
− | |||
− | # | + | # 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 | # Add actionscript in frames 1-3 | ||
$swf->add( new SWFAction( $article ) ); | $swf->add( new SWFAction( $article ) ); | ||
$swf->nextFrame(); | $swf->nextFrame(); | ||
− | $swf->add( new SWFAction( ' | + | $swf->add( new SWFAction( 'internal_reduce();' ) ); |
$swf->nextFrame(); | $swf->nextFrame(); | ||
− | $swf->add( new SWFAction( 'gotoAndPlay( | + | $swf->add( new SWFAction( 'gotoAndPlay(2);' ) ); |
$swf->nextFrame(); | $swf->nextFrame(); | ||
Line 195: | Line 164: | ||
else { | else { | ||
# Write the SWF to $url and render a link to it | # Write the SWF to $url and render a link to it | ||
− | + | ||
$swf->save( "$htdocs$url" ,9 ); | $swf->save( "$htdocs$url" ,9 ); | ||
− | $article = "[http://$server$url $server$url]"; | + | $article = "\n[[$title]] successfully compiled to [http://$server/$url $server/$url]\n"; |
} | } | ||
} | } | ||
?> | ?> | ||
+ | </source> |
Latest revision as of 13:18, 6 August 2024
<?
# SWF Compiler for XmlWiki Environment
$server = $_SERVER['HTTP_HOST'];
$htdocs = $_SERVER['DOCUMENT_ROOT'];
if ( !ereg( "\\/$", $htdocs ) ) $htdocs .= '/';
xwSetProperty( $properties, 'language', 'raw' );
# Read in relevent properties
# - also supplies defaults
# - and constructs link which requests the raw compiled SWF
# - also adds each property as a constant to the script
$t = ereg_replace( '\\.as$', '.swf', $title );
$tag = ereg( '(\\w+)$', $path, $m ) ? $m[1] : 'swf';
$src = "$script?title=$title&xpath:/properties:language=raw&xpath:/properties:data=$tTitle&xpath:/properties:$tag";
foreach ( array(
'width' => 550,
'height' => 400,
'fps' => 12,
'background' => 'ffffff',
'quality' => 'medium',
'flashvars' => '',
'format' => 'embed',
'version' => 6,
'url' => "www/$t"
) as $key => $value ) {
if ( !xwGetProperty( $properties, "xpath:$path/$key", $$key ) ) $$key = $value;
$value = $$key;
$src .= "&xpath:$path:$key=".( ( $key == 'format' ) ? 'raw' : $value );
$article = "$key='$value';\n$article";
}
# Have to add imports to src url
foreach ( xwGetListByTagname( $properties, 'import', $import ) as $image )
$src .= "&xpath:$path:import=$image";
# if format is embed, just convert the content to an object-tag referring to raw-compiled-swf
if ( $format == 'embed' ) {
$article = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"
codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=$version,0,0,0\"
width=$width height=$height id=\"$src\" align=\"\"
type=\"application/x-shockwave-flash\" data=\"$src\">
<param name=flashvars value=\"$flashvars\">
<param name=movie value=\"$src\">
<param name=quality value=\"$quality\">
<param name=bgcolor value=\"$background\">
<embed src=\"$src\" quality=\"$quality\" bgcolor=\"$background\"
width=$width height=$height align=\"\" flashvars=\"$flashvars\"
name=\"$src\" type=\"application/x-shockwave-flash\"
pluginspage=\"http://www.macromedia.com/go/getflashplayer\" />
</object>";
}
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";
}
}
?>