Skip to content
Permalink
Browse files
[symbology] Use static QStrings for data defined keys rather than
creating new strings with every redraw (pt 2)
  • Loading branch information
nyalldawson committed May 23, 2015
1 parent 97864da commit dbdfe40bf9b31ab7298b9f8b83b524de62fb7e24
@@ -1067,23 +1067,23 @@ void QgsShapeburstFillSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2Rende

//use whole shape
useWholeShape = mUseWholeShape;
if ( hasDataDefinedProperty( "use_whole_shape" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_USE_WHOLE_SHAPE ) )
{
useWholeShape = evaluateDataDefinedProperty( "use_whole_shape", context.feature(), mUseWholeShape ).toBool();
useWholeShape = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_USE_WHOLE_SHAPE, context.feature(), mUseWholeShape ).toBool();
}

//max distance
maxDistance = mMaxDistance;
if ( hasDataDefinedProperty( "max_distance" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_MAX_DISTANCE ) )
{
maxDistance = evaluateDataDefinedProperty( "max_distance", context.feature(), mMaxDistance ).toDouble();
maxDistance = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_MAX_DISTANCE, context.feature(), mMaxDistance ).toDouble();
}

//ignore rings
ignoreRings = mIgnoreRings;
if ( hasDataDefinedProperty( "ignore_rings" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_IGNORE_RINGS ) )
{
ignoreRings = evaluateDataDefinedProperty( "ignore_rings", context.feature(), mIgnoreRings ).toBool();
ignoreRings = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_IGNORE_RINGS, context.feature(), mIgnoreRings ).toBool();
}

}
@@ -2126,9 +2126,9 @@ QgsSymbolLayerV2* QgsSVGFillSymbolLayer::createFromSld( QDomElement &element )

void QgsSVGFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2RenderContext& context )
{
if ( !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH ) && !hasDataDefinedProperty( "svgFile" )
&& !hasDataDefinedProperty( "svgFillColor" ) && !hasDataDefinedProperty( "svgOutlineColor" )
&& !hasDataDefinedProperty( "svgOutlineWidth" ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE ) )
if ( !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_FILE )
&& !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_FILL_COLOR ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_OUTLINE_COLOR )
&& !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_OUTLINE_WIDTH ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE ) )
{
return; //no data defined settings
}
@@ -2148,28 +2148,28 @@ void QgsSVGFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2RenderCon
width = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH, context.feature(), mPatternWidth ).toDouble();
}
QString svgFile = mSvgFilePath;
if ( hasDataDefinedProperty( "svgFile" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_FILE ) )
{
svgFile = evaluateDataDefinedProperty( "svgFile", context.feature(), mSvgFilePath ).toString();
svgFile = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_FILE, context.feature(), mSvgFilePath ).toString();
}
QColor svgFillColor = mSvgFillColor;
if ( hasDataDefinedProperty( "svgFillColor" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_FILL_COLOR ) )
{
QString colorString = evaluateDataDefinedProperty( "svgFillColor", context.feature(), QVariant(), &ok ).toString();
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_FILL_COLOR, context.feature(), QVariant(), &ok ).toString();
if ( ok )
svgFillColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
}
QColor svgOutlineColor = mSvgOutlineColor;
if ( hasDataDefinedProperty( "svgOutlineColor" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_OUTLINE_COLOR ) )
{
QString colorString = evaluateDataDefinedProperty( "svgOutlineColor", context.feature(), QVariant(), &ok ).toString();
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_OUTLINE_COLOR, context.feature(), QVariant(), &ok ).toString();
if ( ok )
svgOutlineColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
}
double outlineWidth = mSvgOutlineWidth;
if ( hasDataDefinedProperty( "svgOutlineWidth" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_OUTLINE_WIDTH ) )
{
outlineWidth = evaluateDataDefinedProperty( "svgOutlineWidth", context.feature(), mSvgOutlineWidth ).toDouble();
outlineWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SVG_OUTLINE_WIDTH, context.feature(), mSvgOutlineWidth ).toDouble();
}
applyPattern( mBrush, svgFile, width, mPatternWidthUnit, svgFillColor, svgOutlineColor, outlineWidth,
mSvgOutlineWidthUnit, context, mPatternWidthMapUnitScale, mSvgOutlineWidthMapUnitScale );
@@ -2841,7 +2841,7 @@ QString QgsLinePatternFillSymbolLayer::ogrFeatureStyleWidth( double widthScaleFa
void QgsLinePatternFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2RenderContext& context )
{
if ( !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINEANGLE ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE )
&& !hasDataDefinedProperty( "linewidth" ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
&& !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINEWIDTH ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
{
return; //no data defined settings
}
@@ -2858,9 +2858,9 @@ void QgsLinePatternFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2R
distance = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE, context.feature(), mDistance ).toDouble();
}
double lineWidth = mLineWidth;
if ( hasDataDefinedProperty( "linewidth" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINEWIDTH ) )
{
lineWidth = evaluateDataDefinedProperty( "linewidth", context.feature(), mLineWidth ).toDouble();
lineWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINEWIDTH, context.feature(), mLineWidth ).toDouble();
}
QColor color = mColor;
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
@@ -3251,32 +3251,32 @@ void QgsPointPatternFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2
{
#if 0
// TODO: enable but check also if mMarkerSymbol has data defined properties
if ( !hasDataDefinedProperty( "distance_x" ) && !hasDataDefinedProperty( "distance_y" )
&& !hasDataDefinedProperty( "displacement_x" ) && !hasDataDefinedProperty( "displacement_y" ) )
if ( !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_X ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_Y )
&& !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_X ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_Y ) )
{
return;
}
#endif

