STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
GUIDRV_Lin_Opt_8.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_8.h
30 Purpose : Optimized routines, included by GUIDRV_Lin_..._8.c
31 ---------------------------END-OF-HEADER------------------------------
32 */
33 
34 /*********************************************************************
35 *
36 * Static functions
37 *
38 **********************************************************************
39 */
40 /*********************************************************************
41 *
42 * _FillRectOpt8
43 *
44 * Purpose:
45 * Optimized filling routine for 8 bpp
46 */
47 static void _FillRectOpt8(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
48  DRIVER_CONTEXT * pContext;
49  U32 Data, ColorMask, AndMask, Off0, OffLine;
50  int NumPixel_0, NumPixel_1, RemPixels, NumLines, RemLines, RemItems;
51  LCD_PIXELINDEX ColorIndex;
52  U32 * pDest;
53 
54  pContext = (DRIVER_CONTEXT *)pDevice->u.pContext;
55  ColorIndex = LCD__GetColorIndex();
56  Off0 = XY2OFF32(pContext->vxSizePhys, x0, y0);
57  RemPixels = x1 - x0 + 1;
58  NumLines = y1 - y0 + 1;
59  OffLine = pContext->vxSizePhys >> 2;
60  NumPixel_0 = x0 & 3;
61  NumPixel_1 = x1 & 3;
63  //
64  // First DWORD
65  //
66  if (NumPixel_0) {
67  for (RemLines = NumLines; RemLines; RemLines--) {
68  pDest = ((U32 *)pContext->VRAMAddr) + Off0 + OffLine * (RemLines - 1);
69  AndMask = ~(0xFFFFFFFF << (8 * NumPixel_0));
70  if ((RemPixels < 3) && (NumPixel_1)) {
71  AndMask |= ~(0xFFFFFFFF >> (8 * (3 - NumPixel_1)));
72  }
73  #if (LCD_ENDIAN_BIG == 1)
74  MIRROR(AndMask);
75  #endif
76  Data = READ_MEM32P(pDest);
77  Data ^= ~AndMask;
78  WRITE_MEM32P(pDest, Data);
79  }
80  Off0++;
81  RemPixels -= (4 - NumPixel_0);
82  }
83  //
84  // Complete DWORDS
85  //
86  if (RemPixels >= 4) {
87  for (RemLines = NumLines; RemLines; RemLines--) {
88  RemItems = RemPixels;
89  pDest = ((U32 *)pContext->VRAMAddr) + Off0 + OffLine * (RemLines - 1);
90  while (RemItems >= 4) {
91  Data = READ_MEM32P(pDest);
92  Data ^= 0xFFFFFFFF;
93  WRITE_MEM32P(pDest, Data);
94  pDest++;
95  RemItems -= 4;
96  }
97  }
98  Off0 += (RemPixels >> 2);
99  RemPixels -= (RemPixels >> 2) << 2;
100  }
101  //
102  // Last DWORD
103  //
104  if (RemPixels > 0) {
105  for (RemLines = NumLines; RemLines; RemLines--) {
106  pDest = ((U32 *)pContext->VRAMAddr) + Off0 + OffLine * (RemLines - 1);
107  AndMask = 0xFFFFFF00 << (8 * NumPixel_1);
108  #if (LCD_ENDIAN_BIG == 1)
109  MIRROR(AndMask);
110  #endif
111  Data = READ_MEM32P(pDest);
112  Data ^= ~AndMask;
113  WRITE_MEM32P(pDest, Data);
114  }
115  }
116  } else {
117  //
118  // First DWORD
119  //
120  if (NumPixel_0) {
121  for (RemLines = NumLines; RemLines; RemLines--) {
122  pDest = ((U32 *)pContext->VRAMAddr) + Off0 + OffLine * (RemLines - 1);
123  AndMask = ~(0xFFFFFFFF << (8 * NumPixel_0));
124  if ((RemPixels < 3) && (NumPixel_1)) {
125  AndMask |= ~(0xFFFFFFFF >> (8 * (3 - NumPixel_1)));
126  }
127  ColorMask = (ColorIndex * 0x01010101) & ~AndMask;
128  #if (LCD_ENDIAN_BIG == 1)
129  MIRROR(AndMask);
130  MIRROR(ColorMask);
131  #endif
132  Data = READ_MEM32P(pDest);
133  Data &= AndMask;
134  Data |= ColorMask;
135  WRITE_MEM32P(pDest, Data);
136  }
137  Off0++;
138  RemPixels -= (4 - NumPixel_0);
139  }
140  //
141  // Complete DWORDS
142  //
143  if (RemPixels >= 4) {
144  ColorMask = ColorIndex * 0x01010101;
145  for (RemLines = NumLines; RemLines; RemLines--) {
146  RemItems = RemPixels;
147  pDest = ((U32 *)pContext->VRAMAddr) + Off0 + OffLine * (RemLines - 1);
148  while (RemItems >= 32) {
149  WRITE_MEM32P(pDest , ColorMask);
150  WRITE_MEM32P(pDest + 1, ColorMask);
151  WRITE_MEM32P(pDest + 2, ColorMask);
152  WRITE_MEM32P(pDest + 3, ColorMask);
153  WRITE_MEM32P(pDest + 4, ColorMask);
154  WRITE_MEM32P(pDest + 5, ColorMask);
155  WRITE_MEM32P(pDest + 6, ColorMask);
156  WRITE_MEM32P(pDest + 7, ColorMask);
157  pDest += 8;
158  RemItems -= 32;
159  }
160  while (RemItems >= 4) {
161  WRITE_MEM32P(pDest, ColorMask);
162  pDest++;
163  RemItems -= 4;
164  }
165  }
166  Off0 += (RemPixels >> 2);
167  RemPixels -= (RemPixels >> 2) << 2;
168  }
169  //
170  // Last DWORD
171  //
172  if (RemPixels > 0) {
173  for (RemLines = NumLines; RemLines; RemLines--) {
174  pDest = ((U32 *)pContext->VRAMAddr) + Off0 + OffLine * (RemLines - 1);
175  AndMask = 0xFFFFFF00 << (8 * NumPixel_1);
176  ColorMask = (ColorIndex * 0x01010101) & ~AndMask;
177  #if (LCD_ENDIAN_BIG == 1)
178  MIRROR(AndMask);
179  MIRROR(ColorMask);
180  #endif
181  Data = READ_MEM32P(pDest);
182  Data &= AndMask;
183  Data |= ColorMask;
184  WRITE_MEM32P(pDest, Data);
185  }
186  }
187  }
188 }
189 
190 /*************************** End of file ****************************/
GUI_SADDR GUI_CONTEXT * GUI_pContext
#define LCD__GetColorIndex()
Definition: GUI_Private.h:588
#define WRITE_MEM32P(p, Data)
#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 MIRROR(x)
#define READ_MEM32P(p)