00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <mem.h>
00017 #include <malloc.h>
00018 #include <stdio.h>
00019 #include <math.h>
00020 #include <conio.h>
00021 #include <io.h>
00022 #include <stdlib.h>
00023 #include "misc.h"
00024 #include "ztimer.h"
00025 #include "vs1001.h"
00026 #include "rtos.h"
00027 #include "checkbios.h"
00028 #include "gfxcore.h"
00029 #include "gfxdriver.h"
00030 #include "gfxutil.h"
00031 #include "gfxfont.h"
00032 #include "remote.h"
00033 #include "ztimer.h"
00034
00035 Font *font;
00036
00037
00051 void GFX_LineX(Graphics *gfx, int x1, int y1, int x2, int y2)
00052 {
00053 int dx = (x2-x1)*2;
00054 if (dx<0) dx=-dx;
00055
00056 int dy = (y2-y1)*2;
00057 if (dy<0) dy=-dy;
00058
00059
00060 if (dx > dy) {
00061 int fraction = dy - (dx >> 1);
00062
00063
00064
00065 if (x2<x1) { swap(x1, x2); swap(y1, y2); }
00066
00067 int w = (x2-x1)+1;
00068 char *dst = &gfx->bitmap->bmBits[x1 + (y1>>3)*gfx->bitmap->width];
00069 unsigned char mask = 1 << (y1 & 7);
00070
00071 if (y1 < y2) {
00072 while (w--) {
00073 *dst++ |= mask;
00074 if (fraction >= 0) {
00075 mask <<= 1;
00076 if (!mask) {
00077 mask = 0x01;
00078 dst += gfx->bitmap->width;
00079 }
00080 fraction -= dx;
00081 }
00082 fraction += dy;
00083 }
00084 } else {
00085 while (w--) {
00086 *dst++ |= mask;
00087 if (fraction >= 0) {
00088 mask >>= 1;
00089 if (!mask) {
00090 mask = 0x80;
00091 dst -= gfx->bitmap->width;
00092 }
00093 fraction -= dx;
00094 }
00095 fraction += dy;
00096 }
00097 }
00098
00099 } else {
00100 int fraction = dx - (dy >> 1);
00101
00102
00103
00104 if (y2<y1) { swap(x1, x2); swap(y1, y2); }
00105 int h = (y2-y1)+1;
00106
00107 char *dst = &gfx->bitmap->bmBits[x1 + (y1>>3)*gfx->bitmap->width];
00108 unsigned char mask = 1 << (y1 & 7);
00109
00110 if (x1 < x2) {
00111 while (h--) {
00112 *dst |= mask;
00113 mask <<= 1;
00114 if (!mask) {
00115 mask = 1;
00116 dst += gfx->bitmap->width;
00117 }
00118 if (fraction >= 0) {
00119 dst++;
00120 fraction -= dy;
00121 }
00122 fraction += dx;
00123 }
00124 } else {
00125 while (h--) {
00126 *dst |= mask;
00127 mask <<= 1;
00128 if (!mask) {
00129 mask = 1;
00130 dst += gfx->bitmap->width;
00131 }
00132 if (fraction >= 0) {
00133 dst--;
00134 fraction -= dy;
00135 }
00136 fraction += dx;
00137 }
00138 }
00139
00140 }
00141 }
00142
00143
00144 void gfxTest()
00145 {
00146 Bitmap *screen = BM_Alloc(122, 32);
00147 Bitmap *logo = BM_Load("test.bmp");
00148
00149 Graphics gfx;
00150 GFX_Init(&gfx, screen);
00151 GFX_SetFont(&gfx, font);
00152
00153
00154 BM_Info(screen);
00155 BM_Info(logo);
00156
00157 int x=32, y=16, u=8, v=8, w=16, h=16, op = 0;
00158 while (!kbhit()) {
00159
00160 long key = RC_GetKey();
00161
00162 switch (key & ~RCKEY_REPEAT) {
00163 case 0x10d52a10: return;
00164
00165 case 0x10d52a14: x--; break;
00166 case 0x10d52a02: x++; break;
00167 case 0x10d52a18: y--; break;
00168 case 0x10d52a01: y++; break;
00169
00170 case 0x10d52a17: u--; break;
00171 case 0x10d52a08: u++; break;
00172 case 0x10d52a04: v--; break;
00173 case 0x10d52a07: v++; break;
00174
00175 case 0x10d52a1a: w--; break;
00176 case 0x10d52a03: w++; break;
00177 case 0x10d52a06: h--; break;
00178 case 0x10d52a09: h++; break;
00179
00180 case 0x10d52a13: op++; break;
00181
00182 case 0x10d52a19:
00183 BM_Save(screen, "www\\shot.bmp");
00184 break;
00185
00186 default:
00187 printf("unkown code: 0x%lx\n", key);
00188 break;
00189 }
00190 BM_Clear(screen);
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 ZTimer_Start();
00209 if (w&1)
00210 GFX_LineX(&gfx, 1, 1, 120, 30);
00211 else
00212 GFX_LineX(&gfx, x, y, x+u, y+v);
00213 int time = ZTimer_Stop();
00214
00215 GFX_PrintfAt(&gfx, 61, -1, "%d us", time);
00216
00217 LCD_Update(screen);
00218 }
00219 }
00220
00221
00222 void main(int argc, char* argv[])
00223 {
00224 if (!CheckBIOS())
00225 return;
00226
00227 LCD_Init();
00228 RC_Init();
00229 VS_Init();
00230
00231 font = GFX_LoadFont("fonts\\compac~1.fnt");
00232 font->firstChar--;
00233
00234 if (font)
00235 gfxTest();
00236
00237 VS_Done();
00238 RC_Done();
00239 LCD_Done();
00240 }