double distanceX = mDistanceX;
if ( hasDataDefinedProperty( "distance_x" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_X ) )
{
distanceX = evaluateDataDefinedProperty( "distance_x", context.feature(), mDistanceX ).toDouble();
distanceX = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_X, context.feature(), mDistanceX ).toDouble();
}
double distanceY = mDistanceY;
if ( hasDataDefinedProperty( "distance_y" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_Y ) )
{
distanceY = evaluateDataDefinedProperty( "distance_y", context.feature(), mDistanceY ).toDouble();
distanceY = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_Y, context.feature(), mDistanceY ).toDouble();
}
double displacementX = mDisplacementX;
if ( hasDataDefinedProperty( "displacement_x" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_X ) )
{
displacementX = evaluateDataDefinedProperty( "displacement_x", context.feature(), mDisplacementX ).toDouble();
displacementX = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_X, context.feature(), mDisplacementX ).toDouble();
}
double displacementY = mDisplacementY;
if ( hasDataDefinedProperty( "displacement_y" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_Y ) )
{
displacementY = evaluateDataDefinedProperty( "displacement_y", context.feature(), mDisplacementY ).toDouble();
displacementY = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_Y, context.feature(), mDisplacementY ).toDouble();
}
applyPattern( context, mBrush, distanceX, distanceY, displacementX, displacementY );
}
@@ -3651,8 +3651,8 @@ void QgsRasterFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2Render
return; // shortcut

bool hasWidthExpression = hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH );
bool hasFileExpression = hasDataDefinedProperty( "file" );
bool hasAlphaExpression = hasDataDefinedProperty( "alpha" );
bool hasFileExpression = hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILE );
bool hasAlphaExpression = hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ALPHA );
bool hasAngleExpression = hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE );

if ( !hasWidthExpression && !hasAngleExpression && !hasAlphaExpression && !hasFileExpression )
@@ -3681,12 +3681,12 @@ void QgsRasterFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2Render
double alpha = mAlpha;
if ( hasAlphaExpression )
{
alpha = evaluateDataDefinedProperty( "alpha", context.feature(), mAlpha ).toDouble();
alpha = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_ALPHA, context.feature(), mAlpha ).toDouble();
}
QString file = mImageFilePath;
if ( hasFileExpression )
{
file = evaluateDataDefinedProperty( "file", context.feature(), mImageFilePath ).toString();
file = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILE, context.feature(), mImageFilePath ).toString();
}
applyPattern( mBrush, file, width, alpha, context );
}
@@ -492,7 +492,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
}

//dash dot vector
if ( hasDataDefinedProperty( "customdash" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_CUSTOMDASH ) )
{
double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale );
double dashWidthDiv = mPen.widthF();
@@ -513,7 +513,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
}

QVector<qreal> dashVector;
QStringList dashList = evaluateDataDefinedProperty( "customdash", context.feature(), QVariant(), &ok ).toString().split( ";" );
QStringList dashList = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_CUSTOMDASH, context.feature(), QVariant(), &ok ).toString().split( ";" );
if ( ok )
{
QStringList::const_iterator dashIt = dashList.constBegin();
@@ -526,25 +526,25 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
}

