Difference between revisions of "Swf.php"

From Organic Design wiki
m
m
 
(161 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
  
#todo: get w,h,bg,fps,params,output-method from properties
+
$server = $_SERVER['HTTP_HOST'];
 +
$htdocs = $_SERVER['DOCUMENT_ROOT'];
 +
if ( !ereg( "\\/$", $htdocs ) ) $htdocs .= '/';
  
#todo: create basic object set: square, circle, triangle, linear, radial
+
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";
 +
}
  
# Hard wired common vector shapes (later converted to Ming from SVG)
+
# Have to add imports to src url
 +
foreach ( xwGetListByTagname( $properties, 'import', $import ) as $image )
 +
$src .= "&xpath:$path:import=$image";
  
# Black block (for spacers and fills)
+
# if format is embed, just convert the content to an object-tag referring to raw-compiled-swf
$shape = new SWFShape();
+
if ( $format == 'embed' ) {
$shape->setRightFill( 0, 0, 0 );
+
$article = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"
$shape->movePenTo( 100, 100 );
+
codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=$version,0,0,0\"
$shape->drawLineTo( -100, 100 );
+
width=$width height=$height id=\"$src\" align=\"\"
$shape->drawLineTo( -100, -100 );
+
type=\"application/x-shockwave-flash\" data=\"$src\">
$shape->drawLineTo( 100, -100 );
+
<param name=flashvars value=\"$flashvars\">
$shape->drawLineTo( 100, 100 );
+
<param name=movie value=\"$src\">
$sym = new SWFSprite();
+
<param name=quality value=\"$quality\">
$sym->add( $shape );
+
<param name=bgcolor value=\"$background\">
$sym->nextFrame();
+
<embed src=\"$src\" quality=\"$quality\" bgcolor=\"$background\"
$swf->addExport( $sym, 'black' );
+
width=$width height=$height align=\"\" flashvars=\"$flashvars\"
 +
name=\"$src\" type=\"application/x-shockwave-flash\"
 +
pluginspage=\"http://www.macromedia.com/go/getflashplayer\" />
 +
</object>";
 +
}
  
