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