FX_FONTDESCRIPTOR const* FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams,
                                           const CFX_FontDescriptors& fonts) {
  FX_FONTDESCRIPTOR const* pBestFont = nullptr;
  int32_t iBestSimilar = 0;
  FX_BOOL bMatchStyle =
      (pParams->dwMatchFlags & FX_FONTMATCHPARA_MacthStyle) > 0;
  int32_t iCount = fonts.GetSize();
  for (int32_t i = 0; i < iCount; ++i) {
    FX_FONTDESCRIPTOR const* pFont = fonts.GetPtrAt(i);
    if ((pFont->dwFontStyles & FX_FONTSTYLE_BoldItalic) ==
        FX_FONTSTYLE_BoldItalic) {
      continue;
    }
    if (pParams->pwsFamily) {
      if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace)) {
        continue;
      }
      if (pFont->uCharSet == FX_CHARSET_Symbol) {
        return pFont;
      }
    }
    if (pFont->uCharSet == FX_CHARSET_Symbol) {
      continue;
    }
    if (pParams->wCodePage != 0xFFFF) {
      if (FX_GetCodePageFromCharset(pFont->uCharSet) != pParams->wCodePage) {
        continue;
      }
    } else {
      if (pParams->dwUSB < 128) {
        uint32_t dwByte = pParams->dwUSB / 32;
        uint32_t dwUSB = 1 << (pParams->dwUSB % 32);
        if ((pFont->FontSignature.fsUsb[dwByte] & dwUSB) == 0) {
          continue;
        }
      }
    }
    if (bMatchStyle) {
      if ((pFont->dwFontStyles & 0x0F) == (pParams->dwFontStyles & 0x0F))
        return pFont;
      continue;
    }
    if (pParams->pwsFamily) {
      if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace) == 0) {
        return pFont;
      }
    }
    int32_t iSimilarValue = FX_GetSimilarValue(pFont, pParams->dwFontStyles);
    if (iBestSimilar < iSimilarValue) {
      iBestSimilar = iSimilarValue;
      pBestFont = pFont;
    }
  }
  return iBestSimilar < 1 ? nullptr : pBestFont;
}
int CFX_WideString::CompareNoCase(const FX_WCHAR* lpsz) const
{
    if (m_pData == NULL) {
        return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;
    }
    return FXSYS_wcsicmp(m_pData->m_String, lpsz);
}