mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-09-03 14:10:33 +03:00
computing bounding box of Font_BRepFont
This commit is contained in:
@@ -84,8 +84,8 @@ namespace
|
||||
static const TCollection_AsciiString THE_UNDEFINED_UNITS;
|
||||
|
||||
// default text margin and resolution
|
||||
static const Standard_Real THE_3D_TEXT_MARGIN = 0.1;
|
||||
static const unsigned int THE_2D_TEXT_RESOLUTION = 72;
|
||||
static const Standard_Real THE_3D_TEXT_MARGIN = 0.1;
|
||||
static const unsigned int THE_FONT_RESOLUTION = 96;
|
||||
|
||||
// default selection priorities
|
||||
static const Standard_Integer THE_NEUTRAL_SEL_PRIORITY = 5;
|
||||
@@ -409,45 +409,61 @@ Standard_Real AIS_Dimension::ValueToDisplayUnits() const
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : getWidthAndHeight
|
||||
// function : getLabelSizes
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void AIS_Dimension::getLabelSizes (const TCollection_ExtendedString& theLabel,
|
||||
Standard_Real& theWidth, Standard_Real& theHeight,
|
||||
Standard_Real& theSymbolWidth, Standard_Real& theSymbolHeight
|
||||
) const
|
||||
Standard_Real& theWidth,
|
||||
Standard_Real& theHeight,
|
||||
Standard_Real& theSymbolWidth,
|
||||
Standard_Real& theSymbolHeight) const
|
||||
{
|
||||
theWidth = 0;
|
||||
theHeight = 0;
|
||||
theSymbolWidth = 0;
|
||||
theSymbolHeight = 0;
|
||||
Handle(Prs3d_DimensionAspect) anAspect = myDrawer->DimensionAspect();
|
||||
Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect();
|
||||
Standard_Real aFontHeight = aTextAspect->Height();
|
||||
|
||||
const Handle(Prs3d_TextAspect)& aTextAspect = myDrawer->DimensionAspect()->TextAspect();
|
||||
const Handle(Graphic3d_AspectText3d)& anAspectText = aTextAspect->Aspect();
|
||||
Quantity_Color aColor;
|
||||
Standard_CString aFontName;
|
||||
Standard_Real anExpFactor, aSpace;
|
||||
anAspectText->Values (aColor, aFontName, anExpFactor, aSpace);
|
||||
aTextAspect->Aspect()->Values (aColor, aFontName, anExpFactor, aSpace);
|
||||
|
||||
// Initialize font with specific settings.
|
||||
Font_FTFont aFont;
|
||||
aFont.Init (aFontName, anAspectText->GetTextFontAspect(), aTextAspect->Height(), 96);
|
||||
|
||||
Font_FTFont::Rect aBndBox;
|
||||
|
||||
if (myDisplaySpecialSymbol != AIS_DSS_No)
|
||||
NCollection_String aText ((Standard_Utf16Char*) theLabel.ToExtString());
|
||||
NCollection_String aSymbol;
|
||||
if (DisplaySpecialSymbol() != AIS_DSS_No)
|
||||
{
|
||||
const NCollection_String aString ((Standard_Utf16Char*) TCollection_ExtendedString (mySpecialSymbol).ToExtString());
|
||||
aBndBox = aFont.BoundingBox (aString.ToCString(), Graphic3d_HTA_LEFT, Graphic3d_VTA_TOP);
|
||||
theSymbolWidth = aBndBox.Width();
|
||||
theSymbolHeight = aBndBox.Height();
|
||||
aSymbol.FromUnicode ((Standard_Utf16Char*) TCollection_ExtendedString (mySpecialSymbol).ToExtString());
|
||||
}
|
||||
|
||||
// Compute bounding box for the main text of label
|
||||
const NCollection_String aString ((Standard_Utf16Char*) theLabel.ToExtString());
|
||||
aBndBox = aFont.BoundingBox (aString.ToCString(), Graphic3d_HTA_LEFT, Graphic3d_VTA_TOP);
|
||||
theWidth = aBndBox.Width();
|
||||
theHeight = aBndBox.Height();
|
||||
Font_FTFont::Rect aTextBox;
|
||||
Font_FTFont::Rect aSymbolBox;
|
||||
|
||||
if (!anAspect->IsText3d())
|
||||
{
|
||||
Font_FTFont aFont;
|
||||
aFont.Init (aFontName,
|
||||
aTextAspect->Aspect()->GetTextFontAspect(),
|
||||
static_cast<Standard_Integer> (aFontHeight),
|
||||
THE_FONT_RESOLUTION);
|
||||
aTextBox = aFont.BoundingBox (aText, Graphic3d_HTA_LEFT, Graphic3d_VTA_TOP);
|
||||
if (!aSymbol.IsEmpty())
|
||||
{
|
||||
aSymbolBox = aFont.BoundingBox (aSymbol, Graphic3d_HTA_LEFT, Graphic3d_VTA_TOP);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Font_BRepFont aFont (aFontName, aTextAspect->Aspect()->GetTextFontAspect(), aFontHeight);
|
||||
aTextBox = aFont.BoundingBox (aText);
|
||||
if (!aSymbol.IsEmpty())
|
||||
{
|
||||
aSymbolBox = aFont.BoundingBox (aSymbol);
|
||||
}
|
||||
}
|
||||
|
||||
theWidth = aTextBox.Width();
|
||||
theHeight = aTextBox.Height();
|
||||
theSymbolWidth = aSymbolBox.Width();
|
||||
theSymbolHeight = aSymbolBox.Height();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -528,19 +544,14 @@ void AIS_Dimension::DrawText (const Handle(Prs3d_Presentation)& thePresentation,
|
||||
Font_FontAspect aFontAspect = anAspectText3d->GetTextFontAspect();
|
||||
const Standard_Real aFontHeight = aTextAspect->Height();
|
||||
|
||||
Font_FTFont aFont;
|
||||
aFont.Init (aFontName, anAspectText3d->GetTextFontAspect(), aFontHeight, 96);
|
||||
|
||||
const Standard_Real aHeightOfLine = aFont.LineSpacing();
|
||||
|
||||
// Text sizes
|
||||
Standard_Real aWidth = 0.0;
|
||||
Standard_Real aWidth = 0.0;
|
||||
Standard_Real aHeight = 0.0;
|
||||
Standard_Real aSymbolWidth = 0.0;
|
||||
Standard_Real aSymbolHeight = 0.0;
|
||||
getLabelSizes (theText, aWidth, aHeight, aSymbolWidth, aSymbolHeight);
|
||||
aWidth += aSymbolWidth;
|
||||
// Compute label offsets
|
||||
|
||||
// Compute label offsets
|
||||
Standard_Real aMarginSize = aFontHeight * THE_3D_TEXT_MARGIN;
|
||||
Standard_Real aCenterHOffset = 0.0;
|
||||
Standard_Real aCenterVOffset = 0.0;
|
||||
@@ -563,16 +574,17 @@ void AIS_Dimension::DrawText (const Handle(Prs3d_Presentation)& thePresentation,
|
||||
aSymbolShape = aFont.RenderText (anUTFSymbol);
|
||||
}
|
||||
|
||||
|
||||
// Formating text position in XOY plane
|
||||
Standard_Integer aHLabelPos = theLabelPosition & LabelPosition_HMask;
|
||||
switch (aHLabelPos)
|
||||
{
|
||||
case LabelPosition_HCenter : aCenterHOffset = 0.0; break;
|
||||
case LabelPosition_Right : aCenterHOffset = aWidth / 2.0 + aMarginSize; break;
|
||||
case LabelPosition_Right : aCenterHOffset = aWidth / 2.0 + aMarginSize; break;
|
||||
case LabelPosition_Left : aCenterHOffset = -aWidth / 2.0 - aMarginSize; break;
|
||||
}
|
||||
|
||||
const Standard_Real aHeightOfLine = aFont.LineSpacing();
|
||||
|
||||
switch (aVLabelPos)
|
||||
{
|
||||
case LabelPosition_FirstLine:
|
||||
@@ -643,8 +655,6 @@ void AIS_Dimension::DrawText (const Handle(Prs3d_Presentation)& thePresentation,
|
||||
aTextPlaneTrsf.SetTransformation (aTextCoordSystem, gp_Ax3 (gp::XOY()));
|
||||
aTextShape.Move (aTextPlaneTrsf);
|
||||
|
||||
|
||||
|
||||
if (!aSymbolShape.IsNull())
|
||||
{
|
||||
aSymbolVOffset += aYalign - aHeight / 2.0;
|
||||
@@ -655,7 +665,6 @@ void AIS_Dimension::DrawText (const Handle(Prs3d_Presentation)& thePresentation,
|
||||
aSymbolShape.Move (aTextPlaneTrsf);
|
||||
}
|
||||
|
||||
|
||||
// Set text flipping anchors
|
||||
gp_Trsf aCenterOffsetTrsf;
|
||||
gp_Pnt aCenterOffset (aCenterHOffset, aCenterVOffset, 0.0);
|
||||
@@ -707,25 +716,18 @@ void AIS_Dimension::DrawText (const Handle(Prs3d_Presentation)& thePresentation,
|
||||
|
||||
gp_Pnt aTextPos = theTextPos;
|
||||
|
||||
Font_FTFont aFont;
|
||||
aFont.Init (aFontName,
|
||||
anAspectText3d->GetTextFontAspect(),
|
||||
static_cast<Standard_Integer>(aFontHeight),
|
||||
THE_FONT_RESOLUTION);
|
||||
const Standard_Real aHeightOfLine = aFont.LineSpacing();
|
||||
|
||||
switch (aVLabelPos)
|
||||
{
|
||||
case LabelPosition_FirstLine:
|
||||
{
|
||||
if (myTypeOfLabel == TOL_Text && aHeight > aHeightOfLine)
|
||||
{
|
||||
//aTextPos.SetY (aTextPos.Y() + aHeight / 2.0 - aHeightOfLine);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LabelPosition_LastLine:
|
||||
{
|
||||
if (myTypeOfLabel == TOL_Text && aHeight > aHeightOfLine)
|
||||
{
|
||||
//aTextPos.SetY (aTextPos.Y() + aHeightOfLine - aHeight / 2.0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LabelPosition_VCenter : break;
|
||||
case LabelPosition_FirstLine: break;
|
||||
case LabelPosition_LastLine : break;
|
||||
case LabelPosition_VCenter : break;
|
||||
case LabelPosition_Above:
|
||||
{
|
||||
if (myTypeOfLabel == TOL_Text && aHeight > aHeightOfLine)
|
||||
@@ -794,11 +796,6 @@ void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresenta
|
||||
? (myTextDir*theExtensionDir < 0 ? -myTextDir : myTextDir)
|
||||
: theExtensionDir;
|
||||
|
||||
Standard_Boolean isShortLine = !myDrawer->DimensionAspect()->IsText3d()
|
||||
|| theLabelPosition & LabelPosition_VCenter;
|
||||
|
||||
|
||||
|
||||
// Compute graphical primitives and sensitives for extension line
|
||||
gp_Pnt anExtStart = theExtensionStart;
|
||||
gp_Pnt anExtEnd = !hasLabel || !(theLabelPosition & LabelPosition_Above || theLabelPosition & LabelPosition_Below)
|
||||
@@ -834,7 +831,6 @@ void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresenta
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Add graphical primitives
|
||||
Handle(Graphic3d_ArrayOfSegments) anExtPrimitive = new Graphic3d_ArrayOfSegments ((hasLabel && myLeaderSegmentLength > 0 && myIsTextAligned) ? 4 : 2);
|
||||
anExtPrimitive->AddVertex (anExtStart);
|
||||
@@ -846,9 +842,6 @@ void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresenta
|
||||
anExtPrimitive->AddVertex (aSegmentPoint);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Add selection primitives
|
||||
SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
|
||||
aSensitiveCurve.Append (anExtStart);
|
||||
|
@@ -516,3 +516,51 @@ TopoDS_Shape Font_BRepFont::RenderText (const NCollection_String& theString)
|
||||
}
|
||||
return aResult;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : BoundingBox
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Font_FTFont::Rect Font_BRepFont::BoundingBox (const NCollection_String& theString)
|
||||
{
|
||||
Rect aBox;
|
||||
aBox.Left = 0.f;
|
||||
aBox.Right = 0.f;
|
||||
aBox.Bottom = 0.f;
|
||||
aBox.Top = static_cast<float> (Ascender());
|
||||
|
||||
Standard_Integer aLine = 0;
|
||||
Standard_Real aCurrWidth = 0.;
|
||||
for (NCollection_Utf8Iter anIter = theString.Iterator(); *anIter != 0;)
|
||||
{
|
||||
const Standard_Utf32Char aCharCurr = *anIter;
|
||||
const Standard_Utf32Char aCharNext = *++anIter;
|
||||
if (aCharCurr == '\x0D' // CR (carriage return)
|
||||
|| aCharCurr == '\a' // BEL (alarm)
|
||||
|| aCharCurr == '\f' // FF (form feed) NP (new page)
|
||||
|| aCharCurr == '\b' // BS (backspace)
|
||||
|| aCharCurr == '\v') // VT (vertical tab)
|
||||
{
|
||||
continue; // skip unsupported carriage control codes
|
||||
}
|
||||
else if (aCharCurr == ' ' || aCharCurr == '\t')
|
||||
{
|
||||
aCurrWidth += AdvanceX (aCharCurr, aCharNext);
|
||||
continue;
|
||||
}
|
||||
else if (aCharCurr == '\n')
|
||||
{
|
||||
aBox.Right = Max (aBox.Right, static_cast<float> (aCurrWidth));
|
||||
aCurrWidth = 0;
|
||||
++aLine;
|
||||
continue;
|
||||
}
|
||||
|
||||
aCurrWidth += AdvanceX (aCharCurr, aCharNext);
|
||||
}
|
||||
|
||||
aBox.Right = Max (aBox.Right, static_cast<float> (aCurrWidth));
|
||||
aBox.Bottom = aBox.Top - static_cast<float> (LineSpacing() * Standard_Real (aLine + 1));
|
||||
|
||||
return aBox;
|
||||
}
|
||||
|
Reference in New Issue
Block a user