Nuvoton
/
NuMaker-mbed-emWin-example
NuMaker emWin HMI
tslib/fbutils.c@1:c0f972361605, 2019-02-27 (annotated)
- Committer:
- csyang2
- Date:
- Wed Feb 27 14:34:09 2019 +0800
- Revision:
- 1:c0f972361605
- Child:
- 6:d15151941247
Add emWin related materials
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
csyang2 |
1:c0f972361605 | 1 | /* |
csyang2 |
1:c0f972361605 | 2 | * fbutils.c |
csyang2 |
1:c0f972361605 | 3 | * |
csyang2 |
1:c0f972361605 | 4 | * Utility routines for framebuffer interaction |
csyang2 |
1:c0f972361605 | 5 | * |
csyang2 |
1:c0f972361605 | 6 | * Copyright 2002 Russell King and Doug Lowder |
csyang2 |
1:c0f972361605 | 7 | * |
csyang2 |
1:c0f972361605 | 8 | * This file is placed under the GPL. Please see the |
csyang2 |
1:c0f972361605 | 9 | * file COPYING for details. |
csyang2 |
1:c0f972361605 | 10 | * |
csyang2 |
1:c0f972361605 | 11 | */ |
csyang2 |
1:c0f972361605 | 12 | |
csyang2 |
1:c0f972361605 | 13 | //#include "config.h" |
csyang2 |
1:c0f972361605 | 14 | |
csyang2 |
1:c0f972361605 | 15 | #include <stdio.h> |
csyang2 |
1:c0f972361605 | 16 | #include <stdlib.h> |
csyang2 |
1:c0f972361605 | 17 | #include <string.h> |
csyang2 |
1:c0f972361605 | 18 | //#include <unistd.h> |
csyang2 |
1:c0f972361605 | 19 | //#include <sys/fcntl.h> |
csyang2 |
1:c0f972361605 | 20 | //#include <sys/ioctl.h> |
csyang2 |
1:c0f972361605 | 21 | //#include <sys/mman.h> |
csyang2 |
1:c0f972361605 | 22 | //#include <sys/time.h> |
csyang2 |
1:c0f972361605 | 23 | #include "fbutils.h" |
csyang2 |
1:c0f972361605 | 24 | //#include "wbtypes.h" |
csyang2 |
1:c0f972361605 | 25 | //#include "LCDconf.h" |
csyang2 |
1:c0f972361605 | 26 | #include "M48XTouchPanel.h" |
csyang2 |
1:c0f972361605 | 27 | #include "GUI.h" |
csyang2 |
1:c0f972361605 | 28 | #if 0 |
csyang2 |
1:c0f972361605 | 29 | union multiptr |
csyang2 |
1:c0f972361605 | 30 | { |
csyang2 |
1:c0f972361605 | 31 | unsigned char *p8; |
csyang2 |
1:c0f972361605 | 32 | unsigned short *p16; |
csyang2 |
1:c0f972361605 | 33 | unsigned long *p32; |
csyang2 |
1:c0f972361605 | 34 | }; |
csyang2 |
1:c0f972361605 | 35 | #endif |
csyang2 |
1:c0f972361605 | 36 | //static int con_fd, fb_fd, last_vt = -1; |
csyang2 |
1:c0f972361605 | 37 | //static unsigned char *line_addr; |
csyang2 |
1:c0f972361605 | 38 | //static int fb_fd=0; |
csyang2 |
1:c0f972361605 | 39 | static int bytes_per_pixel=2; |
csyang2 |
1:c0f972361605 | 40 | static unsigned colormap [13]; |
csyang2 |
1:c0f972361605 | 41 | static unsigned colormap2[13]; |
csyang2 |
1:c0f972361605 | 42 | unsigned int xres=__DEMO_TS_WIDTH__, yres=__DEMO_TS_HEIGHT__; |
csyang2 |
1:c0f972361605 | 43 | |
csyang2 |
1:c0f972361605 | 44 | int red_length = 5; |
csyang2 |
1:c0f972361605 | 45 | int green_length = 6; |
csyang2 |
1:c0f972361605 | 46 | int blue_length = 5; |
csyang2 |
1:c0f972361605 | 47 | |
csyang2 |
1:c0f972361605 | 48 | int red_offset = 11; |
csyang2 |
1:c0f972361605 | 49 | int green_offset = 5; |
csyang2 |
1:c0f972361605 | 50 | int blue_offset = 0; |
csyang2 |
1:c0f972361605 | 51 | |
csyang2 |
1:c0f972361605 | 52 | //extern void * g_VAFrameBuf; |
csyang2 |
1:c0f972361605 | 53 | |
csyang2 |
1:c0f972361605 | 54 | void line(int x1, int y1, int x2, int y2, unsigned colidx); |
csyang2 |
1:c0f972361605 | 55 | |
csyang2 |
1:c0f972361605 | 56 | void put_cross(int x, int y, unsigned colidx) |
csyang2 |
1:c0f972361605 | 57 | { |
csyang2 |
1:c0f972361605 | 58 | line (x - 10, y, x - 2, y, colidx); |
csyang2 |
1:c0f972361605 | 59 | line (x + 2, y, x + 10, y, colidx); |
csyang2 |
1:c0f972361605 | 60 | line (x, y - 10, x, y - 2, colidx); |
csyang2 |
1:c0f972361605 | 61 | line (x, y + 2, x, y + 10, colidx); |
csyang2 |
1:c0f972361605 | 62 | |
csyang2 |
1:c0f972361605 | 63 | #if 1 |
csyang2 |
1:c0f972361605 | 64 | line (x - 6, y - 9, x - 9, y - 9, colidx + 1); |
csyang2 |
1:c0f972361605 | 65 | line (x - 9, y - 8, x - 9, y - 6, colidx + 1); |
csyang2 |
1:c0f972361605 | 66 | line (x - 9, y + 6, x - 9, y + 9, colidx + 1); |
csyang2 |
1:c0f972361605 | 67 | line (x - 8, y + 9, x - 6, y + 9, colidx + 1); |
csyang2 |
1:c0f972361605 | 68 | line (x + 6, y + 9, x + 9, y + 9, colidx + 1); |
csyang2 |
1:c0f972361605 | 69 | line (x + 9, y + 8, x + 9, y + 6, colidx + 1); |
csyang2 |
1:c0f972361605 | 70 | line (x + 9, y - 6, x + 9, y - 9, colidx + 1); |
csyang2 |
1:c0f972361605 | 71 | line (x + 8, y - 9, x + 6, y - 9, colidx + 1); |
csyang2 |
1:c0f972361605 | 72 | #else |
csyang2 |
1:c0f972361605 | 73 | line (x - 7, y - 7, x - 4, y - 4, colidx + 1); |
csyang2 |
1:c0f972361605 | 74 | line (x - 7, y + 7, x - 4, y + 4, colidx + 1); |
csyang2 |
1:c0f972361605 | 75 | line (x + 4, y - 4, x + 7, y - 7, colidx + 1); |
csyang2 |
1:c0f972361605 | 76 | line (x + 4, y + 4, x + 7, y + 7, colidx + 1); |
csyang2 |
1:c0f972361605 | 77 | #endif |
csyang2 |
1:c0f972361605 | 78 | } |
csyang2 |
1:c0f972361605 | 79 | #if 0 |
csyang2 |
1:c0f972361605 | 80 | void put_char(int x, int y, int c, int colidx) |
csyang2 |
1:c0f972361605 | 81 | { |
csyang2 |
1:c0f972361605 | 82 | int i,j,bits; |
csyang2 |
1:c0f972361605 | 83 | |
csyang2 |
1:c0f972361605 | 84 | for (i = 0; i < font_vga_8x8.height; i++) |
csyang2 |
1:c0f972361605 | 85 | { |
csyang2 |
1:c0f972361605 | 86 | bits = font_vga_8x8.data [font_vga_8x8.height * c + i]; |
csyang2 |
1:c0f972361605 | 87 | for (j = 0; j < font_vga_8x8.width; j++, bits <<= 1) |
csyang2 |
1:c0f972361605 | 88 | if (bits & 0x80) |
csyang2 |
1:c0f972361605 | 89 | pixel (x + j, y + i, colidx); |
csyang2 |
1:c0f972361605 | 90 | } |
csyang2 |
1:c0f972361605 | 91 | } |
csyang2 |
1:c0f972361605 | 92 | |
csyang2 |
1:c0f972361605 | 93 | void put_string(int x, int y, char *s, unsigned colidx) |
csyang2 |
1:c0f972361605 | 94 | { |
csyang2 |
1:c0f972361605 | 95 | int i; |
csyang2 |
1:c0f972361605 | 96 | for (i = 0; *s; i++, x += font_vga_8x8.width, s++) |
csyang2 |
1:c0f972361605 | 97 | put_char (x, y, *s, colidx); |
csyang2 |
1:c0f972361605 | 98 | } |
csyang2 |
1:c0f972361605 | 99 | |
csyang2 |
1:c0f972361605 | 100 | void put_string_center(int x, int y, char *s, unsigned colidx) |
csyang2 |
1:c0f972361605 | 101 | { |
csyang2 |
1:c0f972361605 | 102 | size_t sl = strlen (s); |
csyang2 |
1:c0f972361605 | 103 | put_string (x - (sl / 2) * font_vga_8x8.width, |
csyang2 |
1:c0f972361605 | 104 | y - font_vga_8x8.height / 2, s, colidx); |
csyang2 |
1:c0f972361605 | 105 | } |
csyang2 |
1:c0f972361605 | 106 | #endif |
csyang2 |
1:c0f972361605 | 107 | void setcolor(unsigned colidx, unsigned value) |
csyang2 |
1:c0f972361605 | 108 | { |
csyang2 |
1:c0f972361605 | 109 | unsigned res; |
csyang2 |
1:c0f972361605 | 110 | //unsigned short red, green, blue; |
csyang2 |
1:c0f972361605 | 111 | // struct fb_cmap cmap; |
csyang2 |
1:c0f972361605 | 112 | |
csyang2 |
1:c0f972361605 | 113 | #ifdef DEBUG |
csyang2 |
1:c0f972361605 | 114 | if (colidx > 255) |
csyang2 |
1:c0f972361605 | 115 | { |
csyang2 |
1:c0f972361605 | 116 | fprintf (stderr, "WARNING: color index = %u, must be <256\n", |
csyang2 |
1:c0f972361605 | 117 | colidx); |
csyang2 |
1:c0f972361605 | 118 | return; |
csyang2 |
1:c0f972361605 | 119 | } |
csyang2 |
1:c0f972361605 | 120 | #endif |
csyang2 |
1:c0f972361605 | 121 | |
csyang2 |
1:c0f972361605 | 122 | switch (bytes_per_pixel) |
csyang2 |
1:c0f972361605 | 123 | { |
csyang2 |
1:c0f972361605 | 124 | default: |
csyang2 |
1:c0f972361605 | 125 | case 1: |
csyang2 |
1:c0f972361605 | 126 | #if 0 |
csyang2 |
1:c0f972361605 | 127 | res = colidx; |
csyang2 |
1:c0f972361605 | 128 | red = (value >> 8) & 0xff00; |
csyang2 |
1:c0f972361605 | 129 | green = value & 0xff00; |
csyang2 |
1:c0f972361605 | 130 | blue = (value << 8) & 0xff00; |
csyang2 |
1:c0f972361605 | 131 | cmap.start = colidx; |
csyang2 |
1:c0f972361605 | 132 | cmap.len = 1; |
csyang2 |
1:c0f972361605 | 133 | cmap.red = &red; |
csyang2 |
1:c0f972361605 | 134 | cmap.green = &green; |
csyang2 |
1:c0f972361605 | 135 | cmap.blue = &blue; |
csyang2 |
1:c0f972361605 | 136 | cmap.transp = NULL; |
csyang2 |
1:c0f972361605 | 137 | #endif |
csyang2 |
1:c0f972361605 | 138 | break; |
csyang2 |
1:c0f972361605 | 139 | case 2: |
csyang2 |
1:c0f972361605 | 140 | #if 0 |
csyang2 |
1:c0f972361605 | 141 | red = (value >> 16) & 0xff; |
csyang2 |
1:c0f972361605 | 142 | green = (value >> 8) & 0xff; |
csyang2 |
1:c0f972361605 | 143 | blue = value & 0xff; |
csyang2 |
1:c0f972361605 | 144 | res = ((red >> (8 - red_length)) << red_offset) | |
csyang2 |
1:c0f972361605 | 145 | ((green >> (8 - green_length)) << green_offset) | |
csyang2 |
1:c0f972361605 | 146 | ((blue >> (8 - blue_length)) << blue_offset); |
csyang2 |
1:c0f972361605 | 147 | #endif |
csyang2 |
1:c0f972361605 | 148 | case 4: |
csyang2 |
1:c0f972361605 | 149 | res = value; |
csyang2 |
1:c0f972361605 | 150 | } |
csyang2 |
1:c0f972361605 | 151 | colormap [colidx] = value; |
csyang2 |
1:c0f972361605 | 152 | GUI_SetColor(value); |
csyang2 |
1:c0f972361605 | 153 | GUI_DrawPixel(0, 0); |
csyang2 |
1:c0f972361605 | 154 | res = GUI_GetPixelIndex(0, 0); |
csyang2 |
1:c0f972361605 | 155 | colormap2[colidx] = res; |
csyang2 |
1:c0f972361605 | 156 | GUI_SetColor(0x00); |
csyang2 |
1:c0f972361605 | 157 | GUI_DrawPixel(0, 0); |
csyang2 |
1:c0f972361605 | 158 | } |
csyang2 |
1:c0f972361605 | 159 | #if 0 |
csyang2 |
1:c0f972361605 | 160 | static void __setpixel (union multiptr loc, unsigned xormode, unsigned color) |
csyang2 |
1:c0f972361605 | 161 | { |
csyang2 |
1:c0f972361605 | 162 | switch(bytes_per_pixel) |
csyang2 |
1:c0f972361605 | 163 | { |
csyang2 |
1:c0f972361605 | 164 | case 1: |
csyang2 |
1:c0f972361605 | 165 | default: |
csyang2 |
1:c0f972361605 | 166 | if (xormode) |
csyang2 |
1:c0f972361605 | 167 | *loc.p8 ^= color; |
csyang2 |
1:c0f972361605 | 168 | else |
csyang2 |
1:c0f972361605 | 169 | *loc.p8 = color; |
csyang2 |
1:c0f972361605 | 170 | break; |
csyang2 |
1:c0f972361605 | 171 | case 2: |
csyang2 |
1:c0f972361605 | 172 | if (xormode) |
csyang2 |
1:c0f972361605 | 173 | *loc.p16 ^= color; |
csyang2 |
1:c0f972361605 | 174 | else |
csyang2 |
1:c0f972361605 | 175 | *loc.p16 = color; |
csyang2 |
1:c0f972361605 | 176 | break; |
csyang2 |
1:c0f972361605 | 177 | case 4: |
csyang2 |
1:c0f972361605 | 178 | if (xormode) |
csyang2 |
1:c0f972361605 | 179 | *loc.p32 ^= color; |
csyang2 |
1:c0f972361605 | 180 | else |
csyang2 |
1:c0f972361605 | 181 | *loc.p32 = color; |
csyang2 |
1:c0f972361605 | 182 | break; |
csyang2 |
1:c0f972361605 | 183 | } |
csyang2 |
1:c0f972361605 | 184 | } |
csyang2 |
1:c0f972361605 | 185 | #endif |
csyang2 |
1:c0f972361605 | 186 | void pixel (int x, int y, unsigned colidx) |
csyang2 |
1:c0f972361605 | 187 | { |
csyang2 |
1:c0f972361605 | 188 | unsigned xormode; |
csyang2 |
1:c0f972361605 | 189 | unsigned color, color2; |
csyang2 |
1:c0f972361605 | 190 | //union multiptr loc; |
csyang2 |
1:c0f972361605 | 191 | |
csyang2 |
1:c0f972361605 | 192 | if ((x < 0) || (x >= __DEMO_TS_WIDTH__) || |
csyang2 |
1:c0f972361605 | 193 | (y < 0) || (y >= __DEMO_TS_HEIGHT__)) |
csyang2 |
1:c0f972361605 | 194 | return; |
csyang2 |
1:c0f972361605 | 195 | |
csyang2 |
1:c0f972361605 | 196 | xormode = colidx & XORMODE; |
csyang2 |
1:c0f972361605 | 197 | colidx &= ~XORMODE; |
csyang2 |
1:c0f972361605 | 198 | |
csyang2 |
1:c0f972361605 | 199 | #ifdef DEBUG |
csyang2 |
1:c0f972361605 | 200 | if (colidx > 255) |
csyang2 |
1:c0f972361605 | 201 | { |
csyang2 |
1:c0f972361605 | 202 | fprintf (stderr, "WARNING: color value = %u, must be <256\n", |
csyang2 |
1:c0f972361605 | 203 | colidx); |
csyang2 |
1:c0f972361605 | 204 | return; |
csyang2 |
1:c0f972361605 | 205 | } |
csyang2 |
1:c0f972361605 | 206 | #endif |
csyang2 |
1:c0f972361605 | 207 | |
csyang2 |
1:c0f972361605 | 208 | // loc.p8 = line_addr [y] + x * bytes_per_pixel; |
csyang2 |
1:c0f972361605 | 209 | // line_addr = (unsigned char *)g_VAFrameBuf+ y*(LCD_XSIZE*bytes_per_pixel); |
csyang2 |
1:c0f972361605 | 210 | color = GUI_GetPixelIndex(x, y); |
csyang2 |
1:c0f972361605 | 211 | if ( color == colormap2[0] ) |
csyang2 |
1:c0f972361605 | 212 | color = colormap[0]; |
csyang2 |
1:c0f972361605 | 213 | else if ( color == colormap2[1] ) |
csyang2 |
1:c0f972361605 | 214 | color = colormap[1]; |
csyang2 |
1:c0f972361605 | 215 | else if ( color == colormap2[2] ) |
csyang2 |
1:c0f972361605 | 216 | color = colormap[2]; |
csyang2 |
1:c0f972361605 | 217 | else if ( color == colormap2[3] ) |
csyang2 |
1:c0f972361605 | 218 | color = colormap[3]; |
csyang2 |
1:c0f972361605 | 219 | else if ( color == colormap2[4] ) |
csyang2 |
1:c0f972361605 | 220 | color = colormap[4]; |
csyang2 |
1:c0f972361605 | 221 | else if ( color == colormap2[5] ) |
csyang2 |
1:c0f972361605 | 222 | color = colormap[5]; |
csyang2 |
1:c0f972361605 | 223 | else if ( color == colormap2[6] ) |
csyang2 |
1:c0f972361605 | 224 | color = colormap[6]; |
csyang2 |
1:c0f972361605 | 225 | else if ( color == colormap2[7] ) |
csyang2 |
1:c0f972361605 | 226 | color = colormap[7]; |
csyang2 |
1:c0f972361605 | 227 | else if ( color == colormap2[8] ) |
csyang2 |
1:c0f972361605 | 228 | color = colormap[8]; |
csyang2 |
1:c0f972361605 | 229 | else if ( color == colormap2[9] ) |
csyang2 |
1:c0f972361605 | 230 | color = colormap[9]; |
csyang2 |
1:c0f972361605 | 231 | else if ( color == colormap2[10] ) |
csyang2 |
1:c0f972361605 | 232 | color = colormap[10]; |
csyang2 |
1:c0f972361605 | 233 | else if ( color == colormap2[11] ) |
csyang2 |
1:c0f972361605 | 234 | color = colormap[11]; |
csyang2 |
1:c0f972361605 | 235 | else if ( color == colormap2[12] ) |
csyang2 |
1:c0f972361605 | 236 | color = colormap[12]; |
csyang2 |
1:c0f972361605 | 237 | color2 = colormap [colidx]; |
csyang2 |
1:c0f972361605 | 238 | if (xormode) |
csyang2 |
1:c0f972361605 | 239 | color ^= color2; |
csyang2 |
1:c0f972361605 | 240 | else |
csyang2 |
1:c0f972361605 | 241 | color = color2; |
csyang2 |
1:c0f972361605 | 242 | GUI_SetColor(color); |
csyang2 |
1:c0f972361605 | 243 | GUI_DrawPixel(x, y); |
csyang2 |
1:c0f972361605 | 244 | |
csyang2 |
1:c0f972361605 | 245 | |
csyang2 |
1:c0f972361605 | 246 | //loc.p8 = line_addr + x*bytes_per_pixel; |
csyang2 |
1:c0f972361605 | 247 | //__setpixel(loc, xormode, colormap [colidx]); |
csyang2 |
1:c0f972361605 | 248 | } |
csyang2 |
1:c0f972361605 | 249 | |
csyang2 |
1:c0f972361605 | 250 | void line(int x1, int y1, int x2, int y2, unsigned colidx) |
csyang2 |
1:c0f972361605 | 251 | { |
csyang2 |
1:c0f972361605 | 252 | int tmp; |
csyang2 |
1:c0f972361605 | 253 | int dx = x2 - x1; |
csyang2 |
1:c0f972361605 | 254 | int dy = y2 - y1; |
csyang2 |
1:c0f972361605 | 255 | |
csyang2 |
1:c0f972361605 | 256 | if (abs (dx) < abs (dy)) |
csyang2 |
1:c0f972361605 | 257 | { |
csyang2 |
1:c0f972361605 | 258 | if (y1 > y2) |
csyang2 |
1:c0f972361605 | 259 | { |
csyang2 |
1:c0f972361605 | 260 | tmp = x1; |
csyang2 |
1:c0f972361605 | 261 | x1 = x2; |
csyang2 |
1:c0f972361605 | 262 | x2 = tmp; |
csyang2 |
1:c0f972361605 | 263 | tmp = y1; |
csyang2 |
1:c0f972361605 | 264 | y1 = y2; |
csyang2 |
1:c0f972361605 | 265 | y2 = tmp; |
csyang2 |
1:c0f972361605 | 266 | dx = -dx; |
csyang2 |
1:c0f972361605 | 267 | dy = -dy; |
csyang2 |
1:c0f972361605 | 268 | } |
csyang2 |
1:c0f972361605 | 269 | x1 <<= 16; |
csyang2 |
1:c0f972361605 | 270 | /* dy is apriori >0 */ |
csyang2 |
1:c0f972361605 | 271 | dx = (dx << 16) / dy; |
csyang2 |
1:c0f972361605 | 272 | while (y1 <= y2) |
csyang2 |
1:c0f972361605 | 273 | { |
csyang2 |
1:c0f972361605 | 274 | pixel (x1 >> 16, y1, colidx); |
csyang2 |
1:c0f972361605 | 275 | x1 += dx; |
csyang2 |
1:c0f972361605 | 276 | y1++; |
csyang2 |
1:c0f972361605 | 277 | } |
csyang2 |
1:c0f972361605 | 278 | } |
csyang2 |
1:c0f972361605 | 279 | else |
csyang2 |
1:c0f972361605 | 280 | { |
csyang2 |
1:c0f972361605 | 281 | if (x1 > x2) |
csyang2 |
1:c0f972361605 | 282 | { |
csyang2 |
1:c0f972361605 | 283 | tmp = x1; |
csyang2 |
1:c0f972361605 | 284 | x1 = x2; |
csyang2 |
1:c0f972361605 | 285 | x2 = tmp; |
csyang2 |
1:c0f972361605 | 286 | tmp = y1; |
csyang2 |
1:c0f972361605 | 287 | y1 = y2; |
csyang2 |
1:c0f972361605 | 288 | y2 = tmp; |
csyang2 |
1:c0f972361605 | 289 | dx = -dx; |
csyang2 |
1:c0f972361605 | 290 | dy = -dy; |
csyang2 |
1:c0f972361605 | 291 | } |
csyang2 |
1:c0f972361605 | 292 | y1 <<= 16; |
csyang2 |
1:c0f972361605 | 293 | dy = dx ? (dy << 16) / dx : 0; |
csyang2 |
1:c0f972361605 | 294 | while (x1 <= x2) |
csyang2 |
1:c0f972361605 | 295 | { |
csyang2 |
1:c0f972361605 | 296 | pixel (x1, y1 >> 16, colidx); |
csyang2 |
1:c0f972361605 | 297 | y1 += dy; |
csyang2 |
1:c0f972361605 | 298 | x1++; |
csyang2 |
1:c0f972361605 | 299 | } |
csyang2 |
1:c0f972361605 | 300 | } |
csyang2 |
1:c0f972361605 | 301 | } |
csyang2 |
1:c0f972361605 | 302 | #if 1 |
csyang2 |
1:c0f972361605 | 303 | void rect (int x1, int y1, int x2, int y2, unsigned colidx) |
csyang2 |
1:c0f972361605 | 304 | { |
csyang2 |
1:c0f972361605 | 305 | line (x1, y1, x2, y1, colidx); |
csyang2 |
1:c0f972361605 | 306 | line (x2, y1, x2, y2, colidx); |
csyang2 |
1:c0f972361605 | 307 | line (x2, y2, x1, y2, colidx); |
csyang2 |
1:c0f972361605 | 308 | line (x1, y2, x1, y1, colidx); |
csyang2 |
1:c0f972361605 | 309 | } |
csyang2 |
1:c0f972361605 | 310 | |
csyang2 |
1:c0f972361605 | 311 | void fillrect (int x1, int y1, int x2, int y2, unsigned colidx) |
csyang2 |
1:c0f972361605 | 312 | { |
csyang2 |
1:c0f972361605 | 313 | int tmp; |
csyang2 |
1:c0f972361605 | 314 | unsigned xormode; |
csyang2 |
1:c0f972361605 | 315 | unsigned color, color2; |
csyang2 |
1:c0f972361605 | 316 | //union multiptr loc; |
csyang2 |
1:c0f972361605 | 317 | |
csyang2 |
1:c0f972361605 | 318 | /* Clipping and sanity checking */ |
csyang2 |
1:c0f972361605 | 319 | if (x1 > x2) |
csyang2 |
1:c0f972361605 | 320 | { |
csyang2 |
1:c0f972361605 | 321 | tmp = x1; |
csyang2 |
1:c0f972361605 | 322 | x1 = x2; |
csyang2 |
1:c0f972361605 | 323 | x2 = tmp; |
csyang2 |
1:c0f972361605 | 324 | } |
csyang2 |
1:c0f972361605 | 325 | if (y1 > y2) |
csyang2 |
1:c0f972361605 | 326 | { |
csyang2 |
1:c0f972361605 | 327 | tmp = y1; |
csyang2 |
1:c0f972361605 | 328 | y1 = y2; |
csyang2 |
1:c0f972361605 | 329 | y2 = tmp; |
csyang2 |
1:c0f972361605 | 330 | } |
csyang2 |
1:c0f972361605 | 331 | if (x1 < 0) x1 = 0; |
csyang2 |
1:c0f972361605 | 332 | if (x1 >= xres) x1 = xres - 1; |
csyang2 |
1:c0f972361605 | 333 | if (x2 < 0) x2 = 0; |
csyang2 |
1:c0f972361605 | 334 | if (x2 >= xres) x2 = xres - 1; |
csyang2 |
1:c0f972361605 | 335 | if (y1 < 0) y1 = 0; |
csyang2 |
1:c0f972361605 | 336 | if (y1 >= yres) y1 = yres - 1; |
csyang2 |
1:c0f972361605 | 337 | if (y2 < 0) y2 = 0; |
csyang2 |
1:c0f972361605 | 338 | if (y2 >= yres) y2 = yres - 1; |
csyang2 |
1:c0f972361605 | 339 | |
csyang2 |
1:c0f972361605 | 340 | if ((x1 > x2) || (y1 > y2)) |
csyang2 |
1:c0f972361605 | 341 | return; |
csyang2 |
1:c0f972361605 | 342 | |
csyang2 |
1:c0f972361605 | 343 | xormode = colidx & XORMODE; |
csyang2 |
1:c0f972361605 | 344 | colidx &= ~XORMODE; |
csyang2 |
1:c0f972361605 | 345 | |
csyang2 |
1:c0f972361605 | 346 | #ifdef DEBUG |
csyang2 |
1:c0f972361605 | 347 | if (colidx > 255) |
csyang2 |
1:c0f972361605 | 348 | { |
csyang2 |
1:c0f972361605 | 349 | fprintf (stderr, "WARNING: color value = %u, must be <256\n", |
csyang2 |
1:c0f972361605 | 350 | colidx); |
csyang2 |
1:c0f972361605 | 351 | return; |
csyang2 |
1:c0f972361605 | 352 | } |
csyang2 |
1:c0f972361605 | 353 | #endif |
csyang2 |
1:c0f972361605 | 354 | |
csyang2 |
1:c0f972361605 | 355 | color2 = colormap [colidx]; |
csyang2 |
1:c0f972361605 | 356 | |
csyang2 |
1:c0f972361605 | 357 | for (; y1 <= y2; y1++) |
csyang2 |
1:c0f972361605 | 358 | { |
csyang2 |
1:c0f972361605 | 359 | // loc.p8 = line_addr [y1] + x1 * bytes_per_pixel; |
csyang2 |
1:c0f972361605 | 360 | //line_addr = (unsigned char *)g_VAFrameBuf+ y1*(LCD_XSIZE*bytes_per_pixel); |
csyang2 |
1:c0f972361605 | 361 | //loc.p8 = line_addr + x1* bytes_per_pixel; |
csyang2 |
1:c0f972361605 | 362 | for (tmp = x1; tmp <= x2; tmp++) |
csyang2 |
1:c0f972361605 | 363 | { |
csyang2 |
1:c0f972361605 | 364 | //__setpixel (loc, xormode, colidx); |
csyang2 |
1:c0f972361605 | 365 | //loc.p8 += bytes_per_pixel; |
csyang2 |
1:c0f972361605 | 366 | color = GUI_GetPixelIndex(tmp, y1); |
csyang2 |
1:c0f972361605 | 367 | if ( color == colormap2[0] ) |
csyang2 |
1:c0f972361605 | 368 | color = colormap[0]; |
csyang2 |
1:c0f972361605 | 369 | else if ( color == colormap2[1] ) |
csyang2 |
1:c0f972361605 | 370 | color = colormap[1]; |
csyang2 |
1:c0f972361605 | 371 | else if ( color == colormap2[2] ) |
csyang2 |
1:c0f972361605 | 372 | color = colormap[2]; |
csyang2 |
1:c0f972361605 | 373 | else if ( color == colormap2[3] ) |
csyang2 |
1:c0f972361605 | 374 | color = colormap[3]; |
csyang2 |
1:c0f972361605 | 375 | else if ( color == colormap2[4] ) |
csyang2 |
1:c0f972361605 | 376 | color = colormap[4]; |
csyang2 |
1:c0f972361605 | 377 | else if ( color == colormap2[5] ) |
csyang2 |
1:c0f972361605 | 378 | color = colormap[5]; |
csyang2 |
1:c0f972361605 | 379 | else if ( color == colormap2[6] ) |
csyang2 |
1:c0f972361605 | 380 | color = colormap[6]; |
csyang2 |
1:c0f972361605 | 381 | else if ( color == colormap2[7] ) |
csyang2 |
1:c0f972361605 | 382 | color = colormap[7]; |
csyang2 |
1:c0f972361605 | 383 | else if ( color == colormap2[8] ) |
csyang2 |
1:c0f972361605 | 384 | color = colormap[8]; |
csyang2 |
1:c0f972361605 | 385 | else if ( color == colormap2[9] ) |
csyang2 |
1:c0f972361605 | 386 | color = colormap[9]; |
csyang2 |
1:c0f972361605 | 387 | else if ( color == colormap2[10] ) |
csyang2 |
1:c0f972361605 | 388 | color = colormap[10]; |
csyang2 |
1:c0f972361605 | 389 | else if ( color == colormap2[11] ) |
csyang2 |
1:c0f972361605 | 390 | color = colormap[11]; |
csyang2 |
1:c0f972361605 | 391 | else if ( color == colormap2[12] ) |
csyang2 |
1:c0f972361605 | 392 | color = colormap[12]; |
csyang2 |
1:c0f972361605 | 393 | color2 = colormap [colidx]; |
csyang2 |
1:c0f972361605 | 394 | if (xormode) |
csyang2 |
1:c0f972361605 | 395 | color ^= color2; |
csyang2 |
1:c0f972361605 | 396 | else |
csyang2 |
1:c0f972361605 | 397 | color = color2; |
csyang2 |
1:c0f972361605 | 398 | GUI_SetColor(color); |
csyang2 |
1:c0f972361605 | 399 | GUI_DrawPixel(tmp, y1); |
csyang2 |
1:c0f972361605 | 400 | } |
csyang2 |
1:c0f972361605 | 401 | } |
csyang2 |
1:c0f972361605 | 402 | } |
csyang2 |
1:c0f972361605 | 403 | #endif |