Creates an instance of Bitmap by loading an existing image file

Property definitions

bitmap $ Bitmap :: load
	# Creates an instance of Bitmap by loading an existing image file
	init load(path: String)
	do
		self.file_path = path
		var temp = path.file_extension
		if temp != null then
			self.file_extension = temp
		else
			self.file_extension = ""
		end
		var fileReader = new FileReader.open(path)

		# =============== Bitmap header ================
		for x in [0..13] do
			var b = fileReader.read_byte
			if b < 0 then return
			bitmap_header[x] = b
		end
		self.file_size = get_value(bitmap_header.subarray(2, 4))
		self.data_offset = get_value(bitmap_header.subarray(10, 4))

		# =============== DIB header ================
		for x in [0..39] do
			var b = fileReader.read_byte
			if b < 0 then return
			dib_header[x] = b
		end
		var dib_size = get_value(dib_header.subarray(0, 4))
		# only support BITMAPINFOHEADER
		if dib_size != 40 then
			print "This type of bitmap is not supported"
			fileReader.close
			return
		end

		self.width = get_value(dib_header.subarray(4, 4))
		self.height = get_value(dib_header.subarray(8, 4))
		self.bits_per_pixel = get_value(dib_header.subarray(14, 2))
		self.image_size = get_value(dib_header.subarray(20, 4))

		if self.bits_per_pixel != 24 then
			print "Only full color bitmaps are supported"
			fileReader.close
			return
		end

		if self.bits_per_pixel == 24 then
			# assert self.image_size + 54 <= self.file_size
			# start loading image data, for now assume no padding
			for x in [0..self.height[
			do
				var row = new Array[Int].with_capacity(self.width)
				var rgb_str = new CString(3)
				for y in [0..self.width[
				do
					var bts = fileReader.read_bytes_to_cstring(rgb_str, 3)
					if bts < 3 then return
					var red = rgb_str[0] << 16
					var green = rgb_str[1] << 8
					var blue = rgb_str[2]
					row.add(red.to_i + green.to_i + blue.to_i)
				end
				self.data.add(row)
			end
		end
		fileReader.close
	end
lib/bitmap/bitmap.nit:118,2--184,4