mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	Moved the SDL_ttf IME demo to showfont in the SDL_ttf project
This commit is contained in:
		
							
								
								
									
										136
									
								
								test/testime.c
									
									
									
									
									
								
							
							
						
						
									
										136
									
								
								test/testime.c
									
									
									
									
									
								
							| @@ -9,36 +9,23 @@ | |||||||
|   including commercial applications, and to alter it and redistribute it |   including commercial applications, and to alter it and redistribute it | ||||||
|   freely. |   freely. | ||||||
| */ | */ | ||||||
| /* A simple program to test the Input Method support in the SDL library (2.0+) |  | ||||||
|    If you build without SDL_ttf, you can use the GNU Unifont hex file instead. |  | ||||||
|    Download at http://unifoundry.com/unifont.html */ |  | ||||||
|  |  | ||||||
|  | /* A simple program to test the Input Method support in SDL. | ||||||
|  |  * | ||||||
|  |  * This uses the GNU Unifont to display non-ASCII characters, available at: | ||||||
|  |  * http://unifoundry.com/unifont.html | ||||||
|  |  * | ||||||
|  |  * An example of IME support with TrueType fonts is available in the SDL_ttf example code: | ||||||
|  |  * https://github.com/libsdl-org/SDL_ttf/blob/main/examples/editbox.h | ||||||
|  |  */ | ||||||
| #include <SDL3/SDL.h> | #include <SDL3/SDL.h> | ||||||
| #include <SDL3/SDL_main.h> | #include <SDL3/SDL_main.h> | ||||||
| #include <SDL3/SDL_test_font.h> | #include <SDL3/SDL_test_font.h> | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
| #include "SDL_ttf.h" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include <SDL3/SDL_test_common.h> | #include <SDL3/SDL_test_common.h> | ||||||
| #include "testutils.h" | #include "testutils.h" | ||||||
|  |  | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
| #define DEFAULT_PTSIZE 30 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
| #ifdef SDL_PLATFORM_MACOS |  | ||||||
| #define DEFAULT_FONT "/System/Library/Fonts/华文细黑.ttf" |  | ||||||
| #elif defined(SDL_PLATFORM_WIN32) |  | ||||||
| /* Some japanese font present on at least Windows 8.1. */ |  | ||||||
| #define DEFAULT_FONT "C:\\Windows\\Fonts\\yugothic.ttf" |  | ||||||
| #else |  | ||||||
| #define DEFAULT_FONT "NoDefaultFont.ttf" |  | ||||||
| #endif |  | ||||||
| #else |  | ||||||
| #define DEFAULT_FONT "unifont-15.1.05.hex" | #define DEFAULT_FONT "unifont-15.1.05.hex" | ||||||
| #endif |  | ||||||
| #define MAX_TEXT_LENGTH 256 | #define MAX_TEXT_LENGTH 256 | ||||||
|  |  | ||||||
| #define WINDOW_WIDTH    640 | #define WINDOW_WIDTH    640 | ||||||
| @@ -105,9 +92,6 @@ static const struct | |||||||
|     { "Multiline ON",           SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN, true } |     { "Multiline ON",           SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN, true } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
| static TTF_Font *font; |  | ||||||
| #else |  | ||||||
| #define UNIFONT_MAX_CODEPOINT     0x1ffff | #define UNIFONT_MAX_CODEPOINT     0x1ffff | ||||||
| #define UNIFONT_NUM_GLYPHS        0x20000 | #define UNIFONT_NUM_GLYPHS        0x20000 | ||||||
| #define UNIFONT_REPLACEMENT       0xFFFD | #define UNIFONT_REPLACEMENT       0xFFFD | ||||||
| @@ -433,7 +417,6 @@ static void unifont_cleanup(void) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Unifont code end */ | /* Unifont code end */ | ||||||
| #endif |  | ||||||
|  |  | ||||||
| static size_t utf8_length(unsigned char c) | static size_t utf8_length(unsigned char c) | ||||||
| { | { | ||||||
| @@ -450,35 +433,6 @@ static size_t utf8_length(unsigned char c) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
| static char *utf8_next(char *p) |  | ||||||
| { |  | ||||||
|     size_t len = utf8_length(*p); |  | ||||||
|     size_t i = 0; |  | ||||||
|     if (!len) { |  | ||||||
|         return 0; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     for (; i < len; ++i) { |  | ||||||
|         ++p; |  | ||||||
|         if (!*p) { |  | ||||||
|             return 0; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     return p; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| static char *utf8_advance(char *p, size_t distance) |  | ||||||
| { |  | ||||||
|     size_t i = 0; |  | ||||||
|     for (; i < distance && p; ++i) { |  | ||||||
|         p = utf8_next(p); |  | ||||||
|     } |  | ||||||
|     return p; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| static Uint32 utf8_decode(const char *p, size_t len) | static Uint32 utf8_decode(const char *p, size_t len) | ||||||
| { | { | ||||||
|     Uint32 codepoint = 0; |     Uint32 codepoint = 0; | ||||||
| @@ -582,9 +536,6 @@ static void DrawCandidates(WindowState *ctx, SDL_FRect *cursorRect) | |||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
|         /* FIXME */ |  | ||||||
| #else |  | ||||||
|         if (ctx->horizontal_candidates) { |         if (ctx->horizontal_candidates) { | ||||||
|             const char *utext = ctx->candidates[i]; |             const char *utext = ctx->candidates[i]; | ||||||
|             Uint32 codepoint; |             Uint32 codepoint; | ||||||
| @@ -616,7 +567,6 @@ static void DrawCandidates(WindowState *ctx, SDL_FRect *cursorRect) | |||||||
|             } |             } | ||||||
|             h += UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; |             h += UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; | ||||||
|         } |         } | ||||||
| #endif |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Position the candidate window */ |     /* Position the candidate window */ | ||||||
| @@ -646,9 +596,6 @@ static void DrawCandidates(WindowState *ctx, SDL_FRect *cursorRect) | |||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
|         /* FIXME */ |  | ||||||
| #else |  | ||||||
|         dstRect.w = UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; |         dstRect.w = UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; | ||||||
|         dstRect.h = UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; |         dstRect.h = UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; | ||||||
|  |  | ||||||
| @@ -706,7 +653,6 @@ static void DrawCandidates(WindowState *ctx, SDL_FRect *cursorRect) | |||||||
|             } |             } | ||||||
|             dstRect.y += dstRect.h; |             dstRect.y += dstRect.h; | ||||||
|         } |         } | ||||||
| #endif |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -733,12 +679,7 @@ static void CleanupVideo(void) | |||||||
|         ClearCandidates(ctx); |         ClearCandidates(ctx); | ||||||
|         SDL_DestroyProperties(ctx->text_settings); |         SDL_DestroyProperties(ctx->text_settings); | ||||||
|     } |     } | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
|     TTF_CloseFont(font); |  | ||||||
|     TTF_Quit(); |  | ||||||
| #else |  | ||||||
|     unifont_cleanup(); |     unifont_cleanup(); | ||||||
| #endif |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void DrawSettingsButton(WindowState *ctx) | static void DrawSettingsButton(WindowState *ctx) | ||||||
| @@ -860,21 +801,6 @@ static void RedrawWindow(WindowState *ctx) | |||||||
|     drawnTextRect.h = UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; |     drawnTextRect.h = UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; | ||||||
|  |  | ||||||
|     if (text[0]) { |     if (text[0]) { | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
|         SDL_Surface *textSur = TTF_RenderUTF8_Blended(font, text, textColor); |  | ||||||
|         SDL_Texture *texture; |  | ||||||
|  |  | ||||||
|         /* Vertically center text */ |  | ||||||
|         drawnTextRect.y = ctx->textRect.y + (ctx->textRect.h - textSur->h) / 2; |  | ||||||
|         drawnTextRect.w = textSur->w; |  | ||||||
|         drawnTextRect.h = textSur->h; |  | ||||||
|  |  | ||||||
|         texture = SDL_CreateTextureFromSurface(renderer, textSur); |  | ||||||
|         SDL_DestroySurface(textSur); |  | ||||||
|  |  | ||||||
|         SDL_RenderTexture(renderer, texture, NULL, &drawnTextRect); |  | ||||||
|         SDL_DestroyTexture(texture); |  | ||||||
| #else |  | ||||||
|         char *utext = text; |         char *utext = text; | ||||||
|         Uint32 codepoint; |         Uint32 codepoint; | ||||||
|         size_t len; |         size_t len; | ||||||
| @@ -893,7 +819,6 @@ static void RedrawWindow(WindowState *ctx) | |||||||
|             drawnTextRect.w += advance; |             drawnTextRect.w += advance; | ||||||
|             utext += len; |             utext += len; | ||||||
|         } |         } | ||||||
| #endif |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* The marked text rectangle is the text area that hasn't been filled by committed text */ |     /* The marked text rectangle is the text area that hasn't been filled by committed text */ | ||||||
| @@ -910,39 +835,6 @@ static void RedrawWindow(WindowState *ctx) | |||||||
|     cursorRect.h = drawnTextRect.h; |     cursorRect.h = drawnTextRect.h; | ||||||
|  |  | ||||||
|     if (ctx->markedText[0]) { |     if (ctx->markedText[0]) { | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
|         SDL_Surface *textSur; |  | ||||||
|         SDL_Texture *texture; |  | ||||||
|         if (ctx->cursor) { |  | ||||||
|             char *p = utf8_advance(ctx->markedText, ctx->cursor); |  | ||||||
|             char c = 0; |  | ||||||
|             if (!p) { |  | ||||||
|                 p = &ctx->markedText[SDL_strlen(ctx->markedText)]; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             c = *p; |  | ||||||
|             *p = 0; |  | ||||||
|             TTF_SizeUTF8(font, ctx->markedText, &drawnTextRect.w, NULL); |  | ||||||
|             cursorRect.x += drawnTextRect.w; |  | ||||||
|             *p = c; |  | ||||||
|         } |  | ||||||
|         textSur = TTF_RenderUTF8_Blended(font, ctx->markedText, textColor); |  | ||||||
|         /* Vertically center text */ |  | ||||||
|         drawnTextRect.y = ctx->textRect.y + (ctx->textRect.h - textSur->h) / 2; |  | ||||||
|         drawnTextRect.w = textSur->w; |  | ||||||
|         drawnTextRect.h = textSur->h; |  | ||||||
|  |  | ||||||
|         texture = SDL_CreateTextureFromSurface(renderer, textSur); |  | ||||||
|         SDL_DestroySurface(textSur); |  | ||||||
|  |  | ||||||
|         SDL_RenderTexture(renderer, texture, NULL, &drawnTextRect); |  | ||||||
|         SDL_DestroyTexture(texture); |  | ||||||
|  |  | ||||||
|         if (ctx->cursor_length > 0) { |  | ||||||
|             /* FIXME: Need to measure text extents */ |  | ||||||
|             cursorRect.w = ctx->cursor_length * UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; |  | ||||||
|         } |  | ||||||
| #else |  | ||||||
|         int i = 0; |         int i = 0; | ||||||
|         char *utext = ctx->markedText; |         char *utext = ctx->markedText; | ||||||
|         Uint32 codepoint; |         Uint32 codepoint; | ||||||
| @@ -970,7 +862,6 @@ static void RedrawWindow(WindowState *ctx) | |||||||
|         if (ctx->cursor_length > 0) { |         if (ctx->cursor_length > 0) { | ||||||
|             cursorRect.w = ctx->cursor_length * UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; |             cursorRect.w = ctx->cursor_length * UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE; | ||||||
|         } |         } | ||||||
| #endif |  | ||||||
|  |  | ||||||
|         cursorRect.y = drawnTextRect.y; |         cursorRect.y = drawnTextRect.y; | ||||||
|         cursorRect.h = drawnTextRect.h; |         cursorRect.h = drawnTextRect.h; | ||||||
| @@ -1085,20 +976,9 @@ int main(int argc, char *argv[]) | |||||||
|  |  | ||||||
|     fontname = GetResourceFilename(fontname, DEFAULT_FONT); |     fontname = GetResourceFilename(fontname, DEFAULT_FONT); | ||||||
|  |  | ||||||
| #ifdef HAVE_SDL_TTF |  | ||||||
|     /* Initialize fonts */ |  | ||||||
|     TTF_Init(); |  | ||||||
|  |  | ||||||
|     font = TTF_OpenFont(fontname, DEFAULT_PTSIZE); |  | ||||||
|     if (!font) { |  | ||||||
|         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to find font: %s\n", SDL_GetError()); |  | ||||||
|         return -1; |  | ||||||
|     } |  | ||||||
| #else |  | ||||||
|     if (unifont_init(fontname) < 0) { |     if (unifont_init(fontname) < 0) { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
| #endif |  | ||||||
|  |  | ||||||
|     SDL_Log("Using font: %s\n", fontname); |     SDL_Log("Using font: %s\n", fontname); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sam Lantinga
					Sam Lantinga