/* virtual */ nsresult nsDOMKeyboardEvent::Which(PRUint32* aWhich) { NS_ENSURE_ARG_POINTER(aWhich); switch (mEvent->message) { case NS_KEY_UP: case NS_KEY_DOWN: return GetKeyCode(aWhich); case NS_KEY_PRESS: //Special case for 4xp bug 62878. Try to make value of which //more closely mirror the values that 4.x gave for RETURN and BACKSPACE { PRUint32 keyCode = ((nsKeyEvent*)mEvent)->keyCode; if (keyCode == NS_VK_RETURN || keyCode == NS_VK_BACK) { *aWhich = keyCode; return NS_OK; } return GetCharCode(aWhich); } break; default: *aWhich = 0; break; } return NS_OK; }
FTexture *FFont::GetChar (int code, int translation, int *const width, bool *redirected) const { code = GetCharCode(code, true); int xmove = SpaceWidth; if (code >= 0) { code -= FirstChar; xmove = Chars[code].XMove; } if (width != nullptr) { *width = xmove; } if (code < 0) return nullptr; if (translation == CR_UNTRANSLATED && !forceremap) { bool redirect = Chars[code].OriginalPic && Chars[code].OriginalPic != Chars[code].TranslatedPic; if (redirected) *redirected = redirect; if (redirect) { assert(Chars[code].OriginalPic->UseType == ETextureType::FontChar); return Chars[code].OriginalPic; } } if (redirected) *redirected = false; assert(Chars[code].TranslatedPic->UseType == ETextureType::FontChar); return Chars[code].TranslatedPic; }
bool FFont::CanPrint(const uint8_t *string) const { if (!string) return true; while (*string) { auto chr = GetCharFromString(string); if (!MixedCase) chr = upperforlower[chr]; // For uppercase-only fonts we shouldn't check lowercase characters. if (chr == TEXTCOLOR_ESCAPE) { // We do not need to check for UTF-8 in here. if (*string == '[') { while (*string != '\0' && *string != ']') { ++string; } } if (*string != '\0') { ++string; } continue; } else if (chr != '\n') { int cc = GetCharCode(chr, true); if (chr != cc && iswalpha(chr) && cc != getAlternative(chr)) { return false; } } } return true; }
int FFont::GetCharWidth (int code) const { code = GetCharCode(code, true); if (code >= 0) return Chars[code - FirstChar].XMove; return SpaceWidth; }
int FFont::GetCharCode(int code, bool needpic) const { if (code < 0 && code >= -128) { // regular chars turn negative when the 8th bit is set. code &= 255; } if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) { return code; } // Use different substitution logic based on the fonts content: // In a font which has both upper and lower case, prefer unaccented small characters over capital ones. // In a pure upper-case font, do not check for lower case replacements. if (!MixedCase) { // Try converting lowercase characters to uppercase. if (myislower(code)) { code = upperforlower[code]; if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) { return code; } } // Try stripping accents from accented characters. int newcode = stripaccent(code); if (newcode != code) { code = newcode; if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) { return code; } } } else { int originalcode = code; int newcode; // Try stripping accents from accented characters. This may repeat to allow multi-step fallbacks. while ((newcode = stripaccent(code)) != code) { code = newcode; if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) { return code; } } code = originalcode; if (myislower(code)) { int upper = upperforlower[code]; // Stripping accents did not help - now try uppercase for lowercase if (upper != code) return GetCharCode(upper, needpic); } // Same for the uppercase character. Since we restart at the accented version this must go through the entire thing again. while ((newcode = stripaccent(code)) != code) { code = newcode; if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) { return code; } } } return -1; }