BlitMask – Scroll up to 1000% faster

  • Version: 0.6, Updated 2012-01-20

A BlitMask is basically a rectangular Sprite that acts as a high-performance mask for a DisplayObject by caching a bitmap version of it and blitting only the pixels that should be visible at any given time, although its bitmapMode can be turned off to restore interactivity in the DisplayObject whenever you want. When scrolling very large images or text blocks, BlitMask can greatly improve performance, especially on mobile devices that have weaker processors. (UPDATE: a Flex-friendly version of BlitMask called FlexBlitMask was added in version 0.44)

Think of it like a window through which you see the object.

Interactive example

Over 1000% performance improvement?

When a simple tween of a large TextField was tested on an iPhone 3GS, the frame rate jumped from 3fps using a regular mask to 55fps using BlitMask. On the iPad, we signifcantly increased the scrolling area so that more pixels needed to be rendered on each frame, but there was still a massive increase in the frame rate from 3fps to almost 29fps. See the video below (special thanks to Jonah Simon for the video).

Watch the BlitMask Demo on an iPad and iPhone

On an Android-based phone (Droid 2) the fps jumped from 6.5 to 46.5. The improvements are less dramatic on regular computers because they have much beefier processors, but I ran a slightly different test with a heavier load on an Intel Core i3 computer and had the fps jump from 5fps with a regular mask to 59fps with BlitMask, so the 1000% improvement can still happen on regular computers in certain scenarios.

Of course your mileage will vary – the bigger, more complex your object (especially if it has text and vectors), the bigger the improvement you’ll see with BlitMask. And keep in mind that you’ll only see a speed improvement when bitmapMode is on. When it’s off, BlitMask just acts like a standard mask in Flash. The benefit of turning bitmapMode off is that your object (the target DisplayObject that’s being masked) will have its interactivity restored, meaning MouseEvents can be triggered inside that target like rollovers, clicks, etc. A common technique would be to turn bitmapMode on while you’re scrolling/animating the object (to maximize performance), and then turn it back off afterwards. There’s even convenient enableBitmapMode() and disableBitmapMode() methods that you can connect to your tweens like

var myBlitMask:BlitMask = new BlitMask(mc, 50, 50, 200, 200);
TweenLite.to(mc, 2, {x:100, y:200, onStart:myBlitMask.enableBitmapMode, onUpdate:myBlitMask.update, onComplete:myBlitMask.disableBitmapMode});

Features

  • Excellent scrolling performance
  • You don’t need to do anything special with your target DisplayObject – move/scale/rotate it however you please and then update() the BlitMask and it syncs the pixels. The BlitMask basically sits on top of the DisplayObject in the display list and you can move it independently too if you want.
  • Use the BlitMask’s scrollX and scrollY properties to move the target DisplayObject inside the masked area. For example, to scroll from top to bottom over the course of 2 seconds, simply do:
    myBlitMask.scrollY = 0;
    TweenLite.to(myBlitMask, 2, {scrollY:1});
  • BlitMask accommodates rotated and scaled content whereas scrollRect doesn’t (well, it does, but as you can see in the example above, the rectangular masked area rotates with the target and scaling affects it too).
  • Use the wrap property to make the bitmap wrap around to the opposite side when it scrolls off one of the edges (only in bitmapMode of course), as though the BlitMask is filled with a grid of bitmap copies of the target.
  • Turn smoothing on to enable sub-pixel rendering (better quality in most situations) or turn it off for maximum performance.
  • You can toggle the bitmapMode to get either maximum performance or interactivity in the target DisplayObject anytime. (some other solutions out there are only viable for non-interactive content)
  • MouseEvents are dispatched by the BlitMask, so you can listen for clicks, rollovers, rollouts, etc.

How exactly does it work?

One of the most processor-intensive tasks for the Flash Player is calculating which pixels need to change on the screen and then rendering them. So let’s say you’ve got a TextField that’s 2,500 pixels wide and 2,500 pixels tall (that’s a lotta text). Whenever you move it even one pixel, Flash must process all 6,250,000 pixels and figure out where they’d be on the new frame (even the ones that are off screen) and then display them appropriately. That requires tons of work, most of which is totally unnecessary when you’re only wanting to display a small fraction of those pixels inside a masked area. BlitMask allows Flash to just worry about the pixels inside the masked area.

