Browse Source

Cleanup PrintQTextChr (#671)

pull/39/head
galaxyhaxz 7 years ago committed by GitHub
parent
commit
ebd12dc9fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 161
      Source/minitext.cpp
  2. 2
      Source/minitext.h

161
Source/minitext.cpp

@ -94,59 +94,122 @@ void __cdecl DrawQTextBack()
#include "asm_trans_rect.inc" #include "asm_trans_rect.inc"
} }
void __fastcall PrintQTextChr(int screen_x, int screen_y, char *cel_buf, int frame) void __fastcall PrintQTextChr(int sx, int sy, BYTE *pCelBuff, int nCel)
{ {
char *v4; // ebx BYTE *dst, *pStart, *pEnd, *end, *tmp;
char *v5; // esi
char *v6; // edi
int v7; // ebx
signed int v8; // edx
unsigned int v9; // eax
unsigned int v10; // ecx
char v11; // cf
unsigned int v12; // ecx
char *v13; // [esp+14h] [ebp-8h]
char *v14; // [esp+18h] [ebp-4h]
v13 = (char *)gpBuffer + screen_y_times_768[209]; /// ASSERT: assert(gpBuffer);
v14 = (char *)gpBuffer + screen_y_times_768[469];
v4 = &cel_buf[4 * frame]; tmp = (BYTE *)gpBuffer;
v5 = &cel_buf[*(_DWORD *)v4]; dst = &tmp[sx + screen_y_times_768[sy]];
v6 = (char *)gpBuffer + screen_y_times_768[screen_y] + screen_x; pStart = &tmp[screen_y_times_768[209]];
v7 = (int)&v5[*((_DWORD *)v4 + 1) - *(_DWORD *)v4]; pEnd = &tmp[screen_y_times_768[469]];
do {
v8 = 22; #if (_MSC_VER >= 800) && (_MSC_VER <= 1200)
do { __asm {
while (1) { mov ebx, pCelBuff
v9 = (unsigned char)*v5++; mov eax, nCel
if ((v9 & 0x80u) == 0) shl eax, 2
break; add ebx, eax
_LOBYTE(v9) = -(char)v9; mov eax, [ebx+4]
v6 += v9; sub eax, [ebx]
v8 -= v9; mov end, eax
if (!v8) mov esi, pCelBuff
goto LABEL_15; add esi, [ebx]
} mov edi, dst
v8 -= v9; mov ebx, end
if (v6 < v13 || v6 > v14) { add ebx, esi
v5 += v9; label1:
v6 += v9; mov edx, 22
} else { label2:
v10 = v9 >> 1; xor eax, eax
if (!(v9 & 1) || (*v6 = *v5, ++v5, ++v6, v10)) { lodsb
v11 = v10 & 1; or al, al
v12 = v9 >> 2; js label7
if (!v11 || (*(_WORD *)v6 = *(_WORD *)v5, v5 += 2, v6 += 2, v12)) { sub edx, eax
qmemcpy(v6, v5, 4 * v12); cmp edi, pStart
v5 += 4 * v12; jb label5
v6 += 4 * v12; cmp edi, pEnd
ja label5
mov ecx, eax
shr ecx, 1
jnb label3
movsb
jecxz label6
label3:
shr ecx, 1
jnb label4
movsw
jecxz label6
label4:
rep movsd
jmp label6
label5:
add esi, eax
add edi, eax
label6:
or edx, edx
jz label8
jmp label2
label7:
neg al
add edi, eax
sub edx, eax
jnz label2
label8:
sub edi, 768 + 22
cmp ebx, esi
jnz label1
}
#else
int i;
BYTE width;
BYTE *src;
DWORD *pFrameTable;
pFrameTable = (DWORD *)&pCelBuff[4 * nCel];
src = &pCelBuff[pFrameTable[0]];
end = &src[pFrameTable[1] - pFrameTable[0]];
for(; src != end; dst -= 768 + 22) {
for(i = 22; i;) {
width = *src++;
if(!(width & 0x80)) {
i -= width;
if(dst >= pStart && dst <= pEnd) {
if(width & 1) {
dst[0] = src[0];
src++;
dst++;
}
width >>= 1;
if(width & 1) {
dst[0] = src[0];
dst[1] = src[1];
src += 2;
dst += 2;
}
width >>= 1;
for(; width; width--) {
dst[0] = src[0];
dst[1] = src[1];
dst[2] = src[2];
dst[3] = src[3];
src += 4;
dst += 4;
} }
} else {
src += width;
dst += width;
} }
} else {
width = -(char)width;
dst += width;
i -= width;
} }
} while (v8); }
LABEL_15: }
v6 -= 790; #endif
} while ((char *)v7 != v5);
} }
void __cdecl DrawQText() void __cdecl DrawQText()
@ -211,7 +274,7 @@ void __cdecl DrawQText()
if (*v0 == 10) if (*v0 == 10)
++v0; ++v0;
if (v10) if (v10)
PrintQTextChr(screen_x, screen_y, (char *)pMedTextCels, v10); PrintQTextChr(screen_x, screen_y, (BYTE *)pMedTextCels, v10);
++v9; ++v9;
screen_x += mfontkern[v10] + 2; screen_x += mfontkern[v10] + 2;
v8 = *v9; v8 = *v9;

2
Source/minitext.h

@ -14,7 +14,7 @@ void __cdecl FreeQuestText();
void __cdecl InitQuestText(); void __cdecl InitQuestText();
void __fastcall InitQTextMsg(int m); void __fastcall InitQTextMsg(int m);
void __cdecl DrawQTextBack(); void __cdecl DrawQTextBack();
void __fastcall PrintQTextChr(int screen_x, int screen_y, char *cel_buf, int frame); void __fastcall PrintQTextChr(int sx, int sy, BYTE *pCelBuff, int nCel);
void __cdecl DrawQText(); void __cdecl DrawQText();
/* rdata */ /* rdata */

Loading…
Cancel
Save