Issue 346: Basic support for multi-line text with bitmap fonts: use alt-enter to type carriage returns (like Excel)

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1737 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2011-02-26 18:44:43 +00:00
parent cdd7f21265
commit 65d34dd7e0
13 changed files with 42 additions and 10 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -145,8 +145,13 @@ void SFont_Write(SDL_Surface *Surface, const SFont_Font *Font,
srcrect.h = dstrect.h = Font->Surface->h - 1;
for(c = text; *c != '\0' && x <= Surface->w ; c++) {
if (*c == '\n') {
dstrect.y += Font->Surface->h-1;
x=0;
continue;
}
// skip spaces and nonprintable characters
if (*c == ' ' || Font->CharWidth[(int)*c]==0) {
else if (*c == ' ' || Font->CharWidth[(int)*c]==0) {
x += Font->Space;
continue;
}
@ -166,13 +171,23 @@ int SFont_TextWidth(const SFont_Font *Font, const char *text)
{
const char* c;
int width = 0;
int previous_width = 0;
if(text == NULL)
return 0;
for(c = text; *c != '\0'; c++) {
for(c = text; *c != '\0'; c++)
{
if (*c == '\n')
{
if (previous_width<width)
previous_width=width;
width=0;
}
else
// skip spaces and nonprintable characters
if (*c == ' ' || Font->CharWidth[(int)*c]==0) {
if (*c == ' ' || Font->CharWidth[(int)*c]==0)
{
width += Font->Space;
continue;
}
@ -180,18 +195,30 @@ int SFont_TextWidth(const SFont_Font *Font, const char *text)
width += Font->CharWidth[(int)*c];
}
return width;
return previous_width<width ? width : previous_width;
}
int SFont_TextHeight(const SFont_Font* Font)
int SFont_TextHeight(const SFont_Font* Font, const char *text)
{
return Font->Surface->h - 1;
// Count occurences of '\n'
int nb_cr=0;
while (*text!='\0')
{
if (*text=='\n')
nb_cr++;
text++;
}
return (Font->Surface->h - 1) * (nb_cr+1);
}
/*
// Do not use: Doesn't implement carriage returns
void SFont_WriteCenter(SDL_Surface *Surface, const SFont_Font *Font,
int y, const char *text)
{
SFont_Write(Surface, Font, Surface->w/2 - SFont_TextWidth(Font, text)/2,
y, text);
}
*/

View File

@ -87,7 +87,7 @@ void SFont_Write(SDL_Surface *Surface, const SFont_Font *Font, int x, int y,
/// Returns the width of "text" in pixels
int SFont_TextWidth(const SFont_Font* Font, const char *text);
/// Returns the height of "text" in pixels (which is always equal to Font->Surface->h)
int SFont_TextHeight(const SFont_Font* Font);
int SFont_TextHeight(const SFont_Font* Font, const char *text);
/// Blits a string to Surface with centered x position
void SFont_WriteCenter(SDL_Surface *Surface, const SFont_Font* Font, int y,

View File

@ -601,6 +601,7 @@ word Keysym_to_ANSI(SDL_keysym keysym)
#if !(defined(__macosx__) || defined(__FreeBSD__))
if ( keysym.unicode == 0)
{
switch(keysym.sym)
{
case SDLK_DELETE:
@ -610,7 +611,11 @@ word Keysym_to_ANSI(SDL_keysym keysym)
case SDLK_END:
case SDLK_BACKSPACE:
case KEY_ESC:
return keysym.sym;
case SDLK_RETURN:
// Case alt-enter
if (SDL_GetModState() & (KMOD_ALT|KMOD_META))
return '\n';
return keysym.sym;
default:
return 0;

View File

@ -509,7 +509,7 @@ byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_siz
switch(input_type)
{
case INPUT_TYPE_STRING :
if (input_key>=' ' && input_key<= 255)
if ((input_key>=' ' && input_key<= 255)||input_key=='\n')
is_authorized=1;
break;
case INPUT_TYPE_INTEGER :

View File

@ -567,7 +567,7 @@ byte *Render_text_SFont(const char *str, int font_number, int *width, int *heigh
}
// Calcul des dimensions
*height=SFont_TextHeight(font);
*height=SFont_TextHeight(font, str);
*width=SFont_TextWidth(font, str);
// Allocation d'une surface SDL
text_surface=SDL_CreateRGBSurface(SDL_SWSURFACE, *width, *height, 8, 0, 0, 0, 0);