31#include <QFontDatabase> 
   38  d = 
new QgsTextSettingsPrivate();
 
 
   42  : mBufferSettings( other.mBufferSettings )
 
   43  , mBackgroundSettings( other.mBackgroundSettings )
 
   44  , mShadowSettings( other.mShadowSettings )
 
   45  , mMaskSettings( other.mMaskSettings )
 
   46  , mTextFontFamily( other.mTextFontFamily )
 
   47  , mTextFontFound( other.mTextFontFound )
 
 
   56  mBufferSettings = other.mBufferSettings;
 
   57  mBackgroundSettings = other.mBackgroundSettings;
 
   58  mShadowSettings = other.mShadowSettings;
 
   59  mMaskSettings = other.mMaskSettings;
 
   60  mTextFontFamily = other.mTextFontFamily;
 
   61  mTextFontFound = other.mTextFontFound;
 
 
   72  if ( d->isValid != other.
isValid()
 
   73       || d->textFont != other.
font()
 
   75       || d->fontSizeUnits != other.
sizeUnit()
 
   77       || d->fontSize != other.
size()
 
   78       || d->textColor != other.
color()
 
   79       || d->opacity != other.
opacity()
 
   93       || mBufferSettings != other.mBufferSettings
 
   94       || mBackgroundSettings != other.mBackgroundSettings
 
   95       || mShadowSettings != other.mShadowSettings
 
   96       || mMaskSettings != other.mMaskSettings
 
 
  106  return !( *
this == other );
 
 
  122  return mBufferSettings;
 
 
  128  mBufferSettings = bufferSettings;
 
 
  134  return mBackgroundSettings;
 
 
  140  mBackgroundSettings = backgroundSettings;
 
 
  146  return mShadowSettings;
 
 
  152  mShadowSettings = shadowSettings;
 
 
  158  return mMaskSettings;
 
 
  164  mMaskSettings = maskSettings;
 
 
  177  QFont 
font = d->textFont;
 
  178  if ( scaleFactor == 1 )
 
  181                        d->fontSizeMapUnitScale );
 
  182    if ( fontPixelSize == 0 )
 
  189    font.setPixelSize( fontPixelSize );
 
  193    double fontPixelSize = context.
convertToPainterUnits( d->fontSize, d->fontSizeUnits, d->fontSizeMapUnitScale );
 
  200    const int roundedPixelSize = 
static_cast< int >( std::round( scaleFactor * fontPixelSize + 0.5 ) );
 
  201    font.setPixelSize( roundedPixelSize );
 
  204  font.setLetterSpacing( QFont::AbsoluteSpacing, context.
convertToPainterUnits( d->textFont.letterSpacing(), d->fontSizeUnits, d->fontSizeMapUnitScale ) * scaleFactor );
 
  205  font.setWordSpacing( context.
convertToPainterUnits( d->textFont.wordSpacing(), d->fontSizeUnits, d->fontSizeMapUnitScale ) * scaleFactor  * scaleFactor );
 
  209    font.setCapitalization( QFont::SmallCaps );
 
 
  218  d->originalFontFamily.clear();
 
 
  223  if ( !d->textNamedStyle.isEmpty() )
 
  224    return d->textNamedStyle;
 
  227  return db.styleString( d->textFont );
 
 
  234  d->textNamedStyle = style;
 
 
  239  return d->forcedBold;
 
 
  245  d->textFont.setBold( forced );
 
  246  d->forcedBold = 
true;
 
 
  251  return d->forcedItalic;
 
 
  257  d->textFont.setItalic( forced );
 
  258  d->forcedItalic = 
true;
 
 
  274  return d->fontSizeUnits;
 
 
  280  d->fontSizeUnits = unit;
 
 
  285  return d->fontSizeMapUnitScale;
 
 
  291  d->fontSizeMapUnitScale = scale;
 
 
  313  d->textColor = 
color;
 
 
  325  d->opacity *= opacityFactor;
 
 
  340  return d->textFont.stretch() > 0 ? d->textFont.stretch() : 100;
 
 
  346  d->textFont.setStretch( factor );
 
 
  362  return d->multilineHeight;
 
 
  368  d->multilineHeight = height;
 
 
  373  return d->multilineHeightUnits;
 
 
  379  d->multilineHeightUnits = unit;
 
 
  384  return d->tabStopDistance;
 
 
  390  d->tabStopDistance = distance;
 
 
  395  return d->tabPositions;
 
 
  401  d->tabPositions = positions;
 
 
  406  return d->tabStopDistanceUnits;
 
 
  412  d->tabStopDistanceUnits = unit;
 
 
  417  return d->tabStopDistanceMapUnitScale;
 
 
  423  d->tabStopDistanceMapUnitScale = scale;
 
 
  428  return d->orientation;
 
 
  442         : d->capitalization ;
 
 
  449#if defined(HAS_KDE_QT5_SMALL_CAPS_FIX) || QT_VERSION >= QT_VERSION_CHECK(6, 3, 0) 
  452  d->textFont.setCapitalization( QFont::MixedCase );
 
 
  458  return d->allowHtmlFormatting;
 
 
  464  d->allowHtmlFormatting = allow;
 
 
  469  return d->previewBackgroundColor;
 
 
  475  d->previewBackgroundColor = 
color;
 
 
  481  QFont appFont = QApplication::font();
 
  483  mTextFontFamily = d->originalFontFamily;
 
  484  QString fontFamily = mTextFontFamily;
 
  488    mTextFontFound = 
false;
 
  494    fontFamily = appFont.family();
 
  498    mTextFontFound = 
