チェンジセット 1565

差分発生行の前後
無視リスト:
コミット日時:
2008/10/10 17:16:12 (3 年前)
コミッタ:
gyuque
ログメッセージ:

0.4.9: *limited* implementation of ColorTransform?

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • ruby/jsplash/trunk/client2/demo_20081001.xml

    r1561 r1565  
    5656                <p id="statusout"> </p> 
    5757                <p>playing on javascript with JSplash</p> 
    58                 <p id="sout">starting <em>JSplash Player 0.4.8</em>...<br />-------------------------------------<br /></p> 
     58                <p id="sout">starting <em>JSplash Player 0.4.9</em>...<br />-------------------------------------<br /></p> 
    5959                <svg id="svgrt" xmlns="http://www.w3.org/2000/svg" style="width: 100px; height: 100px;"> 
    6060                </svg> 
  • ruby/jsplash/trunk/client2/index.xml

    r1561 r1565  
    5454                <div id="progbar"><div>  </div></div> 
    5555                <p id="statusout"> </p> 
    56                 <p id="sout"><em>JSplash Player</em> 0.4.8<br />-------------------------------------<br /></p> 
     56                <p id="sout"><em>JSplash Player</em> 0.4.9<br />-------------------------------------<br /></p> 
    5757                <svg id="svgrt" xmlns="http://www.w3.org/2000/svg" style="width: 100px; height: 100px;"> 
    5858                </svg> 
  • ruby/jsplash/trunk/client2/jsplash/objects.js

    r1561 r1565  
    4545                this.appended = false; 
    4646                this.shape_disposed = false; 
     47                this.overridden = false; 
    4748 
    4849                this.mousePos = {x:0, y:0}; 
     
    104105                                this.parent.removeForce(this); 
    105106                        delete this.g; 
     107                        this.overridden = null; 
    106108                        return true; 
    107109                } 
     
    188190        }, 
    189191         
    190         placeObject: function(depth, oid, iname, clip_depth, replace_flg, inherit_transform) { 
     192        placeObject: function(depth, oid, iname, clip_depth, replace_flg, inherit_transform, inherit_color_transform) { 
    191193                this.clipMap[depth] = clip_depth || this.clipMap[depth]; 
    192194 
     
    201203                        if (po) { 
    202204                                po.resume(depth); 
    203                                 if (inherit_transform && this.depthMap[depth]) 
    204                                         po.copyTransformFrom(this.depthMap[depth]); 
     205                                if (this.depthMap[depth]) { 
     206                                        if (inherit_transform) 
     207                                                po.copyTransformFrom(this.depthMap[depth]); 
     208                                        if (inherit_color_transform) 
     209                                                po.copyColorTransform(this.depthMap[depth]); 
     210                                } 
    205211                                 
    206212                                this.depthMap[depth] = po; 
    207213                                if (po.isExecutable() && oid /* new instance */ ) // This is needed to execute descendant tags! 
    208214                                        this.executor.registerObject(po); 
    209                                  
     215 
     216                                if (clip_depth) 
     217                                        po.hide(); 
    210218                        } 
    211219                 
     
    227235                                inst.renderer = klass.renderer; 
    228236 
     237                        inst.render(); 
    229238                        /* when replace previous frame */ 
    230239                        var g_before = null; 
     
    232241                                if (inherit_transform) 
    233242                                        inst.copyTransformFrom(replaced); 
     243 
     244                                if (inherit_color_transform) { 
     245                                        inst.copyColorTransform(replaced); 
     246                                } 
     247                                 
    234248                                g_before = replaced.getActiveViewElement(); /* to correct draw order*/ 
    235249                        } 
    236250                         
    237                         inst.render(); 
    238251                        if (clip_depth) 
    239252                                inst.hide(); 
     
    295308//              if (inst.taglist) 
    296309//                      console.log( "  child has tags len="+inst.taglist.length ); 
     310                 
    297311                 
    298312                return inst; 
     
    365379                } 
    366380         
    367                 if (!skip_visual_change)         
     381                if (!skip_visual_change) 
     382                { 
    368383                        this.applyClippers(); 
     384                        this.applyColorOverriding(this.overridden); 
     385                } 
    369386 
    370387                if (this.g && this.g.childNodes.length > 0 && !this.klass.isShapeObject) 
     
    373390         
    374391        setAlpha: function(a) { 
     392                if (a > 0.99) a = 1; 
    375393                this.g.style.opacity = a; 
    376394        }, 
     
    408426*/ 
    409427 
     428// TODO: cancel overriding 
     429        resetColorTransform: function() { 
     430                if (this.overridden == null) 
     431                        return; 
     432 
     433                this.cancelColorOverriding(); 
     434                console.log(this); 
     435        }, 
     436         
     437        cancelColorOverriding: function() { 
     438                if (this.klass.isShapeObject) { 
     439                        if (this.overridden == null) 
     440                                return; 
     441                 
     442                        var list = this.g.childNodes; 
     443                        var len = list.length; 
     444                        for (var i = 0;i < len;i++) { 
     445                                var ch = list[i]; 
     446                                if (ch.original_fill)   ch.setAttribute("fill"  , ch.original_fill); 
     447                                if (ch.original_stroke) ch.setAttribute("stroke", ch.original_stroke); 
     448                        } 
     449                } 
     450                else { 
     451                        for (var d in this.depthMap) 
     452                                this.depthMap[d].cancelColorOverriding(); 
     453                } 
     454                         
     455                this.overridden = null; 
     456        }, 
     457 
     458        overrideShapeColor: function(r, g, b) { 
     459                var clr = "rgb("+r+","+g+","+b+")"; 
     460                if (this.klass.isShapeObject) 
     461                        this.applyColorOverriding(clr); 
     462                else 
     463                        this.overridden = clr; 
     464                 
     465        }, 
     466         
     467        applyColorOverriding: function(clr) { 
     468                if (!this.overridden && !clr) return; 
     469                if (this.klass.isShapeObject) { 
     470                        if (this.overridden == clr) 
     471                                return; 
     472                 
     473                        if (this.renderer.isPrimaryCache(this.g)) { 
     474                                this.renderer.savePrimaryCache(); 
     475                        } 
     476                 
     477                        var list = this.g.childNodes; 
     478                        var len = list.length; 
     479                        for (var i = 0;i < len;i++) { 
     480                                var ch = list[i]; 
     481                                var f = ch.getAttribute("fill"); 
     482                                if (f && f != "none") { 
     483                                        if (!ch.original_fill) 
     484                                                ch.original_fill = f; 
     485                                                 
     486                                        ch.setAttribute("fill", clr); 
     487                                } 
     488                                 
     489                                var st = ch.getAttribute("stroke"); 
     490                                if (st && st != "none") { 
     491                                        if (!ch.original_stroke) 
     492                                                ch.original_stroke = st; 
     493                                                 
     494                                        ch.setAttribute("stroke", clr); 
     495                                } 
     496                                 
     497                        } 
     498                } 
     499                else { 
     500                        for (var d in this.depthMap) 
     501                                this.depthMap[d].applyColorOverriding(clr); 
     502                } 
     503                         
     504                this.overridden = clr; 
     505        }, 
     506 
    410507        getActiveViewElement: function() { 
    411508                return this.g; 
     
    557654        toString: function() { 
    558655                return "Inst@"+this.klass+" belongs to " +this.parent; 
     656        }, 
     657         
     658        copyColorTransform: function(src) { 
     659                if (src.overridden) { 
     660                        this.applyColorOverriding(src.overridden); 
     661                } 
    559662        }, 
    560663         
  • ruby/jsplash/trunk/client2/jsplash/shaperenderer.js

    r1561 r1565  
    656656        }, 
    657657         
     658        isPrimaryCache: function(g) { 
     659                if (!this.pathCache) 
     660                        return false; 
     661                         
     662                return this.pathCache.primaryCache == g; 
     663        }, 
     664         
     665        savePrimaryCache: function() { 
     666                if (!this.pathCache) 
     667                        return; 
     668                 
     669                this.pathCache.savePrimaryCache(); 
     670        }, 
     671         
    658672        buildSVG: function(g, force_cache) { 
    659673                if (!this.pathCache && (this.hitCount == 2 || force_cache)) { 
    660                         this.pathCache = new JSplash.ShapeRenderer.PathCache(); 
     674                        this.pathCache = new JSplash.ShapeRenderer.PathCache(g); 
    661675                        this.do_cache = true; 
    662676                } 
     
    969983JSplash.ShapeRenderer.PathCache = Class.create(); 
    970984JSplash.ShapeRenderer.PathCache.prototype = { 
    971         initialize: function() { 
     985        initialize: function(prim) { 
     986                this.primaryCache = prim; 
    972987                this.stocks = []; 
    973988        }, 
    974989 
    975990        stock: function(elem) { 
    976                 this.stocks.push(elem /* not clone! don't modify... */ ); 
     991                this.stocks.push(elem /* not clone! don't modify children... */ ); 
    977992        }, 
    978993         
     
    981996                for (var i = 0;i < len;i++) 
    982997                        target.appendChild( this.stocks[i].cloneNode(false) ); 
     998        }, 
     999         
     1000        savePrimaryCache: function() { 
     1001                this.primaryCache = null; 
     1002                var new_list = []; 
     1003                var len = this.stocks.length; 
     1004                for (var i = 0;i < len;i++) 
     1005                        new_list.push( this.stocks[i].cloneNode(false) ); 
     1006 
     1007                this.stocks = new_list; 
    9831008        } 
    9841009} 
  • ruby/jsplash/trunk/client2/jsplash/tags.js

    r1561 r1565  
    1212                tPlaceObject2: function(data, owner) { 
    1313                        var has_trans = (data.mov || data.scl || data.skw); 
     14                        var has_clrtrans = (data.cfct || data.cofs); 
    1415                 
    15                         var inst = owner.placeObject(data.d, data.id, data.name, data.cl, data.r, (data.r && !has_trans)); 
     16                        var inst = owner.placeObject(data.d, data.id, data.name, data.cl, data.r, (data.r && !has_trans), (data.r && !has_clrtrans && !data.ctr)); 
    1617                        if (!inst) { 
    1718                                console.warn("WARNING: unregistered object id="+data.d); 
     
    4445                        } 
    4546                         
    46                         if (data.cfct || data.cofs) { 
     47                        if (has_clrtrans) { 
    4748                                /* Google Chrome does not support feColorMatrix now. */ 
    4849                                 
    49                                 // ...but alpha transform is available with opacity style. 
     50                                // but, when factor=0, ColorTransform can be represented as solid fill 
     51                                if (data.cfct) { 
     52                                        if (data.cfct[0] < 0.1 && data.cfct[1] < 0.1 && data.cfct[2] < 0.1) { 
     53                                                var cr = 0; 
     54                                                var cg = 0; 
     55                                                var cb = 0; 
     56                                                if (data.cofs) { 
     57                                                        cr = Math.floor(data.cofs[0]*255); 
     58                                                        cg = Math.floor(data.cofs[1]*255); 
     59                                                        cb = Math.floor(data.cofs[2]*255); 
     60                                                } 
     61                                                inst.overrideShapeColor(cr, cg, cb); 
     62                                        } 
     63                                } 
     64                                 
     65                                // in addition, alpha transform is available with opacity style. 
    5066                                var a = data.cfct ? data.cfct[3] : 1  
    5167                                a += data.cofs ? data.cofs[3] : 0; 
    5268                                 
    53                                 if (a <= 0.99) 
    54                                         inst.setAlpha(a); 
     69                                inst.setAlpha(a); 
     70                        } 
     71                        else if (data.ctr) { 
     72                                inst.resetColorTransform(); 
     73                                inst.setAlpha(1); 
    5574                        } 
    5675                }, 
  • ruby/jsplash/trunk/client2/rocket_demo.xml

    r1561 r1565  
    5656                <p id="statusout"> </p> 
    5757                <p>playing on javascript with JSplash</p> 
    58                 <p id="sout">starting <em>JSplash Player 0.4.8</em>...<br />-------------------------------------<br /></p> 
     58                <p id="sout">starting <em>JSplash Player 0.4.9</em>...<br />-------------------------------------<br /></p> 
    5959                <svg id="svgrt" xmlns="http://www.w3.org/2000/svg" style="width: 100px; height: 100px;"> 
    6060                </svg> 
  • ruby/jsplash/trunk/jextract.rb

    r1494 r1565  
    8484                case ch.name 
    8585                when 'LineStyle' 
    86                         clra = ch.elements['./color/Color'].attributes 
     86                        clra = nil 
     87                        if ch.elements['./color/Color'] 
     88                                clra = ch.elements['./color/Color'].attributes 
     89                        else 
     90                                clra = ch.elements['./fillColor/Color'].attributes # DefineShape5 
     91                        end 
     92 
    8793                        alpha = nil 
    8894                        alpha = ",a:#{ clra['alpha'].to_f/255 }" if clra['alpha'] 
     
    145151        end 
    146152 
     153        def self.readDefineShape5(tg, nest, fi) 
     154                TagReaders.readDefineShape(tg, nest, fi, 5) 
     155        end 
     156 
    147157        def self.readDefineShape3(tg, nest, fi) 
    148158                TagReaders.readDefineShape(tg, nest, fi, 3) 
     
    210220                                cofs = ",cofs:[#{a['offsetRed'].to_f/255},#{a['offsetGreen'].to_f/255},#{a['offsetBlue'].to_f/255},#{a['offsetAlpha'].to_f/255}]" 
    211221                        end 
     222 
     223                        cfct = ",ctr:true" if !cfct && !cofs # reset 
    212224                end 
    213225