< prev index next >

src/java.desktop/share/native/libfontmanager/freetypeScaler.c

Print this page

        

*** 71,80 **** --- 71,82 ---- TTLayoutTableCache* layoutTables; } FTScalerInfo; typedef struct FTScalerContext { FT_Matrix transform; /* glyph transform, including device transform */ + jfloat scaleX; + jfloat scaleY; jboolean useSbits; /* sbit usage enabled? */ jint aaType; /* antialiasing mode (off/on/grey/lcd) */ jint fmType; /* fractional metrics - on/off */ jboolean doBold; /* perform algorithmic bolding? */ jboolean doItalize; /* perform algorithmic italicizing? */
*** 331,340 **** --- 333,343 ---- } JNIEXPORT jlong JNICALL Java_sun_font_FreetypeFontScaler_createScalerContextNative( JNIEnv *env, jobject scaler, jlong pScaler, jdoubleArray matrix, + jdouble scaleX, jdouble scaleY, jint aa, jint fm, jfloat boldness, jfloat italic) { double dmat[4], ptsz; FTScalerContext *context = (FTScalerContext*) calloc(1, sizeof(FTScalerContext)); FTScalerInfo *scalerInfo =
*** 355,364 **** --- 358,369 ---- context->transform.yx = -FloatToFTFixed((float)dmat[1]/ptsz); context->transform.xy = -FloatToFTFixed((float)dmat[2]/ptsz); context->transform.yy = FloatToFTFixed((float)dmat[3]/ptsz); context->aaType = aa; context->fmType = fm; + context->scaleX = (float)scaleX; + context->scaleY = (float)scaleY; /* If using algorithmic styling, the base values are * boldness = 1.0, italic = 0.0. */ context->doBold = (boldness != 1.0);
*** 650,659 **** --- 655,668 ---- dstRow += dstRowBytes; height -= 3; } } + float roundAdvance(float advance, float scale) { + return (float) ((scale == 1) ? ROUND(advance) + : ROUND(ROUND(advance / scale) * scale)); + } /* * Class: sun_font_FreetypeFontScaler * Method: getGlyphImageNative * Signature: (Lsun/font/Font2D;JI)J
*** 762,781 **** (float) (advh * FTFixedToFloat(context->transform.xx)); glyphInfo->advanceY = (float) (advh * FTFixedToFloat(context->transform.xy)); } else { if (!ftglyph->advance.y) { ! glyphInfo->advanceX = ! (float) ROUND(FT26Dot6ToFloat(ftglyph->advance.x)); glyphInfo->advanceY = 0; } else if (!ftglyph->advance.x) { glyphInfo->advanceX = 0; ! glyphInfo->advanceY = ! (float) ROUND(FT26Dot6ToFloat(-ftglyph->advance.y)); } else { ! glyphInfo->advanceX = FT26Dot6ToFloat(ftglyph->advance.x); ! glyphInfo->advanceY = FT26Dot6ToFloat(-ftglyph->advance.y); } } if (imageSize == 0) { glyphInfo->image = NULL; --- 771,792 ---- (float) (advh * FTFixedToFloat(context->transform.xx)); glyphInfo->advanceY = (float) (advh * FTFixedToFloat(context->transform.xy)); } else { if (!ftglyph->advance.y) { ! float advx = FTFixedToFloat(ftglyph->linearHoriAdvance); ! glyphInfo->advanceX = roundAdvance(advx, context->scaleX); glyphInfo->advanceY = 0; } else if (!ftglyph->advance.x) { + float advv = FTFixedToFloat(ftglyph->linearVertAdvance); glyphInfo->advanceX = 0; ! glyphInfo->advanceY = roundAdvance(-advv, context->scaleY); } else { ! float advx = FTFixedToFloat(ftglyph->linearHoriAdvance); ! float advv = FTFixedToFloat(ftglyph->linearVertAdvance); ! glyphInfo->advanceX = roundAdvance(advx, context->scaleX); ! glyphInfo->advanceY = roundAdvance(-advv, context->scaleY); } } if (imageSize == 0) { glyphInfo->image = NULL;
< prev index next >