testime: highlight selected clauses in Japanese composition mode

This commit is contained in:
Sam Lantinga 2024-06-27 13:50:49 -07:00
parent 50250adba7
commit dcd7b4e497

View File

@ -49,8 +49,10 @@ static SDL_Color backColor = { 255, 255, 255, 255 };
static SDL_Color textColor = { 0, 0, 0, 255 };
static char text[MAX_TEXT_LENGTH], markedText[MAX_TEXT_LENGTH];
static int cursor = 0;
static int cursor_length = 0;
static SDL_bool cursor_visible;
static Uint64 last_cursor_change;
static SDL_BlendMode highlight_mode;
#ifdef HAVE_SDL_TTF
static TTF_Font *font;
#else
@ -67,7 +69,7 @@ static TTF_Font *font;
#define UNIFONT_NUM_TEXTURES ((UNIFONT_NUM_GLYPHS + UNIFONT_GLYPHS_IN_TEXTURE - 1) / UNIFONT_GLYPHS_IN_TEXTURE)
#define UNIFONT_TEXTURE_SIZE (UNIFONT_TEXTURE_WIDTH * UNIFONT_TEXTURE_WIDTH * 4)
#define UNIFONT_TEXTURE_PITCH (UNIFONT_TEXTURE_WIDTH * 4)
#define UNIFONT_DRAW_SCALE 2
#define UNIFONT_DRAW_SCALE 2.0f
static struct UnifontGlyph
{
Uint8 width;
@ -508,7 +510,7 @@ static void RedrawWindow(int rendererID)
drawnTextRect.h = dstrect.h;
while ((codepoint = utf8_decode(utext, len = utf8_length(*utext))) != 0) {
Sint32 advance = unifont_draw_glyph(codepoint, rendererID, &dstrect) * UNIFONT_DRAW_SCALE;
float advance = unifont_draw_glyph(codepoint, rendererID, &dstrect) * UNIFONT_DRAW_SCALE;
dstrect.x += advance;
drawnTextRect.w += advance;
utext += len;
@ -564,6 +566,11 @@ static void RedrawWindow(int rendererID)
SDL_RenderTexture(renderer, texture, NULL, &drawnTextRect);
SDL_DestroyTexture(texture);
if (cursor_length > 0) {
/* FIXME: Need to measure text extents */
cursorRect.w = cursor_length * UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE;
}
#else
int i = 0;
char *utext = markedText;
@ -579,7 +586,7 @@ static void RedrawWindow(int rendererID)
drawnTextRect.h = dstrect.h;
while ((codepoint = utf8_decode(utext, len = utf8_length(*utext))) != 0) {
Sint32 advance = unifont_draw_glyph(codepoint, rendererID, &dstrect) * UNIFONT_DRAW_SCALE;
float advance = unifont_draw_glyph(codepoint, rendererID, &dstrect) * UNIFONT_DRAW_SCALE;
dstrect.x += advance;
drawnTextRect.w += advance;
if (i < cursor) {
@ -588,6 +595,10 @@ static void RedrawWindow(int rendererID)
i++;
utext += len;
}
if (cursor_length > 0) {
cursorRect.w = cursor_length * UNIFONT_GLYPH_SIZE * UNIFONT_DRAW_SCALE;
}
#endif
cursorRect.y = drawnTextRect.y;
@ -608,7 +619,13 @@ static void RedrawWindow(int rendererID)
cursor_visible = !cursor_visible;
last_cursor_change = now;
}
if (cursor_visible) {
if (cursor_length > 0) {
/* We'll show a highlight */
SDL_SetRenderDrawBlendMode(renderer, highlight_mode);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, &cursorRect);
SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE);
} else if (cursor_visible) {
SDL_SetRenderDrawColor(renderer, lineColor.r, lineColor.g, lineColor.b, lineColor.a);
SDL_RenderFillRect(renderer, &cursorRect);
}
@ -709,6 +726,12 @@ int main(int argc, char *argv[])
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
}
highlight_mode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR,
SDL_BLENDFACTOR_ZERO,
SDL_BLENDOPERATION_ADD,
SDL_BLENDFACTOR_ZERO,
SDL_BLENDFACTOR_ONE,
SDL_BLENDOPERATION_ADD);
/* Main render loop */
done = 0;
@ -788,6 +811,7 @@ int main(int argc, char *argv[])
SDL_strlcpy(markedText, event.edit.text, sizeof(markedText));
cursor = event.edit.start;
cursor_length = event.edit.length;
break;
default: