/*---------------------------------------------------------------------------------------------- Return the size of the text, in points. ----------------------------------------------------------------------------------------------*/ float FwGrTxtSrc::getVerticalOffset(toffset ich) { LgCharRenderProps lgchrp; int ichMinBogus, ichLimBogus; GrResult res = (GrResult)m_qts->GetCharProps(GrToVwOffset(ich), &lgchrp, &ichMinBogus, &ichLimBogus); int dympOffset = lgchrp.dympOffset; if(lgchrp.ssv != kssvOff) { // psuedo device context works since we are getting proportions which are invariant HDC hdc = ::CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); IVwGraphicsWin32Ptr qvgW; qvgW.CreateInstance(CLSID_VwGraphicsWin32); qvgW->Initialize(hdc); IVwGraphicsPtr qvg; CheckHr(qvgW->QueryInterface(IID_IVwGraphics, (void **) &qvg)); CheckHr(qvg->SetupGraphics(&lgchrp)); if (lgchrp.ssv == kssvSuper) { int dSuperscriptYOffsetNumerator; int dSuperscriptYOffsetDenominator; CheckHr(qvg->GetSuperscriptYOffsetRatio(&dSuperscriptYOffsetNumerator, &dSuperscriptYOffsetDenominator)); dympOffset += gr::GrEngine::GrIntMulDiv(lgchrp.dympHeight, dSuperscriptYOffsetNumerator, dSuperscriptYOffsetDenominator); } else if (lgchrp.ssv == kssvSub) { int dSubscriptYOffsetNumerator; int dSubscriptYOffsetDenominator; CheckHr(qvg->GetSubscriptYOffsetRatio(&dSubscriptYOffsetNumerator, &dSubscriptYOffsetDenominator)); dympOffset -= gr::GrEngine::GrIntMulDiv(lgchrp.dympHeight, dSubscriptYOffsetNumerator, dSubscriptYOffsetDenominator); } qvgW.Clear(); qvg.Clear(); ::DeleteDC(hdc); } return (float)(dympOffset / 1000); }