test_scpr_polygon.c (8872B)
1 /* Copyright (C) 2016-2018, 2021-2024 |Méso|Star> (contact@meso-star.com) 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #include <stdio.h> 17 #define _POSIX_C_SOURCE 200112L 18 19 #include "scpr.h" 20 #include "test_scpr_utils.h" 21 22 #include <memory.h> 23 #include <rsys/rsys.h> 24 25 int 26 main(int argc, char** argv) 27 { 28 double coords0[] = { 29 0.0, 0.0, 30 0.5, 0.0, 31 1.0, 0.0, 32 1.0, 1.0, 33 1.0, 1.0, 34 0.0, 1.0 35 }; 36 double coords0_reduced[] = { 37 0.0, 0.0, 38 1.0, 0.0, 39 1.0, 1.0, 40 0.0, 1.0 41 }; 42 double coords1[] = { 43 0.0, 0.0, 44 0.5, 0.0, 45 0.0, 1.0, 46 1.0, 1.0, 47 1.0, 1000000000001, /* To be replaced */ 48 1.0, 0.0 49 }; 50 double** coords; 51 size_t nverts[] = { 6 }; 52 size_t ncomps = 1; 53 double pos[2], range[2]; 54 size_t i, c, n; 55 struct mem_allocator allocator; 56 struct polygon_context ctx; 57 struct scpr_polygon* polygon; 58 struct scpr_polygon* copy; 59 struct scpr_device* dev; 60 struct scpr_device_create_args args = SCPR_DEVICE_CREATE_ARGS_DEFAULT; 61 int eq, in; 62 double low[2] = {0, 0}, up[2] = {1, 1}; 63 FILE* stream = NULL; 64 (void)argc, (void)argv; 65 66 mem_init_proxy_allocator(&allocator, &mem_default_allocator); 67 68 coords = (double**)MEM_CALLOC(&allocator, ncomps, sizeof(*coords)); 69 *coords = (double*)MEM_CALLOC(&allocator, nverts[0], 2*sizeof(**coords)); 70 memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); 71 72 args.allocator = &allocator; 73 args.precision = SCPR_DEVICE_CREATE_ARGS_DEFAULT.precision; 74 OK(scpr_device_create(&args, &dev)); 75 76 /* Set out-of-range value in coords1 */ 77 SCPR(device_get_range(dev, range)); 78 coords1[9] = range[1] + 1; 79 80 BAD(scpr_polygon_create(NULL, NULL)); 81 BAD(scpr_polygon_create(dev, NULL)); 82 OK(scpr_polygon_create(dev, &polygon)); 83 OK(scpr_polygon_create(dev, ©)); 84 OK(scpr_polygon_ref_put(copy)); 85 86 BAD(scpr_polygon_ref_get(NULL)); 87 OK(scpr_polygon_ref_get(polygon)); 88 BAD(scpr_polygon_ref_put(NULL)); 89 OK(scpr_polygon_ref_put(polygon)); 90 OK(scpr_polygon_ref_put(polygon)); 91 92 OK(scpr_polygon_create(dev, &polygon)); 93 94 OK(scpr_polygon_get_components_count(polygon, &n)); 95 CHK(n == 0); 96 97 ctx.coords = coords; 98 ctx.nverts = nverts; 99 ctx.ncomps = ncomps; 100 101 #define SETUP scpr_polygon_setup_indexed_vertices 102 BAD(SETUP(NULL, ncomps, NULL, NULL, NULL)); 103 BAD(SETUP(polygon, ncomps, NULL, NULL, NULL)); 104 BAD(SETUP(NULL, ncomps, pget_nverts, NULL, NULL)); 105 BAD(SETUP(polygon, ncomps, pget_nverts, NULL, NULL)); 106 BAD(SETUP(NULL, ncomps, NULL, pget_pos, NULL)); 107 BAD(SETUP(polygon, ncomps, NULL, pget_pos, NULL)); 108 BAD(SETUP(NULL, ncomps, pget_nverts, pget_pos, NULL)); 109 BAD(SETUP(polygon, ncomps, pget_nverts, pget_pos, NULL)); 110 BAD(SETUP(NULL, ncomps, NULL, NULL, &ctx)); 111 BAD(SETUP(polygon, ncomps, NULL, NULL, &ctx)); 112 BAD(SETUP(NULL, ncomps, pget_nverts, NULL, &ctx)); 113 BAD(SETUP(polygon, ncomps, pget_nverts, NULL, &ctx)); 114 BAD(SETUP(NULL, ncomps, NULL, pget_pos, &ctx)); 115 BAD(SETUP(polygon, ncomps, NULL, pget_pos, &ctx)); 116 BAD(SETUP(NULL, ncomps, pget_nverts, pget_pos, &ctx)); 117 /* Check out of range data being detected at setup */ 118 memcpy(*coords, coords1, 2*nverts[0]*sizeof(**coords)); 119 BAD(SETUP(polygon, ncomps, pget_nverts, pget_pos, &ctx)); 120 /* Check polygon was simplified to 4 vertices */ 121 memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); 122 OK(SETUP(polygon, ncomps, pget_nverts, pget_pos, &ctx)); 123 OK(scpr_polygon_get_vertices_count(polygon, 0, &n)); 124 CHK(n == sizeof(coords0_reduced)/(2*sizeof(*coords0_reduced))); 125 #undef SETUP 126 127 BAD(scpr_polygon_in_bbox(NULL, NULL, NULL, NULL)); 128 BAD(scpr_polygon_in_bbox(NULL, NULL, NULL, &in)); 129 BAD(scpr_polygon_in_bbox(NULL, NULL, up, NULL)); 130 BAD(scpr_polygon_in_bbox(NULL, NULL, up, &in)); 131 BAD(scpr_polygon_in_bbox(NULL, low, NULL, NULL)); 132 BAD(scpr_polygon_in_bbox(NULL, low, NULL, &in)); 133 BAD(scpr_polygon_in_bbox(NULL, low, up, NULL)); 134 BAD(scpr_polygon_in_bbox(NULL, low, up, &in)); 135 BAD(scpr_polygon_in_bbox(polygon, NULL, NULL, NULL)); 136 BAD(scpr_polygon_in_bbox(polygon, NULL, NULL, &in)); 137 BAD(scpr_polygon_in_bbox(polygon, NULL, up, NULL)); 138 BAD(scpr_polygon_in_bbox(polygon, NULL, up, &in)); 139 BAD(scpr_polygon_in_bbox(polygon, low, NULL, NULL)); 140 BAD(scpr_polygon_in_bbox(polygon, low, NULL, &in)); 141 OK(scpr_polygon_in_bbox(polygon, low, up, &in)); 142 CHK(in); 143 /* With smaller box */ 144 up[0] = 0.5; 145 OK(scpr_polygon_in_bbox(polygon, low, up, &in)); 146 CHK(!in); 147 148 BAD(scpr_polygon_get_components_count(NULL, NULL)); 149 BAD(scpr_polygon_get_components_count(polygon, NULL)); 150 BAD(scpr_polygon_get_components_count(NULL, &n)); 151 OK(scpr_polygon_get_components_count(polygon, &n)); 152 CHK(n == ncomps); 153 154 BAD(scpr_polygon_get_vertices_count(NULL, ncomps, NULL)); 155 BAD(scpr_polygon_get_vertices_count(polygon, ncomps, NULL)); 156 BAD(scpr_polygon_get_vertices_count(NULL, 0, NULL)); 157 BAD(scpr_polygon_get_vertices_count(polygon, 0, NULL)); 158 BAD(scpr_polygon_get_vertices_count(NULL, ncomps, &n)); 159 BAD(scpr_polygon_get_vertices_count(polygon, ncomps, &n)); 160 BAD(scpr_polygon_get_vertices_count(NULL, 0, &n)); 161 OK(scpr_polygon_get_vertices_count(polygon, 0, &n)); 162 163 BAD(scpr_polygon_eq(NULL, NULL, NULL)); 164 BAD(scpr_polygon_eq(polygon, NULL, NULL)); 165 BAD(scpr_polygon_eq(NULL, polygon, NULL)); 166 BAD(scpr_polygon_eq(polygon, polygon, NULL)); 167 BAD(scpr_polygon_eq(NULL, NULL, &eq)); 168 BAD(scpr_polygon_eq(polygon, NULL, &eq)); 169 BAD(scpr_polygon_eq(polygon, 0, &eq)); 170 OK(scpr_polygon_eq(polygon, polygon, &eq)); 171 CHK(eq); 172 173 BAD(scpr_polygon_get_position(NULL, ncomps, nverts[0], NULL)); 174 BAD(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos)); 175 BAD(scpr_polygon_get_position(NULL, ncomps, 0, NULL)); 176 BAD(scpr_polygon_get_position(NULL, ncomps, 0, pos)); 177 BAD(scpr_polygon_get_position(NULL, 0, nverts[0], NULL)); 178 BAD(scpr_polygon_get_position(NULL, 0, nverts[0], pos)); 179 BAD(scpr_polygon_get_position(NULL, 0, 0, NULL)); 180 BAD(scpr_polygon_get_position(NULL, 0, 0, pos)); 181 BAD(scpr_polygon_get_position(polygon, ncomps, nverts[0], NULL)); 182 BAD(scpr_polygon_get_position(polygon, ncomps, nverts[0], pos)); 183 BAD(scpr_polygon_get_position(polygon, ncomps, 0, NULL)); 184 BAD(scpr_polygon_get_position(polygon, ncomps, 0, pos)); 185 BAD(scpr_polygon_get_position(polygon, 0, nverts[0], NULL)); 186 BAD(scpr_polygon_get_position(polygon, 0, nverts[0], pos)); 187 BAD(scpr_polygon_get_position(polygon, 0, 0, NULL)); 188 memcpy(*coords, coords0_reduced, sizeof(coords0_reduced)); 189 FOR_EACH(c, 0, ncomps) { 190 size_t count; 191 OK(scpr_polygon_get_vertices_count(polygon, c, &count)); 192 FOR_EACH(i, 0, count) { 193 OK(scpr_polygon_get_position(polygon, c, i, pos)); 194 CHK(pos[0] == coords[c][i*2+0]); 195 CHK(pos[1] == coords[c][i*2+1]); 196 } 197 } 198 199 BAD(scpr_polygon_create_copy(NULL, NULL, NULL)); 200 BAD(scpr_polygon_create_copy(NULL, NULL, ©)); 201 BAD(scpr_polygon_create_copy(NULL, polygon, NULL)); 202 OK(scpr_polygon_create_copy(dev, polygon, ©)); 203 OK(scpr_polygon_eq(polygon, copy, &eq)); 204 CHK(eq); 205 206 BAD(scpr_offset_polygon(NULL, 0, SCPR_JOIN_TYPES_COUNT__)); 207 BAD(scpr_offset_polygon(polygon, 0, SCPR_JOIN_TYPES_COUNT__)); 208 BAD(scpr_offset_polygon(NULL, 0, SCPR_JOIN_MITER)); 209 OK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER)); 210 211 BAD(scpr_polygon_dump_to_obj(NULL, NULL)); 212 BAD(scpr_polygon_dump_to_obj(polygon, NULL)); 213 BAD(scpr_polygon_dump_to_obj(NULL, stream)); 214 BAD(scpr_polygon_dump_to_obj(polygon, stream)); 215 stream = tmpfile(); 216 OK(scpr_polygon_dump_to_obj(polygon, stream)); 217 fclose(stream); 218 stream = NULL; 219 220 BAD(scpr_polygon_dump_component_to_obj(NULL, ncomps, NULL)); 221 BAD(scpr_polygon_dump_component_to_obj(polygon, ncomps, NULL)); 222 BAD(scpr_polygon_dump_component_to_obj(NULL, 0, NULL)); 223 BAD(scpr_polygon_dump_component_to_obj(NULL, ncomps, stream)); 224 BAD(scpr_polygon_dump_component_to_obj(polygon, ncomps, stream)); 225 BAD(scpr_polygon_dump_component_to_obj(polygon, 0, stream)); 226 stream = tmpfile(); 227 OK(scpr_polygon_dump_component_to_obj(polygon, 0, stream)); 228 fclose(stream); 229 230 OK(scpr_device_ref_put(dev)); 231 OK(scpr_polygon_ref_put(polygon)); 232 OK(scpr_polygon_ref_put(copy)); 233 234 MEM_RM(&allocator, *coords); 235 MEM_RM(&allocator, coords); 236 237 check_memory_allocator(&allocator); 238 mem_shutdown_proxy_allocator(&allocator); 239 CHK(mem_allocated_size() == 0); 240 return 0; 241 } 242