Mercurial > public > ostc4
annotate Discovery/Src/gfx_engine.c @ 783:c31237d20491
Update digital O2 sensor information:
In the previous version only one digital O2 sensor was supported and the additional data could be accessed via a separate menu item. Because of the intraduction of the multiplexer there are three datasets available not. Because of the existing menu structure it was not possible to add additional menu items. To solve the problem the sensor information has been moved beghind the sensor On/Off functionality. When selecting a sensor the sensor data will be shown and the de-/activation of a sensor may be done in scope of the sensor information dialog.
author | Ideenmodellierer |
---|---|
date | Mon, 29 May 2023 20:26:38 +0200 |
parents | b7e43b28bee1 |
children | bc6c90e20d9e f7318457df4d |
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 ****************************************************************************** | |
763
aa6006975e76
increase HAL_Delay to 10ms for cold-start-button reset
heinrichsweikamp
parents:
737
diff
changeset
|
1766 * @brief GFX writeGfx_write_label_varstring. / Write string with all parameters and font color options heinrichs weikamp gmbh |
38 | 1767 * @version V0.0.1 |
1768 * @date 22-April-2014 | |
1769 ****************************************************************************** | |
1770 * | |
1771 * @param XleftGimpStyle: | |
1772 * @param XrightGimpStyle: | |
1773 * @param YtopGimpStyle: | |
1774 * @param color: | |
1775 * @param tFont: | |
1776 * @param text: text to be printed | |
1777 * @retval None | |
1778 */ | |
1779 | |
1780 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) | |
1781 { | |
1782 | |
1783 GFX_DrawCfgWindow hgfx; | |
1784 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1785 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1786 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1787 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1788 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1789 |
38 | 1790 if(XrightGimpStyle > 799) |
1791 XrightGimpStyle = 799; | |
1792 if(XleftGimpStyle >= XrightGimpStyle) | |
1793 XleftGimpStyle = 0; | |
1794 if(YtopGimpStyle > 479) | |
1795 YtopGimpStyle = 479; | |
1796 hgfx.Image = screenInput; | |
1797 hgfx.WindowNumberOfTextLines = 1; | |
1798 hgfx.WindowLineSpacing = 0; | |
1799 hgfx.WindowTab = 0; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1800 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1801 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1802 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1803 hgfx.WindowX0 = XleftGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1804 hgfx.WindowX1 = XrightGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1805 hgfx.WindowY1 = 479 - YtopGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1806 if(hgfx.WindowY1 < Font->height) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1807 hgfx.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1808 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1809 hgfx.WindowY0 = hgfx.WindowY1 - Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1810 } |
38 | 1811 else |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1812 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1813 hgfx.WindowX0 = 800 - XrightGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1814 hgfx.WindowX1 = 800 - XleftGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1815 hgfx.WindowY0 = YtopGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1816 if(hgfx.WindowY0 + Font->height > 480) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1817 hgfx.WindowY1 = 480; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1818 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1819 hgfx.WindowY1 = hgfx.WindowY0 + Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
1820 } |
38 | 1821 GFX_write_label(Font, &hgfx, text, color); |
1822 } | |
1823 | |
1824 /** | |
1825 ****************************************************************************** | |
1826 * @brief GFX write string. / Write string with all parameters and font options | |
1827 * @author heinrichs weikamp gmbh | |
1828 * @version V0.0.1 | |
1829 * @date 22-April-2014 | |
1830 ****************************************************************************** | |
1831 * | |
1832 * @param hgfx: check gfx_engine.h. | |
1833 * @param color: 32bit ARGB8888. | |
1834 * @retval None | |
1835 */ | |
1836 | |
1837 uint16_t GFX_return_offset(const tFont *Font, char *pText, uint8_t position) | |
1838 { | |
1839 char character; | |
1840 uint16_t digit, i; | |
1841 uint8_t found; | |
1842 uint16_t distance; | |
1843 | |
1844 if(position == 0) | |
1845 return 0; | |
1846 | |
1847 distance = 0; | |
1848 for(digit = 0; digit < position; digit++) | |
1849 { | |
1850 character = pText[digit]; | |
1851 if(character == 0) | |
1852 return 0; | |
1853 | |
1854 found = 0; | |
1855 for(i=0;i<Font->length;i++) | |
1856 { | |
1857 if(Font->chars[i].code == character) | |
1858 { | |
1859 found = 1; | |
1860 break; | |
1861 } | |
1862 } | |
1863 if(found) | |
1864 { | |
1865 distance += (uint16_t)(Font->chars[i].image->width); | |
1866 if(Font == &FontT144) | |
1867 distance += 3; | |
1868 else | |
1869 if(Font == &FontT105) | |
1870 distance += 2; | |
1871 } | |
1872 } | |
1873 return distance; | |
1874 | |
1875 /* FEHLT: | |
1876 if(*pText < ' ') | |
1877 if((*pText) & 0x80) | |
1878 | |
1879 if(((tFont *)settings.font == &FontT105) && settings.dualFont && ((*pText == '.') || (*pText == ':'))) | |
1880 settings.font = (uint32_t)&FontT54; | |
1881 */ | |
1882 } | |
1883 | |
1884 void GFX_clean_line(GFX_DrawCfgWindow* hgfx, uint32_t line_number) | |
1885 { | |
1886 uint16_t height; | |
1887 uint32_t pDestination, i, j; | |
1888 uint16_t left, width, bottom, nextlineStep; | |
1889 | |
1890 bottom = hgfx->WindowY0; | |
1891 | |
1892 if(hgfx->WindowNumberOfTextLines && line_number && (line_number <= hgfx->WindowNumberOfTextLines)) | |
1893 { | |
1894 bottom += hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); | |
1895 height = hgfx->WindowLineSpacing; | |
1896 } | |
1897 else | |
1898 { | |
1899 height = 1 + hgfx->WindowY1 - bottom; | |
1900 } | |
1901 | |
1902 pDestination = (uint32_t)hgfx->Image->FBStartAdress; | |
1903 | |
1904 left = hgfx->WindowX0; | |
1905 width = 1 + hgfx->WindowX1 - left; | |
1906 nextlineStep = hgfx->Image->ImageHeight - height; | |
1907 nextlineStep *= 2; | |
1908 pDestination += 2 * bottom; | |
1909 pDestination += 2 * hgfx->Image->ImageHeight * left; | |
1910 | |
1911 for(j = width; j > 0; j--) | |
1912 { | |
1913 for(i = height; i > 0; i--) | |
1914 { | |
1915 *(__IO uint16_t*)pDestination = 0; | |
1916 pDestination += 2; | |
1917 } | |
1918 pDestination += nextlineStep; | |
1919 } | |
1920 } | |
1921 | |
1922 | |
1923 void GFX_clean_area(GFX_DrawCfgScreen *tMscreen, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, uint16_t YBottomGimpStyle) | |
1924 { | |
1925 uint16_t height; | |
1926 uint32_t pDestination, i, j; | |
1927 int32_t left, width, bottom, nextlineStep; | |
1928 | |
1929 bottom = tMscreen->ImageHeight - YBottomGimpStyle; | |
1930 height = 1 + YBottomGimpStyle - YtopGimpStyle; | |
1931 | |
1932 if(bottom < 0) | |
1933 bottom = 0; | |
1934 if(height > tMscreen->ImageHeight) | |
1935 height = tMscreen->ImageHeight; | |
1936 | |
1937 pDestination = tMscreen->FBStartAdress; | |
1938 | |
1939 left = XleftGimpStyle; | |
1940 width = 1 + XrightGimpStyle - left; | |
1941 if(width < 1) | |
1942 width = 1; | |
1943 | |
1944 if(width > tMscreen->ImageWidth) | |
1945 width = tMscreen->ImageWidth; | |
1946 | |
1947 nextlineStep = tMscreen->ImageHeight - height; | |
1948 nextlineStep *= 2; | |
1949 pDestination += 2 * bottom; | |
1950 pDestination += 2 * tMscreen->ImageHeight * left; | |
1951 | |
1952 for(j = width; j > 0; j--) | |
1953 { | |
1954 for(i = height; i > 0; i--) | |
1955 { | |
1956 *(__IO uint16_t*)pDestination = 0; | |
1957 pDestination += 2; | |
1958 } | |
1959 pDestination += nextlineStep; | |
1960 } | |
1961 } | |
1962 | |
1963 | |
1964 uint32_t GFX_write_string(const tFont *Font, GFX_DrawCfgWindow* hgfx, const char *pText, uint32_t line_number) | |
1965 { | |
1966 return GFX_write_string_color(Font, hgfx, pText, line_number, 0); | |
1967 } | |
1968 | |
1969 uint32_t GFX_write_string_color(const tFont *Font, GFX_DrawCfgWindow* hgfx, const char *pText, uint32_t line_number, uint8_t color) | |
1970 { | |
1971 if(hgfx->Image->FBStartAdress < FBGlobalStart) | |
1972 return 0; | |
1973 | |
1974 GFX_CfgWriteString settings; | |
1975 uint32_t newXdelta; | |
1976 uint8_t minimal = 0; | |
1977 // uint32_t try_again; | |
1978 | |
1979 if(hgfx->WindowNumberOfTextLines && line_number && (line_number <= hgfx->WindowNumberOfTextLines)) | |
1980 { | |
1981 settings.Ydelta = hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); | |
1982 } | |
1983 else | |
1984 { | |
1985 settings.Ydelta = 0; | |
1986 } | |
1987 settings.font = (uint32_t)Font; | |
1988 settings.Xdelta = 0; | |
1989 settings.color = color; | |
1990 settings.invert = 0; | |
1991 settings.resize = 0; | |
1992 settings.dualFont = 0; | |
1993 settings.spaceMode = 0; | |
1994 settings.singleSpaceWithSizeOfNextChar = 0; | |
1995 settings.useTinyFont = 0; | |
1996 settings.TinyFontExtraYdelta = 0; | |
1997 settings.TinyFont = (uint32_t)Font; | |
1998 settings.doubleSize = 0; | |
1999 | |
2000 if((*pText) == TXT_MINIMAL) // for customtext and anything with Sonderzeichen | |
2001 minimal = 1; | |
2002 else | |
2003 minimal = 0; | |
2004 | |
2005 if(Font == &FontT144) | |
2006 settings.TinyFont = (uint32_t)&FontT84; | |
2007 else | |
2008 if(Font == &FontT105) | |
2009 settings.TinyFont = (uint32_t)&FontT54; | |
2010 else | |
2011 if(Font == &FontT54) | |
2012 { | |
2013 settings.TinyFont = (uint32_t)&FontT48; | |
2014 settings.TinyFontExtraYdelta = -9; | |
2015 } | |
2016 else | |
2017 if(Font == &FontT48) | |
2018 { | |
2019 settings.TinyFont = (uint32_t)&FontT24; | |
2020 settings.TinyFontExtraYdelta = 6; | |
2021 } | |
2022 else | |
2023 if(Font == &FontT42) | |
2024 { | |
2025 settings.TinyFont = (uint32_t)&FontT24; | |
2026 settings.TinyFontExtraYdelta = 2; | |
2027 } | |
2028 | |
2029 settings.actualFont = (tFont *)settings.font; | |
2030 | |
2031 while ((*pText != 0) && (settings.Xdelta != 0x0000FFFF))// und fehlend: Abfrage window / image size | |
2032 { | |
2033 // try_again = 0; | |
2034 | |
2035 if((*pText == '\177') && !minimal) | |
2036 { | |
2037 if(settings.singleSpaceWithSizeOfNextChar) | |
2038 { | |
2039 settings.singleSpaceWithSizeOfNextChar = 0; | |
2040 pText++; | |
2041 settings.Xdelta += *pText; | |
2042 } | |
2043 else | |
2044 settings.singleSpaceWithSizeOfNextChar = 1; | |
2045 } | |
2046 else | |
2047 if(*pText < ' ') | |
2048 { | |
2049 /* Xdelta -inline- changes */ | |
2050 if((*pText == '\t') && !minimal) | |
2051 settings.Xdelta = hgfx->WindowTab - hgfx->WindowX0; | |
2052 else | |
2053 if(*pText == '\r') // carriage return, no newline | |
2054 settings.Xdelta = 0; | |
2055 else | |
537
0ad0b26ec56b
Added center / right alignment option to custom text display:
Ideenmodellierer
parents:
509
diff
changeset
|
2056 if((*pText == '\001')) // center |
38 | 2057 settings.Xdelta = GFX_write__Modify_Xdelta__Centered(&settings, hgfx, pText+1); |
2058 else | |
537
0ad0b26ec56b
Added center / right alignment option to custom text display:
Ideenmodellierer
parents:
509
diff
changeset
|
2059 if((*pText == '\002')) // right |
38 | 2060 settings.Xdelta = GFX_write__Modify_Xdelta__RightAlign(&settings, hgfx, pText+1); |
2061 else | |
2062 if((*pText == '\003') && !minimal) // doubleSize | |
2063 settings.doubleSize = 1; | |
2064 else | |
2065 /* Xdelta -up/down changes */ | |
2066 if((*pText == '\f') && !minimal) // form feed = top align | |
2067 { | |
2068 if((hgfx->WindowY1 - hgfx->WindowY0) >= ((tFont *)settings.font)->height) | |
2069 { | |
2070 settings.Ydelta = hgfx->WindowY1 - hgfx->WindowY0; | |
2071 settings.Ydelta -= ((tFont *)settings.font)->height; | |
2072 } | |
2073 } | |
2074 else | |
2075 if(*pText == '\n') // newline, no carriage return | |
2076 { | |
2077 if(hgfx->WindowNumberOfTextLines && (line_number < hgfx->WindowNumberOfTextLines)) | |
2078 { | |
2079 line_number++; | |
2080 settings.Ydelta = hgfx->WindowLineSpacing * (hgfx->WindowNumberOfTextLines - line_number); | |
2081 } | |
2082 } | |
2083 else | |
2084 /* Font style changes */ | |
2085 if(*pText == '\a') | |
737
5071d554aaa5
NEW: Add mini compass with marker declination indication
heinrichsweikamp
parents:
705
diff
changeset
|
2086 settings.invert = settings.invert ? 0 : 1; |
38 | 2087 else |
2088 if((*pText == '\016') && !minimal) | |
2089 { | |
2090 if(settings.dualFont == 0) | |
2091 settings.dualFont = 1; | |
2092 else | |
2093 settings.actualFont = (tFont *)settings.TinyFont; | |
2094 } | |
2095 else | |
2096 if((*pText == '\017') && !minimal) | |
2097 { | |
2098 settings.dualFont = 0; | |
2099 settings.actualFont = (tFont *)settings.font; | |
2100 } | |
2101 else | |
2102 if((*pText == '\005') && !minimal) | |
2103 { | |
2104 newXdelta = GFX_write_char(hgfx, &settings, 'a', (tFont *)&Awe48); | |
2105 settings.Xdelta = newXdelta; | |
2106 } | |
2107 else | |
2108 if((*pText == '\006') && !minimal) | |
2109 { | |
2110 newXdelta = GFX_write_char(hgfx, &settings, 'b', (tFont *)&Awe48); | |
2111 settings.Xdelta = newXdelta; | |
2112 } | |
2113 else | |
2114 if((*pText >= '\020') && (*pText <= '\032') && !minimal) | |
2115 settings.color = *pText - '\020'; | |
2116 else | |
2117 if((*pText == '\034') && !minimal) | |
2118 settings.spaceMode = 1; | |
2119 else | |
2120 if((*pText == '\035') && !minimal) | |
2121 settings.spaceMode = 0; | |
2122 } | |
2123 else | |
2124 if(((*pText) == TXT_2BYTE) && !minimal) | |
2125 { | |
2126 pText++; | |
2127 settings.Xdelta = GFX_write_substring(&settings, hgfx, (uint8_t)TXT_2BYTE, (int8_t)*pText); | |
2128 } | |
2129 else | |
2130 if(((*pText) & 0x80) && !minimal) | |
2131 settings.Xdelta = GFX_write_substring(&settings, hgfx, (uint8_t)*pText, 0); | |
2132 else | |
2133 if(!settings.invert && (*pText == ' ')) | |
2134 { | |
2135 if(settings.spaceMode == 0) | |
2136 settings.Xdelta += ((tFont *)settings.font)->spacesize; | |
2137 else | |
2138 settings.Xdelta += ((tFont *)settings.font)->spacesize2Monospaced; | |
2139 } | |
2140 else | |
2141 if((settings.spaceMode == 1) && (*pText == ' ')) | |
2142 settings.Xdelta += ((tFont *)settings.font)->spacesize2Monospaced; | |
2143 else | |
2144 { | |
2145 if(((tFont *)settings.font == &FontT144) && ((*pText == '.') || (*pText == ':'))) | |
2146 settings.actualFont = (tFont *)settings.TinyFont; | |
2147 else | |
2148 if(((tFont *)settings.font == &FontT105) && settings.dualFont && ((*pText == '.') || (*pText == ':'))) | |
2149 settings.actualFont = (tFont *)settings.TinyFont; | |
2150 | |
2151 if(settings.actualFont == (tFont *)settings.TinyFont) | |
2152 settings.Ydelta += settings.TinyFontExtraYdelta; | |
2153 | |
2154 newXdelta = GFX_write_char(hgfx, &settings, *(uint8_t *)pText, settings.actualFont); | |
2155 settings.Xdelta = newXdelta; | |
2156 | |
2157 if(settings.actualFont == (tFont *)settings.TinyFont) | |
2158 settings.Ydelta -= settings.TinyFontExtraYdelta; | |
2159 } | |
2160 if(pText != 0) /* for TXT_2BYTE */ | |
2161 pText++; | |
2162 } | |
2163 return settings.Ydelta; | |
2164 } | |
2165 | |
2166 /* Private functions ---------------------------------------------------------*/ | |
2167 /****************************************************************************** | |
2168 Static Function | |
2169 *******************************************************************************/ | |
2170 | |
2171 /** | |
2172 ****************************************************************************** | |
2173 * @brief GFX write substring. / Write string without parameters | |
2174 * @author heinrichs weikamp gmbh | |
2175 * @version V0.0.1 | |
2176 * @date 22-April-2014 | |
2177 ****************************************************************************** | |
2178 * | |
2179 * @param hgfx: check gfx_engine.h. | |
2180 * @param color: 32bit ARGB8888. | |
2181 * @retval None | |
2182 */ | |
2183 | |
2184 static uint32_t GFX_write_substring(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, uint8_t textId, int8_t nextCharFor2Byte) | |
2185 { | |
2186 uint8_t i, j; | |
2187 uint32_t found; | |
2188 uint32_t pText; | |
58 | 2189 uint16_t decodeUTF8; |
38 | 2190 uint8_t gfx_selected_language; |
2191 #ifndef BOOTLOADER_STANDALONE | |
2192 SSettings *pSettings; | |
2193 pSettings = settingsGetPointer(); | |
2194 gfx_selected_language = pSettings->selected_language; | |
2195 if(gfx_selected_language >= LANGUAGE_END) | |
2196 #endif | |
2197 gfx_selected_language = 0; | |
58 | 2198 |
2199 | |
38 | 2200 // ----------------------------- |
58 | 2201 if(textId != (uint8_t)TXT_2BYTE) |
38 | 2202 { |
2203 found = 0; | |
2204 j = 0; | |
2205 for(i=(uint8_t)TXT_Language;i<(uint8_t)TXT_END;i++) | |
2206 { | |
2207 if(text_array[j].code == textId) | |
2208 { | |
2209 found = 1; | |
2210 break; | |
2211 } | |
2212 j++; | |
2213 } | |
2214 if(!found) | |
2215 return cfg->Xdelta; | |
58 | 2216 |
38 | 2217 // ----------------------------- |
2218 pText = (uint32_t)text_array[j].text[gfx_selected_language]; | |
2219 if(!pText) | |
2220 pText = (uint32_t)text_array[j].text[0]; | |
2221 else | |
2222 if(*(char*)pText == 0) | |
2223 pText = (uint32_t)text_array[j].text[0]; | |
2224 } | |
2225 // ----------------------------- | |
2226 else | |
2227 { | |
2228 if(!nextCharFor2Byte) | |
2229 return cfg->Xdelta; | |
2230 | |
2231 found = 0; | |
2232 for(j=0;j<(uint8_t)TXT2BYTE_END-(uint8_t)TXT2BYTE_START;j++) | |
2233 { | |
2234 if((uint8_t)text_array2[j].code == (uint8_t)nextCharFor2Byte) | |
2235 { | |
2236 found = 1; | |
2237 break; | |
2238 } | |
2239 } | |
2240 if(!found) | |
2241 return cfg->Xdelta; | |
2242 // ----------------------------- | |
2243 pText = (uint32_t)text_array2[j].text[gfx_selected_language]; | |
2244 if(!pText) | |
2245 pText = (uint32_t)text_array2[j].text[0]; | |
2246 else | |
2247 if(*(char*)pText == 0) | |
2248 pText = (uint32_t)text_array2[j].text[0]; | |
2249 } | |
2250 // ----------------------------- | |
2251 | |
2252 if(cfg->actualFont == (tFont *)cfg->TinyFont) | |
2253 cfg->Ydelta += cfg->TinyFontExtraYdelta; | |
2254 | |
2255 while (*(char*)pText != 0)// und fehlend: Abfrage window / image size | |
2256 { | |
2257 if(*(char*)pText == '\t') | |
2258 cfg->Xdelta = hgfx->WindowTab - hgfx->WindowX0; | |
2259 else | |
612 | 2260 if((*(char*)pText == ' ') && (cfg->invert == 0)) /* bypass drawing of white space only for not inverted mode */ |
2261 { | |
38 | 2262 cfg->Xdelta += ((tFont *)cfg->actualFont)->spacesize; |
612 | 2263 } |
38 | 2264 else |
58 | 2265 if((*(char*)pText) & 0x80) /* Identify a UNICODE character other than standard ASCII using the highest bit */ |
2266 { | |
2267 decodeUTF8 = ((*(char*)pText) & 0x1F) << 6; /* use 5bits of first byte for upper part of unicode */ | |
2268 pText++; | |
2269 decodeUTF8 |= (*(char*)pText) & 0x3F; /* add lower 6bits as second part of the unicode */ | |
2270 if (decodeUTF8 <= 0xff) /* The following function has a uint8 input parameter ==> no UNICODEs > 0xff supported */ | |
2271 { | |
2272 cfg->Xdelta = GFX_write_char(hgfx, cfg, (uint8_t)decodeUTF8, (tFont *)cfg->actualFont); | |
2273 } | |
2274 } | |
2275 else | |
38 | 2276 cfg->Xdelta = GFX_write_char(hgfx, cfg, *(uint8_t *)pText, (tFont *)cfg->actualFont); |
2277 | |
2278 pText++; | |
2279 } | |
2280 | |
2281 if(cfg->actualFont == (tFont *)cfg->TinyFont) | |
2282 cfg->Ydelta -= cfg->TinyFontExtraYdelta; | |
2283 | |
2284 return cfg->Xdelta; | |
2285 } | |
2286 | |
2287 | |
2288 /** | |
2289 ****************************************************************************** | |
2290 * @brief GFX write char. / Write non-inverted, non-colored with entire 8 bit range | |
2291 * @author heinrichs weikamp gmbh | |
2292 * @version V0.0.1 | |
2293 * @date 22-April-2014 | |
2294 ****************************************************************************** | |
2295 * | |
2296 * @param hgfx: check gfx_engine.h. | |
2297 * @param Ydelta: input | |
2298 * @param character: character | |
2299 * @param *Font: pointer to font to be used for this char | |
2300 * @retval Ydelta: 0x0000FFFF if not successful or char_truncated | |
2301 */ | |
2302 | |
2303 static uint32_t GFX_write_char_doubleSize(GFX_DrawCfgWindow* hgfx, GFX_CfgWriteString* cfg, uint8_t character, tFont *Font) | |
2304 { | |
2305 uint32_t i, j; | |
2306 uint32_t width, height; | |
2307 uint32_t found; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2308 uint16_t* pDestination; |
38 | 2309 uint32_t pSource; |
2310 uint32_t OffsetDestination; | |
2311 uint32_t width_left; | |
2312 uint32_t height_left; | |
2313 uint32_t char_truncated_WidthFlag; | |
2314 uint32_t char_truncated_Height; | |
2315 uint8_t fill; | |
2316 uint32_t widthFont, heightFont; | |
2317 uint32_t nextLine; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2318 int32_t stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2319 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2320 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2321 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2322 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2323 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2324 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2325 stepdir = -1; /* decrement address while putting pixels */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2326 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2327 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2328 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2329 stepdir = 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2330 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2331 |
38 | 2332 |
2333 if(hgfx->Image->ImageWidth <= (hgfx->WindowX0 + cfg->Xdelta)) | |
2334 return 0x0000FFFF; | |
2335 | |
2336 // ----------------------------- | |
2337 found = 0; | |
2338 for(i=0;i<Font->length;i++) | |
2339 { | |
2340 if(Font->chars[i].code == character) | |
2341 { | |
2342 found = 1; | |
2343 break; | |
2344 } | |
2345 } | |
2346 if(!found) | |
2347 return cfg->Xdelta; | |
2348 | |
2349 pSource = ((uint32_t)Font->chars[i].image->data); | |
119 | 2350 pDestination = (uint16_t*)(hgfx->Image->FBStartAdress); |
38 | 2351 |
2352 heightFont = Font->chars[i].image->height; | |
2353 widthFont = Font->chars[i].image->width; | |
2354 | |
2355 height = heightFont*2; | |
2356 width = widthFont*2; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2357 |
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 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2360 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2361 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
|
2362 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
|
2363 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2364 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2365 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2366 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
|
2367 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
|
2368 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2369 OffsetDestination = (hgfx->Image->ImageHeight - height); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2370 nextLine = hgfx->Image->ImageHeight; |
38 | 2371 |
2372 // ----------------------------- | |
2373 char_truncated_WidthFlag = 0; | |
772
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2374 if(!pSettings->FlipDisplay) |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2375 { |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2376 width_left = hgfx->Image->ImageWidth - (hgfx->WindowX0 + cfg->Xdelta); |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2377 } |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2378 else |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2379 { |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2380 width_left = (hgfx->WindowX1 - cfg->Xdelta); |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2381 } |
38 | 2382 if(width_left < width) |
2383 { | |
2384 char_truncated_WidthFlag = 1; | |
2385 width = width_left; | |
2386 widthFont = width/2; | |
2387 } | |
2388 // ----------------------------- | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2389 |
38 | 2390 char_truncated_Height = 0; |
2391 height_left = hgfx->Image->ImageHeight - (hgfx->WindowY0 + cfg->Ydelta); | |
2392 if(height_left < height) | |
2393 { | |
2394 char_truncated_Height = height - height_left; | |
2395 if((char_truncated_Height & 1) != 0) | |
2396 { | |
2397 height_left -= 1; | |
2398 char_truncated_Height += 1; | |
2399 } | |
2400 height = height_left; | |
2401 heightFont = height/2; | |
2402 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2403 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2404 OffsetDestination += char_truncated_Height; |
38 | 2405 // ----------------------------- |
2406 if(height == 0) | |
2407 return 0x0000FFFF; | |
2408 // ----------------------------- | |
2409 | |
2410 if(cfg->singleSpaceWithSizeOfNextChar) | |
2411 { | |
2412 cfg->singleSpaceWithSizeOfNextChar = 0; | |
2413 | |
2414 if(cfg->invert) | |
2415 fill = 0xFF; | |
2416 else | |
2417 fill = 0; | |
2418 | |
2419 height /= 2; | |
2420 for(i = width; i > 0; i--) | |
2421 { | |
2422 for (j = height; j > 0; j--) | |
2423 { | |
119 | 2424 *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2425 pDestination += stepdir; |
119 | 2426 *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2427 pDestination += stepdir; |
38 | 2428 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2429 pDestination += stepdir * OffsetDestination; |
38 | 2430 } |
2431 } | |
2432 else | |
2433 if(cfg->invert) | |
2434 { | |
2435 if((heightFont & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ | |
2436 { | |
2437 heightFont /= 4; | |
2438 for(i = widthFont; i > 0; i--) | |
2439 { | |
2440 if(*(uint8_t*)pSource != 0x01) | |
2441 { | |
2442 for (j = heightFont; j > 0; j--) | |
2443 { | |
119 | 2444 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2445 *(__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
|
2446 pDestination += stepdir; |
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; |
38 | 2450 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2451 |
119 | 2452 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2453 *(__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
|
2454 pDestination += stepdir; |
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; |
38 | 2458 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2459 |
119 | 2460 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2461 *(__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
|
2462 pDestination += stepdir; |
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; |
38 | 2466 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2467 |
119 | 2468 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2469 *(__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
|
2470 pDestination += stepdir; |
119 | 2471 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2472 *(__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
|
2473 pDestination += stepdir; |
38 | 2474 pSource++; |
2475 } | |
2476 pSource += char_truncated_Height; | |
2477 } | |
2478 else | |
2479 { | |
2480 pSource++; | |
612 | 2481 for (j = heightFont; j > 0; j--) |
38 | 2482 { |
119 | 2483 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
612 | 2484 *(__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
|
2485 pDestination += stepdir; |
119 | 2486 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2487 *(__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
|
2488 pDestination += stepdir; |
119 | 2489 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2490 *(__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
|
2491 pDestination += stepdir; |
612 | 2492 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
119 | 2493 *(__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
|
2494 pDestination += stepdir; |
119 | 2495 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2496 *(__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
|
2497 pDestination += stepdir; |
119 | 2498 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2499 *(__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
|
2500 pDestination += stepdir; |
119 | 2501 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2502 *(__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
|
2503 pDestination += stepdir; |
119 | 2504 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2505 *(__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
|
2506 pDestination += stepdir; |
38 | 2507 } |
2508 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2509 pDestination += (OffsetDestination + nextLine) * stepdir; |
38 | 2510 } |
2511 } | |
2512 else | |
2513 { | |
2514 heightFont /= 2; | |
2515 for(i = widthFont; i > 0; i--) | |
2516 { | |
2517 if(*(uint8_t*)pSource != 0x01) | |
2518 { | |
2519 for (j = heightFont; j > 0; j--) | |
2520 { | |
119 | 2521 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2522 *(__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
|
2523 pDestination += stepdir; |
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; |
38 | 2527 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2528 |
119 | 2529 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2530 *(__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
|
2531 pDestination += stepdir; |
119 | 2532 *(__IO uint16_t*)pDestination = (0xFF - *(uint8_t*)pSource) << 8 | cfg->color; |
2533 *(__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
|
2534 pDestination += stepdir; |
38 | 2535 pSource++; |
2536 } | |
2537 pSource += char_truncated_Height; | |
2538 } | |
2539 else | |
2540 { | |
2541 pSource++; | |
2542 for (j = heightFont; j > 0; j--) | |
2543 { | |
119 | 2544 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2545 *(__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
|
2546 pDestination += stepdir; |
119 | 2547 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2548 *(__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
|
2549 pDestination += stepdir; |
119 | 2550 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2551 *(__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
|
2552 pDestination += stepdir; |
119 | 2553 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
2554 *(__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
|
2555 pDestination += stepdir; |
38 | 2556 } |
2557 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2558 pDestination += (OffsetDestination + nextLine) * stepdir; |
38 | 2559 } |
2560 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2561 } /* inverted */ |
38 | 2562 else |
2563 { | |
2564 if((heightFont & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ | |
2565 { | |
2566 heightFont /= 4; | |
2567 for(i = widthFont; i > 0; i--) | |
2568 { | |
2569 if(*(uint8_t*)pSource != 0x01) | |
2570 { | |
2571 for (j = heightFont; j > 0; j--) | |
2572 { | |
119 | 2573 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2574 *(__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
|
2575 pDestination += stepdir; |
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; |
38 | 2579 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2580 |
119 | 2581 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2582 *(__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
|
2583 pDestination += stepdir; |
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; |
38 | 2587 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2588 |
119 | 2589 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2590 *(__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
|
2591 pDestination += stepdir; |
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; |
38 | 2595 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2596 |
119 | 2597 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2598 *(__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
|
2599 pDestination += stepdir; |
119 | 2600 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2601 *(__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
|
2602 pDestination += stepdir; |
38 | 2603 pSource++; |
2604 } | |
2605 pSource += char_truncated_Height; | |
2606 } | |
2607 else | |
2608 { | |
2609 pSource++; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2610 pDestination += stepdir * height; |
38 | 2611 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2612 pDestination += stepdir * (OffsetDestination + nextLine); |
38 | 2613 } |
2614 } | |
2615 else | |
2616 { | |
2617 heightFont /= 2; | |
2618 for(i = widthFont; i > 0; i--) | |
2619 { | |
2620 if(*(uint8_t*)pSource != 0x01) | |
2621 { | |
2622 for (j = heightFont; j > 0; j--) | |
2623 { | |
119 | 2624 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2625 *(__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
|
2626 pDestination += stepdir; |
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; |
38 | 2630 pSource++; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2631 |
119 | 2632 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2633 *(__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
|
2634 pDestination += stepdir; |
119 | 2635 *(__IO uint16_t*)pDestination = *(uint8_t*)pSource << 8 | cfg->color; |
2636 *(__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
|
2637 pDestination += stepdir; |
38 | 2638 pSource++; |
2639 } | |
2640 pSource += char_truncated_Height; | |
2641 } | |
2642 else | |
2643 { | |
2644 pSource++; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2645 pDestination += stepdir * height; |
38 | 2646 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2647 pDestination += stepdir * (OffsetDestination + nextLine); |
38 | 2648 } |
2649 } | |
2650 } | |
2651 | |
2652 // ----------------------------- | |
2653 | |
2654 if(Font == &FontT144) | |
2655 width += 6; | |
2656 else | |
2657 if(Font == &FontT105) | |
2658 width += 4; | |
2659 | |
2660 // ----------------------------- | |
2661 | |
2662 if(char_truncated_WidthFlag) | |
2663 return 0x0000FFFF; | |
2664 else | |
2665 return cfg->Xdelta + width; | |
2666 | |
2667 } | |
2668 | |
2669 | |
2670 /** | |
2671 ****************************************************************************** | |
2672 * @brief GFX write char. / Write non-inverted, non-colored with entire 8 bit range | |
2673 * @author heinrichs weikamp gmbh | |
2674 * @version V0.0.1 | |
2675 * @date 22-April-2014 | |
2676 ****************************************************************************** | |
2677 * | |
2678 * @param hgfx: check gfx_engine.h. | |
2679 * @param Ydelta: input | |
2680 * @param character: character | |
2681 * @param *Font: pointer to font to be used for this char | |
2682 * @retval Ydelta: 0x0000FFFF if not successful or char_truncated | |
2683 */ | |
2684 | |
2685 static uint32_t GFX_write_char(GFX_DrawCfgWindow* hgfx, GFX_CfgWriteString* cfg, uint8_t character, tFont *Font) | |
2686 { | |
567 | 2687 Font = GFX_Check_Extra_Font(character, Font); |
38 | 2688 if(cfg->doubleSize) |
2689 { | |
2690 return GFX_write_char_doubleSize(hgfx, cfg, character, Font); | |
2691 } | |
2692 | |
2693 uint32_t i, j; | |
2694 uint32_t width, height; | |
2695 uint32_t found; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2696 uint16_t* pDestination; |
38 | 2697 uint32_t pSource; |
2698 uint32_t OffsetDestination; | |
2699 uint32_t width_left; | |
2700 uint32_t height_left; | |
2701 uint32_t char_truncated_WidthFlag; | |
2702 uint32_t char_truncated_Height; | |
2703 uint8_t fill; | |
121 | 2704 uint32_t fillpattern; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2705 int16_t stepdir; |
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 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2708 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2709 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2710 if(pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2711 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2712 stepdir = -1; /* decrement address while putting pixels */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2713 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2714 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2715 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2716 stepdir = 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2717 } |
38 | 2718 |
2719 if(hgfx->Image->ImageWidth <= (hgfx->WindowX0 + cfg->Xdelta)) | |
2720 return 0x0000FFFF; | |
2721 | |
2722 // ----------------------------- | |
2723 found = 0; | |
2724 for(i=0;i<Font->length;i++) | |
2725 { | |
2726 if(Font->chars[i].code == character) | |
2727 { | |
2728 found = 1; | |
2729 break; | |
2730 } | |
2731 } | |
2732 if(!found) | |
2733 return cfg->Xdelta; | |
2734 // ----------------------------- | |
2735 /* | |
2736 if(Font == &Font144) | |
2737 cfg->Xdelta += 3; | |
2738 else | |
2739 if(Font == &Font84) | |
2740 cfg->Xdelta += 2; | |
2741 */ | |
2742 // ----------------------------- | |
2743 | |
2744 | |
2745 pSource = ((uint32_t)Font->chars[i].image->data); | |
119 | 2746 pDestination = (uint16_t*)(hgfx->Image->FBStartAdress); |
2747 | |
38 | 2748 |
2749 height = Font->chars[i].image->height; | |
2750 width = Font->chars[i].image->width; | |
2751 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2752 OffsetDestination = hgfx->Image->ImageHeight - height; |
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 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2755 /* Xyyyyy y= height */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2756 /* Xyyyyy x= width */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2757 /* Xyyyyy */ |
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 if(pSettings->FlipDisplay) |
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->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
|
2762 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
|
2763 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2764 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2765 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2766 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
|
2767 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
|
2768 } |
38 | 2769 |
2770 | |
2771 // ----------------------------- | |
2772 char_truncated_WidthFlag = 0; | |
772
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2773 if(!pSettings->FlipDisplay) |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2774 { |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2775 width_left = hgfx->Image->ImageWidth - (hgfx->WindowX0 + cfg->Xdelta); |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2776 } |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2777 else |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2778 { |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2779 width_left = (hgfx->WindowX1 - cfg->Xdelta); |
b7e43b28bee1
Fix character truncation when screen is flipped. This was causing the dive computer to lock up when in English Units with the screen flipped when the first decompression stop is shown using FONT_105.
izzni
parents:
763
diff
changeset
|
2780 } |
38 | 2781 if(width_left < width) |
2782 { | |
2783 char_truncated_WidthFlag = 1; | |
2784 width = width_left; | |
2785 } | |
2786 // ----------------------------- | |
2787 char_truncated_Height = 0; | |
681
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2788 if(!pSettings->FlipDisplay) |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2789 { |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2790 height_left = hgfx->Image->ImageHeight - (hgfx->WindowY0 + cfg->Ydelta); |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2791 } |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2792 else |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2793 { |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2794 height_left = (hgfx->WindowY1 - cfg->Ydelta); |
7fa5ef6ae419
Bugfix screen clipping (Flipdisplay mode):
Ideenmodellierer
parents:
649
diff
changeset
|
2795 } |
38 | 2796 if(height_left < height) |
2797 { | |
2798 char_truncated_Height = height - height_left; | |
2799 if((char_truncated_Height & 1) != 0) | |
2800 { | |
2801 height_left -= 1; | |
2802 char_truncated_Height += 1; | |
2803 } | |
2804 height = height_left; | |
2805 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2806 OffsetDestination += char_truncated_Height; |
38 | 2807 // ----------------------------- |
2808 if(height == 0) | |
2809 return 0x0000FFFF; | |
2810 // ----------------------------- | |
2811 | |
2812 if(cfg->singleSpaceWithSizeOfNextChar) | |
2813 { | |
2814 cfg->singleSpaceWithSizeOfNextChar = 0; | |
2815 | |
2816 if(cfg->invert) | |
2817 fill = 0xFF; | |
2818 else | |
2819 fill = 0; | |
2820 | |
2821 height /= 2; | |
2822 for(i = width; i > 0; i--) | |
2823 { | |
2824 for (j = height; j > 0; j--) | |
2825 { | |
119 | 2826 *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2827 pDestination += stepdir; |
119 | 2828 *(__IO uint16_t*)pDestination = fill << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2829 pDestination += stepdir; |
38 | 2830 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2831 pDestination += stepdir * OffsetDestination; |
38 | 2832 } |
2833 } | |
2834 else | |
2835 if(cfg->invert) | |
2836 { | |
2837 if((height & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ | |
2838 { | |
2839 height /= 4; | |
2840 for(i = width; i > 0; i--) | |
2841 { | |
2842 if(*(uint8_t*)pSource != 0x01) | |
2843 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2844 |
38 | 2845 for (j = height; j > 0; j--) |
2846 { | |
119 | 2847 *(__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
|
2848 pDestination += stepdir; |
119 | 2849 *(__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
|
2850 pDestination += stepdir; |
119 | 2851 *(__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
|
2852 pDestination += stepdir; |
119 | 2853 *(__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
|
2854 pDestination += stepdir; |
38 | 2855 } |
2856 pSource += char_truncated_Height; | |
2857 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2858 else /* empty line => fast fill */ |
38 | 2859 { |
2860 pSource++; | |
121 | 2861 fillpattern = (( 0xFF << 8 | cfg->color) << 16) | ( 0xFF << 8 | cfg->color); |
2862 if(pSettings->FlipDisplay) pDestination--; /* address fill from high to low */ | |
38 | 2863 for (j = height; j > 0; j--) |
2864 { | |
121 | 2865 *(__IO uint32_t*)pDestination = fillpattern; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2866 pDestination += stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2867 pDestination += stepdir; |
121 | 2868 *(__IO uint32_t*)pDestination = fillpattern; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2869 pDestination += stepdir; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2870 pDestination += stepdir; |
38 | 2871 } |
121 | 2872 if(pSettings->FlipDisplay) pDestination++; |
38 | 2873 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2874 pDestination += stepdir * OffsetDestination; |
38 | 2875 } |
2876 } | |
2877 else | |
2878 { | |
2879 height /= 2; | |
2880 for(i = width; i > 0; i--) | |
2881 { | |
2882 if(*(uint8_t*)pSource != 0x01) | |
2883 { | |
2884 for (j = height; j > 0; j--) | |
2885 { | |
119 | 2886 *(__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
|
2887 pDestination += stepdir; |
119 | 2888 *(__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
|
2889 pDestination += stepdir; |
38 | 2890 } |
2891 pSource += char_truncated_Height; | |
2892 } | |
2893 else | |
2894 { | |
2895 pSource++; | |
2896 for (j = height; j > 0; j--) | |
2897 { | |
119 | 2898 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2899 pDestination += stepdir; |
119 | 2900 *(__IO uint16_t*)pDestination = 0xFF << 8 | cfg->color; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2901 pDestination += stepdir; |
38 | 2902 } |
2903 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2904 pDestination += stepdir * OffsetDestination; |
38 | 2905 } |
2906 } | |
2907 } | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2908 else /* not inverted */ |
38 | 2909 { |
2910 if((height & 3) == 0) /* unroll for perfomance, by 4 if possible, by 2 (16bit) otherwise */ | |
2911 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2912 |
38 | 2913 height /= 4; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2914 |
38 | 2915 for(i = width; i > 0; i--) |
2916 { | |
2917 if(*(uint8_t*)pSource != 0x01) | |
2918 { | |
2919 for (j = height; j > 0; j--) | |
2920 { | |
119 | 2921 *(__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
|
2922 pDestination += stepdir; |
119 | 2923 *(__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
|
2924 pDestination += stepdir; |
119 | 2925 *(__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
|
2926 pDestination += stepdir; |
119 | 2927 *(__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
|
2928 pDestination += stepdir; |
38 | 2929 } |
121 | 2930 |
38 | 2931 pSource += char_truncated_Height; |
2932 } | |
119 | 2933 else /* clear line */ |
38 | 2934 { |
2935 pSource++; | |
121 | 2936 fillpattern = (cfg->color << 16) | cfg->color; |
2937 if(pSettings->FlipDisplay) pDestination--; /* address fill from high to low */ | |
2938 | |
119 | 2939 for (j = height; j > 0; j--) |
2940 { | |
121 | 2941 *(__IO uint32_t*)pDestination = fillpattern; |
119 | 2942 pDestination += stepdir; |
2943 pDestination += stepdir; | |
121 | 2944 *(__IO uint32_t*)pDestination = fillpattern; |
119 | 2945 pDestination += stepdir; |
2946 pDestination += stepdir; | |
2947 } | |
121 | 2948 if(pSettings->FlipDisplay) pDestination++; |
38 | 2949 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2950 pDestination += stepdir * OffsetDestination; |
38 | 2951 } |
2952 } | |
2953 else | |
2954 { | |
2955 height /= 2; | |
2956 for(i = width; i > 0; i--) | |
2957 { | |
2958 if(*(uint8_t*)pSource != 0x01) | |
2959 { | |
2960 for (j = height; j > 0; j--) | |
2961 { | |
119 | 2962 *(__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
|
2963 pDestination += stepdir; |
119 | 2964 *(__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
|
2965 pDestination += stepdir; |
38 | 2966 } |
2967 pSource += char_truncated_Height; | |
2968 } | |
119 | 2969 else /* clear line */ |
38 | 2970 { |
2971 pSource++; | |
119 | 2972 for (j = height; j > 0; j--) |
2973 { | |
2974 *(__IO uint16_t*)pDestination = cfg->color; | |
2975 pDestination += stepdir; | |
2976 *(__IO uint16_t*)pDestination = cfg->color; | |
2977 pDestination += stepdir; | |
2978 } | |
38 | 2979 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
2980 pDestination += stepdir * OffsetDestination; |
38 | 2981 } |
2982 } | |
2983 } | |
2984 | |
2985 // ----------------------------- | |
2986 | |
2987 if(Font == &FontT144) | |
2988 width += 3; | |
2989 else | |
2990 if(Font == &FontT105) | |
2991 width += 2; | |
2992 /* | |
2993 else | |
2994 if(Font == &Font144) | |
2995 width += 3; | |
2996 else | |
2997 if(Font == &Font84) | |
2998 width += 1; | |
2999 */ | |
3000 // ----------------------------- | |
3001 | |
3002 if(char_truncated_WidthFlag) | |
3003 return 0x0000FFFF; | |
3004 else | |
3005 return cfg->Xdelta + width; | |
3006 } | |
3007 | |
3008 | |
3009 /** | |
3010 ****************************************************************************** | |
3011 * @brief GFX write Modify helper for center and right align. | |
3012 * @author heinrichs weikamp gmbh | |
3013 * @version V0.0.1 | |
3014 * @date 17-March-2015 | |
3015 ****************************************************************************** | |
3016 * | |
3017 * @param *cText: output | |
3018 * @param *pTextInput: input | |
3019 * @param gfx_selected_language: gfx_selected_language | |
3020 * @retval counter and *cText content | |
3021 */ | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3022 static int8_t GFX_write__Modify_helper(char *cText, const char *pTextInput, uint8_t gfx_selected_language) |
38 | 3023 { |
3024 uint32_t pText, backup; | |
3025 uint8_t textId; | |
3026 int8_t counter; | |
3027 uint32_t found; | |
3028 uint32_t j; | |
3029 | |
3030 pText = (uint32_t)pTextInput; | |
3031 counter = 0; | |
537
0ad0b26ec56b
Added center / right alignment option to custom text display:
Ideenmodellierer
parents:
509
diff
changeset
|
3032 while((counter < 100) && (*(char*)pText != 0) && (*(char*)pText != '\r') && (*(char*)pText != '\n')) |
38 | 3033 { |
3034 if((*(char*)pText) == TXT_2BYTE) | |
3035 { | |
3036 backup = pText; | |
3037 | |
3038 found = 0; | |
3039 j = 0; | |
3040 textId = (int8_t)*(char*)(pText + 1); | |
3041 if(textId != 0) | |
3042 { | |
3043 for(j=0;j<(uint8_t)TXT2BYTE_END-(uint8_t)TXT2BYTE_START;j++) | |
3044 { | |
3045 if((uint8_t)text_array2[j].code == (uint8_t)textId) | |
3046 { | |
3047 found = 1; | |
3048 break; | |
3049 } | |
3050 } | |
3051 if(found) | |
3052 { | |
3053 pText = (uint32_t)text_array2[j].text[gfx_selected_language]; | |
3054 if(!pText) | |
3055 pText = (uint32_t)text_array2[j].text[0]; | |
3056 else | |
3057 if(*(char*)pText == 0) | |
3058 pText = (uint32_t)text_array2[j].text[0]; | |
3059 | |
3060 while((counter < 100) && (*(char*)pText != 0)) | |
3061 cText[counter++] = *(char*)pText++; | |
3062 } | |
3063 pText = backup + 2; | |
3064 } | |
3065 else | |
3066 pText = 0; | |
3067 } | |
699 | 3068 if(0 != pText && ((*(char*)pText) & 0x80)) |
38 | 3069 { |
3070 backup = pText; | |
3071 | |
3072 found = 0; | |
3073 j = 0; | |
3074 textId = (uint8_t)*(char*)pText; | |
3075 for(uint8_t ii=(uint8_t)TXT_Language;ii<(uint8_t)TXT_END;ii++) | |
3076 { | |
3077 if(text_array[j].code == textId) | |
3078 { | |
3079 found = 1; | |
3080 break; | |
3081 } | |
3082 j++; | |
3083 } | |
3084 if(found) | |
3085 { | |
3086 pText = (uint32_t)text_array[j].text[gfx_selected_language]; | |
3087 if(!pText) | |
3088 pText = (uint32_t)text_array[j].text[0]; | |
3089 else | |
3090 if(*(char*)pText == 0) | |
3091 pText = (uint32_t)text_array[j].text[0]; | |
3092 | |
3093 while((counter < 100) && (*(char*)pText != 0)) | |
3094 cText[counter++] = *(char*)pText++; | |
3095 } | |
3096 pText = backup + 1; | |
3097 } | |
3098 else | |
3099 { | |
3100 cText[counter++] = *(char*)pText++; | |
3101 } | |
3102 } | |
3103 cText[counter] = 0; | |
3104 return counter; | |
3105 } | |
3106 | |
3107 | |
3108 /** | |
3109 ****************************************************************************** | |
3110 * @brief GFX write Modify Ydelta for align. / calc Ydelta for start | |
3111 * @author heinrichs weikamp gmbh | |
3112 * @version V0.0.1 | |
3113 * @date 22-April-2014 | |
3114 ****************************************************************************** | |
3115 * | |
3116 * @param *hgfx: check gfx_engine.h. | |
3117 * @param *cfg: Ydelta, Font | |
3118 * @param *pText: character | |
3119 * @retval Ydelta: 0 if text has to start left ( and probably does not fit) | |
3120 */ | |
3121 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3122 static uint32_t GFX_write__Modify_Xdelta__Centered(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, const char *pTextInput) |
38 | 3123 { |
3124 char cText[101]; | |
3125 uint32_t result; | |
3126 uint32_t Xsum; | |
583 | 3127 uint32_t j; |
38 | 3128 uint8_t gfx_selected_language; |
3129 uint32_t pText; | |
58 | 3130 uint16_t decodeUTF8; |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3131 uint8_t tinyState = 0; /* used to identify the usage of tiny font */ |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3132 tFont* ptargetFont; |
38 | 3133 |
3134 #ifndef BOOTLOADER_STANDALONE | |
3135 SSettings *pSettings; | |
3136 pSettings = settingsGetPointer(); | |
3137 gfx_selected_language = pSettings->selected_language; | |
3138 if(gfx_selected_language >= LANGUAGE_END) | |
3139 #endif | |
3140 gfx_selected_language = 0; | |
3141 // ----------------------------- | |
3142 | |
3143 GFX_write__Modify_helper(cText,pTextInput,gfx_selected_language); | |
3144 | |
3145 pText = (uint32_t)&cText[0]; | |
3146 Xsum = 0; | |
3147 j = 0; | |
565
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3148 ptargetFont = (tFont *)cfg->font; |
38 | 3149 while (*(char*)pText != 0)// und fehlend: Abfrage window / image size |
3150 { | |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3151 if(*(char*)pText == '\016') /* request font change */ |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3152 { |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3153 tinyState++; |
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 if(*(char*)pText == '\017') /* request font reset */ |
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 tinyState = 0; |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3158 } |
565
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3159 |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3160 if((ptargetFont == &FontT105) && ((*(char*)pText == '.') || (*(char*)pText == ':'))) |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3161 { |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3162 tinyState++; |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3163 } |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3164 |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3165 if(tinyState > 1) |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3166 { |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3167 ptargetFont = (tFont *)cfg->TinyFont; |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3168 } |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3169 else |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3170 { |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3171 ptargetFont = (tFont *)cfg->font; |
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3172 } |
649
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3173 |
699 | 3174 decodeUTF8 = *(char*)pText; /* place ASCII char */ |
649
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3175 if((*(char*)pText == '\005') || (*(char*)pText == '\006')) |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3176 { |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3177 Xsum += 45; |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3178 } |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3179 else |
58 | 3180 { |
698 | 3181 if((*(char*)pText) & 0x80) /* Identify a UNICODE character other than standard ASCII using the highest bit */ |
3182 { | |
3183 decodeUTF8 = ((*(char*)pText) & 0x1F) << 6; /* use 5bits of first byte for upper part of unicode */ | |
3184 pText++; | |
3185 decodeUTF8 |= (*(char*)pText) & 0x3F; /* add lower 6bits as second part of the unicode */ | |
3186 } | |
3187 else | |
3188 { | |
3189 decodeUTF8 = *(char*)pText; /* place ASCII char */ | |
3190 } | |
3191 Xsum += GFX_Character_Width(decodeUTF8, ptargetFont); | |
58 | 3192 } |
567 | 3193 |
38 | 3194 pText++; |
3195 j++; | |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3196 if((ptargetFont == &FontT144) && (*(char*)pText != 0)) |
38 | 3197 Xsum += 3; |
3198 else | |
481
89f6857276f8
Bugfix calculation of string center position:
ideenmodellierer
parents:
314
diff
changeset
|
3199 if((ptargetFont == &FontT105) && (*(char*)pText != 0)) |
38 | 3200 Xsum += 2; |
3201 } | |
3202 pText -= j; | |
3203 | |
3204 if(cfg->doubleSize) | |
3205 Xsum *= 2; | |
3206 | |
3207 result = hgfx->WindowX1 - hgfx->WindowX0; | |
3208 if(Xsum < result) | |
3209 { | |
3210 result -= Xsum; | |
3211 result /= 2; | |
3212 } | |
3213 else | |
3214 result = 0; | |
3215 return result; | |
3216 } | |
3217 | |
3218 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3219 static uint32_t GFX_write__Modify_Xdelta__RightAlign(GFX_CfgWriteString* cfg, GFX_DrawCfgWindow* hgfx, const char *pTextInput) |
38 | 3220 { |
3221 char cText[101]; | |
3222 uint32_t result; | |
3223 uint32_t Xsum; | |
583 | 3224 uint32_t j; |
38 | 3225 tFont *font; |
3226 uint8_t gfx_selected_language; | |
3227 uint32_t pText; | |
58 | 3228 uint16_t decodeUTF8; |
485 | 3229 uint8_t tinyState = 0; /* used to identify the usage of tiny font */ |
38 | 3230 |
3231 #ifndef BOOTLOADER_STANDALONE | |
3232 SSettings *pSettings; | |
3233 pSettings = settingsGetPointer(); | |
3234 gfx_selected_language = pSettings->selected_language; | |
3235 if(gfx_selected_language >= LANGUAGE_END) | |
3236 #endif | |
3237 gfx_selected_language = 0; | |
3238 // ----------------------------- | |
3239 | |
3240 GFX_write__Modify_helper(cText,pTextInput,gfx_selected_language); | |
3241 pText = (uint32_t)&cText[0]; | |
3242 | |
3243 // ----------------------------- | |
3244 | |
3245 font = (tFont *)cfg->font; | |
3246 Xsum = 0; | |
3247 j = 0; | |
3248 | |
3249 while (*(char*)pText != 0)// und fehlend: Abfrage window / image size | |
3250 { | |
485 | 3251 if(*(char*)pText == '\016') /* request font change */ |
3252 { | |
3253 tinyState++; | |
3254 } | |
3255 if(*(char*)pText == '\017') /* request font reset */ | |
3256 { | |
3257 tinyState = 0; | |
3258 } | |
565
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3259 |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3260 if((font == &FontT144) && (*(char*)pText == '.')) |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3261 { |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3262 tinyState++; |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3263 } |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3264 if((font == &FontT105) && ((*(char*)pText == '.') || (*(char*)pText == ':'))) |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3265 { |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3266 tinyState++; |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3267 } |
7b56d4eda695
Bugfix center / right alignment if dualfont is used:
Ideenmodellierer
parents:
537
diff
changeset
|
3268 |
485 | 3269 if(tinyState > 1) |
3270 { | |
3271 font = (tFont *)cfg->TinyFont; | |
3272 } | |
3273 else | |
3274 { | |
3275 font = (tFont *)cfg->font; | |
3276 } | |
3277 | |
38 | 3278 if(*(char*)pText == ' ') |
3279 { | |
3280 Xsum += font->spacesize; | |
3281 } | |
3282 else | |
649
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3283 if((*(char*)pText == '\005') || (*(char*)pText == '\006')) |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3284 { |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3285 Xsum += 45; |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3286 } |
60162a939c06
Bugfix consider checkbox in calculation of right aligned and centered position:
Ideenmodellierer
parents:
623
diff
changeset
|
3287 else |
38 | 3288 { |
58 | 3289 if((*(char*)pText) & 0x80) /* Identify a UNICODE character other than standard ASCII using the highest bit */ |
3290 { | |
3291 decodeUTF8 = ((*(char*)pText) & 0x1F) << 6; /* use 5bits of first byte for upper part of unicode */ | |
3292 pText++; | |
3293 decodeUTF8 |= (*(char*)pText) & 0x3F; /* add lower 6bits as second part of the unicode */ | |
3294 } | |
3295 else | |
3296 { | |
3297 decodeUTF8 = *(char*)pText; | |
3298 } | |
567 | 3299 Xsum += GFX_Character_Width(decodeUTF8, font); /* lookup character and add width */ |
38 | 3300 } |
3301 pText++; | |
3302 j++; | |
3303 if((font == &FontT144) && (*(char*)pText != 0)) | |
3304 Xsum += 3; | |
3305 else | |
3306 if((font == &FontT105) && (*(char*)pText != 0)) | |
3307 Xsum += 2; | |
3308 } | |
3309 pText -= j; | |
3310 | |
3311 if(cfg->doubleSize) | |
3312 Xsum *= 2; | |
3313 | |
3314 result = hgfx->WindowX1 - hgfx->WindowX0 - 1; | |
3315 if(Xsum < result) | |
3316 result -= Xsum; | |
3317 else | |
3318 result = 0; | |
3319 | |
3320 return result; | |
3321 } | |
3322 | |
3323 void GFX_LTDC_Init(void) | |
3324 { | |
3325 /* | |
3326 HSYNC=10 (9+1) | |
3327 HBP=10 (19-10+1) | |
3328 ActiveW=480 (499-10-10+1) | |
3329 HFP=8 (507-480-10-10+1) | |
3330 | |
3331 VSYNC=2 (1+1) | |
3332 VBP=2 (3-2+1) | |
3333 ActiveH=800 (803-2-2+1) | |
3334 VFP=2 (805-800-2-2+1) | |
3335 */ | |
3336 | |
3337 /* Timing configuration */ | |
3338 /* Horizontal synchronization width = Hsync - 1 */ | |
3339 LtdcHandle.Init.HorizontalSync = 9; | |
3340 /* Vertical synchronization height = Vsync - 1 */ | |
3341 LtdcHandle.Init.VerticalSync = 1; | |
3342 /* Accumulated horizontal back porch = Hsync + HBP - 1 */ | |
3343 LtdcHandle.Init.AccumulatedHBP = 19; | |
3344 /* Accumulated vertical back porch = Vsync + VBP - 1 */ | |
3345 LtdcHandle.Init.AccumulatedVBP = 3; | |
3346 /* Accumulated active width = Hsync + HBP + Active Width - 1 */ | |
3347 LtdcHandle.Init.AccumulatedActiveW = 499;//500;//499; | |
3348 /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */ | |
3349 LtdcHandle.Init.AccumulatedActiveH = 803; | |
3350 /* Total width = Hsync + HBP + Active Width + HFP - 1 */ | |
3351 LtdcHandle.Init.TotalWidth = 507;//508;//507; | |
3352 /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ | |
3353 LtdcHandle.Init.TotalHeigh = 805; | |
3354 | |
3355 /* Configure R,G,B component values for LCD background color */ | |
3356 LtdcHandle.Init.Backcolor.Red= 0; | |
3357 LtdcHandle.Init.Backcolor.Blue= 0; | |
3358 LtdcHandle.Init.Backcolor.Green= 0; | |
3359 | |
3360 /* LCD clock configuration */ | |
3361 /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ | |
3362 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ | |
3363 /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ | |
3364 /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_8 = 48/4 = 6Mhz */ | |
3365 | |
3366 /* done in main.c SystemClockConfig | |
3367 | |
3368 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; | |
3369 PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; | |
3370 PeriphClkInitStruct.PLLSAI.PLLSAIR = 4; | |
3371 PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8; | |
3372 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); | |
3373 */ | |
3374 /* Polarity */ | |
3375 LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL; | |
3376 LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL; | |
3377 LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL; | |
3378 LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IIPC;//LTDC_PCPOLARITY_IPC; | |
3379 | |
3380 LtdcHandle.Instance = LTDC; | |
3381 | |
3382 /* Configure the LTDC */ | |
3383 if(HAL_LTDC_Init(&LtdcHandle) != HAL_OK) // auch init der GPIO Pins | |
3384 { | |
3385 /* Initialization Error */ | |
3386 GFX_Error_Handler(); | |
3387 } | |
3388 } | |
3389 | |
3390 void GFX_LTDC_LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address) | |
3391 { | |
3392 LTDC_LayerCfgTypeDef Layercfg; | |
3393 | |
3394 /* Layer Init */ | |
3395 Layercfg.WindowX0 = 0; | |
3396 Layercfg.WindowX1 = 480; | |
3397 Layercfg.WindowY0 = 0; | |
3398 Layercfg.WindowY1 = 800; | |
3399 Layercfg.PixelFormat = LTDC_PIXEL_FORMAT_AL88;//LTDC_PIXEL_FORMAT_ARGB8888; | |
3400 Layercfg.FBStartAdress = FB_Address; | |
3401 Layercfg.Alpha = 255; | |
3402 Layercfg.Alpha0 = 0; | |
3403 Layercfg.Backcolor.Blue = 0; | |
3404 Layercfg.Backcolor.Green = 0; | |
3405 Layercfg.Backcolor.Red = 0; | |
3406 Layercfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; | |
3407 Layercfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; | |
3408 Layercfg.ImageWidth = 480; | |
3409 Layercfg.ImageHeight = 800; | |
3410 | |
3411 HAL_LTDC_ConfigCLUT(&LtdcHandle, ColorLUT, CLUT_END, LayerIndex); | |
3412 HAL_LTDC_ConfigLayer(&LtdcHandle, &Layercfg, LayerIndex); | |
3413 HAL_LTDC_EnableCLUT(&LtdcHandle, LayerIndex); | |
3414 } | |
3415 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3416 static uint32_t GFX_doubleBufferOne(void) |
38 | 3417 { |
3418 return SDRAM_DOUBLE_BUFFER_ONE; | |
3419 } | |
3420 | |
3421 | |
297
87d54b4fd946
cleanup: remove unused code, make static, remove commented code
Jan Mulder <jlmulder@xs4all.nl>
parents:
296
diff
changeset
|
3422 static uint32_t GFX_doubleBufferTwo(void) |
38 | 3423 { |
3424 return SDRAM_DOUBLE_BUFFER_TWO; | |
3425 } | |
3426 | |
3427 uint32_t getFrame(uint8_t callerId) | |
3428 { | |
623 | 3429 static uint8_t lastFrameProvided = 0; |
38 | 3430 uint8_t i; |
3431 | |
623 | 3432 /* first iteration: look for a clear frame */ |
3433 i = lastFrameProvided; | |
3434 do | |
3435 { | |
38 | 3436 i++; |
623 | 3437 if(i == MAXFRAMES) |
3438 { | |
3439 i = 0; | |
3440 } | |
3441 } while((i != lastFrameProvided) && (frame[i].status != CLEAR)); | |
38 | 3442 |
3443 if((i < MAXFRAMES) && (frame[i].status == CLEAR)) | |
3444 { | |
3445 frame[i].status = BLOCKED; | |
3446 frame[i].caller = callerId; | |
623 | 3447 lastFrameProvided = i; |
38 | 3448 return frame[i].StartAddress; |
3449 } | |
3450 | |
623 | 3451 /* second iteration: look for a frame which may be reused after clearing */ |
3452 i = lastFrameProvided; | |
3453 do | |
3454 { | |
38 | 3455 i++; |
623 | 3456 if(i == MAXFRAMES) |
3457 { | |
3458 i = 0; | |
3459 } | |
705 | 3460 }while((i != lastFrameProvided) && (frame[i].status != RELEASED)); |
623 | 3461 |
38 | 3462 |
3463 if((i < MAXFRAMES) && (frame[i].status == RELEASED)) | |
3464 { | |
3465 GFX_clear_frame_immediately(frame[i].StartAddress); | |
3466 frame[i].status = BLOCKED; | |
623 | 3467 lastFrameProvided = i; |
38 | 3468 return frame[i].StartAddress; |
3469 } | |
3470 return 0; | |
3471 } | |
3472 | |
3473 | |
3474 void GFX_forceReleaseFramesWithId(uint8_t callerId) | |
3475 { | |
3476 for(int i=0; i<MAXFRAMES; i++) | |
3477 if((frame[i].caller == callerId) && (frame[i].status == BLOCKED)) | |
3478 frame[i].status = RELEASED; | |
3479 } | |
3480 | |
3481 | |
3482 void releaseAllFramesExcept(uint8_t callerId, uint32_t frameStartAddress) | |
3483 { | |
3484 for(int i=0; i<MAXFRAMES; i++) | |
3485 if((frame[i].caller == callerId) && (frame[i].status == BLOCKED) && (frame[i].StartAddress != frameStartAddress)) | |
3486 frame[i].status = RELEASED; | |
3487 } | |
3488 | |
3489 | |
3490 uint8_t releaseFrame(uint8_t callerId, uint32_t frameStartAddress) | |
3491 { | |
3492 static uint8_t countErrorCalls = 0; | |
3493 | |
3494 if(frameStartAddress < FBGlobalStart) | |
3495 return 2; | |
3496 | |
3497 | |
3498 uint8_t i; | |
3499 | |
3500 i = 0; | |
3501 while((i < MAXFRAMES) && (frame[i].StartAddress != frameStartAddress)) | |
3502 i++; | |
3503 | |
3504 if((i < MAXFRAMES) && (frame[i].StartAddress == frameStartAddress)) | |
3505 { | |
3506 if(frame[i].caller == callerId) | |
3507 { | |
3508 frame[i].status = RELEASED; | |
3509 return 1; | |
3510 } | |
3511 else | |
3512 countErrorCalls++; | |
3513 } | |
3514 return 0; | |
3515 } | |
3516 | |
3517 | |
3518 uint16_t blockedFramesCount(void) | |
3519 { | |
3520 uint16_t count = MAXFRAMES; | |
3521 | |
3522 for(int i = 0;i<MAXFRAMES;i++) | |
3523 if(frame[i].status == BLOCKED) | |
3524 count--; | |
3525 | |
3526 return count; | |
3527 } | |
3528 | |
3529 | |
623 | 3530 uint8_t housekeepingFrame(void) |
38 | 3531 { |
3532 static uint8_t countLogClear = 0; | |
623 | 3533 uint8_t i; |
3534 uint8_t retVal = 1; | |
38 | 3535 |
623 | 3536 if(DMA2D_at_work == 255) |
38 | 3537 { |
623 | 3538 i = 0; |
3539 /* skip frame cleaning for actual frames which have not yet been replaced by new top/bottom frames */ | |
3540 while((i < MAXFRAMES) && ((frame[i].status != RELEASED) || (frame[i].StartAddress == GFX_get_pActualFrameTop()) || (frame[i].StartAddress == GFX_get_pActualFrameBottom()))) | |
3541 i++; | |
3542 | |
3543 if((i < MAXFRAMES) && (frame[i].status == RELEASED)) | |
3544 { | |
3545 if(frame[i].caller == 15) | |
3546 countLogClear++; | |
3547 GFX_clear_frame_dma2d(i); | |
38 | 3548 } |
3549 else | |
623 | 3550 { |
3551 retVal = 0; /* no more frame to be cleaned found */ | |
3552 } | |
38 | 3553 } |
623 | 3554 return retVal; |
38 | 3555 } |
3556 | |
3557 | |
3558 static void GFX_Dma2d_TransferComplete(DMA2D_HandleTypeDef* Dma2dHandle) | |
3559 { | |
3560 if(DMA2D_at_work < MAXFRAMES) | |
3561 frame[DMA2D_at_work].status = CLEAR; | |
3562 | |
3563 DMA2D_at_work = 255; | |
3564 } | |
3565 | |
3566 | |
3567 static void GFX_Dma2d_TransferError(DMA2D_HandleTypeDef* Dma2dHandle) | |
3568 { | |
3569 | |
3570 } | |
3571 | |
3572 static void GFX_Error_Handler(void) | |
3573 { | |
3574 /* Turn LED3 on */ | |
3575 // BSP_LED_On(LED3); | |
3576 while(1) | |
3577 { | |
3578 } | |
3579 } | |
3580 | |
3581 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) | |
3582 { | |
3583 GFX_DrawCfgWindow hgfx; | |
3584 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3585 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3586 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3587 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3588 if(!pSettings->FlipDisplay) |
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(XrightGimpStyle > 799) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3591 XrightGimpStyle = 799; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3592 if(XleftGimpStyle >= XrightGimpStyle) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3593 XleftGimpStyle = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3594 if(YtopGimpStyle > 479) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3595 YtopGimpStyle = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3596 } |
38 | 3597 hgfx.Image = tMscreen; |
3598 hgfx.WindowNumberOfTextLines = 1; | |
3599 hgfx.WindowLineSpacing = 0; | |
3600 hgfx.WindowTab = 0; | |
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 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3603 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3604 hgfx.WindowX0 = XleftGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3605 hgfx.WindowX1 = XrightGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3606 hgfx.WindowY1 = 479 - YtopGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3607 if(hgfx.WindowY1 < Font->height) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3608 hgfx.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3609 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3610 hgfx.WindowY0 = hgfx.WindowY1 - Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3611 } |
38 | 3612 else |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3613 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3614 hgfx.WindowX0 = 800 - XrightGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3615 hgfx.WindowX1 = 800 - XleftGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3616 hgfx.WindowY0 = YtopGimpStyle; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3617 if(hgfx.WindowY0 + Font->height >= 479) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3618 hgfx.WindowY1 = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3619 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3620 hgfx.WindowY1 = hgfx.WindowY0 + Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3621 } |
38 | 3622 GFX_write_string_color(Font, &hgfx, text, 0, color); |
3623 } | |
3624 | |
3625 | |
3626 void gfx_write_topline_simple(GFX_DrawCfgScreen *tMscreen, const char *text, uint8_t color) | |
3627 { | |
3628 GFX_DrawCfgWindow hgfx; | |
3629 const tFont *Font = &FontT48; | |
3630 | |
3631 hgfx.Image = tMscreen; | |
3632 hgfx.WindowNumberOfTextLines = 1; | |
3633 hgfx.WindowLineSpacing = 0; | |
110
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 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3636 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3637 |
38 | 3638 hgfx.WindowTab = 0; |
3639 hgfx.WindowX0 = 20; | |
3640 hgfx.WindowX1 = 779; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3641 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3642 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3643 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3644 hgfx.WindowY1 = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3645 hgfx.WindowY0 = hgfx.WindowY1 - Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3646 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3647 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3648 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3649 hgfx.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3650 hgfx.WindowY1 = Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3651 } |
38 | 3652 GFX_write_label(Font, &hgfx, text, color); |
3653 } | |
3654 | |
3655 | |
3656 void gfx_write_page_number(GFX_DrawCfgScreen *tMscreen, uint8_t page, uint8_t total, uint8_t color) | |
3657 { | |
3658 GFX_DrawCfgWindow hgfx; | |
3659 const tFont *Font = &FontT48; | |
3660 char text[7]; | |
3661 uint8_t i, secondDigitPage, secondDigitTotal; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3662 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3663 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3664 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3665 |
509
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3666 if(total > 8) |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3667 { |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3668 Font = &FontT24; |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3669 } |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3670 |
38 | 3671 hgfx.Image = tMscreen; |
3672 hgfx.WindowNumberOfTextLines = 1; | |
3673 hgfx.WindowLineSpacing = 0; | |
3674 hgfx.WindowTab = 0; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3675 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3676 if(!pSettings->FlipDisplay) |
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 hgfx.WindowX1 = 779; |
509
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3679 if(Font == &FontT24) |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3680 { |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3681 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
|
3682 } |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3683 else |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3684 { |
56824129dd56
Show page number in small letters if more than 8 tabs are active
Ideenmodellierer
parents:
494
diff
changeset
|
3685 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
|
3686 } |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3687 hgfx.WindowY1 = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3688 hgfx.WindowY0 = hgfx.WindowY1 - Font->height; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3689 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3690 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3691 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3692 hgfx.WindowX1 = 25*5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3693 hgfx.WindowX0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3694 hgfx.WindowY1 = Font->height;; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3695 hgfx.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
58
diff
changeset
|
3696 } |
38 | 3697 if(page > 99) |
3698 page = 99; | |
3699 if(total > 99) | |
3700 total = 99; | |
3701 | |
3702 i = 0; | |
3703 text[i++] = '\002'; | |
3704 | |
3705 secondDigitPage = page / 10; | |
3706 page -= secondDigitPage * 10; | |
3707 | |
3708 secondDigitTotal = total / 10; | |
3709 total -= secondDigitTotal * 10; | |
3710 | |
3711 if(secondDigitPage) | |
3712 text[i++] = '0' + secondDigitPage; | |
3713 text[i++] = '0' + page; | |
3714 | |
3715 text[i++] = '/'; | |
3716 | |
3717 if(secondDigitTotal) | |
3718 text[i++] = '0' + secondDigitTotal; | |
3719 text[i++] = '0' + total; | |
3720 | |
3721 text[i] = 0; | |
3722 | |
3723 GFX_clear_window_immediately(&hgfx); | |
3724 GFX_write_label(Font, &hgfx, text, color); | |
3725 } | |
3726 | |
3727 | |
3728 uint8_t gfx_number_to_string(uint8_t max_digits, _Bool fill, char *pText, uint32_t input) | |
3729 { | |
3730 uint8_t digits[10]; | |
3731 uint32_t number, divider; | |
3732 int first; | |
3733 uint8_t out; | |
3734 | |
3735 number = input; | |
3736 first = 0; | |
3737 divider = 1000000000; | |
3738 for(int i=9;i>=0;i--) | |
3739 { | |
3740 digits[i] = (uint8_t)(number / divider); | |
3741 number -= digits[i] * divider; | |
3742 divider /= 10; | |
3743 if((first == 0) && (digits[i] != 0)) | |
3744 first = i; | |
3745 } | |
3746 | |
3747 if((first + 1) > max_digits) | |
3748 { | |
3749 for(int i = 0; i<max_digits; i++) | |
3750 pText[i] = '9'; | |
3751 out = max_digits; | |
3752 } | |
3753 else if(fill) | |
3754 { | |
3755 int i = 0; | |
3756 for(int k = max_digits; k>0; k--) | |
3757 pText[i++] = digits[k -1] + '0'; | |
3758 out = max_digits; | |
3759 } | |
3760 else | |
3761 { | |
3762 int i = 0; | |
3763 for(int k = first; k>=0; k--) | |
3764 pText[i++] = digits[k] + '0'; | |
3765 out = i; | |
3766 } | |
3767 | |
3768 return out; | |
3769 } | |
3770 | |
3771 | |
3772 /* output is | |
3773 * 0-> | |
3774 * | | |
3775 * v | |
3776 * | |
3777 * input is | |
3778 * | |
3779 * -> | |
3780 * A | |
3781 * | | |
3782 * 0 | |
3783 */ | |
3784 void GFX_screenshot(void) | |
3785 { | |
3786 uint32_t pSource = GFX_get_pActualFrameTop(); | |
3787 uint32_t pSourceBottom =GFX_get_pActualFrameBottom(); | |
3788 uint32_t pBottomNew = getFrame(99); | |
3789 uint32_t pDestination = GFX_doubleBufferOne(); | |
3790 uint32_t sourceNow; | |
3791 | |
3792 | |
3793 uint32_t bot_leftStart = FrameHandler.actualBottom.leftStart; // x0 z.B. 0 | |
3794 uint32_t bot_bottomStart = FrameHandler.actualBottom.bottomStart; // y0 z.B. 25 | |
3795 uint32_t bot_width = FrameHandler.actualBottom.width; // 800 | |
3796 uint32_t bot_height = FrameHandler.actualBottom.height; // 390 | |
3797 | |
3798 struct split | |
3799 { | |
3800 uint8_t blue; | |
3801 uint8_t green; | |
3802 uint8_t red; | |
3803 uint8_t alpha; | |
3804 }; | |
3805 | |
3806 union inout_u | |
3807 { | |
3808 uint32_t in; | |
3809 struct split out; | |
3810 }; | |
3811 | |
3812 union inout_u value; | |
3813 | |
3814 /* test | |
3815 uint32_t pSourceTemp = pSource + (2*479); | |
3816 for (int j = 0xFFFF; j > 0x00FF; j -= 0x0100) | |
3817 { | |
3818 *(__IO uint16_t*)pSourceTemp = j; | |
3819 pSourceTemp += 480*2; | |
3820 } | |
3821 */ | |
3822 // Top Layer | |
3823 const unsigned width = 800, height = 480; | |
3824 const uint32_t heightX2 = height*2; | |
3825 | |
3826 for(unsigned y = 0; y < height; y++) | |
3827 { | |
3828 sourceNow = pSource + 2 * ((height - 1) - y); | |
3829 for(unsigned x = 0; x < width; x++) | |
3830 { | |
3831 // sourceNow += 2 * height * x + 2 * (height - 1 - y); | |
3832 value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; | |
3833 value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); | |
3834 | |
3835 *(__IO uint8_t*)(pDestination++) = value.out.red; | |
3836 *(__IO uint8_t*)(pDestination++) = value.out.green; | |
3837 *(__IO uint8_t*)(pDestination++) = value.out.blue; | |
3838 *(__IO uint8_t*)(pDestination++) = value.out.alpha; | |
3839 sourceNow += heightX2; | |
3840 } | |
3841 } | |
3842 | |
3843 // Bottom Layer | |
3844 // build newBottom | |
3845 pSource = pSourceBottom; | |
3846 for(unsigned x = bot_leftStart; x < bot_leftStart+bot_width; x++) | |
3847 { | |
3848 for(unsigned y = bot_bottomStart; y < bot_bottomStart+bot_height; y++) | |
3849 { | |
3850 pDestination = pBottomNew + (2 * y); | |
3851 pDestination += heightX2 * x; | |
3852 *(__IO uint16_t*)(pDestination) = *(__IO uint16_t*)(pSource); | |
3853 pSource += 2; | |
3854 } | |
3855 } | |
3856 | |
3857 // output Bottom Layer | |
3858 pSource = pBottomNew; | |
3859 pDestination = GFX_doubleBufferTwo(); | |
3860 | |
3861 for(unsigned y = 0; y < height; y++) | |
3862 { | |
3863 sourceNow = pSource + 2 * ((height - 1) - y); | |
3864 for(unsigned x = 0; x < width; x++) | |
3865 { | |
3866 // sourceNow = pSource + 2 * height * x + 2 * (height - 1 - y); | |
3867 value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; | |
3868 value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); | |
3869 | |
3870 *(__IO uint8_t*)(pDestination++) = value.out.red; | |
3871 *(__IO uint8_t*)(pDestination++) = value.out.green; | |
3872 *(__IO uint8_t*)(pDestination++) = value.out.blue; | |
3873 *(__IO uint8_t*)(pDestination++) = value.out.alpha; | |
3874 sourceNow += heightX2; | |
3875 } | |
3876 } | |
3877 releaseFrame(99,pBottomNew); | |
3878 /* | |
3879 // das kommt dazu! | |
3880 unsigned yEnd = 480 - FrameHandler.actualBottom.bottomStart; | |
3881 unsigned yStart = yEnd - FrameHandler.actualBottom.height; | |
3882 | |
3883 if(yStart > 0) | |
3884 { | |
3885 for(unsigned y = 0; y < yStart; y++) | |
3886 for(unsigned x = 0; x < width; x++) | |
3887 { | |
3888 *(__IO uint8_t*)(pDestination++) = 0; | |
3889 *(__IO uint8_t*)(pDestination++) = 0; | |
3890 *(__IO uint8_t*)(pDestination++) = 0; | |
3891 *(__IO uint8_t*)(pDestination++) = 0; | |
3892 } | |
3893 } | |
3894 for(unsigned y = yStart; y < yEnd; y++) | |
3895 for(unsigned x = 0; x < width; x++) | |
3896 { | |
3897 sourceNow = pSource + 2 * height * x + 2 * (height - 1 - y); | |
3898 value.in = ColorLUT[*(__IO uint8_t*)(sourceNow)]; | |
3899 value.out.alpha = *(__IO uint8_t*)(sourceNow + 1); | |
3900 | |
3901 *(__IO uint8_t*)(pDestination++) = value.out.red; | |
3902 *(__IO uint8_t*)(pDestination++) = value.out.green; | |
3903 *(__IO uint8_t*)(pDestination++) = value.out.blue; | |
3904 *(__IO uint8_t*)(pDestination++) = value.out.alpha; | |
3905 } | |
3906 if(yEnd < 480) | |
3907 { | |
3908 for(unsigned y = yEnd; y < 480; y++) | |
3909 for(unsigned x = 0; x < width; x++) | |
3910 { | |
3911 *(__IO uint8_t*)(pDestination++) = 0; | |
3912 *(__IO uint8_t*)(pDestination++) = 0; | |
3913 *(__IO uint8_t*)(pDestination++) = 0; | |
3914 *(__IO uint8_t*)(pDestination++) = 0; | |
3915 } | |
3916 } | |
3917 */ | |
3918 } | |
567 | 3919 |
3920 tFont* GFX_Check_Extra_Font(uint8_t character, tFont *Font) | |
3921 { | |
3922 uint32_t i; | |
3923 uint32_t found; | |
3924 | |
3925 found = 0; | |
3926 for(i=0;i<Font->length;i++) | |
3927 { | |
3928 if(Font->chars[i].code == character) | |
3929 { | |
3930 found = 1; | |
3931 break; | |
3932 } | |
3933 } | |
3934 if (!found && Font == &FontT54) | |
3935 { | |
699 | 3936 Font = (tFont *)&FontT54Extra; |
567 | 3937 } |
3938 else if (!found && (Font == &FontT84 || Font == &FontT84Spaced)) | |
3939 { | |
699 | 3940 Font = (tFont *)&FontT84Extra; |
567 | 3941 } |
3942 else if (!found && Font == &FontT105) | |
3943 { | |
699 | 3944 Font = (tFont *)&FontT105Extra; |
567 | 3945 } |
3946 | |
3947 return Font; | |
3948 } | |
3949 | |
3950 uint32_t GFX_Character_Width(uint8_t character, tFont *Font) | |
3951 { | |
3952 uint32_t i; | |
3953 uint32_t found; | |
3954 | |
3955 for(i=0;i<Font->length;i++) | |
3956 { | |
3957 if(Font->chars[i].code == character) | |
3958 { | |
3959 return Font->chars[i].image->width; | |
3960 } | |
3961 } | |
3962 | |
3963 found = 0; | |
3964 if (Font == &FontT54) | |
3965 { | |
3966 found = 1; | |
699 | 3967 Font = (tFont *)&FontT54Extra; |
567 | 3968 } |
3969 else if (Font == &FontT84 || Font == &FontT84Spaced) | |
3970 { | |
3971 found = 1; | |
699 | 3972 Font = (tFont *)&FontT84Extra; |
567 | 3973 } |
3974 else if (Font == &FontT105) | |
3975 { | |
3976 found = 1; | |
699 | 3977 Font = (tFont *)&FontT105Extra; |
567 | 3978 } |
3979 | |
3980 if (found) | |
3981 { | |
3982 for(i=0;i<Font->length;i++) | |
3983 { | |
3984 if(Font->chars[i].code == character) | |
3985 { | |
3986 return Font->chars[i].image->width; | |
3987 } | |
3988 } | |
3989 } | |
3990 | |
3991 return 0; | |
3992 } |