チェンジセット 1579

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

0.4.10: supported DefineBits? bitmap fill

ファイル:

凡例:

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

    r1565 r1579  
    5656                <p id="statusout"> </p> 
    5757                <p>playing on javascript with JSplash</p> 
    58                 <p id="sout">starting <em>JSplash Player 0.4.9</em>...<br />-------------------------------------<br /></p> 
     58                <p id="sout">starting <em>JSplash Player 0.4.10</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

    r1565 r1579  
    5454                <div id="progbar"><div>  </div></div> 
    5555                <p id="statusout"> </p> 
    56                 <p id="sout"><em>JSplash Player</em> 0.4.9<br />-------------------------------------<br /></p> 
     56                <p id="sout"><em>JSplash Player</em> 0.4.10<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

    r1566 r1579  
    782782        s.mouse_down = false; 
    783783        s.is_stage = true; 
     784        s.bitmapRefs = {}; 
    784785         
    785786        Object.extend(s, { 
     
    817818                toString: function() { 
    818819                        return "Stage"; 
    819                 } 
    820          
     820                }, 
     821         
     822                registerBitmaps: function(list) { 
     823                        var len = list.length; 
     824                        for (var i = 0;i < len;i++) { 
     825                                this.registerBitmapRef(list[i]); 
     826                        } 
     827                }, 
     828                 
     829                registerBitmapRef: function(b) { 
     830                        if (/([0-9]+)\./.test(b.n)) { 
     831                                var oid = RegExp['$1'] - 0; 
     832                                this.bitmapRefs[oid] = b; 
     833                        } 
     834                }, 
     835                 
     836                getImageRef: function(oid) { 
     837                        return this.bitmapRefs[oid] || null; 
     838                } 
    821839        } ); // extend 
    822840         
  • ruby/jsplash/trunk/client2/jsplash/player.js

    r1561 r1579  
    2323                svg.style.height = swf.pxHeight + "px"; 
    2424                this.stage = new JSplash.ObjectInstance.createStageObject(swf.taglist, svg, swf.label_map); 
     25                 
     26                if (swf.bitmaps) 
     27                        this.stage.registerBitmaps(swf.bitmaps); 
     28                 
    2529                this.disposer = new JSplash.ShapeDisposer(this.stage); 
    2630                 
     
    206210        this.frameRate = h.frameRate; 
    207211        this.taglist   = sdat.taglist; 
    208         this.label_map   = sdat.label_map; 
     212        this.label_map = sdat.label_map; 
     213        this.bitmaps   = sdat.bitmaps; 
    209214} 
    210215 
  • ruby/jsplash/trunk/client2/jsplash/shaperenderer.js

    r1565 r1579  
    7878                var fid = "gf"+this.shape_id+"_"+fi; 
    7979                var filldata = this.fillStyles[fi-1]; 
    80                 if (!filldata.grad) 
     80                 
     81                if (!filldata.grad && !filldata.bmp) 
    8182                        return null; 
    82                          
    83                 var attrs = {id: fid, gradientUnits: 'userSpaceOnUse', x1: -819, x2: 819}; 
     83 
     84                var imgdat; 
     85                if (filldata.bmp) { 
     86                        imgdat = JSplash.gPlayer.stage.getImageRef(filldata.bmp); 
     87                        if (!imgdat) 
     88                                return null; 
     89                } 
     90                         
     91                var attrs =  
     92                        filldata.grad ? {id: fid, gradientUnits: 'userSpaceOnUse', x1: -819, x2: 819} 
     93                                      : {id: fid, patternUnits: 'userSpaceOnUse'}; 
    8494                if (filldata.mov || filldata.scl || filldata.skw) { 
    8595                        var M =[1, 0, 0, 1, 0, 0]; 
     
    98108                                M[2] = filldata.skw[1]; 
    99109                        } 
    100  
    101                         attrs.gradientTransform = "matrix("+M.join(' ')+")"; 
    102                 } 
    103                  
    104                 if (filldata.grad!=1) 
    105                 { 
    106                         attrs.r  = 819; 
    107                         attrs.fx = 0; 
    108                         attrs.fy = 0; 
    109                 } 
    110                  
    111                 var gdef = JSplash.$svg((filldata.grad==1) ? "linearGradient" : "radialGradient", attrs); 
    112                 JSplash.defsElement.appendChild(gdef); 
    113                  
    114                  
    115                 var len = filldata.s.length; 
    116                 for (var i = 0;i < len;i++) { 
    117                         var attr = {'stop-color': ('#'+filldata.c[i]), offset: (filldata.s[i] / 255)}; 
    118                         if (filldata.a) { 
    119                                 attr["stop-opacity"] = filldata.a[i]; 
    120                         } 
    121                         var stp = JSplash.$svg("stop", attr); 
    122                         gdef.appendChild(stp); 
     110                         
     111                        if (imgdat) { 
     112                                M[0] /= 20; 
     113                                M[3] /= 20; 
     114                                M[4] /= 20; 
     115                                M[5] /= 20; 
     116                                 
     117                                M[4] += imgdat.w/2; 
     118                                M[5] += imgdat.h/2; 
     119                        } 
     120 
     121                        if (filldata.grad) 
     122                                attrs.gradientTransform = "matrix("+M.join(' ')+")"; 
     123                        else 
     124                                attrs.patternTransform  = "matrix("+M.join(' ')+")"; 
     125                } 
     126 
     127                var gdef; 
     128                if (filldata.grad) { 
     129                        if (filldata.grad!=1) 
     130                        { 
     131                                attrs.r  = 819; 
     132                                attrs.fx = 0; 
     133                                attrs.fy = 0; 
     134                        } 
     135                         
     136                        gdef = JSplash.$svg((filldata.grad==1) ? "linearGradient" : "radialGradient", attrs); 
     137                        JSplash.defsElement.appendChild(gdef); 
     138                         
     139                         
     140                        var len = filldata.s.length; 
     141                        for (var i = 0;i < len;i++) { 
     142                                var attr = {'stop-color': ('#'+filldata.c[i]), offset: (filldata.s[i] / 255)}; 
     143                                if (filldata.a) { 
     144                                        attr["stop-opacity"] = filldata.a[i]; 
     145                                } 
     146                                var stp = JSplash.$svg("stop", attr); 
     147                                gdef.appendChild(stp); 
     148                        } 
     149                } 
     150                else { 
     151                        attrs.width  = imgdat.w; 
     152                        attrs.height = imgdat.h; 
     153                 
     154                        gdef = JSplash.$svg("pattern", attrs); 
     155                        JSplash.defsElement.appendChild(gdef); 
     156                         
     157                        var img = JSplash.$svg("image", {width: imgdat.w, height: imgdat.h}); 
     158                        img.setAttributeNS("http://www.w3.org/1999/xlink", "href", JSplash.LOAD_DIR + "/res/" + imgdat.n); 
     159                        gdef.appendChild(img); 
    123160                } 
    124161                 
     
    490527                if (style.rgb) 
    491528                        style_str = '#'+style.rgb; 
    492                 else if (style.grad
     529                else if (style.grad || style.bmp
    493530                        style_str = 'url(#' + this.lookupFillId(fi)+')'; 
    494531                         
  • ruby/jsplash/trunk/client2/rocket_demo.xml

    r1565 r1579  
    5656                <p id="statusout"> </p> 
    5757                <p>playing on javascript with JSplash</p> 
    58                 <p id="sout">starting <em>JSplash Player 0.4.9</em>...<br />-------------------------------------<br /></p> 
     58                <p id="sout">starting <em>JSplash Player 0.4.10</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

    r1565 r1579  
    11$KCODE = 's' 
    22require 'rexml/document' 
     3require 'rawswf' 
    34 
    45$top_frame_index = 0 
    56$top_tag_index = 0 
     7 
     8$shared_jpeg_table = nil 
     9$bitmap_refs = nil 
    610 
    711def make_rgb(attrs) 
     
    2024 
    2125        "L:#{vL},R:#{vR},T:#{vT},B:#{vB}" 
     26end 
     27 
     28def read_bitmap_fill(ls) 
     29        bid = ls.attributes['objectID'].to_i 
     30 
     31        trans_elem = ls.elements['./matrix/Transform'] 
     32        trans = nil 
     33 
     34        trans = trans_elem.attributes if trans_elem 
     35        mov = nil 
     36        scl = nil 
     37        skw = nil 
     38        if trans 
     39                a = trans 
     40 
     41                mov = ",mov:[#{a['transX'].to_f},#{a['transY'].to_f}]" if a['transX'] 
     42                scl = ",scl:[#{a['scaleX'].to_f},#{a['scaleY'].to_f}]" if a['scaleX'] 
     43                skw = ",skw:[#{a['skewX'].to_f},#{a['skewY'].to_f}]"   if a['skewX'] 
     44        end      
     45 
     46        "{bmp:#{bid}#{mov}#{scl}#{skw}}" 
    2247end 
    2348 
     
    7196                when 'RadialGradient' 
    7297                        styles << read_gradient(ch, 1) 
     98                when 'ClippedBitmap' 
     99                        styles << read_bitmap_fill(ch) 
    73100                end 
    74101        } 
     
    151178        end 
    152179 
     180        def self.readJPEGTables(tg, nest, fi) 
     181                $shared_jpeg_table = tg.elements['./data'].text 
     182        end 
     183 
    153184        def self.readDefineShape5(tg, nest, fi) 
    154185                TagReaders.readDefineShape(tg, nest, fi, 5) 
     
    175206 
    176207                "{tag:JSplash.tDefineShape#{v}, id:#{tg.attributes['objectID']}, bounds:{#{make_bounds(bds)}}, fill_styles:[\n #{f_json}\n], line_styles:[\n #{l_json}\n], shape:[\n#{shapes}\n]}" 
     208        end 
     209 
     210        def self.readDefineBits(tg, nest, fi) 
     211                $bitmap_refs = [] if !$bitmap_refs 
     212 
     213                db = RawSWF::RawDefineBitsTag.new(tg.elements['./data/data'].text) 
     214                db.id = tg.attributes['objectID'].to_i 
     215                $bitmap_refs << db 
    177216        end 
    178217 
     
    308347                if tg.name == "Export" || tg.name == "DoInitAction" 
    309348                        STDERR.puts "ignored [#{tg.name}] at #{$top_tag_index}" 
     349                        next 
     350                elsif tg.name == "UnknownTag" && tg.attributes['id'].to_i(16) == 8 # JPEGTables 
     351                        TagReaders.readJPEGTables(tg, nest, findex) 
     352                        next 
     353                elsif tg.name == "DefineBits" 
     354                        TagReaders.readDefineBits(tg, nest, findex) 
    310355                        next 
    311356                end 
     
    338383end 
    339384 
     385def check_res_dir(outdir) 
     386        rdir = "#{outdir}/res" 
     387        Dir::mkdir(rdir) if !File.exists?(rdir) 
     388 
     389        return rdir 
     390end 
     391 
     392def export_bitmaps(outdir) 
     393        return if !$bitmap_refs 
     394 
     395        rdir = check_res_dir(outdir) 
     396        $bitmap_refs.each {|b| 
     397                out_name = "#{rdir}/#{b.id}" 
     398                if RawSWF::RawDefineBitsTag === b 
     399                        raise "JPEGTables not found in input SWF" if !$shared_jpeg_table 
     400 
     401                        b.table_data = $shared_jpeg_table 
     402                        b.export_file(out_name + ".jpg") 
     403                end 
     404        } 
     405end 
     406 
    340407#---------------------------- 
    341408 
    342 in_swf  = ARGV[0] 
    343 out_dir = ARGV[1] 
     409in_swf       = ARGV[0] 
     410out_dir      = ARGV[1] 
     411split_thresh = ARGV[2] 
     412 
    344413if !in_swf 
    345414        puts "USAGE: ruby jconvert.rb [in.swf]" 
     
    347416end 
    348417 
    349 if !out_dir 
    350         out_dir = "movie_temp_out" 
    351         Dir::mkdir(out_dir) if !File.exists?(out_dir) 
    352 end 
     418split_thresh = split_thresh ? split_thresh.to_i : 25000 
     419 
     420# check output dir 
     421out_dir = "movie_temp_out" if !out_dir 
     422Dir::mkdir(out_dir) if !File.exists?(out_dir) 
    353423 
    354424STDERR.puts "extracting..." 
     
    371441 
    372442top_tags   = parse_taglist(tags.elements, lmap) 
    373 split_file = (top_tags.length > 25000
     443split_file = (top_tags.length > split_thresh
    374444 
    375445out1 = "#{out_dir}/movie1.js" 
     446 
     447export_bitmaps(out_dir) 
    376448 
    377449File.open(out1,'w'){|f1| 
    378450        next_file = nil 
    379         tags_1 = top_tags.slice!(0, 25000
     451        tags_1 = top_tags.slice!(0, split_thresh
    380452        if split_file 
    381453                next_file = ", 'movie2.js'" 
     
    384456        f1.puts "JSplash.load_swf( {" 
    385457        f1.puts " header: {frameRate: #{swf.frame_rate}, frames: #{swf.frames}, width: #{swf.width}, height: #{swf.height}}," 
     458        f1.puts " bitmaps: [#{$bitmap_refs.map{|b| "{n:'#{b.id}.#{b.ftype}',w:#{b.width},h:#{b.height}}"}.join(',')}]," if $bitmap_refs 
    386459        f1.puts " taglist: [" 
    387460        f1.puts tags_1.join(",\n") 
  • ruby/jsplash/trunk/rawswf.rb

    r1568 r1579  
    2626 
    2727class RawDefineBitsTag 
     28        attr_accessor :id 
     29 
     30        attr_reader :width 
     31        attr_reader :height 
     32 
    2833        def initialize(b64) 
    2934                @raw = Base64.decode64(b64) 
     35                extract_size 
     36        end 
     37 
     38        def extract_size 
     39                i = 0 
     40                while(true) 
     41                        break if @raw[i] == 0xff && @raw[i+1] == 0xc0 
     42                        i += 1 
     43 
     44                        raise if i > 10000 
     45                end 
     46 
     47                i += 5 
     48                @height = (@raw[i]<<8) | @raw[i+1] 
     49 
     50                i += 2 
     51                @width = (@raw[i]<<8) | @raw[i+1] 
    3052        end 
    3153 
    3254        def table_data=(b64) 
    3355                @raw_tbl = Base64.decode64(b64) 
     56        end 
     57 
     58        def ftype 
     59                "jpg" 
    3460        end 
    3561