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; } } } }}