diff --git a/sc2/ChangeLog b/sc2/ChangeLog index 8db41ab59..4b6dea958 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,5 @@ Changes towards version 0.2: +- Added vertical alignment for subtitles (text runs off screen fix)-from Nic - Updated infinity text/symbol for RUs - from fOSSiL, Nic - Split away DCQ-specific code into its own header file - Added correct lander font - from fOSSiL diff --git a/sc2/src/sc2code/comm.c b/sc2/src/sc2code/comm.c index 78d2944a7..beea028ab 100644 --- a/sc2/src/sc2code/comm.c +++ b/sc2/src/sc2code/comm.c @@ -101,6 +101,61 @@ enum }; static int subtitle_state = DONE_SUBTITLE; +/* _count_lines - mostly stolen from add_text, just sees how many lines + a given input string would take to display given the + line wrapping information */ +static int _count_lines (PTEXT pText) +{ + COUNT maxchars = (COUNT)~0; + UNICODE ch, *pStr; + SIZE text_width; + int num = 0; + + text_width = CommData.AlienTextWidth; + SetContextFont (CommData.AlienFont); + + pStr = pText->pStr; + + do + { + ++num; + pText->pStr = pStr; + pText->CharCount = 1; + + { + BOOLEAN eot; + RECT r, old_r; + COUNT OldCount; + + GetContextClipRect (&r); + eot = FALSE; + do + { + old_r = r; + OldCount = pText->CharCount; + while (!(eot = (BOOLEAN)( + (ch = *++pStr) == '\0' + || ch == '\n' + || ch == '\r' + || (COUNT)(pStr - pText->pStr) >= maxchars + )) && ch != ' ') + ; + pText->CharCount = pStr - pText->pStr; + TextRect (pText, &r, NULL_PTR); + } while (!eot && r.extent.width < text_width); + + if (r.extent.width >= text_width) + { + pText->CharCount = OldCount; + r = old_r; + } + } + pStr = pText->pStr + pText->CharCount; + } while ((ch = *pStr++) != '\0' && ch != '\n' && ch != '\r' && maxchars); + pText->pStr = pStr; + + return (num); +} static COORD add_text (int status, PTEXT pTextIn) @@ -111,6 +166,7 @@ add_text (int status, PTEXT pTextIn) SIZE leading; UNICODE ch, *pStr; SIZE text_width; + int num_lines = 0; BatchGraphics (); @@ -162,6 +218,15 @@ add_text (int status, PTEXT pTextIn) numchars = 0; pStr = pText->pStr; + if (status > 0 && (CommData.AlienTextTemplate.valign & (VALIGN_MIDDLE|VALIGN_BOTTOM))) { + num_lines = _count_lines(pText); + if (CommData.AlienTextTemplate.valign == VALIGN_BOTTOM) + pText->baseline.y -= (leading * num_lines); + else if (CommData.AlienTextTemplate.valign == VALIGN_MIDDLE) + pText->baseline.y -= ((leading * num_lines) / 2); + if (pText->baseline.y < 0) pText->baseline.y = 0; + } + do { pText->pStr = pStr; diff --git a/sc2/src/sc2code/comm/comandr/comandr.c b/sc2/src/sc2code/comm/comandr/comandr.c index 6eeefe2c9..a11820a0c 100644 --- a/sc2/src/sc2code/comm/comandr/comandr.c +++ b/sc2/src/sc2code/comm/comandr/comandr.c @@ -663,6 +663,7 @@ init_commander_comm () commander_desc.AlienTextTemplate.baseline.x = 164; commander_desc.AlienTextTemplate.baseline.y = 20; commander_desc.AlienTextTemplate.align = ALIGN_CENTER; + commander_desc.AlienTextTemplate.valign = VALIGN_MIDDLE; SET_GAME_STATE (BATTLE_SEGUE, 0); retval = &commander_desc; diff --git a/sc2/src/sc2code/comm/druuge/druugec.c b/sc2/src/sc2code/comm/druuge/druugec.c index 2817d10e8..4f61c9fc6 100644 --- a/sc2/src/sc2code/comm/druuge/druugec.c +++ b/sc2/src/sc2code/comm/druuge/druugec.c @@ -883,8 +883,9 @@ init_druuge_comm (void) druuge_desc.AlienTextTemplate.baseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1); - druuge_desc.AlienTextTemplate.baseline.y = 64; + druuge_desc.AlienTextTemplate.baseline.y = 70; druuge_desc.AlienTextTemplate.align = ALIGN_CENTER; + druuge_desc.AlienTextTemplate.valign = VALIGN_MIDDLE; druuge_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16; if ((GET_GAME_STATE (DRUUGE_MANNER) == 0 diff --git a/sc2/src/sc2code/comm/ilwrath/ilwrathc.c b/sc2/src/sc2code/comm/ilwrath/ilwrathc.c index d01884e5d..5bdd83f5f 100644 --- a/sc2/src/sc2code/comm/ilwrath/ilwrathc.c +++ b/sc2/src/sc2code/comm/ilwrath/ilwrathc.c @@ -603,8 +603,9 @@ init_ilwrath_comm (void) ilwrath_desc.AlienTextTemplate.baseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1); - ilwrath_desc.AlienTextTemplate.baseline.y = 64; + ilwrath_desc.AlienTextTemplate.baseline.y = 70; ilwrath_desc.AlienTextTemplate.align = ALIGN_CENTER; + ilwrath_desc.AlienTextTemplate.valign = VALIGN_MIDDLE; ilwrath_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16; if (GET_GAME_STATE (PROBE_ILWRATH_ENCOUNTER) diff --git a/sc2/src/sc2code/comm/rebel/rebel.c b/sc2/src/sc2code/comm/rebel/rebel.c index 268751188..1f4d1113a 100644 --- a/sc2/src/sc2code/comm/rebel/rebel.c +++ b/sc2/src/sc2code/comm/rebel/rebel.c @@ -414,8 +414,9 @@ init_rebel_yehat_comm (void) yehat_desc.uninit_encounter_func = uninit_yehat; yehat_desc.AlienTextTemplate.baseline.x = SIS_SCREEN_WIDTH * 2 / 3; - yehat_desc.AlienTextTemplate.baseline.y = 107 * 2 / 3; + yehat_desc.AlienTextTemplate.baseline.y = 100; yehat_desc.AlienTextTemplate.align = ALIGN_CENTER; + yehat_desc.AlienTextTemplate.valign = VALIGN_BOTTOM; yehat_desc.AlienTextWidth = (SIS_TEXT_WIDTH - 16) * 2 / 3; SET_GAME_STATE (BATTLE_SEGUE, 0); diff --git a/sc2/src/sc2code/comm/starbas/starbas.c b/sc2/src/sc2code/comm/starbas/starbas.c index 4dcd56674..62ed23e96 100644 --- a/sc2/src/sc2code/comm/starbas/starbas.c +++ b/sc2/src/sc2code/comm/starbas/starbas.c @@ -1929,6 +1929,7 @@ init_starbase_comm () commander_desc.AlienTextTemplate.baseline.x = 164; commander_desc.AlienTextTemplate.baseline.y = 20; commander_desc.AlienTextTemplate.align = ALIGN_CENTER; + commander_desc.AlienTextTemplate.valign = VALIGN_MIDDLE; CurBulletinMask = 0; SET_GAME_STATE (BATTLE_SEGUE, 0); diff --git a/sc2/src/sc2code/comm/utwig/utwigc.c b/sc2/src/sc2code/comm/utwig/utwigc.c index c4eb2191b..29d2894e8 100644 --- a/sc2/src/sc2code/comm/utwig/utwigc.c +++ b/sc2/src/sc2code/comm/utwig/utwigc.c @@ -929,8 +929,9 @@ init_utwig_comm (void) utwig_desc.AlienTextTemplate.baseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1); - utwig_desc.AlienTextTemplate.baseline.y = 64; + utwig_desc.AlienTextTemplate.baseline.y = 70; utwig_desc.AlienTextTemplate.align = ALIGN_CENTER; + utwig_desc.AlienTextTemplate.valign = VALIGN_MIDDLE; utwig_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16; if (GET_GAME_STATE (UTWIG_HAVE_ULTRON) diff --git a/sc2/src/sc2code/comm/yehat/yehatc.c b/sc2/src/sc2code/comm/yehat/yehatc.c index 7efb75a6c..cad6a0f62 100644 --- a/sc2/src/sc2code/comm/yehat/yehatc.c +++ b/sc2/src/sc2code/comm/yehat/yehatc.c @@ -647,8 +647,9 @@ init_yehat_comm (void) yehat_desc.uninit_encounter_func = uninit_yehat; yehat_desc.AlienTextTemplate.baseline.x = SIS_SCREEN_WIDTH * 2 / 3; - yehat_desc.AlienTextTemplate.baseline.y = 107 * 2 / 3; + yehat_desc.AlienTextTemplate.baseline.y = 100; yehat_desc.AlienTextTemplate.align = ALIGN_CENTER; + yehat_desc.AlienTextTemplate.valign = VALIGN_BOTTOM; yehat_desc.AlienTextWidth = (SIS_TEXT_WIDTH - 16) * 2 / 3; if (LOBYTE (GLOBAL (CurrentActivity)) != WON_LAST_BATTLE) diff --git a/sc2/src/sc2code/libs/gfxlib.h b/sc2/src/sc2code/libs/gfxlib.h index e1167c425..387df96b2 100644 --- a/sc2/src/sc2code/libs/gfxlib.h +++ b/sc2/src/sc2code/libs/gfxlib.h @@ -115,11 +115,19 @@ typedef enum ALIGN_RIGHT } TEXT_ALIGN; +typedef enum +{ + VALIGN_TOP, + VALIGN_MIDDLE, + VALIGN_BOTTOM +} TEXT_VALIGN; + typedef struct text { POINT baseline; UNICODE *pStr; TEXT_ALIGN align; + TEXT_VALIGN valign; COUNT CharCount; } TEXT; typedef TEXT *PTEXT;