diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/css/BasicShapeFunctions.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebCore/css/BasicShapeFunctions.cpp')
-rw-r--r-- | Source/WebCore/css/BasicShapeFunctions.cpp | 341 |
1 files changed, 238 insertions, 103 deletions
diff --git a/Source/WebCore/css/BasicShapeFunctions.cpp b/Source/WebCore/css/BasicShapeFunctions.cpp index 0c9c2d6e3..5b4ba1282 100644 --- a/Source/WebCore/css/BasicShapeFunctions.cpp +++ b/Source/WebCore/css/BasicShapeFunctions.cpp @@ -36,11 +36,10 @@ #include "CSSValuePool.h" #include "Pair.h" #include "RenderStyle.h" -#include "SVGPathByteStream.h" namespace WebCore { -static Ref<CSSPrimitiveValue> valueForCenterCoordinate(CSSValuePool& pool, const RenderStyle& style, const BasicShapeCenterCoordinate& center, EBoxOrient orientation) +static PassRefPtr<CSSPrimitiveValue> valueForCenterCoordinate(CSSValuePool& pool, const RenderStyle* style, const BasicShapeCenterCoordinate& center, EBoxOrient orientation) { if (center.direction() == BasicShapeCenterCoordinate::TopLeft) return pool.createValue(center.length(), style); @@ -50,7 +49,7 @@ static Ref<CSSPrimitiveValue> valueForCenterCoordinate(CSSValuePool& pool, const return pool.createValue(Pair::create(pool.createIdentifierValue(keyword), pool.createValue(center.length(), style))); } -static Ref<CSSPrimitiveValue> basicShapeRadiusToCSSValue(const RenderStyle& style, CSSValuePool& pool, const BasicShapeRadius& radius) +static PassRefPtr<CSSPrimitiveValue> basicShapeRadiusToCSSValue(const RenderStyle* style, CSSValuePool& pool, const BasicShapeRadius& radius) { switch (radius.type()) { case BasicShapeRadius::Value: @@ -62,95 +61,132 @@ static Ref<CSSPrimitiveValue> basicShapeRadiusToCSSValue(const RenderStyle& styl } ASSERT_NOT_REACHED(); - return pool.createIdentifierValue(CSSValueClosestSide); + return 0; } -Ref<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicShape& basicShape) +PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle* style, const BasicShape* basicShape) { - auto& cssValuePool = CSSValuePool::singleton(); + CSSValuePool& pool = cssValuePool(); RefPtr<CSSBasicShape> basicShapeValue; - switch (basicShape.type()) { - case BasicShape::BasicShapeCircleType: { - auto& circle = downcast<BasicShapeCircle>(basicShape); - auto circleValue = CSSBasicShapeCircle::create(); + switch (basicShape->type()) { + case BasicShape::BasicShapeRectangleType: { + const BasicShapeRectangle* rectangle = static_cast<const BasicShapeRectangle*>(basicShape); + RefPtr<CSSBasicShapeRectangle> rectangleValue = CSSBasicShapeRectangle::create(); + + rectangleValue->setX(pool.createValue(rectangle->x(), style)); + rectangleValue->setY(pool.createValue(rectangle->y(), style)); + rectangleValue->setWidth(pool.createValue(rectangle->width(), style)); + rectangleValue->setHeight(pool.createValue(rectangle->height(), style)); + rectangleValue->setRadiusX(pool.createValue(rectangle->cornerRadiusX(), style)); + rectangleValue->setRadiusY(pool.createValue(rectangle->cornerRadiusY(), style)); + + basicShapeValue = rectangleValue.release(); + break; + } + case BasicShape::DeprecatedBasicShapeCircleType: { + const DeprecatedBasicShapeCircle* circle = static_cast<const DeprecatedBasicShapeCircle*>(basicShape); + RefPtr<CSSDeprecatedBasicShapeCircle> circleValue = CSSDeprecatedBasicShapeCircle::create(); - circleValue->setCenterX(valueForCenterCoordinate(cssValuePool, style, circle.centerX(), HORIZONTAL)); - circleValue->setCenterY(valueForCenterCoordinate(cssValuePool, style, circle.centerY(), VERTICAL)); - circleValue->setRadius(basicShapeRadiusToCSSValue(style, cssValuePool, circle.radius())); + circleValue->setCenterX(pool.createValue(circle->centerX(), style)); + circleValue->setCenterY(pool.createValue(circle->centerY(), style)); + circleValue->setRadius(pool.createValue(circle->radius(), style)); - basicShapeValue = WTFMove(circleValue); + basicShapeValue = circleValue.release(); break; } - case BasicShape::BasicShapeEllipseType: { - auto& ellipse = downcast<BasicShapeEllipse>(basicShape); - auto ellipseValue = CSSBasicShapeEllipse::create(); + case BasicShape::BasicShapeCircleType: { + const BasicShapeCircle* circle = static_cast<const BasicShapeCircle*>(basicShape); + RefPtr<CSSBasicShapeCircle> circleValue = CSSBasicShapeCircle::create(); - ellipseValue->setCenterX(valueForCenterCoordinate(cssValuePool, style, ellipse.centerX(), HORIZONTAL)); - ellipseValue->setCenterY(valueForCenterCoordinate(cssValuePool, style, ellipse.centerY(), VERTICAL)); - ellipseValue->setRadiusX(basicShapeRadiusToCSSValue(style, cssValuePool, ellipse.radiusX())); - ellipseValue->setRadiusY(basicShapeRadiusToCSSValue(style, cssValuePool, ellipse.radiusY())); + circleValue->setCenterX(valueForCenterCoordinate(pool, style, circle->centerX(), HORIZONTAL)); + circleValue->setCenterY(valueForCenterCoordinate(pool, style, circle->centerY(), VERTICAL)); + circleValue->setRadius(basicShapeRadiusToCSSValue(style, pool, circle->radius())); + basicShapeValue = circleValue.release(); + break; + } + case BasicShape::DeprecatedBasicShapeEllipseType: { + const DeprecatedBasicShapeEllipse* ellipse = static_cast<const DeprecatedBasicShapeEllipse*>(basicShape); + RefPtr<CSSDeprecatedBasicShapeEllipse> ellipseValue = CSSDeprecatedBasicShapeEllipse::create(); + + ellipseValue->setCenterX(pool.createValue(ellipse->centerX(), style)); + ellipseValue->setCenterY(pool.createValue(ellipse->centerY(), style)); + ellipseValue->setRadiusX(pool.createValue(ellipse->radiusX(), style)); + ellipseValue->setRadiusY(pool.createValue(ellipse->radiusY(), style)); - basicShapeValue = WTFMove(ellipseValue); + basicShapeValue = ellipseValue.release(); + break; + } + case BasicShape::BasicShapeEllipseType: { + const BasicShapeEllipse* ellipse = static_cast<const BasicShapeEllipse*>(basicShape); + RefPtr<CSSBasicShapeEllipse> ellipseValue = CSSBasicShapeEllipse::create(); + + ellipseValue->setCenterX(valueForCenterCoordinate(pool, style, ellipse->centerX(), HORIZONTAL)); + ellipseValue->setCenterY(valueForCenterCoordinate(pool, style, ellipse->centerY(), VERTICAL)); + ellipseValue->setRadiusX(basicShapeRadiusToCSSValue(style, pool, ellipse->radiusX())); + ellipseValue->setRadiusY(basicShapeRadiusToCSSValue(style, pool, ellipse->radiusY())); + basicShapeValue = ellipseValue.release(); break; } case BasicShape::BasicShapePolygonType: { - auto& polygon = downcast<BasicShapePolygon>(basicShape); - auto polygonValue = CSSBasicShapePolygon::create(); + const BasicShapePolygon* polygon = static_cast<const BasicShapePolygon*>(basicShape); + RefPtr<CSSBasicShapePolygon> polygonValue = CSSBasicShapePolygon::create(); - polygonValue->setWindRule(polygon.windRule()); - const Vector<Length>& values = polygon.values(); + polygonValue->setWindRule(polygon->windRule()); + const Vector<Length>& values = polygon->values(); for (unsigned i = 0; i < values.size(); i += 2) - polygonValue->appendPoint(cssValuePool.createValue(values.at(i), style), cssValuePool.createValue(values.at(i + 1), style)); + polygonValue->appendPoint(pool.createValue(values.at(i), style), pool.createValue(values.at(i + 1), style)); - basicShapeValue = WTFMove(polygonValue); + basicShapeValue = polygonValue.release(); break; } - case BasicShape::BasicShapePathType: { - auto& pathShape = downcast<BasicShapePath>(basicShape); - auto pathShapeValue = CSSBasicShapePath::create(pathShape.pathData()->copy()); - pathShapeValue->setWindRule(pathShape.windRule()); - - basicShapeValue = WTFMove(pathShapeValue); + case BasicShape::BasicShapeInsetRectangleType: { + const BasicShapeInsetRectangle* rectangle = static_cast<const BasicShapeInsetRectangle*>(basicShape); + RefPtr<CSSBasicShapeInsetRectangle> rectangleValue = CSSBasicShapeInsetRectangle::create(); + + rectangleValue->setTop(pool.createValue(rectangle->top(), style)); + rectangleValue->setRight(pool.createValue(rectangle->right(), style)); + rectangleValue->setBottom(pool.createValue(rectangle->bottom(), style)); + rectangleValue->setLeft(pool.createValue(rectangle->left(), style)); + rectangleValue->setRadiusX(pool.createValue(rectangle->cornerRadiusX(), style)); + rectangleValue->setRadiusY(pool.createValue(rectangle->cornerRadiusY(), style)); + + basicShapeValue = rectangleValue.release(); break; } case BasicShape::BasicShapeInsetType: { - auto& inset = downcast<BasicShapeInset>(basicShape); - auto insetValue = CSSBasicShapeInset::create(); + const BasicShapeInset* inset = static_cast<const BasicShapeInset*>(basicShape); + RefPtr<CSSBasicShapeInset> insetValue = CSSBasicShapeInset::create(); - insetValue->setTop(cssValuePool.createValue(inset.top(), style)); - insetValue->setRight(cssValuePool.createValue(inset.right(), style)); - insetValue->setBottom(cssValuePool.createValue(inset.bottom(), style)); - insetValue->setLeft(cssValuePool.createValue(inset.left(), style)); + insetValue->setTop(pool.createValue(inset->top())); + insetValue->setRight(pool.createValue(inset->right())); + insetValue->setBottom(pool.createValue(inset->bottom())); + insetValue->setLeft(pool.createValue(inset->left())); - insetValue->setTopLeftRadius(cssValuePool.createValue(inset.topLeftRadius(), style)); - insetValue->setTopRightRadius(cssValuePool.createValue(inset.topRightRadius(), style)); - insetValue->setBottomRightRadius(cssValuePool.createValue(inset.bottomRightRadius(), style)); - insetValue->setBottomLeftRadius(cssValuePool.createValue(inset.bottomLeftRadius(), style)); + insetValue->setTopLeftRadius(pool.createValue(inset->topLeftRadius())); + insetValue->setTopRightRadius(pool.createValue(inset->topRightRadius())); + insetValue->setBottomRightRadius(pool.createValue(inset->bottomRightRadius())); + insetValue->setBottomLeftRadius(pool.createValue(inset->bottomLeftRadius())); - basicShapeValue = WTFMove(insetValue); + basicShapeValue = insetValue.release(); break; } + default: + break; } - return cssValuePool.createValue(basicShapeValue.releaseNonNull()); -} + if (basicShape->layoutBox() != BoxMissing) + basicShapeValue->setLayoutBox(pool.createValue(basicShape->layoutBox())); -static Length convertToLength(const CSSToLengthConversionData& conversionData, CSSPrimitiveValue* value) -{ - return value->convertToLength<FixedIntegerConversion | FixedFloatConversion | PercentConversion | CalculatedConversion>(conversionData); + return pool.createValue(basicShapeValue.release()); } -static LengthSize convertToLengthSize(const CSSToLengthConversionData& conversionData, CSSPrimitiveValue* value) +static Length convertToLength(const RenderStyle* style, const RenderStyle* rootStyle, CSSPrimitiveValue* value) { - if (!value) - return LengthSize(Length(0, Fixed), Length(0, Fixed)); - - Pair* pair = value->getPairValue(); - return LengthSize(convertToLength(conversionData, pair->first()), convertToLength(conversionData, pair->second())); + return value->convertToLength<FixedIntegerConversion | FixedFloatConversion | PercentConversion | CalculatedConversion | ViewportPercentageConversion>(style, rootStyle, style->effectiveZoom()); } -static BasicShapeCenterCoordinate convertToCenterCoordinate(const CSSToLengthConversionData& conversionData, CSSPrimitiveValue* value) +static BasicShapeCenterCoordinate convertToCenterCoordinate(const RenderStyle* style, const RenderStyle* rootStyle, CSSPrimitiveValue* value) { BasicShapeCenterCoordinate::Direction direction; Length offset = Length(0, Fixed); @@ -162,9 +198,9 @@ static BasicShapeCenterCoordinate convertToCenterCoordinate(const CSSToLengthCon keyword = value->getValueID(); else if (Pair* pair = value->getPairValue()) { keyword = pair->first()->getValueID(); - offset = convertToLength(conversionData, pair->second()); + offset = convertToLength(style, rootStyle, pair->second()); } else - offset = convertToLength(conversionData, value); + offset = convertToLength(style, rootStyle, value); switch (keyword) { case CSSValueTop: @@ -188,7 +224,7 @@ static BasicShapeCenterCoordinate convertToCenterCoordinate(const CSSToLengthCon return BasicShapeCenterCoordinate(direction, offset); } -static BasicShapeRadius cssValueToBasicShapeRadius(const CSSToLengthConversionData& conversionData, PassRefPtr<CSSPrimitiveValue> radius) +static BasicShapeRadius cssValueToBasicShapeRadius(const RenderStyle* style, const RenderStyle* rootStyle, PassRefPtr<CSSPrimitiveValue> radius) { if (!radius) return BasicShapeRadius(BasicShapeRadius::ClosestSide); @@ -205,78 +241,177 @@ static BasicShapeRadius cssValueToBasicShapeRadius(const CSSToLengthConversionDa } } - return BasicShapeRadius(convertToLength(conversionData, radius.get())); + return BasicShapeRadius(convertToLength(style, rootStyle, radius.get())); } -Ref<BasicShape> basicShapeForValue(const CSSToLengthConversionData& conversionData, const CSSBasicShape* basicShapeValue) +PassRefPtr<BasicShape> basicShapeForValue(const RenderStyle* style, const RenderStyle* rootStyle, const CSSBasicShape* basicShapeValue) { RefPtr<BasicShape> basicShape; switch (basicShapeValue->type()) { + case CSSBasicShape::CSSBasicShapeRectangleType: { + const CSSBasicShapeRectangle* rectValue = static_cast<const CSSBasicShapeRectangle *>(basicShapeValue); + RefPtr<BasicShapeRectangle> rect = BasicShapeRectangle::create(); + + rect->setX(convertToLength(style, rootStyle, rectValue->x())); + rect->setY(convertToLength(style, rootStyle, rectValue->y())); + rect->setWidth(convertToLength(style, rootStyle, rectValue->width())); + rect->setHeight(convertToLength(style, rootStyle, rectValue->height())); + if (rectValue->radiusX()) { + Length radiusX = convertToLength(style, rootStyle, rectValue->radiusX()); + rect->setCornerRadiusX(radiusX); + if (rectValue->radiusY()) + rect->setCornerRadiusY(convertToLength(style, rootStyle, rectValue->radiusY())); + else + rect->setCornerRadiusY(radiusX); + } else { + rect->setCornerRadiusX(Length(0, Fixed)); + rect->setCornerRadiusY(Length(0, Fixed)); + } + basicShape = rect.release(); + break; + } + case CSSBasicShape::CSSDeprecatedBasicShapeCircleType: { + const CSSDeprecatedBasicShapeCircle* circleValue = static_cast<const CSSDeprecatedBasicShapeCircle *>(basicShapeValue); + RefPtr<DeprecatedBasicShapeCircle> circle = DeprecatedBasicShapeCircle::create(); + + circle->setCenterX(convertToLength(style, rootStyle, circleValue->centerX())); + circle->setCenterY(convertToLength(style, rootStyle, circleValue->centerY())); + circle->setRadius(convertToLength(style, rootStyle, circleValue->radius())); + + basicShape = circle.release(); + break; + } case CSSBasicShape::CSSBasicShapeCircleType: { - auto& circleValue = downcast<CSSBasicShapeCircle>(*basicShapeValue); - auto circle = BasicShapeCircle::create(); + const CSSBasicShapeCircle* circleValue = static_cast<const CSSBasicShapeCircle *>(basicShapeValue); + RefPtr<BasicShapeCircle> circle = BasicShapeCircle::create(); - circle->setCenterX(convertToCenterCoordinate(conversionData, circleValue.centerX())); - circle->setCenterY(convertToCenterCoordinate(conversionData, circleValue.centerY())); - circle->setRadius(cssValueToBasicShapeRadius(conversionData, circleValue.radius())); + circle->setCenterX(convertToCenterCoordinate(style, rootStyle, circleValue->centerX())); + circle->setCenterY(convertToCenterCoordinate(style, rootStyle, circleValue->centerY())); + circle->setRadius(cssValueToBasicShapeRadius(style, rootStyle, circleValue->radius())); - basicShape = WTFMove(circle); + basicShape = circle.release(); + break; + } + case CSSBasicShape::CSSDeprecatedBasicShapeEllipseType: { + const CSSDeprecatedBasicShapeEllipse* ellipseValue = static_cast<const CSSDeprecatedBasicShapeEllipse *>(basicShapeValue); + RefPtr<DeprecatedBasicShapeEllipse> ellipse = DeprecatedBasicShapeEllipse::create(); + + ellipse->setCenterX(convertToLength(style, rootStyle, ellipseValue->centerX())); + ellipse->setCenterY(convertToLength(style, rootStyle, ellipseValue->centerY())); + ellipse->setRadiusX(convertToLength(style, rootStyle, ellipseValue->radiusX())); + ellipse->setRadiusY(convertToLength(style, rootStyle, ellipseValue->radiusY())); + + basicShape = ellipse.release(); break; } case CSSBasicShape::CSSBasicShapeEllipseType: { - auto& ellipseValue = downcast<CSSBasicShapeEllipse>(*basicShapeValue); - auto ellipse = BasicShapeEllipse::create(); + const CSSBasicShapeEllipse* ellipseValue = static_cast<const CSSBasicShapeEllipse *>(basicShapeValue); + RefPtr<BasicShapeEllipse> ellipse = BasicShapeEllipse::create(); - ellipse->setCenterX(convertToCenterCoordinate(conversionData, ellipseValue.centerX())); - ellipse->setCenterY(convertToCenterCoordinate(conversionData, ellipseValue.centerY())); + ellipse->setCenterX(convertToCenterCoordinate(style, rootStyle, ellipseValue->centerX())); + ellipse->setCenterY(convertToCenterCoordinate(style, rootStyle, ellipseValue->centerY())); - ellipse->setRadiusX(cssValueToBasicShapeRadius(conversionData, ellipseValue.radiusX())); - ellipse->setRadiusY(cssValueToBasicShapeRadius(conversionData, ellipseValue.radiusY())); + ellipse->setRadiusX(cssValueToBasicShapeRadius(style, rootStyle, ellipseValue->radiusX())); + ellipse->setRadiusY(cssValueToBasicShapeRadius(style, rootStyle, ellipseValue->radiusY())); - basicShape = WTFMove(ellipse); + basicShape = ellipse.release(); break; } case CSSBasicShape::CSSBasicShapePolygonType: { - auto& polygonValue = downcast<CSSBasicShapePolygon>(*basicShapeValue); - auto polygon = BasicShapePolygon::create(); + const CSSBasicShapePolygon* polygonValue = static_cast<const CSSBasicShapePolygon *>(basicShapeValue); + RefPtr<BasicShapePolygon> polygon = BasicShapePolygon::create(); - polygon->setWindRule(polygonValue.windRule()); - const Vector<RefPtr<CSSPrimitiveValue>>& values = polygonValue.values(); + polygon->setWindRule(polygonValue->windRule()); + const Vector<RefPtr<CSSPrimitiveValue>>& values = polygonValue->values(); for (unsigned i = 0; i < values.size(); i += 2) - polygon->appendPoint(convertToLength(conversionData, values.at(i).get()), convertToLength(conversionData, values.at(i + 1).get())); + polygon->appendPoint(convertToLength(style, rootStyle, values.at(i).get()), convertToLength(style, rootStyle, values.at(i + 1).get())); - basicShape = WTFMove(polygon); + basicShape = polygon.release(); break; } - case CSSBasicShape::CSSBasicShapeInsetType: { - auto& rectValue = downcast<CSSBasicShapeInset>(*basicShapeValue); - auto rect = BasicShapeInset::create(); - - rect->setTop(convertToLength(conversionData, rectValue.top())); - rect->setRight(convertToLength(conversionData, rectValue.right())); - rect->setBottom(convertToLength(conversionData, rectValue.bottom())); - rect->setLeft(convertToLength(conversionData, rectValue.left())); - - rect->setTopLeftRadius(convertToLengthSize(conversionData, rectValue.topLeftRadius())); - rect->setTopRightRadius(convertToLengthSize(conversionData, rectValue.topRightRadius())); - rect->setBottomRightRadius(convertToLengthSize(conversionData, rectValue.bottomRightRadius())); - rect->setBottomLeftRadius(convertToLengthSize(conversionData, rectValue.bottomLeftRadius())); - - basicShape = WTFMove(rect); + case CSSBasicShape::CSSBasicShapeInsetRectangleType: { + const CSSBasicShapeInsetRectangle* rectValue = static_cast<const CSSBasicShapeInsetRectangle *>(basicShapeValue); + RefPtr<BasicShapeInsetRectangle> rect = BasicShapeInsetRectangle::create(); + + rect->setTop(convertToLength(style, rootStyle, rectValue->top())); + rect->setRight(convertToLength(style, rootStyle, rectValue->right())); + rect->setBottom(convertToLength(style, rootStyle, rectValue->bottom())); + rect->setLeft(convertToLength(style, rootStyle, rectValue->left())); + if (rectValue->radiusX()) { + Length radiusX = convertToLength(style, rootStyle, rectValue->radiusX()); + rect->setCornerRadiusX(radiusX); + if (rectValue->radiusY()) + rect->setCornerRadiusY(convertToLength(style, rootStyle, rectValue->radiusY())); + else + rect->setCornerRadiusY(radiusX); + } else { + rect->setCornerRadiusX(Length(0, Fixed)); + rect->setCornerRadiusY(Length(0, Fixed)); + } + basicShape = rect.release(); break; } - case CSSBasicShape::CSSBasicShapePathType: { - auto& pathValue = downcast<CSSBasicShapePath>(*basicShapeValue); - auto path = BasicShapePath::create(pathValue.pathData().copy()); - path->setWindRule(pathValue.windRule()); - - basicShape = WTFMove(path); + case CSSBasicShape::CSSBasicShapeInsetType: { + const CSSBasicShapeInset* rectValue = static_cast<const CSSBasicShapeInset* >(basicShapeValue); + RefPtr<BasicShapeInset> rect = BasicShapeInset::create(); + + if (rectValue->top()) + rect->setTop(convertToLength(style, rootStyle, rectValue->top())); + else { + rect->setTop(Length(0, Fixed)); + return rect; + } + if (rectValue->right()) + rect->setRight(convertToLength(style, rootStyle, rectValue->right())); + else + rect->setRight(Length(0, Fixed)); + + if (rectValue->bottom()) + rect->setBottom(convertToLength(style, rootStyle, rectValue->bottom())); + else + rect->setBottom(Length(0, Fixed)); + + if (rectValue->left()) + rect->setLeft(convertToLength(style, rootStyle, rectValue->left())); + else + rect->setLeft(Length(0, Fixed)); + + if (rectValue->topLeftRadius()) { + Pair* topLeftRadius = rectValue->topLeftRadius()->getPairValue(); + rect->setTopLeftRadius(LengthSize(convertToLength(style, rootStyle, topLeftRadius->first()), convertToLength(style, rootStyle, topLeftRadius->second()))); + } else + rect->setTopLeftRadius(LengthSize(Length(0, Fixed), Length(0, Fixed))); + + if (rectValue->topRightRadius()) { + Pair* topRightRadius = rectValue->topRightRadius()->getPairValue(); + rect->setTopRightRadius(LengthSize(convertToLength(style, rootStyle, topRightRadius->first()), convertToLength(style, rootStyle, topRightRadius->second()))); + } else + rect->setTopRightRadius(LengthSize(Length(0, Fixed), Length(0, Fixed))); + + if (rectValue->bottomRightRadius()) { + Pair* bottomRightRadius = rectValue->bottomRightRadius()->getPairValue(); + rect->setBottomRightRadius(LengthSize(convertToLength(style, rootStyle, bottomRightRadius->first()), convertToLength(style, rootStyle, bottomRightRadius->second()))); + } else + rect->setBottomRightRadius(LengthSize(Length(0, Fixed), Length(0, Fixed))); + + if (rectValue->topLeftRadius()) { + Pair* bottomLeftRadius = rectValue->bottomLeftRadius()->getPairValue(); + rect->setBottomLeftRadius(LengthSize(convertToLength(style, rootStyle, bottomLeftRadius->first()), convertToLength(style, rootStyle, bottomLeftRadius->second()))); + } else + rect->setBottomLeftRadius(LengthSize(Length(0, Fixed), Length(0, Fixed))); + + basicShape = rect.release(); break; } + default: + break; } - return basicShape.releaseNonNull(); + if (basicShapeValue->layoutBox()) + basicShape->setLayoutBox(LayoutBox(*basicShapeValue->layoutBox())); + + return basicShape.release(); } float floatValueForCenterCoordinate(const BasicShapeCenterCoordinate& center, float boxDimension) |