true;
 
  503    d->fontSize = appFont.pointSizeF();
 
  507    d->fontSize = layer->
customProperty( QStringLiteral( 
"labeling/fontSize" ) ).toDouble();
 
  510  if ( layer->
customProperty( QStringLiteral( 
"labeling/fontSizeUnit" ) ).toString().isEmpty() )
 
  512    d->fontSizeUnits = layer->
customProperty( QStringLiteral( 
"labeling/fontSizeInMapUnits" ), QVariant( 
false ) ).toBool() ?
 
  522  if ( layer->
customProperty( QStringLiteral( 
"labeling/fontSizeMapUnitScale" ) ).toString().isEmpty() )
 
  525    double oldMin = layer->
customProperty( QStringLiteral( 
"labeling/fontSizeMapUnitMinScale" ), 0.0 ).toDouble();
 
  526    d->fontSizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
 
  527    double oldMax = layer->
customProperty( QStringLiteral( 
"labeling/fontSizeMapUnitMaxScale" ), 0.0 ).toDouble();
 
  528    d->fontSizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
 
  534  int fontWeight = layer->
customProperty( QStringLiteral( 
"labeling/fontWeight" ) ).toInt();
 
  535  bool fontItalic = layer->
customProperty( QStringLiteral( 
"labeling/fontItalic" ) ).toBool();
 
  540  d->textFont.setUnderline( layer->
customProperty( QStringLiteral( 
"labeling/fontUnderline" ) ).toBool() );
 
  541  d->textFont.setStrikeOut( layer->
customProperty( QStringLiteral( 
"labeling/fontStrikeout" ) ).toBool() );
 
  542  d->textFont.setLetterSpacing( QFont::AbsoluteSpacing, layer->
customProperty( QStringLiteral( 
"labeling/fontLetterSpacing" ), QVariant( 0.0 ) ).toDouble() );
 
  543  d->textFont.setWordSpacing( layer->
customProperty( QStringLiteral( 
"labeling/fontWordSpacing" ), QVariant( 0.0 ) ).toDouble() );
 
  545  if ( layer->
customProperty( QStringLiteral( 
"labeling/textOpacity" ) ).toString().isEmpty() )
 
  547    d->opacity = ( 1 - layer->
customProperty( QStringLiteral( 
"labeling/textTransp" ) ).toInt() / 100.0 ); 
 
  551    d->opacity = ( layer->
customProperty( QStringLiteral( 
"labeling/textOpacity" ) ).toDouble() );
 
  555  d->multilineHeight = layer->
customProperty( QStringLiteral( 
"labeling/multilineHeight" ), QVariant( 1.0 ) ).toDouble();
 
 
  566  QDomElement textStyleElem;
 
  567  if ( elem.nodeName() == QLatin1String( 
"text-style" ) )
 
  568    textStyleElem = elem;
 
  570    textStyleElem = elem.firstChildElement( QStringLiteral( 
"text-style" ) );
 
  571  QFont appFont = QApplication::font();
 
  573  mTextFontFamily = d->originalFontFamily;
 
  574  QString fontFamily = mTextFontFamily;
 
  576  const QDomElement familiesElem = textStyleElem.firstChildElement( QStringLiteral( 
"families" ) );
 
  577  const QDomNodeList familyNodes = familiesElem.childNodes();
 
  579  families.reserve( familyNodes.size() );
 
  580  for ( 
int i = 0; i < familyNodes.count(); ++i )
 
  582    const QDomElement familyElem = familyNodes.at( i ).toElement();
 
  583    families << familyElem.attribute( QStringLiteral( 
"name" ) );
 
  587  mTextFontFound = 
false;
 
  593      mTextFontFound = 
true;
 
  597      for ( 
const QString &family : std::as_const( 
families ) )
 
  603          mTextFontFound = 
true;
 
  604          fontFamily = processedFamily;
 
  609      if ( !mTextFontFound )
 
  612        fontFamily = appFont.family();
 
  618    mTextFontFound = 
true;
 
  621  if ( !mTextFontFound )
 
  623    context.
