Tijl Goens
/
EpaperdisplayII
tempcommit 13/05
epdpaint.cpp@0:73f2160fef5a, 2019-05-13 (annotated)
- Committer:
- Ruben_Heintjens
- Date:
- Mon May 13 09:06:23 2019 +0000
- Revision:
- 0:73f2160fef5a
voor tijl
Who changed what in which revision?
User | Revision | Line number | New 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 |