Class: ZPNG::Chunk::IHDR

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

Constant Summary collapse

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 ],
}
FORMAT =
'NNC5'

Instance Attribute Summary collapse

Attributes inherited from ZPNG::Chunk

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

Instance Method Summary collapse

Methods inherited from ZPNG::Chunk

#crc_ok?, #export, from_stream

Constructor Details

#initialize(x) ⇒ IHDR

Returns a new instance of IHDR.



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/zpng/chunk.rb', line 104

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.



68
69
70
# File 'lib/zpng/chunk.rb', line 68

def color
  @color
end

#compressionObject

Returns the value of attribute compression.



68
69
70
# File 'lib/zpng/chunk.rb', line 68

def compression
  @compression
end

#depthObject

Returns the value of attribute depth.



68
69
70
# File 'lib/zpng/chunk.rb', line 68

def depth
  @depth
end

#filterObject

Returns the value of attribute filter.



68
69
70
# File 'lib/zpng/chunk.rb', line 68

def filter
  @filter
end

#heightObject

Returns the value of attribute height.



68
69
70
# File 'lib/zpng/chunk.rb', line 68

def height
  @height
end

#interlaceObject

Returns the value of attribute interlace.



68
69
70
# File 'lib/zpng/chunk.rb', line 68

def interlace
  @interlace
end

#widthObject

Returns the value of attribute width.



68
69
70
# File 'lib/zpng/chunk.rb', line 68

def width
  @width
end

Instance Method Details

#alpha_used?Boolean

Returns:

  • (Boolean)


177
178
179
# File 'lib/zpng/chunk.rb', line 177

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

#bppObject

bits per pixel



161
162
163
# File 'lib/zpng/chunk.rb', line 161

def bpp
  SAMPLES_PER_COLOR[@color] * depth
end

#color_used?Boolean

Returns:

  • (Boolean)


165
166
167
# File 'lib/zpng/chunk.rb', line 165

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

#export_dataObject



156
157
158
# File 'lib/zpng/chunk.rb', line 156

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

#grayscale?Boolean

Returns:

  • (Boolean)


169
170
171
# File 'lib/zpng/chunk.rb', line 169

def grayscale?
  !color_used?
end

#inspectObject



181
182
183
184
185
186
# File 'lib/zpng/chunk.rb', line 181

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

#palette_used?Boolean

Returns:

  • (Boolean)


173
174
175
# File 'lib/zpng/chunk.rb', line 173

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