@@ -337,7 +337,10 @@ Crafty.DrawManager = (function () {
337337 /** array of dirty rects on screen */
338338 var dirty_rects = [ ] , changed_objs = [ ] ,
339339 /** array of DOMs needed updating */
340- dom = [ ] ,
340+ dom = [ ] ,
341+
342+ dirtyViewport = false ,
343+
341344
342345 /** recManager: an object for managing dirty rectangles. */
343346 rectManager = {
@@ -413,6 +416,9 @@ Crafty.DrawManager = (function () {
413416
414417 } ;
415418
419+ Crafty . bind ( "InvalidateViewport" , function ( ) { dirtyViewport = true } ) ;
420+ Crafty . bind ( "PostRender" , function ( ) { dirtyViewport = false } ) ;
421+
416422 return {
417423 /**@
418424 * #Crafty.DrawManager.total2D
@@ -577,15 +583,21 @@ Crafty.DrawManager = (function () {
577583
578584 renderCanvas : function ( ) {
579585 var l = changed_objs . length ;
580- if ( ! l ) { return ; }
586+ if ( ! l && ! dirtyViewport ) { return ; }
581587
582588 var i = 0 , l = changed_objs . length , rect , q ,
583589 j , len , obj , ent , ctx = Crafty . canvas . context , DM = Crafty . DrawManager ;
590+
584591
592+ if ( dirtyViewport ) {
593+ var view = Crafty . viewport ;
594+ ctx . setTransform ( view . _scale , 0 , 0 , view . _scale , view . x , view . y )
595+
596+ }
585597 //if the amount of changed objects is over 60% of the total objects
586598 //do the naive method redrawing
587599 // TODO: I'm not sure this condition really makes that much sense!
588- if ( l / DM . total2D > 0.6 ) {
600+ if ( l / DM . total2D > 0.6 || dirtyViewport ) {
589601 DM . drawAll ( ) ;
590602 rectManager . clean ( )
591603 return ;
@@ -672,6 +684,15 @@ Crafty.DrawManager = (function () {
672684 * @see DOM.draw
673685 */
674686 renderDOM : function ( ) {
687+ // Adjust the viewport
688+ if ( dirtyViewport ) {
689+ var style = Crafty . stage . inner . style , view = Crafty . viewport ;
690+
691+ style . transform = style [ Crafty . support . prefix + "Transform" ] = "scale(" + view . _scale + ", " + view . _scale + ")"
692+ style . left = view . x + "px" ;
693+ style . top = view . y + "px" ;
694+ style . zIndex = 10 ;
695+ }
675696
676697 //if no objects have been changed, stop
677698 if ( ! dom . length ) return ;
0 commit comments