rixmap 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|