When in bitmapMode, the BlitMask sets the target’s visible property to false so that Flash doesn’t need to worry about rendering its pixels. It takes a bitmap capture of the target and copies only the necessary pixels onto the rectangular area of its (the BlitMask’s) graphics layer. You can move the target wherever you want and then simply call the BlitMask’s update() method to have it look at where the target is and copy the necessary pixels into itself (refreshing the display to synchronize with the target’s position). When the target changes its rotation or scale, the internal bitmap must be recaptured (try to avoid this if possible because it degrades performance). BlitMask will automatically check to see if the scale or rotation changed since the last update() and if so, it’ll recapture the bitmap. You can force a recapture using the 2nd parameter of the update() method, like update(null, true).

When bitmapMode is set to false, BlitMask automatically turns on the target’s visible property and sets its mask property to the BlitMask. Consequently, performance degrades but interactivity is restored to the target. Visually things should be relatively seamless.

Documentation

View the full ASDocs here.

Sample AS3 code

import com.greensock.*;
 
//create a 200x200 BlitMask positioned at x:20, y:50 to mask our "mc" object and turn smoothing on:
var blitMask:BlitMask = new BlitMask(mc, 20, 50, 200, 200, true);

//animate mc and make sure the BlitMask updates
TweenLite.to(mc, 5, {x:-300, y:50, onUpdate:blitMask.update});
 
//or position mc at the top left of the BlitMask using the scrollX and scrollY properties
blitMask.scrollX = 0;
blitMask.scrollY = 0;
 
//tween the scrollY to make mc scroll to the bottom over the course of 3 seconds and then turn off bitmapMode so that mc becomes interactive:
TweenLite.to(blitMask, 3, {scrollY:1, onComplete:blitMask.disableBitmapMode});
 
//or simply position mc manually and then call update() to sync the display:
mc.x = 350;
blitMask.update();

Video tutorial

Check out Carl Schooff’s video tutorial covering BlitMask. It’s a great starting point.

Hidden benefit: objects with filters tween smoother

Smooth animation isn’t just about reducing the load on the CPU. Without BlitMask, if you apply a filter (i.e. GlowFilter, DropShadowFilter, etc.) to an object and then tween its coordinates slowly, you’ll notice jerky movement because Flash only allows the object to render on whole pixel coordinates. However, with BlitMask and its smoothing feature, sub-pixel rendering is possible, making these types of animations significantly smoother visually. See the example below:

FAQ

  1. When should I NOT use BlitMask?
    It doesn’t make much sense to use BlitMask when the target is smaller than the BlitMask or if you must maintain interactivity in child DisplayObjects even during scrolling/animation. While animating the scale or rotation of the target, there isn’t benefit in using bitmapMode either because the internal bitmap would need to keep getting recaptured on each frame/render.
  2. Can I use BlitMask with ThrowPropsPlugin for better flick-scrolling performance?
    Absolutely. See the ThrowPropsPlugin page for more information about flick-scrolling. The interactive example there has been updated to use BlitMask.
  3. Can I use BlitMask in Flex?
    Sure, a Flex-friendly version of BlitMask is now available called FlexBlitMask that extends UIComponent instead of Sprite in order to be…well…Flex-friendly. See the ASDocs here.
  4. Can I animate the BlitMask itself?
    Definitely, but you shouldn’t alter its rotation. Feel free to tween its x, y, width, and height properties. Doing so will automatically update() the BlitMask too.
  5. Wait, I thought Flash didn’t work on iPads or iPhones – how did you do that?
    You can publish apps for iOS devices with Flash (which is what we did here for the tests) but you still can’t view .swf files on web pages.
  6. I’m animating my target but it doesn’t seem to be working. What’s wrong?
    I bet you forgot to call update() each time you moved the target. For a tween, use the onUpdate like
    //don't forget the onUpdate
    TweenLite.to(mc, 3, {x:100, y:200, onUpdate:myBlitMask.update});
  7. Can’t I just set the target DisplayObject’s cacheAsBitmap property to true and get the same result? Why use BlitMask?
    If you set a DisplayObject’s cacheAsBitmap property to true, Flash takes a bitmap capture of that object so that when you move it (only altering the x and/or y properties), the text and vectors don’t need to be re-rasterized again before being rendered to the screen. However, Flash would still need to concern itself with extra pixels on every frame if you’re masking them to only show a small portion of the area. BlitMask, however, only cares about that smaller masked area (after the initial capture of course) which alleviates Flash from having to even think about the extra pixels.
  8. Is the API locked-down or might it change?
    No changes are planned to the API right now, but this is a brand new tool and I’d consider it somewhat experimental at this point. I’m committed to making improvements and enhancements if the need arises as it gets out into the wild and folks provide feedback. So yes, there could definitely be some changes down the road. Please feel free to submit your feedback and suggestions.
  9. Do I have to purchase a license to use this code? Can I use it in commercial projects?
    You may use the code at no charge in commercial or non-commercial web sites, games, components, applications, and other software as long as end users are not charged a fee of any kind to use your product or gain access to it. If your client pays you a one-time fee to create the site/product, that’s perfectly fine and qualifies under the “no charge” license. If multiple end users are charged a usage/access/license fee of any kind, please simply sign up for a corporate Club GreenSock membership which comes with a special commercial license granting you permission to do so. Click here for details. Club GreenSock members get several useful bonus plugins, classes, update notifications, SVN access, and more. Please see the licensing page for details on licensing.

