RT1050 GUI demo using emWin library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers GUIDRV_Lin_Opt_24.h Source File

GUIDRV_Lin_Opt_24.h

00001 /*********************************************************************
00002 *                SEGGER Microcontroller GmbH & Co. KG                *
00003 *        Solutions for real time microcontroller applications        *
00004 **********************************************************************
00005 *                                                                    *
00006 *        (c) 1996 - 2016  SEGGER Microcontroller GmbH & Co. KG       *
00007 *                                                                    *
00008 *        Internet: www.segger.com    Support:  support@segger.com    *
00009 *                                                                    *
00010 **********************************************************************
00011 
00012 ** emWin V5.38 - Graphical user interface for embedded applications **
00013 All  Intellectual Property rights  in the Software belongs to  SEGGER.
00014 emWin is protected by  international copyright laws.  Knowledge of the
00015 source code may not be used to write a similar product.  This file may
00016 only be used in accordance with the following terms:
00017 
00018 The software has been licensed to  NXP Semiconductors USA, Inc.  whose
00019 registered  office  is  situated  at 411 E. Plumeria Drive, San  Jose,
00020 CA 95134, USA  solely for  the  purposes  of  creating  libraries  for
00021 NXPs M0, M3/M4 and  ARM7/9 processor-based  devices,  sublicensed  and
00022 distributed under the terms and conditions of the NXP End User License
00023 Agreement.
00024 Full source code is available at: www.segger.com
00025 
00026 We appreciate your understanding and fairness.
00027 ----------------------------------------------------------------------
00028 Licensing information
00029 
00030 Licensor:                 SEGGER Microcontroller Systems LLC
00031 Licensed to:              NXP Semiconductors, 1109 McKay Dr, M/S 76, San Jose, CA 95131, USA
00032 Licensed SEGGER software: emWin
00033 License number:           GUI-00186
00034 License model:            emWin License Agreement, dated August 20th 2011
00035 Licensed product:         -
00036 Licensed platform:        NXP's ARM 7/9, Cortex-M0,M3,M4
00037 Licensed number of seats: -
00038 ----------------------------------------------------------------------
00039 File        : GUIDRV_Lin_Opt_24.h
00040 Purpose     : Optimized routines, included by GUIDRV_Lin_..._24.c
00041 ---------------------------END-OF-HEADER------------------------------
00042 */
00043 
00044 /*********************************************************************
00045 *
00046 *       Static functions
00047 *
00048 **********************************************************************
00049 */
00050 /*********************************************************************
00051 *
00052 *       _FillRectOpt24
00053 *
00054 * Purpose:
00055 *   Optimized filling routine for 24 bpp
00056 */
00057 static void _FillRectOpt24(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
00058   DRIVER_CONTEXT * pContext;
00059   U32 Off, Off0, OffLine;
00060   int RemPixels, NumLines, RemLines, RemItems, Odd;
00061   U32 Data, Data0, Data1, Data2;
00062   LCD_PIXELINDEX ColorIndex;
00063 
00064   pContext  = (DRIVER_CONTEXT *)pDevice->u.pContext;
00065   Off0      = XY2OFF32(pContext->vxSizePhys, x0, y0);
00066   RemPixels = x1 - x0 + 1;
00067   Odd       = x0 & 3;
00068   NumLines  = y1 - y0 + 1;
00069   OffLine   = (pContext->vxSizePhys + pContext->vxSizePhys +pContext->vxSizePhys) >> 2;
00070   RemItems  = 0;
00071   Off       = 0;
00072 #if (LCD_ENDIAN_BIG == 0)
00073   if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR) {
00074     //
00075     // First triple DWORD
00076     //
00077     if (Odd) {
00078       for (RemLines = NumLines; RemLines; RemLines--) {
00079         RemItems = RemPixels;
00080         Off      = Off0 + OffLine * (RemLines - 1);
00081         Data     = READ_MEM32(pContext->VRAMAddr, Off);
00082         switch (Odd) {
00083         case 1:
00084           Data ^= 0xFF000000;
00085           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00086           Off++;
00087           Data  = READ_MEM32(pContext->VRAMAddr, Off);
00088           Data ^= 0x0000FFFF;
00089           RemItems--;
00090           if (!RemItems) {
00091             WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00092             break;
00093           }
00094           //
00095           // no break at this position required...
00096           //
00097         case 2:
00098           Data ^= 0xFFFF0000;
00099           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00100           Off++;
00101           Data  = READ_MEM32(pContext->VRAMAddr, Off);
00102           Data ^= 0x000000FF;
00103           RemItems--;
00104           if (!RemItems) {
00105             WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00106             break;
00107           }
00108           //
00109           // no break at this position required...
00110           //
00111         case 3:
00112           Data ^= 0xFFFFFF00;
00113           RemItems--;
00114           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00115           Off++;
00116         }
00117       }
00118       Off0       = Off;
00119       RemPixels -= (RemPixels - RemItems);
00120     }
00121     //
00122     // Complete triple DWORDS
00123     //
00124     if (RemPixels >= 4) {
00125       for (RemLines = NumLines; RemLines; RemLines--) {
00126         RemItems = RemPixels;
00127         Off      = Off0 + OffLine * (RemLines - 1);
00128         do {
00129           Data  = READ_MEM32(pContext->VRAMAddr, Off + 0);
00130           Data ^= 0xFFFFFFFF;
00131           WRITE_MEM32(pContext->VRAMAddr, Off + 0, Data);
00132           Data  = READ_MEM32(pContext->VRAMAddr, Off + 1);
00133           Data ^= 0xFFFFFFFF;
00134           WRITE_MEM32(pContext->VRAMAddr, Off + 1, Data);
00135           Data  = READ_MEM32(pContext->VRAMAddr, Off + 2);
00136           Data ^= 0xFFFFFFFF;
00137           WRITE_MEM32(pContext->VRAMAddr, Off + 2, Data);
00138           Off += 3;
00139         } while ((RemItems -= 4) >= 4);
00140       }
00141       Off0       = Off;
00142       RemPixels -= (RemPixels >> 2) << 2;
00143     }
00144     //
00145     // Last triple DWORD
00146     //
00147     if (RemPixels) {
00148       for (RemLines = NumLines; RemLines; RemLines--) {
00149         RemItems = RemPixels;
00150         Off      = Off0 + OffLine * (RemLines - 1);
00151         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00152         Data ^= 0x00FFFFFF;
00153         RemItems--;
00154         if (!RemItems) {
00155           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00156           continue;
00157         }
00158         Data ^= 0xFF000000;
00159         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00160         Off++;
00161         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00162         Data ^= 0x0000FFFF;
00163         RemItems--;
00164         if (!RemItems) {
00165           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00166           continue;
00167         }
00168         Data ^= 0xFFFF0000;
00169         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00170         Off++;
00171         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00172         Data ^= 0x000000FF;
00173         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00174       }
00175     }
00176   } else {
00177     ColorIndex = LCD__GetColorIndex() & 0xFFFFFF;
00178     //
00179     // First triple DWORD
00180     //
00181     if (Odd) {
00182       for (RemLines = NumLines; RemLines; RemLines--) {
00183         RemItems = RemPixels;
00184         Off      = Off0 + OffLine * (RemLines - 1);
00185         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00186         switch (Odd) {
00187         case 1:
00188           Data &= 0x00FFFFFF;
00189           Data |= ColorIndex << 24;
00190           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00191           Off++;
00192           Data  = READ_MEM32(pContext->VRAMAddr, Off);
00193           Data &= 0xFFFF0000;
00194           Data |= ColorIndex >> 8;
00195           RemItems--;
00196           if (!RemItems) {
00197             WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00198             break;
00199           }
00200           //
00201           // no break at this position required...
00202           //
00203         case 2:
00204           Data &= 0x0000FFFF;
00205           Data |= ColorIndex << 16;
00206           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00207           Off++;
00208           Data  = READ_MEM32(pContext->VRAMAddr, Off);
00209           Data &= 0xFFFFFF00;
00210           Data |= ColorIndex >> 16;
00211           RemItems--;
00212           if (!RemItems) {
00213             WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00214             break;
00215           }
00216           //
00217           // no break at this position required...
00218           //
00219         case 3:
00220           Data &= 0x000000FF;
00221           Data |= ColorIndex << 8;
00222           RemItems--;
00223           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00224           Off++;
00225         }
00226       }
00227       Off0       = Off;
00228       RemPixels -= (RemPixels - RemItems);
00229     }
00230     //
00231     // Complete triple DWORDS
00232     //
00233     if (RemPixels >= 4) {
00234       for (RemLines = NumLines; RemLines; RemLines--) {
00235         RemItems = RemPixels;
00236         Off      = Off0 + OffLine * (RemLines - 1);
00237         Data0 = (ColorIndex      ) | (ColorIndex << 24);
00238         Data1 = (ColorIndex >>  8) | (ColorIndex << 16);
00239         Data2 = (ColorIndex >> 16) | (ColorIndex <<  8);
00240         do {
00241           WRITE_MEM32(pContext->VRAMAddr, Off + 0, Data0);
00242           WRITE_MEM32(pContext->VRAMAddr, Off + 1, Data1);
00243           WRITE_MEM32(pContext->VRAMAddr, Off + 2, Data2);
00244           Off += 3;
00245         } while ((RemItems -= 4) >= 4);
00246       }
00247       Off0       = Off;
00248       RemPixels -= (RemPixels >> 2) << 2;
00249     }
00250     //
00251     // Last triple DWORD
00252     //
00253     if (RemPixels) {
00254       for (RemLines = NumLines; RemLines; RemLines--) {
00255         RemItems = RemPixels;
00256         Off      = Off0 + OffLine * (RemLines - 1);
00257         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00258         Data &= 0xFF000000;
00259         Data |= ColorIndex;
00260         RemItems--;
00261         if (!RemItems) {
00262           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00263           continue;
00264         }
00265         Data &= 0x00FFFFFF;
00266         Data |= ColorIndex << 24;
00267         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00268         Off++;
00269         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00270         Data &= 0xFFFF0000;
00271         Data |= ColorIndex >> 8;
00272         RemItems--;
00273         if (!RemItems) {
00274           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00275           continue;
00276         }
00277         Data &= 0x0000FFFF;
00278         Data |= ColorIndex << 16;
00279         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00280         Off++;
00281         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00282         Data &= 0xFFFFFF00;
00283         Data |= ColorIndex >> 16;
00284         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00285       }
00286     }
00287   }
00288 #else
00289   if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR) {
00290     //
00291     // First triple DWORD
00292     //
00293     if (Odd) {
00294       for (RemLines = NumLines; RemLines; RemLines--) {
00295         RemItems = RemPixels;
00296         Off      = Off0 + OffLine * (RemLines - 1);
00297         Data     = READ_MEM32(pContext->VRAMAddr, Off);
00298         switch (Odd) {
00299         case 1:
00300           Data ^= 0x000000FF;
00301           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00302           Off++;
00303           Data  = READ_MEM32(pContext->VRAMAddr, Off);
00304           Data ^= 0xFFFF0000;
00305           RemItems--;
00306           if (!RemItems) {
00307             WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00308             break;
00309           }
00310           //
00311           // no break at this position required...
00312           //
00313         case 2:
00314           Data ^= 0x0000FFFF;
00315           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00316           Off++;
00317           Data  = READ_MEM32(pContext->VRAMAddr, Off);
00318           Data ^= 0xFF000000;
00319           RemItems--;
00320           if (!RemItems) {
00321             WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00322             break;
00323           }
00324           //
00325           // no break at this position required...
00326           //
00327         case 3:
00328           Data ^= 0x00FFFFFF;
00329           RemItems--;
00330           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00331           Off++;
00332         }
00333       }
00334       Off0       = Off;
00335       RemPixels -= (RemPixels - RemItems);
00336     }
00337     //
00338     // Complete triple DWORDS
00339     //
00340     if (RemPixels >= 4) {
00341       for (RemLines = NumLines; RemLines; RemLines--) {
00342         RemItems = RemPixels;
00343         Off      = Off0 + OffLine * (RemLines - 1);
00344         do {
00345           Data  = READ_MEM32(pContext->VRAMAddr, Off + 0);
00346           Data ^= 0xFFFFFFFF;
00347           WRITE_MEM32(pContext->VRAMAddr, Off + 0, Data);
00348           Data  = READ_MEM32(pContext->VRAMAddr, Off + 1);
00349           Data ^= 0xFFFFFFFF;
00350           WRITE_MEM32(pContext->VRAMAddr, Off + 1, Data);
00351           Data  = READ_MEM32(pContext->VRAMAddr, Off + 2);
00352           Data ^= 0xFFFFFFFF;
00353           WRITE_MEM32(pContext->VRAMAddr, Off + 2, Data);
00354           Off += 3;
00355         } while ((RemItems -= 4) >= 4);
00356       }
00357       Off0       = Off;
00358       RemPixels -= (RemPixels >> 2) << 2;
00359     }
00360     //
00361     // Last triple DWORD
00362     //
00363     if (RemPixels) {
00364       for (RemLines = NumLines; RemLines; RemLines--) {
00365         RemItems = RemPixels;
00366         Off      = Off0 + OffLine * (RemLines - 1);
00367         
00368         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00369         Data ^= 0xFFFFFF00;
00370         RemItems--;
00371         if (!RemItems) {
00372           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00373           continue;
00374         }
00375         Data ^= 0x000000FF;
00376         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00377         Off++;
00378         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00379         Data ^= 0xFFFF0000;
00380         RemItems--;
00381         if (!RemItems) {
00382           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00383           continue;
00384         }
00385         Data ^= 0x0000FFFF;
00386         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00387         Off++;
00388         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00389         Data ^= 0xFF000000;
00390         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00391       }
00392     }
00393   } else {
00394     ColorIndex = LCD__GetColorIndex();
00395     //
00396     // First triple DWORD
00397     //
00398     if (Odd) {
00399       for (RemLines = NumLines; RemLines; RemLines--) {
00400         RemItems = RemPixels;
00401         Off      = Off0 + OffLine * (RemLines - 1);
00402         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00403         switch (Odd) {
00404         case 1:
00405           Data &= 0xFFFFFF00;
00406           Data |= ColorIndex >> 16;
00407           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00408           Off++;
00409           Data  = READ_MEM32(pContext->VRAMAddr, Off);
00410           Data &= 0x0000FFFF;
00411           Data |= ColorIndex << 16;
00412           RemItems--;
00413           if (!RemItems) {
00414             WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00415             break;
00416           }
00417           //
00418           // no break at this position required...
00419           //
00420         case 2:
00421           Data &= 0xFFFF0000;
00422           Data |= ColorIndex >> 8;
00423           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00424           Off++;
00425           Data  = READ_MEM32(pContext->VRAMAddr, Off);
00426           Data &= 0x00FFFFFF;
00427           Data |= ColorIndex << 24;
00428           RemItems--;
00429           if (!RemItems) {
00430             WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00431             break;
00432           }
00433           //
00434           // no break at this position required...
00435           //
00436         case 3:
00437           Data &= 0xFF000000;
00438           Data |= ColorIndex;
00439           RemItems--;
00440           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00441           Off++;
00442         }
00443       }
00444       Off0       = Off;
00445       RemPixels -= (RemPixels - RemItems);
00446     }
00447     //
00448     // Complete triple DWORDS
00449     //
00450     if (RemPixels >= 4) {
00451       for (RemLines = NumLines; RemLines; RemLines--) {
00452         RemItems = RemPixels;
00453         Off      = Off0 + OffLine * (RemLines - 1);
00454         Data0 = (ColorIndex <<  8) | (ColorIndex >> 16);
00455         Data1 = (ColorIndex << 16) | (ColorIndex >>  8);
00456         Data2 = (ColorIndex << 24) | (ColorIndex      );
00457         do {
00458           WRITE_MEM32(pContext->VRAMAddr, Off + 0, Data0);
00459           WRITE_MEM32(pContext->VRAMAddr, Off + 1, Data1);
00460           WRITE_MEM32(pContext->VRAMAddr, Off + 2, Data2);
00461           Off += 3;
00462         } while ((RemItems -= 4) >= 4);
00463       }
00464       Off0       = Off;
00465       RemPixels -= (RemPixels >> 2) << 2;
00466     }
00467     //
00468     // Last triple DWORD
00469     //
00470     if (RemPixels) {
00471       for (RemLines = NumLines; RemLines; RemLines--) {
00472         RemItems = RemPixels;
00473         Off      = Off0 + OffLine * (RemLines - 1);
00474 
00475         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00476         Data &= 0x000000FF;
00477         Data |= (ColorIndex << 8);
00478         RemItems--;
00479         if (!RemItems) {
00480           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00481           continue;
00482         }
00483         Data &= 0xFFFFFF00;
00484         Data |= ColorIndex >> 16;
00485         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00486         Off++;
00487         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00488         Data &= 0x0000FFFF;
00489         Data |= ColorIndex << 16;
00490         RemItems--;
00491         if (!RemItems) {
00492           WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00493           continue;
00494         }
00495         Data &= 0xFFFF0000;
00496         Data |= ColorIndex >> 8;
00497         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00498         Off++;
00499         Data  = READ_MEM32(pContext->VRAMAddr, Off);
00500         Data &= 0x00FFFFFF;
00501         Data |= ColorIndex << 24;
00502         WRITE_MEM32(pContext->VRAMAddr, Off, Data);
00503       }
00504     }
00505   }
00506 #endif
00507 }
00508 
00509 /*************************** End of file ****************************/