				if (bFind)
				{
					SetBkMode(g_pDevice->m_hDC, 1);
					TextOut(g_pDevice->m_hDC, 0, nLine * (RenderDevice::m_nFontSize + 1),
						szTemp2, strlen(szTemp2));
					SetBkMode(g_pDevice->m_hDC, 2);
				}
			}

			SIZE size;
			GetTextExtentPoint32(g_pDevice->m_hDC, m_szStringArray[nLine],
				strlen(m_szStringArray[nLine]), &size);

			m_szStringSize[nLine] = static_cast<short>(size.cx);

			// Strip GDI/Wine underline artifacts (1px line in text color under names/tab).
			// m_pBitmapBits is DWORD*; scan several bottom rows with a lower fill threshold.
			if (g_pDevice->m_pBitmapBits && size.cx > 2)
			{
				const int cellH = RenderDevice::m_nFontSize + 1;
				const int baseY = nLine * cellH;
				const int textW = size.cx + 4;
				const int scanFrom = RenderDevice::m_nFontSize - 3; // include baseline+underline rows
				for (int row = (scanFrom < 0 ? 0 : scanFrom); row < cellH; ++row)
				{
					const int y = baseY + row;
					if (y < 0 || y >= RenderDevice::m_nFontTextureSize)
						continue;

					int filled = 0;
					for (int x = 0; x < textW && x < RenderDevice::m_nFontTextureSize; ++x)
					{
						if ((g_pDevice->m_pBitmapBits[x + y * RenderDevice::m_nFontTextureSize] & 0xFF) > 4)
							++filled;
					}
					// Last padding row: always clear. Other bottom rows: >=40% fill => underline.
					const int isPadRow = (row >= RenderDevice::m_nFontSize);
					if (isPadRow || filled * 10 >= textW * 4)
					{
						for (int x = 0; x < textW && x < RenderDevice::m_nFontTextureSize; ++x)
							g_pDevice->m_pBitmapBits[x + y * RenderDevice::m_nFontTextureSize] = 0;
					}
				}
			}
		}
	}

	if (m_pTexture == nullptr)
	{
		if (g_pDevice->m_bSavage == 1)
		{
