swf_ruby 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +7 -1
- data/bin/swf_dump +1 -5
- data/bin/swf_jpeg_replace +1 -4
- data/bin/swf_lossless_replace +15 -0
- data/lib/swf_ruby/swf/bits_lossless2.rb +75 -0
- data/lib/swf_ruby/swf_tamperer.rb +29 -0
- data/lib/swf_ruby/version.rb +1 -1
- data/lib/swf_ruby.rb +2 -0
- data/swf_ruby.gemspec +2 -1
- metadata +21 -3
data/README.md
CHANGED
@@ -9,7 +9,7 @@ SwfRuby is a utilities to dump or manipulate a SWF with Ruby.
|
|
9
9
|
* Used from 'swf_dump' command.
|
10
10
|
* SwfRuby::SwfTamperer
|
11
11
|
* Manipulating(replagcing) resources in SWF.
|
12
|
-
* Used from 'swf_jpeg_replace' command.
|
12
|
+
* Used from 'swf_jpeg_replace' and 'swf_lossless_replace' command.
|
13
13
|
* compatible on ruby-1.8.7 and ruby-1.9.2.
|
14
14
|
|
15
15
|
Dependencies
|
@@ -51,6 +51,12 @@ Replacing Jpeg in SWF
|
|
51
51
|
$ swf_jpeg_replace samples/sample.swf 623 samples/bg.jpg > samples/sample2.swf
|
52
52
|
# <623> is offset to DefineBitsJPEG2 resource getting by 'swf_dump'.
|
53
53
|
|
54
|
+
Replacing Jpeg in SWF
|
55
|
+
---------------------
|
56
|
+
|
57
|
+
$ swf_lossless_replace samples/sample.swf 120 samples/icon.gif > samples/sample3.swf
|
58
|
+
# <120> is offset to DefineBitsLossless2 resource getting by 'swf_dump'.
|
59
|
+
|
54
60
|
Thanks
|
55
61
|
======
|
56
62
|
|
data/bin/swf_dump
CHANGED
@@ -4,11 +4,7 @@
|
|
4
4
|
|
5
5
|
require 'swf_ruby'
|
6
6
|
|
7
|
-
if ARGV.size != 1
|
8
|
-
print "Specify swf file path to dump for argument.\n"
|
9
|
-
exit
|
10
|
-
end
|
11
|
-
|
7
|
+
print "Specify swf file path to dump for argument." if ARGV.size != 1
|
12
8
|
swf = SwfRuby::SwfDumper.new
|
13
9
|
swf.open(ARGV[0])
|
14
10
|
swf.tags.each_with_index do |tag, i|
|
data/bin/swf_jpeg_replace
CHANGED
@@ -3,10 +3,7 @@
|
|
3
3
|
# SWF中のJpeg(DefineBitsJpeg2)イメージを差し替える.
|
4
4
|
require 'swf_ruby'
|
5
5
|
|
6
|
-
if ARGV.size != 3
|
7
|
-
print "Specify target swf path, offset to jpeg, new jpeg path for arguments.\n"
|
8
|
-
exit
|
9
|
-
end
|
6
|
+
print "Specify target swf path, offset to jpeg, new jpeg path for arguments." if ARGV.size != 3
|
10
7
|
|
11
8
|
swf = File.open(ARGV[0], "rb").read
|
12
9
|
st = SwfRuby::SwfTamperer.new
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# vim: set fileencoding=utf-8 filetype=ruby ts=2 :
|
3
|
+
# SWF中のLossless(DefineBitsLossless2)イメージを差し替える.
|
4
|
+
require 'swf_ruby'
|
5
|
+
|
6
|
+
print "Specify target swf path, offset to image, new image(png,gif) path for arguments." if ARGV.size != 3
|
7
|
+
|
8
|
+
swf = File.open(ARGV[0], "rb").read
|
9
|
+
st = SwfRuby::SwfTamperer.new
|
10
|
+
image = File.open(ARGV[2], "rb").read
|
11
|
+
repl_targets = [
|
12
|
+
SwfRuby::Lossless2ReplaceTarget.new(ARGV[1].to_i, image)
|
13
|
+
]
|
14
|
+
|
15
|
+
print st.replace(swf, repl_targets)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# vim: set fileencoding=utf-8 filetype=ruby ts=2 :
|
2
|
+
|
3
|
+
module SwfRuby
|
4
|
+
module Swf
|
5
|
+
class BitsLossless2
|
6
|
+
attr_accessor :format, :width, :height, :color_table_size, :zlib_bitmap_data
|
7
|
+
|
8
|
+
ShiftDepth = Magick::QuantumDepth - 8
|
9
|
+
MaxRGB = 2 ** Magick::QuantumDepth - 1
|
10
|
+
|
11
|
+
def initialize(image_bytearray)
|
12
|
+
image = Magick::Image.from_blob(image_bytearray).first
|
13
|
+
data = ""
|
14
|
+
data.force_encoding("ASCII-8BIT") if data.respond_to? :force_encoding
|
15
|
+
@format = nil
|
16
|
+
colormap = []
|
17
|
+
# creating colormap to check number of colors
|
18
|
+
image.get_pixels(0, 0, image.columns, image.rows).each_with_index do |pixel,i|
|
19
|
+
break if colormap.length > 255
|
20
|
+
idx = colormap.index(pixel)
|
21
|
+
if idx then
|
22
|
+
data << [idx].pack("C")
|
23
|
+
else
|
24
|
+
colormap << pixel
|
25
|
+
data << [colormap.length-1].pack("C")
|
26
|
+
end
|
27
|
+
if (i+1) % image.rows == 0 then
|
28
|
+
# padding
|
29
|
+
data += [0].pack("C") * (4-image.columns&3)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# checking image format by size of colormap
|
34
|
+
if colormap.length > 255 then
|
35
|
+
# format=5
|
36
|
+
# reset and re-build data_stream without colopmap
|
37
|
+
data = ""
|
38
|
+
image.get_pixels(0, 0, image.columns, image.rows).each_with_index do |pixel,i|
|
39
|
+
opacity = (MaxRGB-pixel.opacity) >> ShiftDepth
|
40
|
+
data += [opacity].pack("C")
|
41
|
+
data += [pixel.red >> ShiftDepth].pack("C")
|
42
|
+
data += [pixel.green >> ShiftDepth].pack("C")
|
43
|
+
data += [pixel.blue >> ShiftDepth].pack("C")
|
44
|
+
end
|
45
|
+
@format = 5
|
46
|
+
else
|
47
|
+
# format=3
|
48
|
+
# added colormap before data_stream
|
49
|
+
data = colormap.inject("") { |r,c|
|
50
|
+
opacity = (MaxRGB-c.opacity) >> ShiftDepth
|
51
|
+
if opacity == 0 then
|
52
|
+
r +=
|
53
|
+
[0].pack("C") +
|
54
|
+
[0].pack("C") +
|
55
|
+
[0].pack("C") +
|
56
|
+
[opacity].pack("C")
|
57
|
+
else
|
58
|
+
r +=
|
59
|
+
[c.red >> ShiftDepth].pack("C") +
|
60
|
+
[c.green >> ShiftDepth].pack("C") +
|
61
|
+
[c.blue >> ShiftDepth].pack("C") +
|
62
|
+
[opacity].pack("C")
|
63
|
+
end
|
64
|
+
} + data
|
65
|
+
@format = 3
|
66
|
+
@color_table_size = colormap.length-1
|
67
|
+
end
|
68
|
+
|
69
|
+
@width = image.columns
|
70
|
+
@height = image.rows
|
71
|
+
@zlib_bitmap_data = Zlib::Deflate.deflate(data)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -9,6 +9,8 @@ module SwfRuby
|
|
9
9
|
case rt
|
10
10
|
when Jpeg2ReplaceTarget
|
11
11
|
swf = self.repl_jpeg2(swf, rt.offset, rt.jpeg)
|
12
|
+
when Lossless2ReplaceTarget
|
13
|
+
swf = self.repl_lossless2(swf, rt.offset, rt.image)
|
12
14
|
when AsVarReplaceTarget
|
13
15
|
swf = self.repl_action_push_string(swf, rt.do_action_offset, rt.offset, rt.str, rt.parent_sprite_offsets)
|
14
16
|
end
|
@@ -85,6 +87,33 @@ module SwfRuby
|
|
85
87
|
end
|
86
88
|
swf
|
87
89
|
end
|
90
|
+
|
91
|
+
# DefineBitsLossless2のイメージバイナリを置換.
|
92
|
+
def repl_lossless2(swf, offset, lossless)
|
93
|
+
swf.force_encoding("ASCII-8BIT") if swf.respond_to? :force_encoding
|
94
|
+
|
95
|
+
# replace lossless2 data
|
96
|
+
if lossless.format == 3
|
97
|
+
org_image_length = swf[offset+2, 4].unpack("i").first - 8
|
98
|
+
swf[offset+14, org_image_length] = lossless.zlib_bitmap_data
|
99
|
+
swf[offset+13, 1] = [lossless.color_table_size].pack("C")
|
100
|
+
swf[offset+11, 2] = [lossless.width].pack("v")
|
101
|
+
swf[offset+9, 2] = [lossless.height].pack("v")
|
102
|
+
swf[offset+8, 1] = [lossless.format].pack("C")
|
103
|
+
swf[offset+2, 4] = [lossless.zlib_bitmap_data.size + 8].pack("i")
|
104
|
+
elsif format == 5
|
105
|
+
org_image_length = swf[offset+2, 4].unpack("i").first - 7
|
106
|
+
swf[offset+13, org_image_length] = lossless.zlib_bitmap_data
|
107
|
+
swf[offset+11, 2] = [lossless.width].pack("v")
|
108
|
+
swf[offset+9, 2] = [lossless.height].pack("v")
|
109
|
+
swf[offset+8, 1] = [lossless.format].pack("C")
|
110
|
+
swf[offset+2, 4] = [lossless.zlib_bitmap_data.size + 7].pack("i")
|
111
|
+
else
|
112
|
+
raise ReplaceTargetError
|
113
|
+
end
|
114
|
+
|
115
|
+
swf
|
116
|
+
end
|
88
117
|
end
|
89
118
|
|
90
119
|
# 置換対象指定エラー.
|
data/lib/swf_ruby/version.rb
CHANGED
data/lib/swf_ruby.rb
CHANGED
data/swf_ruby.gemspec
CHANGED
@@ -16,9 +16,10 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.rubyforge_project = "swf_ruby"
|
17
17
|
|
18
18
|
s.add_dependency "bundler", ">= 1.0.0.rc.5"
|
19
|
+
s.add_dependency "rmagick", ">= 2.13.0"
|
19
20
|
|
20
21
|
s.bindir = 'bin'
|
21
|
-
s.executables = ['swf_dump', 'swf_jpeg_replace']
|
22
|
+
s.executables = ['swf_dump', 'swf_jpeg_replace', 'swf_lossless_replace']
|
22
23
|
|
23
24
|
s.files = `git ls-files`.split("\n")
|
24
25
|
s.require_path = 'lib'
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.2
|
9
|
+
version: 0.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors: []
|
12
12
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-01-27 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -34,12 +34,28 @@ dependencies:
|
|
34
34
|
version: 1.0.0.rc.5
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rmagick
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 13
|
48
|
+
- 0
|
49
|
+
version: 2.13.0
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
37
52
|
description: SwfRuby is utilities to dump or manipulate Swf binary file.
|
38
53
|
email: []
|
39
54
|
|
40
55
|
executables:
|
41
56
|
- swf_dump
|
42
57
|
- swf_jpeg_replace
|
58
|
+
- swf_lossless_replace
|
43
59
|
extensions: []
|
44
60
|
|
45
61
|
extra_rdoc_files: []
|
@@ -54,6 +70,7 @@ files:
|
|
54
70
|
- Rakefile
|
55
71
|
- bin/swf_dump
|
56
72
|
- bin/swf_jpeg_replace
|
73
|
+
- bin/swf_lossless_replace
|
57
74
|
- lib/swf_ruby.rb
|
58
75
|
- lib/swf_ruby/do_action_dumper.rb
|
59
76
|
- lib/swf_ruby/replace_target.rb
|
@@ -61,6 +78,7 @@ files:
|
|
61
78
|
- lib/swf_ruby/swf.rb
|
62
79
|
- lib/swf_ruby/swf/action_push.rb
|
63
80
|
- lib/swf_ruby/swf/action_record.rb
|
81
|
+
- lib/swf_ruby/swf/bits_lossless2.rb
|
64
82
|
- lib/swf_ruby/swf/header.rb
|
65
83
|
- lib/swf_ruby/swf/rectangle.rb
|
66
84
|
- lib/swf_ruby/swf/tag.rb
|