Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
u8glibARM/u8g_polygon.c@1:0e75de2a5d21, 2016-06-13 (annotated)
- Committer:
- lixianyu
- Date:
- Mon Jun 13 02:21:11 2016 +0000
- Revision:
- 1:0e75de2a5d21
- Parent:
- 0:d8f4c441e032
u8glib???????????????????????????Adafruit_GFX????OLED????????bitmap??????
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| lixianyu | 0:d8f4c441e032 | 1 | /* |
| lixianyu | 0:d8f4c441e032 | 2 | |
| lixianyu | 0:d8f4c441e032 | 3 | u8g_polygon.c |
| lixianyu | 0:d8f4c441e032 | 4 | |
| lixianyu | 0:d8f4c441e032 | 5 | Implementation of a polygon draw algorithm for "convex" polygons. |
| lixianyu | 0:d8f4c441e032 | 6 | |
| lixianyu | 0:d8f4c441e032 | 7 | Universal 8bit Graphics Library |
| lixianyu | 0:d8f4c441e032 | 8 | |
| lixianyu | 0:d8f4c441e032 | 9 | Copyright (c) 2013, olikraus@gmail.com |
| lixianyu | 0:d8f4c441e032 | 10 | All rights reserved. |
| lixianyu | 0:d8f4c441e032 | 11 | |
| lixianyu | 0:d8f4c441e032 | 12 | Redistribution and use in source and binary forms, with or without modification, |
| lixianyu | 0:d8f4c441e032 | 13 | are permitted provided that the following conditions are met: |
| lixianyu | 0:d8f4c441e032 | 14 | |
| lixianyu | 0:d8f4c441e032 | 15 | * Redistributions of source code must retain the above copyright notice, this list |
| lixianyu | 0:d8f4c441e032 | 16 | of conditions and the following disclaimer. |
| lixianyu | 0:d8f4c441e032 | 17 | |
| lixianyu | 0:d8f4c441e032 | 18 | * Redistributions in binary form must reproduce the above copyright notice, this |
| lixianyu | 0:d8f4c441e032 | 19 | list of conditions and the following disclaimer in the documentation and/or other |
| lixianyu | 0:d8f4c441e032 | 20 | materials provided with the distribution. |
| lixianyu | 0:d8f4c441e032 | 21 | |
| lixianyu | 0:d8f4c441e032 | 22 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
| lixianyu | 0:d8f4c441e032 | 23 | CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
| lixianyu | 0:d8f4c441e032 | 24 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| lixianyu | 0:d8f4c441e032 | 25 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| lixianyu | 0:d8f4c441e032 | 26 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| lixianyu | 0:d8f4c441e032 | 27 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| lixianyu | 0:d8f4c441e032 | 28 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| lixianyu | 0:d8f4c441e032 | 29 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| lixianyu | 0:d8f4c441e032 | 30 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| lixianyu | 0:d8f4c441e032 | 31 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| lixianyu | 0:d8f4c441e032 | 32 | STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| lixianyu | 0:d8f4c441e032 | 33 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| lixianyu | 0:d8f4c441e032 | 34 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| lixianyu | 0:d8f4c441e032 | 35 | |
| lixianyu | 0:d8f4c441e032 | 36 | See also: |
| lixianyu | 0:d8f4c441e032 | 37 | http://www.angelfire.com/linux/myp/ConvexPolRas/ConvexPolRas.html |
| lixianyu | 0:d8f4c441e032 | 38 | Computer Graphics, Principles and Practice, Foley, van Dam, Feiner, Hughes (pp 92) |
| lixianyu | 0:d8f4c441e032 | 39 | Michael Abrash's Graphics Programming Black Book, Special Edition (Chapter 38 and 39) |
| lixianyu | 0:d8f4c441e032 | 40 | |
| lixianyu | 0:d8f4c441e032 | 41 | Optimized for embedded systems |
| lixianyu | 0:d8f4c441e032 | 42 | - static memory usage only |
| lixianyu | 0:d8f4c441e032 | 43 | - consistent data types |
| lixianyu | 0:d8f4c441e032 | 44 | - low flash ROM consumption |
| lixianyu | 0:d8f4c441e032 | 45 | |
| lixianyu | 0:d8f4c441e032 | 46 | */ |
| lixianyu | 0:d8f4c441e032 | 47 | |
| lixianyu | 0:d8f4c441e032 | 48 | |
| lixianyu | 0:d8f4c441e032 | 49 | #include "u8g.h" |
| lixianyu | 0:d8f4c441e032 | 50 | |
| lixianyu | 0:d8f4c441e032 | 51 | |
| lixianyu | 0:d8f4c441e032 | 52 | |
| lixianyu | 0:d8f4c441e032 | 53 | |
| lixianyu | 0:d8f4c441e032 | 54 | /*===========================================*/ |
| lixianyu | 0:d8f4c441e032 | 55 | /* procedures, which should not be inlined (save as much flash ROM as possible */ |
| lixianyu | 0:d8f4c441e032 | 56 | |
| lixianyu | 0:d8f4c441e032 | 57 | static uint8_t pge_Next(struct pg_edge_struct *pge) PG_NOINLINE; |
| lixianyu | 0:d8f4c441e032 | 58 | static uint8_t pg_inc(pg_struct *pg, uint8_t i) PG_NOINLINE; |
| lixianyu | 0:d8f4c441e032 | 59 | static uint8_t pg_dec(pg_struct *pg, uint8_t i) PG_NOINLINE; |
| lixianyu | 0:d8f4c441e032 | 60 | static void pg_expand_min_y(pg_struct *pg, pg_word_t min_y, uint8_t pge_idx) PG_NOINLINE; |
| lixianyu | 0:d8f4c441e032 | 61 | static void pg_line_init(pg_struct * const pg, uint8_t pge_index) PG_NOINLINE; |
| lixianyu | 0:d8f4c441e032 | 62 | |
| lixianyu | 0:d8f4c441e032 | 63 | /*===========================================*/ |
| lixianyu | 0:d8f4c441e032 | 64 | /* line draw algorithm */ |
| lixianyu | 0:d8f4c441e032 | 65 | |
| lixianyu | 0:d8f4c441e032 | 66 | static uint8_t pge_Next(struct pg_edge_struct *pge) |
| lixianyu | 0:d8f4c441e032 | 67 | { |
| lixianyu | 0:d8f4c441e032 | 68 | if ( pge->current_y >= pge->max_y ) |
| lixianyu | 0:d8f4c441e032 | 69 | return 0; |
| lixianyu | 0:d8f4c441e032 | 70 | |
| lixianyu | 0:d8f4c441e032 | 71 | pge->current_x += pge->current_x_offset; |
| lixianyu | 0:d8f4c441e032 | 72 | pge->error += pge->error_offset; |
| lixianyu | 0:d8f4c441e032 | 73 | if ( pge->error > 0 ) |
| lixianyu | 0:d8f4c441e032 | 74 | { |
| lixianyu | 0:d8f4c441e032 | 75 | pge->current_x += pge->x_direction; |
| lixianyu | 0:d8f4c441e032 | 76 | pge->error -= pge->height; |
| lixianyu | 0:d8f4c441e032 | 77 | } |
| lixianyu | 0:d8f4c441e032 | 78 | |
| lixianyu | 0:d8f4c441e032 | 79 | pge->current_y++; |
| lixianyu | 0:d8f4c441e032 | 80 | return 1; |
| lixianyu | 0:d8f4c441e032 | 81 | } |
| lixianyu | 0:d8f4c441e032 | 82 | |
| lixianyu | 0:d8f4c441e032 | 83 | /* assumes y2 > y1 */ |
| lixianyu | 0:d8f4c441e032 | 84 | static void pge_Init(struct pg_edge_struct *pge, pg_word_t x1, pg_word_t y1, pg_word_t x2, pg_word_t y2) |
| lixianyu | 0:d8f4c441e032 | 85 | { |
| lixianyu | 0:d8f4c441e032 | 86 | pg_word_t dx = x2 - x1; |
| lixianyu | 0:d8f4c441e032 | 87 | pg_word_t width; |
| lixianyu | 0:d8f4c441e032 | 88 | |
| lixianyu | 0:d8f4c441e032 | 89 | pge->height = y2 - y1; |
| lixianyu | 0:d8f4c441e032 | 90 | pge->max_y = y2; |
| lixianyu | 0:d8f4c441e032 | 91 | pge->current_y = y1; |
| lixianyu | 0:d8f4c441e032 | 92 | pge->current_x = x1; |
| lixianyu | 0:d8f4c441e032 | 93 | |
| lixianyu | 0:d8f4c441e032 | 94 | if ( dx >= 0 ) |
| lixianyu | 0:d8f4c441e032 | 95 | { |
| lixianyu | 0:d8f4c441e032 | 96 | pge->x_direction = 1; |
| lixianyu | 0:d8f4c441e032 | 97 | width = dx; |
| lixianyu | 0:d8f4c441e032 | 98 | pge->error = 0; |
| lixianyu | 0:d8f4c441e032 | 99 | } |
| lixianyu | 0:d8f4c441e032 | 100 | else |
| lixianyu | 0:d8f4c441e032 | 101 | { |
| lixianyu | 0:d8f4c441e032 | 102 | pge->x_direction = -1; |
| lixianyu | 0:d8f4c441e032 | 103 | width = -dx; |
| lixianyu | 0:d8f4c441e032 | 104 | pge->error = 1 - pge->height; |
| lixianyu | 0:d8f4c441e032 | 105 | } |
| lixianyu | 0:d8f4c441e032 | 106 | |
| lixianyu | 0:d8f4c441e032 | 107 | pge->current_x_offset = dx / pge->height; |
| lixianyu | 0:d8f4c441e032 | 108 | pge->error_offset = width % pge->height; |
| lixianyu | 0:d8f4c441e032 | 109 | } |
| lixianyu | 0:d8f4c441e032 | 110 | |
| lixianyu | 0:d8f4c441e032 | 111 | /*===========================================*/ |
| lixianyu | 0:d8f4c441e032 | 112 | /* convex polygon algorithm */ |
| lixianyu | 0:d8f4c441e032 | 113 | |
| lixianyu | 0:d8f4c441e032 | 114 | static uint8_t pg_inc(pg_struct *pg, uint8_t i) |
| lixianyu | 0:d8f4c441e032 | 115 | { |
| lixianyu | 0:d8f4c441e032 | 116 | i++; |
| lixianyu | 0:d8f4c441e032 | 117 | if ( i >= pg->cnt ) |
| lixianyu | 0:d8f4c441e032 | 118 | i = 0; |
| lixianyu | 0:d8f4c441e032 | 119 | return i; |
| lixianyu | 0:d8f4c441e032 | 120 | } |
| lixianyu | 0:d8f4c441e032 | 121 | |
| lixianyu | 0:d8f4c441e032 | 122 | static uint8_t pg_dec(pg_struct *pg, uint8_t i) |
| lixianyu | 0:d8f4c441e032 | 123 | { |
| lixianyu | 0:d8f4c441e032 | 124 | i--; |
| lixianyu | 0:d8f4c441e032 | 125 | if ( i >= pg->cnt ) |
| lixianyu | 0:d8f4c441e032 | 126 | i = pg->cnt-1; |
| lixianyu | 0:d8f4c441e032 | 127 | return i; |
| lixianyu | 0:d8f4c441e032 | 128 | } |
| lixianyu | 0:d8f4c441e032 | 129 | |
| lixianyu | 0:d8f4c441e032 | 130 | static void pg_expand_min_y(pg_struct *pg, pg_word_t min_y, uint8_t pge_idx) |
| lixianyu | 0:d8f4c441e032 | 131 | { |
| lixianyu | 0:d8f4c441e032 | 132 | uint8_t i = pg->pge[pge_idx].curr_idx; |
| lixianyu | 0:d8f4c441e032 | 133 | for(;;) |
| lixianyu | 0:d8f4c441e032 | 134 | { |
| lixianyu | 0:d8f4c441e032 | 135 | i = pg->pge[pge_idx].next_idx_fn(pg, i); |
| lixianyu | 0:d8f4c441e032 | 136 | if ( pg->list[i].y != min_y ) |
| lixianyu | 0:d8f4c441e032 | 137 | break; |
| lixianyu | 0:d8f4c441e032 | 138 | pg->pge[pge_idx].curr_idx = i; |
| lixianyu | 0:d8f4c441e032 | 139 | } |
| lixianyu | 0:d8f4c441e032 | 140 | } |
| lixianyu | 0:d8f4c441e032 | 141 | |
| lixianyu | 0:d8f4c441e032 | 142 | static uint8_t pg_prepare(pg_struct *pg) |
| lixianyu | 0:d8f4c441e032 | 143 | { |
| lixianyu | 0:d8f4c441e032 | 144 | pg_word_t max_y; |
| lixianyu | 0:d8f4c441e032 | 145 | pg_word_t min_y; |
| lixianyu | 0:d8f4c441e032 | 146 | uint8_t i; |
| lixianyu | 0:d8f4c441e032 | 147 | |
| lixianyu | 0:d8f4c441e032 | 148 | /* setup the next index procedures */ |
| lixianyu | 0:d8f4c441e032 | 149 | pg->pge[PG_RIGHT].next_idx_fn = pg_inc; |
| lixianyu | 0:d8f4c441e032 | 150 | pg->pge[PG_LEFT].next_idx_fn = pg_dec; |
| lixianyu | 0:d8f4c441e032 | 151 | |
| lixianyu | 0:d8f4c441e032 | 152 | /* search for highest and lowest point */ |
| lixianyu | 0:d8f4c441e032 | 153 | max_y = pg->list[0].y; |
| lixianyu | 0:d8f4c441e032 | 154 | min_y = pg->list[0].y; |
| lixianyu | 0:d8f4c441e032 | 155 | pg->pge[PG_LEFT].curr_idx = 0; |
| lixianyu | 0:d8f4c441e032 | 156 | for( i = 1; i < pg->cnt; i++ ) |
| lixianyu | 0:d8f4c441e032 | 157 | { |
| lixianyu | 0:d8f4c441e032 | 158 | if ( max_y < pg->list[i].y ) |
| lixianyu | 0:d8f4c441e032 | 159 | { |
| lixianyu | 0:d8f4c441e032 | 160 | max_y = pg->list[i].y; |
| lixianyu | 0:d8f4c441e032 | 161 | } |
| lixianyu | 0:d8f4c441e032 | 162 | if ( min_y > pg->list[i].y ) |
| lixianyu | 0:d8f4c441e032 | 163 | { |
| lixianyu | 0:d8f4c441e032 | 164 | pg->pge[PG_LEFT].curr_idx = i; |
| lixianyu | 0:d8f4c441e032 | 165 | min_y = pg->list[i].y; |
| lixianyu | 0:d8f4c441e032 | 166 | } |
| lixianyu | 0:d8f4c441e032 | 167 | } |
| lixianyu | 0:d8f4c441e032 | 168 | |
| lixianyu | 0:d8f4c441e032 | 169 | /* calculate total number of scan lines */ |
| lixianyu | 0:d8f4c441e032 | 170 | pg->total_scan_line_cnt = max_y; |
| lixianyu | 0:d8f4c441e032 | 171 | pg->total_scan_line_cnt -= min_y; |
| lixianyu | 0:d8f4c441e032 | 172 | |
| lixianyu | 0:d8f4c441e032 | 173 | /* exit if polygon height is zero */ |
| lixianyu | 0:d8f4c441e032 | 174 | if ( pg->total_scan_line_cnt == 0 ) |
| lixianyu | 0:d8f4c441e032 | 175 | return 0; |
| lixianyu | 0:d8f4c441e032 | 176 | |
| lixianyu | 0:d8f4c441e032 | 177 | /* if the minimum y side is flat, try to find the lowest and highest x points */ |
| lixianyu | 0:d8f4c441e032 | 178 | pg->pge[PG_RIGHT].curr_idx = pg->pge[PG_LEFT].curr_idx; |
| lixianyu | 0:d8f4c441e032 | 179 | pg_expand_min_y(pg, min_y, PG_RIGHT); |
| lixianyu | 0:d8f4c441e032 | 180 | pg_expand_min_y(pg, min_y, PG_LEFT); |
| lixianyu | 0:d8f4c441e032 | 181 | |
| lixianyu | 0:d8f4c441e032 | 182 | /* check if the min side is really flat (depends on the x values) */ |
| lixianyu | 0:d8f4c441e032 | 183 | pg->is_min_y_not_flat = 1; |
| lixianyu | 0:d8f4c441e032 | 184 | if ( pg->list[pg->pge[PG_LEFT].curr_idx].x != pg->list[pg->pge[PG_RIGHT].curr_idx].x ) |
| lixianyu | 0:d8f4c441e032 | 185 | { |
| lixianyu | 0:d8f4c441e032 | 186 | pg->is_min_y_not_flat = 0; |
| lixianyu | 0:d8f4c441e032 | 187 | } |
| lixianyu | 0:d8f4c441e032 | 188 | else |
| lixianyu | 0:d8f4c441e032 | 189 | { |
| lixianyu | 0:d8f4c441e032 | 190 | pg->total_scan_line_cnt--; |
| lixianyu | 0:d8f4c441e032 | 191 | if ( pg->total_scan_line_cnt == 0 ) |
| lixianyu | 0:d8f4c441e032 | 192 | return 0; |
| lixianyu | 0:d8f4c441e032 | 193 | } |
| lixianyu | 0:d8f4c441e032 | 194 | |
| lixianyu | 0:d8f4c441e032 | 195 | return 1; |
| lixianyu | 0:d8f4c441e032 | 196 | } |
| lixianyu | 0:d8f4c441e032 | 197 | |
| lixianyu | 0:d8f4c441e032 | 198 | static void pg_hline(pg_struct *pg, u8g_t *u8g) |
| lixianyu | 0:d8f4c441e032 | 199 | { |
| lixianyu | 0:d8f4c441e032 | 200 | pg_word_t x1, x2, y; |
| lixianyu | 0:d8f4c441e032 | 201 | x1 = pg->pge[PG_LEFT].current_x; |
| lixianyu | 0:d8f4c441e032 | 202 | x2 = pg->pge[PG_RIGHT].current_x; |
| lixianyu | 0:d8f4c441e032 | 203 | y = pg->pge[PG_RIGHT].current_y; |
| lixianyu | 0:d8f4c441e032 | 204 | |
| lixianyu | 0:d8f4c441e032 | 205 | if ( y < 0 ) |
| lixianyu | 0:d8f4c441e032 | 206 | return; |
| lixianyu | 0:d8f4c441e032 | 207 | if ( y >= u8g_GetHeight(u8g) ) |
| lixianyu | 0:d8f4c441e032 | 208 | return; |
| lixianyu | 0:d8f4c441e032 | 209 | if ( x1 < x2 ) |
| lixianyu | 0:d8f4c441e032 | 210 | { |
| lixianyu | 0:d8f4c441e032 | 211 | if ( x2 < 0 ) |
| lixianyu | 0:d8f4c441e032 | 212 | return; |
| lixianyu | 0:d8f4c441e032 | 213 | if ( x1 >= u8g_GetWidth(u8g) ) |
| lixianyu | 0:d8f4c441e032 | 214 | return; |
| lixianyu | 0:d8f4c441e032 | 215 | if ( x1 < 0 ) |
| lixianyu | 0:d8f4c441e032 | 216 | x1 = 0; |
| lixianyu | 0:d8f4c441e032 | 217 | if ( x2 >= u8g_GetWidth(u8g) ) |
| lixianyu | 0:d8f4c441e032 | 218 | x2 = u8g_GetWidth(u8g); |
| lixianyu | 0:d8f4c441e032 | 219 | u8g_DrawHLine(u8g, x1, y, x2 - x1); |
| lixianyu | 0:d8f4c441e032 | 220 | } |
| lixianyu | 0:d8f4c441e032 | 221 | else |
| lixianyu | 0:d8f4c441e032 | 222 | { |
| lixianyu | 0:d8f4c441e032 | 223 | if ( x1 < 0 ) |
| lixianyu | 0:d8f4c441e032 | 224 | return; |
| lixianyu | 0:d8f4c441e032 | 225 | if ( x2 >= u8g_GetWidth(u8g) ) |
| lixianyu | 0:d8f4c441e032 | 226 | return; |
| lixianyu | 0:d8f4c441e032 | 227 | if ( x2 < 0 ) |
| lixianyu | 0:d8f4c441e032 | 228 | x1 = 0; |
| lixianyu | 0:d8f4c441e032 | 229 | if ( x1 >= u8g_GetWidth(u8g) ) |
| lixianyu | 0:d8f4c441e032 | 230 | x1 = u8g_GetWidth(u8g); |
| lixianyu | 0:d8f4c441e032 | 231 | u8g_DrawHLine(u8g, x2, y, x1 - x2); |
| lixianyu | 0:d8f4c441e032 | 232 | } |
| lixianyu | 0:d8f4c441e032 | 233 | } |
| lixianyu | 0:d8f4c441e032 | 234 | |
| lixianyu | 0:d8f4c441e032 | 235 | static void pg_line_init(pg_struct * pg, uint8_t pge_index) |
| lixianyu | 0:d8f4c441e032 | 236 | { |
| lixianyu | 0:d8f4c441e032 | 237 | struct pg_edge_struct *pge = pg->pge+pge_index; |
| lixianyu | 0:d8f4c441e032 | 238 | uint8_t idx; |
| lixianyu | 0:d8f4c441e032 | 239 | pg_word_t x1; |
| lixianyu | 0:d8f4c441e032 | 240 | pg_word_t y1; |
| lixianyu | 0:d8f4c441e032 | 241 | pg_word_t x2; |
| lixianyu | 0:d8f4c441e032 | 242 | pg_word_t y2; |
| lixianyu | 0:d8f4c441e032 | 243 | |
| lixianyu | 0:d8f4c441e032 | 244 | idx = pge->curr_idx; |
| lixianyu | 0:d8f4c441e032 | 245 | y1 = pg->list[idx].y; |
| lixianyu | 0:d8f4c441e032 | 246 | x1 = pg->list[idx].x; |
| lixianyu | 0:d8f4c441e032 | 247 | idx = pge->next_idx_fn(pg, idx); |
| lixianyu | 0:d8f4c441e032 | 248 | y2 = pg->list[idx].y; |
| lixianyu | 0:d8f4c441e032 | 249 | x2 = pg->list[idx].x; |
| lixianyu | 0:d8f4c441e032 | 250 | pge->curr_idx = idx; |
| lixianyu | 0:d8f4c441e032 | 251 | |
| lixianyu | 0:d8f4c441e032 | 252 | pge_Init(pge, x1, y1, x2, y2); |
| lixianyu | 0:d8f4c441e032 | 253 | } |
| lixianyu | 0:d8f4c441e032 | 254 | |
| lixianyu | 0:d8f4c441e032 | 255 | static void pg_exec(pg_struct *pg, u8g_t *u8g) |
| lixianyu | 0:d8f4c441e032 | 256 | { |
| lixianyu | 0:d8f4c441e032 | 257 | pg_word_t i = pg->total_scan_line_cnt; |
| lixianyu | 0:d8f4c441e032 | 258 | |
| lixianyu | 0:d8f4c441e032 | 259 | /* first line is skipped if the min y line is not flat */ |
| lixianyu | 0:d8f4c441e032 | 260 | pg_line_init(pg, PG_LEFT); |
| lixianyu | 0:d8f4c441e032 | 261 | pg_line_init(pg, PG_RIGHT); |
| lixianyu | 0:d8f4c441e032 | 262 | |
| lixianyu | 0:d8f4c441e032 | 263 | if ( pg->is_min_y_not_flat != 0 ) |
| lixianyu | 0:d8f4c441e032 | 264 | { |
| lixianyu | 0:d8f4c441e032 | 265 | pge_Next(&(pg->pge[PG_LEFT])); |
| lixianyu | 0:d8f4c441e032 | 266 | pge_Next(&(pg->pge[PG_RIGHT])); |
| lixianyu | 0:d8f4c441e032 | 267 | } |
| lixianyu | 0:d8f4c441e032 | 268 | |
| lixianyu | 0:d8f4c441e032 | 269 | do |
| lixianyu | 0:d8f4c441e032 | 270 | { |
| lixianyu | 0:d8f4c441e032 | 271 | pg_hline(pg, u8g); |
| lixianyu | 0:d8f4c441e032 | 272 | while ( pge_Next(&(pg->pge[PG_LEFT])) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 273 | { |
| lixianyu | 0:d8f4c441e032 | 274 | pg_line_init(pg, PG_LEFT); |
| lixianyu | 0:d8f4c441e032 | 275 | } |
| lixianyu | 0:d8f4c441e032 | 276 | while ( pge_Next(&(pg->pge[PG_RIGHT])) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 277 | { |
| lixianyu | 0:d8f4c441e032 | 278 | pg_line_init(pg, PG_RIGHT); |
| lixianyu | 0:d8f4c441e032 | 279 | } |
| lixianyu | 0:d8f4c441e032 | 280 | i--; |
| lixianyu | 0:d8f4c441e032 | 281 | } while( i > 0 ); |
| lixianyu | 0:d8f4c441e032 | 282 | } |
| lixianyu | 0:d8f4c441e032 | 283 | |
| lixianyu | 0:d8f4c441e032 | 284 | /*===========================================*/ |
| lixianyu | 0:d8f4c441e032 | 285 | /* API procedures */ |
| lixianyu | 0:d8f4c441e032 | 286 | |
| lixianyu | 0:d8f4c441e032 | 287 | void pg_ClearPolygonXY(pg_struct *pg) |
| lixianyu | 0:d8f4c441e032 | 288 | { |
| lixianyu | 0:d8f4c441e032 | 289 | pg->cnt = 0; |
| lixianyu | 0:d8f4c441e032 | 290 | } |
| lixianyu | 0:d8f4c441e032 | 291 | |
| lixianyu | 0:d8f4c441e032 | 292 | void pg_AddPolygonXY(pg_struct *pg, u8g_t *u8g, int16_t x, int16_t y) |
| lixianyu | 0:d8f4c441e032 | 293 | { |
| lixianyu | 0:d8f4c441e032 | 294 | if ( pg->cnt < PG_MAX_POINTS ) |
| lixianyu | 0:d8f4c441e032 | 295 | { |
| lixianyu | 0:d8f4c441e032 | 296 | pg->list[pg->cnt].x = x; |
| lixianyu | 0:d8f4c441e032 | 297 | pg->list[pg->cnt].y = y; |
| lixianyu | 0:d8f4c441e032 | 298 | pg->cnt++; |
| lixianyu | 0:d8f4c441e032 | 299 | } |
| lixianyu | 0:d8f4c441e032 | 300 | } |
| lixianyu | 0:d8f4c441e032 | 301 | |
| lixianyu | 0:d8f4c441e032 | 302 | void pg_DrawPolygon(pg_struct *pg, u8g_t *u8g) |
| lixianyu | 0:d8f4c441e032 | 303 | { |
| lixianyu | 0:d8f4c441e032 | 304 | if ( pg_prepare(pg) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 305 | return; |
| lixianyu | 0:d8f4c441e032 | 306 | pg_exec(pg, u8g); |
| lixianyu | 0:d8f4c441e032 | 307 | } |
| lixianyu | 0:d8f4c441e032 | 308 | |
| lixianyu | 0:d8f4c441e032 | 309 | pg_struct u8g_pg; |
| lixianyu | 0:d8f4c441e032 | 310 | |
| lixianyu | 0:d8f4c441e032 | 311 | void u8g_ClearPolygonXY(void) |
| lixianyu | 0:d8f4c441e032 | 312 | { |
| lixianyu | 0:d8f4c441e032 | 313 | pg_ClearPolygonXY(&u8g_pg); |
| lixianyu | 0:d8f4c441e032 | 314 | } |
| lixianyu | 0:d8f4c441e032 | 315 | |
| lixianyu | 0:d8f4c441e032 | 316 | void u8g_AddPolygonXY(u8g_t *u8g, int16_t x, int16_t y) |
| lixianyu | 0:d8f4c441e032 | 317 | { |
| lixianyu | 0:d8f4c441e032 | 318 | pg_AddPolygonXY(&u8g_pg, u8g, x, y); |
| lixianyu | 0:d8f4c441e032 | 319 | } |
| lixianyu | 0:d8f4c441e032 | 320 | |
| lixianyu | 0:d8f4c441e032 | 321 | void u8g_DrawPolygon(u8g_t *u8g) |
| lixianyu | 0:d8f4c441e032 | 322 | { |
| lixianyu | 0:d8f4c441e032 | 323 | pg_DrawPolygon(&u8g_pg, u8g); |
| lixianyu | 0:d8f4c441e032 | 324 | } |
| lixianyu | 0:d8f4c441e032 | 325 | |
| lixianyu | 0:d8f4c441e032 | 326 | void u8g_DrawTriangle(u8g_t *u8g, int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2) |
| lixianyu | 0:d8f4c441e032 | 327 | { |
| lixianyu | 0:d8f4c441e032 | 328 | u8g_ClearPolygonXY(); |
| lixianyu | 0:d8f4c441e032 | 329 | u8g_AddPolygonXY(u8g, x0, y0); |
| lixianyu | 0:d8f4c441e032 | 330 | u8g_AddPolygonXY(u8g, x1, y1); |
| lixianyu | 0:d8f4c441e032 | 331 | u8g_AddPolygonXY(u8g, x2, y2); |
| lixianyu | 0:d8f4c441e032 | 332 | u8g_DrawPolygon(u8g); |
| lixianyu | 0:d8f4c441e032 | 333 | } |
| lixianyu | 0:d8f4c441e032 | 334 | |
| lixianyu | 0:d8f4c441e032 | 335 |