pushMessage( QObject::tr( 
"Font “%1” not available on system" ).arg( mTextFontFamily ) );
 
  626  if ( textStyleElem.hasAttribute( QStringLiteral( 
"fontSize" ) ) )
 
  628    d->fontSize = textStyleElem.attribute( QStringLiteral( 
"fontSize" ) ).toDouble();
 
  632    d->fontSize = appFont.pointSizeF();
 
  635  if ( !textStyleElem.hasAttribute( QStringLiteral( 
"fontSizeUnit" ) ) )
 
  637    d->fontSizeUnits = textStyleElem.attribute( QStringLiteral( 
"fontSizeInMapUnits" ) ).toUInt() == 0 ? 
Qgis::RenderUnit::Points 
  645  if ( !textStyleElem.hasAttribute( QStringLiteral( 
"fontSizeMapUnitScale" ) ) )
 
  648    double oldMin = textStyleElem.attribute( QStringLiteral( 
"fontSizeMapUnitMinScale" ), QStringLiteral( 
"0" ) ).toDouble();
 
  649    d->fontSizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
 
  650    double oldMax = textStyleElem.attribute( QStringLiteral( 
"fontSizeMapUnitMaxScale" ), QStringLiteral( 
"0" ) ).toDouble();
 
  651    d->fontSizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
 
  657  int fontWeight = textStyleElem.attribute( QStringLiteral( 
"fontWeight" ) ).toInt();
 
  658  bool fontItalic = textStyleElem.attribute( QStringLiteral( 
"fontItalic" ) ).toInt();
 
  660  d->textFont.setPointSizeF( d->fontSize ); 
 
  663  d->forcedBold = textStyleElem.attribute( QStringLiteral( 
"forcedBold" ) ).toInt();
 
  664  d->forcedItalic = textStyleElem.attribute( QStringLiteral( 
"forcedItalic" ) ).toInt();
 
  665  d->textFont.setUnderline( textStyleElem.attribute( QStringLiteral( 
"fontUnderline" ) ).toInt() );
 
  666  d->textFont.setStrikeOut( textStyleElem.attribute( QStringLiteral( 
"fontStrikeout" ) ).toInt() );
 
  667  d->textFont.setKerning( textStyleElem.attribute( QStringLiteral( 
"fontKerning" ), QStringLiteral( 
"1" ) ).toInt() );
 
  668  d->textFont.setLetterSpacing( QFont::AbsoluteSpacing, textStyleElem.attribute( QStringLiteral( 
"fontLetterSpacing" ), QStringLiteral( 
"0" ) ).toDouble() );
 
  669  d->textFont.setWordSpacing( textStyleElem.attribute( QStringLiteral( 
"fontWordSpacing" ), QStringLiteral( 
"0" ) ).toDouble() );
 
  671  if ( !textStyleElem.hasAttribute( QStringLiteral( 
"textOpacity" ) ) )
 
  673    d->opacity = ( 1 - textStyleElem.attribute( QStringLiteral( 
"textTransp" ) ).toInt() / 100.0 ); 
 
  677    d->opacity = ( textStyleElem.attribute( QStringLiteral( 
"textOpacity" ) ).toDouble() );
 
  679#if defined(HAS_KDE_QT5_FONT_STRETCH_FIX) || (QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)) 
  680  d->textFont.setStretch( textStyleElem.attribute( QStringLiteral( 
"stretchFactor" ), QStringLiteral( 
"100" ) ).toInt() );
 
  688  if ( !textStyleElem.hasAttribute( QStringLiteral( 
"multilineHeight" ) ) )
 
  690    QDomElement textFormatElem = elem.firstChildElement( QStringLiteral( 
"text-format" ) );
 
  691    d->multilineHeight = textFormatElem.attribute( QStringLiteral( 
"multilineHeight" ), QStringLiteral( 
"1" ) ).toDouble();
 
  695    d->multilineHeight = textStyleElem.attribute( QStringLiteral( 
"multilineHeight" ), QStringLiteral( 
"1" ) ).toDouble();
 
  698  d->multilineHeightUnits = 
QgsUnitTypes::decodeRenderUnit( textStyleElem.attribute( QStringLiteral( 
"multilineHeightUnit" ), QStringLiteral( 
"percent" ) ), &ok );
 
  700  d->tabStopDistance = textStyleElem.attribute( QStringLiteral( 
"tabStopDistance" ), QStringLiteral( 
"80" ) ).toDouble();
 
  701  d->tabStopDistanceUnits = 
QgsUnitTypes::decodeRenderUnit( textStyleElem.attribute( QStringLiteral( 
"tabStopDistanceUnit" ), QStringLiteral( 
"Point" ) ), &ok );
 
  706    const QDomElement tabPositionsElem = textStyleElem.firstChildElement( QStringLiteral( 
"tabPositions" ) );
 
  707    const QDomNodeList tabNodes = tabPositionsElem.childNodes();
 
  709    for ( 
int i = 0; i < tabNodes.count(); ++i )
 
  711      const QDomElement tabElem = tabNodes.at( i ).toElement();
 
  712      tabPositions << 
Tab( tabElem.attribute( QStringLiteral( 
"position" ) ).toDouble() );
 
  717  if ( textStyleElem.hasAttribute( QStringLiteral( 
"capitalization" ) ) )
 
  720    d->capitalization = 
static_cast< Qgis::Capitalization >( textStyleElem.attribute( QStringLiteral( 
"fontCapitals" ), QStringLiteral( 
"0" ) ).toUInt() );
 
  723    d->textFont.setCapitalization( QFont::SmallCaps );
 
  725  d->allowHtmlFormatting = textStyleElem.attribute( QStringLiteral( 
"allowHtml" ), QStringLiteral( 
"0" ) ).toInt();
 
  727  if ( textStyleElem.firstChildElement( QStringLiteral( 
"text-buffer" ) ).isNull() )
 
  729    mBufferSettings.
readXml( elem );
 
  733    mBufferSettings.
readXml( textStyleElem );
 
  735  if ( textStyleElem.firstChildElement( QStringLiteral( 
"text-mask" ) ).isNull() )
 
  741    mMaskSettings.
readXml( textStyleElem );
 
  743  if ( textStyleElem.firstChildElement( QStringLiteral( 
"shadow" ) ).isNull() )
 
  745    mShadowSettings.
readXml( elem );
 
  749    mShadowSettings.
readXml( textStyleElem );
 
  751  if ( textStyleElem.firstChildElement( QStringLiteral( 
"background" ) ).isNull() )
 
  753    mBackgroundSettings.
readXml( elem, context );
 
  757    mBackgroundSettings.