Need help?

Feel free to post your question on the forums. You’ll increase your chances of getting a prompt answer if you provide a brief explanation and include a simplified FLA file (and any class files) that clearly demonstrates the problem.

Author: Jack Doyle
Copyright 2011, GreenSock (This work is subject to the terms here.)
  • Twitter
  • Facebook
  • Digg
  • StumbleUpon
  • del.icio.us
  • Yahoo! Buzz
  • Google Bookmarks
  • RSS
  • LinkedIn
  • Reddit

Comments (47) RSS

Posted by Merrick Brewer on August 26, 2011

Highly impressive results, Jack. I can see this coming in very handy in the near future!

A big thank you for your continuing additions to Greensock, just completely awesome!

Best Wishes

Merrick

Posted by flashedge on August 26, 2011

You made it again, Jack. Kudos to you! I’ve been looking for such a solution for weeks.

Posted by saphi on August 26, 2011

Wow, no more slow flash scrolling :D

*Jack earn 1000 exp points*

*Jack levels up*

:D

Posted by Social on August 26, 2011

Nice! This will make me experiment with Flash in iPad again :D

Thanks Jack

Posted by Alkashi on August 26, 2011

Exactly what I was needing 2 weeks ago !
I did the blit with “my hand”

So many thanks guys and very good job !

Posted by Zync on August 26, 2011

New tech!! You know we love new tech. This is soo awesome, and in perfect time for a new project too. Cheers again Jack!

Posted by CeC on August 26, 2011

Very clever solution.
Congratulations. Very good job as usual.

Thank you Jack.

Posted by cjboy1984 on August 26, 2011

COOL man!!!
How do u make it???

Posted by Mark A, on August 26, 2011

Thanks Jack. Looks good!

Posted by Og2t on August 26, 2011

Great findings Jack!

I am actually quite surprised how scrollRect with cacheAsBitmap set performs so slow. I’ve experimented with cached Bitmap and scrollRect (as did Jackson http://jacksondunstan.com/articles/629) and it was the fastest method (no need to use copyPixels or anything) regardless of the source bitmapData size. Have you tried that?

Posted by Otto on August 26, 2011

Uh. This is great but I’m sorry, I am apparently living under a rock. I thought Flash didn’t work on an iPad.

Posted by Adam Jackett on August 26, 2011

This is brilliant, just like everything else you create. I’m actually somewhat shocked at the results, I knew Flash’s masking was bad, but I didn’t realize it was that bad… which makes your solution even better.

Well played sir.

Posted by activetofocus on August 26, 2011

Really great!

Posted by Kamil Waheed on August 26, 2011

That’s so useful for mobile development. Adobe guys should hire you for Flash CS6. :D

Posted by Monnone on August 26, 2011

Great work as usual. I have a project I can implement this in right now to improve text scrolling performance.

Posted by Samuel on August 26, 2011

Really useful!! thanks!! =)

Posted by reyco1 on August 26, 2011

Very cool! Thanks Jack!

Posted by Ramiro on August 26, 2011

As always, you rock!

Posted by Matty B on August 26, 2011

Very excited about this! Fantastic work as always, Jack!

Posted by thomas on August 26, 2011

Ok this is the best thing since Bacon and sliced bread! Thanks Jack.

Ok now I have to make a retro side scroller shoot em up.

Posted by ANDRES on August 26, 2011

Simply amazing! Thanks Jack

Posted by YopSolo on August 26, 2011

Thx a lot, it will be really usefull :)

Posted by Jack on August 26, 2011

Og2t, scrollRect is certainly faster than a regular mask, but it’s still not quite as fast as BlitMask in most situations and there are several liabilities of using scrollRect:

