mirror of
https://github.com/libsdl-org/SDL.git
synced 2024-11-30 15:23:28 +08:00
testime: highlight selected clauses in Japanese composition mode
This commit is contained in:
parent
50250adba7
commit
dcd7b4e497
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user