mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-09 06:04:03 +00:00
renderer: Rectified the paint transforms.
This corrects the return value to Result::InsufficientCondition when a custom transform is applied. Additionally, unnecessary x and y member fields have been removed.
This commit is contained in:
parent
4bd42ec7b1
commit
e12a244b9e
7 changed files with 54 additions and 29 deletions
|
@ -281,6 +281,9 @@ public:
|
||||||
* The rotational axis passes through the point on the object with zero coordinates.
|
* The rotational axis passes through the point on the object with zero coordinates.
|
||||||
*
|
*
|
||||||
* @param[in] degree The value of the angle in degrees.
|
* @param[in] degree The value of the angle in degrees.
|
||||||
|
*
|
||||||
|
* @retval Result::InsufficientCondition in case a custom transform is applied.
|
||||||
|
* @see Paint::transform()
|
||||||
*/
|
*/
|
||||||
Result rotate(float degree) noexcept;
|
Result rotate(float degree) noexcept;
|
||||||
|
|
||||||
|
@ -288,6 +291,9 @@ public:
|
||||||
* @brief Sets the scale value of the object.
|
* @brief Sets the scale value of the object.
|
||||||
*
|
*
|
||||||
* @param[in] factor The value of the scaling factor. The default value is 1.
|
* @param[in] factor The value of the scaling factor. The default value is 1.
|
||||||
|
*
|
||||||
|
* @retval Result::InsufficientCondition in case a custom transform is applied.
|
||||||
|
* @see Paint::transform()
|
||||||
*/
|
*/
|
||||||
Result scale(float factor) noexcept;
|
Result scale(float factor) noexcept;
|
||||||
|
|
||||||
|
@ -299,6 +305,9 @@ public:
|
||||||
*
|
*
|
||||||
* @param[in] x The value of the horizontal shift.
|
* @param[in] x The value of the horizontal shift.
|
||||||
* @param[in] y The value of the vertical shift.
|
* @param[in] y The value of the vertical shift.
|
||||||
|
*
|
||||||
|
* @retval Result::InsufficientCondition in case a custom transform is applied.
|
||||||
|
* @see Paint::transform()
|
||||||
*/
|
*/
|
||||||
Result translate(float x, float y) noexcept;
|
Result translate(float x, float y) noexcept;
|
||||||
|
|
||||||
|
|
|
@ -801,6 +801,9 @@ TVG_API Tvg_Result tvg_paint_del(Tvg_Paint* paint);
|
||||||
*
|
*
|
||||||
* \return Tvg_Result enumeration.
|
* \return Tvg_Result enumeration.
|
||||||
* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer.
|
* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer.
|
||||||
|
* \retval TVG_RESULT_INSUFFICIENT_CONDITION in case a custom transform is applied.
|
||||||
|
*
|
||||||
|
* \see tvg_paint_set_transform()
|
||||||
*/
|
*/
|
||||||
TVG_API Tvg_Result tvg_paint_scale(Tvg_Paint* paint, float factor);
|
TVG_API Tvg_Result tvg_paint_scale(Tvg_Paint* paint, float factor);
|
||||||
|
|
||||||
|
@ -816,6 +819,9 @@ TVG_API Tvg_Result tvg_paint_scale(Tvg_Paint* paint, float factor);
|
||||||
*
|
*
|
||||||
* \return Tvg_Result enumeration.
|
* \return Tvg_Result enumeration.
|
||||||
* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer.
|
* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer.
|
||||||
|
* \retval TVG_RESULT_INSUFFICIENT_CONDITION in case a custom transform is applied.
|
||||||
|
*
|
||||||
|
* \see tvg_paint_set_transform()
|
||||||
*/
|
*/
|
||||||
TVG_API Tvg_Result tvg_paint_rotate(Tvg_Paint* paint, float degree);
|
TVG_API Tvg_Result tvg_paint_rotate(Tvg_Paint* paint, float degree);
|
||||||
|
|
||||||
|
@ -832,6 +838,9 @@ TVG_API Tvg_Result tvg_paint_rotate(Tvg_Paint* paint, float degree);
|
||||||
*
|
*
|
||||||
* \return Tvg_Result enumeration.
|
* \return Tvg_Result enumeration.
|
||||||
* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer.
|
* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer.
|
||||||
|
* \retval TVG_RESULT_INSUFFICIENT_CONDITION in case a custom transform is applied.
|
||||||
|
*
|
||||||
|
* \see tvg_paint_set_transform()
|
||||||
*/
|
*/
|
||||||
TVG_API Tvg_Result tvg_paint_translate(Tvg_Paint* paint, float x, float y);
|
TVG_API Tvg_Result tvg_paint_translate(Tvg_Paint* paint, float x, float y);
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ static Result _compFastTrack(RenderMethod* renderer, Paint* cmpTarget, const Ren
|
||||||
|
|
||||||
if (ptsCnt != 4) return Result::InsufficientCondition;
|
if (ptsCnt != 4) return Result::InsufficientCondition;
|
||||||
|
|
||||||
if (rTransform) rTransform->update();
|
if (rTransform && (cmpTarget->pImpl->renderFlag & RenderUpdateFlag::Transform)) rTransform->update();
|
||||||
|
|
||||||
//No rotation and no skewing, still can try out clipping the rect region.
|
//No rotation and no skewing, still can try out clipping the rect region.
|
||||||
auto tryClip = false;
|
auto tryClip = false;
|
||||||
|
@ -181,13 +181,14 @@ Paint* Paint::Impl::duplicate()
|
||||||
bool Paint::Impl::rotate(float degree)
|
bool Paint::Impl::rotate(float degree)
|
||||||
{
|
{
|
||||||
if (rTransform) {
|
if (rTransform) {
|
||||||
|
if (rTransform->overriding) return false;
|
||||||
if (mathEqual(degree, rTransform->degree)) return true;
|
if (mathEqual(degree, rTransform->degree)) return true;
|
||||||
} else {
|
} else {
|
||||||
if (mathZero(degree)) return true;
|
if (mathZero(degree)) return true;
|
||||||
rTransform = new RenderTransform();
|
rTransform = new RenderTransform();
|
||||||
}
|
}
|
||||||
rTransform->degree = degree;
|
rTransform->degree = degree;
|
||||||
if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform;
|
renderFlag |= RenderUpdateFlag::Transform;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -196,13 +197,14 @@ bool Paint::Impl::rotate(float degree)
|
||||||
bool Paint::Impl::scale(float factor)
|
bool Paint::Impl::scale(float factor)
|
||||||
{
|
{
|
||||||
if (rTransform) {
|
if (rTransform) {
|
||||||
|
if (rTransform->overriding) return false;
|
||||||
if (mathEqual(factor, rTransform->scale)) return true;
|
if (mathEqual(factor, rTransform->scale)) return true;
|
||||||
} else {
|
} else {
|
||||||
if (mathEqual(factor, 1.0f)) return true;
|
if (mathEqual(factor, 1.0f)) return true;
|
||||||
rTransform = new RenderTransform();
|
rTransform = new RenderTransform();
|
||||||
}
|
}
|
||||||
rTransform->scale = factor;
|
rTransform->scale = factor;
|
||||||
if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform;
|
renderFlag |= RenderUpdateFlag::Transform;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -211,14 +213,15 @@ bool Paint::Impl::scale(float factor)
|
||||||
bool Paint::Impl::translate(float x, float y)
|
bool Paint::Impl::translate(float x, float y)
|
||||||
{
|
{
|
||||||
if (rTransform) {
|
if (rTransform) {
|
||||||
if (mathEqual(x, rTransform->x) && mathEqual(y, rTransform->y)) return true;
|
if (rTransform->overriding) return false;
|
||||||
|
if (mathEqual(x, rTransform->m.e13) && mathEqual(y, rTransform->m.e23)) return true;
|
||||||
} else {
|
} else {
|
||||||
if (mathZero(x) && mathZero(y)) return true;
|
if (mathZero(x) && mathZero(y)) return true;
|
||||||
rTransform = new RenderTransform();
|
rTransform = new RenderTransform();
|
||||||
}
|
}
|
||||||
rTransform->x = x;
|
rTransform->m.e13 = x;
|
||||||
rTransform->y = y;
|
rTransform->m.e23 = y;
|
||||||
if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform;
|
renderFlag |= RenderUpdateFlag::Transform;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -263,10 +266,7 @@ RenderData Paint::Impl::update(RenderMethod* renderer, const RenderTransform* pT
|
||||||
this->renderer = renderer;
|
this->renderer = renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (renderFlag & RenderUpdateFlag::Transform) {
|
if (renderFlag & RenderUpdateFlag::Transform) rTransform->update();
|
||||||
if (!rTransform) return nullptr;
|
|
||||||
rTransform->update();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 1. Composition Pre Processing */
|
/* 1. Composition Pre Processing */
|
||||||
RenderData trd = nullptr; //composite target render data
|
RenderData trd = nullptr; //composite target render data
|
||||||
|
@ -390,28 +390,28 @@ Paint :: ~Paint()
|
||||||
Result Paint::rotate(float degree) noexcept
|
Result Paint::rotate(float degree) noexcept
|
||||||
{
|
{
|
||||||
if (pImpl->rotate(degree)) return Result::Success;
|
if (pImpl->rotate(degree)) return Result::Success;
|
||||||
return Result::FailedAllocation;
|
return Result::InsufficientCondition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Result Paint::scale(float factor) noexcept
|
Result Paint::scale(float factor) noexcept
|
||||||
{
|
{
|
||||||
if (pImpl->scale(factor)) return Result::Success;
|
if (pImpl->scale(factor)) return Result::Success;
|
||||||
return Result::FailedAllocation;
|
return Result::InsufficientCondition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Result Paint::translate(float x, float y) noexcept
|
Result Paint::translate(float x, float y) noexcept
|
||||||
{
|
{
|
||||||
if (pImpl->translate(x, y)) return Result::Success;
|
if (pImpl->translate(x, y)) return Result::Success;
|
||||||
return Result::FailedAllocation;
|
return Result::InsufficientCondition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Result Paint::transform(const Matrix& m) noexcept
|
Result Paint::transform(const Matrix& m) noexcept
|
||||||
{
|
{
|
||||||
if (pImpl->transform(m)) return Result::Success;
|
if (pImpl->transform(m)) return Result::Success;
|
||||||
return Result::FailedAllocation;
|
return Result::InsufficientCondition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,6 @@ namespace tvg
|
||||||
if (!rTransform) {
|
if (!rTransform) {
|
||||||
if (mathIdentity(&m)) return true;
|
if (mathIdentity(&m)) return true;
|
||||||
rTransform = new RenderTransform();
|
rTransform = new RenderTransform();
|
||||||
if (!rTransform) return false;
|
|
||||||
}
|
}
|
||||||
rTransform->override(m);
|
rTransform->override(m);
|
||||||
renderFlag |= RenderUpdateFlag::Transform;
|
renderFlag |= RenderUpdateFlag::Transform;
|
||||||
|
@ -98,7 +97,7 @@ namespace tvg
|
||||||
Matrix* transform()
|
Matrix* transform()
|
||||||
{
|
{
|
||||||
if (rTransform) {
|
if (rTransform) {
|
||||||
rTransform->update();
|
if (renderFlag & RenderUpdateFlag::Transform) rTransform->update();
|
||||||
return &rTransform->m;
|
return &rTransform->m;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -43,13 +43,18 @@ void RenderTransform::update()
|
||||||
{
|
{
|
||||||
if (overriding) return;
|
if (overriding) return;
|
||||||
|
|
||||||
mathIdentity(&m);
|
m.e11 = 1.0f;
|
||||||
|
m.e12 = 0.0f;
|
||||||
|
|
||||||
|
m.e21 = 0.0f;
|
||||||
|
m.e22 = 1.0f;
|
||||||
|
|
||||||
|
m.e31 = 0.0f;
|
||||||
|
m.e32 = 0.0f;
|
||||||
|
m.e33 = 1.0f;
|
||||||
|
|
||||||
mathScale(&m, scale, scale);
|
mathScale(&m, scale, scale);
|
||||||
|
|
||||||
mathRotate(&m, degree);
|
mathRotate(&m, degree);
|
||||||
|
|
||||||
mathTranslate(&m, x, y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -112,9 +112,7 @@ struct RenderRegion
|
||||||
|
|
||||||
struct RenderTransform
|
struct RenderTransform
|
||||||
{
|
{
|
||||||
Matrix m; //3x3 Matrix Elements
|
Matrix m;
|
||||||
float x = 0.0f;
|
|
||||||
float y = 0.0f;
|
|
||||||
float degree = 0.0f; //rotation degree
|
float degree = 0.0f; //rotation degree
|
||||||
float scale = 1.0f; //scale factor
|
float scale = 1.0f; //scale factor
|
||||||
bool overriding = false; //user transform?
|
bool overriding = false; //user transform?
|
||||||
|
@ -122,7 +120,11 @@ struct RenderTransform
|
||||||
void update();
|
void update();
|
||||||
void override(const Matrix& m);
|
void override(const Matrix& m);
|
||||||
|
|
||||||
RenderTransform() {}
|
RenderTransform()
|
||||||
|
{
|
||||||
|
m.e13 = m.e23 = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
RenderTransform(const RenderTransform* lhs, const RenderTransform* rhs);
|
RenderTransform(const RenderTransform* lhs, const RenderTransform* rhs);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -59,11 +59,12 @@ TEST_CASE("Custom Transformation", "[tvgPaint]")
|
||||||
REQUIRE(m2.e32 == Approx(m3.e32).margin(0.000001));
|
REQUIRE(m2.e32 == Approx(m3.e32).margin(0.000001));
|
||||||
REQUIRE(m2.e33 == Approx(m3.e33).margin(0.000001));
|
REQUIRE(m2.e33 == Approx(m3.e33).margin(0.000001));
|
||||||
|
|
||||||
//Verify Transform is not modified
|
//It's not allowed if the custom transform is applied.
|
||||||
REQUIRE(shape->translate(155.0f, -155.0f) == Result::Success);
|
REQUIRE(shape->translate(155.0f, -155.0f) == Result::InsufficientCondition);
|
||||||
REQUIRE(shape->scale(4.7f) == Result::Success);
|
REQUIRE(shape->scale(4.7f) == Result::InsufficientCondition);
|
||||||
REQUIRE(shape->rotate(45.0f) == Result::Success);
|
REQUIRE(shape->rotate(45.0f) == Result::InsufficientCondition);
|
||||||
|
|
||||||
|
//Verify Transform is not modified
|
||||||
auto m4 = shape->transform();
|
auto m4 = shape->transform();
|
||||||
REQUIRE(m2.e11 == Approx(m4.e11).margin(0.000001));
|
REQUIRE(m2.e11 == Approx(m4.e11).margin(0.000001));
|
||||||
REQUIRE(m2.e12 == Approx(m4.e12).margin(0.000001));
|
REQUIRE(m2.e12 == Approx(m4.e12).margin(0.000001));
|
||||||
|
|
Loading…
Add table
Reference in a new issue