It only allows whole pixel values. No sub-pixel rendering (smoothing).
You can’t rotate the content within the masked area (the whole mask rotates with the content)
I think most developers find working with scrollRect to be cumbersome and confusing.
You can’t easily scale the content inside the mask (well, you could but you’d have to counteract the scale by adjusting the scrollRect in the opposite direction at the same time to make it look like the mask was stationary)

But if you don’t have a scaled or rotated target and you don’t need smoothing, scrollRect is perfectly acceptable. TweenLite’s ScrollRectPlugin makes tweening it pretty simple too. Plus it maintains interactivity inside the target.

Posted by Jack on August 26, 2011

Otto, you’re not the only one to ask about that. I just added the answer in the FAQ section above. iOS devices don’t technically run Flash as a plugin, but you can publish native iOS apps using Flash which is what we did for the tests I mentioned above.

Posted by Grzegorz Tomasiak Flash Developer on August 27, 2011

THANKS GOD WE HAVE JACK!
Really great work, perfect!

Posted by Thomas on August 28, 2011

Very good! Excelent work and just the right timing – I think many of us guys will give it a go on mobile devices.

And who knows, maybe one day we will find a full blitting engine here too :)

Posted by Olivier on August 29, 2011

Heys, this is pretty sweet, keep it up, love your work!

Posted by Colin Ochel on September 1, 2011

The time you have saved me Jack…Cheers!

Question: without using BlitMask, If a MovieClip’s visibility is set to false, does Flash still think about it?

Ex: If I have 10,000 boxes moving around and set the visibility to false on the boxes outside of the stage’s view, will it perform better than just leaving all of them with visible = true?

I guess I could just try it myself but I would also like to know WHY or WHY NOT?

Posted by Jack on September 1, 2011

Yes, Colin, when you set a DisplayObject’s “visible” property to false, Flash basically ignores it when running through its graphics rendering routines. If you’ve got 10,000 boxes moving around and they all have visible set to false, it saves Flash from having to even think about rendering them. If you are tweening their properties, though, it still takes some time to set/apply those values (not much).

Posted by AmerSoft on October 11, 2011

Please Jack .. a Flex version .. please .. just like your other products like FlexTransformManager , please !

[...] do justice to all the robust features of the BlitMask in a single post so please read The Official BlitMask Information Page and the BlitMask [...]

Posted by Synxmax on November 4, 2011

Is There Any Chance Getting This Result On Flex

Posted by Jack on November 4, 2011

Sure, Synxmax, your wish is my command :) There’s now a FlexBlitMask class in the downloads that’s identical to BlitMask, but it extends UIComponent instead of Sprite and implements a few other necessities in order to be Flex-friendly. Enjoy!

Posted by Synxmax on November 7, 2011

Your Are The Man , Thank You Jack
Soon I Am One Of Your Club Member

And It’s All My Pleasure

Thank You Again

Posted by Pez on February 12, 2012

Thanks mate, I’m making a musical scorewriting program which involves thousands of bars of music being on display at once so this was absolutely invaluable, and surprisingly even faster than adding and removing display objects as they come into view

Posted by Navin on February 16, 2012

Kudos!

Its great to have awesome contributors like you in this world.

Posted by emrah on February 28, 2012

How about some stage3D versions.

Posted by Rory Pickering on April 3, 2012

How come you are moving a bitmap underneath a mask? Are there significant performance differences compared to the copyPixels technique, and drawing it into BitmapData?

Cheers,
Rory

Posted by Jack on April 3, 2012

Rory, I’m not quite sure what you’re referring to – BlitMask does use copyPixels and a BitmapData. When you turn its bitmapMode off, however, it switches to be a regular mask of the target which has the [very important] benefit of allowing interactivity inside the target. So ultimately BlitMask delivers a lot of flexibility and performance with options for various scenarios.

Posted by Stan Reshetnyk on May 8, 2012

Awesome! Just tested on ipad. Bitmap is quite fast.

1. casheAsBitmap didn’t helped for my SWFLoader content. But your component really works.

2. I noticed app crash on ipad 1 when scaling content too much. I guess it is related to bitmap size limitation.

3. I do use bitmapMode=true/false when mouseMove started/finished. Setting bitmapMode to true makes performance hit. Is there way make it smoother? I think it’s possible by keeping updating bitmap at the background (or not recreating it).

Thanks a lot!

Posted by Jack on May 8, 2012

The only reason I can think of that you’d experience a performance hit when bitmapMode is true is if you’re scaling or rotating the target which forces the BlitMask to recapture the entire bitmap. Otherwise, you should see a nice performance improvement.