//line style
if ( hasDataDefinedProperty( "line_style" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINE_STYLE ) )
{
QString lineStyleString = evaluateDataDefinedProperty( "line_style", context.feature(), QVariant(), &ok ).toString();
QString lineStyleString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINE_STYLE, context.feature(), QVariant(), &ok ).toString();
if ( ok )
pen.setStyle( QgsSymbolLayerV2Utils::decodePenStyle( lineStyleString ) );
}

//join style
if ( hasDataDefinedProperty( "joinstyle" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_JOINSTYLE ) )
{
QString joinStyleString = evaluateDataDefinedProperty( "joinstyle", context.feature(), QVariant(), &ok ).toString();
QString joinStyleString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_JOINSTYLE, context.feature(), QVariant(), &ok ).toString();
if ( ok )
pen.setJoinStyle( QgsSymbolLayerV2Utils::decodePenJoinStyle( joinStyleString ) );
}

//cap style
if ( hasDataDefinedProperty( "capstyle" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_CAPSTYLE ) )
{
QString capStyleString = evaluateDataDefinedProperty( "capstyle", context.feature(), QVariant(), &ok ).toString();
QString capStyleString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_CAPSTYLE, context.feature(), QVariant(), &ok ).toString();
if ( ok )
pen.setCapStyle( QgsSymbolLayerV2Utils::decodePenCapStyle( capStyleString ) );
}
@@ -806,9 +806,9 @@ void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
Placement placement = mPlacement;

bool ok;
if ( hasDataDefinedProperty( "placement" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_PLACEMENT ) )
{
QString placementString = evaluateDataDefinedProperty( "placement", context.feature(), QVariant(), &ok ).toString();
QString placementString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_PLACEMENT, context.feature(), QVariant(), &ok ).toString();
if ( ok )
{
if ( placementString.compare( "vertex", Qt::CaseInsensitive ) == 0 )
@@ -885,18 +885,18 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineInterval( const QPolygonF& points
QgsRenderContext& rc = context.renderContext();
double interval = mInterval;

if ( hasDataDefinedProperty( "interval" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_INTERVAL ) )
{
interval = evaluateDataDefinedProperty( "interval", context.feature(), mInterval ).toDouble();
interval = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_INTERVAL, context.feature(), mInterval ).toDouble();
}
if ( interval <= 0 )
{
interval = 0.1;
}
double offsetAlongLine = mOffsetAlongLine;
if ( hasDataDefinedProperty( "offset_along_line" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE ) )
{
offsetAlongLine = evaluateDataDefinedProperty( "offset_along_line", context.feature(), mOffsetAlongLine ).toDouble();
offsetAlongLine = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE, context.feature(), mOffsetAlongLine ).toDouble();
}