readXml( textStyleElem, context );
 
  760  QDomElement ddElem = textStyleElem.firstChildElement( QStringLiteral( 
"dd_properties" ) );
 
  761  if ( ddElem.isNull() )
 
  763    ddElem = elem.firstChildElement( QStringLiteral( 
"dd_properties" ) );
 
  765  if ( !ddElem.isNull() )
 
  772    d->mDataDefinedProperties.clear();
 
 
  779  QDomElement textStyleElem = doc.createElement( QStringLiteral( 
"text-style" ) );
 
  780  textStyleElem.setAttribute( QStringLiteral( 
"fontFamily" ), !d->originalFontFamily.isEmpty() ? d->originalFontFamily : d->textFont.family() );
 
  782  QDomElement familiesElem = doc.createElement( QStringLiteral( 
"families" ) );
 
  783  for ( 
const QString &family : std::as_const( d->families ) )
 
  785    QDomElement familyElem = doc.createElement( QStringLiteral( 
"family" ) );
 
  786    familyElem.setAttribute( QStringLiteral( 
"name" ), family );
 
  787    familiesElem.appendChild( familyElem );
 
  789  textStyleElem.appendChild( familiesElem );
 
  792  textStyleElem.setAttribute( QStringLiteral( 
"fontSize" ), d->fontSize );
 
  795  textStyleElem.setAttribute( QStringLiteral( 
"fontWeight" ), d->textFont.weight() );
 
  796  textStyleElem.setAttribute( QStringLiteral( 
"fontItalic" ), d->textFont.italic() );
 
  797  textStyleElem.setAttribute( QStringLiteral( 
"fontStrikeout" ), d->textFont.strikeOut() );
 
  798  textStyleElem.setAttribute( QStringLiteral( 
"fontUnderline" ), d->textFont.underline() );
 
  799  textStyleElem.setAttribute( QStringLiteral( 
"forcedBold" ), d->forcedBold );
 
  800  textStyleElem.setAttribute( QStringLiteral( 
"forcedItalic" ), d->forcedItalic );
 
  803  textStyleElem.setAttribute( QStringLiteral( 
"fontLetterSpacing" ), d->textFont.letterSpacing() );
 
  804  textStyleElem.setAttribute( QStringLiteral( 
"fontWordSpacing" ), d->textFont.wordSpacing() );
 
  805  textStyleElem.setAttribute( QStringLiteral( 
"fontKerning" ), d->textFont.kerning() );
 
  806  textStyleElem.setAttribute( QStringLiteral( 
"textOpacity" ), d->opacity );
 
  807#if defined(HAS_KDE_QT5_FONT_STRETCH_FIX) || (QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)) 
  808  if ( d->textFont.stretch() > 0 )
 
  809    textStyleElem.setAttribute( QStringLiteral( 
"stretchFactor" ), d->textFont.stretch() );
 
  813  textStyleElem.setAttribute( QStringLiteral( 
"multilineHeight" ), d->multilineHeight );
 
  814  textStyleElem.setAttribute( QStringLiteral( 
"multilineHeightUnit" ), 
QgsUnitTypes::encodeUnit( d->multilineHeightUnits ) );
 
  816  textStyleElem.setAttribute( QStringLiteral( 
"tabStopDistance" ), d->tabStopDistance );
 
  817  textStyleElem.setAttribute( QStringLiteral( 
"tabStopDistanceUnit" ), 
QgsUnitTypes::encodeUnit( d->tabStopDistanceUnits ) );
 
  820  if ( !d->tabPositions.empty() )
 
  822    QDomElement tabPositionsElem = doc.createElement( QStringLiteral( 
"tabPositions" ) );
 
  823    for ( 
const Tab &tab : std::as_const( d->tabPositions ) )
 
  825      QDomElement tabElem = doc.createElement( QStringLiteral( 
"tab" ) );
 
  826      tabElem.setAttribute( QStringLiteral( 
"position" ), tab.position() );
 
  827      tabPositionsElem.appendChild( tabElem );
 
  829    textStyleElem.appendChild( tabPositionsElem );
 
  832  textStyleElem.setAttribute( QStringLiteral( 
"allowHtml" ), d->allowHtmlFormatting ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) );
 
  833  textStyleElem.setAttribute( QStringLiteral( 
"capitalization" ), QString::number( 
static_cast< int >( d->capitalization ) ) );
 
  835  QDomElement ddElem = doc.createElement( QStringLiteral( 
"dd_properties" ) );
 
  838  textStyleElem.appendChild( mBufferSettings.
writeXml( doc ) );
 
  839  textStyleElem.appendChild( mMaskSettings.
writeXml( doc ) );
 
  840  textStyleElem.appendChild( mBackgroundSettings.
writeXml( doc, context ) );
 
  841  textStyleElem.appendChild( mShadowSettings.
writeXml( doc ) );
 
  842  textStyleElem.appendChild( ddElem );
 
  844  return textStyleElem;
 
 
  851  QMimeData *mimeData = 
new QMimeData;
 
  852  mimeData->setColorData( QVariant( 
color() ) );
 
  855  QDomDocument textDoc;
 
  856  QDomElement textElem = 
writeXml( textDoc, rwContext );
 
  857  textDoc.appendChild( textElem );
 
  858  mimeData->setText( textDoc.toString() );
 
 
  867  if ( 
font.pointSizeF() > 0 )
 
  872  else if ( 
font.pixelSize() > 0 )
 
 
  887      f.setPointSizeF( 
size() );
 
  891      f.setPointSizeF( 
size() * 2.83464567 );
 
  895      f.setPointSizeF( 
size() * 72 );
 
  899      f.setPixelSize( 
static_cast< int >( std::round( 
size() ) ) );
 
 
  920  QString text = data->text();
 
  921  if ( !text.isEmpty() )
 
  927    if ( doc.setContent( text ) )
 
  929      elem = doc.documentElement();
 
  931      format.
