Quellcode durchsuchen

testime: highlight selected clauses in Japanese composition mode

Sam Lantinga vor 9 Monaten
Ursprung
Commit
dcd7b4e497
1 geänderte Dateien mit 28 neuen und 4 gelöschten Zeilen
  1. 28 4
      test/testime.c

+ 28 - 4
test/testime.c

@@ -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: