tempcommit 13/05

Committer:
tijl
Date:
Wed May 15 13:39:22 2019 +0000
Revision:
2:048e163245b7
Parent:
0:73f2160fef5a
blub 15/05;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ruben_Heintjens 0:73f2160fef5a 1 /**
Ruben_Heintjens 0:73f2160fef5a 2 * @filename : epdpaint.cpp
Ruben_Heintjens 0:73f2160fef5a 3 * @brief : Paint tools
Ruben_Heintjens 0:73f2160fef5a 4 * @author : Yehui from Waveshare
Ruben_Heintjens 0:73f2160fef5a 5 *
Ruben_Heintjens 0:73f2160fef5a 6 * Copyright (C) Waveshare September 9 2017
Ruben_Heintjens 0:73f2160fef5a 7 *
Ruben_Heintjens 0:73f2160fef5a 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
Ruben_Heintjens 0:73f2160fef5a 9 * of this software and associated documnetation files (the "Software"), to deal
Ruben_Heintjens 0:73f2160fef5a 10 * in the Software without restriction, including without limitation the rights
Ruben_Heintjens 0:73f2160fef5a 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Ruben_Heintjens 0:73f2160fef5a 12 * copies of the Software, and to permit persons to whom the Software is
Ruben_Heintjens 0:73f2160fef5a 13 * furished to do so, subject to the following conditions:
Ruben_Heintjens 0:73f2160fef5a 14 *
Ruben_Heintjens 0:73f2160fef5a 15 * The above copyright notice and this permission notice shall be included in
Ruben_Heintjens 0:73f2160fef5a 16 * all copies or substantial portions of the Software.
Ruben_Heintjens 0:73f2160fef5a 17 *
Ruben_Heintjens 0:73f2160fef5a 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Ruben_Heintjens 0:73f2160fef5a 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Ruben_Heintjens 0:73f2160fef5a 20 * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Ruben_Heintjens 0:73f2160fef5a 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Ruben_Heintjens 0:73f2160fef5a 22 * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Ruben_Heintjens 0:73f2160fef5a 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Ruben_Heintjens 0:73f2160fef5a 24 * THE SOFTWARE.
Ruben_Heintjens 0:73f2160fef5a 25 */
Ruben_Heintjens 0:73f2160fef5a 26
Ruben_Heintjens 0:73f2160fef5a 27 //#include <avr/pgmspace.h> //arduino library
Ruben_Heintjens 0:73f2160fef5a 28 #include "epdpaint.h"
Ruben_Heintjens 0:73f2160fef5a 29 #include "mbed.h"
Ruben_Heintjens 0:73f2160fef5a 30
Ruben_Heintjens 0:73f2160fef5a 31 Paint::Paint(unsigned char* image, int width, int height) {
Ruben_Heintjens 0:73f2160fef5a 32 this->rotate = ROTATE_90;
Ruben_Heintjens 0:73f2160fef5a 33 this->image = image;
Ruben_Heintjens 0:73f2160fef5a 34 /* 1 byte = 8 pixels, so the width should be the multiple of 8 */
Ruben_Heintjens 0:73f2160fef5a 35 this->width = width % 8 ? width + 8 - (width % 8) : width;
Ruben_Heintjens 0:73f2160fef5a 36 this->height = height;
Ruben_Heintjens 0:73f2160fef5a 37 }
Ruben_Heintjens 0:73f2160fef5a 38
Ruben_Heintjens 0:73f2160fef5a 39 Paint::~Paint() {
Ruben_Heintjens 0:73f2160fef5a 40 }
Ruben_Heintjens 0:73f2160fef5a 41
Ruben_Heintjens 0:73f2160fef5a 42 /**
Ruben_Heintjens 0:73f2160fef5a 43 * @brief: clear the image
Ruben_Heintjens 0:73f2160fef5a 44 */
Ruben_Heintjens 0:73f2160fef5a 45 void Paint::Clear(int colored) {
Ruben_Heintjens 0:73f2160fef5a 46 for (int x = 0; x < this->width; x++) {
Ruben_Heintjens 0:73f2160fef5a 47 for (int y = 0; y < this->height; y++) {
Ruben_Heintjens 0:73f2160fef5a 48 DrawAbsolutePixel(x, y, colored);
Ruben_Heintjens 0:73f2160fef5a 49 }
Ruben_Heintjens 0:73f2160fef5a 50 }
Ruben_Heintjens 0:73f2160fef5a 51 }
Ruben_Heintjens 0:73f2160fef5a 52
Ruben_Heintjens 0:73f2160fef5a 53 /**
Ruben_Heintjens 0:73f2160fef5a 54 * @brief: this draws a pixel by absolute coordinates.
Ruben_Heintjens 0:73f2160fef5a 55 * this function won't be affected by the rotate parameter.
Ruben_Heintjens 0:73f2160fef5a 56 */
Ruben_Heintjens 0:73f2160fef5a 57 void Paint::DrawAbsolutePixel(int x, int y, int colored) {
Ruben_Heintjens 0:73f2160fef5a 58 if (x < 0 || x >= this->width || y < 0 || y >= this->height) {
Ruben_Heintjens 0:73f2160fef5a 59 return;
Ruben_Heintjens 0:73f2160fef5a 60 }
Ruben_Heintjens 0:73f2160fef5a 61 if (IF_INVERT_COLOR) {
Ruben_Heintjens 0:73f2160fef5a 62 if (colored) {
Ruben_Heintjens 0:73f2160fef5a 63 image[(x + y * this->width) / 8] |= 0x80 >> (x % 8);
Ruben_Heintjens 0:73f2160fef5a 64 } else {
Ruben_Heintjens 0:73f2160fef5a 65 image[(x + y * this->width) / 8] &= ~(0x80 >> (x % 8));
Ruben_Heintjens 0:73f2160fef5a 66 }
Ruben_Heintjens 0:73f2160fef5a 67 } else {
Ruben_Heintjens 0:73f2160fef5a 68 if (colored) {
Ruben_Heintjens 0:73f2160fef5a 69 image[(x + y * this->width) / 8] &= ~(0x80 >> (x % 8));
Ruben_Heintjens 0:73f2160fef5a 70 } else {
Ruben_Heintjens 0:73f2160fef5a 71 image[(x + y * this->width) / 8] |= 0x80 >> (x % 8);
Ruben_Heintjens 0:73f2160fef5a 72 }
Ruben_Heintjens 0:73f2160fef5a 73 }
Ruben_Heintjens 0:73f2160fef5a 74 }
Ruben_Heintjens 0:73f2160fef5a 75
Ruben_Heintjens 0:73f2160fef5a 76 /**
Ruben_Heintjens 0:73f2160fef5a 77 * @brief: Getters and Setters
Ruben_Heintjens 0:73f2160fef5a 78 */
Ruben_Heintjens 0:73f2160fef5a 79 unsigned char* Paint::GetImage(void) {
Ruben_Heintjens 0:73f2160fef5a 80 return this->image;
Ruben_Heintjens 0:73f2160fef5a 81 }
Ruben_Heintjens 0:73f2160fef5a 82
Ruben_Heintjens 0:73f2160fef5a 83 int Paint::GetWidth(void) {
Ruben_Heintjens 0:73f2160fef5a 84 return this->width;
Ruben_Heintjens 0:73f2160fef5a 85 }
Ruben_Heintjens 0:73f2160fef5a 86
Ruben_Heintjens 0:73f2160fef5a 87 void Paint::SetWidth(int width) {
Ruben_Heintjens 0:73f2160fef5a 88 this->width = width % 8 ? width + 8 - (width % 8) : width;
Ruben_Heintjens 0:73f2160fef5a 89 }
Ruben_Heintjens 0:73f2160fef5a 90
Ruben_Heintjens 0:73f2160fef5a 91 int Paint::GetHeight(void) {
Ruben_Heintjens 0:73f2160fef5a 92 return this->height;
Ruben_Heintjens 0:73f2160fef5a 93 }
Ruben_Heintjens 0:73f2160fef5a 94
Ruben_Heintjens 0:73f2160fef5a 95 void Paint::SetHeight(int height) {
Ruben_Heintjens 0:73f2160fef5a 96 this->height = height;
Ruben_Heintjens 0:73f2160fef5a 97 }
Ruben_Heintjens 0:73f2160fef5a 98
Ruben_Heintjens 0:73f2160fef5a 99 int Paint::GetRotate(void) {
Ruben_Heintjens 0:73f2160fef5a 100 return this->rotate;
Ruben_Heintjens 0:73f2160fef5a 101 }
Ruben_Heintjens 0:73f2160fef5a 102
Ruben_Heintjens 0:73f2160fef5a 103 void Paint::SetRotate(int rotate){
Ruben_Heintjens 0:73f2160fef5a 104 this->rotate = rotate;
Ruben_Heintjens 0:73f2160fef5a 105 }
Ruben_Heintjens 0:73f2160fef5a 106
Ruben_Heintjens 0:73f2160fef5a 107 /**
Ruben_Heintjens 0:73f2160fef5a 108 * @brief: this draws a pixel by the coordinates
Ruben_Heintjens 0:73f2160fef5a 109 */
Ruben_Heintjens 0:73f2160fef5a 110 void Paint::DrawPixel(int x, int y, int colored) {
Ruben_Heintjens 0:73f2160fef5a 111 int point_temp;
Ruben_Heintjens 0:73f2160fef5a 112 if (this->rotate == ROTATE_0) {
Ruben_Heintjens 0:73f2160fef5a 113 if(x < 0 || x >= this->width || y < 0 || y >= this->height) {
Ruben_Heintjens 0:73f2160fef5a 114 return;
Ruben_Heintjens 0:73f2160fef5a 115 }
Ruben_Heintjens 0:73f2160fef5a 116 DrawAbsolutePixel(x, y, colored);
Ruben_Heintjens 0:73f2160fef5a 117 } else if (this->rotate == ROTATE_90) {
Ruben_Heintjens 0:73f2160fef5a 118 if(x < 0 || x >= this->height || y < 0 || y >= this->width) {
Ruben_Heintjens 0:73f2160fef5a 119 return;
Ruben_Heintjens 0:73f2160fef5a 120 }
Ruben_Heintjens 0:73f2160fef5a 121 point_temp = x;
Ruben_Heintjens 0:73f2160fef5a 122 x = this->width - y;
Ruben_Heintjens 0:73f2160fef5a 123 y = point_temp;
Ruben_Heintjens 0:73f2160fef5a 124 DrawAbsolutePixel(x, y, colored);
Ruben_Heintjens 0:73f2160fef5a 125 } else if (this->rotate == ROTATE_180) {
Ruben_Heintjens 0:73f2160fef5a 126 if(x < 0 || x >= this->width || y < 0 || y >= this->height) {
Ruben_Heintjens 0:73f2160fef5a 127 return;
Ruben_Heintjens 0:73f2160fef5a 128 }
Ruben_Heintjens 0:73f2160fef5a 129 x = this->width - x;
Ruben_Heintjens 0:73f2160fef5a 130 y = this->height - y;
Ruben_Heintjens 0:73f2160fef5a 131 DrawAbsolutePixel(x, y, colored);
Ruben_Heintjens 0:73f2160fef5a 132 } else if (this->rotate == ROTATE_270) {
Ruben_Heintjens 0:73f2160fef5a 133 if(x < 0 || x >= this->height || y < 0 || y >= this->width) {
Ruben_Heintjens 0:73f2160fef5a 134 return;
Ruben_Heintjens 0:73f2160fef5a 135 }
Ruben_Heintjens 0:73f2160fef5a 136 point_temp = x;
Ruben_Heintjens 0:73f2160fef5a 137 x = y;
Ruben_Heintjens 0:73f2160fef5a 138 y = this->height - point_temp;
Ruben_Heintjens 0:73f2160fef5a 139 DrawAbsolutePixel(x, y, colored);
Ruben_Heintjens 0:73f2160fef5a 140 }
Ruben_Heintjens 0:73f2160fef5a 141 }
Ruben_Heintjens 0:73f2160fef5a 142
Ruben_Heintjens 0:73f2160fef5a 143 /**
Ruben_Heintjens 0:73f2160fef5a 144 * @brief: this draws a charactor on the frame buffer but not refresh
Ruben_Heintjens 0:73f2160fef5a 145 */
Ruben_Heintjens 0:73f2160fef5a 146 void Paint::DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored) {
Ruben_Heintjens 0:73f2160fef5a 147 int i, j;
Ruben_Heintjens 0:73f2160fef5a 148 unsigned int char_offset = (ascii_char - ' ') * font->Height * (font->Width / 8 + (font->Width % 8 ? 1 : 0));
Ruben_Heintjens 0:73f2160fef5a 149 //const unsigned char* ptr = &font->table[char_offset];
Ruben_Heintjens 0:73f2160fef5a 150 unsigned char ptr = font->table[char_offset];
Ruben_Heintjens 0:73f2160fef5a 151
Ruben_Heintjens 0:73f2160fef5a 152 for (j = 0; j < font->Height; j++) {
Ruben_Heintjens 0:73f2160fef5a 153 for (i = 0; i < font->Width; i++) {
Ruben_Heintjens 0:73f2160fef5a 154 //if (pgm_read_byte(ptr) & (0x80 >> (i % 8))) {
Ruben_Heintjens 0:73f2160fef5a 155
Ruben_Heintjens 0:73f2160fef5a 156 // een 1 shiften naar rechts
Ruben_Heintjens 0:73f2160fef5a 157
Ruben_Heintjens 0:73f2160fef5a 158 if (ptr & (0x80 >> (i % 8))) {
Ruben_Heintjens 0:73f2160fef5a 159 DrawPixel(x + i, y + j, colored);
Ruben_Heintjens 0:73f2160fef5a 160 }
Ruben_Heintjens 0:73f2160fef5a 161 if (i % 8 == 7) {
Ruben_Heintjens 0:73f2160fef5a 162 char_offset++;
Ruben_Heintjens 0:73f2160fef5a 163 ptr = font->table[char_offset];
Ruben_Heintjens 0:73f2160fef5a 164 //ptr++;
Ruben_Heintjens 0:73f2160fef5a 165 }
Ruben_Heintjens 0:73f2160fef5a 166 }
Ruben_Heintjens 0:73f2160fef5a 167 if (font->Width % 8 != 0) {
Ruben_Heintjens 0:73f2160fef5a 168 char_offset++;
Ruben_Heintjens 0:73f2160fef5a 169 ptr = font->table[char_offset];
Ruben_Heintjens 0:73f2160fef5a 170 //ptr++;
Ruben_Heintjens 0:73f2160fef5a 171 }
Ruben_Heintjens 0:73f2160fef5a 172 }
Ruben_Heintjens 0:73f2160fef5a 173 }
Ruben_Heintjens 0:73f2160fef5a 174
Ruben_Heintjens 0:73f2160fef5a 175 /**
Ruben_Heintjens 0:73f2160fef5a 176 * @brief: this displays a string on the frame buffer but not refresh
Ruben_Heintjens 0:73f2160fef5a 177 */
Ruben_Heintjens 0:73f2160fef5a 178 void Paint::DrawStringAt(int x, int y, const char* text, sFONT* font, int colored) {
Ruben_Heintjens 0:73f2160fef5a 179 const char* p_text = text;
Ruben_Heintjens 0:73f2160fef5a 180 unsigned int counter = 0;
Ruben_Heintjens 0:73f2160fef5a 181 int refcolumn = x;
Ruben_Heintjens 0:73f2160fef5a 182
Ruben_Heintjens 0:73f2160fef5a 183 /* Send the string character by character on EPD */
Ruben_Heintjens 0:73f2160fef5a 184 while (*p_text != 0) {
Ruben_Heintjens 0:73f2160fef5a 185 /* Display one character on EPD */
Ruben_Heintjens 0:73f2160fef5a 186 DrawCharAt(refcolumn, y, *p_text, font, colored);
Ruben_Heintjens 0:73f2160fef5a 187 /* Decrement the column position by 16 */
Ruben_Heintjens 0:73f2160fef5a 188 refcolumn += font->Width;
Ruben_Heintjens 0:73f2160fef5a 189 /* Point on the next character */
Ruben_Heintjens 0:73f2160fef5a 190 p_text++;
Ruben_Heintjens 0:73f2160fef5a 191 counter++;
Ruben_Heintjens 0:73f2160fef5a 192 }
Ruben_Heintjens 0:73f2160fef5a 193 }
Ruben_Heintjens 0:73f2160fef5a 194
Ruben_Heintjens 0:73f2160fef5a 195 /**
Ruben_Heintjens 0:73f2160fef5a 196 * @brief: this draws a line on the frame buffer
Ruben_Heintjens 0:73f2160fef5a 197 */
Ruben_Heintjens 0:73f2160fef5a 198 void Paint::DrawLine(int x0, int y0, int x1, int y1, int colored) {
Ruben_Heintjens 0:73f2160fef5a 199 /* Bresenham algorithm */
Ruben_Heintjens 0:73f2160fef5a 200 int dx = x1 - x0 >= 0 ? x1 - x0 : x0 - x1;
Ruben_Heintjens 0:73f2160fef5a 201 int sx = x0 < x1 ? 1 : -1;
Ruben_Heintjens 0:73f2160fef5a 202 int dy = y1 - y0 <= 0 ? y1 - y0 : y0 - y1;
Ruben_Heintjens 0:73f2160fef5a 203 int sy = y0 < y1 ? 1 : -1;
Ruben_Heintjens 0:73f2160fef5a 204 int err = dx + dy;
Ruben_Heintjens 0:73f2160fef5a 205
Ruben_Heintjens 0:73f2160fef5a 206 while((x0 != x1) && (y0 != y1)) {
Ruben_Heintjens 0:73f2160fef5a 207 DrawPixel(x0, y0 , colored);
Ruben_Heintjens 0:73f2160fef5a 208 if (2 * err >= dy) {
Ruben_Heintjens 0:73f2160fef5a 209 err += dy;
Ruben_Heintjens 0:73f2160fef5a 210 x0 += sx;
Ruben_Heintjens 0:73f2160fef5a 211 }
Ruben_Heintjens 0:73f2160fef5a 212 if (2 * err <= dx) {
Ruben_Heintjens 0:73f2160fef5a 213 err += dx;
Ruben_Heintjens 0:73f2160fef5a 214 y0 += sy;
Ruben_Heintjens 0:73f2160fef5a 215 }
Ruben_Heintjens 0:73f2160fef5a 216 }
Ruben_Heintjens 0:73f2160fef5a 217 }
Ruben_Heintjens 0:73f2160fef5a 218
Ruben_Heintjens 0:73f2160fef5a 219 /**
Ruben_Heintjens 0:73f2160fef5a 220 * @brief: this draws a horizontal line on the frame buffer
Ruben_Heintjens 0:73f2160fef5a 221 */
Ruben_Heintjens 0:73f2160fef5a 222 void Paint::DrawHorizontalLine(int x, int y, int line_width, int colored) {
Ruben_Heintjens 0:73f2160fef5a 223 int i;
Ruben_Heintjens 0:73f2160fef5a 224 for (i = x; i < x + line_width; i++) {
Ruben_Heintjens 0:73f2160fef5a 225 DrawPixel(i, y, colored);
Ruben_Heintjens 0:73f2160fef5a 226 }
Ruben_Heintjens 0:73f2160fef5a 227 }
Ruben_Heintjens 0:73f2160fef5a 228
Ruben_Heintjens 0:73f2160fef5a 229 /**
Ruben_Heintjens 0:73f2160fef5a 230 * @brief: this draws a vertical line on the frame buffer
Ruben_Heintjens 0:73f2160fef5a 231 */
Ruben_Heintjens 0:73f2160fef5a 232 void Paint::DrawVerticalLine(int x, int y, int line_height, int colored) {
Ruben_Heintjens 0:73f2160fef5a 233 int i;
Ruben_Heintjens 0:73f2160fef5a 234 for (i = y; i < y + line_height; i++) {
Ruben_Heintjens 0:73f2160fef5a 235 DrawPixel(x, i, colored);
Ruben_Heintjens 0:73f2160fef5a 236 }
Ruben_Heintjens 0:73f2160fef5a 237 }
Ruben_Heintjens 0:73f2160fef5a 238
Ruben_Heintjens 0:73f2160fef5a 239 /**
Ruben_Heintjens 0:73f2160fef5a 240 * @brief: this draws a rectangle
Ruben_Heintjens 0:73f2160fef5a 241 */
Ruben_Heintjens 0:73f2160fef5a 242 void Paint::DrawRectangle(int x0, int y0, int x1, int y1, int colored) {
Ruben_Heintjens 0:73f2160fef5a 243 int min_x, min_y, max_x, max_y;
Ruben_Heintjens 0:73f2160fef5a 244 min_x = x1 > x0 ? x0 : x1;
Ruben_Heintjens 0:73f2160fef5a 245 max_x = x1 > x0 ? x1 : x0;
Ruben_Heintjens 0:73f2160fef5a 246 min_y = y1 > y0 ? y0 : y1;
Ruben_Heintjens 0:73f2160fef5a 247 max_y = y1 > y0 ? y1 : y0;
Ruben_Heintjens 0:73f2160fef5a 248
Ruben_Heintjens 0:73f2160fef5a 249 DrawHorizontalLine(min_x, min_y, max_x - min_x + 1, colored);
Ruben_Heintjens 0:73f2160fef5a 250 DrawHorizontalLine(min_x, max_y, max_x - min_x + 1, colored);
Ruben_Heintjens 0:73f2160fef5a 251 DrawVerticalLine(min_x, min_y, max_y - min_y + 1, colored);
Ruben_Heintjens 0:73f2160fef5a 252 DrawVerticalLine(max_x, min_y, max_y - min_y + 1, colored);
Ruben_Heintjens 0:73f2160fef5a 253 }
Ruben_Heintjens 0:73f2160fef5a 254
Ruben_Heintjens 0:73f2160fef5a 255 /**
Ruben_Heintjens 0:73f2160fef5a 256 * @brief: this draws a filled rectangle
Ruben_Heintjens 0:73f2160fef5a 257 */
Ruben_Heintjens 0:73f2160fef5a 258 void Paint::DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored) {
Ruben_Heintjens 0:73f2160fef5a 259 int min_x, min_y, max_x, max_y;
Ruben_Heintjens 0:73f2160fef5a 260 int i;
Ruben_Heintjens 0:73f2160fef5a 261 min_x = x1 > x0 ? x0 : x1;
Ruben_Heintjens 0:73f2160fef5a 262 max_x = x1 > x0 ? x1 : x0;
Ruben_Heintjens 0:73f2160fef5a 263 min_y = y1 > y0 ? y0 : y1;
Ruben_Heintjens 0:73f2160fef5a 264 max_y = y1 > y0 ? y1 : y0;
Ruben_Heintjens 0:73f2160fef5a 265 printf("drawfilled pre for \r\n");
Ruben_Heintjens 0:73f2160fef5a 266 for (i = min_x; i <= max_x; i++) {
Ruben_Heintjens 0:73f2160fef5a 267 DrawVerticalLine(i, min_y, max_y - min_y + 1, colored);
Ruben_Heintjens 0:73f2160fef5a 268 }
Ruben_Heintjens 0:73f2160fef5a 269 printf("done \r\n");
Ruben_Heintjens 0:73f2160fef5a 270 }
Ruben_Heintjens 0:73f2160fef5a 271
Ruben_Heintjens 0:73f2160fef5a 272 /**
Ruben_Heintjens 0:73f2160fef5a 273 * @brief: this draws a circle
Ruben_Heintjens 0:73f2160fef5a 274 */
Ruben_Heintjens 0:73f2160fef5a 275 void Paint::DrawCircle(int x, int y, int radius, int colored) {
Ruben_Heintjens 0:73f2160fef5a 276 /* Bresenham algorithm */
Ruben_Heintjens 0:73f2160fef5a 277 int x_pos = -radius;
Ruben_Heintjens 0:73f2160fef5a 278 int y_pos = 0;
Ruben_Heintjens 0:73f2160fef5a 279 int err = 2 - 2 * radius;
Ruben_Heintjens 0:73f2160fef5a 280 int e2;
Ruben_Heintjens 0:73f2160fef5a 281
Ruben_Heintjens 0:73f2160fef5a 282 do {
Ruben_Heintjens 0:73f2160fef5a 283 DrawPixel(x - x_pos, y + y_pos, colored);
Ruben_Heintjens 0:73f2160fef5a 284 DrawPixel(x + x_pos, y + y_pos, colored);
Ruben_Heintjens 0:73f2160fef5a 285 DrawPixel(x + x_pos, y - y_pos, colored);
Ruben_Heintjens 0:73f2160fef5a 286 DrawPixel(x - x_pos, y - y_pos, colored);
Ruben_Heintjens 0:73f2160fef5a 287 e2 = err;
Ruben_Heintjens 0:73f2160fef5a 288 if (e2 <= y_pos) {
Ruben_Heintjens 0:73f2160fef5a 289 err += ++y_pos * 2 + 1;
Ruben_Heintjens 0:73f2160fef5a 290 if(-x_pos == y_pos && e2 <= x_pos) {
Ruben_Heintjens 0:73f2160fef5a 291 e2 = 0;
Ruben_Heintjens 0:73f2160fef5a 292 }
Ruben_Heintjens 0:73f2160fef5a 293 }
Ruben_Heintjens 0:73f2160fef5a 294 if (e2 > x_pos) {
Ruben_Heintjens 0:73f2160fef5a 295 err += ++x_pos * 2 + 1;
Ruben_Heintjens 0:73f2160fef5a 296 }
Ruben_Heintjens 0:73f2160fef5a 297 } while (x_pos <= 0);
Ruben_Heintjens 0:73f2160fef5a 298 }
Ruben_Heintjens 0:73f2160fef5a 299
Ruben_Heintjens 0:73f2160fef5a 300 /**
Ruben_Heintjens 0:73f2160fef5a 301 * @brief: this draws a filled circle
Ruben_Heintjens 0:73f2160fef5a 302 */
Ruben_Heintjens 0:73f2160fef5a 303 void Paint::DrawFilledCircle(int x, int y, int radius, int colored) {
Ruben_Heintjens 0:73f2160fef5a 304 /* Bresenham algorithm */
Ruben_Heintjens 0:73f2160fef5a 305 int x_pos = -radius;
Ruben_Heintjens 0:73f2160fef5a 306 int y_pos = 0;
Ruben_Heintjens 0:73f2160fef5a 307 int err = 2 - 2 * radius;
Ruben_Heintjens 0:73f2160fef5a 308 int e2;
Ruben_Heintjens 0:73f2160fef5a 309
Ruben_Heintjens 0:73f2160fef5a 310 do {
Ruben_Heintjens 0:73f2160fef5a 311 DrawPixel(x - x_pos, y + y_pos, colored);
Ruben_Heintjens 0:73f2160fef5a 312 DrawPixel(x + x_pos, y + y_pos, colored);
Ruben_Heintjens 0:73f2160fef5a 313 DrawPixel(x + x_pos, y - y_pos, colored);
Ruben_Heintjens 0:73f2160fef5a 314 DrawPixel(x - x_pos, y - y_pos, colored);
Ruben_Heintjens 0:73f2160fef5a 315 DrawHorizontalLine(x + x_pos, y + y_pos, 2 * (-x_pos) + 1, colored);
Ruben_Heintjens 0:73f2160fef5a 316 DrawHorizontalLine(x + x_pos, y - y_pos, 2 * (-x_pos) + 1, colored);
Ruben_Heintjens 0:73f2160fef5a 317 e2 = err;
Ruben_Heintjens 0:73f2160fef5a 318 if (e2 <= y_pos) {
Ruben_Heintjens 0:73f2160fef5a 319 err += ++y_pos * 2 + 1;
Ruben_Heintjens 0:73f2160fef5a 320 if(-x_pos == y_pos && e2 <= x_pos) {
Ruben_Heintjens 0:73f2160fef5a 321 e2 = 0;
Ruben_Heintjens 0:73f2160fef5a 322 }
Ruben_Heintjens 0:73f2160fef5a 323 }
Ruben_Heintjens 0:73f2160fef5a 324 if(e2 > x_pos) {
Ruben_Heintjens 0:73f2160fef5a 325 err += ++x_pos * 2 + 1;
Ruben_Heintjens 0:73f2160fef5a 326 }
Ruben_Heintjens 0:73f2160fef5a 327 } while(x_pos <= 0);
Ruben_Heintjens 0:73f2160fef5a 328 }
Ruben_Heintjens 0:73f2160fef5a 329 void Paint :: DrawImage(int x, int y, int x1, int y1,unsigned char* image, int colored)
Ruben_Heintjens 0:73f2160fef5a 330 {
Ruben_Heintjens 0:73f2160fef5a 331 int index = 0;
Ruben_Heintjens 0:73f2160fef5a 332 for (int i=y; i<y1; i++)
Ruben_Heintjens 0:73f2160fef5a 333 {
Ruben_Heintjens 0:73f2160fef5a 334 for (int j = x; j<x1; j++)
Ruben_Heintjens 0:73f2160fef5a 335 {
Ruben_Heintjens 0:73f2160fef5a 336 DrawPixel(j, i,image[index]);
Ruben_Heintjens 0:73f2160fef5a 337 index++;
Ruben_Heintjens 0:73f2160fef5a 338 }
Ruben_Heintjens 0:73f2160fef5a 339 }
Ruben_Heintjens 0:73f2160fef5a 340 }
Ruben_Heintjens 0:73f2160fef5a 341
Ruben_Heintjens 0:73f2160fef5a 342 /* END OF FILE */
Ruben_Heintjens 0:73f2160fef5a 343
Ruben_Heintjens 0:73f2160fef5a 344
Ruben_Heintjens 0:73f2160fef5a 345
Ruben_Heintjens 0:73f2160fef5a 346
Ruben_Heintjens 0:73f2160fef5a 347
Ruben_Heintjens 0:73f2160fef5a 348
Ruben_Heintjens 0:73f2160fef5a 349
Ruben_Heintjens 0:73f2160fef5a 350
Ruben_Heintjens 0:73f2160fef5a 351
Ruben_Heintjens 0:73f2160fef5a 352
Ruben_Heintjens 0:73f2160fef5a 353
Ruben_Heintjens 0:73f2160fef5a 354
Ruben_Heintjens 0:73f2160fef5a 355
Ruben_Heintjens 0:73f2160fef5a 356
Ruben_Heintjens 0:73f2160fef5a 357
Ruben_Heintjens 0:73f2160fef5a 358
Ruben_Heintjens 0:73f2160fef5a 359
Ruben_Heintjens 0:73f2160fef5a 360
Ruben_Heintjens 0:73f2160fef5a 361
Ruben_Heintjens 0:73f2160fef5a 362
Ruben_Heintjens 0:73f2160fef5a 363
Ruben_Heintjens 0:73f2160fef5a 364
Ruben_Heintjens 0:73f2160fef5a 365