STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
GUIDRV_Lin_Opt_24.h
Go to the documentation of this file.
1 /*********************************************************************
2 * SEGGER Microcontroller GmbH & Co. KG *
3 * Solutions for real time microcontroller applications *
4 **********************************************************************
5 * *
6 * (c) 1996 - 2015 SEGGER Microcontroller GmbH & Co. KG *
7 * *
8 * Internet: www.segger.com Support: support@segger.com *
9 * *
10 **********************************************************************
11 
12 ** emWin V5.28 - Graphical user interface for embedded applications **
13 All Intellectual Property rights in the Software belongs to SEGGER.
14 emWin is protected by international copyright laws. Knowledge of the
15 source code may not be used to write a similar product. This file may
16 only be used in accordance with the following terms:
17 
18 The software has been licensed to STMicroelectronics International
19 N.V. a Dutch company with a Swiss branch and its headquarters in Plan-
20 les-Ouates, Geneva, 39 Chemin du Champ des Filles, Switzerland for the
21 purposes of creating libraries for ARM Cortex-M-based 32-bit microcon_
22 troller products commercialized by Licensee only, sublicensed and dis_
23 tributed under the terms and conditions of the End User License Agree_
24 ment supplied by STMicroelectronics International N.V.
25 Full source code is available at: www.segger.com
26 
27 We appreciate your understanding and fairness.
28 ----------------------------------------------------------------------
29 File : GUIDRV_Lin_Opt_24.h
30 Purpose : Optimized routines, included by GUIDRV_Lin_..._24.c
31 ---------------------------END-OF-HEADER------------------------------
32 */
33 
34 /*********************************************************************
35 *
36 * Static functions
37 *
38 **********************************************************************
39 */
40 /*********************************************************************
41 *
42 * _FillRectOpt24
43 *
44 * Purpose:
45 * Optimized filling routine for 24 bpp
46 */
47 static void _FillRectOpt24(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
48  DRIVER_CONTEXT * pContext;
49  U32 Off, Off0, OffLine;
50  int RemPixels, NumLines, RemLines, RemItems, Odd;
51  U32 Data, Data0, Data1, Data2;
52  LCD_PIXELINDEX ColorIndex;
53 
54  pContext = (DRIVER_CONTEXT *)pDevice->u.pContext;
55  Off0 = XY2OFF32(pContext->vxSizePhys, x0, y0);
56  RemPixels = x1 - x0 + 1;
57  Odd = x0 & 3;
58  NumLines = y1 - y0 + 1;
59  OffLine = (pContext->vxSizePhys + pContext->vxSizePhys +pContext->vxSizePhys) >> 2;
60  RemItems = 0;
61  Off = 0;
63  //
64  // First triple DWORD
65  //
66  if (Odd) {
67  for (RemLines = NumLines; RemLines; RemLines--) {
68  RemItems = RemPixels;
69  Off = Off0 + OffLine * (RemLines - 1);
70  Data = READ_MEM32(pContext->VRAMAddr, Off);
71  switch (Odd) {
72  case 1:
73  Data ^= 0xFF000000;
74  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
75  Off++;
76  Data = READ_MEM32(pContext->VRAMAddr, Off);
77  Data ^= 0x0000FFFF;
78  RemItems--;
79  if (!RemItems) {
80  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
81  break;
82  }
83  //
84  // no break at this position required...
85  //
86  case 2:
87  Data ^= 0xFFFF0000;
88  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
89  Off++;
90  Data = READ_MEM32(pContext->VRAMAddr, Off);
91  Data ^= 0x000000FF;
92  RemItems--;
93  if (!RemItems) {
94  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
95  break;
96  }
97  //
98  // no break at this position required...
99  //
100  case 3:
101  Data ^= 0xFFFFFF00;
102  RemItems--;
103  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
104  Off++;
105  }
106  }
107  Off0 = Off;
108  RemPixels -= (RemPixels - RemItems);
109  }
110  //
111  // Complete triple DWORDS
112  //
113  if (RemPixels >= 4) {
114  for (RemLines = NumLines; RemLines; RemLines--) {
115  RemItems = RemPixels;
116  Off = Off0 + OffLine * (RemLines - 1);
117  do {
118  Data = READ_MEM32(pContext->VRAMAddr, Off + 0);
119  Data ^= 0xFFFFFFFF;
120  WRITE_MEM32(pContext->VRAMAddr, Off + 0, Data);
121  Data = READ_MEM32(pContext->VRAMAddr, Off + 1);
122  Data ^= 0xFFFFFFFF;
123  WRITE_MEM32(pContext->VRAMAddr, Off + 1, Data);
124  Data = READ_MEM32(pContext->VRAMAddr, Off + 2);
125  Data ^= 0xFFFFFFFF;
126  WRITE_MEM32(pContext->VRAMAddr, Off + 2, Data);
127  Off += 3;
128  } while ((RemItems -= 4) >= 4);
129  }
130  Off0 = Off;
131  RemPixels -= (RemPixels >> 2) << 2;
132  }
133  //
134  // Last triple DWORD
135  //
136  if (RemPixels) {
137  for (RemLines = NumLines; RemLines; RemLines--) {
138  RemItems = RemPixels;
139  Off = Off0 + OffLine * (RemLines - 1);
140  Data = READ_MEM32(pContext->VRAMAddr, Off);
141  Data ^= 0x00FFFFFF;
142  RemItems--;
143  if (!RemItems) {
144  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
145  continue;
146  }
147  Data ^= 0xFF000000;
148  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
149  Off++;
150  Data = READ_MEM32(pContext->VRAMAddr, Off);
151  Data ^= 0x0000FFFF;
152  RemItems--;
153  if (!RemItems) {
154  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
155  continue;
156  }
157  Data ^= 0xFFFF0000;
158  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
159  Off++;
160  Data = READ_MEM32(pContext->VRAMAddr, Off);
161  Data ^= 0x000000FF;
162  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
163  }
164  }
165  } else {
166  ColorIndex = LCD__GetColorIndex();
167  //
168  // First triple DWORD
169  //
170  if (Odd) {
171  for (RemLines = NumLines; RemLines; RemLines--) {
172  RemItems = RemPixels;
173  Off = Off0 + OffLine * (RemLines - 1);
174  Data = READ_MEM32(pContext->VRAMAddr, Off);
175  switch (Odd) {
176  case 1:
177  Data &= 0x00FFFFFF;
178  Data |= ColorIndex << 24;
179  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
180  Off++;
181  Data = READ_MEM32(pContext->VRAMAddr, Off);
182  Data &= 0xFFFF0000;
183  Data |= ColorIndex >> 8;
184  RemItems--;
185  if (!RemItems) {
186  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
187  break;
188  }
189  //
190  // no break at this position required...
191  //
192  case 2:
193  Data &= 0x0000FFFF;
194  Data |= ColorIndex << 16;
195  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
196  Off++;
197  Data = READ_MEM32(pContext->VRAMAddr, Off);
198  Data &= 0xFFFFFF00;
199  Data |= ColorIndex >> 16;
200  RemItems--;
201  if (!RemItems) {
202  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
203  break;
204  }
205  //
206  // no break at this position required...
207  //
208  case 3:
209  Data &= 0x000000FF;
210  Data |= ColorIndex << 8;
211  RemItems--;
212  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
213  Off++;
214  }
215  }
216  Off0 = Off;
217  RemPixels -= (RemPixels - RemItems);
218  }
219  //
220  // Complete triple DWORDS
221  //
222  if (RemPixels >= 4) {
223  for (RemLines = NumLines; RemLines; RemLines--) {
224  RemItems = RemPixels;
225  Off = Off0 + OffLine * (RemLines - 1);
226  Data0 = (ColorIndex ) | (ColorIndex << 24);
227  Data1 = (ColorIndex >> 8) | (ColorIndex << 16);
228  Data2 = (ColorIndex >> 16) | (ColorIndex << 8);
229  do {
230  WRITE_MEM32(pContext->VRAMAddr, Off + 0, Data0);
231  WRITE_MEM32(pContext->VRAMAddr, Off + 1, Data1);
232  WRITE_MEM32(pContext->VRAMAddr, Off + 2, Data2);
233  Off += 3;
234  } while ((RemItems -= 4) >= 4);
235  }
236  Off0 = Off;
237  RemPixels -= (RemPixels >> 2) << 2;
238  }
239  //
240  // Last triple DWORD
241  //
242  if (RemPixels) {
243  for (RemLines = NumLines; RemLines; RemLines--) {
244  RemItems = RemPixels;
245  Off = Off0 + OffLine * (RemLines - 1);
246  Data = READ_MEM32(pContext->VRAMAddr, Off);
247  Data &= 0xFF000000;
248  Data |= ColorIndex;
249  RemItems--;
250  if (!RemItems) {
251  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
252  continue;
253  }
254  Data &= 0x00FFFFFF;
255  Data |= ColorIndex << 24;
256  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
257  Off++;
258  Data = READ_MEM32(pContext->VRAMAddr, Off);
259  Data &= 0xFFFF0000;
260  Data |= ColorIndex >> 8;
261  RemItems--;
262  if (!RemItems) {
263  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
264  continue;
265  }
266  Data &= 0x0000FFFF;
267  Data |= ColorIndex << 16;
268  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
269  Off++;
270  Data = READ_MEM32(pContext->VRAMAddr, Off);
271  Data &= 0xFFFFFF00;
272  Data |= ColorIndex >> 16;
273  WRITE_MEM32(pContext->VRAMAddr, Off, Data);
274  }
275  }
276  }
277 }
278 
279 /*************************** End of file ****************************/
GUI_SADDR GUI_CONTEXT * GUI_pContext
#define LCD__GetColorIndex()
Definition: GUI_Private.h:588
#define U32
Definition: Global.h:50
#define LCD_PIXELINDEX
union GUI_DEVICE::@32 u
void * pContext
Definition: GUI.h:179
U8 DrawMode
Definition: GUI.h:214
#define LCD_DRAWMODE_XOR
Definition: LCD.h:86
#define READ_MEM32(VRAMAddr, Off)
#define WRITE_MEM32(VRAMAddr, Off, Data)