FlashTracer for Firebug

FBTracer in action

Recently I decided to write my old flash tracer firefox extension from scratch because I found it not really useful (at least for me) and too “expensive”, moreover when using firebug at the same time.

So I made a quick test to see how much was hard to create a new panel inside firebug to display flash tracer.
This is the result of what I did right now. It does not have all the features of the old extension, it just display the flash traces. Anyway it is actually in early stage development, updates will come during next days.
Here the instructions and the download link (remrmber to install the flashplayer debugger and firebug first!):
P.S. It has been tested on osx snow leopard and windows 7 right now.

Flex sdk 3.5.0 problem with ternary operators

I’ve got problems to isolate the problem into a very big project with many linked sources. After hours inspecting and commenting lines of code trying to figure out the reason why flex gave me an “internal error” I found the problem.
This very simple script was crashing the flex compiler if using the 3.5.0 sdk ( revision 3.5.0.12683 ).
Fortunately the 4.0.0 compiler works fine. At the end it seems to be the combination of “+” and “-” and the ternary operator.
package
{
   import flash.display.Sprite;
   public class ternary_test extends Sprite
   {
      public function ternary_test()
      {
         var n: Number = 0;
         var d: int = 3;
         var k: int = 5;
         var j: int = 10;
         n = 1 + ( -( d == 0 ? k : j ) );
         trace( "n=" + n );
      }
   }
}

will cause the compiler to crash with the following stack trace:

compile:

    [mxmlc] Loading configuration file /Applications/Adobe Flash Builder 4 Plug-in/sdks/3.5.0/frameworks/flex-config.xml

    [mxmlc] Error: null

    [mxmlc] java.lang.NullPointerException

    [mxmlc] 	at macromedia.asc.semantics.ConstantEvaluator.evaluate(ConstantEvaluator.java:1290)

    [mxmlc] 	at macromedia.asc.parser.UnaryExpressionNode.evaluate(UnaryExpressionNode.java:51)

    [mxmlc] 	at macromedia.asc.semantics.ConstantEvaluator.evaluate(ConstantEvaluator.java:2153)

    [mxmlc] 	at macromedia.asc.parser.ListNode.evaluate(ListNode.java:44)

    [mxmlc] 	at macromedia.asc.semantics.ConstantEvaluator.evaluate(ConstantEvaluator.java:1497)

    [mxmlc] 	at macromedia.asc.parser.BinaryExpressionNode.evaluate(BinaryExpressionNode.java:56)

    [mxmlc] 	at macromedia.asc.semantics.ConstantEvaluator.evaluate(ConstantEvaluator.java:2124)

    [mxmlc] 	at macromedia.asc.parser.ArgumentListNode.evaluate(ArgumentListNode.java:45)...

PdfReader for purePDF

Recently I’ve update purepdf adding PdReader.

Using PdfReader an existing pdf document can be opened and parsed. Later I will also port the PdfStamper which will allow to modify existing pdf documents.
Currently I’ve posted 3 simple examples about the PdfReader:
  1. Extract bookmarks
  2. Extract text
  3. Extract images
  4. ExtractTextPDF.air (air application): browse for local pdf documents and display pages contents
Currently the reader has some limitations (such as it cannot open crypted documents) and it’s not fast enough, but I hope to optimize it in the future.

mm.cfg revealed!

I’ve just discovered an unbelievable post by Jean-Philippe Auclair with ALL the undocumented options of the mm.cfg file!

Really interesting in particular AS3Trace and AS3Verbose (and what is AS3Turbo anyway?). Also TraceOutputBuffered could be useful for all swf with uncommented trace calls 🙂

