Changes to support MSVC

This commit is contained in:
Projectitis 2021-09-29 15:08:43 +13:00 committed by Hermet Park
parent e9be7ebf43
commit 591ea1d61c
5 changed files with 34 additions and 19 deletions

View file

@ -27,12 +27,15 @@
#endif #endif
#ifdef TVG_BUILD #ifdef TVG_BUILD
#define TVG_EXPORT __attribute__ ((visibility ("default"))) #ifdef _WIN32
#define TVG_EXPORT __declspec(dllexport)
#else
#define TVG_EXPORT __attribute__ ((visibility ("default")))
#endif
#else #else
#define TVG_EXPORT #define TVG_EXPORT
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif

View file

@ -20,6 +20,13 @@
* SOFTWARE. * SOFTWARE.
*/ */
#include <memory.h> #include <memory.h>
#ifdef _WIN32
#include <malloc.h>
#else
#include <alloca.h>
#endif
#include "tvgTvgCommon.h" #include "tvgTvgCommon.h"
@ -139,7 +146,7 @@ static bool _parseShapePath(const char *ptr, const char *end, Shape *shape)
if (ptr > end) return false; if (ptr > end) return false;
/* Recover to PathCommand(4 bytes) from TvgBinFlag(1 byte) */ /* Recover to PathCommand(4 bytes) from TvgBinFlag(1 byte) */
PathCommand inCmds[cmdCnt]; PathCommand* inCmds = (PathCommand*)alloca(sizeof(PathCommand) * cmdCnt);
for (uint32_t i = 0; i < cmdCnt; ++i) { for (uint32_t i = 0; i < cmdCnt; ++i) {
inCmds[i] = static_cast<PathCommand>(cmds[i]); inCmds[i] = static_cast<PathCommand>(cmds[i]);
} }
@ -206,7 +213,7 @@ static unique_ptr<Fill> _parseShapeFill(const char *ptr, const char *end)
if (block.length == 0 || block.length & 0x07) return nullptr; if (block.length == 0 || block.length & 0x07) return nullptr;
uint32_t stopsCnt = block.length >> 3; // 8 bytes per ColorStop uint32_t stopsCnt = block.length >> 3; // 8 bytes per ColorStop
if (stopsCnt > 1023) return nullptr; if (stopsCnt > 1023) return nullptr;
Fill::ColorStop stops[stopsCnt]; Fill::ColorStop* stops = (Fill::ColorStop*)alloca(sizeof(Fill::ColorStop) * stopsCnt);
auto p = block.data; auto p = block.data;
for (uint32_t i = 0; i < stopsCnt; i++, p += 8) { for (uint32_t i = 0; i < stopsCnt; i++, p += 8) {
READ_FLOAT(&stops[i].offset, p); READ_FLOAT(&stops[i].offset, p);

View file

@ -25,6 +25,12 @@
#include "tvgTvgSaver.h" #include "tvgTvgSaver.h"
#include "tvgLzw.h" #include "tvgLzw.h"
#ifdef _WIN32
#include <malloc.h>
#else
#include <alloca.h>
#endif
#define SIZE(A) sizeof(A) #define SIZE(A) sizeof(A)
/************************************************************************/ /************************************************************************/
@ -497,7 +503,7 @@ TvgBinCounter TvgSaver::serializePath(const Shape* shape, const Matrix* transfor
/* Reduce the binary size. /* Reduce the binary size.
Convert PathCommand(4 bytes) to TvgBinFlag(1 byte) */ Convert PathCommand(4 bytes) to TvgBinFlag(1 byte) */
TvgBinFlag outCmds[cmdCnt]; TvgBinFlag* outCmds = (TvgBinFlag*)alloca(SIZE(TvgBinFlag) * cmdCnt);
for (uint32_t i = 0; i < cmdCnt; ++i) { for (uint32_t i = 0; i < cmdCnt; ++i) {
outCmds[i] = static_cast<TvgBinFlag>(cmds[i]); outCmds[i] = static_cast<TvgBinFlag>(cmds[i]);
} }

View file

@ -78,8 +78,8 @@ TEST_CASE("Linear Gradient color stops", "[capiLinearGradient]")
Tvg_Color_Stop color_stops[2] = Tvg_Color_Stop color_stops[2] =
{ {
{.offset=0.0, .r=0, .g=0, .b=0, .a=255}, {0.0, 0, 0, 0, 255},
{.offset=1, .r=0, .g=255, .b=0, .a=255}, {1.0, 0, 255, 0, 255},
}; };
const Tvg_Color_Stop *color_stops_ret; const Tvg_Color_Stop *color_stops_ret;
@ -105,8 +105,8 @@ TEST_CASE("Linear Gradient clear data", "[capiLinearGradient]")
Tvg_Color_Stop color_stops[2] = Tvg_Color_Stop color_stops[2] =
{ {
{.offset=0.0, .r=0, .g=0, .b=0, .a=255}, {0.0, 0, 0, 0, 255},
{.offset=1, .r=0, .g=255, .b=0, .a=255}, {1.0, 0, 255, 0, 255},
}; };
const Tvg_Color_Stop *color_stops_ret = NULL; const Tvg_Color_Stop *color_stops_ret = NULL;
@ -150,8 +150,8 @@ TEST_CASE("Stroke Linear Gradient", "[capiLinearGradient]")
Tvg_Color_Stop color_stops[2] = Tvg_Color_Stop color_stops[2] =
{ {
{.offset=0.0, .r=0, .g=0, .b=0, .a=255}, {0.0, 0, 0, 0, 255},
{.offset=1, .r=0, .g=255, .b=0, .a=255}, {1.0, 0, 255, 0, 255},
}; };
Tvg_Gradient *gradient_ret = NULL; Tvg_Gradient *gradient_ret = NULL;

View file

@ -75,8 +75,8 @@ TEST_CASE("Set/Get color stops", "[capiRadialGradient]")
REQUIRE(gradient); REQUIRE(gradient);
Tvg_Color_Stop color_stops[2] = { Tvg_Color_Stop color_stops[2] = {
{.offset=0.0, .r=0, .g=0, .b=0, .a=255}, {0.0, 0, 0, 0, 255},
{.offset=1, .r=0, .g=255, .b=0, .a=255}, {1.0, 0, 255, 0, 255},
}; };
const Tvg_Color_Stop *color_stops_ret; const Tvg_Color_Stop *color_stops_ret;
@ -102,8 +102,8 @@ TEST_CASE("Clear gradient data", "[capiRadialGradient]")
REQUIRE(gradient); REQUIRE(gradient);
Tvg_Color_Stop color_stops[2] = { Tvg_Color_Stop color_stops[2] = {
{.offset=0.0, .r=0, .g=0, .b=0, .a=255}, {0.0, 0, 0, 0, 255},
{.offset=1, .r=0, .g=255, .b=0, .a=255}, {1.0, 0, 255, 0, 255},
}; };
const Tvg_Color_Stop *color_stops_ret; const Tvg_Color_Stop *color_stops_ret;
@ -148,10 +148,9 @@ TEST_CASE("Stroke Radial Gradient", "[capiRadialGradient]")
REQUIRE(tvg_radial_gradient_set(gradient, 10.0, 15.0, 30.0) == TVG_RESULT_SUCCESS); REQUIRE(tvg_radial_gradient_set(gradient, 10.0, 15.0, 30.0) == TVG_RESULT_SUCCESS);
Tvg_Color_Stop color_stops[2] = Tvg_Color_Stop color_stops[2] = {
{ {0.0, 0, 0, 0, 255},
{.offset=0.0, .r=0, .g=0, .b=0, .a=255}, {1.0, 0, 255, 0, 255},
{.offset=1, .r=0, .g=255, .b=0, .a=255},
}; };
Tvg_Gradient *gradient_ret = NULL; Tvg_Gradient *gradient_ret = NULL;