readXml( elem, rwContext );
 
 
  942  if ( d->blendMode != QPainter::CompositionMode_SourceOver )
 
  945  if ( mBufferSettings.
enabled() && mBufferSettings.
blendMode() != QPainter::CompositionMode_SourceOver )
 
  948  if ( mBackgroundSettings.
enabled() && mBackgroundSettings.
blendMode() != QPainter::CompositionMode_SourceOver )
 
  951  if ( mShadowSettings.
enabled() && mShadowSettings.
blendMode() != QPainter::CompositionMode_SourceOver )
 
 
  960  return d->mDataDefinedProperties;
 
 
  965  return d->mDataDefinedProperties;
 
 
  970  QSet< QString > fields = d->mDataDefinedProperties.referencedFields( context.
expressionContext(), 
true );
 
 
  981  d->mDataDefinedProperties = collection;
 
 
  987  if ( !d->mDataDefinedProperties.hasActiveProperties() )
 
  990  QString ddFontFamily;
 
  995    QString family = exprVal.toString().trimmed();
 
  997    if ( d->textFont.family() != family )
 
 1003        ddFontFamily = family;
 
 1009  QString ddFontStyle;
 
 1014    QString fontstyle = exprVal.toString().trimmed();
 
 1015    ddFontStyle = fontstyle;
 
 1018  bool ddBold = 
false;
 
 1025  bool ddItalic = 
false;
 
 1035  QFontDatabase fontDb;
 
 1036  QFont appFont = QApplication::font();
 
 1037  bool newFontBuilt = 
false;
 
 1038  if ( ddBold || ddItalic )
 
 1042    newFontBuilt = 
true;
 
 1043    newFont.setBold( ddBold );
 
 1044    newFont.setItalic( ddItalic );
 
 1046  else if ( !ddFontStyle.isEmpty()
 
 1047            && ddFontStyle.compare( QLatin1String( 
"Ignore" ), Qt::CaseInsensitive ) != 0 )
 
 1049    if ( !ddFontFamily.isEmpty() )
 
 1052      QFont styledfont = fontDb.font( ddFontFamily, ddFontStyle, appFont.pointSize() );
 
 1053      if ( appFont != styledfont )
 
 1055        newFont = styledfont;
 
 1056        newFontBuilt = 
true;
 
 1063  else if ( !ddFontFamily.isEmpty() )
 
 1065    if ( ddFontStyle.compare( QLatin1String( 
"Ignore" ), Qt::CaseInsensitive ) != 0 )
 
 1068      QFont styledfont = fontDb.font( ddFontFamily, d->textNamedStyle, appFont.pointSize() );
 
 1069      if ( appFont != styledfont )
 
 1071        newFont = styledfont;
 
 1072        newFontBuilt = 
true;
 
 1078      newFontBuilt = 
true;
 
 1085    newFont.setUnderline( d->textFont.underline() );
 
 1086    newFont.setStrikeOut( d->textFont.strikeOut() );
 
 1087    newFont.setWordSpacing( d->textFont.wordSpacing() );
 
 1088    newFont.setLetterSpacing( QFont::AbsoluteSpacing, d->textFont.letterSpacing() );
 
 1089    d->textFont = newFont;
 
 1119    QString units = exprVal.toString();
 
 1120    if ( !units.isEmpty() )
 
 1125        d->fontSizeUnits = res;
 
 1135      d->opacity = val.toDouble() / 100.0;
 
 1139#if defined(HAS_KDE_QT5_FONT_STRETCH_FIX) || (QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)) 
 1146      d->textFont.setStretch( val.toInt() );
 
 1164      d->textFont.setLetterSpacing( QFont::AbsoluteSpacing, val.toDouble() );
 
 1174      d->textFont.setWordSpacing( val.toDouble() );
 
 1184      if ( val.userType() == QMetaType::Type::QVariantList )
 
 1186        const QVariantList parts = val.toList();
 
 1187        d->tabPositions.clear();
 
 1188        d->tabPositions.reserve( parts.size() );
 
 1189        for ( 
const QVariant &part : parts )
 
 1191          d->tabPositions.append( 
Tab( part.toDouble() ) );
 
 1194      else if ( val.userType() == QMetaType::Type::QStringList )
 
 1196        const QStringList parts = val.toStringList();
 
 1197        d->tabPositions.clear();
 
 1198        d->tabPositions.reserve( parts.size() );
 
 1199        for ( 
const QString &part : parts )
 
 1201          d->tabPositions.append( 
Tab( part.toDouble() ) );
 
 1206        d->tabPositions.clear();
 
 1207        d->tabStopDistance = val.toDouble();
 
 1215    QString blendstr = exprVal.toString().trimmed();
 
 1216    if ( !blendstr.isEmpty() )
 
 
 1230  QPixmap pixmap( 
size * devicePixelRatio );
 
 1231  pixmap.fill( Qt::transparent );
 
 1232  pixmap.setDevicePixelRatio( devicePixelRatio );
 
 1235  painter.begin( &pixmap );
 
 1237  painter.setRenderHint( QPainter::Antialiasing );
 
 1239  const QRectF rect( 0, 0, 
size.width(), 
size.height() );
 
 1242  painter.setPen( Qt::NoPen );
 
 1244  if ( ( background1.lightnessF() < 0.7 ) )
 
 1246    background1 = background1.darker( 125 );
 
 1250    background1 = background1.lighter( 125 );
 
 1253  QLinearGradient linearGrad( QPointF( 0, 0 ), QPointF( 0, rect.height() ) );
 
 1254  linearGrad.setColorAt( 0, background1 );
 
 1255  linearGrad.setColorAt( 1, background2 );
 
 1256  painter.setBrush( QBrush( linearGrad ) );
 
 1257  if ( 
size.width() > 30 )
 
 1259    painter.drawRoundedRect( rect, 6, 6 );
 
 1264    painter.drawRect( rect );
 
 1266  painter.setBrush( Qt::NoBrush );
 
 1267  painter.setPen( Qt::NoPen );
 
 1281    QWidget *activeWindow = QApplication::activeWindow();
 
 1282    if ( QScreen *screen = activeWindow ? activeWindow->screen() : nullptr )
 
 1304             ? fontSize * tempFormat.