By the way, this is the list of features he discovered (follow the link above for detailed information on each command):
  • AllowUserLocalTrust
  • AS3AllocationTracking
  • AS3AutoStartSampling
  • AS3CSE
  • AS3DCE
  • AS3DynamicProfile
  • AS3MIR
  • AS3Sampling
  • AS3SSE
  • AS3StaticProfile
  • AS3Trace
  • AS3Turbo
  • AS3Verbose
  • AssetCacheSize=X
  • AutoUpdateDisable
  • AutoUpdateInterval
  • AutoUpdateVersionUrl
  • AVHardwareDisable
  • CodeSignLogFile
  • CodeSignRootCert
  • Convert8kAnd16kAudio
  • CrashLogEnable
  • DisableAVM1Loading
  • DisableDeviceFontEnumeration
  • DisableIncrementalGC
  • DisableMulticoreRenderer
  • DisableNetworkAndFilesystemInHostApp
  • DisableProductDownload
  • DisableSockets
  • DisplayGPUBlend
  • EnableIncrementalValidation
  • EnableLeakFile
  • EnableSocketsTo
  • EnableSocketsTo
  • EnableSocketsTo
  • EnforceLocalSecurityInActiveXHostApp
  • ErrorReportingEnable
  • FileDownloadDisable
  • FileUploadDisable
  • ForceGPUBlend
  • FrameProfilingEnable
  • FullScreenDisable
  • GCStats
  • GPULogOutputFileName
  • HeapProfilingAS3Enable
  • LegacyDomainMatching
  • LocalFileLegacyAction
  • LocalFileReadDisable
  • LocalStorageLimit
  • LogGPU
  • MaxWarnings
  • OverrideGPUValidation
  • OverrideUserInvokedActions
  • PolicyFileLog
  • PolicyFileLogAppend
  • PreloadSwf
  • PreloadSwf
  • ProductDisabled
  • ProductDownloadBaseUrl
  • ProfileFunctionEnable
  • ProfilingOutputDirectory
  • ProfilingOutputFileEnable
  • RendererProfilingEnable
  • RTMFPP2PDisable
  • RTMFPTURNProxy
  • ScriptStuckTimeout
  • SecurityDialogReportingEnable
  • SuppressDebuggerExceptionDialogs
  • ThirdPartyStorage
  • TraceOutputBuffered
  • TraceOutputFileEnable
  • TraceOutputFileName
  • UseBrokerProcess
  • WindowlessDisable

Flash alpha GradientMatrix to PDF using purePDF

One of the most hard thing to traslate when creating pdf documents from existing flash movies is indeed the gradient matrix.

Not only because pdf and flash have 2 different coordinates system and because the gradient matrix is applied in 2 different ways, but also if you want to convert gradient with transparent colors inside.
Let me say that I’ve encountered the same issue Mario posted here, even if I made a little modification to his solution: GradientMatrix.as
This is the swf example. Click on the sprite to start the animation. It will rotate and translate both the sprite and its gradient matrix, then click again to stop the animation and create the pdf file at that frame.
SWF HERE
In order to create the correct gradient matrix with the right position and rotation in purePDF I’ve used the PdfShading.complexAxial static method in this way:
var cb_shading: PdfShading = PdfShading.complexAxial( writer, top_left.x, top_left.y, top_right.x, top_right.y, cb_colors, cb_ratios, true, true );

then for the alpha masking I’ve created a PdfTransparencyGroup applied to the alpha mask.

You can see my solution (which probably is not the best one, but it’s the one I discovered for now) in the code below.
[kml_flashembed movie=”/wp-content/uploads/2010/02/ExampleColorGradient2.swf” height=”300″ width=”400″ /]

Continue reading

purePDF, a complete actionscript PDF library

PurePDF is a complete library for creating PDF documents using actionscript 3 ( targeted for flash player 10 ).
The project is actually hosted on google code.

This is is a porting I’ve made of the famous java iText library ( version 4.2 ) by Bruno Lowagie into pure actionscript 3.0 (with some little modifications).
iText ( and purePDF ) has tons of features for create and manipulate pdf documents. A quick list of the features actually implemented into purepdf:

  • pdf viewers display options
  • alpha transparency, blend modes
  • layers
  • arabic RTL writing
  • support for pdf text rendering ( example )
  • tables ( nested tables, page split tables, table with images, etc…)
  • slide show ( page transitions )
  • annotations, comments, file annotations
  • patterns, shadings patterns (linear and gradient), spot colors, rgb color and cmyk color
  • linear and radial gradients with alpha ( example or example 2 )
  • forms (user input forms, textfields, combo box, list, checkbox)
  • paragraphs, phrases, chunks for text manipulation, chapters, lists…
  • images (jpeg, png, animated gif, tif, bitmapdata ) and image patterns
  • basic and advanced paths
  • afm, otf, pfm, ttc and ttf fonts (embedded and not embedded)
  • metadata, page header and footers
  • external, internal links
  • barcodes creation ( ean-ucc 13, ucc-12, ean-ucc-8, upc-e, pdf 417, ean supplements) ( example )
  • unicode, cjk fonts and text
  • file attachments
  • javascript ( example )
  • multi column text
  • Embedded movies ( example )
  • Vertical text ( see this example )
  • and many other features…

