diff --git a/gfxlcd/drawing/area.py b/gfxlcd/drawing/area.py index 418a84b..9e844c4 100644 --- a/gfxlcd/drawing/area.py +++ b/gfxlcd/drawing/area.py @@ -32,47 +32,79 @@ class Area(Pixel): for _ in itertools.repeat(None, length): self.driver.data(color, None) + # def _calculate_steps(self, length, step, required_length): + # """calculate lineparts - helper""" + # steps = [length for _ in range(0, step)] + # if step * length < required_length: + # for idx in range(0, required_length - step * length): + # steps[idx] += 1 + # + # return steps + def _calculate_steps(self, length, step, required_length): """calculate lineparts - helper""" steps = [length for _ in range(0, step)] if step * length < required_length: - for idx in range(0, required_length - step * length): - steps[idx] += 1 + offset = len(steps) // 2 + rest = required_length - step * length + steps_even = True if len(steps) & 1 == 0 else False + rest_even = True if rest & 1 == 0 else False + appendix = 0 + for idx in range(0, rest): + steps[offset + appendix] += 1 + if steps_even: + appendix = self._calculate_appendix(appendix) + elif idx > 0 and rest_even: + appendix = self._calculate_appendix(appendix) + elif not rest_even: + appendix = self._calculate_appendix(appendix) return steps + def _calculate_appendix(self, appendix): + """calculate appendix during drawing a line""" + if appendix == 0: + appendix = -1 + elif appendix < 0: + appendix *= -1 + else: + appendix = (appendix + 1) * -1 + + return appendix + def draw_line(self, pos_x1, pos_y1, pos_x2, pos_y2): """draw diagonal line""" width = abs(pos_x2 - pos_x1) height = abs(pos_y2 - pos_y1) if pos_x1 == pos_x2: - steps = [height] + steps = [height+1] horizontal = False offset_x = offset_y = 0 elif pos_y1 == pos_y2: - steps = [width] + steps = [width+1] horizontal = True offset_x = offset_y = 0 elif width > height: + width += 1 if pos_x2 < pos_x1: pos_x1, pos_x2 = pos_x2, pos_x1 pos_y1, pos_y2 = pos_y2, pos_y1 offset_y = 1 if pos_y2 > pos_y1 else -1 offset_x = 1 if pos_x2 > pos_x1 else -1 horizontal = True - step = height - length = width / step + step = height + 1 + length = width // step steps = self._calculate_steps(length, step, width) - else: + height += 1 if pos_y2 < pos_y1: pos_x1, pos_x2 = pos_x2, pos_x1 pos_y1, pos_y2 = pos_y2, pos_y1 offset_y = 1 if pos_y2 > pos_y1 else -1 offset_x = 1 if pos_x2 > pos_x1 else -1 horizontal = False - step = width - length = height / step + step = width + 1 + length = height // step steps = self._calculate_steps(length, step, height) delta_y = 0 diff --git a/gfxlcd/tests/test_area_drawing.py b/gfxlcd/tests/test_area_drawing.py index 1b6a59b..bb3fc00 100644 --- a/gfxlcd/tests/test_area_drawing.py +++ b/gfxlcd/tests/test_area_drawing.py @@ -26,3 +26,165 @@ class TestPageDrawing(object): buffer = self.get_buffer() buffer[1][1] = 1 assert_equal(self.drv.buffer, buffer) + + def test_draw_two_pixel(self): + self.lcd.draw_pixel(1, 1) + self.lcd.draw_pixel(2, 2) + buffer = self.get_buffer() + buffer[1][1] = 1 + buffer[2][2] = 1 + assert_equal(self.drv.buffer, buffer) + + def test_draw_horizontal_line(self): + self.lcd.draw_line(1, 1, 8, 1) + buffer = self.get_buffer() + buffer[1][1] = 1 + buffer[2][1] = 1 + buffer[3][1] = 1 + buffer[4][1] = 1 + buffer[5][1] = 1 + buffer[6][1] = 1 + buffer[7][1] = 1 + buffer[8][1] = 1 + self.draw_buffer(self.drv.buffer) + assert_equal(self.drv.buffer, buffer) + + def test_draw_vertical_line(self): + self.lcd.draw_line(1, 1, 1, 14) + buffer = self.get_buffer() + buffer[1][1] = 1 + buffer[1][2] = 1 + buffer[1][3] = 1 + buffer[1][4] = 1 + buffer[1][5] = 1 + buffer[1][6] = 1 + buffer[1][7] = 1 + buffer[1][8] = 1 + buffer[1][9] = 1 + buffer[1][10] = 1 + buffer[1][11] = 1 + buffer[1][12] = 1 + buffer[1][13] = 1 + buffer[1][14] = 1 + self.draw_buffer(self.drv.buffer) + assert_equal(self.drv.buffer, buffer) + + def test_draw_overlapping_lines(self): + self.lcd.draw_line(1, 1, 8, 1) + self.lcd.draw_line(1, 1, 1, 14) + buffer = self.get_buffer() + buffer[1][1] = 1 + buffer[2][1] = 1 + buffer[3][1] = 1 + buffer[4][1] = 1 + buffer[5][1] = 1 + buffer[6][1] = 1 + buffer[7][1] = 1 + buffer[8][1] = 1 + buffer[1][1] = 1 + buffer[1][2] = 1 + buffer[1][3] = 1 + buffer[1][4] = 1 + buffer[1][5] = 1 + buffer[1][6] = 1 + buffer[1][7] = 1 + buffer[1][8] = 1 + buffer[1][9] = 1 + buffer[1][10] = 1 + buffer[1][11] = 1 + buffer[1][12] = 1 + buffer[1][13] = 1 + buffer[1][14] = 1 + assert_equal(self.drv.buffer, buffer) + + def test_draw_diagonal_line(self): + self.lcd.draw_line(0, 0, 9, 1) + buffer = self.get_buffer() + buffer[0][0] = 1 + buffer[1][0] = 1 + buffer[2][0] = 1 + buffer[3][0] = 1 + buffer[4][0] = 1 + buffer[5][1] = 1 + buffer[6][1] = 1 + buffer[7][1] = 1 + buffer[8][1] = 1 + buffer[9][1] = 1 + self.draw_buffer(self.drv.buffer) + assert_equal(self.drv.buffer, buffer) + + def test_draw_diagonal_line_even_steps(self): + self.lcd.draw_line(0, 0, 9, 15) + buffer = self.get_buffer() + buffer[0][0] = 1 + buffer[1][1] = 1 + buffer[2][2] = 1 + buffer[2][3] = 1 + buffer[3][4] = 1 + buffer[3][5] = 1 + buffer[4][6] = 1 + buffer[4][7] = 1 + buffer[5][8] = 1 + buffer[5][9] = 1 + buffer[6][10] = 1 + buffer[6][11] = 1 + buffer[7][12] = 1 + buffer[7][13] = 1 + buffer[8][14] = 1 + buffer[9][15] = 1 + self.draw_buffer(self.drv.buffer) + assert_equal(self.drv.buffer, buffer) + + def test_draw_diagonal_line_even_steps_even_rest(self): + self.lcd.draw_line(0, 0, 9, 5) + buffer = self.get_buffer() + buffer[0][0] = 1 + buffer[1][1] = 1 + buffer[2][1] = 1 + buffer[3][2] = 1 + buffer[4][2] = 1 + buffer[5][3] = 1 + buffer[6][3] = 1 + buffer[7][4] = 1 + buffer[8][4] = 1 + buffer[9][5] = 1 + self.draw_buffer(self.drv.buffer) + assert_equal(self.drv.buffer, buffer) + + def test_draw_diagonal_line_odd_steps_even_rest(self): + self.lcd.draw_line(0, 0, 9, 6) + buffer = self.get_buffer() + buffer[0][0] = 1 + buffer[1][1] = 1 + buffer[2][2] = 1 + buffer[3][2] = 1 + buffer[4][3] = 1 + buffer[5][3] = 1 + buffer[6][4] = 1 + buffer[7][4] = 1 + buffer[8][5] = 1 + buffer[9][6] = 1 + self.draw_buffer(self.drv.buffer) + assert_equal(self.drv.buffer, buffer) + + def test_draw_diagonal_line_even_steps_odd_rest(self): + self.lcd.draw_line(0, 0, 8, 6) + buffer = self.get_buffer() + buffer[0][0] = 1 + buffer[1][1] = 1 + buffer[2][2] = 1 + buffer[3][3] = 1 + buffer[4][3] = 1 + buffer[5][3] = 1 + buffer[6][4] = 1 + buffer[7][5] = 1 + buffer[8][6] = 1 + self.draw_buffer(self.drv.buffer) + assert_equal(self.drv.buffer, buffer) + + def draw_buffer(self, buffer): + for y in range(self.lcd.height): + row = "" + for x in range(self.lcd.width): + row += str(buffer[x][y]) + print (row) diff --git a/gfxlcd/tests/test_page_drawing.py b/gfxlcd/tests/test_page_drawing.py index b937977..2358cf2 100644 --- a/gfxlcd/tests/test_page_drawing.py +++ b/gfxlcd/tests/test_page_drawing.py @@ -139,19 +139,18 @@ class TestPageDrawing(object): assert_equal(self.lcd.buffer, buffer) def test_draw_diagonal_line_even_steps_odd_rest(self): - self.lcd.draw_line(0, 0, 9, 6) + self.lcd.draw_line(0, 0, 8, 6) buffer = self.get_buffer() buffer[0][0] = 1 buffer[1][0] = 2 buffer[2][0] = 4 - buffer[3][0] = 4 + buffer[3][0] = 8 buffer[4][0] = 8 buffer[5][0] = 8 buffer[6][0] = 16 - buffer[7][0] = 16 - buffer[8][0] = 32 - buffer[9][0] = 64 - + buffer[7][0] = 32 + buffer[8][0] = 64 + self.draw_buffer(self.lcd.buffer) assert_equal(self.lcd.buffer, buffer) def test_fill_rect(self):