summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-11-27 01:19:14 -0600
committersanine <sanine.not@pm.me>2022-11-27 01:19:14 -0600
commit6053d87cd02cd5aec9da5bc46039ec4cca181dec (patch)
tree81dd8f2fd0fc5bef5951bee324a8ceb0bf419613
parentc42d9264aed8da3a057719cab7390fa55904bda6 (diff)
add scale parsing
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/transform.c24
-rw-r--r--src/transform.h3
-rw-r--r--src/transform.test.c57
4 files changed, 86 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2843fd3..f493c77 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,6 +14,8 @@ if (UNIX)
endif()
if (KALMIA_BUILD_TESTS)
+ string(LENGTH "${CMAKE_SOURCE_DIR}/" SOURCE_PATH_SIZE)
+ add_definitions("-DSOURCE_PATH_SIZE=${SOURCE_PATH_SIZE}")
add_executable(kalmia-tests)
target_link_libraries(kalmia-tests kalmia)
if (UNIX)
diff --git a/src/transform.c b/src/transform.c
index 6e4db56..465841d 100644
--- a/src/transform.c
+++ b/src/transform.c
@@ -83,6 +83,30 @@ int kai_parse_rotate(ka_matrix_t *m, ezxml_t tag)
}
+int kai_parse_scale(ka_matrix_t *m, ezxml_t tag)
+{
+ if (strcmp("scale", ezxml_name(tag)) != 0)
+ return -1;
+
+ char *str = ezxml_txt(tag);
+ char *end;
+ int i;
+ double scale[3];
+ for (i=0; i<3; i++) {
+ scale[i] = strtod(str, &end);
+ str = end;
+ }
+
+ memset(*m, 0, 16*sizeof(double));
+ (*m)[0] = scale[0];
+ (*m)[5] = scale[1];
+ (*m)[10] = scale[2];
+ (*m)[15] = 1.0f;
+
+ return 0;
+}
+
+
int kai_parse_translate(ka_matrix_t *m, ezxml_t tag)
{
if (strcmp("translate", ezxml_name(tag)) != 0)
diff --git a/src/transform.h b/src/transform.h
index bbc79d1..f8dc2ad 100644
--- a/src/transform.h
+++ b/src/transform.h
@@ -11,6 +11,9 @@ int kai_parse_matrix(ka_matrix_t *m, ezxml_t tag);
/* parse a <rotate> tag into a ka_matrix_t */
int kai_parse_rotate(ka_matrix_t *m, ezxml_t tag);
+/* parse a <scale> tag into a ka_matrix_t */
+int kai_parse_scale(ka_matrix_t *m, ezxml_t tag);
+
/* parse a <translate> tag into a ka_matrix_t */
int kai_parse_translate(ka_matrix_t *m, ezxml_t tag);
diff --git a/src/transform.test.c b/src/transform.test.c
index f0cd06f..ba663bb 100644
--- a/src/transform.test.c
+++ b/src/transform.test.c
@@ -10,6 +10,9 @@ void parse_identity();
void parse_rotate_fail();
void parse_rotate();
+void parse_scale_fail();
+void parse_scale();
+
void parse_translate_fail();
void parse_translate();
@@ -20,6 +23,8 @@ void suite_transform()
lily_run_test(parse_identity);
lily_run_test(parse_rotate_fail);
lily_run_test(parse_rotate);
+ lily_run_test(parse_scale_fail);
+ lily_run_test(parse_scale);
lily_run_test(parse_translate_fail);
lily_run_test(parse_translate);
}
@@ -134,6 +139,58 @@ void parse_rotate()
}
+/* ======== scale ======== */
+void parse_scale_fail()
+{
+ char str[128];
+ strncpy(str, "<non></non>", 128);
+ ezxml_t tag = ezxml_parse_str(str, strlen(str));
+
+ ka_matrix_t mat;
+ int rc = kai_parse_scale(&mat, tag);
+ lily_assert_true(rc != 0);
+
+ ezxml_free(tag);
+}
+
+
+void parse_scale()
+{
+ char str[512];
+ strncpy(
+ str,
+ "<scale>\n"
+ " 10 5 -1\n"
+ "</scale>",
+ 512
+ );
+ ezxml_t tag = ezxml_parse_str(str, strlen(str));
+
+ ka_matrix_t mat;
+ mat[0] = 100;
+ int rc = kai_parse_scale(&mat, tag);
+ lily_assert_true(rc == 0);
+ ezxml_free(tag);
+
+ lily_assert_float_equal(mat[0], 10.0f, 1e-3);
+ lily_assert_float_equal(mat[1], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[2], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[3], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[4], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[5], 5.0f, 1e-3);
+ lily_assert_float_equal(mat[6], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[7], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[8], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[9], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[10],-1.0f, 1e-3);
+ lily_assert_float_equal(mat[11], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[12], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[13], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[14], 0.0f, 1e-3);
+ lily_assert_float_equal(mat[15], 1.0f, 1e-3);
+}
+
+
/* ======== translate ======== */
void parse_translate_fail()
{