From ee1522a446752c391e78ea4f32bae9fea679bad4 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 3 Dec 2020 18:26:21 +0900 Subject: [PATCH] sw_engine math: fix regression bug. There is 1 pixel misaligned issue observed. Found out transform() increases 0.5 pt always. This transform() logic was broken by this change - e00f94870510636789dce3702ab651b82b8047ee and now recorvered to origin. --- src/lib/sw_engine/tvgSwCommon.h | 11 +---------- src/lib/sw_engine/tvgSwMath.cpp | 14 +++++++++++++- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/lib/sw_engine/tvgSwCommon.h b/src/lib/sw_engine/tvgSwCommon.h index 168a31f9..6f26e8c4 100644 --- a/src/lib/sw_engine/tvgSwCommon.h +++ b/src/lib/sw_engine/tvgSwCommon.h @@ -273,6 +273,7 @@ SwFixed mathDiff(SwFixed angle1, SwFixed angle2); SwFixed mathLength(SwPoint& pt); bool mathSmallCubic(SwPoint* base, SwFixed& angleIn, SwFixed& angleMid, SwFixed& angleOut); SwFixed mathMean(SwFixed angle1, SwFixed angle2); +SwPoint mathTransform(const Point* to, const Matrix* transform); void shapeReset(SwShape* shape); bool shapeGenOutline(SwShape* shape, const Shape* sdata, unsigned tid, const Matrix* transform); @@ -353,14 +354,4 @@ static inline void rasterRGBA32(uint32_t *dst, uint32_t val, uint32_t offset, in #endif } -static inline SwPoint mathTransform(const Point* to, const Matrix* transform) -{ - if (!transform) return {TO_SWCOORD(to->x), TO_SWCOORD(to->y)}; - - auto tx = ((to->x * transform->e11 + to->y * transform->e12 + transform->e13) + 0.5f); - auto ty = ((to->x * transform->e21 + to->y * transform->e22 + transform->e23) + 0.5f); - - return {TO_SWCOORD(tx), TO_SWCOORD(ty)}; -} - #endif /* _TVG_SW_COMMON_H_ */ diff --git a/src/lib/sw_engine/tvgSwMath.cpp b/src/lib/sw_engine/tvgSwMath.cpp index 56ce40fc..3ba1b868 100644 --- a/src/lib/sw_engine/tvgSwMath.cpp +++ b/src/lib/sw_engine/tvgSwMath.cpp @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ +#include #include "tvgSwCommon.h" @@ -414,4 +415,15 @@ SwFixed mathDiff(SwFixed angle1, SwFixed angle2) if (delta > SW_ANGLE_PI) delta -= SW_ANGLE_2PI; return delta; -} \ No newline at end of file +} + + +SwPoint mathTransform(const Point* to, const Matrix* transform) +{ + if (!transform) return {TO_SWCOORD(to->x), TO_SWCOORD(to->y)}; + + auto tx = round(to->x * transform->e11 + to->y * transform->e12 + transform->e13); + auto ty = round(to->x * transform->e21 + to->y * transform->e22 + transform->e23); + + return {TO_SWCOORD(tx), TO_SWCOORD(ty)}; +}