You can take a look at this PDF document (self generated using actionscript reflection) with the purePDF APIs.

Other actionscript libraries I’ve used for this project are: fzlib, as3corelib, ashashmap, alchemy, as3-commons.

You can both download the library from source code and compile it yourself ( see at the Installation guide ) or download the precompiled swc files from the project’s download section.

Moreover there are actually a lot of examples to explain all the library features and for a quick guide. You can find them listed and updated here. In General refers to the project wiki for all the updated examples/howtos and the project updates.

update: here you can find the updated online api documentation

Update your app VERSION using ant

This is just a quick tip in case someone needs it. Maybe when you compile your flash application or your swc library you want to automatically update the “VERSION” number too without do it manually every time.

This is the way I do. In the “compile” task I’ve added a depends link to this ant task:
<target name="update-version">
<propertyset id="tdate"></propertyset>
<tstamp>
<format property="tdate" pattern="yyyyMMdd"/>
</tstamp>
<buildnumber file="build.number"/>
<echo>updating version to current datetime: ${tdate}</echo>
<replaceregexp byline="true">
<regexp pattern="public static const BUILD_DATE: String = \'([0-9]+)'"/>
<substitution expression="public static const BUILD_DATE: String = '${tdate}'"/>
<fileset dir="src/it/sephiroth/somestuff">
<include name="Library.as"/>
</fileset>
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern="public static const BUILD_NUMBER: String = \'([0-9\.]+)'"/>
<substitution expression="public static const BUILD_NUMBER: String = '${build.number}'"/>
<fileset dir="src/it/sephiroth/somestuff">
<include name="Library.as"/>
</fileset>
</replaceregexp>
</target>
The 2 optional tasks I’ve used are: BuildNumber task and ReplaceRegExp Task. In this way every time I do an ant compile, it will update my build number and modification date.
What this task does is find this 2 lines in my Library.as file:

public static const BUILD_DATE: String = ‘20100131’;

and

public static const BUILD_NUMBER: String = ‘5’;

then replace the BUILD_DATE const with the current date and the BUILD_NUMBER with an incremental build number. After being executed the first time, ant will also create a new file in your directory called “build.number” with the latest build number int.

Vector.splice bug

Usually people complain about opensource projects because they lack of documentation ( that’s true most of the times.. ), but this doens’t happen only there…

Today I’ve spent a lot of time trying to understand why I was so stupid because I wasn’t able to concatenate 2 vectors of int using splice.
But for what you can read from the *official* Adobe documentation, which says (about the third parameter for the splice method):

… items — An optional list of one or more comma-separated values, **or a Vector**, to insert into the Vector at the position specified in the startIndex parameter.

Ok, that’s why I didn’t know why I couldn’t manage to make it work! This simple code gives wrong results:


var v1: Vector. = new Vector.();
v1.push(1);
v1.push(2);
v1.push(3);
v1.push(4);

var v2: Vector. = new Vector.();
v2.push(100);
v2.push(200);
v1.splice( 1, 1, v2 );

// Expected result: [1,100,200,3,4]
// Actual result: [1,0,3,4]

It seems that the third parameter is being casted into int and so only ‘0’ has been inserted into the first Vector!

I tried to look into Adobe jira bugbase and what I’ve found there is that it was a known bug since long time and it has been also moved to the tamarin bugbase.

The problem is that at the end they simply closed the bug as invalid bug because the documentation was wrong!

Funny