rixmap 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +38 -0
- data/README.markdown +74 -0
- data/Rakefile +156 -0
- data/lib/rixmap/format/bmp.rb +326 -0
- data/lib/rixmap/format/pcx.rb +438 -0
- data/lib/rixmap/format/png/chunk.rb +239 -0
- data/lib/rixmap/format/png/imageio.rb +288 -0
- data/lib/rixmap/format/png.rb +78 -0
- data/lib/rixmap/format/xpm.rb +446 -0
- data/lib/rixmap/format.rb +10 -0
- data/lib/rixmap/version.rb +26 -0
- data/lib/rixmap.rb +24 -0
- data/spec/binary_spec.rb +12 -0
- data/spec/color_spec.rb +76 -0
- data/spec/image_spec.rb +297 -0
- data/spec/mode_spec.rb +71 -0
- data/spec/palette_spec.rb +77 -0
- data/src/chollas/LICENSE.txt +38 -0
- data/src/chollas/README.md +23 -0
- data/src/chollas/alloc.hxx +62 -0
- data/src/chollas/endian.hxx +42 -0
- data/src/chollas/raser.hxx +113 -0
- data/src/chollas/utilities.hxx +58 -0
- data/src/extconf.rb +47 -0
- data/src/rixmap/binary.hxx +19 -0
- data/src/rixmap/channel.hxx +42 -0
- data/src/rixmap/color.hxx +222 -0
- data/src/rixmap/common.hxx +58 -0
- data/src/rixmap/image.hxx +371 -0
- data/src/rixmap/mode.hxx +351 -0
- data/src/rixmap/palette.hxx +220 -0
- data/src/rixmap.hxx +19 -0
- data/src/rixmapcore.cxx +3209 -0
- data/src/rixmapcore.hxx +27 -0
- data/src/rixmapio.cxx +652 -0
- data/src/rixmapio.hxx +25 -0
- data/src/rixmapmain.cxx +24 -0
- data/test/test_bmp.rb +139 -0
- data/test/test_pcx.rb +172 -0
- data/test/test_png.rb +136 -0
- data/test/test_xpm.rb +73 -0
- metadata +128 -0
data/spec/image_spec.rb
ADDED
@@ -0,0 +1,297 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Rixmap::Image Spec
|
4
|
+
require_relative '../lib/rixmap'
|
5
|
+
|
6
|
+
describe Rixmap::Image do
|
7
|
+
context "256x256 Indexed Image" do
|
8
|
+
before do
|
9
|
+
@palette = Rixmap::Palette.new(256)
|
10
|
+
@image = Rixmap::Image.new(Rixmap::INDEXED, 256, 256, :palette => @palette)
|
11
|
+
|
12
|
+
# 初期化
|
13
|
+
n = 0
|
14
|
+
(1..16).each do |i|
|
15
|
+
(1..16).each do |j|
|
16
|
+
i2 = (i - 1) * 16
|
17
|
+
j2 = (j - 1) * 16
|
18
|
+
r = (255 - (Math.sqrt((255 - i2) ** 2 + j2 ** 2)))
|
19
|
+
g = (255 - (Math.sqrt((255 - i2) ** 2 + (255 - j2) ** 2)))
|
20
|
+
b = (255 - (Math.sqrt(i2 ** 2 + j2 ** 2)))
|
21
|
+
@palette[n] = [r, g, b, 255]
|
22
|
+
(((i - 1) * 16)...(i * 16)).each do |x|
|
23
|
+
(((j - 1) * 16)...(j * 16)).each do |y|
|
24
|
+
@image[x, y] = n
|
25
|
+
end
|
26
|
+
end
|
27
|
+
n += 1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "mode should be INDEXED" do expect(@image.mode).to eq(Rixmap::INDEXED) end
|
33
|
+
it "is indexed" do expect(@image).to be_indexed end
|
34
|
+
it "is not grayscale" do expect(@image).not_to be_grayscale end
|
35
|
+
it "is not rgb" do expect(@image).not_to be_rgb end
|
36
|
+
it "width should be 256" do expect(@image.width).to eq(256) end
|
37
|
+
it "height should be 256" do expect(@image.height).to eq(256) end
|
38
|
+
it "palette should be same" do expect(@image.palette).to eq(@palette) end
|
39
|
+
it "size should be [256, 256]" do expect(@image.size).to eq([256, 256]) end
|
40
|
+
it "dim should be [256, 256, 1]" do expect(@image.dim).to eq([256, 256, 1]) end
|
41
|
+
it "all pixels are palette indexes" do
|
42
|
+
n = 0
|
43
|
+
(1..16).each do |i|
|
44
|
+
(1..16).each do |j|
|
45
|
+
(((i - 1) * 16)...(i * 16)).each do |x|
|
46
|
+
(((j - 1) * 16)...(j * 16)).each do |y|
|
47
|
+
expect(@image[x, y]).to eq(n)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
n += 1
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
it "number of scanlines are same as height" do expect(@image.lines.size).to eq(@image.height) end
|
55
|
+
it "scanline type is Rixmap::Image::Line" do expect(@image.lines[0]).to be_kind_of(Rixmap::Image::Line) end
|
56
|
+
it "pixel type is FIXNUM" do expect(@image.pixels[0][0]).to be_kind_of(Fixnum) end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "256x256 GRAYSCALE Image" do
|
60
|
+
before do
|
61
|
+
@image = Rixmap::Image.new(Rixmap::GRAYSCALE, 256, 256)
|
62
|
+
|
63
|
+
# 初期化
|
64
|
+
256.times do |i|
|
65
|
+
256.times do |j|
|
66
|
+
l = (255 - (Math.sqrt((255 - i) ** 2 + (255 - j) ** 2)))
|
67
|
+
@image[i, j] = l
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it "mode should be GRAYSCALE" do expect(@image.mode).to eq(Rixmap::GRAYSCALE) end
|
73
|
+
it "is not indexed" do expect(@image).not_to be_indexed end
|
74
|
+
it "is grayscale" do expect(@image).to be_grayscale end
|
75
|
+
it "is not rgb" do expect(@image).not_to be_rgb end
|
76
|
+
it "width should be 256" do expect(@image.width).to eq(256) end
|
77
|
+
it "height should be 256" do expect(@image.height).to eq(256) end
|
78
|
+
it "palette should be nil" do expect(@image.palette).to be_nil end
|
79
|
+
it "size should be [256, 256]" do expect(@image.size).to eq([256, 256]) end
|
80
|
+
it "dim should be [256, 256, 1]" do expect(@image.dim).to eq([256, 256, 1]) end
|
81
|
+
it "all pixels are luminance" do
|
82
|
+
256.times do |i|
|
83
|
+
256.times do |j|
|
84
|
+
l = (255 - (Math.sqrt((255 - i) ** 2 + (255 - j) ** 2)))
|
85
|
+
|
86
|
+
# 比較用に丸め処理
|
87
|
+
dl = if l < 0
|
88
|
+
0
|
89
|
+
elsif l > 255
|
90
|
+
255
|
91
|
+
else
|
92
|
+
l.to_i
|
93
|
+
end
|
94
|
+
|
95
|
+
expect(@image[i, j]).to eq(dl)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
it "number of scanlines are same as height" do expect(@image.lines.size).to eq(@image.height) end
|
100
|
+
it "scanline type is Rixmap::Image::Line" do expect(@image.lines[0]).to be_kind_of(Rixmap::Image::Line) end
|
101
|
+
it "pixel type is FIXNUM" do expect(@image.pixels[0][0]).to be_kind_of(Fixnum) end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "256x256 GRAYALPHA Image" do
|
105
|
+
before do
|
106
|
+
@image = Rixmap::Image.new(Rixmap::GRAYALPHA, 256, 256)
|
107
|
+
|
108
|
+
# 初期化
|
109
|
+
256.times do |i|
|
110
|
+
256.times do |j|
|
111
|
+
l = (255 - (Math.sqrt((255 - i) ** 2 + (255 - j) ** 2)))
|
112
|
+
a = (255 - (Math.sqrt(i ** 2 + (255 - j) ** 2)))
|
113
|
+
@image[i, j] = [l, a]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it "mode should be GRAYALPHA" do expect(@image.mode).to eq(Rixmap::GRAYALPHA) end
|
119
|
+
it "is not indexed" do expect(@image).not_to be_indexed end
|
120
|
+
it "is grayscale" do expect(@image).to be_grayscale end
|
121
|
+
it "is not rgb" do expect(@image).not_to be_rgb end
|
122
|
+
it "width should be 256" do expect(@image.width).to eq(256) end
|
123
|
+
it "height should be 256" do expect(@image.height).to eq(256) end
|
124
|
+
it "palette should be nil" do expect(@image.palette).to be_nil end
|
125
|
+
it "size should be [256, 256]" do expect(@image.size).to eq([256, 256]) end
|
126
|
+
it "dim should be [256, 256, 2]" do expect(@image.dim).to eq([256, 256, 2]) end
|
127
|
+
it "all pixels are luminance" do
|
128
|
+
256.times do |i|
|
129
|
+
256.times do |j|
|
130
|
+
l = (255 - (Math.sqrt((255 - i) ** 2 + (255 - j) ** 2)))
|
131
|
+
a = (255 - (Math.sqrt(i ** 2 + (255 - j) ** 2)))
|
132
|
+
|
133
|
+
# 比較用に丸め処理
|
134
|
+
dl = if l < 0
|
135
|
+
0
|
136
|
+
elsif l > 255
|
137
|
+
255
|
138
|
+
else
|
139
|
+
l.to_i
|
140
|
+
end
|
141
|
+
da = if a < 0
|
142
|
+
0
|
143
|
+
elsif a > 255
|
144
|
+
255
|
145
|
+
else
|
146
|
+
a.to_i
|
147
|
+
end
|
148
|
+
|
149
|
+
expect(@image[i, j]).to eq([dl, da])
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
it "number of scanlines are same as height" do expect(@image.lines.size).to eq(@image.height) end
|
154
|
+
it "scanline type is Rixmap::Image::Line" do expect(@image.lines[0]).to be_kind_of(Rixmap::Image::Line) end
|
155
|
+
it "pixel type is Array" do expect(@image.pixels[0][0]).to be_kind_of(Array) end
|
156
|
+
end
|
157
|
+
|
158
|
+
context "256x256 RGB Image" do
|
159
|
+
before do
|
160
|
+
@image = Rixmap::Image.new(Rixmap::RGB, 256, 256)
|
161
|
+
|
162
|
+
# 初期化
|
163
|
+
256.times do |i|
|
164
|
+
256.times do |j|
|
165
|
+
r = (255 - (Math.sqrt((255 - i) ** 2 + j ** 2)))
|
166
|
+
g = (255 - (Math.sqrt((255 - i) ** 2 + (255 - j) ** 2)))
|
167
|
+
b = (255 - (Math.sqrt(i ** 2 + j ** 2)))
|
168
|
+
@image[i, j] = [r, g, b]
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
it "mode should be RGB" do expect(@image.mode).to eq(Rixmap::RGB) end
|
174
|
+
it "is not indexed" do expect(@image).not_to be_indexed end
|
175
|
+
it "is not grayscale" do expect(@image).not_to be_grayscale end
|
176
|
+
it "is rgb" do expect(@image).to be_rgb end
|
177
|
+
it "width should be 256" do expect(@image.width).to eq(256) end
|
178
|
+
it "height should be 256" do expect(@image.height).to eq(256) end
|
179
|
+
it "palette should be nil" do expect(@image.palette).to be_nil end
|
180
|
+
it "size should be [256, 256]" do expect(@image.size).to eq([256, 256]) end
|
181
|
+
it "dim should be [256, 256, 3]" do expect(@image.dim).to eq([256, 256, 3]) end
|
182
|
+
it "all pixels are [r, g, b] array" do
|
183
|
+
256.times do |i|
|
184
|
+
256.times do |j|
|
185
|
+
r = (255 - (Math.sqrt((255 - i) ** 2 + j ** 2)))
|
186
|
+
g = (255 - (Math.sqrt((255 - i) ** 2 + (255 - j) ** 2)))
|
187
|
+
b = (255 - (Math.sqrt(i ** 2 + j ** 2)))
|
188
|
+
|
189
|
+
# 比較用に丸め処理
|
190
|
+
dr = if r < 0
|
191
|
+
0
|
192
|
+
elsif r > 255
|
193
|
+
255
|
194
|
+
else
|
195
|
+
r.to_i
|
196
|
+
end
|
197
|
+
dg = if g < 0
|
198
|
+
0
|
199
|
+
elsif g > 255
|
200
|
+
255
|
201
|
+
else
|
202
|
+
g.to_i
|
203
|
+
end
|
204
|
+
db = if b < 0
|
205
|
+
0
|
206
|
+
elsif b > 255
|
207
|
+
255
|
208
|
+
else
|
209
|
+
b.to_i
|
210
|
+
end
|
211
|
+
|
212
|
+
expect(@image[i, j]).to eq([dr, dg, db])
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
it "number of scanlines are same as height" do expect(@image.lines.size).to eq(@image.height) end
|
217
|
+
it "scanline type is Rixmap::Image::Line" do expect(@image.lines[0]).to be_kind_of(Rixmap::Image::Line) end
|
218
|
+
it "pixel type is Array" do expect(@image.pixels[0][0]).to be_kind_of(Array) end
|
219
|
+
end
|
220
|
+
|
221
|
+
context "256x256 RGBA Image" do
|
222
|
+
before do
|
223
|
+
@image = Rixmap::Image.new(Rixmap::RGBA, 256, 256)
|
224
|
+
|
225
|
+
# 初期化
|
226
|
+
256.times do |i|
|
227
|
+
256.times do |j|
|
228
|
+
r = (255 - (Math.sqrt((255 - i) ** 2 + j ** 2)))
|
229
|
+
g = (255 - (Math.sqrt((255 - i) ** 2 + (255 - j) ** 2)))
|
230
|
+
b = (255 - (Math.sqrt(i ** 2 + j ** 2)))
|
231
|
+
a = (255 - (Math.sqrt(i ** 2 + (255 - j) ** 2)))
|
232
|
+
@image[i, j] = [r, g, b, a]
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
it "mode should be RGBA" do expect(@image.mode).to eq(Rixmap::RGBA) end
|
238
|
+
it "is not indexed" do expect(@image).not_to be_indexed end
|
239
|
+
it "is not grayscale" do expect(@image).not_to be_grayscale end
|
240
|
+
it "is rgb" do expect(@image).to be_rgb end
|
241
|
+
it "width should be 256" do expect(@image.width).to eq(256) end
|
242
|
+
it "height should be 256" do expect(@image.height).to eq(256) end
|
243
|
+
it "palette should be nil" do expect(@image.palette).to be_nil end
|
244
|
+
it "size should be [256, 256]" do expect(@image.size).to eq([256, 256]) end
|
245
|
+
it "dim should be [256, 256, 4]" do expect(@image.dim).to eq([256, 256, 4]) end
|
246
|
+
it "all pixels are [r, g, b, a] array" do
|
247
|
+
256.times do |i|
|
248
|
+
256.times do |j|
|
249
|
+
r = (255 - (Math.sqrt((255 - i) ** 2 + j ** 2)))
|
250
|
+
g = (255 - (Math.sqrt((255 - i) ** 2 + (255 - j) ** 2)))
|
251
|
+
b = (255 - (Math.sqrt(i ** 2 + j ** 2)))
|
252
|
+
a = (255 - (Math.sqrt(i ** 2 + (255 - j) ** 2)))
|
253
|
+
|
254
|
+
# 比較用に丸め処理
|
255
|
+
dr = if r < 0
|
256
|
+
0
|
257
|
+
elsif r > 255
|
258
|
+
255
|
259
|
+
else
|
260
|
+
r.to_i
|
261
|
+
end
|
262
|
+
dg = if g < 0
|
263
|
+
0
|
264
|
+
elsif g > 255
|
265
|
+
255
|
266
|
+
else
|
267
|
+
g.to_i
|
268
|
+
end
|
269
|
+
db = if b < 0
|
270
|
+
0
|
271
|
+
elsif b > 255
|
272
|
+
255
|
273
|
+
else
|
274
|
+
b.to_i
|
275
|
+
end
|
276
|
+
da = if a < 0
|
277
|
+
0
|
278
|
+
elsif a > 255
|
279
|
+
255
|
280
|
+
else
|
281
|
+
a.to_i
|
282
|
+
end
|
283
|
+
|
284
|
+
expect(@image[i, j]).to eq([dr, dg, db, da])
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
it "number of scanlines are same as height" do expect(@image.lines.size).to eq(@image.height) end
|
289
|
+
it "scanline type is Rixmap::Image::Line" do expect(@image.lines[0]).to be_kind_of(Rixmap::Image::Line) end
|
290
|
+
it "pixel type is Array" do expect(@image.pixels[0][0]).to be_kind_of(Array) end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
|
295
|
+
#==============================================================================#
|
296
|
+
# $Id: image_spec.rb,v 36d5b09e38de 2014/03/30 11:13:09 chikuchikugonzalez $
|
297
|
+
# vim: set sts=2 ts=2 sw=2 expandtab:
|
data/spec/mode_spec.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Rixmap::Mode Spec
|
4
|
+
require_relative '../lib/rixmap'
|
5
|
+
|
6
|
+
describe Rixmap::Mode do
|
7
|
+
context "INDEXED" do
|
8
|
+
before do
|
9
|
+
@mode = Rixmap::INDEXED
|
10
|
+
end
|
11
|
+
|
12
|
+
it "depth should be 8" do expect(@mode.depth).to eq(8) end
|
13
|
+
it "is indexed type" do expect(@mode.indexed?).to be_true end
|
14
|
+
it "is not grayscale type" do expect(@mode.grayscale?).to be_false end
|
15
|
+
it "is not rgb type" do expect(@mode.rgb?).to be_false end
|
16
|
+
it "has no alpha channel" do expect(@mode.has_alpha?).to be_false end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "GRAYSCALE" do
|
20
|
+
before do
|
21
|
+
@mode = Rixmap::GRAYSCALE
|
22
|
+
end
|
23
|
+
|
24
|
+
it "depth should be 8" do expect(@mode.depth).to eq(8) end
|
25
|
+
it "is not indexed type" do expect(@mode.indexed?).to be_false end
|
26
|
+
it "is grayscale type" do expect(@mode.grayscale?).to be_true end
|
27
|
+
it "is not rgb type" do expect(@mode.rgb?).to be_false end
|
28
|
+
it "has no alpha channel" do expect(@mode.has_alpha?).to be_false end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "GRAYALPHA" do
|
32
|
+
before do
|
33
|
+
@mode = Rixmap::GRAYALPHA
|
34
|
+
end
|
35
|
+
|
36
|
+
it "depth should be 16" do expect(@mode.depth).to eq(16) end
|
37
|
+
it "is not indexed type" do expect(@mode.indexed?).to be_false end
|
38
|
+
it "is grayscale type" do expect(@mode.grayscale?).to be_true end
|
39
|
+
it "is not rgb type" do expect(@mode.rgb?).to be_false end
|
40
|
+
it "has alpha channel" do expect(@mode.has_alpha?).to be_true end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "RGB" do
|
44
|
+
before do
|
45
|
+
@mode = Rixmap::RGB
|
46
|
+
end
|
47
|
+
|
48
|
+
it "depth should be 24" do expect(@mode.depth).to eq(24) end
|
49
|
+
it "is not indexed type" do expect(@mode.indexed?).to be_false end
|
50
|
+
it "is not grayscale type" do expect(@mode.grayscale?).to be_false end
|
51
|
+
it "is rgb type" do expect(@mode.rgb?).to be_true end
|
52
|
+
it "has no alpha channel" do expect(@mode.has_alpha?).to be_false end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "RGBA" do
|
56
|
+
before do
|
57
|
+
@mode = Rixmap::RGBA
|
58
|
+
end
|
59
|
+
|
60
|
+
it "depth should be 32" do expect(@mode.depth).to eq(32) end
|
61
|
+
it "is not indexed type" do expect(@mode.indexed?).to be_false end
|
62
|
+
it "is not grayscale type" do expect(@mode.grayscale?).to be_false end
|
63
|
+
it "is rgb type" do expect(@mode.rgb?).to be_true end
|
64
|
+
it "has alpha channel" do expect(@mode.has_alpha?).to be_true end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
#==============================================================================#
|
70
|
+
# $Id: mode_spec.rb,v 36d5b09e38de 2014/03/30 11:13:09 chikuchikugonzalez $
|
71
|
+
# vim: set sts=2 ts=2 sw=2 expandtab:
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Rixmap::Palette Spec
|
4
|
+
require_relative '../lib/rixmap'
|
5
|
+
|
6
|
+
describe Rixmap::Palette do
|
7
|
+
context "Empty Palette" do
|
8
|
+
it "should be raise ArgumentError" do
|
9
|
+
expect { Rixmap::Palette.new(0) }.to raise_error(ArgumentError)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context "Default Palette" do
|
14
|
+
before do
|
15
|
+
@palette = Rixmap::Palette.new
|
16
|
+
end
|
17
|
+
|
18
|
+
it "size should be 256" do expect(@palette.size).to eq(256) end
|
19
|
+
it "colors are all black" do expect(@palette.to_a).to eq([Rixmap::Color.new(0, 0, 0, 255)] * 256) end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "VGA Palette" do
|
23
|
+
before do
|
24
|
+
@palette = Rixmap::Palette::VGA.new
|
25
|
+
@colors = [
|
26
|
+
Rixmap::Color.new(255, 255, 255), # White
|
27
|
+
Rixmap::Color.new(192, 192, 192), # Silver
|
28
|
+
Rixmap::Color.new(128, 128, 192), # Gray
|
29
|
+
Rixmap::Color.new( 0, 0, 0), # Black
|
30
|
+
Rixmap::Color.new(255, 0, 0), # Red
|
31
|
+
Rixmap::Color.new(128, 0, 0), # Maroon
|
32
|
+
Rixmap::Color.new(255, 255, 0), # Yellow
|
33
|
+
Rixmap::Color.new(128, 128, 0), # Olive
|
34
|
+
Rixmap::Color.new( 0, 255, 0), # Green
|
35
|
+
Rixmap::Color.new( 0, 128, 0), # Lime
|
36
|
+
Rixmap::Color.new( 0, 255, 255), # Aqua
|
37
|
+
Rixmap::Color.new( 0, 128, 128), # Teal
|
38
|
+
Rixmap::Color.new( 0, 0, 255), # Blue
|
39
|
+
Rixmap::Color.new( 0, 0, 128), # Navy
|
40
|
+
Rixmap::Color.new(255, 0, 255), # Fucshi
|
41
|
+
Rixmap::Color.new(128, 0, 128) # Purple
|
42
|
+
]
|
43
|
+
end
|
44
|
+
|
45
|
+
it "size should be 16" do expect(@palette.size).to eq(16) end
|
46
|
+
it "has fixed colors" do
|
47
|
+
@colors.each_with_index do |c, i|
|
48
|
+
expect(@palette[i]).to eq(c)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "WebSafe Palette" do
|
54
|
+
before do
|
55
|
+
@palette = Rixmap::Palette::WebSafe.new
|
56
|
+
@levels = [0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF]
|
57
|
+
end
|
58
|
+
|
59
|
+
it "size should be 216" do expect(@palette.size).to eq(216) end
|
60
|
+
it "has fixed colors" do
|
61
|
+
6.times do |ri|
|
62
|
+
6.times do |gi|
|
63
|
+
6.times do |bi|
|
64
|
+
n = ri * 36 + gi * 6 + bi
|
65
|
+
c = Rixmap::Color.new(@levels[ri], @levels[gi], @levels[bi])
|
66
|
+
expect(@palette[n]).to eq(c)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
#==============================================================================#
|
76
|
+
# $Id: palette_spec.rb,v 36d5b09e38de 2014/03/30 11:13:09 chikuchikugonzalez $
|
77
|
+
# vim: set sts=2 ts=2 sw=2 expandtab:
|
@@ -0,0 +1,38 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2013 TANAKA Kenichi <chikuchikugonzalez@gmail.com>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
23
|
+
|
24
|
+
以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフト
|
25
|
+
ウェア」)の複製を取得するすべての人に対し、ソフトウェアを無制限に扱うことを無
|
26
|
+
償で許可します。これには、ソフトウェアの複製を使用、複写、変更、結合、掲載、頒
|
27
|
+
布、サブライセンス、および/または販売する権利、およびソフトウェアを提供する相
|
28
|
+
手に同じことを許可する権利も無制限に含まれます。
|
29
|
+
|
30
|
+
上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分
|
31
|
+
に記載するものとします。
|
32
|
+
|
33
|
+
ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証も
|
34
|
+
なく提供されます。ここでいう保証とは、商品性、特定の目的への適合性、および権利
|
35
|
+
非侵害についての保証も含みますが、それに限定されるものではありません。 作者ま
|
36
|
+
たは著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起
|
37
|
+
因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切
|
38
|
+
の請求、損害、その他の義務について何らの責任も負わないものとします。
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Chollas - Code Snipets Repository -
|
2
|
+
コード断片リポジトリです.
|
3
|
+
「あ、これ使えそう」って思ったり、使いまわしたくなったコードを分割して管理します.
|
4
|
+
|
5
|
+
## 必要要件
|
6
|
+
- C++11に対応したコンパイラ
|
7
|
+
- gcc 4.7 とか
|
8
|
+
- Visual Studio 2013 とか
|
9
|
+
|
10
|
+
## ライセンスについて
|
11
|
+
`MIT`ライセンスを適用します.
|
12
|
+
|
13
|
+
## 作者
|
14
|
+
_タナカ ケンイチ (TANAKA Kenichi) aka チクチーク・ゴンザレス (chikuchikugonzalez)_
|
15
|
+
|
16
|
+
### 連絡先
|
17
|
+
#### E-mail
|
18
|
+
* mailto:chikuchikugonzalez@gmail.com
|
19
|
+
* mailto:chiku2gonzalez@live.jp
|
20
|
+
|
21
|
+
## 名前の元
|
22
|
+
ウチワサボテンの英語名です.
|
23
|
+
`Opuntia`とも言う、っていうかそっちが正式っぽいですが`cholla`のほうがいいかなって.
|
@@ -0,0 +1,62 @@
|
|
1
|
+
// -*- coding: utf-8 -*-
|
2
|
+
/**
|
3
|
+
* 配置newを使用したメモリ確保実装.
|
4
|
+
*/
|
5
|
+
#pragma once
|
6
|
+
#ifndef CHOLLAS_XNEW_HXX
|
7
|
+
#define CHOLLAS_XNEW_HXX
|
8
|
+
#include <stdexcept> // C++標準例外
|
9
|
+
#include <new> // 配置new
|
10
|
+
#include <cstdlib>
|
11
|
+
|
12
|
+
/*
|
13
|
+
* 名前空間作る
|
14
|
+
*/
|
15
|
+
namespace chollas {
|
16
|
+
/**
|
17
|
+
* `std::free`でメモリブロックを解放するインスタンス破棄関数実装です.
|
18
|
+
* デストラクタを呼び出した上で、`std::free`を用いてメモリブロックを解放します.
|
19
|
+
*
|
20
|
+
* @param [class] CLASS メモリブロックにあるオブジェクトの型. デストラクタを呼び出すために使用します.
|
21
|
+
* @param [CLASS*] ptr 解放対象のオブジェクトポインタ
|
22
|
+
* @return [void]
|
23
|
+
*/
|
24
|
+
template<class CLASS> static inline void xdelete(CLASS* ptr) {
|
25
|
+
if (ptr != NULL) {
|
26
|
+
try {
|
27
|
+
ptr->~CLASS();
|
28
|
+
std::free(ptr);
|
29
|
+
} catch (...) {
|
30
|
+
std::free(ptr);
|
31
|
+
throw; // 例外を再送出
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* `std::malloc`でメモリブロックを確保するインスタンス生成関数実装です.
|
38
|
+
* 確保されたメモリブロック上に配置newによってオブジェクトを構築します.
|
39
|
+
*
|
40
|
+
* @param [class] CLASS 対象クラスの型. コンストラクタを呼び出すのに使用します.
|
41
|
+
* @param [typename...] PARAMS コンストラクタ引数の型.
|
42
|
+
* @param [PARAMS] params コンストラクタに渡す引数リスト.
|
43
|
+
* @return [CLASS*] 確保されたインスタンスのポインタ. 確保できなかった場合は`NULL`になることもあります.
|
44
|
+
*/
|
45
|
+
template<class CLASS, typename... PARAMS> static inline CLASS* xnew(PARAMS... params) {
|
46
|
+
CLASS* ptr = reinterpret_cast<CLASS*>(std::malloc(sizeof(CLASS)));
|
47
|
+
if (ptr != NULL) {
|
48
|
+
try {
|
49
|
+
return new(ptr) CLASS(params...);
|
50
|
+
} catch (...) {
|
51
|
+
std::free(ptr);
|
52
|
+
throw; // 例外を再throw
|
53
|
+
}
|
54
|
+
}
|
55
|
+
return ptr;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
#endif // CHOLLAS_XNEW_HXX
|
60
|
+
//============================================================================//
|
61
|
+
// $Id$
|
62
|
+
// vim: set sts=4 ts=4 sw=4 expandtab filetype=cpp:
|
@@ -0,0 +1,42 @@
|
|
1
|
+
// -*- coding: utf-8 -*-
|
2
|
+
/**
|
3
|
+
* エンディアン関係のユーティリティ関数
|
4
|
+
*/
|
5
|
+
#pragma once
|
6
|
+
#ifndef CHOLLAS_ENDIAN_HXX
|
7
|
+
#define CHOLLAS_ENDIAN_HXX
|
8
|
+
|
9
|
+
namespace chollas {
|
10
|
+
|
11
|
+
// TODO システムバイトオーダーチェックの実装
|
12
|
+
|
13
|
+
/**
|
14
|
+
* なんとなく名前空間を分離
|
15
|
+
*/
|
16
|
+
namespace endian {
|
17
|
+
/**
|
18
|
+
* 参考: http://cppdiary.blog76.fc2.com/blog-entry-8.html
|
19
|
+
*/
|
20
|
+
template<typename T> static inline T reverse(T value) {
|
21
|
+
size_t typeSize = sizeof(T);
|
22
|
+
if (typeSize == 1) {
|
23
|
+
// 1バイトは反転できない
|
24
|
+
return value;
|
25
|
+
}
|
26
|
+
T result = 0;
|
27
|
+
char* rp = reinterpret_cast<char*>(&result);
|
28
|
+
char* vp = reinterpret_cast<char*>(&value);
|
29
|
+
for (size_t i = 0; i < typeSize; i++) {
|
30
|
+
rp[i] = vp[(typeSize - 1) - i];
|
31
|
+
}
|
32
|
+
return result;
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
#endif // CHOLLAS_ENDIAN_HXX
|
40
|
+
//============================================================================//
|
41
|
+
// $Id$
|
42
|
+
// vim: set sts=4 ts=4 sw=4 expandtab filetype=cpp:
|