# White block (for spacers and fills)
+
else {
$shape = new SWFShape();
 
$shape->setRightFill( 255, 255, 255 );
 
$shape->movePenTo( 0, 0 );
 
$shape->drawLineTo( 0, 767 );
 
$shape->drawLineTo( 1023, 767 );
 
$shape->drawLineTo( 1023, 0 );
 
$shape->drawLineTo( 0, 0 );
 
$sym = new SWFSprite();
 
$sym->add($shape);
 
$sym->nextFrame();
 
$swf->addExport( $sym, 'white' );
 
  
# Selection area
+
# Compile the script into a binary SWF
$shape = new SWFShape();
+
# - also builds hard wired common vector shapes (later converted to Ming from SVG)
$shape->setLine( 0, 255, 0, 0 );
 
$shape->movePenTo( 100, 100 );
 
$shape->drawLineTo( -100, 100 );
 
$shape->drawLineTo( -100, -100 );
 
$shape->drawLineTo( 100, -100 );
 
$shape->drawLineTo( 100, 100 );
 
$sym = new SWFSprite();
 
$sym->add( $shape );
 
$sym->nextFrame();
 
$swf->addExport( $sym, 'select' );
 
  
# Triangle
+
# Check weather required extentions are available (GD2 and Ming)
$shape = new SWFShape();
+
$ext = get_loaded_extensions();
$shape->setRightFill( 0, 0, 0 );
+
if ( !in_array( 'ming', $ext ) ) xwMessage( 'Ming extention not loaded! (at least version 0.3 required)', 'red' );
$shape->movePenTo( 100, -100 );
 
$shape->drawLineTo( -100, -100 );
 
$shape->drawLineTo( -100, 100 );
 
$shape->drawLineTo( 100, -100 );
 
$triangle = new SWFSprite();
 
$triangle->add( $shape );
 
$triangle->nextFrame();
 
$swf->addExport( $triangle, 'triangle' );
 
  
# Linear Gradient
+
ming_useswfversion( $version );
$shape=new SWFShape();
+
global $lib, $swf;
$grad = new SWFGradient();
+
$lib = array();
$grad->addEntry( 0.0, 0, 0, 0, 0xff );
+
$swf = new SWFMovie();
$grad->addEntry( 1.0, 0, 0, 0, 0 );
+
$swf->setDimension( $width, $height );
$fill = $shape->addFill( $grad, SWFFILL_LINEAR_GRADIENT );
+
eregi( '^#?([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$' , $background, $m );
$fill->scaleTo( 0.097 );
+
list(,$r,$g,$b) = $m;
$fill->moveTo( -18, 0 );
+
$swf->setBackground( hexdec($r), hexdec($g), hexdec($b) );
$shape->setRightFill( $fill );
+
$swf->setRate( $fps );
$shape->movePenTo( 100, -100 );
+
xwMessage( "SWF movie created from \"$title\": $width"." x $height @ $fps".'fps' );
$shape->drawLineTo( -100, -100 );
 
$shape->drawLineTo( -100, 100 );
 
$shape->drawLineTo( 100, 100 );
 
$shape->drawLineTo( 100, -100 );
 
$sym = new SWFSprite();
 
$sym->add( $shape );
 
$sym->nextFrame();
 
$swf->addExport( $sym, 'linear' );
 
  
# Radial Gradient
+
# Don't redeclare (happens if more than one compile on same page)
$fill = $shape->addFill( $grad, SWFFILL_RADIAL_GRADIENT );
+
if ( !isset( $GLOBALS[$tTitle] ) ) {
$fill->scaleTo( 0.2 );
 
$fill->moveTo( -100, 100 );
 
$shape->setRightFill( $fill );
 
$shape->movePenTo( 100, -100 );
 
$shape->drawLineTo( -100, -100 );
 
$shape->drawLineTo( -100, 100 );
 
$shape->drawLineTo( 100, 100 );
 
$shape->drawLineTo( 100, -100 );
 
$sym = new SWFSprite();
 
$sym->add( $shape );
 
$sym->nextFrame();
 
$swf->addExport( $sym, 'radial' );
 
  
# Ball
+
$GLOBALS[$tTitle] = true;
$sym = new SWFSprite();
 
$g = new SWFGradient();
 
$g->addEntry( 0.0, 0xff, 0xff, 0xff );
 
$g->addEntry( 1.0, 0, 0, 0 );
 
$ball = new SWFShape();
 
$f = $ball->addFill( $g, SWFFILL_RADIAL_GRADIENT );
 
$f->scaleTo( 0.2 );
 
$f->moveTo( 40, -60 );
 
$ball->setRightFill( $f );
 
$ball->drawCircle( 100 );
 
$sym->add( $ball );
 
$sym->nextFrame();
 
$swf->addExport( $sym, 'ball' );
 
  
 +
# 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 );
 +
}
  
# Check weather required extentions are available (GD2 and Ming)
+
$grad = new SWFGradient();
global $xwDebug;
+
for ( $n = 0; $n <= 10; $n++ ) {
$ext = get_loaded_extensions();
+
$i = ( 2 - log( $n + 1 ) * 0.95 ) * 125;
if (!in_array('gd', $ext)) xwMessage("Warning: GD extention not loaded! (image processing unavailable)",'red');
+
if ( $i > 255 ) $i = 255; else if ( $i < 0 ) $i = 0;
else {
+
$grad->addEntry( $n / 10, 255, 255, 255, $i );
$gdi = gd_info();
 
ereg('([0-9])([0-9.]+)', $gdi['GD Version'], $m);
 
if ($xwDebug) xwMessage("GD Version is $m[1]$m[2]");
 
if ($m[1] < 2) xwMessage("Warning: At least GD version 2 required (image processing unavailable)",'red');
 
 
}
 
}
if (!in_array('ming', $ext)) xwMessage("Ming extention not loaded! (at least version 0.3 required)",'red');
+
$shape = new SWFShape();
elseif ($xwDebug) xwMessage("Ming extention ok.");
+
$fill = $shape->addFill( $grad, SWFFILL_RADIAL_GRADIENT );
 +
$fill->scaleTo( 0.17 );
 +
$shape->setRightFill( $fill );
 +
$shape->drawCircle( 100 );
 +
libAdd( $shape, 'star' );
  
# Override <language> in properties object to 'raw' so no wiki-parsing
+
# Add compile.as common code
$node = $properties->create_element('language');
+
$article = xwArticleContent( 'compile.as' ).$article;
$node->set_content('raw');
 
$root = $properties->document_element();
 
$lang = xwXPathQuery($properties, "/properties/language");
 
if (is_array($lang) && count($lang)) $lang[0]->replace_node($node);
 
else $root->append_child($node);
 
  
# Get compile parameters from properties object
+
# Write exports and make all available at runtime in library array
$output = count($results = xwXPathQuery($properties, "$path/output")) ? $results[0]->get_content() : 'html';
+
$swf->writeExports();
$width = count($results = xwXPathQuery($properties, "$path/width")) ? $results[0]->get_content() : 200;
+
$article = 'library=array("'.join( '","', $lib )."\");\n$article";
$height = count($results = xwXPathQuery($properties, "$path/height")) ? $results[0]->get_content() : 150;
+
if ( count( $lib ) ) xwMessage( 'Pre-compiled symbols: "'.join( '", "', $lib ).'"' );
$frameRate = count($results = xwXPathQuery($properties, "$path/frameRate")) ? $results[0]->get_content() : 25;
 
$bg = count($results = xwXPathQuery($properties, "$path/background")) ? $results[0]->get_content() : '#cccccc';
 
eregi('^#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$',$bg,$m);
 
list(,$r,$g,$b) = $m;
 
  
# Create new SWF
+
# Flashvars aren't working just compile assignments into script for now
ming_useswfversion(6);
+
foreach( split( '&', $flashvars ) as $var )
$swf = new SWFMovie();
+
if ( ereg( '^(.+)=(.+)$', $var, $m ) )
$swf->setDimension($width, $height);
+
$article = "$m[1]='$m[2]';\n$article";
$swf->setBackground(hexdec($r), hexdec($g), hexdec($b));
 
$swf->setRate($frameRate);
 
if ($xwDebug) xwMessage("SWF movie created ($width"."x$height@$frameRate"."fps)");
 
  
# If output is html embed object as url, else output swf now and die
+
# Replace #Include statements with content
if ($output == 'html') {
+
$includes = array();
$url = "$script?title=$title&xpath:/properties/ming-swf/output:=swf";
+
$more = true;
$article = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"
+
while ( $more ) {
codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0\"
+
$more = count( $includes );
width=\"$width\" height=\"$height\" id=\"$title\" align=\"\"
+
$article = preg_replace(
type=\"application/x-shockwave-flash\" data=\"$title\">
+
'/^\\s*#include\\s+[\'"](.+?)[\'"].*?$/emi',
<param name=\"movie\" value=\"$title\">
+
'xwArticleContent($includes["$1"]="$1",true);',
<param name=\"quality\" value=\"high\">
+
$article );
<param name=\"bgcolor\" value=\"$bg\">
+
$more = count( $includes ) > $more;
<embed src=\"$url\" quality=\"high\" bgcolor=\"$bg\"
 
width=\"$width\" height=\"$height\" align=\"\"
 
name=\"$title\" type=\"application/x-shockwave-flash\"
 
pluginspage=\"http://www.macromedia.com/go/getflashplayer\" />
 
</object>";
 
 
}
 
}
else {
+
if ( count( $includes ) ) xwMessage( 'Included articles: "'.join( '", "', array_keys( $includes ) ).'"' );
eval($article);
+
 
 +
# 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();
 
ob_end_clean();
header('Content-Type: application/x-shockwave-flash');
+
header( 'Content-Type: application/x-shockwave-flash' );
 
$swf->output(9);
 
$swf->output(9);
 
die();
 
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";
 
}
 
}
  
 +
}
 
?>
 
?>
 +
</source>

Latest revision as of 13:18, 6 August 2024

Legacy.svg Legacy: This article describes a concept that has been superseded in the course of ongoing development on the Organic Design wiki. Please do not develop this any further or base work on this concept, now this page is for historic record only.
<?
# 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";
	}

}
?>