system/lib/lcd/gui/Core/GUI__Wrap.c

162 lines
4.5 KiB
C

/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* µC/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File : GUI__WRAP.c
Purpose : Implementation of wrap routines
---------------------------END-OF-HEADER------------------------------
*/
#include "GUI_Protected.h"
/*********************************************************************
*
* static code
*
**********************************************************************
*/
/*********************************************************************
*
* _IsLineEnd
*/
static int _IsLineEnd(U16 Char) {
if (!Char || (Char == '\n')) {
return 1;
}
return 0;
}
/*********************************************************************
*
* _GetWordWrap
*/
static int _GetWordWrap(const char GUI_UNI_PTR * s, int xSize) {
int xDist = 0, NumChars = 0, WordWrap = 0;
U16 Char, PrevChar = 0;
while (1) {
Char = GUI_UC__GetCharCodeInc(&s); /* Similar to: *s++ */
/* Let's first check if the line end is reached. In this case we are done. */
if (_IsLineEnd(Char)) {
WordWrap = NumChars;
break;
}
/* If current character is a space, we found a wrap position */
if ((Char == ' ') && (Char != PrevChar)) {
WordWrap = NumChars;
}
PrevChar = Char;
xDist += GUI_GetCharDistX(Char);
if ((xDist <= xSize) || (NumChars == 0)) {
NumChars++;
} else {
break;
}
}
if (!WordWrap) {
WordWrap = NumChars;
}
return WordWrap;
}
/*********************************************************************
*
* _GetCharWrap
*/
static int _GetCharWrap(const char GUI_UNI_PTR * s, int xSize) {
int xDist = 0, NumChars = 0;
U16 Char;
while ((Char = GUI_UC__GetCharCodeInc(&s)) != 0) {
xDist += GUI_GetCharDistX(Char);
if ((NumChars && (xDist > xSize)) || (Char == '\n')) {
break;
}
NumChars++;
}
return NumChars;
}
/*********************************************************************
*
* _GetNoWrap
*/
static int _GetNoWrap(const char GUI_UNI_PTR * s) {
return GUI__GetLineNumChars(s, 0x7FFF);
}
/*********************************************************************
*
* puplic code
*
**********************************************************************
*/
/*********************************************************************
*
* GUI__WrapGetNumCharsDisp
*
* Returns:
* Number of characters to display in the line.
* Trailing spaces and line end character are
* not counted
*/
int GUI__WrapGetNumCharsDisp(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) {
int r;
switch (WrapMode) {
case GUI_WRAPMODE_WORD:
r = _GetWordWrap(pText, xSize);
break;
case GUI_WRAPMODE_CHAR:
r = _GetCharWrap(pText, xSize);
break;
default:
r = _GetNoWrap(pText);
}
return r;
}
/*********************************************************************
*
* GUI__WrapGetNumCharsToNextLine
*/
int GUI__WrapGetNumCharsToNextLine(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) {
int NumChars;
U16 Char;
NumChars = GUI__WrapGetNumCharsDisp(pText, xSize, WrapMode);
pText += GUI_UC__NumChars2NumBytes(pText, NumChars);
Char = GUI_UC__GetCharCodeInc(&pText);
if (Char == '\n') {
NumChars++;
} else {
if (WrapMode == GUI_WRAPMODE_WORD) {
while (Char == ' ') {
NumChars++;
Char = GUI_UC__GetCharCodeInc(&pText);
}
}
}
return NumChars;
}
/*********************************************************************
*
* GUI__WrapGetNumBytesToNextLine
*/
int GUI__WrapGetNumBytesToNextLine(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) {
int NumChars, NumBytes;
NumChars = GUI__WrapGetNumCharsToNextLine(pText, xSize, WrapMode);
NumBytes = GUI_UC__NumChars2NumBytes(pText, NumChars);
return NumBytes;
}
/*************************** End of file ****************************/