%% options copyright owner = Dirk Krause copyright year = 2018-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** @file wxdcomp.h Compare drawing objects. */ #ifndef DK4TYPES_H_INCLUDED #include "dk4types.h" #endif #ifndef WXDTYPES_H_INCLUDED #include "wxdtypes.h" #endif #ifdef __cplusplus extern "C" { #endif /** Compare drawing objects. @param l Left object. @param r Right object or name. @param cr Comparison criteria, ignored. @return Comparison result: -1: lr. */ int wxd2lat_compare_object(const void *l, const void *r, int cr); /** Find category for object type. @param ot Object type. @return Category for object type. */ int wxd2lat_object_category(int8_t ot); #ifdef __cplusplus } #endif %% module #include "wxd2lat.h" $!trace-include int wxd2lat_object_category(int8_t ot) { int back = WXD_OC_CONTROL; $? "+ wxd2lat_object_category %d", (int)ot switch (ot) { case WXD_OT_TEXT : { back = WXD_OC_TEXT ; } break; case WXD_OT_POLYLINE : case WXD_OT_O_SPLINE : case WXD_OT_O_ARC : { back = WXD_OC_OPEN ; } break; case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : case WXD_OT_BOX : { back = WXD_OC_CLOSED ; } break; case WXD_OT_IMAGE : { back = WXD_OC_IMAGE ; } break; } $? "- wxd2lat_object_category %d", back return back; } static int cmp_u8(uint8_t a, uint8_t b) { return ((a > b) ? (1) : ((a < b) ? (-1) : (0))); } static int cmp_i8(int8_t a, int8_t b) { return ((a > b) ? (1) : ((a < b) ? (-1) : (0))); } #if 0 static int cmp_u16(uint16_t a, uint16_t b) { return ((a > b) ? (1) : ((a < b) ? (-1) : (0))); } #endif static int cmp_i16(int16_t a, int16_t b) { return ((a > b) ? (1) : ((a < b) ? (-1) : (0))); } static int cmp_int(int a, int b) { return ((a > b) ? (1) : ((a < b) ? (-1) : (0))); } static int cmp_dbl(double a, double b) { return ((a > b) ? (1) : ((a < b) ? (-1) : (0))); } int wxd2lat_compare_object(const void *l, const void *r, int DK4_ARG_UNUSED(cr)) { const wxd_object_t *pl; const wxd_object_t *pr; int cal; int car; int back = 0; DK4_UNUSED_ARG(cr) $? "+ wxd2lat_compare_object %d", cr if (NULL != l) { if (NULL != r) { pl = (const wxd_object_t *)l; pr = (const wxd_object_t *)r; back = cmp_i16(pl->lay, pr->lay); if (0 == back) { cal = wxd2lat_object_category(pl->ot); car = wxd2lat_object_category(pr->ot); back = cmp_int(cal, car); if (0 == back) { #if 0 back = cmp_u16(pl->lw, pr->lw); #endif back = cmp_dbl(pl->lw, pr->lw); if (0 == back) { back = cmp_u8(pl->ls, pr->ls); if (0 == back) { back = cmp_u8(pl->sl, pr->sl); if (0 == back) { back = cmp_u8(pl->js, pr->js); if (0 == back) { back = cmp_u8(pl->csfs, pr->csfs); if (0 == back) { back = cmp_u8(pl->ml, pr->ml); if (0 == back) { back = cmp_u8(pl->sc[0], pr->sc[0]); if (0 == back) { back = cmp_u8(pl->sc[1], pr->sc[1]); if (0 == back) { back = cmp_u8(pl->sc[2], pr->sc[2]); if (0 == back) { back = cmp_u8(pl->fc[0], pr->fc[0]); if (0 == back) { back = cmp_u8(pl->fc[1], pr->fc[1]); if (0 == back) { back = cmp_u8(pl->fc[2], pr->fc[2]); if (0 == back) { back = cmp_i8(pl->ot, pr->ot); } } } } } } } } } } } } } } } else { back = 1; } } else { if (NULL != r) { back = -1; } } $? "- wxd2lat_compare_object %d", back return back; } /* vim: set ai sw=4 ts=4 : */