< 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 >