rixmap 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +3 -1
- data/lib/rixmap/format/bmp.rb +4 -1
- data/lib/rixmap/format/png/chunk.rb +178 -7
- data/lib/rixmap/format/png/imageio.rb +75 -7
- data/lib/rixmap/version.rb +3 -3
- data/spec/palette_spec.rb +19 -1
- data/src/rixmap/channel.hxx +106 -1
- data/src/rixmap/color.hxx +84 -14
- data/src/rixmap/image.hxx +205 -25
- data/src/rixmap/interpolator.hxx +29 -12
- data/src/rixmapcore.cxx +275 -210
- data/src/rixmapdeformation.cxx +4 -82
- data/src/rixmaphelper.cxx +501 -0
- data/src/rixmaphelper.hxx +82 -0
- data/src/rixmappool.cxx +65 -0
- data/src/rixmappool.hxx +69 -0
- data/test/test_png.rb +18 -5
- metadata +8 -3
- data/src/rixmap/helper.hxx +0 -347
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f6435a7962daf5424c697df94925bc26b079704
|
4
|
+
data.tar.gz: abcd536696bc451ca7577ef7b2b3b235d041e329
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc3fd8f1a09baa47230ebfcf3eba97b674c051f0c4a1333243e45b0c3ab5bebf592920701d02dcf3509d34e7050e51d19a587da99b97ac374905724b39300c5d
|
7
|
+
data.tar.gz: ac6c1e5b85fd0865b73fff73d35afe9c91d6d927349113a91a0ebecbe1c3655c2a93fc1edf812f66f957c72d2a07958f59ddbed26696f36f3f8259bc9fb386ae
|
data/Rakefile
CHANGED
@@ -109,7 +109,9 @@ if defined?(YARD::Rake::YardocTask)
|
|
109
109
|
yd.options << '--charset=utf-8'
|
110
110
|
yd.options << '--output-dir=doc'
|
111
111
|
yd.options << '--no-cache'
|
112
|
+
yd.options << '--hide-void-return'
|
112
113
|
yd.options << '--debug'
|
114
|
+
yd.options << '--no-yardopts'
|
113
115
|
#yd.options << '--single-db'
|
114
116
|
#yd.options << '--one-file'
|
115
117
|
end
|
@@ -152,5 +154,5 @@ end
|
|
152
154
|
|
153
155
|
|
154
156
|
#==============================================================================#
|
155
|
-
# $Id: Rakefile,v
|
157
|
+
# $Id: Rakefile,v e37e8dfe0f98 2014/05/22 14:14:05 chikuchikugonzalez $
|
156
158
|
# vim: set sts=2 ts=2 sw=2 expandtab:
|
data/lib/rixmap/format/bmp.rb
CHANGED
@@ -270,6 +270,9 @@ module Rixmap
|
|
270
270
|
|
271
271
|
# パレットを復元
|
272
272
|
ncolors = bi.used_color_count
|
273
|
+
if ncolors <= 0
|
274
|
+
ncolors = 2 ** bi.bit_count
|
275
|
+
end
|
273
276
|
palbytes = data.byteslice((FILEHEADER_SIZE + bi.size), (ncolors * 4))
|
274
277
|
palbytes.unpack('C*').each_slice(4).each_with_index do |c, i|
|
275
278
|
break if i >= image.palette.size
|
@@ -322,5 +325,5 @@ end
|
|
322
325
|
|
323
326
|
|
324
327
|
#==============================================================================#
|
325
|
-
# $Id: bmp.rb,v
|
328
|
+
# $Id: bmp.rb,v b9cbf891f8da 2014/05/24 16:23:15 chikuchikugonzalez $
|
326
329
|
# vim: set sts=2 ts=2 sw=2 expandtab:
|
@@ -112,12 +112,10 @@ module Rixmap
|
|
112
112
|
# #data から呼び出されます
|
113
113
|
def pack()
|
114
114
|
end
|
115
|
-
protected :pack
|
116
115
|
|
117
116
|
# データ更新後の、内部プロパティ更新処理を行います.
|
118
117
|
def unpack()
|
119
118
|
end
|
120
|
-
protected :unpack
|
121
119
|
|
122
120
|
end
|
123
121
|
|
@@ -156,12 +154,10 @@ module Rixmap
|
|
156
154
|
def pack()
|
157
155
|
@data = [@width, @height, @depth, @colortype, @compress, @filter, @interlace].pack(IHDRChunk::LAYOUT)
|
158
156
|
end
|
159
|
-
protected :pack
|
160
157
|
|
161
158
|
def unpack()
|
162
159
|
@width, @height, @depth, @colortype, @compress, @filter, @interlace = @data.unpack(IHDRChunk::LAYOUT)
|
163
160
|
end
|
164
|
-
protected :unpack
|
165
161
|
|
166
162
|
# チャンクリストへ登録
|
167
163
|
Chunk.set(self::TYPE, self)
|
@@ -201,12 +197,10 @@ module Rixmap
|
|
201
197
|
def pack()
|
202
198
|
@data = @colors.pack(PLTEChunk::LAYOUT)
|
203
199
|
end
|
204
|
-
protected :pack
|
205
200
|
|
206
201
|
def unpack()
|
207
202
|
@colors = @data.unpack(PLTEChunk::LAYOUT)
|
208
203
|
end
|
209
|
-
protected :unpack
|
210
204
|
|
211
205
|
# チャンクリストへ登録
|
212
206
|
Chunk.set(self::TYPE, self)
|
@@ -238,6 +232,183 @@ module Rixmap
|
|
238
232
|
Chunk.set(self::TYPE, self)
|
239
233
|
end
|
240
234
|
|
235
|
+
# tRNS補助チャンク. 透明度または透過色を扱います.
|
236
|
+
class TRNSAncillaryChunk < BaseChunk
|
237
|
+
# tRNSチャンクタイプ
|
238
|
+
TYPE = 'tRNS'
|
239
|
+
|
240
|
+
# グレースケール用packレイアウト
|
241
|
+
LAYOUT_GRAYSCALE = 'n'
|
242
|
+
|
243
|
+
# RGBカラー用packレイアウト
|
244
|
+
LAYOUT_RGB = 'nnn'
|
245
|
+
|
246
|
+
# インデックスカラー用packレイアウト
|
247
|
+
LAYOUT_INDEXED = 'C*'
|
248
|
+
|
249
|
+
attr_accessor :colortype
|
250
|
+
attr_accessor :gray
|
251
|
+
attr_accessor :red
|
252
|
+
attr_accessor :green
|
253
|
+
attr_accessor :blue
|
254
|
+
attr_accessor :indexes
|
255
|
+
|
256
|
+
def initialize(colortype = nil)
|
257
|
+
@colortype = colortype
|
258
|
+
@gray = nil
|
259
|
+
@red = nil
|
260
|
+
@green = nil
|
261
|
+
@blue = nil
|
262
|
+
@indexes = nil
|
263
|
+
super(TRNSAncillaryChunk::TYPE)
|
264
|
+
end
|
265
|
+
|
266
|
+
def value()
|
267
|
+
case @colortype
|
268
|
+
when COLORTYPE_INDEXED
|
269
|
+
return @indexes
|
270
|
+
when COLORTYPE_GRAYSCALE
|
271
|
+
return @gray
|
272
|
+
when COLORTYPE_TRUECOLOR
|
273
|
+
return [@red, @green, @blue]
|
274
|
+
else
|
275
|
+
return nil
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
def value=(val)
|
280
|
+
case @colortype
|
281
|
+
when COLORTYPE_INDEXED
|
282
|
+
@indexes = Array(val)
|
283
|
+
when COLORTYPE_GRAYSCALE
|
284
|
+
@gray = val.to_i
|
285
|
+
when COLORTYPE_TRUECOLOR
|
286
|
+
@red = val[0]
|
287
|
+
@green = val[1]
|
288
|
+
@blue = val[2]
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
def pack()
|
293
|
+
case @colortype
|
294
|
+
when COLORTYPE_INDEXED
|
295
|
+
@data = @indexes.pack(TRNSAncillaryChunk::LAYOUT_INDEXED)
|
296
|
+
when COLORTYPE_GRAYSCALE
|
297
|
+
@data = [@gray].pack(TRNSAncillaryChunk::LAYOUT_GRAYSCALE)
|
298
|
+
when COLORTYPE_TRUECOLOR
|
299
|
+
@data = [@red, @green, @blue].pack(TRNSAncillaryChunk::LAYOUT_RGB)
|
300
|
+
else
|
301
|
+
@data = ''
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
def unpack()
|
306
|
+
case @colortype
|
307
|
+
when COLORTYPE_INDEXED
|
308
|
+
@indexes = @data.unpack(TRNSAncillaryChunk::LAYOUT_INDEXED)
|
309
|
+
when COLORTYPE_GRAYSCALE
|
310
|
+
@gray = @data.unpack(TRNSAncillaryChunk::LAYOUT_GRAYSCALE)[0]
|
311
|
+
when COLORTYPE_TRUECOLOR
|
312
|
+
@red, @green, @blue = @data.unpack(TRNSAncillaryChunk::LAYOUT_RGB)
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
# チャンクリストへ登録
|
317
|
+
Chunk.set(self::TYPE, self)
|
318
|
+
end
|
319
|
+
|
320
|
+
# bKGD補助チャンク. 背景色を保存しています.
|
321
|
+
class BKGDAncillaryChunk < BaseChunk
|
322
|
+
# bKGDチャンクタイプ
|
323
|
+
TYPE = 'bKGD'
|
324
|
+
|
325
|
+
# インデックスカラー用packレイアウト
|
326
|
+
LAYOUT_INDEXED = 'C'
|
327
|
+
|
328
|
+
# グレースケール用packレイアウト
|
329
|
+
LAYOUT_GRAYSCALE = 'n'
|
330
|
+
|
331
|
+
# RGBカラー用packレイアウト
|
332
|
+
LAYOUT_RGB = 'nnn'
|
333
|
+
|
334
|
+
attr_accessor :colortype
|
335
|
+
attr_accessor :luminance
|
336
|
+
attr_accessor :red
|
337
|
+
attr_accessor :green
|
338
|
+
attr_accessor :blue
|
339
|
+
attr_accessor :palette
|
340
|
+
|
341
|
+
def initialize(colortype = nil)
|
342
|
+
# 画像形式
|
343
|
+
@colortype = colortype
|
344
|
+
|
345
|
+
# グレースケール用
|
346
|
+
@luminance = nil
|
347
|
+
|
348
|
+
# RGBカラー用
|
349
|
+
@red = nil
|
350
|
+
@green = nil
|
351
|
+
@blue = nil
|
352
|
+
|
353
|
+
# パレット形式用
|
354
|
+
@palette = nil
|
355
|
+
super(BKGDAncillaryChunk::TYPE)
|
356
|
+
end
|
357
|
+
|
358
|
+
def value()
|
359
|
+
case @colortype
|
360
|
+
when COLORTYPE_INDEXED
|
361
|
+
return @palette
|
362
|
+
when COLORTYPE_GRAYSCALE, COLORTYPE_GRAYSCALE_WITH_ALPHA
|
363
|
+
return @luminance
|
364
|
+
when COLORTYPE_TRUECOLOR, COLORTYPE_TRUECOLOR_WITH_ALPHA
|
365
|
+
return [@red, @green, @blue]
|
366
|
+
else
|
367
|
+
return nil
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
def value=(val)
|
372
|
+
case @colortype
|
373
|
+
when COLORTYPE_INDEXED
|
374
|
+
@palette = val.to_i
|
375
|
+
when COLORTYPE_GRAYSCALE, COLORTYPE_GRAYSCALE_WITH_ALPHA
|
376
|
+
@luminance = val.to_i
|
377
|
+
when COLORTYPE_TRUECOLOR, COLORTYPE_TRUECOLOR_WITH_ALPHA
|
378
|
+
@red = val[0] # color.red
|
379
|
+
@green = val[1] # color.green
|
380
|
+
@blue = val[2] # color.blue
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
def pack()
|
385
|
+
case @colortype
|
386
|
+
when COLORTYPE_INDEXED
|
387
|
+
@data = [@palette.to_i].pack(BKGDAncillaryChunk::LAYOUT_INDEXED)
|
388
|
+
when COLORTYPE_GRAYSCALE, COLORTYPE_GRAYSCALE_WITH_ALPHA
|
389
|
+
@data = [@luminance.to_i].pack(BKGDAncillaryChunk::LAYOUT_GRAYSCALE)
|
390
|
+
when COLORTYPE_TRUECOLOR, COLORTYPE_TRUECOLOR_WITH_ALPHA
|
391
|
+
@data = [@red.to_i, @green.to_i, @blue.to_i].pack(BKGDAncillaryChunk::LAYOUT_RGB)
|
392
|
+
else
|
393
|
+
@data = ''
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def unpack()
|
398
|
+
case @colortype
|
399
|
+
when COLORTYPE_INDEXED
|
400
|
+
@palette = @data.unpack(BKGDAncillaryChunk::LAYOUT_INDEXED)[0]
|
401
|
+
when COLORTYPE_GRAYSCALE, COLORTYPE_GRAYSCALE_WITH_ALPHA
|
402
|
+
@luminance = @data.unpack(BKGDAncillaryChunk::LAYOUT_GRAYSCALE)[0]
|
403
|
+
when COLORTYPE_TRUECOLOR, COLORTYPE_TRUECOLOR_WITH_ALPHA
|
404
|
+
@red, @green, @blue = @data.unpack(BKGDAncillaryChunk::LAYOUT_RGB)
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
# チャンクリストへ登録
|
409
|
+
Chunk.set(self::TYPE, self)
|
410
|
+
end
|
411
|
+
|
241
412
|
end
|
242
413
|
|
243
414
|
end
|
@@ -246,5 +417,5 @@ end
|
|
246
417
|
|
247
418
|
|
248
419
|
#==============================================================================#
|
249
|
-
# $Id: chunk.rb,v
|
420
|
+
# $Id: chunk.rb,v a60a21c75463 2014/05/30 17:04:13 chikuchikugonzalez $
|
250
421
|
# vim: set sts=2 ts=2 sw=2 expandtab:
|
@@ -235,14 +235,35 @@ module Rixmap
|
|
235
235
|
end
|
236
236
|
|
237
237
|
# 画像種別による処理
|
238
|
+
trns = nil # 透明度チャンクデータ
|
238
239
|
case image.mode
|
239
240
|
when Rixmap::INDEXED
|
240
241
|
ihdr.colortype = COLORTYPE_INDEXED
|
241
242
|
|
242
243
|
# パレットを設定
|
243
244
|
plte = Chunk::PLTEChunk.new
|
245
|
+
alphas = []
|
246
|
+
hasalpha = false
|
244
247
|
image.palette.each_with_index do |color, i|
|
245
248
|
plte[i] = [color.red, color.green, color.blue]
|
249
|
+
alphas << color.alpha
|
250
|
+
if color.alpha < 255
|
251
|
+
hasalpha = true
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
if hasalpha
|
256
|
+
# 基本的にパレットのαを入れる
|
257
|
+
trns = Chunk::TRNSAncillaryChunk.new(ihdr.colortype)
|
258
|
+
trns.indexes = alphas
|
259
|
+
elsif !image.transparent.nil?
|
260
|
+
# 透過インデックス設定の場合
|
261
|
+
# ※ 復元できない
|
262
|
+
trns = Chunk::TRNSAncillaryChunk.new(ihdr.colortype)
|
263
|
+
index = image.transparent.to_i
|
264
|
+
indexes = [255] * index
|
265
|
+
indexes[index] = 0
|
266
|
+
trns.indexes = indexes
|
246
267
|
end
|
247
268
|
|
248
269
|
# ピクセルを作成
|
@@ -255,6 +276,11 @@ module Rixmap
|
|
255
276
|
image.each_line do |line|
|
256
277
|
pixels.concat(filter.filt(line, filter_method).to_str)
|
257
278
|
end
|
279
|
+
|
280
|
+
unless image.transparent.nil?
|
281
|
+
trns = Chunk::TRNSAncillaryChunk.new(ihdr.colortype)
|
282
|
+
trns.gray = image.transparent.to_i
|
283
|
+
end
|
258
284
|
when Rixmap::GRAYALPHA
|
259
285
|
ihdr.colortype = COLORTYPE_GRAYSCALE_WITH_ALPHA
|
260
286
|
image.each_line do |line|
|
@@ -265,6 +291,11 @@ module Rixmap
|
|
265
291
|
image.each_line do |line|
|
266
292
|
pixels.concat(filter.filt(line.to_s('RGB'), filter_method).to_str)
|
267
293
|
end
|
294
|
+
|
295
|
+
unless image.transparent.nil?
|
296
|
+
trns = Chunk::TRNSAncillaryChunk.new(ihdr.colortype)
|
297
|
+
trns.value = image.transparent
|
298
|
+
end
|
268
299
|
when Rixmap::RGBA
|
269
300
|
ihdr.colortype = COLORTYPE_TRUECOLOR_WITH_ALPHA
|
270
301
|
image.each_line do |line|
|
@@ -281,11 +312,21 @@ module Rixmap
|
|
281
312
|
idat = Chunk::IDATChunk.new
|
282
313
|
idat.data = deflated_pixels
|
283
314
|
|
284
|
-
#
|
315
|
+
# チャンクリストの作成開始
|
285
316
|
chunks = []
|
286
317
|
chunks << ihdr
|
287
318
|
chunks << plte unless plte.nil?
|
288
319
|
chunks << idat
|
320
|
+
chunks << trns unless trns.nil?
|
321
|
+
|
322
|
+
# 背景色
|
323
|
+
unless image.background.nil?
|
324
|
+
bkgd = Chunk::BKGDAncillaryChunk.new(ihdr.colortype)
|
325
|
+
bkgd.value = image.background
|
326
|
+
chunks << bkgd
|
327
|
+
end
|
328
|
+
|
329
|
+
# チャンクリスト構築終了
|
289
330
|
chunks << Chunk::IENDChunk.new
|
290
331
|
|
291
332
|
# PNGストリームを構築
|
@@ -340,6 +381,8 @@ module Rixmap
|
|
340
381
|
warn("Unknown or Not-Implemented Chunk Type: #{chunk_type}")
|
341
382
|
next
|
342
383
|
end
|
384
|
+
|
385
|
+
# チャンクを作成
|
343
386
|
chunk = Chunk.get(chunk_type).new
|
344
387
|
chunk.data = chunk_data
|
345
388
|
|
@@ -361,18 +404,33 @@ module Rixmap
|
|
361
404
|
# 残りチャンクを処理
|
362
405
|
image_data = ''
|
363
406
|
palette = nil
|
407
|
+
bgcolor = nil
|
408
|
+
transcolor = nil
|
364
409
|
chunks.each do |chunk|
|
365
410
|
case chunk
|
366
411
|
when Chunk::IDATChunk
|
367
412
|
image_data.concat(chunk.data)
|
413
|
+
|
368
414
|
when Chunk::PLTEChunk
|
369
415
|
palette = Rixmap::Palette.new(2 ** image_depth)
|
370
416
|
palette.size.times do |i|
|
371
417
|
palette[i] = chunk[i]
|
372
418
|
end
|
419
|
+
|
373
420
|
when Chunk::IENDChunk
|
374
421
|
break
|
422
|
+
|
423
|
+
when Chunk::BKGDAncillaryChunk
|
424
|
+
chunk.colortype = colortype
|
425
|
+
chunk.unpack # 中身を更新
|
426
|
+
bgcolor = chunk.value
|
427
|
+
|
428
|
+
when Chunk::TRNSAncillaryChunk
|
429
|
+
chunk.colortype = colortype
|
430
|
+
chunk.unpack
|
431
|
+
transcolor = chunk.value
|
375
432
|
end
|
433
|
+
|
376
434
|
end
|
377
435
|
|
378
436
|
# ピクセルを復元
|
@@ -382,31 +440,41 @@ module Rixmap
|
|
382
440
|
image = nil
|
383
441
|
case colortype
|
384
442
|
when COLORTYPE_INDEXED
|
385
|
-
image = Rixmap::Image.new(Rixmap::INDEXED, image_width, image_height, :palette => palette)
|
443
|
+
image = Rixmap::Image.new(Rixmap::INDEXED, image_width, image_height, :palette => palette, :background => bgcolor)
|
386
444
|
filter = AdaptiveFilter.new(image.mode)
|
387
445
|
pixels.each_slice(image_width + 1).each_with_index do |bytes, i|
|
388
446
|
image[i] = filter.recon(bytes)
|
389
447
|
end
|
448
|
+
|
449
|
+
# 透明度を反映
|
450
|
+
unless transcolor.nil?
|
451
|
+
transcolor.each_with_index do |alpha, i|
|
452
|
+
color = image.palette[i].to_a
|
453
|
+
color[3] = alpha
|
454
|
+
image.palette[i] = color
|
455
|
+
# TODO image.palette[i]の結果をPaletteColorとかにして、各コンポーネント毎に編集できるようにするべきかな
|
456
|
+
end
|
457
|
+
end
|
390
458
|
when COLORTYPE_GRAYSCALE
|
391
|
-
image = Rixmap::Image.new(Rixmap::GRAYSCALE, image_width, image_height)
|
459
|
+
image = Rixmap::Image.new(Rixmap::GRAYSCALE, image_width, image_height, :background => bgcolor, :transparent => transcolor)
|
392
460
|
filter = AdaptiveFilter.new(image.mode)
|
393
461
|
pixels.each_slice(image_width + 1).each_with_index do |bytes, i|
|
394
462
|
image[i] = filter.recon(bytes)
|
395
463
|
end
|
396
464
|
when COLORTYPE_GRAYSCALE_WITH_ALPHA
|
397
|
-
image = Rixmap::Image.new(Rixmap::GRAYALPHA, image_width, image_height)
|
465
|
+
image = Rixmap::Image.new(Rixmap::GRAYALPHA, image_width, image_height, :background => bgcolor)
|
398
466
|
filter = AdaptiveFilter.new(image.mode)
|
399
467
|
pixels.each_slice((image_width * 2) + 1).each_with_index do |bytes, i|
|
400
468
|
image[i] = filter.recon(bytes)
|
401
469
|
end
|
402
470
|
when COLORTYPE_TRUECOLOR
|
403
|
-
image = Rixmap::Image.new(Rixmap::RGB, image_width, image_height)
|
471
|
+
image = Rixmap::Image.new(Rixmap::RGB, image_width, image_height, :background => bgcolor, :transparent => transcolor)
|
404
472
|
filter = AdaptiveFilter.new(image.mode)
|
405
473
|
pixels.each_slice((image_width * 3) + 1).each_with_index do |bytes, i|
|
406
474
|
image[i] = filter.recon(bytes)
|
407
475
|
end
|
408
476
|
when COLORTYPE_TRUECOLOR_WITH_ALPHA
|
409
|
-
image = Rixmap::Image.new(Rixmap::RGBA, image_width, image_height)
|
477
|
+
image = Rixmap::Image.new(Rixmap::RGBA, image_width, image_height, :background => bgcolor)
|
410
478
|
filter = AdaptiveFilter.new(image.mode)
|
411
479
|
pixels.each_slice((image_width * 4) + 1).each_with_index do |bytes, i|
|
412
480
|
image[i] = filter.recon(bytes)
|
@@ -427,5 +495,5 @@ end
|
|
427
495
|
|
428
496
|
|
429
497
|
#==============================================================================#
|
430
|
-
# $Id: imageio.rb,v
|
498
|
+
# $Id: imageio.rb,v a60a21c75463 2014/05/30 17:04:13 chikuchikugonzalez $
|
431
499
|
# vim: set sts=2 ts=2 sw=2 expandtab:
|
data/lib/rixmap/version.rb
CHANGED
@@ -7,10 +7,10 @@ module Rixmap
|
|
7
7
|
VERSION_MAJOR = 0
|
8
8
|
|
9
9
|
# マイナーバージョン番号
|
10
|
-
VERSION_MINOR =
|
10
|
+
VERSION_MINOR = 3
|
11
11
|
|
12
12
|
# バグ修正回数
|
13
|
-
VERSION_PATCH =
|
13
|
+
VERSION_PATCH = 0
|
14
14
|
|
15
15
|
# バージョン番号 (数値表現)
|
16
16
|
VERSION_NUMBER = (VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | VERSION_PATCH
|
@@ -22,5 +22,5 @@ end
|
|
22
22
|
|
23
23
|
|
24
24
|
#==============================================================================#
|
25
|
-
# $Id: version.rb,v
|
25
|
+
# $Id: version.rb,v 3d37b3ca070b 2014/05/17 06:54:52 chikuchikugonzalez $
|
26
26
|
# vim: set sts=2 ts=2 sw=2 expandtab:
|
data/spec/palette_spec.rb
CHANGED
@@ -69,9 +69,27 @@ describe Rixmap::Palette do
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
72
|
+
|
73
|
+
context "Palette export/import check" do
|
74
|
+
before do
|
75
|
+
@palette = Rixmap::Palette.new(4)
|
76
|
+
@palette[0] = Rixmap::Color.new(255, 0, 0)
|
77
|
+
@palette[1] = Rixmap::Color.new(0, 255, 0)
|
78
|
+
@palette[2] = Rixmap::Color.new(0, 0, 255)
|
79
|
+
@palette[3] = Rixmap::Color.new(0, 0, 0)
|
80
|
+
@data = "\xFF\x00\x00\xFF\x00\xFF\x00\xFF\x00\x00\xFF\xFF\x00\x00\x00\xFF".force_encoding(Encoding::BINARY)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "export data match to data" do expect(@palette.export('RGBA')).to eq(@data) end
|
84
|
+
it "import binary data" do
|
85
|
+
palette = Rixmap::Palette.new(4)
|
86
|
+
palette.import!(@data, 'RGBA')
|
87
|
+
expect(@palette).to eq(palette)
|
88
|
+
end
|
89
|
+
end
|
72
90
|
end
|
73
91
|
|
74
92
|
|
75
93
|
#==============================================================================#
|
76
|
-
# $Id: palette_spec.rb,v
|
94
|
+
# $Id: palette_spec.rb,v 6f1b9e3e62b2 2014/05/18 08:46:26 chikuchikugonzalez $
|
77
95
|
# vim: set sts=2 ts=2 sw=2 expandtab:
|
data/src/rixmap/channel.hxx
CHANGED
@@ -29,6 +29,111 @@ namespace Rixmap {
|
|
29
29
|
ALPHA = 'A', // 透明度
|
30
30
|
};
|
31
31
|
|
32
|
+
/**
|
33
|
+
* 各チャンネルデータを一括で扱うための構造体.
|
34
|
+
*/
|
35
|
+
class ChannelByteSet {
|
36
|
+
protected: // 非公開メンバ
|
37
|
+
std::map<Channel, uint8_t> _data;
|
38
|
+
|
39
|
+
public: // コンストラクタ
|
40
|
+
/**
|
41
|
+
* デフォルトコンストラクタ.
|
42
|
+
* 全チャンネルを0で初期化します.
|
43
|
+
*/
|
44
|
+
ChannelByteSet() {
|
45
|
+
this->clear();
|
46
|
+
}
|
47
|
+
|
48
|
+
/**
|
49
|
+
* グレースケール値からチャンネルデータを初期化します.
|
50
|
+
*
|
51
|
+
* @param [uint8_t] luminance 輝度値
|
52
|
+
* @param [uint8_t] alpha 透明度
|
53
|
+
*/
|
54
|
+
ChannelByteSet(uint8_t luminance, uint8_t alpha = 255) {
|
55
|
+
this->clear();
|
56
|
+
this->setLuminance(luminance);
|
57
|
+
this->setAlpha(alpha);
|
58
|
+
}
|
59
|
+
|
60
|
+
/**
|
61
|
+
* RGB値からチャンネルデータを初期化します.
|
62
|
+
*
|
63
|
+
* @param [uint8_t] red 赤要素値
|
64
|
+
* @param [uint8_t] green 緑要素値
|
65
|
+
* @param [uint8_t] blue 青要素値
|
66
|
+
* @param [uint8_t] alpha 透明度
|
67
|
+
*/
|
68
|
+
ChannelByteSet(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha = 255) {
|
69
|
+
this->clear();
|
70
|
+
this->setRed(red);
|
71
|
+
this->setGreen(green);
|
72
|
+
this->setBlue(blue);
|
73
|
+
this->setAlpha(alpha);
|
74
|
+
}
|
75
|
+
|
76
|
+
/**
|
77
|
+
* コピーコンストラクタ
|
78
|
+
*/
|
79
|
+
ChannelByteSet(const ChannelByteSet& bytes) {
|
80
|
+
this->clear();
|
81
|
+
this->_data = bytes._data;
|
82
|
+
}
|
83
|
+
|
84
|
+
/**
|
85
|
+
* デストラクタ
|
86
|
+
*/
|
87
|
+
virtual ~ChannelByteSet() {}
|
88
|
+
|
89
|
+
public: // 公開プロパティメンバ関数
|
90
|
+
inline uint8_t getRed() { return this->_data.at(Channel::RED); }
|
91
|
+
inline uint8_t getGreen() { return this->_data.at(Channel::GREEN); }
|
92
|
+
inline uint8_t getBlue() { return this->_data.at(Channel::BLUE); }
|
93
|
+
inline uint8_t getAlpha() { return this->_data.at(Channel::ALPHA); }
|
94
|
+
inline uint8_t getLuminance() { return this->_data.at(Channel::LUMINANCE); }
|
95
|
+
inline uint8_t getPalette() { return this->_data.at(Channel::PALETTE); }
|
96
|
+
|
97
|
+
inline void setRed(uint8_t value) { this->_data[Channel::RED] = value; }
|
98
|
+
inline void setGreen(uint8_t value) { this->_data[Channel::GREEN] = value; }
|
99
|
+
inline void setBlue(uint8_t value) { this->_data[Channel::BLUE] = value; }
|
100
|
+
inline void setAlpha(uint8_t value) { this->_data[Channel::ALPHA] = value; }
|
101
|
+
inline void setLuminance(uint8_t value) { this->_data[Channel::LUMINANCE] = value; }
|
102
|
+
inline void setPalette(uint8_t value) { this->_data[Channel::PALETTE] = value; }
|
103
|
+
|
104
|
+
public: // 公開メンバ関数
|
105
|
+
|
106
|
+
public: // 公開演算子
|
107
|
+
inline uint8_t operator[](Channel channel) { return this->_data.at(channel); }
|
108
|
+
inline ChannelByteSet& operator=(const ChannelByteSet& bytes) {
|
109
|
+
this->_data = bytes._data;
|
110
|
+
return *this;
|
111
|
+
}
|
112
|
+
|
113
|
+
inline bool operator==(const ChannelByteSet& bytes) {
|
114
|
+
return ( (this->_data.at(Channel::RED) == bytes._data.at(Channel::RED))
|
115
|
+
&& (this->_data.at(Channel::GREEN) == bytes._data.at(Channel::GREEN))
|
116
|
+
&& (this->_data.at(Channel::BLUE) == bytes._data.at(Channel::BLUE))
|
117
|
+
&& (this->_data.at(Channel::ALPHA) == bytes._data.at(Channel::ALPHA))
|
118
|
+
&& (this->_data.at(Channel::LUMINANCE) == bytes._data.at(Channel::LUMINANCE))
|
119
|
+
&& (this->_data.at(Channel::PALETTE) == bytes._data.at(Channel::PALETTE))
|
120
|
+
);
|
121
|
+
}
|
122
|
+
inline bool operator!=(const ChannelByteSet& bytes) { return !(*this == bytes); }
|
123
|
+
|
124
|
+
protected: // 非公開メンバ関数
|
125
|
+
/**
|
126
|
+
* 各バイトデータを初期化します.
|
127
|
+
*/
|
128
|
+
inline void clear() {
|
129
|
+
this->_data[Channel::PALETTE ] = 0;
|
130
|
+
this->_data[Channel::LUMINANCE] = 0;
|
131
|
+
this->_data[Channel::RED ] = 0;
|
132
|
+
this->_data[Channel::GREEN] = 0;
|
133
|
+
this->_data[Channel::BLUE ] = 0;
|
134
|
+
this->_data[Channel::ALPHA] = 255;
|
135
|
+
}
|
136
|
+
};
|
32
137
|
}
|
33
138
|
|
34
139
|
//----------------------------------------------------------------------------//
|
@@ -38,5 +143,5 @@ namespace Rixmap {
|
|
38
143
|
|
39
144
|
|
40
145
|
//============================================================================//
|
41
|
-
// $Id: channel.hxx,v
|
146
|
+
// $Id: channel.hxx,v 34aa9654fa22 2014/05/21 14:50:19 chikuchikugonzalez $
|
42
147
|
// vim: set sts=4 ts=4 sw=4 expandtab foldmethod=marker:
|