X-Git-Url: http://nitlanguage.org diff --git a/lib/bitmap/bitmap.nit b/lib/bitmap/bitmap.nit index 47475e7..3c66f07 100644 --- a/lib/bitmap/bitmap.nit +++ b/lib/bitmap/bitmap.nit @@ -74,10 +74,10 @@ class Bitmap private var image_size: Int is noinit # 14-byte bitmap header - private var bitmap_header: Array[Int] = [66, 77, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0] + private var bitmap_header = [66, 77, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0] # 40-byte dib header - private var dib_header: Array[Int] = [40, 0, 0, 0, 0, 0, 0, 0, 0, 0, + private var dib_header = [40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] @@ -130,10 +130,8 @@ class Bitmap # =============== Bitmap header ================ for x in [0..13] do var b = fileReader.read_byte - if b == null then - return - end - bitmap_header[x] = b.to_i + 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)) @@ -141,8 +139,8 @@ class Bitmap # =============== DIB header ================ for x in [0..39] do var b = fileReader.read_byte - if b == null then return - dib_header[x] = b.to_i + if b < 0 then return + dib_header[x] = b end var dib_size = get_value(dib_header.subarray(0, 4)) # only support BITMAPINFOHEADER @@ -169,13 +167,14 @@ class Bitmap 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(3) - if bts.length != 3 then return - var red = bts[0] << 16 - var green = bts[1] << 8 - var blue = bts[2] + 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) @@ -199,10 +198,10 @@ class Bitmap # type, Int is used. private fun set_value(array: Array[Int], start_index: Int, value: Int) do - array[start_index] = value.bin_and(0x000000FF) - array[start_index + 1] = (value >> 8).bin_and(0x000000FF) - array[start_index + 2] = (value >> 16).bin_and(0x000000FF) - array[start_index + 3] = (value >> 24).bin_and(0x000000FF) + array[start_index] = value & 0x000000FF + array[start_index + 1] = (value >> 8) & 0x000000FF + array[start_index + 2] = (value >> 16) & 0x000000FF + array[start_index + 3] = (value >> 24) & 0x000000FF end # Saves the bitmap into a file @@ -211,11 +210,11 @@ class Bitmap var fw = new FileWriter.open(path) # Write bitmap header for x in [0..self.bitmap_header.length[ do - fw.write(self.bitmap_header[x].ascii.to_s) + fw.write(self.bitmap_header[x].code_point.to_s) end # Write dib header for x in [0..self.dib_header.length[ do - fw.write(self.dib_header[x].ascii.to_s) + fw.write(self.dib_header[x].code_point.to_s) end # Write color table (if any) # Write data (no padding for now) @@ -224,11 +223,11 @@ class Bitmap for y in [0..self.width[ do var pixel = row[y] var red = pixel >> 16 - var green = pixel.bin_and(0x00FF00) >> 8 - var blue = pixel.bin_and(0x000000FF) - fw.write(red.ascii.to_s) - fw.write(green.ascii.to_s) - fw.write(blue.ascii.to_s) + var green = (pixel & 0x00FF00) >> 8 + var blue = pixel & 0x000000FF + fw.write(red.code_point.to_s) + fw.write(green.code_point.to_s) + fw.write(blue.code_point.to_s) end end fw.close @@ -242,8 +241,8 @@ class Bitmap for y in [0..self.width[ do var pixel = row[y] var red = pixel >> 16 - var green = pixel.bin_and(0x00FF00) >> 8 - var blue = pixel.bin_and(0x000000FF) + var green = (pixel & 0x00FF00) >> 8 + var blue = pixel & 0x000000FF var lum = (0.2126 * red.to_f + 0.7152 * green.to_f + 0.0722 * blue.to_f).to_i pixel = lum * 256 * 256 + lum * 256 + lum self.data[x][y] = pixel