double GLText::getDescent(const char* str) { double descent = 0.0; while(*str>0){ descent = max(descent,getDescent(*str)); str++; } return descent; }
void GLText::drawString(vector2d loc, double angle, double size, const char* str, HAlignOptions hAlign, VAlignOptions vAlign) { glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glTranslated(loc.x,loc.y,0.0); glScaled(size, size,1.0); glRotated(angle,0,0,1); switch(hAlign){ case LeftAligned:{ //Normal rendering will achieve this! break; } case RightAligned:{ glTranslated(-getWidth(str),0,0); break; } case CenterAligned:{ glTranslated(-0.5*getWidth(str),0,0); break; } } switch(vAlign){ case BottomAligned:{ glTranslated(0.0,getDescent(str),0.0); break; } case TopAligned:{ glTranslated(0.0,-getAscent(str),0.0); break; } case MedianAligned:{ //Normal rendering will achieve this! break; } case MiddleAligned:{ glTranslated(0.0,-0.5*getHeight(str),0.0); break; } } vector2d textDir; textDir.heading(0); double d = 0.0; while(*str>0){ drawGlyph(*str); d = characterSpacing + 0.5*getWidth(*str); str++; if((*str)>0){ d += 0.5*getWidth(*str); glTranslated(d*textDir.x,d*textDir.y,0.0); } } glPopMatrix(); }
float VirtualFont::getOffsetY(const LineLayout &layout, Alignment align) const { switch (align) { case ALIGN_MIDDLE: return (middleLineFactor != 0) ? (middleLineFactor * (layout.maxAscent - layout.maxDescent) * sizeRatio) : getStrikethroughOffset(layout); case ALIGN_TOP: return +getAscent(layout); case ALIGN_BOTTOM: return -getDescent(layout); default: return 0; } }
void fp_AnnotationRun::_draw(dg_DrawArgs* pDA) { if(!displayAnnotations()) return; if(!m_bIsStart) return; GR_Graphics * pG = pDA->pG; UT_sint32 xoff = 0, yoff = 0; GR_Painter painter(pG); // need screen locations of this run getLine()->getScreenOffsets(this, xoff, yoff); UT_sint32 iYdraw = pDA->yoff - getAscent()-1; UT_uint32 iRunBase = getBlock()->getPosition() + getBlockOffset(); // // Sevior was here // UT_sint32 iFillTop = iYdraw; UT_sint32 iFillTop = iYdraw+1; UT_sint32 iFillHeight = getAscent() + getDescent(); FV_View* pView = _getView(); UT_uint32 iSelAnchor = pView->getSelectionAnchor(); UT_uint32 iPoint = pView->getPoint(); UT_uint32 iSel1 = UT_MIN(iSelAnchor, iPoint); UT_uint32 iSel2 = UT_MAX(iSelAnchor, iPoint); UT_ASSERT(iSel1 <= iSel2); bool bIsInTOC = getBlock()->isContainedByTOC(); if ( isInSelectedTOC() || (!bIsInTOC && ( /* pView->getFocus()!=AV_FOCUS_NONE && */ (iSel1 <= iRunBase) && (iSel2 > iRunBase))) ) { UT_RGBColor color(_getView()->getColorSelBackground()); pG->setColor(_getView()->getColorAnnotation(this)); painter.fillRect(color, pDA->xoff, iFillTop, getWidth(), iFillHeight); } else { Fill(getGraphics(),pDA->xoff, iFillTop, getWidth(), iFillHeight); pG->setColor(_getColorFG()); } pG->setFont(_getFont()); pG->setColor(_getView()->getColorAnnotation(this)); UT_DEBUGMSG(("Drawing string m_sValue %s \n",m_sValue.utf8_str())); painter.drawChars(m_sValue.ucs4_str().ucs4_str(), 0,m_sValue.ucs4_str().size(), pDA->xoff,iYdraw, NULL); // // Draw underline/overline/strikethough // UT_sint32 yTopOfRun = pDA->yoff - getAscent()-1; // Hack to remove //character dirt drawDecors( xoff, yTopOfRun,pG); }
/*! * Returns true if the properties are changed in the document. */ bool fp_EmbedRun::_updatePropValuesIfNeeded(void) { UT_sint32 iVal = 0; if(getEmbedManager()->isDefault()) { return false; } PT_AttrPropIndex api = getBlock()->getDocument()->getAPIFromSOH(m_OH); const PP_AttrProp * pAP = NULL; const char * szPropVal = NULL; getBlock()->getDocument()->getAttrProp(api, &pAP); UT_return_val_if_fail(pAP,false); bool bFound = pAP->getProperty("height", szPropVal); bool bDoUpdate = false; if(bFound) { iVal = UT_convertToLogicalUnits(szPropVal); bDoUpdate = (iVal != getHeight()); } else { bDoUpdate = true; } bFound = pAP->getProperty("width", szPropVal); if(bFound && !bDoUpdate) { iVal = UT_convertToLogicalUnits(szPropVal); bDoUpdate = (iVal != getWidth()); } else { bDoUpdate = true; } bFound = pAP->getProperty("ascent", szPropVal); if(bFound && !bDoUpdate) { iVal = UT_convertToLogicalUnits(szPropVal); bDoUpdate = (iVal != static_cast<UT_sint32>(getAscent())); } else { bDoUpdate = true; } bFound = pAP->getProperty("descent", szPropVal); if(bFound && !bDoUpdate) { iVal = UT_convertToLogicalUnits(szPropVal); bDoUpdate = (iVal != static_cast<UT_sint32>(getDescent())); } else { bDoUpdate = true; } if(bDoUpdate) { const char * pProps[10] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; UT_LocaleTransactor t(LC_NUMERIC, "C"); UT_UTF8String sHeight,sWidth,sAscent,sDescent; UT_UTF8String_sprintf(sHeight,"%fin",static_cast<double>(getHeight())/1440.); pProps[0] = "height"; pProps[1] = sHeight.utf8_str(); UT_UTF8String_sprintf(sWidth,"%fin",static_cast<double>(getWidth())/1440.); pProps[2] = "width"; pProps[3] = sWidth.utf8_str(); UT_UTF8String_sprintf(sAscent,"%fin",static_cast<double>(getAscent())/1440.); pProps[4] = "ascent"; pProps[5] = sAscent.utf8_str(); UT_UTF8String_sprintf(sDescent,"%fin",static_cast<double>(getDescent())/1440.); pProps[6] = "descent"; pProps[7] = sDescent.utf8_str(); getBlock()->getDocument()->changeObjectFormatNoUpdate(PTC_AddFmt,m_OH, NULL, pProps); return true; } return false; }
float Font::getDescentInPoints() const { return getDescent() * getHeightToPointsFactor(); }
le_int32 LEFontInstance::getLineHeight() const { return getAscent() + getDescent() + getLeading(); }