buffer().
size() / 100
 
 1309  double ytrans = 0.0;
 
 1312                       ? fontSize * tempFormat.
buffer().
size() / 100
 
 1317  const QStringList text = QStringList() << ( previewText.isEmpty() ? QObject::tr( 
"Aa" ) : previewText );
 
 1319  QRectF textRect = rect;
 
 1320  textRect.setLeft( xtrans + padding );
 
 1321  textRect.setWidth( rect.width() - xtrans - 2 * padding );
 
 1323  if ( textRect.width() > 2000 )
 
 1324    textRect.setWidth( 2000 - 2 * padding );
 
 1326  const double bottom = textRect.height() / 2 + textHeight / 2;
 
 1327  textRect.setTop( bottom - textHeight );
 
 1328  textRect.setBottom( bottom );
 
 1333  painter.setBrush( Qt::NoBrush );
 
 1335  if ( 
size.width() > 30 )
 
 1337    painter.drawRoundedRect( rect, 6, 6 );
 
 1342    painter.drawRect( rect );
 
 
 1355      css += QStringLiteral( 
"line-height: %1%;" ).arg( 
lineHeight() * 100 );
 
 1358      css += QStringLiteral( 
"line-height: %1px;" ).arg( 
lineHeight() );
 
 1362      css += QStringLiteral( 
"line-height: %1px;" ).arg( 
lineHeight() * pointToPixelMultiplier );
 
 1366      css += QStringLiteral( 
"line-height: %1px;" ).arg( 
lineHeight() * 2.83464567 * pointToPixelMultiplier );
 
 1374  css += QStringLiteral( 
"color: rgba(%1,%2,%3,%4);" ).arg( 
color().red() ).arg( 
color().green() ).arg( 
color().blue() ).arg( QString::number( 
color().alphaF(), 
'f', 4 ) );
 
 1378    f.setPointSizeF( 
size() / 0.352778 );
 
 
 1386  : mPosition( position )
 
 
@ Rectangle
Text within rectangle layout mode.
 
BlendMode
Blending modes defining the available composition modes that can be used when painting.
 
Capitalization
String capitalization options.
 
@ AllSmallCaps
Force all characters to small caps.
 
@ MixedCase
Mixed case, ie no change.
 
@ SmallCaps
Mixed case small caps.
 
TextOrientation
Text orientations.
 
RenderUnit
Rendering size units.
 
@ Percentage
Percentage of another measurement (e.g., canvas size, feature size)
 
@ Millimeters
Millimeters.
 
@ Points
Points (e.g., for font sizes)
 
@ Unknown
Mixed or unknown units.
 
@ MetersInMapUnits
Meters value as Map units.
 
@ Antialiasing
Use antialiasing while drawing.
 
static QgsFontManager * fontManager()
Returns the application font manager, which manages available fonts and font installation for the QGI...
 
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
 
static QString colorToString(const QColor &color)
Encodes a color into a string value.
 
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
 
QString processFontFamilyName(const QString &name) const
Processes a font family name, applying any matching fontFamilyReplacements() to the name.
 
static QString asCSS(const QFont &font, double pointToPixelMultiplier=1.0)
Returns a CSS string representing the specified font as closely as possible.
 
static QString translateNamedStyle(const QString &namedStyle)
Returns the localized named style of a font, if such a translation is available.
 
static QString untranslateNamedStyle(const QString &namedStyle)
Returns the english named style of a font, if possible.
 
static QFont createFont(const QString &family, int pointSize=-1, int weight=-1, bool italic=false)
Creates a font with the specified family.
 
static bool fontFamilyMatchOnSystem(const QString &family, QString *chosen=nullptr, bool *match=nullptr)
Check whether font family is on system.
 
static bool fontFamilyOnSystem(const QString &family)
Check whether font family is on system in a quick manner, which does not compare [foundry].
 
static bool updateFontViaStyle(QFont &f, const QString &fontstyle, bool fallback=false)
Updates font with named style and retain all font properties.
 
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
 
Perform transforms between map coordinates and device coordinates.
 
void setParameters(double mapUnitsPerPixel, double centerX, double centerY, int widthPixels, int heightPixels, double rotation)
Sets parameters for use in transforming coordinates.
 
Struct for storing maximum and minimum scales for measurements in map units.
 
static Qgis::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a Qgis::BlendMode corresponding to a QPainter::CompositionMode.
 
