Mercurial > public > ostc4
annotate Discovery/Src/gfx_engine.c @ 718:b9f699d2e3d0
Updated menu structure to support new sensor information page:
The sensor information page has been added to the sensor submenu of the hardware menu. It will be shown dynamically in case a smart sensor is detected. In order to have this dynamic visualization some new functions had to be added to the general menu file. The information page returns to the sensor menu, for this behavior also a new function had to be added.
author | Ideenmodellierer |
---|---|
date | Sun, 20 Nov 2022 20:49:41 +0100 |
parents | 158d612a9f4d |
children | 5071d554aaa5 |
rev | line source |
---|---|
38 | 1 /** |
2 ****************************************************************************** | |
3 * @file gfx_engine.c | |
4 * @author heinrichs weikamp gmbh | |
5 * @version V0.0.2 | |
6 * @date 30-April-2014 | |
7 * @brief Main source file of GFX Graphic Engine | |
8 * This file provides firmware functions to manage the following | |
9 * functions to draw on the screen: | |
10 * + write string to display | |
11 * | |
12 ****************************************************************************** | |
13 * @attention | |
14 * | |
15 * <h2><center>© COPYRIGHT(c) 2014 heinrichs weikamp</center></h2> | |
16 * | |
17 ****************************************************************************** | |
18 */ | |
19 | |
20 /* Includes ------------------------------------------------------------------*/ | |
21 | |
22 #include <stdlib.h> | |
23 #include <stdint.h> | |
24 | |
25 #include "stm32f4xx_hal.h" | |
26 | |
27 #include "gfx.h" | |
28 #include "gfx_engine.h" | |
29 #include "gfx_fonts.h" | |
30 #include "gfx_colors.h" | |
31 #include "ostc.h" | |
32 #include "settings.h" | |
33 #include "text_multilanguage.h" | |
34 | |
35 /* Exported variables --------------------------------------------------------*/ | |
36 | |
37 /* Private types -------------------------------------------------------------*/ | |
38 | |
698 | 39 #define RING_BUF_SIZE (5u) |
40 | |
38 | 41 typedef struct |
42 { | |
43 uint32_t Xdelta; | |
44 uint32_t Ydelta; | |
45 uint8_t invert; | |
46 uint8_t color; | |
47 uint8_t dualFont; | |
48 uint8_t resize; | |
49 uint32_t font; | |
50 uint8_t spaceMode; | |
51 uint8_t singleSpaceWithSizeOfNextChar; | |
52 uint8_t useTinyFont; | |
53 uint32_t TinyFont; | |
54 int8_t TinyFontExtraYdelta; | |
55 tFont *actualFont; | |
56 uint8_t doubleSize; | |
57 } GFX_CfgWriteString; | |
58 | |
59 typedef struct | |
60 { | |
61 uint32_t pBuffer; | |
62 uint32_t height; | |
63 uint32_t width; | |
64 uint32_t leftStart; | |
65 uint32_t bottomStart; | |
66 } GFX_layerSingle; | |
67 /* | |
68 typedef struct | |
69 { | |
70 GFX_layerSingle top; | |
71 GFX_layerSingle bottom; | |
72 } GFX_layersTopBottom; | |
73 */ | |
74 typedef struct | |
75 { | |
76 uint32_t pActualTopBuffer; | |
698 | 77 uint32_t pNextTopBuffer[RING_BUF_SIZE]; |
38 | 78 GFX_layerSingle actualBottom; |
698 | 79 GFX_layerSingle nextBottom[RING_BUF_SIZE]; |
80 uint8_t NextTopWrite; | |
81 uint8_t NextBottomWrite; | |
82 uint8_t NextTopRead; | |
83 uint8_t NextBottomRead; | |
38 | 84 } GFX_layerControl; |
85 | |
86 typedef struct | |
87 { | |
88 uint32_t StartAddress; | |
89 int8_t status; | |
90 uint8_t caller; | |
91 } SFrameList; | |
92 | |
93 enum FRAMESTATE | |
94 { | |
95 CLEAR = 0, | |
96 BLOCKED, | |
97 RELEASED | |
98 }; | |
99 | |
100 enum LOGOSTATE | |
101 { | |
102 LOGOOFF = 0, | |
103 LOGOSTART = 1, | |
104 LOGOSTOP = 255 | |
105 }; | |
106 | |
107 // should be 43 | |
108 #define MAXFRAMES 39 | |
109 | |
110 #define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) | |
111 #define FBGlobalStart SDRAM_BANK_ADDR | |
112 #define FBOffsetEachIndex (800*480*2) | |
113 | |
114 #define SDRAM_DOUBLE_BUFFER_ONE ((uint32_t)(FBGlobalStart + (MAXFRAMES * FBOffsetEachIndex))) | |
115 #define SDRAM_DOUBLE_BUFFER_TWO ((uint32_t)(SDRAM_DOUBLE_BUFFER_ONE + (2 * FBOffsetEachIndex))) | |
116 #define SDRAM_DOUBLE_BUFFER_END ((uint32_t)(SDRAM_DOUBLE_BUFFER_TWO + (2 * FBOffsetEachIndex))) | |
117 | |
118 /* Semi Private variables ---------------------------------------------------------*/ | |
119 | |
120 DMA2D_HandleTypeDef Dma2dHandle; | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
121 static LTDC_HandleTypeDef LtdcHandle; |
38 | 122 |
123 /* Private variables ---------------------------------------------------------*/ | |
124 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
125 static uint8_t DMA2D_at_work = 0; |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
126 |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
127 static GFX_layerControl FrameHandler = { 0 }; |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
128 |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
129 static uint32_t pInvisibleFrame = 0; |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
130 static uint32_t pLogoFrame = 0; |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
131 static uint8_t logoStatus; |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
132 static uint32_t pBackgroundHwFrame = 0; |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
133 static uint8_t backgroundHwStatus; |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
134 |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
135 static SFrameList frame[MAXFRAMES]; |
38 | 136 |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
137 static void GFX_clear_frame_immediately(uint32_t pDestination); |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
138 static void GFX_draw_image_color(GFX_DrawCfgScreen *hgfx, SWindowGimpStyle window, const tImage *image); |
38 | 139 /* ITM Trace-----------------------------------------------------------------*/ |
140 | |
141 #include "stdio.h" | |
142 | |
143 #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) | |
144 #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) | |
145 #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) | |
146 | |
147 #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) | |
148 #define TRCENA 0x01000000 | |
149 | |
150 struct __FILE { int handle; /* Add whatever needed */ }; | |
151 FILE __stdout; | |
152 FILE __stdin; | |
153 | |
154 int fputc(int ch, FILE *f) { | |
155 if (DEMCR & TRCENA) { | |
156 while (ITM_Port32(0) == 0); | |
157 ITM_Port8(0) = ch; | |
158 } | |
159 return(ch); | |
160 } | |
161 | |
162 uint32_t MinU32GFX(uint32_t a, uint32_t b) | |
163 { | |
164 return ((a<b)?a:b); | |
165 } | |
166 | |
167 | |
168 uint32_t MaxU32GFX(uint32_t a, uint32_t b) | |
169 { | |
170 return((a>b)?a:b); | |
171 } | |
172 | |
173 /* Private function prototypes -----------------------------------------------*/ | |
174 | |
175 static uint32_t GFX_write_char(GFX_DrawCfgWindow* hgfx, GFX_CfgWriteString* cfg, uint8_t character, tFont *Font); | |
176 static uint32_t GFX_write_substring(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, uint8_t textId, int8_t nextCharFor2Byte); | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
177 static uint32_t GFX_write__Modify_Xdelta__Centered(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, const char *pText); |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
178 static uint32_t GFX_write__Modify_Xdelta__RightAlign(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, const char *pTextInput); |
38 | 179 static void GFX_Error_Handler(void); |
180 static void GFX_Dma2d_TransferComplete(DMA2D_HandleTypeDef* Dma2dHandle); | |
181 static void GFX_Dma2d_TransferError(DMA2D_HandleTypeDef* Dma2dHandle); | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
182 static void GFX_clear_frame_dma2d(uint8_t frameId); |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
183 |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
184 static uint32_t GFX_doubleBufferOne(void); |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
185 static uint32_t GFX_doubleBufferTwo(void); |
38 | 186 |
187 | |
188 /* Exported functions --------------------------------------------------------*/ | |
189 | |
190 uint8_t GFX_logoStatus(void) | |
191 { | |
192 return logoStatus; | |
193 } | |
194 | |
195 void GFX_SetWindowLayer0(uint32_t pDestination, int16_t XleftGimpStyle, int16_t XrightGimpStyle, int16_t YtopGimpStyle, int16_t YbottomGimpStyle) | |
196 { | |
197 int16_t XSize, YSize, X0, Y0; | |
198 | |
199 if(XleftGimpStyle < 0) XleftGimpStyle = 0; | |
200 if(XrightGimpStyle < 0) XrightGimpStyle = 0; | |
201 if(XleftGimpStyle > 799) XleftGimpStyle = 800; | |
202 if(XrightGimpStyle > 799) XrightGimpStyle = 800; | |
203 | |
204 if(YtopGimpStyle < 0) YtopGimpStyle = 0; | |
205 if(YbottomGimpStyle < 0) YbottomGimpStyle = 0; | |
206 if(YtopGimpStyle > 479) YtopGimpStyle = 480; | |
207 if(YbottomGimpStyle > 479) YbottomGimpStyle = 480; | |
208 | |
209 /* | |
210 XSize = YbottomGimpStyle - YtopGimpStyle; | |
211 YSize = XrightGimpStyle - XleftGimpStyle; | |
212 if((XSize <= 0) || (YSize <= 0)) | |
213 return; | |
214 X0 = 479 - YbottomGimpStyle; | |
215 Y0 = XleftGimpStyle; | |
216 while((LTDC->CPSR & LTDC_CPSR_CYPOS) <= (uint32_t)800); | |
217 HAL_LTDC_SetWindowSize(&LtdcHandle, XSize, YSize, LayerIdx); | |
218 HAL_LTDC_SetWindowPosition(&LtdcHandle, X0, Y0,LayerIdx); | |
219 HAL_LTDC_SetAddress(&LtdcHandle, pDestination, LayerIdx); | |
220 */ | |
221 | |
222 XSize = XrightGimpStyle - XleftGimpStyle; | |
223 YSize = YbottomGimpStyle - YtopGimpStyle; | |
224 if((XSize <= 0) || (YSize <= 0)) | |
225 return; | |
226 Y0 = 479 - YbottomGimpStyle; | |
227 X0 = XleftGimpStyle; | |
228 | |
229 GFX_SetFrameBottom(pDestination, X0, Y0, XSize, YSize); | |
230 } | |
231 | |
232 | |
233 void GFX_logoAutoOff(void) | |
234 { | |
235 if(logoStatus == LOGOOFF) | |
236 logoStatus = LOGOSTART; | |
237 } | |
238 | |
239 | |
240 void GFX_hwBackgroundOn(void) | |
241 { | |
242 backgroundHwStatus = LOGOSTART; | |
243 } | |
244 | |
245 | |
246 void GFX_hwBackgroundOff(void) | |
247 { | |
248 backgroundHwStatus = LOGOSTOP; | |
249 } | |
250 | |
251 | |
314 | 252 void GFX_build_hw_background_frame(void) |
38 | 253 { |
254 GFX_DrawCfgScreen tLogoTemp; | |
255 SWindowGimpStyle windowGimp; | |
256 | |
257 pBackgroundHwFrame = getFrame(1); | |
258 backgroundHwStatus = 0; | |
259 | |
260 tLogoTemp.FBStartAdress = pBackgroundHwFrame; | |
261 tLogoTemp.ImageHeight = 480; | |
262 tLogoTemp.ImageWidth = 800; | |
263 tLogoTemp.LayerIndex = 1; | |
264 | |
265 windowGimp.left = (800 - 400) / 2; | |
266 windowGimp.top = 0;//(480 - 46) / 2; | |
267 | |
268 GFX_draw_image_color(&tLogoTemp, windowGimp, &ImgHWcolor); | |
269 /* | |
270 char localtext[256]; | |
271 uint8_t ptr = 0; | |
272 | |
273 localtext[ptr++] = ' '; | |
274 localtext[ptr++] = ' '; | |
275 localtext[ptr++] = 'O'; | |
276 localtext[ptr++] = 'S'; | |
277 localtext[ptr++] = ' '; | |
278 ptr += GFX_printf_firmware(&localtext[ptr]); | |
279 localtext[ptr] = 0; | |
280 | |
281 write_content_simple(&tLogoTemp, 0, 800, 240-24, &FontT24,localtext,CLUT_Font020); | |
282 */ | |
283 } | |
284 | |
285 | |
314 | 286 void GFX_build_logo_frame(void) |
38 | 287 { |
288 GFX_DrawCfgScreen tLogoTemp; | |
289 SWindowGimpStyle windowGimp; | |
290 | |
291 pLogoFrame = getFrame(1); | |
292 logoStatus = LOGOOFF; | |
293 | |
294 tLogoTemp.FBStartAdress = pLogoFrame; | |
295 tLogoTemp.ImageHeight = 480; | |
296 tLogoTemp.ImageWidth = 800; | |
297 tLogoTemp.LayerIndex = 1; | |
298 | |
299 windowGimp.left = (800 - 400) / 2; | |
300 windowGimp.top = (480 - 46) / 2; | |
301 | |
302 GFX_draw_image_color(&tLogoTemp, windowGimp, &ImgHWcolor); | |
303 /* | |
304 char localtext[256]; | |
305 uint8_t ptr = 0; | |
306 | |
307 localtext[ptr++] = ' '; | |
308 localtext[ptr++] = ' '; | |
309 localtext[ptr++] = 'O'; | |
310 localtext[ptr++] = 'S'; | |
311 localtext[ptr++] = ' '; | |
312 ptr += GFX_printf_firmware(&localtext[ptr]); | |
313 localtext[ptr] = 0; | |
314 | |
315 write_content_simple(&tLogoTemp, 0, 800, 240-24, &FontT24,localtext,CLUT_Font020); | |
316 */ | |
317 } | |
318 | |
319 | |
320 void GFX_init(uint32_t * pDestinationOut) | |
321 { | |
322 frame[0].StartAddress = FBGlobalStart; | |
323 GFX_clear_frame_immediately(frame[0].StartAddress); | |
324 frame[0].status = CLEAR; | |
325 frame[0].caller = 0; | |
326 | |
327 for(int i=1;i<MAXFRAMES;i++) | |
328 { | |
329 frame[i].StartAddress = frame[i-1].StartAddress + FBOffsetEachIndex; | |
330 GFX_clear_frame_immediately(frame[i].StartAddress); | |
331 frame[i].status = CLEAR; | |
332 frame[i].caller = 0; | |
333 } | |
334 | |
335 pInvisibleFrame = getFrame(2); | |
336 *pDestinationOut = pInvisibleFrame; | |
337 | |
338 GFX_build_logo_frame(); | |
339 GFX_build_hw_background_frame(); | |
340 | |
341 /* Register to memory mode with ARGB8888 as color Mode */ | |
342 Dma2dHandle.Init.Mode = DMA2D_R2M; | |
343 Dma2dHandle.Init.ColorMode = DMA2D_ARGB4444;//to fake AL88, before: DMA2D_ARGB8888; | |
344 Dma2dHandle.Init.OutputOffset = 0; | |
345 | |
346 /* DMA2D Callbacks Configuration */ | |
347 Dma2dHandle.XferCpltCallback = GFX_Dma2d_TransferComplete; | |
348 Dma2dHandle.XferErrorCallback = GFX_Dma2d_TransferError; | |
349 | |
350 Dma2dHandle.Instance = DMA2D; | |
351 | |
352 /* DMA2D Initialisation */ | |
353 if(HAL_DMA2D_Init(&Dma2dHandle) != HAL_OK) | |
354 GFX_Error_Handler(); | |
355 | |
356 if(HAL_DMA2D_ConfigLayer(&Dma2dHandle, 1) != HAL_OK) | |
357 GFX_Error_Handler(); | |
358 | |
359 DMA2D_at_work = 255; | |
360 } | |
361 | |
362 | |
363 void GFX_SetFrameTop(uint32_t pDestination) | |
364 { | |
698 | 365 uint8_t NextTopWork = FrameHandler.NextTopWrite + 1; |
366 | |
367 if(NextTopWork == RING_BUF_SIZE) | |
368 { | |
369 NextTopWork = 0; | |
370 } | |
38 | 371 |
372 if(pDestination == 0) | |
373 pDestination = pInvisibleFrame; | |
374 | |
698 | 375 FrameHandler.pNextTopBuffer[NextTopWork] = pDestination; |
376 FrameHandler.NextTopWrite = NextTopWork; | |
38 | 377 } |
378 | |
379 | |
380 void GFX_SetFrameBottom(uint32_t pDestination, uint32_t x0, uint32_t y0, uint32_t width, uint32_t height) | |
381 { | |
698 | 382 uint8_t NextBottomWork = FrameHandler.NextBottomWrite + 1; |
383 | |
384 if(NextBottomWork == RING_BUF_SIZE) | |
385 { | |
386 NextBottomWork = 0; | |
387 } | |
38 | 388 |
389 if(pDestination == 0) | |
390 pDestination = pInvisibleFrame; | |
391 | |
698 | 392 FrameHandler.nextBottom[NextBottomWork].pBuffer = pDestination; |
393 FrameHandler.nextBottom[NextBottomWork].height = height; | |
394 FrameHandler.nextBottom[NextBottomWork].width = width; | |
395 FrameHandler.nextBottom[NextBottomWork].leftStart = x0; | |
396 FrameHandler.nextBottom[NextBottomWork].bottomStart = y0; | |
397 FrameHandler.NextBottomWrite = NextBottomWork; | |
38 | 398 } |
399 | |
400 | |
401 void GFX_SetFramesTopBottom(uint32_t pTop, uint32_t pBottom, uint32_t heightBottom) | |
402 { | |
403 GFX_SetFrameTop(pTop); | |
404 GFX_SetFrameBottom(pBottom, 0, 0, 800, heightBottom); | |
405 } | |
406 | |
407 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
408 static uint32_t GFX_get_pActualFrameTop(void) |
38 | 409 { |
410 return FrameHandler.pActualTopBuffer; | |
411 } | |
412 | |
413 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
414 static uint32_t GFX_get_pActualFrameBottom(void) |
38 | 415 { |
416 return FrameHandler.actualBottom.pBuffer; | |
417 } | |
418 | |
419 | |
420 void GFX_start_VSYNC_IRQ(void) | |
421 { | |
422 GPIO_InitTypeDef GPIO_InitStructure; | |
423 | |
424 GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; | |
425 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
426 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
427 GPIO_InitStructure.Pin = VSYNC_IRQ_PIN; | |
428 HAL_GPIO_Init(VSYNC_IRQ_GPIO_PORT, &GPIO_InitStructure); | |
429 | |
430 HAL_NVIC_SetPriority(VSYNC_IRQ_EXTI_IRQn, 1, 0); | |
431 HAL_NVIC_EnableIRQ(VSYNC_IRQ_EXTI_IRQn); | |
432 } | |
433 | |
434 | |
435 void GFX_change_LTDC(void) | |
436 { | |
437 uint32_t pTop = 0; | |
438 uint32_t pBot = 0; | |
439 uint32_t heightBot = 0; | |
440 uint32_t widthBot = 0; | |
441 uint32_t leftStartBot = 0; | |
442 uint32_t bottomStartBot = 0; | |
443 uint8_t change_position = 0; | |
444 uint8_t change_size = 0; | |
698 | 445 uint8_t nextBottomBackup = FrameHandler.NextBottomRead; /* Restore entry value in case off logo handling */ |
38 | 446 |
447 // Top Frame | |
698 | 448 if(FrameHandler.NextTopRead != FrameHandler.NextTopWrite) |
449 { | |
450 FrameHandler.NextTopRead++; | |
451 if(FrameHandler.NextTopRead == RING_BUF_SIZE) | |
452 { | |
453 FrameHandler.NextTopRead = 0; | |
454 } | |
455 } | |
456 pTop = FrameHandler.pNextTopBuffer[FrameHandler.NextTopRead]; | |
457 | |
38 | 458 if(FrameHandler.pActualTopBuffer != pTop) |
459 { | |
460 HAL_LTDC_SetAddress(&LtdcHandle, pTop, 1); | |
461 FrameHandler.pActualTopBuffer = pTop; | |
462 } | |
463 | |
464 // Bottom Frame | |
698 | 465 if(FrameHandler.NextBottomRead != FrameHandler.NextBottomWrite) |
466 { | |
467 FrameHandler.NextBottomRead++; | |
468 if(FrameHandler.NextBottomRead == RING_BUF_SIZE) | |
469 { | |
470 FrameHandler.NextBottomRead = 0; | |
471 } | |
472 } | |
38 | 473 if(logoStatus != LOGOOFF) |
474 { | |
475 switch(logoStatus) | |
476 { | |
477 case LOGOSTART: | |
478 HAL_LTDC_SetAlpha(&LtdcHandle, 0, 1); | |
479 HAL_LTDC_SetAlpha(&LtdcHandle, 34, 0); | |
480 HAL_LTDC_ConfigCLUT(&LtdcHandle, (uint32_t *)indexHWcolor, indexHWcolorSIZE, 0); | |
481 HAL_LTDC_SetAddress(&LtdcHandle, pLogoFrame, 0); | |
482 HAL_LTDC_SetWindowSize(&LtdcHandle, 480, 800, 0); | |
483 HAL_LTDC_SetWindowPosition(&LtdcHandle, 0, 0, 0); | |
484 logoStatus = 2; | |
698 | 485 FrameHandler.NextBottomRead = nextBottomBackup; |
38 | 486 break; |
487 | |
488 case LOGOSTOP: | |
489 HAL_LTDC_SetAlpha(&LtdcHandle, 255, 1); | |
490 HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, 0); | |
491 | |
698 | 492 pBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].pBuffer; |
493 heightBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].height; | |
494 widthBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].width; | |
495 leftStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].leftStart; | |
496 bottomStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].bottomStart; | |
38 | 497 HAL_LTDC_SetWindowSize(&LtdcHandle, heightBot, widthBot, 0); |
498 HAL_LTDC_SetWindowPosition(&LtdcHandle, bottomStartBot, leftStartBot, 0); | |
499 HAL_LTDC_SetAddress(&LtdcHandle, pBot, 0); | |
500 HAL_LTDC_SetAlpha(&LtdcHandle, 255, 0); | |
501 FrameHandler.actualBottom.height = heightBot; | |
502 FrameHandler.actualBottom.width = widthBot; | |
503 FrameHandler.actualBottom.leftStart = leftStartBot; | |
504 FrameHandler.actualBottom.bottomStart = bottomStartBot; | |
505 FrameHandler.actualBottom.pBuffer = pBot; | |
506 | |
507 logoStatus = LOGOOFF; | |
508 if(backgroundHwStatus == 2) | |
509 { | |
510 backgroundHwStatus = LOGOSTART; | |
511 } | |
512 break; | |
513 default: | |
514 if(logoStatus < 35) | |
515 { | |
516 logoStatus++; | |
517 if(logoStatus <= 15) | |
518 HAL_LTDC_SetAlpha(&LtdcHandle, 17*logoStatus, 0); | |
519 } | |
520 else | |
521 { | |
522 logoStatus +=20; | |
523 HAL_LTDC_SetAlpha(&LtdcHandle, logoStatus-55, 1); | |
524 HAL_LTDC_SetAlpha(&LtdcHandle, 255+55-logoStatus, 0); | |
525 } | |
698 | 526 FrameHandler.NextBottomRead = nextBottomBackup; |
38 | 527 break; |
528 } | |
529 return; | |
530 } | |
531 else if (backgroundHwStatus != LOGOOFF) | |
532 { | |
533 switch(backgroundHwStatus) | |
534 { | |
535 case LOGOSTART: | |
536 HAL_LTDC_ConfigCLUT(&LtdcHandle, (uint32_t *)indexHWcolor, indexHWcolorSIZE, 0); | |
537 HAL_LTDC_SetAddress(&LtdcHandle, pBackgroundHwFrame, 0); | |
538 HAL_LTDC_SetWindowSize(&LtdcHandle, 480, 800, 0); | |
539 HAL_LTDC_SetWindowPosition(&LtdcHandle, 0, 0, 0); | |
540 backgroundHwStatus = 2; | |
698 | 541 FrameHandler.NextBottomRead = nextBottomBackup; |
38 | 542 break; |
543 | |
544 case LOGOSTOP: | |
545 HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, 0); | |
698 | 546 pBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].pBuffer; |
547 heightBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].height; | |
548 widthBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].width; | |
549 leftStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].leftStart; | |
550 bottomStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].bottomStart; | |
38 | 551 HAL_LTDC_SetWindowSize(&LtdcHandle, heightBot, widthBot, 0); |
552 HAL_LTDC_SetWindowPosition(&LtdcHandle, bottomStartBot, leftStartBot, 0); | |
553 HAL_LTDC_SetAddress(&LtdcHandle, pBot, 0); | |
554 HAL_LTDC_SetAlpha(&LtdcHandle, 255, 0); | |
555 FrameHandler.actualBottom.height = heightBot; | |
556 FrameHandler.actualBottom.width = widthBot; | |
557 FrameHandler.actualBottom.leftStart = leftStartBot; | |
558 FrameHandler.actualBottom.bottomStart = bottomStartBot; | |
559 FrameHandler.actualBottom.pBuffer = pBot; | |
560 backgroundHwStatus = LOGOOFF; | |
561 break; | |
562 | |
563 default: | |
698 | 564 FrameHandler.NextBottomRead = nextBottomBackup; |
38 | 565 break; |
566 } | |
567 return; | |
568 } | |
569 else | |
570 { | |
698 | 571 pBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].pBuffer; |
572 heightBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].height; | |
573 widthBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].width; | |
574 leftStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].leftStart; | |
575 bottomStartBot = FrameHandler.nextBottom[FrameHandler.NextBottomRead].bottomStart; | |
38 | 576 |
577 if(FrameHandler.actualBottom.pBuffer == pBot) | |
578 pBot = 0; | |
579 | |
580 if((FrameHandler.actualBottom.height != heightBot) || (FrameHandler.actualBottom.width != widthBot)) | |
581 change_size = 1; | |
582 | |
583 if((FrameHandler.actualBottom.leftStart != leftStartBot) || (FrameHandler.actualBottom.bottomStart != bottomStartBot)) | |
584 change_position = 1; | |
585 | |
586 if(pBot || change_size || change_position) | |
587 { | |
588 if(heightBot && widthBot) | |
589 HAL_LTDC_SetWindowSize(&LtdcHandle, heightBot, widthBot, 0); | |
590 | |
591 if(change_position || leftStartBot || bottomStartBot) | |
592 HAL_LTDC_SetWindowPosition(&LtdcHandle, bottomStartBot, leftStartBot, 0); | |
593 | |
594 if(pBot) | |
595 HAL_LTDC_SetAddress(&LtdcHandle, pBot, 0); | |
596 | |
597 if(change_size) | |
598 { | |
599 FrameHandler.actualBottom.height = heightBot; | |
600 FrameHandler.actualBottom.width = widthBot; | |
601 } | |
602 if(change_position) | |
603 { | |
604 FrameHandler.actualBottom.leftStart = leftStartBot; | |
605 FrameHandler.actualBottom.bottomStart = bottomStartBot; | |
606 } | |
607 if(pBot) | |
608 FrameHandler.actualBottom.pBuffer = pBot; | |
609 } | |
610 } | |
611 } | |
612 | |
613 uint8_t GFX_is_colorschemeDiveStandard(void) | |
614 { | |
615 return (ColorLUT[CLUT_Font027] == 0x00FFFFFF); | |
616 } | |
617 | |
618 | |
619 void change_CLUT_entry(uint8_t entryToChange, uint8_t entryUsedForChange) | |
620 { | |
621 /* bug fix | |
622 static uint8_t counter = 0; | |
623 | |
624 if(entryToChange == 0x1C) | |
625 counter++; | |
626 */ | |
627 ColorLUT[entryToChange] = ColorLUT[entryUsedForChange]; | |
628 HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, 1); | |
629 if(logoStatus == LOGOOFF) | |
630 HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, 0); | |
631 } | |
632 | |
633 | |
634 void GFX_use_colorscheme(uint8_t colorscheme) | |
635 { | |
636 uint8_t ColorSchemeStart; | |
637 | |
638 if(colorscheme > 3) | |
639 colorscheme = 0; | |
640 | |
641 ColorSchemeStart = CLUT_Colorscheme0 + (8 * colorscheme); | |
642 for(int i=1; i<8; i++) | |
643 { | |
644 ColorLUT[CLUT_Font027 + i] = ColorLUT[ColorSchemeStart + i]; | |
645 } | |
646 change_CLUT_entry(CLUT_Font027, ColorSchemeStart); | |
647 } | |
648 | |
649 | |
650 void GFX_VGA_transform(uint32_t pSource, uint32_t pDestination) | |
651 { | |
652 int h, v; | |
653 uint32_t offsetSource, offsetSourceStartOfLine; | |
654 | |
655 offsetSourceStartOfLine = 480 + 480 - 2; | |
656 for(v=0;v<480;v++) | |
657 { | |
658 offsetSource = offsetSourceStartOfLine; | |
659 for(h=0;h<640;h++) | |
660 { | |
661 *(__IO uint8_t*)pDestination = *(uint8_t*)(pSource + offsetSource); | |
662 pDestination++; | |
663 offsetSource += 1; | |
664 *(__IO uint8_t*)pDestination = *(uint8_t*)(pSource + offsetSource); | |
665 pDestination++; | |
666 offsetSource += 480 + 479; | |
667 } | |
668 offsetSourceStartOfLine -= 2; | |
669 } | |
670 } | |
671 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
672 |
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
673 static void GFX_clear_frame_immediately(uint32_t pDestination) |
38 | 674 { |
675 uint32_t i; | |
121 | 676 uint32_t* pfill = (uint32_t*) pDestination; |
677 | |
38 | 678 |
679 for(i = 200*480; i > 0; i--) | |
680 { | |
121 | 681 *pfill++ = 0; |
682 *pfill++ = 0; | |
38 | 683 } |
684 } | |
685 | |
686 | |
687 void GFX_clear_window_immediately(GFX_DrawCfgWindow* hgfx) | |
688 { | |
689 uint32_t pDestination, i, j; | |
690 uint16_t left, width, bottom, height, nextlineStep; | |
691 | |
692 pDestination = (uint32_t)hgfx->Image->FBStartAdress; | |
693 | |
694 left = hgfx->WindowX0; | |
695 width = 1 + hgfx->WindowX1 - left; | |
696 bottom = hgfx->WindowY0; | |
697 height = 1 + hgfx->WindowY1 - bottom; | |
698 nextlineStep = hgfx->Image->ImageHeight - height; | |
699 nextlineStep *= 2; | |
700 | |
701 pDestination += 2 * bottom; | |
702 pDestination += 2 * hgfx->Image->ImageHeight * left; | |
703 | |
704 for(j = width; j > 0; j--) | |
705 { | |
706 for(i = height; i > 0; i--) | |
707 { | |
708 *(__IO uint16_t*)pDestination = 0; | |
709 pDestination += 2; | |
710 } | |
711 pDestination += nextlineStep; | |
712 } | |
713 } | |
714 | |
715 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
716 static void GFX_clear_frame_dma2d(uint8_t frameId) |
38 | 717 { |
718 if(frameId >= MAXFRAMES) | |
719 return; | |
720 | |
721 DMA2D_at_work = frameId; | |
722 | |
723 if (HAL_DMA2D_Start_IT(&Dma2dHandle, 0x0000000000, frame[frameId].StartAddress, 480, 800) != HAL_OK) | |
724 GFX_Error_Handler(); | |
725 } | |
726 | |
727 | |
728 void GFX_fill_buffer(uint32_t pDestination, uint8_t alpha, uint8_t color) | |
729 { | |
730 | |
121 | 731 union al88_u |
38 | 732 { |
733 uint8_t al8[2]; | |
734 uint16_t al88; | |
735 }; | |
736 union al88_u colorcombination; | |
737 uint32_t i; | |
121 | 738 uint32_t* pfill = (uint32_t*) pDestination; |
739 uint32_t fillpattern; | |
38 | 740 |
741 colorcombination.al8[0] = color; | |
742 colorcombination.al8[1] = alpha; | |
743 | |
121 | 744 fillpattern = (colorcombination.al88 << 16) | colorcombination.al88; |
745 for(i = 800*480/2; i > 0; i--) | |
38 | 746 { |
121 | 747 *pfill++ = fillpattern; |
38 | 748 } |
749 } | |
750 | |
751 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
752 static void gfx_flip(point_t *p1, point_t *p2) |
38 | 753 { |
754 point_t temp; | |
755 | |
756 temp = *p1; | |
757 *p1 = *p2; | |
758 *p2 = temp; | |
759 } | |
760 | |
761 | |
762 static inline void gfx_brush(uint8_t thickness, GFX_DrawCfgScreen *hgfx, uint16_t x0, uint16_t y0, uint8_t color) | |
763 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
764 uint16_t* pDestination; |
38 | 765 uint8_t offset = thickness/2; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
766 int16_t stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
767 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
768 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
769 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
770 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
771 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
772 { |
114 | 773 pDestination = (uint16_t*)hgfx->FBStartAdress; |
774 pDestination += (hgfx->ImageHeight * (hgfx->ImageWidth - x0 + offset)) + (480 - y0+offset); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
775 stepdir = -1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
776 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
777 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
778 { |
114 | 779 pDestination = (uint16_t*)hgfx->FBStartAdress; |
780 pDestination += (x0 - offset)*hgfx->ImageHeight + (y0-offset); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
781 stepdir = 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
782 } |
38 | 783 for(int x=thickness;x>0;x--) |
784 { | |
785 for(int y=thickness;y>0;y--) | |
786 { | |
787 *(__IO uint16_t*)pDestination = 0xFF00 + color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
788 pDestination += stepdir; |
38 | 789 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
790 pDestination += stepdir * (hgfx->ImageHeight - thickness); |
38 | 791 } |
792 } | |
793 | |
794 | |
795 void GFX_draw_thick_line(uint8_t thickness, GFX_DrawCfgScreen *hgfx, point_t start, point_t stop, uint8_t color) | |
796 { | |
797 if(thickness < 2) | |
798 GFX_draw_line(hgfx, start, stop, color); | |
799 | |
800 int x0 = start.x; | |
801 int y0 = start.y; | |
802 int x1 = stop.x; | |
803 int y1 = stop.y; | |
804 int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; | |
805 int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; | |
806 int err = (dx>dy ? dx : -dy)/2, e2; | |
807 | |
808 | |
809 if(start.x == stop.x) | |
810 { | |
811 if(start.y > stop.y) gfx_flip(&start,&stop); | |
812 for (int j = stop.y - start.y; j > 0; j--) | |
813 { | |
814 gfx_brush(thickness,hgfx,start.x,start.y++,color); | |
815 } | |
816 } | |
817 else | |
818 if(start.y == stop.y) | |
819 { | |
820 if(start.x > stop.x) gfx_flip(&start,&stop); | |
821 | |
822 for (int j = stop.x - start.x; j > 0; j--) | |
823 { | |
824 gfx_brush(thickness,hgfx,start.x++,start.y,color); | |
825 } | |
826 } | |
827 else // diagonal | |
828 { | |
829 for(;;) | |
830 { | |
831 gfx_brush(thickness,hgfx,x0,y0,color); | |
832 if (x0==x1 && y0==y1) break; | |
833 e2 = err; | |
834 if (e2 >-dx) { err -= dy; x0 += sx; } | |
835 if (e2 < dy) { err += dx; y0 += sy; } | |
836 } | |
837 } | |
838 } | |
839 | |
840 | |
841 void GFX_draw_line(GFX_DrawCfgScreen *hgfx, point_t start, point_t stop, uint8_t color) | |
842 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
843 uint16_t* pDestination; |
38 | 844 uint32_t j; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
845 int16_t stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
846 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
847 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
848 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
849 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
850 /* horizontal line */ |
38 | 851 if(start.x == stop.x) |
852 { | |
853 if(start.y > stop.y) gfx_flip(&start,&stop); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
854 |
114 | 855 pDestination = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
856 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
857 { |
622 | 858 pDestination += (799 - start.x) * hgfx->ImageHeight; |
859 pDestination += (479 - start.y); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
860 stepdir = -1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
861 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
862 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
863 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
864 pDestination += start.x * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
865 pDestination += start.y; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
866 stepdir = 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
867 } |
38 | 868 for (j = stop.y - start.y; j > 0; j--) |
869 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
870 *(__IO uint16_t*)pDestination = 0xFF00 + color; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
871 pDestination += stepdir; |
38 | 872 } |
873 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
874 else /* vertical line ? */ |
38 | 875 if(start.y == stop.y) |
876 { | |
877 if(start.x > stop.x) gfx_flip(&start,&stop); | |
114 | 878 pDestination = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
879 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
880 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
881 { |
622 | 882 pDestination += (799 - start.x) * hgfx->ImageHeight; |
883 pDestination += (479 - start.y); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
884 stepdir = -1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
885 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
886 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
887 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
888 pDestination += start.x * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
889 pDestination += start.y; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
890 stepdir = 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
891 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
892 |
38 | 893 for (j = stop.x - start.x; j > 0; j--) |
894 { | |
895 *(__IO uint16_t*)pDestination = 0xFF00 + color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
896 pDestination += stepdir * hgfx->ImageHeight; |
38 | 897 } |
898 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
899 else /* diagonal */ |
38 | 900 { |
901 int x0 = start.x; | |
902 int y0 = start.y; | |
903 int x1 = stop.x; | |
904 int y1 = stop.y; | |
905 int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; | |
906 int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; | |
907 int err = (dx>dy ? dx : -dy)/2, e2; | |
908 | |
909 for(;;) | |
910 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
911 pDestination = (uint16_t*)hgfx->FBStartAdress; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
912 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
913 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
914 { |
622 | 915 pDestination += (((799 - x0) * hgfx->ImageHeight) + (479 - y0)); |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
916 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
917 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
918 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
919 pDestination += ((x0 * hgfx->ImageHeight) + y0); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
920 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
921 |
38 | 922 *(__IO uint16_t*)pDestination = 0xFF00 + color; |
923 if (x0==x1 && y0==y1) break; | |
924 e2 = err; | |
925 if (e2 >-dx) { err -= dy; x0 += sx; } | |
926 if (e2 < dy) { err += dx; y0 += sy; } | |
927 } | |
928 } | |
929 } | |
930 | |
931 | |
932 void GFX_draw_image_monochrome(GFX_DrawCfgScreen *hgfx, SWindowGimpStyle window, const tImage *image, uint8_t color) | |
933 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
934 uint16_t* pDestination; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
935 uint32_t j; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
936 point_t start, stop; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
937 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
938 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
939 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
940 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
941 start.x = window.left; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
942 start.y = (hgfx->ImageHeight - image->height - window.top); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
943 stop.y = start.y + image->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
944 stop.x = start.x + image->width; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
945 j = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
946 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
947 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
948 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
949 for(int xx = start.x; xx < stop.x; xx++) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
950 { |
114 | 951 pDestination = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
952 pDestination += (hgfx->ImageHeight - start.y) + (stop.x * hgfx->ImageHeight) ; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
953 pDestination -= (xx - start.x) * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
954 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
955 for(int yy = start.y; yy < stop.y; yy++) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
956 { |
114 | 957 *(__IO uint16_t*)pDestination-- = (image->data[j++] << 8) + color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
958 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
959 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
960 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
961 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
962 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
963 for(int xx = start.x; xx < stop.x; xx++) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
964 { |
114 | 965 pDestination = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
966 pDestination += xx * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
967 pDestination += start.y; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
968 for(int yy = start.y; yy < stop.y; yy++) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
969 { |
114 | 970 *(__IO uint16_t*)pDestination++ = (image->data[j++] << 8) + color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
971 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
972 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
973 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
974 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
975 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
976 |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
977 static void GFX_draw_image_color(GFX_DrawCfgScreen *hgfx, SWindowGimpStyle window, const tImage *image) |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
978 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
979 uint16_t* pDestination; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
980 |
38 | 981 uint32_t j; |
982 point_t start, stop; | |
983 | |
984 start.x = window.left; | |
985 start.y = (hgfx->ImageHeight - image->height - window.top); | |
986 stop.y = start.y + image->height; | |
987 stop.x = start.x + image->width; | |
988 j = 0; | |
989 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
990 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
991 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
992 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
993 if(pSettings->FlipDisplay) |
38 | 994 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
995 for(int xx = start.x; xx < stop.x; xx++) |
38 | 996 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
997 pDestination = (uint16_t*)hgfx->FBStartAdress; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
998 pDestination += (hgfx->ImageHeight - start.y) + (stop.x * hgfx->ImageHeight); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
999 pDestination -= (xx - start.x) * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1000 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1001 for(int yy = start.y; yy < stop.y; yy++) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1002 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1003 *(__IO uint16_t*)pDestination-- = 0xFF << 8 | image->data[j++]; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1004 } |
38 | 1005 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1006 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1007 else |
38 | 1008 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1009 for(int xx = start.x; xx < stop.x; xx++) |
38 | 1010 { |
114 | 1011 pDestination = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1012 pDestination += xx * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1013 pDestination += start.y; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1014 for(int yy = start.y; yy < stop.y; yy++) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1015 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1016 *(__IO uint16_t*)pDestination++ = 0xFF << 8 | image->data[j++]; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1017 } |
38 | 1018 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1019 } |
38 | 1020 } |
1021 | |
1022 | |
1023 /* this is NOT fast nor optimized */ | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
1024 static void GFX_draw_pixel(GFX_DrawCfgScreen *hgfx, int16_t x, int16_t y, uint8_t color) |
38 | 1025 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1026 uint16_t* pDestination; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1027 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1028 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1029 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1030 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1031 pDestination = (uint16_t*)hgfx->FBStartAdress; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1032 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1033 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1034 pDestination += (800 - x) * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1035 pDestination += (480 - y); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1036 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1037 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1038 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1039 pDestination += x * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1040 pDestination += y; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1041 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1042 *(__IO uint16_t*)pDestination = 0xFF << 8 | color; |
38 | 1043 } |
1044 | |
1045 /* this is NOT fast nor optimized */ | |
1046 void GFX_draw_circle(GFX_DrawCfgScreen *hgfx, point_t center, uint8_t radius, int8_t color) | |
1047 { | |
1048 int x, y; | |
1049 int l; | |
1050 int r2, y2; | |
1051 int y2_new; | |
1052 int ty; | |
1053 | |
1054 /* cos pi/4 = 185363 / 2^18 (approx) */ | |
1055 l = (radius * 185363) >> 18; | |
1056 | |
1057 /* hw */ | |
1058 l += 1; | |
1059 | |
1060 /* At x=0, y=radius */ | |
1061 y = radius; | |
1062 | |
1063 r2 = y2 = y * y; | |
1064 ty = (2 * y) - 1; | |
1065 y2_new = r2 + 3; | |
1066 | |
1067 for (x = 0; x <= l; x++) { | |
1068 y2_new -= (2 * x) - 3; | |
1069 | |
1070 if ((y2 - y2_new) >= ty) { | |
1071 y2 -= ty; | |
1072 y -= 1; | |
1073 ty -= 2; | |
1074 } | |
1075 | |
1076 GFX_draw_pixel (hgfx, x + center.x, y + center.y, color); | |
1077 GFX_draw_pixel (hgfx, x + center.x, -y + center.y, color); | |
1078 GFX_draw_pixel (hgfx, -x + center.x, y + center.y, color); | |
1079 GFX_draw_pixel (hgfx, -x + center.x, -y + center.y, color); | |
1080 | |
1081 GFX_draw_pixel (hgfx, y + center.x, x + center.y, color); | |
1082 GFX_draw_pixel (hgfx, y + center.x, -x + center.y, color); | |
1083 GFX_draw_pixel (hgfx, -y + center.x, x + center.y, color); | |
1084 GFX_draw_pixel (hgfx, -y + center.x, -x + center.y, color); | |
1085 } | |
1086 } | |
1087 | |
1088 | |
1089 void GFX_draw_colorline(GFX_DrawCfgScreen *hgfx, point_t start, point_t stop, uint8_t color) | |
1090 { | |
1091 uint32_t pDestination; | |
1092 uint32_t j; | |
1093 uint32_t temp; | |
1094 | |
1095 if(start.x == stop.x) | |
1096 { | |
1097 if(stop.y < start.y) | |
1098 { | |
1099 temp = stop.y; | |
1100 stop.y = start.y; | |
1101 start.y = temp; | |
1102 } | |
1103 pDestination = (uint32_t)hgfx->FBStartAdress; | |
1104 pDestination += start.x * hgfx->ImageHeight * 2; | |
1105 pDestination += start.y * 2; | |
1106 for (j = stop.y - start.y; j > 0; j--) | |
1107 { | |
1108 *(__IO uint8_t*)pDestination = color; | |
1109 pDestination += 1; | |
1110 *(__IO uint8_t*)pDestination = 0xFF; | |
1111 pDestination += 1; | |
1112 } | |
1113 } | |
1114 else | |
1115 if(start.y == stop.y) | |
1116 { | |
1117 if(stop.x < start.x) | |
1118 { | |
1119 temp = stop.x; | |
1120 stop.x = start.x; | |
1121 start.x = temp; | |
1122 } | |
1123 pDestination = (uint32_t)hgfx->FBStartAdress; | |
1124 pDestination += start.x * hgfx->ImageHeight * 2; | |
1125 pDestination += start.y * 2; | |
1126 for (j = stop.x - start.x; j > 0; j--) | |
1127 { | |
1128 *(__IO uint8_t*)pDestination = color; | |
1129 pDestination += 1; | |
1130 *(__IO uint8_t*)pDestination = 0xFF; | |
1131 pDestination -= 1; | |
1132 pDestination += hgfx->ImageHeight * 2; | |
1133 } | |
1134 } | |
1135 else // diagonal Bresenham's_line_algorithm | |
1136 { | |
1137 int x0 = start.x; | |
1138 int y0 = start.y; | |
1139 int x1 = stop.x; | |
1140 int y1 = stop.y; | |
1141 int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; | |
1142 int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; | |
1143 int err = (dx>dy ? dx : -dy)/2, e2; | |
1144 | |
1145 for(;;) | |
1146 { | |
1147 pDestination = (uint32_t)hgfx->FBStartAdress; | |
1148 pDestination += ((x0 * hgfx->ImageHeight) + y0) * 2; | |
1149 *(__IO uint8_t*)pDestination = color; | |
1150 pDestination += 1; | |
1151 *(__IO uint8_t*)pDestination = 0xFF; | |
1152 if (x0==x1 && y0==y1) break; | |
1153 e2 = err; | |
1154 if (e2 >-dx) { err -= dy; x0 += sx; } | |
1155 if (e2 < dy) { err += dx; y0 += sy; } | |
1156 } | |
1157 } | |
1158 } | |
1159 | |
1160 | |
1161 void GFX_draw_Grid(GFX_DrawCfgScreen *hgfx, SWindowGimpStyle window, int vlines, float vdeltaline, int hlines, float hdeltalines, uint8_t color) | |
1162 { | |
1163 point_t p1; | |
1164 point_t p2; | |
1165 int winthight = window.bottom - window.top; | |
1166 int winwidth = window.right - window.left; | |
1167 float deltaline = 0; | |
1168 | |
1169 if(vlines > 0) | |
1170 { | |
1171 deltaline = ((float)winwidth) /vlines; | |
1172 | |
1173 p1.y = 479 - window.top; | |
1174 p2.y = 479 - window.bottom; | |
1175 for(int i = 0; i <= vlines; i++) | |
1176 { | |
1177 p1.x = window.left + (int)(i * deltaline + 0.5f); | |
1178 p2.x = p1.x ; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1179 //GFX_draw_colorline(hgfx, p1,p2, color ); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1180 GFX_draw_line(hgfx, p1,p2, color ); |
38 | 1181 } |
1182 } | |
1183 if(vdeltaline > 0) | |
1184 { | |
1185 p1.y = 479 - window.top; | |
1186 p2.y = 479 - window.bottom; | |
1187 for(int i = 0; i < winwidth/vdeltaline; i++) | |
1188 { | |
1189 p1.x = window.left + (int)(i * vdeltaline + 0.5f); | |
1190 p2.x = p1.x ; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1191 // GFX_draw_colorline(hgfx, p1,p2, color ); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1192 GFX_draw_line(hgfx, p1,p2, color ); |
38 | 1193 } |
1194 } | |
1195 if(hlines > 0) | |
1196 { | |
1197 deltaline = ((float)winthight)/hlines; | |
1198 p1.x = window.left; | |
1199 p2.x = window.right; | |
1200 for(int i = 0; i <= hlines; i++) | |
1201 { | |
1202 p1.y = 479 - window.top - (int)(i * deltaline + 0.5f); | |
1203 p2.y = p1.y; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1204 // GFX_draw_colorline(hgfx, p1,p2, color ); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1205 GFX_draw_line(hgfx, p1,p2, color ); |
38 | 1206 } |
1207 } | |
1208 } | |
1209 | |
1210 // =============================================================================== | |
1211 // GFX_graph_print | |
1212 /// @brief Print all those nice curves, especially in logbook und miniLiveLogGraph | |
1213 /// @version 0.0.2 hw 160519 | |
1214 /// | |
1215 /// 151022 hw -bug fix | |
1216 /// - die aktuelle Version macht keine Linien mehr �ber die gesamte Bildschirmh�he. | |
1217 /// - daf�r sind L�cher in der Kurve (z.B. Temperaturgraph Tauchgang Matthias 17.10.15 15:19) | |
1218 /// | |
1219 /// more details about range can be found in show_logbook_logbook_show_log_page2() - temperature graph | |
1220 /// | |
1221 /// @param window: top and bottom is only the range used by the data of the graph, not the entire screen / scale | |
1222 /// @param drawVeilUntil: ist auff�llen des Bereichs unter der Kurve mit etwas hellerer Farbe | |
1223 /// @param Xdivide: wird bisher nichr benutzt. | |
1224 // =============================================================================== | |
1225 | |
1226 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1227 void GFX_graph_print(GFX_DrawCfgScreen *hgfx, const SWindowGimpStyle *window, const int16_t drawVeilUntil, uint8_t Xdivide, uint16_t dataMin, uint16_t dataMax, uint16_t *data, uint16_t datalength, uint8_t color, uint8_t *colour_data) |
38 | 1228 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1229 uint16_t* pDestination_tmp; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1230 uint16_t* pDestination_start; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1231 uint16_t* pDestination_end; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1232 uint16_t* pDestination_zero_veil; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1233 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1234 SSettings* pSettings; |
38 | 1235 |
1236 uint32_t max = 0; | |
1237 int windowheight = -1; | |
1238 int windowwidth = -1; | |
1239 int i = -1; | |
1240 int w1 = -1; | |
1241 int w2 = -1; | |
1242 | |
1243 uint32_t h_ulong = 0; | |
1244 uint32_t h_ulong_old = 0; | |
1245 _Bool invert = 0; | |
1246 | |
1247 uint16_t dataDelta = 0; | |
1248 uint16_t dataDeltaHalve = 0; | |
1249 uint16_t dataTemp = 0; | |
1250 | |
1251 uint8_t colorDataTemp; | |
1252 uint8_t colormask = 0; | |
1253 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1254 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1255 pDestination_zero_veil = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1256 |
38 | 1257 if(dataMin > dataMax) |
1258 { | |
1259 uint16_t dataFlip; | |
1260 dataFlip = dataMin; | |
1261 dataMin = dataMax; | |
1262 dataMax = dataFlip; | |
1263 invert = 1; | |
1264 } | |
1265 else | |
1266 invert = 0; | |
1267 | |
1268 colormask = color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1269 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1270 pSettings = settingsGetPointer(); |
38 | 1271 |
1272 if(window->bottom > 479) | |
1273 return; | |
1274 if(window->top > 479) | |
1275 return; | |
1276 if(window->right > 799) | |
1277 return; | |
1278 if(window->left > 799) | |
1279 return; | |
1280 if(window->bottom < 0) | |
1281 return; | |
1282 if(window->top < 0) | |
1283 return; | |
1284 if(window->right < 0) | |
1285 return; | |
1286 if(window->left < 0) | |
1287 return; | |
1288 if(window->bottom <= window->top) | |
1289 return; | |
1290 if(window->right <= window->left) | |
1291 return; | |
1292 | |
1293 windowheight = window->bottom - window->top ; | |
1294 windowwidth = window->right - window->left; | |
1295 w1 = 0; | |
1296 w2 = 0; | |
1297 if(dataMax == dataMin) | |
1298 dataMax++; | |
1299 dataDelta = (unsigned long)(dataMax - dataMin); | |
1300 dataDeltaHalve = dataDelta / 2; | |
296
87f83879cecb
Possible bugfix: do not use bitwise and (&)
Jan Mulder <jlmulder@xs4all.nl>
parents:
121
diff
changeset
|
1301 while((w1 <= windowwidth) && (w2 < datalength)) |
38 | 1302 { |
1303 int tmp = (10 * w1 * (long)datalength)/windowwidth; | |
1304 w2 = tmp/10; | |
1305 int rest = tmp - w2*10; | |
1306 if(rest >= 5) | |
1307 w2++; | |
1308 | |
1309 if((datalength - 1) < w2) | |
1310 w2 = datalength-1; | |
1311 | |
1312 if(colour_data != NULL) | |
1313 { | |
1314 colorDataTemp = colour_data[w2]; | |
1315 colormask = color + colorDataTemp; | |
1316 } | |
1317 | |
1318 dataTemp = data[w2]; | |
1319 if(Xdivide > 1) | |
1320 { | |
1321 w2++; | |
1322 for(i=1;i<Xdivide;i++) | |
1323 { | |
1324 if(data[w2]>dataTemp) | |
1325 dataTemp = data[w2]; | |
1326 w2++; | |
1327 } | |
1328 } | |
1329 | |
1330 if(dataTemp > dataMin) | |
1331 dataTemp -= dataMin; | |
1332 else | |
1333 dataTemp = 0; | |
1334 | |
1335 if(invert) | |
1336 { | |
1337 if(dataTemp < dataDelta) | |
1338 dataTemp = dataDelta - dataTemp; | |
1339 else | |
1340 dataTemp = 0; | |
1341 } | |
1342 | |
1343 h_ulong = (unsigned long)dataTemp; | |
1344 h_ulong *= windowheight; | |
1345 h_ulong += dataDeltaHalve; | |
1346 h_ulong /= dataDelta; | |
1347 | |
1348 if(h_ulong > (window->bottom - window->top)) | |
1349 h_ulong = (window->bottom - window->top); | |
1350 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1351 if(!pSettings->FlipDisplay) |
38 | 1352 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1353 if(drawVeilUntil > 0) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1354 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1355 pDestination_zero_veil = (uint16_t*)hgfx->FBStartAdress; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1356 pDestination_zero_veil += ((479 - (drawVeilUntil - 2) ) + ((w1 + window->left) * hgfx->ImageHeight) ); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1357 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1358 else if(drawVeilUntil < 0 ) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1359 { |
114 | 1360 pDestination_zero_veil = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1361 pDestination_zero_veil += ((479 + (drawVeilUntil)) + ((w1 + window->left) * hgfx->ImageHeight) ); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1362 } |
38 | 1363 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1364 else |
38 | 1365 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1366 if(drawVeilUntil > 0) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1367 { |
114 | 1368 pDestination_zero_veil = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1369 pDestination_zero_veil += (((drawVeilUntil) ) + ( (window->right - w1) * hgfx->ImageHeight) ); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1370 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1371 else if(drawVeilUntil < 0 ) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1372 { |
114 | 1373 pDestination_zero_veil = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1374 pDestination_zero_veil += 479 - drawVeilUntil + ( (window->right - w1 -1) * hgfx->ImageHeight); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1375 } |
38 | 1376 } |
1377 if(h_ulong + window->top > max) | |
1378 { | |
1379 max = h_ulong + window->top; | |
1380 } | |
1381 | |
1382 // hw 160519 wof�r ist das? Damit funktioniert Temperatur 25,5�C nicht! | |
1383 // if((dataMax == 255) || (data[w2] != 255)) | |
1384 // { | |
1385 //output_content[pointer] = colormask; | |
1386 //output_mask[pointer] = true; | |
593
3a6f922b73ea
Added PrintGraph option to skip invalid data entries:
Ideenmodellierer
parents:
583
diff
changeset
|
1387 if(dataTemp != 0xFFFF) /* do not draw invalid data pixels */ |
3a6f922b73ea
Added PrintGraph option to skip invalid data entries:
Ideenmodellierer
parents:
583
diff
changeset
|
1388 { |
38 | 1389 if(w1 > 0) |
1390 { | |
114 | 1391 pDestination_start = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1392 if(!pSettings->FlipDisplay) |
38 | 1393 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1394 pDestination_start += (((479 - (window->top)) + ((w1 + window->left) * hgfx->ImageHeight))); |
38 | 1395 } |
1396 else | |
1397 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1398 pDestination_start += (((window->top) + ((window->right - w1) * hgfx->ImageHeight))); |
38 | 1399 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1400 pDestination_end = pDestination_start; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1401 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1402 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1403 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1404 if(h_ulong >= h_ulong_old) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1405 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1406 pDestination_start -= h_ulong_old; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1407 pDestination_end -= h_ulong; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1408 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1409 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1410 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1411 pDestination_start -= h_ulong; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1412 pDestination_end -= h_ulong_old; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1413 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1414 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1415 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1416 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1417 if(h_ulong < h_ulong_old) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1418 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1419 pDestination_start += h_ulong_old; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1420 pDestination_end += h_ulong; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1421 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1422 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1423 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1424 pDestination_start += h_ulong; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1425 pDestination_end += h_ulong_old; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1426 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1427 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1428 |
38 | 1429 |
1430 // deco stops | |
1431 if(drawVeilUntil < 0) | |
1432 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1433 if(!pSettings->FlipDisplay) |
38 | 1434 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1435 pDestination_tmp = pDestination_end; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1436 while(pDestination_tmp <= pDestination_zero_veil) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1437 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1438 *(__IO uint16_t*)pDestination_tmp = (0x80 << 8) | colormask; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1439 pDestination_tmp++; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1440 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1441 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1442 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1443 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1444 pDestination_tmp = pDestination_zero_veil; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1445 while(pDestination_tmp <= pDestination_end) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1446 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1447 *(__IO uint16_t*)pDestination_tmp = (0x80 << 8) | colormask; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1448 pDestination_tmp++; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1449 } |
38 | 1450 } |
1451 } | |
1452 else | |
1453 { | |
1454 // regular graph with veil underneath if requested | |
1455 // von oben nach unten | |
1456 // von grossen pDestination Werten zu kleinen pDestination Werten | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1457 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1458 pDestination_tmp = pDestination_start; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1459 while(pDestination_tmp >= pDestination_end) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1460 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1461 *(__IO uint16_t*)pDestination_tmp = (0xFF << 8) | colormask ; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1462 pDestination_tmp--; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1463 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1464 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1465 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1466 if(!pSettings->FlipDisplay) |
38 | 1467 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1468 while((drawVeilUntil > 0) && (pDestination_tmp >= pDestination_zero_veil)) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1469 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1470 *(__IO uint16_t*)pDestination_tmp = (0x20 << 8) | colormask ; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1471 pDestination_tmp--; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1472 } |
38 | 1473 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1474 else |
38 | 1475 { |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1476 pDestination_tmp = pDestination_start; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1477 while((drawVeilUntil > 0) && (pDestination_tmp <= pDestination_zero_veil)) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1478 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1479 *(__IO uint16_t*)pDestination_tmp = (0x20 << 8) | colormask ; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1480 pDestination_tmp++; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1481 } |
38 | 1482 } |
1483 } | |
1484 } | |
1485 h_ulong_old = h_ulong; | |
593
3a6f922b73ea
Added PrintGraph option to skip invalid data entries:
Ideenmodellierer
parents:
583
diff
changeset
|
1486 } |
38 | 1487 w1++; |
1488 w2++; | |
1489 } | |
1490 } | |
1491 | |
1492 | |
1493 void GFX_draw_header(GFX_DrawCfgScreen *hgfx, uint8_t colorId) | |
1494 { | |
1495 uint32_t pDestination; | |
1496 point_t start, stop, now; | |
1497 uint8_t alpha; | |
1498 | |
1499 /* display coordinate system */ | |
1500 start.y = 400; | |
1501 stop.y = 479; | |
1502 | |
1503 start.x = 0; | |
1504 stop.x = 799; | |
1505 | |
1506 now.y = start.y; | |
1507 now.x = start.x; | |
1508 | |
1509 while (now.x <= stop.x) | |
1510 { | |
1511 now.y = start.y; | |
1512 pDestination = (uint32_t)hgfx->FBStartAdress; | |
1513 pDestination += now.x * hgfx->ImageHeight * 2; | |
1514 pDestination += now.y * 2; | |
1515 now.x += 1; | |
1516 | |
1517 alpha = 27; | |
1518 while(alpha < 246) | |
1519 { | |
1520 alpha += 9; | |
1521 *(__IO uint8_t*)pDestination = colorId; | |
1522 pDestination += 1; | |
1523 *(__IO uint8_t*)pDestination = alpha; | |
1524 pDestination += 1; | |
1525 now.y += 1; | |
1526 } | |
1527 | |
1528 while(now.y <= stop.y) | |
1529 { | |
1530 *(__IO uint8_t*)pDestination = colorId; | |
1531 pDestination += 1; | |
1532 *(__IO uint8_t*)pDestination = 0xFF; | |
1533 pDestination += 1; | |
1534 now.y += 1; | |
1535 } | |
1536 } | |
1537 } | |
1538 | |
1539 void GFX_draw_box2(GFX_DrawCfgScreen *hgfx, point_t start, point_t stop, uint8_t color, uint8_t roundCorners) | |
1540 { | |
1541 point_t point2, point4; | |
1542 | |
1543 if(roundCorners) | |
1544 { | |
1545 point2.x = stop.x - start.x; | |
1546 point2.y = stop.y - start.y; | |
1547 GFX_draw_box(hgfx,start,point2,1,color); | |
1548 } | |
1549 else | |
1550 { | |
1551 point2.x = stop.x; | |
1552 point2.y = start.y; | |
1553 | |
1554 point4.x = start.x; | |
1555 point4.y = stop.y; | |
1556 | |
1557 GFX_draw_line(hgfx,start,point2,color); | |
1558 GFX_draw_line(hgfx,point2,stop,color); | |
1559 GFX_draw_line(hgfx,stop,point4,color); | |
1560 GFX_draw_line(hgfx,point4,start,color); | |
1561 } | |
1562 } | |
1563 | |
1564 void GFX_draw_box(GFX_DrawCfgScreen *hgfx, point_t LeftLow, point_t WidthHeight, uint8_t Style, uint8_t color) | |
1565 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1566 uint16_t* pDestination; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1567 uint16_t* pStart; |
38 | 1568 uint32_t j; |
1569 uint32_t lineWidth, lineHeight; | |
1570 int x, y; | |
1571 uint8_t intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1572 int stepdir; |
38 | 1573 |
1574 typedef struct { | |
1575 int x; | |
1576 int y; | |
1577 uint8_t intensity; | |
1578 } corner_t; | |
1579 const corner_t corner[16] = { | |
1580 {3,3,255}, // nur einmal | |
1581 {9,0,242}, | |
1582 {8,0,194}, | |
1583 {7,0,115}, | |
1584 {6,0,36}, | |
1585 {9,1,33}, | |
1586 {8,1,84}, | |
1587 {7,1,161}, | |
1588 {6,1,255}, | |
1589 {5,1,242}, | |
1590 {4,1,36}, | |
1591 {6,2,33}, | |
1592 {5,2,84}, | |
1593 {4,2,255}, | |
1594 {3,2,84}, | |
1595 {4,3,110} | |
1596 }; | |
1597 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1598 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1599 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1600 |
38 | 1601 lineWidth = WidthHeight.x; |
1602 lineHeight = WidthHeight.y; | |
114 | 1603 pStart = (uint16_t*)hgfx->FBStartAdress; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1604 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1605 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1606 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1607 pStart += LeftLow.x * hgfx->ImageHeight; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1608 pStart += LeftLow.y; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1609 stepdir = 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1610 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1611 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1612 { |
622 | 1613 pStart += (799 - LeftLow.x) * hgfx->ImageHeight; |
1614 pStart += (479 - LeftLow.y); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1615 stepdir = -1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1616 } |
38 | 1617 |
1618 // Untere Linie | |
1619 pDestination = pStart; | |
1620 if(Style) | |
1621 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1622 pDestination += stepdir * 10 * hgfx->ImageHeight; |
38 | 1623 lineWidth -= 18; |
1624 } | |
1625 for (j = lineWidth; j > 0; j--) | |
1626 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1627 |
38 | 1628 *(__IO uint16_t*)pDestination = 0xFF00 + color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1629 pDestination += stepdir * hgfx->ImageHeight; |
38 | 1630 } |
1631 | |
1632 // Obere Linie | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1633 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1634 pDestination = pStart + stepdir * WidthHeight.y; |
38 | 1635 if(Style) |
1636 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1637 pDestination += stepdir * 10 * hgfx->ImageHeight; |
38 | 1638 } |
1639 | |
1640 for (j = lineWidth; j > 0; j--) | |
1641 { | |
1642 *(__IO uint16_t*)pDestination = 0xFF00 + color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1643 pDestination += stepdir * hgfx->ImageHeight; |
38 | 1644 } |
1645 | |
1646 // Linke Linie | |
1647 pDestination = pStart; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1648 |
38 | 1649 if(Style) |
1650 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1651 pDestination += stepdir * 10; |
38 | 1652 lineHeight -= 18; |
1653 } | |
1654 | |
1655 for (j = lineHeight; j > 0; j--) | |
1656 { | |
1657 *(__IO uint16_t*)pDestination = 0xFF00 + color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1658 pDestination += stepdir; |
38 | 1659 } |
1660 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1661 |
38 | 1662 // Rechte Linie |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1663 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1664 pDestination = pStart + stepdir * WidthHeight.x * hgfx->ImageHeight; |
38 | 1665 if(Style) |
1666 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1667 pDestination += stepdir * 10; |
38 | 1668 } |
1669 | |
1670 for (j = lineHeight; j > 0; j--) | |
1671 { | |
1672 *(__IO uint16_t*)pDestination = 0xFF00 + color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1673 pDestination += stepdir; |
38 | 1674 } |
1675 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1676 |
38 | 1677 // Ecken wenn notwendig == Style |
1678 if(Style) | |
1679 { | |
1680 // links unten | |
1681 pDestination = pStart; | |
1682 x = corner[0].x; | |
1683 y = corner[0].y; | |
1684 intensity = corner[0].intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1685 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1686 *(__IO uint16_t*)(pDestination + stepdir * (y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; |
38 | 1687 |
1688 for(j = 15; j > 0; j--) | |
1689 { | |
1690 x = corner[j].x; | |
1691 y = corner[j].y; | |
1692 intensity = corner[j].intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1693 *(__IO uint16_t*)(pDestination + stepdir * (y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1694 *(__IO uint16_t*)(pDestination + stepdir * (x + (y * hgfx->ImageHeight))) = (intensity << 8) + color; |
38 | 1695 } |
1696 // links oben | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1697 pDestination = pStart + stepdir * WidthHeight.y; |
38 | 1698 x = corner[0].x; |
1699 y = corner[0].y; | |
1700 intensity = corner[0].intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1701 *(__IO uint16_t*)(pDestination + stepdir * (-y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; |
38 | 1702 |
1703 for(j = 15; j > 0; j--) | |
1704 { | |
1705 x = corner[j].x; | |
1706 y = corner[j].y; | |
1707 intensity = corner[j].intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1708 *(__IO uint16_t*)(pDestination + stepdir * (-y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1709 *(__IO uint16_t*)(pDestination + stepdir * (-x + (y * hgfx->ImageHeight))) = (intensity << 8) + color; |
38 | 1710 } |
1711 // rechts unten | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1712 pDestination = pStart + stepdir * WidthHeight.x * hgfx->ImageHeight; |
38 | 1713 x = corner[0].x; |
1714 y = corner[0].y; | |
1715 intensity = corner[0].intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1716 *(__IO uint16_t*)(pDestination + stepdir * (y - (x * hgfx->ImageHeight))) = (intensity << 8) + color; |
38 | 1717 |
1718 for(j = 15; j > 0; j--) | |
1719 { | |
1720 x = corner[j].x; | |
1721 y = corner[j].y; | |
1722 intensity = corner[j].intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1723 *(__IO uint16_t*)(pDestination + stepdir * (y - (x * hgfx->ImageHeight))) = (intensity << 8) + color; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1724 *(__IO uint16_t*)(pDestination + stepdir * (x - (y * hgfx->ImageHeight))) = (intensity << 8) + color; |
38 | 1725 } |
1726 // rechts oben | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1727 pDestination = pStart + stepdir * WidthHeight.y + stepdir * WidthHeight.x * hgfx->ImageHeight; |
38 | 1728 x = corner[0].x; |
1729 y = corner[0].y; | |
1730 intensity = corner[0].intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1731 *(__IO uint16_t*)(pDestination + stepdir * -1 * (y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; |
38 | 1732 |
1733 for(j = 15; j > 0; j--) | |
1734 { | |
1735 x = corner[j].x; | |
1736 y = corner[j].y; | |
1737 intensity = corner[j].intensity; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1738 *(__IO uint16_t*)(pDestination + stepdir * -1 * (y + (x * hgfx->ImageHeight))) = (intensity << 8) + color; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1739 *(__IO uint16_t*)(pDestination + stepdir * -1 * (x + (y * hgfx->ImageHeight))) = (intensity << 8) + color; |
38 | 1740 } |
1741 } | |
1742 } | |
1743 | |
1744 | |
1745 /** | |
1746 ****************************************************************************** | |
1747 * @brief GFX write label. / Write string with defined color | |
1748 * @author heinrichs weikamp gmbh | |
1749 * @version V0.0.1 | |
1750 * @date 07-July-2014 | |
1751 ****************************************************************************** | |
1752 * | |
1753 * @param hgfx: check gfx_engine.h. | |
1754 * @param color: 16bit Alpha+CLUT. | |
1755 * @retval None | |
1756 */ | |
1757 | |
1758 uint32_t GFX_write_label(const tFont *Font, GFX_DrawCfgWindow* hgfx, const char *pText, uint8_t color) | |
1759 { | |
1760 return GFX_write_string_color(Font, hgfx, pText, 0, color); | |
1761 } | |
1762 | |
1763 | |
1764 /** | |
1765 ****************************************************************************** | |
1766 * @brief GFX writeGfx_write_label_varstring. / Write string with all parameters and font color options | |
1767 * @author Peter Ryser | |
1768 * @version V0.0.1 | |
1769 * @date 22-April-2014 | |
1770 ****************************************************************************** | |
1771 * | |
1772 * @param XleftGimpStyle: | |
1773 * @param XrightGimpStyle: | |
1774 * @param YtopGimpStyle: | |
1775 * @param color: | |
1776 * @param tFont: | |
1777 * @param text: text to be printed | |
1778 * @retval None | |
1779 */ | |
1780 | |
1781 void Gfx_write_label_var(GFX_DrawCfgScreen *screenInput, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const uint8_t color, const char *text) | |
1782 { | |
1783 | |
1784 GFX_DrawCfgWindow hgfx; | |
1785 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1786 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1787 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1788 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1789 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1790 |
38 | 1791 if(XrightGimpStyle > 799) |
1792 XrightGimpStyle = 799; | |
1793 if(XleftGimpStyle >= XrightGimpStyle) | |
1794 XleftGimpStyle = 0; | |
1795 if(YtopGimpStyle > 479) | |
1796 YtopGimpStyle = 479; | |
1797 hgfx.Image = screenInput; | |
1798 hgfx.WindowNumberOfTextLines = 1; | |
1799 hgfx.WindowLineSpacing = 0; | |
1800 hgfx.WindowTab = 0; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1801 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1802 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1803 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1804 hgfx.WindowX0 = XleftGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1805 hgfx.WindowX1 = XrightGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1806 hgfx.WindowY1 = 479 - YtopGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1807 if(hgfx.WindowY1 < Font->height) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1808 hgfx.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1809 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1810 hgfx.WindowY0 = hgfx.WindowY1 - Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1811 } |
38 | 1812 else |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1813 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1814 hgfx.WindowX0 = 800 - XrightGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1815 hgfx.WindowX1 = 800 - XleftGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1816 hgfx.WindowY0 = YtopGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1817 if(hgfx.WindowY0 + Font->height > 480) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1818 hgfx.WindowY1 = 480; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1819 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1820 hgfx.WindowY1 = hgfx.WindowY0 + Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1821 } |
38 | 1822 GFX_write_label(Font, &hgfx, text, color); |
1823 } | |
1824 | |
1825 /** | |
1826 ****************************************************************************** | |
1827 * @brief GFX write string. / Write string with all parameters and font options | |
1828 * @author heinrichs weikamp gmbh | |
1829 * @version V0.0.1 | |
1830 * @date 22-April-2014 | |
1831 ****************************************************************************** | |
1832 * | |
1833 * @param hgfx: check gfx_engine.h. | |
1834 * @param color: 32bit ARGB8888. | |
1835 * @retval None | |
1836 */ | |
1837 | |
1838 uint16_t GFX_return_offset(const tFont *Font, char *pText, uint8_t position) | |
1839 { | |
1840 char character; | |
1841 uint16_t digit, i; | |
1842 uint8_t found; | |
1843 uint16_t distance; | |
1844 | |
1845 if(position == 0) | |
1846 return 0; | |
1847 | |
1848 distance = 0; | |
1849 for(digit = 0; digit < position; digit++) | |
1850 { | |
1851 character = pText[digit]; | |
1852 if(character == 0) | |
1853 return 0; | |
1854 | |
1855 found = 0; | |
1856 for(i=0;i<Font->length;i++) | |
1857 { | |
1858 if(Font->chars[i].code == character) | |
1859 { | |
1860 found = 1; | |
1861 break; | |
1862 } | |
1863 } | |
1864 if(found) | |
1865 { | |
1866 distance += (uint16_t)(Font->chars[i].image->width); | |
1867 if(Font == &FontT144) | |
1868 distance += 3; | |
1869 else | |
1870 if(Font == &FontT105) | |
1871 distance += 2; | |
1872 } | |
1873 } | |
1874 return distance; | |
1875 | |
1876 /* FEHLT: | |
1877 if(*pText < ' ') | |
1878 if((*pText) & 0x80) | |
1879 | |
1880 if(((tFont *)settings.font == &FontT105) && settings.dualFont && ((*pText == '.') || (*pText == ':'))) | |
1881 settings.font = (uint32_t)&FontT54; | |
1882 */ | |
1883 } | |
1884 | |
1885 void GFX_clean_line(GFX_DrawCfgWindow* hgfx, uint32_t line_number) | |
1886 { | |
1887 uint16_t height; | |
1888 uint32_t pDestination, i, j; | |
1889 uint16_t left, width, bottom, nextlineStep; | |
1890 | |
1891 bottom = hgfx->WindowY0; | |
1892 | |
1893 if(hgfx->WindowNumberOfTextLines && line_number && (line_number <= hgfx->WindowNumberOfTextLines)) | |
1894 { | |
1895 bottom += hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); | |
1896 height = hgfx->WindowLineSpacing; | |
1897 } | |
1898 else | |
1899 { | |
1900 height = 1 + hgfx->WindowY1 - bottom; | |
1901 } | |
1902 | |
1903 pDestination = (uint32_t)hgfx->Image->FBStartAdress; | |
1904 | |
1905 left = hgfx->WindowX0; | |
1906 width = 1 + hgfx->WindowX1 - left; | |
1907 nextlineStep = hgfx->Image->ImageHeight - height; | |
1908 nextlineStep *= 2; | |
1909 pDestination += 2 * bottom; | |
1910 pDestination += 2 * hgfx->Image->ImageHeight * left; | |
1911 | |
1912 for(j = width; j > 0; j--) | |
1913 { | |
1914 for(i = height; i > 0; i--) | |
1915 { | |
1916 *(__IO uint16_t*)pDestination = 0; | |
1917 pDestination += 2; | |
1918 } | |
1919 pDestination += nextlineStep; | |
1920 } | |
1921 } | |
1922 | |
1923 | |
1924 void GFX_clean_area(GFX_DrawCfgScreen *tMscreen, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, uint16_t YBottomGimpStyle) | |
1925 { | |
1926 uint16_t height; | |
1927 uint32_t pDestination, i, j; | |
1928 int32_t left, width, bottom, nextlineStep; | |
1929 | |
1930 bottom = tMscreen->ImageHeight - YBottomGimpStyle; | |
1931 height = 1 + YBottomGimpStyle - YtopGimpStyle; | |
1932 | |
1933 if(bottom < 0) | |
1934 bottom = 0; | |
1935 if(height > tMscreen->ImageHeight) | |
1936 height = tMscreen->ImageHeight; | |
1937 | |
1938 pDestination = tMscreen->FBStartAdress; | |
1939 | |
1940 left = XleftGimpStyle; | |
1941 width = 1 + XrightGimpStyle - left; | |
1942 if(width < 1) | |
1943 width = 1; | |
1944 | |
1945 if(width > tMscreen->ImageWidth) | |
1946 width = tMscreen->ImageWidth; | |
1947 | |
1948 nextlineStep = tMscreen->ImageHeight - height; | |
1949 nextlineStep *= 2; | |
1950 pDestination += 2 * bottom; | |
1951 pDestination += 2 * tMscreen->ImageHeight * left; | |
1952 | |
1953 for(j = width; j > 0; j--) | |
1954 { | |
1955 for(i = height; i > 0; i--) | |
1956 { | |
1957 *(__IO uint16_t*)pDestination = 0; | |
1958 pDestination += 2; | |
1959 } | |
1960 pDestination += nextlineStep; | |
1961 } | |
1962 } | |
1963 | |
1964 | |
1965 uint32_t GFX_write_string(const tFont *Font, GFX_DrawCfgWindow* hgfx, const char *pText, uint32_t line_number) | |
1966 { | |
1967 return GFX_write_string_color(Font, hgfx, pText, line_number, 0); | |
1968 } | |
1969 | |
1970 uint32_t GFX_write_string_color(const tFont *Font, GFX_DrawCfgWindow* hgfx, const char *pText, uint32_t line_number, uint8_t color) | |
1971 { | |
1972 if(hgfx->Image->FBStartAdress < FBGlobalStart) | |
1973 return 0; | |
1974 | |
1975 GFX_CfgWriteString settings; | |
1976 uint32_t newXdelta; | |
1977 uint8_t minimal = 0; | |
1978 // uint32_t try_again; | |
1979 | |
1980 if(hgfx->WindowNumberOfTextLines && line_number && (line_number <= hgfx->WindowNumberOfTextLines)) | |
1981 { | |
1982 settings.Ydelta = hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); | |
1983 } | |
1984 else | |
1985 { | |
1986 settings.Ydelta = 0; | |
1987 } | |
1988 settings.font = (uint32_t)Font; | |
1989 settings.Xdelta = 0; | |
1990 settings.color = color; | |
1991 settings.invert = 0; | |
1992 settings.resize = 0; | |
1993 settings.dualFont = 0; | |
1994 settings.spaceMode = 0; | |
1995 settings.singleSpaceWithSizeOfNextChar = 0; | |
1996 settings.useTinyFont = 0; | |
1997 settings.TinyFontExtraYdelta = 0; | |
1998 settings.TinyFont = (uint32_t)Font; | |
1999 settings.doubleSize = 0; | |
2000 | |
2001 if((*pText) == TXT_MINIMAL) // for customtext and anything with Sonderzeichen | |
2002 minimal = 1; | |
2003 else | |
2004 minimal = 0; | |
2005 | |
2006 if(Font == &FontT144) | |
2007 settings.TinyFont = (uint32_t)&FontT84; | |
2008 else | |
2009 if(Font == &FontT105) | |
2010 settings.TinyFont = (uint32_t)&FontT54; | |
2011 else | |
2012 if(Font == &FontT54) | |
2013 { | |
2014 settings.TinyFont = (uint32_t)&FontT48; | |
2015 settings.TinyFontExtraYdelta = -9; | |
2016 } | |
2017 else | |
2018 if(Font == &FontT48) | |
2019 { | |
2020 settings.TinyFont = (uint32_t)&FontT24; | |
2021 settings.TinyFontExtraYdelta = 6; | |
2022 } | |
2023 else | |
2024 if(Font == &FontT42) | |
2025 { | |
2026 settings.TinyFont = (uint32_t)&FontT24; | |
2027 settings.TinyFontExtraYdelta = 2; | |
2028 } | |
2029 | |
2030 settings.actualFont = (tFont *)settings.font; | |
2031 | |
2032 while ((*pText != 0) && (settings.Xdelta != 0x0000FFFF))// und fehlend: Abfrage window / image size | |
2033 { | |
2034 // try_again = 0; | |
2035 | |
2036 if((*pText == '\177') && !minimal) | |
2037 { | |
2038 if(settings.singleSpaceWithSizeOfNextChar) | |
2039 { | |
2040 settings.singleSpaceWithSizeOfNextChar = 0; | |
2041 pText++; | |
2042 settings.Xdelta += *pText; | |
2043 } | |
2044 else | |
2045 settings.singleSpaceWithSizeOfNextChar = 1; | |
2046 } | |
2047 else | |
2048 if(*pText < ' ') | |
2049 { | |
2050 /* Xdelta -inline- changes */ | |
2051 if((*pText == '\t') && !minimal) | |
2052 settings.Xdelta = hgfx->WindowTab - hgfx->WindowX0; | |
2053 else | |
2054 if(*pText == '\r') // carriage return, no newline | |
2055 settings.Xdelta = 0; | |
2056 else | |
537
0ad0b26ec56b
Added center / right alignment option to custom text display:
Ideenmodellierer
parents:
509
diff
changeset
|
2057 if((*pText == '\001')) // center |
38 | 2058 settings.Xdelta = GFX_write__Modify_Xdelta__Centered(&settings, hgfx, pText+1); |
2059 else | |
537
0ad0b26ec56b
Added center / right alignment option to custom text display:
Ideenmodellierer
parents:
509
diff
changeset
|
2060 if((*pText == '\002')) // right |
38 | 2061 settings.Xdelta = GFX_write__Modify_Xdelta__RightAlign(&settings, hgfx, pText+1); |
2062 else | |
2063 if((*pText == '\003') && !minimal) // doubleSize | |
2064 settings.doubleSize = 1; | |
2065 else | |
2066 /* Xdelta -up/down changes */ | |
2067 if((*pText == '\f') && !minimal) // form feed = top align | |
2068 { | |
2069 if((hgfx->WindowY1 - hgfx->WindowY0) >= ((tFont *)settings.font)->height) | |
2070 { | |
2071 settings.Ydelta = hgfx->WindowY1 - hgfx->WindowY0; | |
2072 settings.Ydelta -= ((tFont *)settings.font)->height; | |
2073 } | |
2074 } | |
2075 else | |
2076 if(*pText == '\n') // newline, no carriage return | |
2077 { | |
2078 if(hgfx->WindowNumberOfTextLines && (line_number < hgfx->WindowNumberOfTextLines)) | |
2079 { | |
2080 line_number++; | |
2081 settings.Ydelta = hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); | |
2082 } | |
2083 } | |
2084 else | |
2085 /* Font style changes */ | |
2086 if(*pText == '\a') | |
2087 settings.invert = 1; | |
2088 else | |
2089 if((*pText == '\016') && !minimal) | |
2090 { | |
2091 if(settings.dualFont == 0) | |
2092 settings.dualFont = 1; | |
2093 else | |
2094 settings.actualFont = (tFont *)settings.TinyFont; | |
2095 } | |
2096 else | |
2097 if((*pText == '\017') && !minimal) | |
2098 { | |
2099 settings.dualFont = 0; | |
2100 settings.actualFont = (tFont *)settings.font; | |
2101 } | |
2102 else | |
2103 if((*pText == '\005') && !minimal) | |
2104 { | |
2105 newXdelta = GFX_write_char(hgfx, &settings, 'a', (tFont *)&Awe48); | |
2106 settings.Xdelta = newXdelta; | |
2107 } | |
2108 else | |
2109 if((*pText == '\006') && !minimal) | |
2110 { | |
2111 newXdelta = GFX_write_char(hgfx, &settings, 'b', (tFont *)&Awe48); | |
2112 settings.Xdelta = newXdelta; | |
2113 } | |
2114 else | |
2115 if((*pText >= '\020') && (*pText <= '\032') && !minimal) | |
2116 settings.color = *pText - '\020'; | |
2117 else | |
2118 if((*pText == '\034') && !minimal) | |
2119 settings.spaceMode = 1; | |
2120 else | |
2121 if((*pText == '\035') && !minimal) | |
2122 settings.spaceMode = 0; | |
2123 } | |
2124 else | |
2125 if(((*pText) == TXT_2BYTE) && !minimal) | |
2126 { | |
2127 pText++; | |
2128 settings.Xdelta = GFX_write_substring(&settings, hgfx, (uint8_t)TXT_2BYTE, (int8_t)*pText); | |
2129 } | |
2130 else | |
2131 if(((*pText) & 0x80) && !minimal) | |
2132 settings.Xdelta = GFX_write_substring(&settings, hgfx, (uint8_t)*pText, 0); | |
2133 else | |
2134 if(!settings.invert && (*pText == ' ')) | |
2135 { | |
2136 if(settings.spaceMode == 0) | |
2137 settings.Xdelta += ((tFont *)settings.font)->spacesize; | |
2138 else | |
2139 settings.Xdelta += ((tFont *)settings.font)->spacesize2Monospaced; | |
2140 } | |
2141 else | |
2142 if((settings.spaceMode == 1) && (*pText == ' ')) | |
2143 settings.Xdelta += ((tFont *)settings.font)->spacesize2Monospaced; | |
2144 else | |
2145 { | |
2146 if(((tFont *)settings.font == &FontT144) && ((*pText == '.') || (*pText == ':'))) | |
2147 settings.actualFont = (tFont *)settings.TinyFont; | |
2148 else | |
2149 if(((tFont *)settings.font == &FontT105) && settings.dualFont && ((*pText == '.') || (*pText == ':'))) | |
2150 settings.actualFont = (tFont *)settings.TinyFont; | |
2151 | |
2152 if(settings.actualFont == (tFont *)settings.TinyFont) | |
2153 settings.Ydelta += settings.TinyFontExtraYdelta; | |
2154 | |
2155 newXdelta = GFX_write_char(hgfx, &settings, *(uint8_t *)pText, settings.actualFont); | |
2156 settings.Xdelta = newXdelta; | |
2157 | |
2158 if(settings.actualFont == (tFont *)settings.TinyFont) | |
2159 settings.Ydelta -= settings.TinyFontExtraYdelta; | |
2160 } | |
2161 if(pText != 0) /* for TXT_2BYTE */ | |
2162 pText++; | |
2163 } | |
2164 return settings.Ydelta; | |
2165 } | |
2166 | |
2167 /* Private functions ---------------------------------------------------------*/ | |
2168 /****************************************************************************** | |
2169 Static Function | |
2170 *******************************************************************************/ | |
2171 | |
2172 /** | |
2173 ****************************************************************************** | |
2174 * @brief GFX write substring. / Write string without parameters | |
2175 * @author heinrichs weikamp gmbh | |
2176 * @version V0.0.1 | |
2177 * @date 22-April-2014 | |
2178 ****************************************************************************** | |
2179 * | |
2180 * @param hgfx: check gfx_engine.h. | |
2181 * @param color: 32bit ARGB8888. | |
2182 * @retval None | |
2183 */ | |
2184 | |
2185 static uint32_t GFX_write_substring(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, uint8_t textId, int8_t nextCharFor2Byte) | |
2186 { | |
2187 uint8_t i, j; | |
2188 uint32_t found; | |
2189 uint32_t pText; | |
58 | 2190 uint16_t decodeUTF8; |
38 | 2191 uint8_t gfx_selected_language; |
2192 #ifndef BOOTLOADER_STANDALONE | |
2193 SSettings *pSettings; | |
2194 pSettings = settingsGetPointer(); | |
2195 gfx_selected_language = pSettings->selected_language; | |
2196 if(gfx_selected_language >= LANGUAGE_END) | |
2197 #endif | |
2198 gfx_selected_language = 0; | |
58 | 2199 |
2200 | |
38 | 2201 // ----------------------------- |
58 | 2202 if(textId != (uint8_t)TXT_2BYTE) |
38 | 2203 { |
2204 found = 0; | |
2205 j = 0; | |
2206 for(i=(uint8_t)TXT_Language;i<(uint8_t)TXT_END;i++) | |
2207 { | |
2208 if(text_array[j].code == textId) | |
2209 { | |
2210 found = 1; | |
2211 break; | |
2212 } | |
2213 j++; | |
2214 } | |
2215 if(!found) | |
2216 return cfg->Xdelta; | |
58 | 2217 |
38 | 2218 // ----------------------------- |
2219 pText = (uint32_t)text_array[j].text[gfx_selected_language]; | |
2220 if(!pText) | |
2221 pText = (uint32_t)text_array[j].text[0]; | |
2222 else | |
2223 if(*(char*)pText == 0) | |
2224 pText = (uint32_t)text_array[j].text[0]; | |
2225 } | |
2226 // ----------------------------- | |
2227 else | |
2228 { | |
2229 if(!nextCharFor2Byte) | |
2230 return cfg->Xdelta; | |
2231 | |
2232 found = 0; | |
2233 for(j=0;j<(uint8_t)TXT2BYTE_END-(uint8_t)TXT2BYTE_START;j++) | |
2234 { | |
2235 if((uint8_t)text_array2[j].code == (uint8_t)nextCharFor2Byte) | |
2236 { | |
2237 found = 1; | |
2238 break; | |
2239 } | |
2240 } | |
2241 if(!found) | |
2242 return cfg->Xdelta; | |
2243 // ----------------------------- | |
2244 pText = (uint32_t)text_array2[j].text[gfx_selected_language]; | |
2245 if(!pText) | |
2246 pText = (uint32_t)text_array2[j].text[0]; | |
2247 else | |
2248 if(*(char*)pText == 0) | |
2249 pText = (uint32_t)text_array2[j].text[0]; | |
2250 } | |
2251 // ----------------------------- | |
2252 | |
2253 if(cfg->actualFont == (tFont *)cfg->TinyFont) | |
2254 cfg->Ydelta += cfg->TinyFontExtraYdelta; | |
2255 | |
2256 while (*(char*)pText != 0)// und fehlend: Abfrage window / image size | |
2257 { | |
2258 if(*(char*)pText == '\t') | |
2259 cfg->Xdelta = hgfx->WindowTab - hgfx->WindowX0; | |
2260 else | |
612 | 2261 if((*(char*)pText == ' ') && (cfg->invert == 0)) /* bypass drawing of white space only for not inverted mode */ |
2262 { | |
38 | 2263 cfg->Xdelta += ((tFont *)cfg->actualFont)->spacesize; |
612 | 2264 } |
38 | 2265 else |
58 | 2266 if((*(char*)pText) & 0x80) /* Identify a UNICODE character other than standard ASCII using the highest bit */ |
2267 { | |
2268 decodeUTF8 = ((*(char*)pText) & 0x1F) << 6; /* use 5bits of first byte for upper part of unicode */ | |
2269 pText++; | |
2270 decodeUTF8 |= (*(char*)pText) & 0x3F; /* add lower 6bits as second part of the unicode */ | |
2271 if (decodeUTF8 <= 0xff) /* The following function has a uint8 input parameter ==> no UNICODEs > 0xff supported */ | |
2272 { | |
2273 cfg->Xdelta = GFX_write_char(hgfx, cfg, (uint8_t)decodeUTF8, (tFont *)cfg->actualFont); | |
2274 } | |
2275 } | |
2276 else | |
38 | 2277 cfg->Xdelta = GFX_write_char(hgfx, cfg, *(uint8_t *)pText, (tFont *)cfg->actualFont); |
2278 | |
2279 pText++; | |
2280 } | |
2281 | |
2282 if(cfg->actualFont == (tFont *)cfg->TinyFont) | |
2283 cfg->Ydelta -= cfg->TinyFontExtraYdelta; | |
2284 | |
2285 return cfg->Xdelta; | |
2286 } | |
2287 | |
2288 | |
2289 /** | |
2290 ****************************************************************************** | |
2291 * @brief GFX write char. / Write non-inverted, non-colored with entire 8 bit range | |
2292 * @author heinrichs weikamp gmbh | |
2293 * @version V0.0.1 | |
2294 * @date 22-April-2014 | |
2295 ****************************************************************************** | |
2296 * | |
2297 * @param hgfx: check gfx_engine.h. | |
2298 * @param Ydelta: input | |
2299 * @param character: character | |
2300 * @param *Font: pointer to font to be used for this char | |
2301 * @retval Ydelta: 0x0000FFFF if not successful or char_truncated | |
2302 */ | |
2303 | |
2304 static uint32_t GFX_write_char_doubleSize(GFX_DrawCfgWindow* hgfx, GFX_CfgWriteString* cfg, uint8_t character, tFont *Font) | |
2305 { | |
2306 uint32_t i, j; | |
2307 uint32_t width, height; | |
2308 uint32_t found; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2309 uint16_t* pDestination; |
38 | 2310 uint32_t pSource; |
2311 uint32_t OffsetDestination; | |
2312 uint32_t width_left; | |
2313 uint32_t height_left; | |
2314 uint32_t char_truncated_WidthFlag; | |
2315 uint32_t char_truncated_Height; | |
2316 uint8_t fill; | |
2317 uint32_t widthFont, heightFont; | |
2318 uint32_t nextLine; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2319 int32_t stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2320 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2321 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2322 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2323 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2324 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2325 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2326 stepdir = -1; /* decrement address while putting pixels */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2327 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2328 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2329 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2330 stepdir = 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2331 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2332 |
38 | 2333 |
2334 if(hgfx->Image->ImageWidth <= (hgfx->WindowX0 + cfg->Xdelta)) | |
2335 return 0x0000FFFF; | |
2336 | |
2337 // ----------------------------- | |
2338 found = 0; | |
2339 for(i=0;i<Font->length;i++) | |
2340 { | |
2341 if(Font->chars[i].code == character) | |
2342 { | |
2343 found = 1; | |
2344 break; | |
2345 } | |
2346 } | |
2347 if(!found) | |
2348 return cfg->Xdelta; | |
2349 | |
2350 pSource = ((uint32_t)Font->chars[i].image->data); | |
119 | 2351 pDestination = (uint16_t*)(hgfx->Image->FBStartAdress); |
38 | 2352 |
2353 heightFont = Font->chars[i].image->height; | |
2354 widthFont = Font->chars[i].image->width; | |
2355 | |
2356 height = heightFont*2; | |
2357 width = widthFont*2; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2358 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2359 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2360 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2361 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2362 pDestination += (uint32_t)(hgfx->WindowX1 - cfg->Xdelta) * hgfx->Image->ImageHeight; /* set pointer to delta row */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2363 pDestination += (hgfx->WindowY1 - cfg->Ydelta); /* set pointer to delta colum */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2364 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2365 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2366 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2367 pDestination += (uint32_t)(hgfx->WindowX0 + cfg->Xdelta) * hgfx->Image->ImageHeight; /* set pointer to delta row */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2368 pDestination += (hgfx->WindowY0 + cfg->Ydelta); /* set pointer to delta colum */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2369 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2370 OffsetDestination = (hgfx->Image->ImageHeight - height); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2371 nextLine = hgfx->Image->ImageHeight; |
38 | 2372 |
2373 // ----------------------------- | |
2374 char_truncated_WidthFlag = 0; | |
2375 width_left = hgfx->Image->ImageWidth - (hgfx->WindowX0 + cfg->Xdelta); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2376 |
38 | 2377 if(width_left < width) |
2378 { | |
2379 char_truncated_WidthFlag = 1; | |
2380 width = width_left; | |
2381 widthFont = width/2; | |
2382 } | |
2383 // ----------------------------- | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2384 |
38 | 2385 char_truncated_Height = 0; |
2386 height_left = hgfx->Image->ImageHeight - (hgfx->WindowY0 + cfg->Ydelta); | |
2387 if(height_left < height) | |
2388 { | |
2389 char_truncated_Height = height - height_left; | |
2390 if((char_truncated_Height & 1) != 0) | |
2391 { | |
2392 height_left -= 1; | |
2393 char_truncated_Height += 1; | |
2394 } | |
2395 height = height_left; | |
2396 heightFont = height/2; | |
2397 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2398 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2399 OffsetDestination += char_truncated_Height; |
38 | 2400 // ----------------------------- |
2401 if(height == 0) | |
2402 return 0x0000FFFF; | |
2403 // ----------------------------- | |
2404 | |
2405 if(cfg->singleSpaceWithSizeOfNextChar) | |
2406 { | |
2407 cfg->singleSpaceWithSizeOfNextChar = 0; | |
2408 | |
2409 if(cfg->invert) | |
2410 fill = 0xFF; | |
2411 else | |
2412 fill = 0; | |
2413 | |
2414 height /= 2; | |
2415 for(i = width; i > 0; i--) | |
2416 { | |
2417 for (j = height; j > 0; j--) | |
2418 { | |
119 | 2419 *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2420 pDestination += stepdir; |
119 | 2421 *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2422 pDestination += stepdir; |
38 | 2423 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2424 pDestination += stepdir * OffsetDestination; |
38 | 2425 } |
2426 } | |
2427 else | |
2428 if(cfg->invert) | |
2429 { | |
2430 if((heightFont & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ | |
2431 { | |
2432 heightFont /= 4; | |
2433 for(i = widthFont; i > 0; i--) | |
2434 { | |
2435 if(*(uint8_t*)pSource != 0x01) | |
2436 { | |
2437 for (j = heightFont; j > 0; j--) | |
2438 { | |
119 | 2439 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2440 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2441 pDestination += stepdir; |
119 | 2442 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2443 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2444 pDestination += stepdir; |
38 | 2445 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2446 |
119 | 2447 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2448 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2449 pDestination += stepdir; |
119 | 2450 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2451 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2452 pDestination += stepdir; |
38 | 2453 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2454 |
119 | 2455 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2456 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2457 pDestination += stepdir; |
119 | 2458 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2459 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2460 pDestination += stepdir; |
38 | 2461 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2462 |
119 | 2463 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2464 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2465 pDestination += stepdir; |
119 | 2466 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2467 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2468 pDestination += stepdir; |
38 | 2469 pSource++; |
2470 } | |
2471 pSource += char_truncated_Height; | |
2472 } | |
2473 else | |
2474 { | |
2475 pSource++; | |
612 | 2476 for (j = heightFont; j > 0; j--) |
38 | 2477 { |
119 | 2478 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
612 | 2479 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2480 pDestination += stepdir; |
119 | 2481 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2482 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2483 pDestination += stepdir; |
119 | 2484 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2485 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2486 pDestination += stepdir; |
612 | 2487 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
119 | 2488 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2489 pDestination += stepdir; |
119 | 2490 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2491 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2492 pDestination += stepdir; |
119 | 2493 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2494 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2495 pDestination += stepdir; |
119 | 2496 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2497 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2498 pDestination += stepdir; |
119 | 2499 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2500 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2501 pDestination += stepdir; |
38 | 2502 } |
2503 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2504 pDestination += (OffsetDestination + nextLine) * stepdir; |
38 | 2505 } |
2506 } | |
2507 else | |
2508 { | |
2509 heightFont /= 2; | |
2510 for(i = widthFont; i > 0; i--) | |
2511 { | |
2512 if(*(uint8_t*)pSource != 0x01) | |
2513 { | |
2514 for (j = heightFont; j > 0; j--) | |
2515 { | |
119 | 2516 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2517 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2518 pDestination += stepdir; |
119 | 2519 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2520 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2521 pDestination += stepdir; |
38 | 2522 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2523 |
119 | 2524 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2525 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2526 pDestination += stepdir; |
119 | 2527 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2528 *(__IO uint16_t*)(pDestination + nextLine) = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2529 pDestination += stepdir; |
38 | 2530 pSource++; |
2531 } | |
2532 pSource += char_truncated_Height; | |
2533 } | |
2534 else | |
2535 { | |
2536 pSource++; | |
2537 for (j = heightFont; j > 0; j--) | |
2538 { | |
119 | 2539 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2540 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2541 pDestination += stepdir; |
119 | 2542 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2543 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2544 pDestination += stepdir; |
119 | 2545 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2546 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2547 pDestination += stepdir; |
119 | 2548 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2549 *(__IO uint16_t*)(pDestination + nextLine) = 0xFF << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2550 pDestination += stepdir; |
38 | 2551 } |
2552 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2553 pDestination += (OffsetDestination + nextLine) * stepdir; |
38 | 2554 } |
2555 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2556 } /* inverted */ |
38 | 2557 else |
2558 { | |
2559 if((heightFont & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ | |
2560 { | |
2561 heightFont /= 4; | |
2562 for(i = widthFont; i > 0; i--) | |
2563 { | |
2564 if(*(uint8_t*)pSource != 0x01) | |
2565 { | |
2566 for (j = heightFont; j > 0; j--) | |
2567 { | |
119 | 2568 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2569 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2570 pDestination += stepdir; |
119 | 2571 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2572 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2573 pDestination += stepdir; |
38 | 2574 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2575 |
119 | 2576 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2577 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2578 pDestination += stepdir; |
119 | 2579 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2580 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2581 pDestination += stepdir; |
38 | 2582 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2583 |
119 | 2584 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2585 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2586 pDestination += stepdir; |
119 | 2587 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2588 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2589 pDestination += stepdir; |
38 | 2590 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2591 |
119 | 2592 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2593 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2594 pDestination += stepdir; |
119 | 2595 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2596 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2597 pDestination += stepdir; |
38 | 2598 pSource++; |
2599 } | |
2600 pSource += char_truncated_Height; | |
2601 } | |
2602 else | |
2603 { | |
2604 pSource++; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2605 pDestination += stepdir * height; |
38 | 2606 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2607 pDestination += stepdir * (OffsetDestination + nextLine); |
38 | 2608 } |
2609 } | |
2610 else | |
2611 { | |
2612 heightFont /= 2; | |
2613 for(i = widthFont; i > 0; i--) | |
2614 { | |
2615 if(*(uint8_t*)pSource != 0x01) | |
2616 { | |
2617 for (j = heightFont; j > 0; j--) | |
2618 { | |
119 | 2619 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2620 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2621 pDestination += stepdir; |
119 | 2622 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2623 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2624 pDestination += stepdir; |
38 | 2625 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2626 |
119 | 2627 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2628 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2629 pDestination += stepdir; |
119 | 2630 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2631 *(__IO uint16_t*)(pDestination + (stepdir * nextLine)) = *(uint8_t*)pSource << 8 | cfg->color; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2632 pDestination += stepdir; |
38 | 2633 pSource++; |
2634 } | |
2635 pSource += char_truncated_Height; | |
2636 } | |
2637 else | |
2638 { | |
2639 pSource++; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2640 pDestination += stepdir * height; |
38 | 2641 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2642 pDestination += stepdir * (OffsetDestination + nextLine); |
38 | 2643 } |
2644 } | |
2645 } | |
2646 | |
2647 // ----------------------------- | |
2648 | |
2649 if(Font == &FontT144) | |
2650 width += 6; | |
2651 else | |
2652 if(Font == &FontT105) | |
2653 width += 4; | |
2654 | |
2655 // ----------------------------- | |
2656 | |
2657 if(char_truncated_WidthFlag) | |
2658 return 0x0000FFFF; | |
2659 else | |
2660 return cfg->Xdelta + width; | |
2661 | |
2662 } | |
2663 | |
2664 | |
2665 /** | |
2666 ****************************************************************************** | |
2667 * @brief GFX write char. / Write non-inverted, non-colored with entire 8 bit range | |
2668 * @author heinrichs weikamp gmbh | |
2669 * @version V0.0.1 | |
2670 * @date 22-April-2014 | |
2671 ****************************************************************************** | |
2672 * | |
2673 * @param hgfx: check gfx_engine.h. | |
2674 * @param Ydelta: input | |
2675 * @param character: character | |
2676 * @param *Font: pointer to font to be used for this char | |
2677 * @retval Ydelta: 0x0000FFFF if not successful or char_truncated | |
2678 */ | |
2679 | |
2680 static uint32_t GFX_write_char(GFX_DrawCfgWindow* hgfx, GFX_CfgWriteString* cfg, uint8_t character, tFont *Font) | |
2681 { | |
567 | 2682 Font = GFX_Check_Extra_Font(character, Font); |
38 | 2683 if(cfg->doubleSize) |
2684 { | |
2685 return GFX_write_char_doubleSize(hgfx, cfg, character, Font); | |
2686 } | |
2687 | |
2688 uint32_t i, j; | |
2689 uint32_t width, height; | |
2690 uint32_t found; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2691 uint16_t* pDestination; |
38 | 2692 uint32_t pSource; |
2693 uint32_t OffsetDestination; | |
2694 uint32_t width_left; | |
2695 uint32_t height_left; | |
2696 uint32_t char_truncated_WidthFlag; | |
2697 uint32_t char_truncated_Height; | |
2698 uint8_t fill; | |
121 | 2699 uint32_t fillpattern; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2700 int16_t stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2701 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2702 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2703 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2704 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2705 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2706 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2707 stepdir = -1; /* decrement address while putting pixels */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2708 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2709 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2710 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2711 stepdir = 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2712 } |
38 | 2713 |
2714 if(hgfx->Image->ImageWidth <= (hgfx->WindowX0 + cfg->Xdelta)) | |
2715 return 0x0000FFFF; | |
2716 | |
2717 // ----------------------------- | |
2718 found = 0; | |
2719 for(i=0;i<Font->length;i++) | |
2720 { | |
2721 if(Font->chars[i].code == character) | |
2722 { | |
2723 found = 1; | |
2724 break; | |
2725 } | |
2726 } | |
2727 if(!found) | |
2728 return cfg->Xdelta; | |
2729 // ----------------------------- | |
2730 /* | |
2731 if(Font == &Font144) | |
2732 cfg->Xdelta += 3; | |
2733 else | |
2734 if(Font == &Font84) | |
2735 cfg->Xdelta += 2; | |
2736 */ | |
2737 // ----------------------------- | |
2738 | |
2739 | |
2740 pSource = ((uint32_t)Font->chars[i].image->data); | |
119 | 2741 pDestination = (uint16_t*)(hgfx->Image->FBStartAdress); |
2742 | |
38 | 2743 |
2744 height = Font->chars[i].image->height; | |
2745 width = Font->chars[i].image->width; | |
2746 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2747 OffsetDestination = hgfx->Image->ImageHeight - height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2748 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2749 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2750 /* Xyyyyy y= height */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2751 /* Xyyyyy x= width */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2752 /* Xyyyyy */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2753 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2754 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2755 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2756 pDestination += (hgfx->WindowX1 - cfg->Xdelta) * hgfx->Image->ImageHeight; /* set pointer to delta row */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2757 pDestination += (hgfx->WindowY1 - cfg->Ydelta); /* set pointer to delta colum */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2758 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2759 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2760 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2761 pDestination += (hgfx->WindowX0 + cfg->Xdelta) * hgfx->Image->ImageHeight; /* set pointer to delta row */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2762 pDestination += (hgfx->WindowY0 + cfg->Ydelta); /* set pointer to delta colum */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2763 } |
38 | 2764 |
2765 | |
2766 // ----------------------------- | |
2767 char_truncated_WidthFlag = 0; | |
2768 width_left = hgfx->Image->ImageWidth - (hgfx->WindowX0 + cfg->Xdelta); | |
2769 if(width_left < width) | |
2770 { | |
2771 char_truncated_WidthFlag = 1; | |
2772 width = width_left; | |
2773 } | |
2774 // ----------------------------- | |
2775 char_truncated_Height = 0; | |
681
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2776 if(!pSettings->FlipDisplay) |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2777 { |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2778 height_left = hgfx->Image->ImageHeight - (hgfx->WindowY0 + cfg->Ydelta); |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2779 } |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2780 else |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2781 { |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2782 height_left = (hgfx->WindowY1 - cfg->Ydelta); |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2783 } |
38 | 2784 if(height_left < height) |
2785 { | |
2786 char_truncated_Height = height - height_left; | |
2787 if((char_truncated_Height & 1) != 0) | |
2788 { | |
2789 height_left -= 1; | |
2790 char_truncated_Height += 1; | |
2791 } | |
2792 height = height_left; | |
2793 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2794 OffsetDestination += char_truncated_Height; |
38 | 2795 // ----------------------------- |
2796 if(height == 0) | |
2797 return 0x0000FFFF; | |
2798 // ----------------------------- | |
2799 | |
2800 if(cfg->singleSpaceWithSizeOfNextChar) | |
2801 { | |
2802 cfg->singleSpaceWithSizeOfNextChar = 0; | |
2803 | |
2804 if(cfg->invert) | |
2805 fill = 0xFF; | |
2806 else | |
2807 fill = 0; | |
2808 | |
2809 height /= 2; | |
2810 for(i = width; i > 0; i--) | |
2811 { | |
2812 for (j = height; j > 0; j--) | |
2813 { | |
119 | 2814 *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2815 pDestination += stepdir; |
119 | 2816 *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2817 pDestination += stepdir; |
38 | 2818 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2819 pDestination += stepdir * OffsetDestination; |
38 | 2820 } |
2821 } | |
2822 else | |
2823 if(cfg->invert) | |
2824 { | |
2825 if((height & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ | |
2826 { | |
2827 height /= 4; | |
2828 for(i = width; i > 0; i--) | |
2829 { | |
2830 if(*(uint8_t*)pSource != 0x01) | |
2831 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2832 |
38 | 2833 for (j = height; j > 0; j--) |
2834 { | |
119 | 2835 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2836 pDestination += stepdir; |
119 | 2837 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2838 pDestination += stepdir; |
119 | 2839 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2840 pDestination += stepdir; |
119 | 2841 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2842 pDestination += stepdir; |
38 | 2843 } |
2844 pSource += char_truncated_Height; | |
2845 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2846 else /* empty line => fast fill */ |
38 | 2847 { |
2848 pSource++; | |
121 | 2849 fillpattern = (( 0xFF << 8 | cfg->color) << 16) | ( 0xFF << 8 | cfg->color); |
2850 if(pSettings->FlipDisplay) pDestination--; /* address fill from high to low */ | |
38 | 2851 for (j = height; j > 0; j--) |
2852 { | |
121 | 2853 *(__IO uint32_t*)pDestination = fillpattern; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2854 pDestination += stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2855 pDestination += stepdir; |
121 | 2856 *(__IO uint32_t*)pDestination = fillpattern; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2857 pDestination += stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2858 pDestination += stepdir; |
38 | 2859 } |
121 | 2860 if(pSettings->FlipDisplay) pDestination++; |
38 | 2861 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2862 pDestination += stepdir * OffsetDestination; |
38 | 2863 } |
2864 } | |
2865 else | |
2866 { | |
2867 height /= 2; | |
2868 for(i = width; i > 0; i--) | |
2869 { | |
2870 if(*(uint8_t*)pSource != 0x01) | |
2871 { | |
2872 for (j = height; j > 0; j--) | |
2873 { | |
119 | 2874 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2875 pDestination += stepdir; |
119 | 2876 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource++) << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2877 pDestination += stepdir; |
38 | 2878 } |
2879 pSource += char_truncated_Height; | |
2880 } | |
2881 else | |
2882 { | |
2883 pSource++; | |
2884 for (j = height; j > 0; j--) | |
2885 { | |
119 | 2886 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2887 pDestination += stepdir; |
119 | 2888 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2889 pDestination += stepdir; |
38 | 2890 } |
2891 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2892 pDestination += stepdir * OffsetDestination; |
38 | 2893 } |
2894 } | |
2895 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2896 else /* not inverted */ |
38 | 2897 { |
2898 if((height & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ | |
2899 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2900 |
38 | 2901 height /= 4; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2902 |
38 | 2903 for(i = width; i > 0; i--) |
2904 { | |
2905 if(*(uint8_t*)pSource != 0x01) | |
2906 { | |
2907 for (j = height; j > 0; j--) | |
2908 { | |
119 | 2909 *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2910 pDestination += stepdir; |
119 | 2911 *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2912 pDestination += stepdir; |
119 | 2913 *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2914 pDestination += stepdir; |
119 | 2915 *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2916 pDestination += stepdir; |
38 | 2917 } |
121 | 2918 |
38 | 2919 pSource += char_truncated_Height; |
2920 } | |
119 | 2921 else /* clear line */ |
38 | 2922 { |
2923 pSource++; | |
121 | 2924 fillpattern = (cfg->color << 16) | cfg->color; |
2925 if(pSettings->FlipDisplay) pDestination--; /* address fill from high to low */ | |
2926 | |
119 | 2927 for (j = height; j > 0; j--) |
2928 { | |
121 | 2929 *(__IO uint32_t*)pDestination = fillpattern; |
119 | 2930 pDestination += stepdir; |
2931 pDestination += stepdir; | |
121 | 2932 *(__IO uint32_t*)pDestination = fillpattern; |
119 | 2933 pDestination += stepdir; |
2934 pDestination += stepdir; | |
2935 } | |
121 | 2936 if(pSettings->FlipDisplay) pDestination++; |
38 | 2937 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2938 pDestination += stepdir * OffsetDestination; |
38 | 2939 } |
2940 } | |
2941 else | |
2942 { | |
2943 height /= 2; | |
2944 for(i = width; i > 0; i--) | |
2945 { | |
2946 if(*(uint8_t*)pSource != 0x01) | |
2947 { | |
2948 for (j = height; j > 0; j--) | |
2949 { | |
119 | 2950 *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2951 pDestination += stepdir; |
119 | 2952 *(__IO uint16_t*)pDestination = ( *(uint8_t*)pSource++ << 8) | (cfg->color); |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2953 pDestination += stepdir; |
38 | 2954 } |
2955 pSource += char_truncated_Height; | |
2956 } | |
119 | 2957 else /* clear line */ |
38 | 2958 { |
2959 pSource++; | |
119 | 2960 for (j = height; j > 0; j--) |
2961 { | |
2962 *(__IO uint16_t*)pDestination = cfg->color; | |
2963 pDestination += stepdir; | |
2964 *(__IO uint16_t*)pDestination = cfg->color; | |
2965 pDestination += stepdir; | |
2966 } | |
38 | 2967 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2968 pDestination += stepdir * OffsetDestination; |
38 | 2969 } |
2970 } | |
2971 } | |
2972 | |
2973 // ----------------------------- | |
2974 | |
2975 if(Font == &FontT144) | |
2976 width += 3; | |
2977 else | |
2978 if(Font == &FontT105) | |
2979 width += 2; | |
2980 /* | |
2981 else | |
2982 if(Font == &Font144) | |
2983 width += 3; | |
2984 else | |
2985 if(Font == &Font84) | |
2986 width += 1; | |
2987 */ | |
2988 // ----------------------------- | |
2989 | |
2990 if(char_truncated_WidthFlag) | |
2991 return 0x0000FFFF; | |
2992 else | |
2993 return cfg->Xdelta + width; | |
2994 } | |
2995 | |
2996 | |
2997 /** | |
2998 ****************************************************************************** | |
2999 * @brief GFX write Modify helper for center and right align. | |
3000 * @author heinrichs weikamp gmbh | |
3001 * @version V0.0.1 | |
3002 * @date 17-March-2015 | |
3003 ****************************************************************************** | |
3004 * | |
3005 * @param *cText: output | |
3006 * @param *pTextInput: input | |
3007 * @param gfx_selected_language: gfx_selected_language | |
3008 * @retval counter and *cText content | |
3009 */ | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3010 static int8_t GFX_write__Modify_helper(char *cText, const char *pTextInput, uint8_t gfx_selected_language) |
38 | 3011 { |
3012 uint32_t pText, backup; | |
3013 uint8_t textId; | |
3014 int8_t counter; | |
3015 uint32_t found; | |
3016 uint32_t j; | |
3017 | |
3018 pText = (uint32_t)pTextInput; | |
3019 counter = 0; | |
537
0ad0b26ec56b
Added center / right alignment option to custom text display:
Ideenmodellierer
parents:
509
diff
changeset
|
3020 while((counter < 100) && (*(char*)pText != 0) && (*(char*)pText != '\r') && (*(char*)pText != '\n')) |
38 | 3021 { |
3022 if((*(char*)pText) == TXT_2BYTE) | |
3023 { | |
3024 backup = pText; | |
3025 | |
3026 found = 0; | |
3027 j = 0; | |
3028 textId = (int8_t)*(char*)(pText + 1); | |
3029 if(textId != 0) | |
3030 { | |
3031 for(j=0;j<(uint8_t)TXT2BYTE_END-(uint8_t)TXT2BYTE_START;j++) | |
3032 { | |
3033 if((uint8_t)text_array2[j].code == (uint8_t)textId) | |
3034 { | |
3035 found = 1; | |
3036 break; | |
3037 } | |
3038 } | |
3039 if(found) | |
3040 { | |
3041 pText = (uint32_t)text_array2[j].text[gfx_selected_language]; | |
3042 if(!pText) | |
3043 pText = (uint32_t)text_array2[j].text[0]; | |
3044 else | |
3045 if(*(char*)pText == 0) | |
3046 pText = (uint32_t)text_array2[j].text[0]; | |
3047 | |
3048 while((counter < 100) && (*(char*)pText != 0)) | |
3049 cText[counter++] = *(char*)pText++; | |
3050 } | |
3051 pText = backup + 2; | |
3052 } | |
3053 else | |
3054 pText = 0; | |
3055 } | |
699 | 3056 if(0 != pText && ((*(char*)pText) & 0x80)) |
38 | 3057 { |
3058 backup = pText; | |
3059 | |
3060 found = 0; | |
3061 j = 0; | |
3062 textId = (uint8_t)*(char*)pText; | |
3063 for(uint8_t ii=(uint8_t)TXT_Language;ii<(uint8_t)TXT_END;ii++) | |
3064 { | |
3065 if(text_array[j].code == textId) | |
3066 { | |
3067 found = 1; | |
3068 break; | |
3069 } | |
3070 j++; | |
3071 } | |
3072 if(found) | |
3073 { | |
3074 pText = (uint32_t)text_array[j].text[gfx_selected_language]; | |
3075 if(!pText) | |
3076 pText = (uint32_t)text_array[j].text[0]; | |
3077 else | |
3078 if(*(char*)pText == 0) | |
3079 pText = (uint32_t)text_array[j].text[0]; | |
3080 | |
3081 while((counter < 100) && (*(char*)pText != 0)) | |
3082 cText[counter++] = *(char*)pText++; | |
3083 } | |
3084 pText = backup + 1; | |
3085 } | |
3086 else | |
3087 { | |
3088 cText[counter++] = *(char*)pText++; | |
3089 } | |
3090 } | |
3091 cText[counter] = 0; | |
3092 return counter; | |
3093 } | |
3094 | |
3095 | |
3096 /** | |
3097 ****************************************************************************** | |
3098 * @brief GFX write Modify Ydelta for align. / calc Ydelta for start | |
3099 * @author heinrichs weikamp gmbh | |
3100 * @version V0.0.1 | |
3101 * @date 22-April-2014 | |
3102 ****************************************************************************** | |
3103 * | |
3104 * @param *hgfx: check gfx_engine.h. | |
3105 * @param *cfg: Ydelta, Font | |
3106 * @param *pText: character | |
3107 * @retval Ydelta: 0 if text has to start left ( and probably does not fit) | |
3108 */ | |
3109 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3110 static uint32_t GFX_write__Modify_Xdelta__Centered(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, const char *pTextInput) |
38 | 3111 { |
3112 char cText[101]; | |
3113 uint32_t result; | |
3114 uint32_t Xsum; | |
583 | 3115 uint32_t j; |
38 | 3116 uint8_t gfx_selected_language; |
3117 uint32_t pText; | |
58 | 3118 uint16_t decodeUTF8; |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3119 uint8_t tinyState = 0; /* used to identify the usage of tiny font */ |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3120 tFont* ptargetFont; |
38 | 3121 |
3122 #ifndef BOOTLOADER_STANDALONE | |
3123 SSettings *pSettings; | |
3124 pSettings = settingsGetPointer(); | |
3125 gfx_selected_language = pSettings->selected_language; | |
3126 if(gfx_selected_language >= LANGUAGE_END) | |
3127 #endif | |
3128 gfx_selected_language = 0; | |
3129 // ----------------------------- | |
3130 | |
3131 GFX_write__Modify_helper(cText,pTextInput,gfx_selected_language); | |
3132 | |
3133 pText = (uint32_t)&cText[0]; | |
3134 Xsum = 0; | |
3135 j = 0; | |
565
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3136 ptargetFont = (tFont *)cfg->font; |
38 | 3137 while (*(char*)pText != 0)// und fehlend: Abfrage window / image size |
3138 { | |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3139 if(*(char*)pText == '\016') /* request font change */ |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3140 { |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3141 tinyState++; |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3142 } |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3143 if(*(char*)pText == '\017') /* request font reset */ |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3144 { |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3145 tinyState = 0; |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3146 } |
565
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3147 |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3148 if((ptargetFont == &FontT105) && ((*(char*)pText == '.') || (*(char*)pText == ':'))) |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3149 { |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3150 tinyState++; |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3151 } |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3152 |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3153 if(tinyState > 1) |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3154 { |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3155 ptargetFont = (tFont *)cfg->TinyFont; |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3156 } |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3157 else |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3158 { |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3159 ptargetFont = (tFont *)cfg->font; |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3160 } |
649
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3161 |
699 | 3162 decodeUTF8 = *(char*)pText; /* place ASCII char */ |
649
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3163 if((*(char*)pText == '\005') || (*(char*)pText == '\006')) |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3164 { |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3165 Xsum += 45; |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3166 } |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3167 else |
58 | 3168 { |
698 | 3169 if((*(char*)pText) & 0x80) /* Identify a UNICODE character other than standard ASCII using the highest bit */ |
3170 { | |
3171 decodeUTF8 = ((*(char*)pText) & 0x1F) << 6; /* use 5bits of first byte for upper part of unicode */ | |
3172 pText++; | |
3173 decodeUTF8 |= (*(char*)pText) & 0x3F; /* add lower 6bits as second part of the unicode */ | |
3174 } | |
3175 else | |
3176 { | |
3177 decodeUTF8 = *(char*)pText; /* place ASCII char */ | |
3178 } | |
3179 Xsum += GFX_Character_Width(decodeUTF8, ptargetFont); | |
58 | 3180 } |
567 | 3181 |
38 | 3182 pText++; |
3183 j++; | |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3184 if((ptargetFont == &FontT144) && (*(char*)pText != 0)) |
38 | 3185 Xsum += 3; |
3186 else | |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3187 if((ptargetFont == &FontT105) && (*(char*)pText != 0)) |
38 | 3188 Xsum += 2; |
3189 } | |
3190 pText -= j; | |
3191 | |
3192 if(cfg->doubleSize) | |
3193 Xsum *= 2; | |
3194 | |
3195 result = hgfx->WindowX1 - hgfx->WindowX0; | |
3196 if(Xsum < result) | |
3197 { | |
3198 result -= Xsum; | |
3199 result /= 2; | |
3200 } | |
3201 else | |
3202 result = 0; | |
3203 return result; | |
3204 } | |
3205 | |
3206 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3207 static uint32_t GFX_write__Modify_Xdelta__RightAlign(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, const char *pTextInput) |
38 | 3208 { |
3209 char cText[101]; | |
3210 uint32_t result; | |
3211 uint32_t Xsum; | |
583 | 3212 uint32_t j; |
38 | 3213 tFont *font; |
3214 uint8_t gfx_selected_language; | |
3215 uint32_t pText; | |
58 | 3216 uint16_t decodeUTF8; |
485 | 3217 uint8_t tinyState = 0; /* used to identify the usage of tiny font */ |
38 | 3218 |
3219 #ifndef BOOTLOADER_STANDALONE | |
3220 SSettings *pSettings; | |
3221 pSettings = settingsGetPointer(); | |
3222 gfx_selected_language = pSettings->selected_language; | |
3223 if(gfx_selected_language >= LANGUAGE_END) | |
3224 #endif | |
3225 gfx_selected_language = 0; | |
3226 // ----------------------------- | |
3227 | |
3228 GFX_write__Modify_helper(cText,pTextInput,gfx_selected_language); | |
3229 pText = (uint32_t)&cText[0]; | |
3230 | |
3231 // ----------------------------- | |
3232 | |
3233 font = (tFont *)cfg->font; | |
3234 Xsum = 0; | |
3235 j = 0; | |
3236 | |
3237 while (*(char*)pText != 0)// und fehlend: Abfrage window / image size | |
3238 { | |
485 | 3239 if(*(char*)pText == '\016') /* request font change */ |
3240 { | |
3241 tinyState++; | |
3242 } | |
3243 if(*(char*)pText == '\017') /* request font reset */ | |
3244 { | |
3245 tinyState = 0; | |
3246 } | |
565
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3247 |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3248 if((font == &FontT144) && (*(char*)pText == '.')) |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3249 { |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3250 tinyState++; |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3251 } |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3252 if((font == &FontT105) && ((*(char*)pText == '.') || (*(char*)pText == ':'))) |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3253 { |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3254 tinyState++; |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3255 } |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3256 |
485 | 3257 if(tinyState > 1) |
3258 { | |
3259 font = (tFont *)cfg->TinyFont; | |
3260 } | |
3261 else | |
3262 { | |
3263 font = (tFont *)cfg->font; | |
3264 } | |
3265 | |
38 | 3266 if(*(char*)pText == ' ') |
3267 { | |
3268 Xsum += font->spacesize; | |
3269 } | |
3270 else | |
649
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3271 if((*(char*)pText == '\005') || (*(char*)pText == '\006')) |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3272 { |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3273 Xsum += 45; |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3274 } |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3275 else |
38 | 3276 { |
58 | 3277 if((*(char*)pText) & 0x80) /* Identify a UNICODE character other than standard ASCII using the highest bit */ |
3278 { | |
3279 decodeUTF8 = ((*(char*)pText) & 0x1F) << 6; /* use 5bits of first byte for upper part of unicode */ | |
3280 pText++; | |
3281 decodeUTF8 |= (*(char*)pText) & 0x3F; /* add lower 6bits as second part of the unicode */ | |
3282 } | |
3283 else | |
3284 { | |
3285 decodeUTF8 = *(char*)pText; | |
3286 } | |
567 | 3287 Xsum += GFX_Character_Width(decodeUTF8, font); /* lookup character and add width */ |
38 | 3288 } |
3289 pText++; | |
3290 j++; | |
3291 if((font == &FontT144) && (*(char*)pText != 0)) | |
3292 Xsum += 3; | |
3293 else | |
3294 if((font == &FontT105) && (*(char*)pText != 0)) | |
3295 Xsum += 2; | |
3296 } | |
3297 pText -= j; | |
3298 | |
3299 if(cfg->doubleSize) | |
3300 Xsum *= 2; | |
3301 | |
3302 result = hgfx->WindowX1 - hgfx->WindowX0 - 1; | |
3303 if(Xsum < result) | |
3304 result -= Xsum; | |
3305 else | |
3306 result = 0; | |
3307 | |
3308 return result; | |
3309 } | |
3310 | |
3311 void GFX_LTDC_Init(void) | |
3312 { | |
3313 /* | |
3314 HSYNC=10 (9+1) | |
3315 HBP=10 (19-10+1) | |
3316 ActiveW=480 (499-10-10+1) | |
3317 HFP=8 (507-480-10-10+1) | |
3318 | |
3319 VSYNC=2 (1+1) | |
3320 VBP=2 (3-2+1) | |
3321 ActiveH=800 (803-2-2+1) | |
3322 VFP=2 (805-800-2-2+1) | |
3323 */ | |
3324 | |
3325 /* Timing configuration */ | |
3326 /* Horizontal synchronization width = Hsync - 1 */ | |
3327 LtdcHandle.Init.HorizontalSync = 9; | |
3328 /* Vertical synchronization height = Vsync - 1 */ | |
3329 LtdcHandle.Init.VerticalSync = 1; | |
3330 /* Accumulated horizontal back porch = Hsync + HBP - 1 */ | |
3331 LtdcHandle.Init.AccumulatedHBP = 19; | |
3332 /* Accumulated vertical back porch = Vsync + VBP - 1 */ | |
3333 LtdcHandle.Init.AccumulatedVBP = 3; | |
3334 /* Accumulated active width = Hsync + HBP + Active Width - 1 */ | |
3335 LtdcHandle.Init.AccumulatedActiveW = 499;//500;//499; | |
3336 /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ | |
3337 LtdcHandle.Init.AccumulatedActiveH = 803; | |
3338 /* Total width = Hsync + HBP + Active Width + HFP - 1 */ | |
3339 LtdcHandle.Init.TotalWidth = 507;//508;//507; | |
3340 /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ | |
3341 LtdcHandle.Init.TotalHeigh = 805; | |
3342 | |
3343 /* Configure R,G,B component values for LCD background color */ | |
3344 LtdcHandle.Init.Backcolor.Red= 0; | |
3345 LtdcHandle.Init.Backcolor.Blue= 0; | |
3346 LtdcHandle.Init.Backcolor.Green= 0; | |
3347 | |
3348 /* LCD clock configuration */ | |
3349 /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ | |
3350 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ | |
3351 /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ | |
3352 /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_8 = 48/4 = 6Mhz */ | |
3353 | |
3354 /* done in main.c SystemClockConfig | |
3355 | |
3356 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; | |
3357 PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; | |
3358 PeriphClkInitStruct.PLLSAI.PLLSAIR = 4; | |
3359 PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8; | |
3360 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); | |
3361 */ | |
3362 /* Polarity */ | |
3363 LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; | |
3364 LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; | |
3365 LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; | |
3366 LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IIPC;//LTDC_PCPOLARITY_IPC; | |
3367 | |
3368 LtdcHandle.Instance = LTDC; | |
3369 | |
3370 /* Configure the LTDC */ | |
3371 if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) // auch init der GPIO Pins | |
3372 { | |
3373 /* Initialization Error */ | |
3374 GFX_Error_Handler(); | |
3375 } | |
3376 } | |
3377 | |
3378 void GFX_LTDC_LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address) | |
3379 { | |
3380 LTDC_LayerCfgTypeDef Layercfg; | |
3381 | |
3382 /* Layer Init */ | |
3383 Layercfg.WindowX0 = 0; | |
3384 Layercfg.WindowX1 = 480; | |
3385 Layercfg.WindowY0 = 0; | |
3386 Layercfg.WindowY1 = 800; | |
3387 Layercfg.PixelFormat = LTDC_PIXEL_FORMAT_AL88;//LTDC_PIXEL_FORMAT_ARGB8888; | |
3388 Layercfg.FBStartAdress = FB_Address; | |
3389 Layercfg.Alpha = 255; | |
3390 Layercfg.Alpha0 = 0; | |
3391 Layercfg.Backcolor.Blue = 0; | |
3392 Layercfg.Backcolor.Green = 0; | |
3393 Layercfg.Backcolor.Red = 0; | |
3394 Layercfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; | |
3395 Layercfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; | |
3396 Layercfg.ImageWidth = 480; | |
3397 Layercfg.ImageHeight = 800; | |
3398 | |
3399 HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, LayerIndex); | |
3400 HAL_LTDC_ConfigLayer(&LtdcHandle, &Layercfg, LayerIndex); | |
3401 HAL_LTDC_EnableCLUT(&LtdcHandle, LayerIndex); | |
3402 } | |
3403 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3404 static uint32_t GFX_doubleBufferOne(void) |
38 | 3405 { |
3406 return SDRAM_DOUBLE_BUFFER_ONE; | |
3407 } | |
3408 | |
3409 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3410 static uint32_t GFX_doubleBufferTwo(void) |
38 | 3411 { |
3412 return SDRAM_DOUBLE_BUFFER_TWO; | |
3413 } | |
3414 | |
3415 uint32_t getFrame(uint8_t callerId) | |
3416 { | |
623 | 3417 static uint8_t lastFrameProvided = 0; |
38 | 3418 uint8_t i; |
3419 | |
623 | 3420 /* first iteration: look for a clear frame */ |
3421 i = lastFrameProvided; | |
3422 do | |
3423 { | |
38 | 3424 i++; |
623 | 3425 if(i == MAXFRAMES) |
3426 { | |
3427 i = 0; | |
3428 } | |
3429 } while((i != lastFrameProvided) && (frame[i].status != CLEAR)); | |
38 | 3430 |
3431 if((i < MAXFRAMES) && (frame[i].status == CLEAR)) | |
3432 { | |
3433 frame[i].status = BLOCKED; | |
3434 frame[i].caller = callerId; | |
623 | 3435 lastFrameProvided = i; |
38 | 3436 return frame[i].StartAddress; |
3437 } | |
3438 | |
623 | 3439 /* second iteration: look for a frame which may be reused after clearing */ |
3440 i = lastFrameProvided; | |
3441 do | |
3442 { | |
38 | 3443 i++; |
623 | 3444 if(i == MAXFRAMES) |
3445 { | |
3446 i = 0; | |
3447 } | |
705 | 3448 }while((i != lastFrameProvided) && (frame[i].status != RELEASED)); |
623 | 3449 |
38 | 3450 |
3451 if((i < MAXFRAMES) && (frame[i].status == RELEASED)) | |
3452 { | |
3453 GFX_clear_frame_immediately(frame[i].StartAddress); | |
3454 frame[i].status = BLOCKED; | |
623 | 3455 lastFrameProvided = i; |
38 | 3456 return frame[i].StartAddress; |
3457 } | |
3458 return 0; | |
3459 } | |
3460 | |
3461 | |
3462 void GFX_forceReleaseFramesWithId(uint8_t callerId) | |
3463 { | |
3464 for(int i=0; i<MAXFRAMES; i++) | |
3465 if((frame[i].caller == callerId) && (frame[i].status == BLOCKED)) | |
3466 frame[i].status = RELEASED; | |
3467 } | |
3468 | |
3469 | |
3470 void releaseAllFramesExcept(uint8_t callerId, uint32_t frameStartAddress) | |
3471 { | |
3472 for(int i=0; i<MAXFRAMES; i++) | |
3473 if((frame[i].caller == callerId) && (frame[i].status == BLOCKED) && (frame[i].StartAddress != frameStartAddress)) | |
3474 frame[i].status = RELEASED; | |
3475 } | |
3476 | |
3477 | |
3478 uint8_t releaseFrame(uint8_t callerId, uint32_t frameStartAddress) | |
3479 { | |
3480 static uint8_t countErrorCalls = 0; | |
3481 | |
3482 if(frameStartAddress < FBGlobalStart) | |
3483 return 2; | |
3484 | |
3485 | |
3486 uint8_t i; | |
3487 | |
3488 i = 0; | |
3489 while((i < MAXFRAMES) && (frame[i].StartAddress != frameStartAddress)) | |
3490 i++; | |
3491 | |
3492 if((i < MAXFRAMES) && (frame[i].StartAddress == frameStartAddress)) | |
3493 { | |
3494 if(frame[i].caller == callerId) | |
3495 { | |
3496 frame[i].status = RELEASED; | |
3497 return 1; | |
3498 } | |
3499 else | |
3500 countErrorCalls++; | |
3501 } | |
3502 return 0; | |
3503 } | |
3504 | |
3505 | |
3506 uint16_t blockedFramesCount(void) | |
3507 { | |
3508 uint16_t count = MAXFRAMES; | |
3509 | |
3510 for(int i = 0;i<MAXFRAMES;i++) | |
3511 if(frame[i].status == BLOCKED) | |
3512 count--; | |
3513 | |
3514 return count; | |
3515 } | |
3516 | |
3517 | |
623 | 3518 uint8_t housekeepingFrame(void) |
38 | 3519 { |
3520 static uint8_t countLogClear = 0; | |
623 | 3521 uint8_t i; |
3522 uint8_t retVal = 1; | |
38 | 3523 |
623 | 3524 if(DMA2D_at_work == 255) |
38 | 3525 { |
623 | 3526 i = 0; |
3527 /* skip frame cleaning for actual frames which have not yet been replaced by new top/bottom frames */ | |
3528 while((i < MAXFRAMES) && ((frame[i].status != RELEASED) || (frame[i].StartAddress == GFX_get_pActualFrameTop()) || (frame[i].StartAddress == GFX_get_pActualFrameBottom()))) | |
3529 i++; | |
3530 | |
3531 if((i < MAXFRAMES) && (frame[i].status == RELEASED)) | |
3532 { | |
3533 if(frame[i].caller == 15) | |
3534 countLogClear++; | |
3535 GFX_clear_frame_dma2d(i); | |
38 | 3536 } |
3537 else | |
623 | 3538 { |
3539 retVal = 0; /* no more frame to be cleaned found */ | |
3540 } | |
38 | 3541 } |
623 | 3542 return retVal; |
38 | 3543 } |
3544 | |
3545 | |
3546 static void GFX_Dma2d_TransferComplete(DMA2D_HandleTypeDef* Dma2dHandle) | |
3547 { | |
3548 if(DMA2D_at_work < MAXFRAMES) | |
3549 frame[DMA2D_at_work].status = CLEAR; | |
3550 | |
3551 DMA2D_at_work = 255; | |
3552 } | |
3553 | |
3554 | |
3555 static void GFX_Dma2d_TransferError(DMA2D_HandleTypeDef* Dma2dHandle) | |
3556 { | |
3557 | |
3558 } | |
3559 | |
3560 static void GFX_Error_Handler(void) | |
3561 { | |
3562 /* Turn LED3 on */ | |
3563 // BSP_LED_On(LED3); | |
3564 while(1) | |
3565 { | |
3566 } | |
3567 } | |
3568 | |
3569 void write_content_simple(GFX_DrawCfgScreen *tMscreen, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t color) | |
3570 { | |
3571 GFX_DrawCfgWindow hgfx; | |
3572 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3573 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3574 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3575 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3576 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3577 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3578 if(XrightGimpStyle > 799) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3579 XrightGimpStyle = 799; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3580 if(XleftGimpStyle >= XrightGimpStyle) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3581 XleftGimpStyle = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3582 if(YtopGimpStyle > 479) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3583 YtopGimpStyle = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3584 } |
38 | 3585 hgfx.Image = tMscreen; |
3586 hgfx.WindowNumberOfTextLines = 1; | |
3587 hgfx.WindowLineSpacing = 0; | |
3588 hgfx.WindowTab = 0; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3589 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3590 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3591 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3592 hgfx.WindowX0 = XleftGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3593 hgfx.WindowX1 = XrightGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3594 hgfx.WindowY1 = 479 - YtopGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3595 if(hgfx.WindowY1 < Font->height) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3596 hgfx.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3597 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3598 hgfx.WindowY0 = hgfx.WindowY1 - Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3599 } |
38 | 3600 else |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3601 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3602 hgfx.WindowX0 = 800 - XrightGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3603 hgfx.WindowX1 = 800 - XleftGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3604 hgfx.WindowY0 = YtopGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3605 if(hgfx.WindowY0 + Font->height >= 479) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3606 hgfx.WindowY1 = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3607 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3608 hgfx.WindowY1 = hgfx.WindowY0 + Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3609 } |
38 | 3610 GFX_write_string_color(Font, &hgfx, text, 0, color); |
3611 } | |
3612 | |
3613 | |
3614 void gfx_write_topline_simple(GFX_DrawCfgScreen *tMscreen, const char *text, uint8_t color) | |
3615 { | |
3616 GFX_DrawCfgWindow hgfx; | |
3617 const tFont *Font = &FontT48; | |
3618 | |
3619 hgfx.Image = tMscreen; | |
3620 hgfx.WindowNumberOfTextLines = 1; | |
3621 hgfx.WindowLineSpacing = 0; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3622 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3623 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3624 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3625 |
38 | 3626 hgfx.WindowTab = 0; |
3627 hgfx.WindowX0 = 20; | |
3628 hgfx.WindowX1 = 779; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3629 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3630 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3631 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3632 hgfx.WindowY1 = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3633 hgfx.WindowY0 = hgfx.WindowY1 - Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3634 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3635 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3636 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3637 hgfx.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3638 hgfx.WindowY1 = Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3639 } |
38 | 3640 GFX_write_label(Font, &hgfx, text, color); |
3641 } | |
3642 | |
3643 | |
3644 void gfx_write_page_number(GFX_DrawCfgScreen *tMscreen, uint8_t page, uint8_t total, uint8_t color) | |
3645 { | |
3646 GFX_DrawCfgWindow hgfx; | |
3647 const tFont *Font = &FontT48; | |
3648 char text[7]; | |
3649 uint8_t i, secondDigitPage, secondDigitTotal; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3650 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3651 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3652 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3653 |
509
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3654 if(total > 8) |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3655 { |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3656 Font = &FontT24; |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3657 } |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3658 |
38 | 3659 hgfx.Image = tMscreen; |
3660 hgfx.WindowNumberOfTextLines = 1; | |
3661 hgfx.WindowLineSpacing = 0; | |
3662 hgfx.WindowTab = 0; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3663 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3664 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3665 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3666 hgfx.WindowX1 = 779; |
509
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3667 if(Font == &FontT24) |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3668 { |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3669 hgfx.WindowX0 = hgfx.WindowX1 - (Font->spacesize*3); |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3670 } |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3671 else |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3672 { |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3673 hgfx.WindowX0 = hgfx.WindowX1 - (Font->spacesize2Monospaced*3); |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3674 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3675 hgfx.WindowY1 = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3676 hgfx.WindowY0 = hgfx.WindowY1 - Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3677 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3678 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3679 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3680 hgfx.WindowX1 = 25*5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3681 hgfx.WindowX0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3682 hgfx.WindowY1 = Font->height;; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3683 hgfx.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3684 } |
38 | 3685 if(page > 99) |
3686 page = 99; | |
3687 if(total > 99) | |
3688 total = 99; | |
3689 | |
3690 i = 0; | |
3691 text[i++] = '\002'; | |
3692 | |
3693 secondDigitPage = page / 10; | |
3694 page -= secondDigitPage * 10; | |
3695 | |
3696 secondDigitTotal = total / 10; | |
3697 total -= secondDigitTotal * 10; | |
3698 | |
3699 if(secondDigitPage) | |
3700 text[i++] = '0' + secondDigitPage; | |
3701 text[i++] = '0' + page; | |
3702 | |
3703 text[i++] = '/'; | |
3704 | |
3705 if(secondDigitTotal) | |
3706 text[i++] = '0' + secondDigitTotal; | |
3707 text[i++] = '0' + total; | |
3708 | |
3709 text[i] = 0; | |
3710 | |
3711 GFX_clear_window_immediately(&hgfx); | |
3712 GFX_write_label(Font, &hgfx, text, color); | |
3713 } | |
3714 | |
3715 | |
3716 uint8_t gfx_number_to_string(uint8_t max_digits, _Bool fill, char *pText, uint32_t input) | |
3717 { | |
3718 uint8_t digits[10]; | |
3719 uint32_t number, divider; | |
3720 int first; | |
3721 uint8_t out; | |
3722 | |
3723 number = input; | |
3724 first = 0; | |
3725 divider = 1000000000; | |
3726 for(int i=9;i>=0;i--) | |
3727 { | |
3728 digits[i] = (uint8_t)(number / divider); | |
3729 number -= digits[i] * divider; | |
3730 divider /= 10; | |
3731 if((first == 0) && (digits[i] != 0)) | |
3732 first = i; | |
3733 } | |
3734 | |
3735 if((first + 1) > max_digits) | |
3736 { | |
3737 for(int i = 0; i<max_digits; i++) | |
3738 pText[i] = '9'; | |
3739 out = max_digits; | |
3740 } | |
3741 else if(fill) | |
3742 { | |
3743 int i = 0; | |
3744 for(int k = max_digits; k>0; k--) | |
3745 pText[i++] = digits[k -1] + '0'; | |
3746 out = max_digits; | |
3747 } | |
3748 else | |
3749 { | |
3750 int i = 0; | |
3751 for(int k = first; k>=0; k--) | |
3752 pText[i++] = digits[k] + '0'; | |
3753 out = i; | |
3754 } | |
3755 | |
3756 return out; | |
3757 } | |
3758 | |
3759 | |
3760 /* output is | |
3761 * 0-> | |
3762 * | | |
3763 * v | |
3764 * | |
3765 * input is | |
3766 * | |
3767 * -> | |
3768 * A | |
3769 * | | |
3770 * 0 | |
3771 */ | |
3772 void GFX_screenshot(void) | |
3773 { | |
3774 uint32_t pSource = GFX_get_pActualFrameTop(); | |
3775 uint32_t pSourceBottom =GFX_get_pActualFrameBottom(); | |
3776 uint32_t pBottomNew = getFrame(99); | |
3777 uint32_t pDestination = GFX_doubleBufferOne(); | |
3778 uint32_t sourceNow; | |
3779 | |
3780 | |
3781 uint32_t bot_leftStart = FrameHandler.actualBottom.leftStart; // x0 z.B. 0 | |
3782 uint32_t bot_bottomStart = FrameHandler.actualBottom.bottomStart; // y0 z.B. 25 | |
3783 uint32_t bot_width = FrameHandler.actualBottom.width; // 800 | |
3784 uint32_t bot_height = FrameHandler.actualBottom.height; // 390 | |
3785 | |
3786 struct split | |
3787 { | |
3788 uint8_t blue; | |
3789 uint8_t green; | |
3790 uint8_t red; | |
3791 uint8_t alpha; | |
3792 }; | |
3793 | |
3794 union inout_u | |
3795 { | |
3796 uint32_t in; | |
3797 struct split out; | |
3798 }; | |
3799 | |
3800 union inout_u value; | |
3801 | |
3802 /* test | |
3803 uint32_t pSourceTemp = pSource + (2*479); | |
3804 for (int j = 0xFFFF; j > 0x00FF; j -= 0x0100) | |
3805 { | |
3806 *(__IO uint16_t*)pSourceTemp = j; | |
3807 pSourceTemp += 480*2; | |
3808 } | |
3809 */ | |
3810 // Top Layer | |
3811 const unsigned width = 800, height = 480; | |
3812 const uint32_t heightX2 = height*2; | |
3813 | |
3814 for(unsigned y = 0; y < height; y++) | |
3815 { | |
3816 sourceNow = pSource + 2 * ((height - 1) - y); | |
3817 for(unsigned x = 0; x < width; x++) | |
3818 { | |
3819 // sourceNow += 2 * height * x + 2 * (height - 1 - y); | |
3820 value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; | |
3821 value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); | |
3822 | |
3823 *(__IO uint8_t*)(pDestination++) = value.out.red; | |
3824 *(__IO uint8_t*)(pDestination++) = value.out.green; | |
3825 *(__IO uint8_t*)(pDestination++) = value.out.blue; | |
3826 *(__IO uint8_t*)(pDestination++) = value.out.alpha; | |
3827 sourceNow += heightX2; | |
3828 } | |
3829 } | |
3830 | |
3831 // Bottom Layer | |
3832 // build newBottom | |
3833 pSource = pSourceBottom; | |
3834 for(unsigned x = bot_leftStart; x < bot_leftStart+bot_width; x++) | |
3835 { | |
3836 for(unsigned y = bot_bottomStart; y < bot_bottomStart+bot_height; y++) | |
3837 { | |
3838 pDestination = pBottomNew + (2 * y); | |
3839 pDestination += heightX2 * x; | |
3840 *(__IO uint16_t*)(pDestination) = *(__IO uint16_t*)(pSource); | |
3841 pSource += 2; | |
3842 } | |
3843 } | |
3844 | |
3845 // output Bottom Layer | |
3846 pSource = pBottomNew; | |
3847 pDestination = GFX_doubleBufferTwo(); | |
3848 | |
3849 for(unsigned y = 0; y < height; y++) | |
3850 { | |
3851 sourceNow = pSource + 2 * ((height - 1) - y); | |
3852 for(unsigned x = 0; x < width; x++) | |
3853 { | |
3854 // sourceNow = pSource + 2 * height * x + 2 * (height - 1 - y); | |
3855 value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; | |
3856 value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); | |
3857 | |
3858 *(__IO uint8_t*)(pDestination++) = value.out.red; | |
3859 *(__IO uint8_t*)(pDestination++) = value.out.green; | |
3860 *(__IO uint8_t*)(pDestination++) = value.out.blue; | |
3861 *(__IO uint8_t*)(pDestination++) = value.out.alpha; | |
3862 sourceNow += heightX2; | |
3863 } | |
3864 } | |
3865 releaseFrame(99,pBottomNew); | |
3866 /* | |
3867 // das kommt dazu! | |
3868 unsigned yEnd = 480 - FrameHandler.actualBottom.bottomStart; | |
3869 unsigned yStart = yEnd - FrameHandler.actualBottom.height; | |
3870 | |
3871 if(yStart > 0) | |
3872 { | |
3873 for(unsigned y = 0; y < yStart; y++) | |
3874 for(unsigned x = 0; x < width; x++) | |
3875 { | |
3876 *(__IO uint8_t*)(pDestination++) = 0; | |
3877 *(__IO uint8_t*)(pDestination++) = 0; | |
3878 *(__IO uint8_t*)(pDestination++) = 0; | |
3879 *(__IO uint8_t*)(pDestination++) = 0; | |
3880 } | |
3881 } | |
3882 for(unsigned y = yStart; y < yEnd; y++) | |
3883 for(unsigned x = 0; x < width; x++) | |
3884 { | |
3885 sourceNow = pSource + 2 * height * x + 2 * (height - 1 - y); | |
3886 value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; | |
3887 value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); | |
3888 | |
3889 *(__IO uint8_t*)(pDestination++) = value.out.red; | |
3890 *(__IO uint8_t*)(pDestination++) = value.out.green; | |
3891 *(__IO uint8_t*)(pDestination++) = value.out.blue; | |
3892 *(__IO uint8_t*)(pDestination++) = value.out.alpha; | |
3893 } | |
3894 if(yEnd < 480) | |
3895 { | |
3896 for(unsigned y = yEnd; y < 480; y++) | |
3897 for(unsigned x = 0; x < width; x++) | |
3898 { | |
3899 *(__IO uint8_t*)(pDestination++) = 0; | |
3900 *(__IO uint8_t*)(pDestination++) = 0; | |
3901 *(__IO uint8_t*)(pDestination++) = 0; | |
3902 *(__IO uint8_t*)(pDestination++) = 0; | |
3903 } | |
3904 } | |
3905 */ | |
3906 } | |
567 | 3907 |
3908 tFont* GFX_Check_Extra_Font(uint8_t character, tFont *Font) | |
3909 { | |
3910 uint32_t i; | |
3911 uint32_t found; | |
3912 | |
3913 found = 0; | |
3914 for(i=0;i<Font->length;i++) | |
3915 { | |
3916 if(Font->chars[i].code == character) | |
3917 { | |
3918 found = 1; | |
3919 break; | |
3920 } | |
3921 } | |
3922 if (!found && Font == &FontT54) | |
3923 { | |
699 | 3924 Font = (tFont *)&FontT54Extra; |
567 | 3925 } |
3926 else if (!found && (Font == &FontT84 || Font == &FontT84Spaced)) | |
3927 { | |
699 | 3928 Font = (tFont *)&FontT84Extra; |
567 | 3929 } |
3930 else if (!found && Font == &FontT105) | |
3931 { | |
699 | 3932 Font = (tFont *)&FontT105Extra; |
567 | 3933 } |
3934 | |
3935 return Font; | |
3936 } | |
3937 | |
3938 uint32_t GFX_Character_Width(uint8_t character, tFont *Font) | |
3939 { | |
3940 uint32_t i; | |
3941 uint32_t found; | |
3942 | |
3943 for(i=0;i<Font->length;i++) | |
3944 { | |
3945 if(Font->chars[i].code == character) | |
3946 { | |
3947 return Font->chars[i].image->width; | |
3948 } | |
3949 } | |
3950 | |
3951 found = 0; | |
3952 if (Font == &FontT54) | |
3953 { | |
3954 found = 1; | |
699 | 3955 Font = (tFont *)&FontT54Extra; |
567 | 3956 } |
3957 else if (Font == &FontT84 || Font == &FontT84Spaced) | |
3958 { | |
3959 found = 1; | |
699 | 3960 Font = (tFont *)&FontT84Extra; |
567 | 3961 } |
3962 else if (Font == &FontT105) | |
3963 { | |
3964 found = 1; | |
699 | 3965 Font = (tFont *)&FontT105Extra; |
567 | 3966 } |
3967 | |
3968 if (found) | |
3969 { | |
3970 for(i=0;i<Font->length;i++) | |
3971 { | |
3972 if(Font->chars[i].code == character) | |
3973 { | |
3974 return Font->chars[i].image->width; | |
3975 } | |
3976 } | |
3977 } | |
3978 | |
3979 return 0; | |
3980 } |