double painterUnitInterval = interval * QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mIntervalUnit, mIntervalMapUnitScale );
@@ -968,9 +968,9 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineVertex( const QPolygonF& points,
bool isRing = false;

double offsetAlongLine = mOffsetAlongLine;
if ( hasDataDefinedProperty( "offset_along_line" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE ) )
{
offsetAlongLine = evaluateDataDefinedProperty( "offset_along_line", context.feature(), mOffsetAlongLine ).toDouble();
offsetAlongLine = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE, context.feature(), mOffsetAlongLine ).toDouble();
}
if ( offsetAlongLine != 0 )
{
@@ -64,6 +64,29 @@ const QString QgsSymbolLayerV2::EXPR_REFERENCE1_ISCENTROID( "reference1_iscentro
const QString QgsSymbolLayerV2::EXPR_REFERENCE2_ISCENTROID( "reference2_iscentroid" );
const QString QgsSymbolLayerV2::EXPR_BLUR_RADIUS( "blur_radius" );
const QString QgsSymbolLayerV2::EXPR_DISTANCE( "distance" );
const QString QgsSymbolLayerV2::EXPR_USE_WHOLE_SHAPE( "use_whole_shape" );
const QString QgsSymbolLayerV2::EXPR_MAX_DISTANCE( "max_distance" );
const QString QgsSymbolLayerV2::EXPR_IGNORE_RINGS( "ignore_rings" );
const QString QgsSymbolLayerV2::EXPR_SVG_FILE( "svgFile" );
const QString QgsSymbolLayerV2::EXPR_SVG_FILL_COLOR( "svgFillColor" );
const QString QgsSymbolLayerV2::EXPR_SVG_OUTLINE_COLOR( "svgOutlineColor" );
const QString QgsSymbolLayerV2::EXPR_SVG_OUTLINE_WIDTH( "svgOutlineWidth" );
const QString QgsSymbolLayerV2::EXPR_LINEWIDTH( "linewidth" );
const QString QgsSymbolLayerV2::EXPR_DISTANCE_X( "distance_x" );
const QString QgsSymbolLayerV2::EXPR_DISTANCE_Y( "distance_y" );
const QString QgsSymbolLayerV2::EXPR_DISPLACEMENT_X( "displacement_x" );
const QString QgsSymbolLayerV2::EXPR_DISPLACEMENT_Y( "displacement_y" );
const QString QgsSymbolLayerV2::EXPR_FILE( "file" );
const QString QgsSymbolLayerV2::EXPR_ALPHA( "alpha" );
const QString QgsSymbolLayerV2::EXPR_CUSTOMDASH( "customdash" );
const QString QgsSymbolLayerV2::EXPR_LINE_STYLE( "line_style" );
const QString QgsSymbolLayerV2::EXPR_JOINSTYLE( "joinstyle" );
const QString QgsSymbolLayerV2::EXPR_CAPSTYLE( "capstyle" );
const QString QgsSymbolLayerV2::EXPR_PLACEMENT( "placement" );
const QString QgsSymbolLayerV2::EXPR_INTERVAL( "interval" );
const QString QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE( "offset_along_line" );
const QString QgsSymbolLayerV2::EXPR_HORIZONTAL_ANCHOR_POINT( "horizontal_anchor_point" );
const QString QgsSymbolLayerV2::EXPR_VERTICAL_ANCHOR_POINT( "vertical_anchor_point" );

const QgsExpression* QgsSymbolLayerV2::dataDefinedProperty( const QString& property ) const
{
@@ -463,13 +486,13 @@ void QgsMarkerSymbolLayerV2::markerOffset( const QgsSymbolV2RenderContext& conte

HorizontalAnchorPoint horizontalAnchorPoint = mHorizontalAnchorPoint;
VerticalAnchorPoint verticalAnchorPoint = mVerticalAnchorPoint;
if ( hasDataDefinedProperty( "horizontal_anchor_point" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_HORIZONTAL_ANCHOR_POINT ) )
{
horizontalAnchorPoint = decodeHorizontalAnchorPoint( evaluateDataDefinedProperty( "horizontal_anchor_point", context.feature() ).toString() );
horizontalAnchorPoint = decodeHorizontalAnchorPoint( evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_HORIZONTAL_ANCHOR_POINT , context.feature() ).toString() );
}
if ( hasDataDefinedProperty( "vertical_anchor_point" ) )
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_VERTICAL_ANCHOR_POINT ) )
{
verticalAnchorPoint = decodeVerticalAnchorPoint( evaluateDataDefinedProperty( "vertical_anchor_point", context.feature() ).toString() );
verticalAnchorPoint = decodeVerticalAnchorPoint( evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_VERTICAL_ANCHOR_POINT, context.feature() ).toString() );
}

//correct horizontal position according to anchor point
@@ -320,7 +320,29 @@ class CORE_EXPORT QgsSymbolLayerV2
static const QString EXPR_REFERENCE2_ISCENTROID;
static const QString EXPR_BLUR_RADIUS;
static const QString EXPR_DISTANCE;

static const QString EXPR_USE_WHOLE_SHAPE;
static const QString EXPR_MAX_DISTANCE;
static const QString EXPR_IGNORE_RINGS;
static const QString EXPR_SVG_FILE;
static const QString EXPR_SVG_FILL_COLOR;
static const QString EXPR_SVG_OUTLINE_COLOR;
static const QString EXPR_SVG_OUTLINE_WIDTH;
static const QString EXPR_LINEWIDTH;
static const QString EXPR_DISTANCE_X;
static const QString EXPR_DISTANCE_Y;
static const QString EXPR_DISPLACEMENT_X;
static const QString EXPR_DISPLACEMENT_Y;
static const QString EXPR_FILE;
static const QString EXPR_ALPHA;
static const QString EXPR_CUSTOMDASH;
static const QString EXPR_LINE_STYLE;
static const QString EXPR_JOINSTYLE; //near duplicate is required to maintain project compatibility
static const QString EXPR_CAPSTYLE;
static const QString EXPR_PLACEMENT;
static const QString EXPR_INTERVAL;
static const QString EXPR_OFFSET_ALONG_LINE;
static const QString EXPR_HORIZONTAL_ANCHOR_POINT;
static const QString EXPR_VERTICAL_ANCHOR_POINT;
};

//////////////////////

0 comments on commit dbdfe40

Please sign in to comment.