⚠️ Warning: This is a draft ⚠️

This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.

If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.

{{collection|Basic bitmap storage}}

Translation of [[Basic bitmap storage#Ada|Ada]] (well, roughly)

{{works with|python|2.4}}

import sys # for stdout

class c_color(object):
	def __init__(self, p_r = 0, p_g = 0, p_b = 0):
		self.put(p_r, p_g, p_b)

	def clone(self):
		return c_color(self.r, self.g, self.b)

	def put(self, p_r, p_g, p_b):
		self.r = p_r
		self.g = p_g
		self.b = p_b

	def get_r(self):
		return self.r

	def get_g(self):
		return self.g

	def get_b(self):
		return self.b

	def __eq__(self, other):
		return self.r == other.r and self.g == other.g and self.b == other.b

	def __ne__(self, other):
		return not (self == other)

black = c_color(0,0,0)
white = c_color(255,255,255)

class c_bitmap_store(object):
    def __init__(self, p_width = 80, p_height = 40):
        self.instructions = ''
	self.width = p_width
	self.height = p_height
	self.pixels = [[white.clone() for x in range(self.width)] for y in range(self.height)]


    def fill(self, x, y, w, h, color):
        for I in range(w):
            for J in range(h):
	        self.put(x+I, y+J, color)
 
    def display(self):
        for J in range(self.height):
             for I in range(self.width):
		if self.get(i,j) == white:
			sys.stdout.write(" ")
		else:
			sys.stdout.write("H")
             print

    def put(self, x,y, color):
	    assert type(color) is c_color
	    self.pixels[y][x] = color

    def get(self, x,y):
	    result = self.pixels[y][x]
	    assert type(result) is c_color
	    return result

Alternative version

{{works with|Python|3.1}}

This makes use of named tuples and may well work with Python 2.6+ too.

from collections import namedtuple
from copy import copy

Colour = namedtuple('Colour','r,g,b')
Colour.copy = lambda self: copy(self)

black = Colour(0,0,0)
white = Colour(255,255,255) # Colour ranges are not enforced.

class Bitmap():
    def __init__(self, width = 40, height = 40, background=white):
        assert width > 0 and height > 0 and type(background) == Colour
        self.width = width
        self.height = height
        self.background = background
        self.map = [[background.copy() for w in range(width)] for h in range(height)]

    def fillrect(self, x, y, width, height, colour=black):
        assert x >= 0 and y >= 0 and width > 0 and height > 0 and type(colour) == Colour
        for h in range(height):
            for w in range(width):
                self.map[y+h][x+w] = colour.copy()

    def chardisplay(self):
        txt = [''.join(' ' if bit==self.background else '@'
                       for bit in row)
               for row in self.map]
        # Boxing
        txt = ['|'+row+'|' for row in txt]
        txt.insert(0, '+' + '-' * self.width + '+')
        txt.append('+' + '-' * self.width + '+')
        print('\n'.join(reversed(txt)))

    def set(self, x, y, colour=black):
        assert type(colour) == Colour
        self.map[y][x]=colour
 
    def get(self, x, y):
	    return self.map[y][x]
    

bitmap = Bitmap(20,10)
bitmap.fillrect(4, 5, 6, 3)
assert bitmap.get(5, 5) == black
assert bitmap.get(0, 1) == white
bitmap.set(0, 1, black)
assert bitmap.get(0, 1) == black
bitmap.chardisplay()

'''
The origin, 0,0; is the lower left, with x increasing to the right,
and Y increasing upwards.

The program above produces the following display :

+--------------------+
|                    |
|                    |
|    @@@@@@          |
|    @@@@@@          |
|    @@@@@@          |
|                    |
|                    |
|                    |
|@                   |
|                    |
+--------------------+

'''