Posted by Serg on December 4, 2012

Can i move textFields using BlitMask, or only movieClips?

Posted by Jack on December 4, 2012

Sure, BlitMask works for ANY DisplayObject including TextFields.

Posted by Ivan R. on December 11, 2012

Hello, great man!
I really appreciate all the efforts for BlitMask!

I only want a clarification about this statement:
“You may use the code at no charge in commercial or non-commercial web sites, games, components, applications, and other software as long as end users are not charged a fee of any kind to use your product or gain access to it.”
But, if it is a commercial game (in this case, a product), how could I sell it, regaining money from my efforts making the game and all the developers also involved on it? If the game is provided free of charge, it loses the commercial purpose, thus being a free game.

Thanks!

Posted by Jack on December 11, 2012

Fair question, Ivan – what we meant was that you could create a one-off game for a client where you get paid a one-time fee for it by a single client who then distributes it for free to their audience. Technically there’s a commercial component of that equation because you got paid, but since money only changed hands once and end users aren’t paying any fees, it’s covered under the standard “no charge” license. If you’d like to create a game that gets resold, all you need to do is sign up for the appropriate “Business Green” Club GreenSock membership at http://www.greensock.com/club/ which gets you the commercial license and a bunch of other benefits.

Thanks for asking!

Posted by Jon on February 16, 2013

Great stuff, but if rotation (and 3D rotations are) supported, it will be great. Do you have any plan to implement this feature?

Thanks!

Posted by Jack on February 16, 2013

Jon, I can’t see how that would be possible to do – it would completely defeat the purpose (performance). Feel free to let us know if you’ve got any specific ideas about how it could be accomplished.

To download the code, you must agree to the following license:

"NO CHARGE" NON-EXCLUSIVE SOFTWARE LICENSE AGREEMENT
-----------------------------------------------------------------------------
PLAIN ENGLISH SUMMARY:

  1. You may use the code at no charge in commercial or non-commercial apps, web sites, games, components, and other software as long as end users are not charged a fee of any kind to use your product or gain access to any part of it. If your client pays you a one-time fee to create the site/product, that's perfectly fine and qualifies under the "no charge" license. If end users are charged a usage/access/license fee, please sign up for a "Business Green" Club GreenSock membership which comes with a comprehensive commercial license. See http://www.greensock.com/club/ for details.
  2. Use at your own risk. No warranties are offered.
  3. Please respect the copyright.

-----------------------------------------------------------------------------

LEGALESE:

This is a legal agreement between you (either an individual or a single entity) and GreenSock, Inc. ("GREENSOCK") for the proprietary GreenSock code known as TweenLite, TweenMax, TweenNano, TimelineLite, TimelineMax, and other copyrighted code that is available for download at http://www.greensock.com (this code and documentation, as well as any updates which may at GREENSOCK's sole discretion be provided to you from time to time, are referred to in this Agreement as "PROGRAM"). By downloading, copying, or otherwise using the PROGRAM, you agree to the terms and conditions of this Agreement. If you do not agree to the terms and conditions of this Agreement, please do not download or use the PROGRAM.

I. LICENSE
A. Subject to the terms and conditions of this Agreement, GREENSOCK hereby grants you a non-exclusive, worldwide, non-transferable right to use the PROGRAM in apps, web sites, games, components and other software applications ("Developed Works") for which the end user is NOT charged any fees. If you would like to use the code in a commercially licensed Developed Work for which end users are charged a fee (either for usage or access), simply sign up for the appropriate "Business Green" Club GreenSock membership at http://www.greensock.com/club/.

II. LIMITATION OF LICENSE AND RESTRICTIONS
A. You agree that you will not sell, rent, or license the PROGRAM's source code or any derivative works thereof to any third party without the prior written consent of GREENSOCK. Distribution of the PROGRAM as part of your Developed Work is acceptable so long as it is used exclusively as a part of your Developed Work. You agree not to modify or delete GREENSOCK'S existing copyright notices located in the source code.

B. You may use, duplicate, and distribute the compiled object code as embedded in Developed Works created by you, either for your own use or for distribution to a third party so long as end users of the Developed Work are not charged a fee for usage of or access to any portion of the Developed Work. Please see http://www.greensock.com/licensing/ for descriptions of Developed Works that qualify for the "No Charge" license.

C. You may make modifications to the source code exclusively for your own use in order to perform bug fixes or other minor edits required to operate the PROGRAM as originally intended.

