star-cpr

Clip 2D meshes with 2D polygons
git clone git://git.meso-star.fr/star-cpr.git
Log | Files | Refs | README | LICENSE

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, &copy));
     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, &copy));
    201   BAD(scpr_polygon_create_copy(NULL, polygon, NULL));
    202   OK(scpr_polygon_create_copy(dev, polygon, &copy));
    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