src/windows/native/sun/windows/awt_Font.cpp
Print this page
*** 47,59 ****
extern jboolean IsMultiFont(JNIEnv *env, jobject obj)
{
if (obj == NULL) {
return JNI_FALSE;
}
! if (env->EnsureLocalCapacity(2))
return JNI_FALSE;
jobject peer = env->CallObjectMethod(obj, AwtFont::peerMID);
if (peer == NULL) {
return JNI_FALSE;
}
jobject fontConfig = env->GetObjectField(peer, AwtFont::fontConfigID);
jboolean result = fontConfig != NULL;
--- 47,62 ----
extern jboolean IsMultiFont(JNIEnv *env, jobject obj)
{
if (obj == NULL) {
return JNI_FALSE;
}
! if (env->EnsureLocalCapacity(2)) {
! env->ExceptionClear();
return JNI_FALSE;
+ }
jobject peer = env->CallObjectMethod(obj, AwtFont::peerMID);
+ env->ExceptionClear();
if (peer == NULL) {
return JNI_FALSE;
}
jobject fontConfig = env->GetObjectField(peer, AwtFont::fontConfigID);
jboolean result = fontConfig != NULL;
*** 64,77 ****
--- 67,82 ----
extern jstring GetTextComponentFontName(JNIEnv *env, jobject font)
{
DASSERT(font != NULL);
if (env->EnsureLocalCapacity(2)) {
+ env->ExceptionClear();
return NULL;
}
jobject peer = env->CallObjectMethod(font, AwtFont::peerMID);
DASSERT(peer != NULL);
+ if (peer == NULL) return NULL;
jstring textComponentFontName =
(jstring) env->GetObjectField(peer, AwtFont::textComponentFontNameID);
env->DeleteLocalRef(peer);
return textComponentFontName;
}
*** 189,198 ****
--- 194,206 ----
if (awtFont != NULL) {
return awtFont;
}
awtFont = Create(env, font, angle, awScale);
+ if (awtFont == NULL) {
+ return NULL;
+ }
env->SetLongField(font, AwtFont::pDataID,
reinterpret_cast<jlong>(awtFont));
return awtFont;
}
*** 270,279 ****
--- 278,290 ----
awtFont->awScale = awScale;
if (cfnum > 0) {
// Ask peer class for the text component font name
jstring jTextComponentFontName = GetTextComponentFontName(env, font);
+ if (jTextComponentFontName == NULL) {
+ return NULL;
+ }
LPCWSTR textComponentFontName = JNU_GetStringPlatformChars(env, jTextComponentFontName, NULL);
awtFont->m_textInput = -1;
for (int i = 0; i < cfnum; i++) {
// nativeName is a pair of platform fontname and its charset
*** 283,292 ****
--- 294,306 ----
jstring nativeName =
(jstring)env->GetObjectField(fontDescriptor,
AwtFont::nativeNameID);
wName = JNU_GetStringPlatformChars(env, nativeName, NULL);
DASSERT(wName);
+ if (wName == NULL) {
+ wName = L"Arial";
+ }
//On NT platforms, if the font is not Symbol or Dingbats
//use "W" version of Win32 APIs directly, info the FontDescription
//no need to convert characters from Unicode to locale encodings.
if (GetNativeCharset(wName) != SYMBOL_CHARSET) {
*** 319,329 ****
--- 333,348 ----
env->DeleteLocalRef(jTextComponentFontName);
} else {
// Instantiation for English version.
jstring fontName = (jstring)env->GetObjectField(font,
AwtFont::nameID);
+ if (fontName != NULL) {
wName = JNU_GetStringPlatformChars(env, fontName, NULL);
+ }
+ if (wName == NULL) {
+ wName = L"Arial";
+ }
WCHAR* wEName;
if (!wcscmp(wName, L"Helvetica") || !wcscmp(wName, L"SansSerif")) {
wEName = L"Arial";
} else if (!wcscmp(wName, L"TimesRoman") ||
*** 645,654 ****
--- 664,676 ----
//Init AwtFont object, which will "create" a AwtFont object if necessry,
//before calling makeconvertedMultiFontString(), otherwise, the FontDescriptor's
//"useUnicode" field might not be initialized correctly (font in Menu Component,
//for example").
AwtFont* awtFont = AwtFont::GetFont(env, font);
+ if (awtFont == NULL) {
+ return size;
+ }
if (IsMultiFont(env, font)) {
jobject peer = env->CallObjectMethod(font, AwtFont::peerMID);
array = (jobjectArray)(env->CallObjectMethod(
peer, AwtFont::makeConvertedMultiFontStringMID, str));
*** 666,675 ****
--- 688,700 ----
HFONT oldFont = (HFONT)::SelectObject(hDC, awtFont->GetHFont());
if (arrayLength == 0) {
int length = env->GetStringLength(str);
LPCWSTR strW = JNU_GetStringPlatformChars(env, str, NULL);
+ if (strW == NULL) {
+ return size;
+ }
VERIFY(::SelectObject(hDC, awtFont->GetHFont()));
if (AwtComponent::GetRTLReadingOrder()){
VERIFY(!draw || ::ExtTextOut(hDC, x, y, ETO_RTLREADING, NULL,
strW, length, NULL));
} else {
*** 690,699 ****
--- 715,727 ----
env->DeleteLocalRef(fontDescriptor);
break;
}
int fdIndex = getFontDescriptorNumber(env, font, fontDescriptor);
+ if (env->ExceptionCheck()) {
+ return size; //fdIndex==0 return could be exception or not.
+ }
VERIFY(::SelectObject(hDC, awtFont->GetHFont(fdIndex)));
/*
* The strange-looking code that follows this comment is
* the result of upstream optimizations. In the array of
*** 703,716 ****
*
* Note: the buffer MUST be unsigned, or VC++ will sign
* extend buflen and bad things will happen.
*/
unsigned char* buffer = NULL;
! jboolean unicodeUsed = env->GetBooleanField(fontDescriptor, AwtFont::useUnicodeID);
try {
buffer = (unsigned char *)
env->GetPrimitiveArrayCritical(convertedBytes, 0);
int buflen = (buffer[0] << 24) | (buffer[1] << 16) |
(buffer[2] << 8) | buffer[3];
DASSERT(buflen >= 0);
--- 731,748 ----
*
* Note: the buffer MUST be unsigned, or VC++ will sign
* extend buflen and bad things will happen.
*/
unsigned char* buffer = NULL;
! jboolean unicodeUsed =
! env->GetBooleanField(fontDescriptor, AwtFont::useUnicodeID);
try {
buffer = (unsigned char *)
env->GetPrimitiveArrayCritical(convertedBytes, 0);
+ if (buffer == NULL) {
+ return size;
+ }
int buflen = (buffer[0] << 24) | (buffer[1] << 16) |
(buffer[2] << 8) | buffer[3];
DASSERT(buflen >= 0);
*** 814,825 ****
}
jchar *strp = new jchar[len];
env->GetCharArrayRegion(str, off, len, strp);
jstring jstr = env->NewString(strp, len);
! jint result = Java_sun_awt_windows_WFontMetrics_stringWidth(env, self,
jstr);
delete [] strp;
return result;
CATCH_BAD_ALLOC_RET(0);
}
--- 846,860 ----
}
jchar *strp = new jchar[len];
env->GetCharArrayRegion(str, off, len, strp);
jstring jstr = env->NewString(strp, len);
! jint result = 0;
! if (jstr != NULL) {
! result = Java_sun_awt_windows_WFontMetrics_stringWidth(env, self,
jstr);
+ }
delete [] strp;
return result;
CATCH_BAD_ALLOC_RET(0);
}
*** 848,864 ****
char *pStrBody = NULL;
jint result = 0;
try {
jintArray array = (jintArray)env->GetObjectField(self,
AwtFont::widthsID);
pStrBody = (char *)env->GetPrimitiveArrayCritical(str, 0);
char *pStr = pStrBody + off;
jint *widths = NULL;
try {
widths = (jint *)env->GetPrimitiveArrayCritical(array, 0);
!
for (; len; len--) {
result += widths[*pStr++];
}
} catch (...) {
if (widths != NULL) {
--- 883,911 ----
char *pStrBody = NULL;
jint result = 0;
try {
jintArray array = (jintArray)env->GetObjectField(self,
AwtFont::widthsID);
+ if (array == NULL) {
+ JNU_ThrowNullPointerException(env, "Can't access widths array.");
+ return NULL;
+ }
pStrBody = (char *)env->GetPrimitiveArrayCritical(str, 0);
+ if (pStrBody == NULL) {
+ JNU_ThrowNullPointerException(env, "Can't access str bytes.");
+ return NULL;
+ }
char *pStr = pStrBody + off;
jint *widths = NULL;
try {
widths = (jint *)env->GetPrimitiveArrayCritical(array, 0);
! if (widths == NULL) {
! env->ReleasePrimitiveArrayCritical(str, pStrBody, 0);
! JNU_ThrowNullPointerException(env, "Can't access widths.");
! return NULL;
! }
for (; len; len--) {
result += widths[*pStr++];
}
} catch (...) {
if (widths != NULL) {
*** 913,945 ****
* Signature: ()V
*/
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFontMetrics_initIDs(JNIEnv *env, jclass cls)
{
! TRY;
!
! AwtFont::widthsID = env->GetFieldID(cls, "widths", "[I");
! AwtFont::ascentID = env->GetFieldID(cls, "ascent", "I");
! AwtFont::descentID = env->GetFieldID(cls, "descent", "I");
! AwtFont::leadingID = env->GetFieldID(cls, "leading", "I");
! AwtFont::heightID = env->GetFieldID(cls, "height", "I");
! AwtFont::maxAscentID = env->GetFieldID(cls, "maxAscent", "I");
! AwtFont::maxDescentID = env->GetFieldID(cls, "maxDescent", "I");
! AwtFont::maxHeightID = env->GetFieldID(cls, "maxHeight", "I");
AwtFont::maxAdvanceID = env->GetFieldID(cls, "maxAdvance", "I");
-
- DASSERT(AwtFont::widthsID != NULL);
- DASSERT(AwtFont::ascentID != NULL);
- DASSERT(AwtFont::descentID != NULL);
- DASSERT(AwtFont::leadingID != NULL);
- DASSERT(AwtFont::heightID != NULL);
- DASSERT(AwtFont::maxAscentID != NULL);
- DASSERT(AwtFont::maxDescentID != NULL);
- DASSERT(AwtFont::maxHeightID != NULL);
- DASSERT(AwtFont::maxAdvanceID != NULL);
-
- CATCH_BAD_ALLOC;
}
} /* extern "C" */
--- 960,978 ----
* Signature: ()V
*/
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFontMetrics_initIDs(JNIEnv *env, jclass cls)
{
! CHECK_NULL(AwtFont::widthsID = env->GetFieldID(cls, "widths", "[I"));
! CHECK_NULL(AwtFont::ascentID = env->GetFieldID(cls, "ascent", "I"));
! CHECK_NULL(AwtFont::descentID = env->GetFieldID(cls, "descent", "I"));
! CHECK_NULL(AwtFont::leadingID = env->GetFieldID(cls, "leading", "I"));
! CHECK_NULL(AwtFont::heightID = env->GetFieldID(cls, "height", "I"));
! CHECK_NULL(AwtFont::maxAscentID = env->GetFieldID(cls, "maxAscent", "I"));
! CHECK_NULL(AwtFont::maxDescentID = env->GetFieldID(cls, "maxDescent", "I"));
! CHECK_NULL(AwtFont::maxHeightID = env->GetFieldID(cls, "maxHeight", "I"));
AwtFont::maxAdvanceID = env->GetFieldID(cls, "maxAdvance", "I");
}
} /* extern "C" */
*** 950,981 ****
extern "C" {
JNIEXPORT void JNICALL
Java_java_awt_Font_initIDs(JNIEnv *env, jclass cls)
{
! TRY;
!
! AwtFont::peerMID = env->GetMethodID(cls, "getPeer",
! "()Ljava/awt/peer/FontPeer;");
! AwtFont::pDataID = env->GetFieldID(cls, "pData", "J");
! AwtFont::nameID = env->GetFieldID(cls, "name", "Ljava/lang/String;");
! AwtFont::sizeID = env->GetFieldID(cls, "size", "I");
! AwtFont::styleID = env->GetFieldID(cls, "style", "I");
!
AwtFont::getFontMID =
env->GetStaticMethodID(cls, "getFont",
"(Ljava/lang/String;)Ljava/awt/Font;");
-
- DASSERT(AwtFont::peerMID != NULL);
- DASSERT(AwtFont::pDataID != NULL);
- DASSERT(AwtFont::nameID != NULL);
- DASSERT(AwtFont::sizeID != NULL);
- DASSERT(AwtFont::styleID != NULL);
-
- DASSERT(AwtFont::getFontMID != NULL);
-
- CATCH_BAD_ALLOC;
}
} /* extern "C" */
--- 983,1002 ----
extern "C" {
JNIEXPORT void JNICALL
Java_java_awt_Font_initIDs(JNIEnv *env, jclass cls)
{
! CHECK_NULL(AwtFont::peerMID = env->GetMethodID(cls, "getPeer",
! "()Ljava/awt/peer/FontPeer;"));
! CHECK_NULL(AwtFont::pDataID = env->GetFieldID(cls, "pData", "J"));
! CHECK_NULL(AwtFont::nameID =
! env->GetFieldID(cls, "name", "Ljava/lang/String;"));
! CHECK_NULL(AwtFont::sizeID = env->GetFieldID(cls, "size", "I"));
! CHECK_NULL(AwtFont::styleID = env->GetFieldID(cls, "style", "I"));
AwtFont::getFontMID =
env->GetStaticMethodID(cls, "getFont",
"(Ljava/lang/String;)Ljava/awt/Font;");
}
} /* extern "C" */
*** 986,1004 ****
extern "C" {
JNIEXPORT void JNICALL
Java_java_awt_FontMetrics_initIDs(JNIEnv *env, jclass cls)
{
! TRY;
!
! AwtFont::fontID = env->GetFieldID(cls, "font", "Ljava/awt/Font;");
AwtFont::getHeightMID = env->GetMethodID(cls, "getHeight", "()I");
-
- DASSERT(AwtFont::fontID);
- DASSERT(AwtFont::getHeightMID);
-
- CATCH_BAD_ALLOC;
}
} /* extern "C" */
/************************************************************************
--- 1007,1019 ----
extern "C" {
JNIEXPORT void JNICALL
Java_java_awt_FontMetrics_initIDs(JNIEnv *env, jclass cls)
{
! CHECK_NULL(AwtFont::fontID =
! env->GetFieldID(cls, "font", "Ljava/awt/Font;"));
AwtFont::getHeightMID = env->GetMethodID(cls, "getHeight", "()I");
}
} /* extern "C" */
/************************************************************************
*** 1008,1027 ****
extern "C" {
JNIEXPORT void JNICALL
Java_sun_awt_FontDescriptor_initIDs(JNIEnv *env, jclass cls)
{
! TRY;
!
! AwtFont::nativeNameID = env->GetFieldID(cls, "nativeName",
! "Ljava/lang/String;");
AwtFont::useUnicodeID = env->GetFieldID(cls, "useUnicode", "Z");
- DASSERT(AwtFont::nativeNameID != NULL);
- DASSERT(AwtFont::useUnicodeID != NULL);
-
- CATCH_BAD_ALLOC;
}
} /* extern "C" */
--- 1023,1036 ----
extern "C" {
JNIEXPORT void JNICALL
Java_sun_awt_FontDescriptor_initIDs(JNIEnv *env, jclass cls)
{
! CHECK_NULL(AwtFont::nativeNameID =
! env->GetFieldID(cls, "nativeName", "Ljava/lang/String;"));
AwtFont::useUnicodeID = env->GetFieldID(cls, "useUnicode", "Z");
}
} /* extern "C" */
*** 1032,1055 ****
extern "C" {
JNIEXPORT void JNICALL
Java_sun_awt_PlatformFont_initIDs(JNIEnv *env, jclass cls)
{
! TRY;
!
! AwtFont::fontConfigID = env->GetFieldID(cls, "fontConfig", "Lsun/awt/FontConfiguration;");
! AwtFont::componentFontsID =
! env->GetFieldID(cls, "componentFonts", "[Lsun/awt/FontDescriptor;");
AwtFont::makeConvertedMultiFontStringMID =
env->GetMethodID(cls, "makeConvertedMultiFontString",
"(Ljava/lang/String;)[Ljava/lang/Object;");
-
- DASSERT(AwtFont::makeConvertedMultiFontStringMID != NULL);
- DASSERT(AwtFont::componentFontsID != NULL);
- DASSERT(AwtFont::fontConfigID != NULL);
-
- CATCH_BAD_ALLOC;
}
} /* extern "C" */
--- 1041,1057 ----
extern "C" {
JNIEXPORT void JNICALL
Java_sun_awt_PlatformFont_initIDs(JNIEnv *env, jclass cls)
{
! CHECK_NULL(AwtFont::fontConfigID =
! env->GetFieldID(cls, "fontConfig", "Lsun/awt/FontConfiguration;"));
! CHECK_NULL(AwtFont::componentFontsID =
! env->GetFieldID(cls, "componentFonts", "[Lsun/awt/FontDescriptor;"));
AwtFont::makeConvertedMultiFontStringMID =
env->GetMethodID(cls, "makeConvertedMultiFontString",
"(Ljava/lang/String;)[Ljava/lang/Object;");
}
} /* extern "C" */
*** 1860,1871 ****
TRY;
static CCombinedSegTableManager tableManager;
jstring fontName = (jstring)env->GetObjectField(self, AwtFont::fontNameID);
! DASSERT(fontName != NULL);
LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL);
CCombinedSegTable* pTable = tableManager.GetTable(fontNameW);
JNU_ReleaseStringPlatformChars(env, fontName, fontNameW);
return (pTable->In((USHORT) ch) ? JNI_TRUE : JNI_FALSE);
CATCH_BAD_ALLOC_RET(FALSE);
--- 1862,1875 ----
TRY;
static CCombinedSegTableManager tableManager;
jstring fontName = (jstring)env->GetObjectField(self, AwtFont::fontNameID);
! DASSERT(fontName != NULL); // leave in for debug mode.
! CHECK_NULL_RETURN(fontName, FALSE); // in production, just return
LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL);
+ CHECK_NULL_RETURN(fontNameW, FALSE);
CCombinedSegTable* pTable = tableManager.GetTable(fontNameW);
JNU_ReleaseStringPlatformChars(env, fontName, fontNameW);
return (pTable->In((USHORT) ch) ? JNI_TRUE : JNI_FALSE);
CATCH_BAD_ALLOC_RET(FALSE);