static QPainter::CompositionMode getCompositionMode(Qgis::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a Qgis::BlendMode.
 
@ FontSizeUnit
Font size units.
 
@ FontStyle
Font style name.
 
@ Italic
Use italic style.
 
@ FontStretchFactor
Font stretch factor, since QGIS 3.24.
 
@ Strikeout
Use strikeout.
 
@ Underline
Use underline.
 
@ FontBlendMode
Text blend mode.
 
@ FontOpacity
Text opacity.
 
@ FontWordSpacing
Word spacing.
 
@ FontLetterSpacing
Letter spacing.
 
@ TabStopDistance
Tab stop distance, since QGIS 3.38.
 
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the labeling property definitions.
 
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
 
The class is used as a container of context for various read/write operations on other objects.
 
void pushMessage(const QString &message, Qgis::MessageLevel level=Qgis::MessageLevel::Warning) const
Append a message to the context.
 
Contains information about the context of a rendering operation.
 
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
 
void setDevicePixelRatio(float ratio)
Sets the device pixel ratio.
 
void setUseAdvancedEffects(bool enabled)
Used to enable or disable advanced effects such as blend modes.
 
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
 
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
 
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
 
Stores properties relating to a screen.
 
double devicePixelRatio() const
Returns the ratio between physical pixels and device-independent pixels for the screen.
 
bool isValid() const
Returns true if the properties are valid.
 
void updateRenderContextForScreen(QgsRenderContext &context) const
Updates the settings in a render context to match the screen settings.
 
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
 
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
 
static QPainter::CompositionMode decodeBlendMode(const QString &s)
 
static QString encodeColor(const QColor &color)
 
Container for settings relating to a text background object.
 
QSizeF size() const
Returns the size of the background shape.
 
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
 
void upgradeDataDefinedProperties(QgsPropertyCollection &properties)
Upgrade data defined properties when reading a project file saved in QGIS prior to version 3....
 
void setOpacity(double opacity)
Sets the background shape's opacity.
 
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the background shape.
 
bool enabled() const
Returns whether the background is enabled.
 
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
 
double opacity() const
Returns the background shape's opacity.
 
void updateDataDefinedProperties(QgsRenderContext &context, const QgsPropertyCollection &properties)
Updates the format by evaluating current values of data defined properties.
 
SizeType sizeType() const
Returns the method used to determine the size of the background shape (e.g., fixed size or buffer aro...
 
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
 
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer's custom properties (for QGIS 2.x projects).
 
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the shape size.
 
Qgis::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
 
Container for settings relating to a text buffer.
 
Qgis::RenderUnit sizeUnit() const
Returns the units for the buffer size.
 
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer's custom properties (for QGIS 2.x projects).
 
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
 
double size() const
Returns the size of the buffer.
 
void setOpacity(double opacity)
Sets the buffer opacity.
 
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
 
bool enabled() const
Returns whether the buffer is enabled.
 
double opacity() const
Returns the buffer opacity.
 
QDomElement writeXml(QDomDocument &doc) const
Write settings into a DOM element.
 
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the buffer.
 
void updateDataDefinedProperties(QgsRenderContext &context, const QgsPropertyCollection &properties)
Updates the format by evaluating current values of data defined properties.
 
void readXml(const QDomElement &elem)
Read settings from a DOM element.
 
Defines a tab position for a text format.
 
Tab(double position)
Constructor for a Tab at the specified position.
 
Container for all settings relating to text rendering.
 
QgsTextFormat()
Default constructor for QgsTextFormat.
 
void setColor(const QColor &color)
Sets the color that text will be rendered in.
 
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the text.
 
void setSize(double size)
Sets the size for rendered text.
 
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the size.
 
void setCapitalization(Qgis::Capitalization capitalization)
Sets the text capitalization style.
 
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the format's property collection, used for data defined overrides.
 
QStringList families() const
Returns the list of font families to use when restoring the text format, in order of precedence.
 
void setOrientation(Qgis::TextOrientation orientation)
Sets the orientation for the text.
 
void setFont(const QFont &font)
Sets the font used for rendering text.
 
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
 
QList< QgsTextFormat::Tab > tabPositions() const
Returns the list of tab positions for tab stops.
 
void setFamilies(const QStringList &families)
Sets a list of font families to use for the text format, in order of precedence.
 
void setForcedItalic(bool forced)
Sets whether the format is set to force an italic style.
 
static QgsTextFormat fromMimeData(const QMimeData *data, bool *ok=nullptr)
Attempts to parse the provided mime data as a QgsTextFormat.
 
double lineHeight() const
Returns the line height for text.
 
double tabStopDistance() const
Returns the distance for tab stops.
 
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the size of rendered text.
 
int stretchFactor() const
Returns the text's stretch factor.
 
void updateDataDefinedProperties(QgsRenderContext &context)
Updates the format by evaluating current values of data defined properties.
 
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the format's property collection, used for data defined overrides.
 
void setStretchFactor(int factor)
Sets the text's stretch factor.
 
void setShadow(const QgsTextShadowSettings &shadowSettings)
Sets the text's drop shadow settings.
 
void setMask(const QgsTextMaskSettings &maskSettings)
Sets the text's masking settings.
 
void setPreviewBackgroundColor(const QColor &color)
Sets the background color that text will be rendered on for previews.
 
QFont scaledFont(const QgsRenderContext &context, double scaleFactor=1.0, bool *isZeroSize=nullptr) const
Returns a font with the size scaled to match the format's size settings (including units and map unit...
 
void setTabStopDistanceUnit(Qgis::RenderUnit unit)
Sets the unit used for the tab stop distance.
 
void multiplyOpacity(double opacityFactor)
Multiply opacity by opacityFactor.
 
void setOpacity(double opacity)
Sets the text's opacity.
 
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the text.
 
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
 
bool operator==(const QgsTextFormat &other) const
 
void setAllowHtmlFormatting(bool allow)
Sets whether text should be treated as a HTML document and HTML tags should be used for formatting th...
 
void setLineHeightUnit(Qgis::RenderUnit unit)
Sets the unit for the line height for text.
 
Qgis::RenderUnit lineHeightUnit() const
Returns the units for the line height for text.
 
Qgis::Capitalization capitalization() const
Returns the text capitalization style.
 
bool forcedItalic() const
Returns true if the format is set to force an italic style.
 
QgsTextMaskSettings & mask()
Returns a reference to the masking settings.
 
void setForcedBold(bool forced)
Sets whether the format is set to force a bold style.
 
bool isValid() const
Returns true if the format is valid.
 
void setTabStopDistanceMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the tab stop distance.
 
void setBuffer(const QgsTextBufferSettings &bufferSettings)
Sets the text's buffer settings.
 
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
 
Qgis::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
 
static QgsTextFormat fromQFont(const QFont &font)
Returns a text format matching the settings from an input font.
 
void setValid()
Sets the format to a valid state, without changing any of the default format settings.
 
bool allowHtmlFormatting() const
Returns true if text should be treated as a HTML document and HTML tags should be used for formatting...
 
QFont toQFont() const
Returns a QFont matching the relevant settings from this text format.
 
bool operator!=(const QgsTextFormat &other) const
 
double opacity() const
Returns the text's opacity.
 
void setTabStopDistance(double distance)
Sets the distance for tab stops.
 
Qgis::TextOrientation orientation() const
Returns the orientation of the text.
 
QString namedStyle() const
Returns the named style for the font used for rendering text (e.g., "bold").
 
double size() const
Returns the size for rendered text.
 
QgsTextShadowSettings & shadow()
Returns a reference to the text drop shadow settings.
 
QgsTextFormat & operator=(const QgsTextFormat &other)
 
void setTabPositions(const QList< QgsTextFormat::Tab > &positions)
Sets the list of tab positions for tab stops.
 
static QPixmap textFormatPreviewPixmap(const QgsTextFormat &format, QSize size, const QString &previewText=QString(), int padding=0, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for a text format.
 
Qgis::RenderUnit tabStopDistanceUnit() const
Returns the units for the tab stop distance.
 
bool forcedBold() const
Returns true if the format is set to force a bold style.
 
void setBackground(const QgsTextBackgroundSettings &backgroundSettings)
Sets the text's background settings.q.
 
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
 
QString asCSS(double pointToPixelMultiplier=1.0) const
Returns a CSS string representing the specified text format as closely as possible.
 
QMimeData * toMimeData() const
Returns new mime data representing the text format settings.
 
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the size.
 
void setNamedStyle(const QString &style)
Sets the named style for the font used for rendering text.
 
QColor color() const
Returns the color that text will be rendered in.
 
QFont font() const
Returns the font used for rendering text.
 
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer's custom properties (for QGIS 2.x projects).
 
QgsMapUnitScale tabStopDistanceMapUnitScale() const
Returns the map unit scale object for the tab stop distance.
 
QColor previewBackgroundColor() const
Returns the background color for text previews.
 
bool containsAdvancedEffects() const
Returns true if any component of the font format requires advanced effects such as blend modes,...
 
QgsTextBufferSettings & buffer()
Returns a reference to the text buffer settings.
 
void setLineHeight(double height)
Sets the line height for text.
 
Container for settings relating to a selective masking around a text.
 
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
 
void updateDataDefinedProperties(QgsRenderContext &context, const QgsPropertyCollection &properties)
Updates the format by evaluating current values of data defined properties.
 
void readXml(const QDomElement &elem)
Read settings from a DOM element.
 
QDomElement writeXml(QDomDocument &doc) const
Write settings into a DOM element.
 
double opacity() const
Returns the mask's opacity.
 
void setOpacity(double opacity)
Sets the mask's opacity.
 
static Qgis::TextOrientation decodeTextOrientation(const QString &name, bool *ok=nullptr)
Attempts to decode a string representation of a text orientation.
 
static QColor readColor(QgsVectorLayer *layer, const QString &property, const QColor &defaultColor=Qt::black, bool withAlpha=true)
Converts an encoded color value from a layer property.
 
static QString encodeTextOrientation(Qgis::TextOrientation orientation)
Encodes a text orientation.
 
static int sizeToPixel(double size, const QgsRenderContext &c, Qgis::RenderUnit unit, const QgsMapUnitScale &mapUnitScale=QgsMapUnitScale())
Calculates pixel size (considering output size should be in pixel or map units, scale factors and opt...
 
static void drawText(const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, Qgis::TextVerticalAlignment vAlignment=Qgis::TextVerticalAlignment::Top, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle)
Draws text within a rectangle using the specified settings.
 
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Point, QFontMetricsF *fontMetrics=nullptr, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), double maxLineWidth=0)
Returns the height of a text based on a given format.
 
Container for settings relating to a text shadow.
 
bool enabled() const
Returns whether the shadow is enabled.
 
double opacity() const
Returns the shadow's opacity.
 
void readXml(const QDomElement &elem)
Read settings from a DOM element.
 
QDomElement writeXml(QDomDocument &doc) const
Write settings into a DOM element.
 
void updateDataDefinedProperties(QgsRenderContext &context, const QgsPropertyCollection &properties)
Updates the format by evaluating current values of data defined properties.
 
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the drop shadow.
 
void setOpacity(double opacity)
Sets the shadow's opacity.
 
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
 
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer's custom properties (for QGIS 2.x projects).
 
static Q_INVOKABLE Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
 
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
 
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
 
Represents a vector layer which manages a vector based data sets.
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)