void __thiscall A0_DrawTextToPcx16_sub_4B51F0(_Fnt_ *this, const char *text, _Pcx16_ *Pcx16, int x, int y, int width, int height, int color, int align, signed int a10)
{
const char *text_i; // edx@1
_Fnt_ *this_v11; // ebx@1
int string_symbol_off_v12; // esi@1
unsigned int Str_len_v13; // kr00_4@2
int color_v14; // eax@4
int text_height_v15; // ecx@9
int height_v16; // edi@9
int align_v18; // eax@16
int v18; // eax@16
int symbols_width_v19; // ecx@25
const char Curr_symbol_v20; // al@26
unsigned __int8 symbol_v21; // al@29
int i; // edi@39
const char curr_symbol_v23; // al@40
int char_right_v24; // eax@45
const char last_string_symbol_v25; // dl@48
const char curr_symbol_v26; // al@52
const char *text_v27; // edx@52
const char curr_symbol_v28; // al@59
int X_Add_v29; // eax@65
int symbols_width_v30; // [sp+Ch] [bp-18h]@48
int Last_symb_offset_v31; // [sp+10h] [bp-14h]@2
int last_good_symbol_v32; // [sp+14h] [bp-10h]@48
int string_height_v33; // [sp+18h] [bp-Ch]@9
int string_height_v34; // [sp+18h] [bp-Ch]@23
int Curr_string_first_symbol_off_v35; // [sp+1Ch] [bp-8h]@25
int Y_Addition_v36; // [sp+20h] [bp-4h]@2
text_i = text;
string_symbol_off_v12 = 0;
this_v11 = this;
if ( text )
{
Y_Addition_v36 = 0;
Str_len_v13 = strlen(text);
Last_symb_offset_v31 = Str_len_v13 - 1;
if ( Str_len_v13 == 1 ) // 1 символ
{
if ( a10 != -1 )
{
color_v14 = color;
if ( BYTE1(color_v14) & 1 )
BYTE1(color_v14) &= 0xFEu;
else
color_v14 = color + 9;
A0_Fnt_DrawSymbol_sub_4B4F00(this_v11, '_', (signed int)Pcx16, x, y, color_v14);
}
}
else // Несколько символов
{
if ( align & 4 ) // Выравнивание по центру
{
align &= 0xFFFFFFFBu;
string_height_v33 = this_v11->string_height;
text_height_v15 = this_v11->string_height * A0_Fnt_GetTextStringsCount_sub_4B5580(this_v11, text, width);
height_v16 = height;
if ( text_height_v15 >= height ) // Если текст не влезает
{
if ( height < 2 * string_height_v33 ) // Если влезает не более одной строки, центруем её
Y_Addition_v36 = (height - string_height_v33) / 2;
text_i = text;
}
else
{
text_i = text;
Y_Addition_v36 = (height - text_height_v15) / 2;// Центруем текст
}
}
else
{
height_v16 = height;
}
if ( align & 8 ) // Выранивание по низу
{
v18 = align;
LOBYTE(v18) = align & 0xF7;
align = v18;
align_v18 = this_v11->string_height * A0_Fnt_GetTextStringsCount_sub_4B5580(this_v11, text_i, width);
if ( align_v18 < height_v16 ) // Если текст влезает
Y_Addition_v36 = height_v16 - align_v18;// опускаем его вниз
text_i = text;
}
if ( Last_symb_offset_v31 > 0 ) // Текст есть
{
while ( text_i[string_symbol_off_v12] ) // Идём до конца текста
{
string_height_v34 = this_v11->string_height;
if ( Y_Addition_v36 + string_height_v34 > height_v16 )// Если строка не в начале и не влезет - прерываемся
{
if ( Y_Addition_v36 )
break;
}
symbols_width_v19 = 0;
Curr_string_first_symbol_off_v35 = string_symbol_off_v12;// Смещение текущей строки
while ( 1 ) // До первого неуправляющего символа
{
Curr_symbol_v20 = text_i[string_symbol_off_v12];
if ( Curr_symbol_v20 != '{' )
{
if ( Curr_symbol_v20 != '}' )
break;
}
++string_symbol_off_v12;
}
symbol_v21 = text_i[string_symbol_off_v12];// Текущий символ в строке
if ( symbol_v21 )
{ // Отрицательное смещение 1 символа игнорируется
if ( *((_DWORD *)&this_v11->v_table + 3 * (symbol_v21 + 5)) < 0 )// fnt->char_sizes[symbol].width
symbols_width_v19 = -*((_DWORD *)&this_v11->v_table + 3 * ((char)symbol_v21 + 5));// fnt->char_sizes[symbol].width
for ( text_i = text; symbol_v21; symbol_v21 = text[string_symbol_off_v12++ + 1] )// Проход по строке
{
if ( symbol_v21 == '\n' ) // Следующая строка
break;
if ( symbols_width_v19 > width ) // Не влезло - переходим на следующую строку
break;
if ( symbol_v21 != '{' )
{
if ( symbol_v21 != '}' ) // Добавляем к ширине строки данные символа
symbols_width_v19 += *((_DWORD *)&this_v11->v_table + 3 * (symbol_v21 + 5))// fnt->char_sizes[symbol].width
+ *(_DWORD *)&this_v11->name[12 * (symbol_v21 + 5)]// fnt->char_sizes[symbol].left
+ *(_DWORD *)&this_v11->name[12 * (symbol_v21 + 5) + 4];// fnt->char_sizes[symbol].right
}
}
}
for ( i = string_symbol_off_v12 - 1; ; --i )// Проход назад по уже пройденным символам
{
curr_symbol_v23 = text_i[i];
if ( curr_symbol_v23 != '{' )
{
if ( curr_symbol_v23 != '}' )
break;
}
if ( i <= Curr_string_first_symbol_off_v35 )
break;
} // Нашли последний неуправляющий символ
if ( string_symbol_off_v12 > 0 )
{
char_right_v24 = this_v11->char_sizes[(unsigned __int8)text_i[i]].right;
if ( char_right_v24 < 0 ) // Игнорируем отрицательный правый отступ в конце строки
symbols_width_v19 -= char_right_v24;
}
if ( symbols_width_v19 > width ) // Если символы в результате вылезли за ширину...
{
last_string_symbol_v25 = text_i[i];
symbols_width_v30 = symbols_width_v19;
last_good_symbol_v32 = 0;
if ( this_v11->char_sizes[(unsigned __int8)last_string_symbol_v25].right < 0 )// Возвращаем правый отступ последнего символа
symbols_width_v19 += this_v11->char_sizes[last_string_symbol_v25].right;
string_symbol_off_v12 = i; // Последний символ
if ( last_string_symbol_v25 != ' ' )// Последний символ - не пробел
{
while ( string_symbol_off_v12 >= Curr_string_first_symbol_off_v35 )// Если символ - не первый в строке
{
text_v27 = text;
curr_symbol_v26 = text[string_symbol_off_v12];
if ( curr_symbol_v26 != '{' && curr_symbol_v26 != '}' )// Если текущий символ - не управляющий
{
symbols_width_v19 -= *((_DWORD *)&this_v11->v_table// Отнимаем текущий символ от строки
+ 3 * ((unsigned __int8)text[string_symbol_off_v12] + 5))// fnt->char_sizes[symbol].width
+ *(_DWORD *)&this_v11->name[12// fnt->char_sizes[symbol].left
* ((unsigned __int8)text[string_symbol_off_v12] + 5)]
+ *(_DWORD *)&this_v11->name[12
* ((unsigned __int8)text[string_symbol_off_v12] + 5)// fnt->char_sizes[symbol].right
+ 4];
if ( Y_Addition_v36 + 2 * string_height_v34 > height && symbols_width_v19 < width )// Если строка влезает по-горизонтали, но следующая не влезет по-вертикали
goto END_CANCEL_SYMBOLS_L61;
if ( !last_good_symbol_v32 )
{
if ( symbols_width_v19 < width )
last_good_symbol_v32 = string_symbol_off_v12;
}
}
curr_symbol_v28 = text[string_symbol_off_v12-- - 1];// Берём текущий символ и переходим к следующему
if ( curr_symbol_v28 == ' ' ) // Если перенесли целое слово, завершаем перенос
break;
}
}
text_v27 = text;
END_CANCEL_SYMBOLS_L61:
if ( string_symbol_off_v12 <= Curr_string_first_symbol_off_v35 )// Если перенесли всё до первого символа в строке...
{
string_symbol_off_v12 = last_good_symbol_v32;// Берём последний подходящий символ и всю ширину
symbols_width_v19 = symbols_width_v30;
}
if ( text_v27[string_symbol_off_v12] == ' ' )// Последний символ - пробел - просто игнорируем его существование
symbols_width_v19 -= this_v11->char_sizes[32].width
+ this_v11->char_sizes[32].left
+ this_v11->char_sizes[32].right;
}
X_Add_v29 = 0;
if ( align )
{
if ( align == 1 ) // Выравнивание по центру - центрируем
{
X_Add_v29 = (width - symbols_width_v19) / 2;
}
else
{
if ( align == 2 ) // Выравнивание по правому краю - выравниваем
X_Add_v29 = width - symbols_width_v19;
}
}
else
{ // Выравнивание по левому краю
X_Add_v29 = 0;
}
A0_Fnt_DrawString_To_Pcx16_sub_4B4FC0(
this_v11,
(int)&text[Curr_string_first_symbol_off_v35],// Первый символ
string_symbol_off_v12++ - Curr_string_first_symbol_off_v35,// Кол-во символов (+ переходим к первому символу следующей строки)
Pcx16,
x + X_Add_v29,
Y_Addition_v36 + y,
color,
x,
y,
width,
height,
a10);
Y_Addition_v36 += this_v11->string_height;// Вертикаль следующей строки
if ( string_symbol_off_v12 >= Last_symb_offset_v31 )// Если вывели все символу - завершаем
break;
height_v16 = height;
text_i = text;
}
}
}
}
}