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