III. CONSIDERATION
A. The license rights granted to you under this Agreement are at no charge, but only in the following circumstances: If on your own behalf or on behalf of a third party you incorporate the PROGRAM into a web site, app, game, program or any component thereof (collectively, "Developed Work"), which in the case of a web site, must be accessible to internet users without payment of a fee of any kind, and in the case of a software application, game, program or component, neither you nor anyone to whom you distribute the Developed Work charges a user a fee of any kind to use such Developed Work or application, game, program or component into which such Developed Work is embedded. The foregoing shall apply regardless of whether you are paid to create such Developed Work.

B. In the event your intended use of the PROGRAM does not meet the criteria for the "no charge" license rights set forth in the immediately preceding paragraph, then you are not licensed to use the PROGRAM under this Agreement and must license the PROGRAM under GREENSOCK'S separate fee-based Software License Agreement which is granted to "Business Green" Club GreenSock members (see http://www.greensock.com/club/ for details).

C. You may make modifications to the source code exclusively for your own use in order to perform bug fixes or other minor edits required to operate the PROGRAM as originally intended.

IV. TITLE AND OWNERSHIP
A. The PROGRAM is licensed, not sold, and is protected by copyright laws and international treaty provisions. You acknowledge that no title to the intellectual property in the PROGRAM is transferred to you. You further acknowledge that title and full ownership rights to the PROGRAM, including all intellectual property rights therein, will remain the exclusive property of GREENSOCK and you will not acquire any rights to the PROGRAM except as expressly set forth in this Agreement. You agree that any copies of the PROGRAM you make will contain the same proprietary notices which appear on and in the PROGRAM. You agree that GREENSOCK may identify you as a licensee unless you make a written request otherwise. GREENSOCK hereby grants to you the right to disclose that your product, game, software application, component, or other Developed Work makes use of GREENSOCK code (for example, "Powered by TweenLite").

V. DISCLAIMER OF WARRANTY AND LIMITATION OF LIABILITY
A. THE PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. GREENSOCK DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE PROGRAM WILL MEET YOUR REQUIREMENTS OR THAT OPERATION WILL BE UNINTERRUPTED OR ERROR FREE. GREENSOCK shall not be liable for special, indirect, incidental, or consequential damages with respect to any claim on account of or arising from this Agreement or use of the PROGRAM, even if GREENSOCK has been or is hereafter advised of the possibility of such damages. Because some states do not allow certain exclusions or limitations on implied warranties or of liability for consequential or incidental damages, the above exclusions may not apply to you. In no event, however, will GREENSOCK be liable to you, under any theory of recovery, in an amount in excess of $250. Notwithstanding anything else in this agreement, you agree to indemnify GREENSOCK, its assignees, and licensees, and hold each of them harmless from and against any and all claims, losses, damages, and expenses, including legal fees arising out of or resulting from any negligent act or omission by you.

B. GREENSOCK may, at its sole discretion, provide support services related to the PROGRAM, but has no obligation to do so.

VI. TERMINATION
If you at any time fail to abide by the terms of this Agreement, GREENSOCK shall have the right to immediately terminate the license granted herein and pursue any other legal or equitable remedies available.

VII. MISCELLANEOUS
A. This Agreement shall be construed in accordance with the laws of the State of Illinois. In the event of any dispute between you and GREENSOCK with respect to this Agreement, we both agree that if we cannot resolve the dispute in good faith discussion, either of us may submit the dispute for resolution to arbitration with the American Arbitration Association before a single arbitrator using the AAA Rules for Commercial Arbitration. The arbitrator's decision is final and can be enforced in any court with jurisdiction over such matters.

B. This agreement represents the complete and exclusive statement of the agreement between GREENSOCK and you and supersedes all prior agreements, proposals, representations and other communications, verbal or written, between them with respect to use of the program. This agreement may be modified only with the mutual written approval of authorized representatives of the parties.

C. The terms and conditions of this Agreement shall prevail notwithstanding any different, conflicting, or additional terms or conditions which may appear in any purchase order or other document submitted by you. You agree that such additional or inconsistent terms are deemed rejected by GREENSOCK.

D. GREENSOCK and you agree that any xerographically or electronically reproduced copy of this Agreement shall have the same legal force and effect as any copy bearing original signatures of the parties.

Copyright 2006-2013, GreenSock, Inc. Updated 2012-08-28

I'd like to learn how to get bonus plugins, update notifications, SVN access, and more.
To continue, you must agree to the following license: