Class: ZPNG::Chunk::IHDR

Inherits:
ZPNG::Chunk show all
Defined in:
lib/zpng/chunk.rb

Direct Known Subclasses

BMP::BmpHdrPseudoChunk

Constant Summary collapse

SIZE =
13
FORMAT =
'NNC5'
PALETTE_USED =
1
COLOR_USED =
2
ALPHA_USED =
4
SAMPLES_PER_COLOR =

Each pixel is an R,G,B triple, followed by an alpha sample.

{
  COLOR_GRAYSCALE  => 1,
  COLOR_RGB        => 3,
  COLOR_INDEXED    => 1,
  COLOR_GRAY_ALPHA => 2,
  COLOR_RGBA       => 4
}
ALLOWED_DEPTHS =
{
  COLOR_GRAYSCALE  => [ 1, 2, 4, 8, 16 ],
  COLOR_RGB        => [          8, 16 ],
  COLOR_INDEXED    => [ 1, 2, 4, 8     ],
  COLOR_GRAY_ALPHA => [          8, 16 ],
  COLOR_RGBA       => [          8, 16 ],
}

Constants inherited from ZPNG::Chunk

KNOWN_TYPES, VALID_SIZE_RANGE

Instance Attribute Summary collapse

Attributes inherited from ZPNG::Chunk

#crc, #data, #idx, #offset, #size, #type

Instance Method Summary collapse

Methods inherited from ZPNG::Chunk

#check, #crc_ok?, #export, #fix_crc!, from_stream, #valid?

Methods included from DeepCopyable

#deep_copy

Constructor Details

#initialize(x) ⇒ IHDR

Returns a new instance of IHDR.



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/zpng/chunk.rb', line 136

def initialize x
  super
  vars = %w'width height depth color compression filter interlace' # order is important
  if x.respond_to?(:read)
    # IO
  elsif x.respond_to?(:[])
    # Hash
    vars.each{ |k| instance_variable_set "@#{k}", x[k.to_sym] }

    raise "[!] width not set" unless @width
    raise "[!] height not set" unless @height

    # allow easier image creation like
    # img = Image.new :width => 16, :height => 16, :bpp => 4, :color => false
    # img = Image.new :width => 16, :height => 16, :bpp => 1, :color => true
    # img = Image.new :width => 16, :height => 16, :bpp => 32
    if x[:bpp]
      unless [true,false,nil].include?(@color)
        raise "[!] :color must be either 'true' or 'false' when :bpp is set"
      end
      if @depth
        raise "[!] don't use :depth when :bpp is set"
      end
      @color, @depth = case x[:bpp]
        when 1,2,4,8; [ @color ? COLOR_INDEXED : COLOR_GRAYSCALE,  x[:bpp] ]
        when 16;
          raise "[!] I don't know how to make COLOR 16 bpp PNG. do you?" if @color
          [ COLOR_GRAY_ALPHA, 8 ]
        when 24;      [ COLOR_RGB,  8 ]
        when 32;      [ COLOR_RGBA, 8 ]
        else
          raise "[!] unsupported bpp=#{x[:bpp].inspect}"
        end
    end

    @color       ||= COLOR_RGBA
    @depth       ||= 8
    @compression ||= 0
    @filter      ||= 0
    @interlace   ||= 0

    unless ALLOWED_DEPTHS[@color]&.include?(@depth)
      raise "[!] invalid color mode (#{@color.inspect}) / bit depth (#{@depth.inspect}) combination"
    end
  end
  if data
    data.unpack(FORMAT).each_with_index do |value,idx|
      instance_variable_set "@#{vars[idx]}", value
    end
  end
end

Instance Attribute Details

#colorObject

Returns the value of attribute color.



99
100
101
# File 'lib/zpng/chunk.rb', line 99

def color
  @color
end

#compressionObject

Returns the value of attribute compression.



99
100
101
# File 'lib/zpng/chunk.rb', line 99

def compression
  @compression
end

#depthObject

Returns the value of attribute depth.



99
100
101
# File 'lib/zpng/chunk.rb', line 99

def depth
  @depth
end

#filterObject

Returns the value of attribute filter.



99
100
101
# File 'lib/zpng/chunk.rb', line 99

def filter
  @filter
end

#heightObject

Returns the value of attribute height.



99
100
101
# File 'lib/zpng/chunk.rb', line 99

def height
  @height
end

#interlaceObject

Returns the value of attribute interlace.



99
100
101
# File 'lib/zpng/chunk.rb', line 99

def interlace
  @interlace
end

#widthObject

Returns the value of attribute width.



99
100
101
# File 'lib/zpng/chunk.rb', line 99

def width
  @width
end

Instance Method Details

#alpha_used?Boolean

Returns:

  • (Boolean)


210
211
212
# File 'lib/zpng/chunk.rb', line 210

def alpha_used?
  (@color & ALPHA_USED) != 0
end

#bppObject

bits per pixel



193
194
195
196
# File 'lib/zpng/chunk.rb', line 193

def bpp
  spc = SAMPLES_PER_COLOR[@color]
  spc ? spc * depth : nil
end

#color_used?Boolean

Returns:

  • (Boolean)


198
199
200
# File 'lib/zpng/chunk.rb', line 198

def color_used?
  (@color & COLOR_USED) != 0
end

#export_dataObject



188
189
190
# File 'lib/zpng/chunk.rb', line 188

def export_data
  [@width, @height, @depth, @color, @compression, @filter, @interlace].pack(FORMAT)
end

#grayscale?Boolean

Returns:

  • (Boolean)


202
203
204
# File 'lib/zpng/chunk.rb', line 202

def grayscale?
  !color_used?
end

#inspect(verbosity = 10) ⇒ Object



214
215
216
217
218
219
220
# File 'lib/zpng/chunk.rb', line 214

def inspect verbosity = 10
  vars = instance_variables - [:@type, :@crc, :@data, :@size]
  vars -= [:@idx] if verbosity <= 0
  super.sub(/ *>$/,'') + ", " +
    vars.sort.map{ |var| "#{var.to_s.tr('@','')}=#{instance_variable_get(var)}" }.
    join(", ") + ">"
end

#palette_used?Boolean

Returns:

  • (Boolean)


206
207
208
# File 'lib/zpng/chunk.rb', line 206

def palette_used?
  (@color & PALETTE_USED) != 0
end