diff --git a/lib/decode.c b/lib/decode.c index 6266611..244ade3 100644 --- a/lib/decode.c +++ b/lib/decode.c @@ -916,3 +916,19 @@ quirc_decode_error_t quirc_decode(const struct quirc_code *code, return QUIRC_SUCCESS; } + +void quirc_flip(struct quirc_code *code) +{ + struct quirc_code flipped; + memset(&flipped, 0, sizeof(flipped)); + int offset = 0; + for (int y = 0, sx = 0; y < code->size; y++, sx++) { + for (int x = 0, sy = 0; x < code->size; x++, sy++) { + if (grid_bit(code, sx, sy)) { + flipped.cell_bitmap[offset >> 3] |= (1 << (offset & 7)); + } + offset++; + } + } + memcpy(&code->cell_bitmap, &flipped.cell_bitmap, sizeof(flipped.cell_bitmap)); +} \ No newline at end of file diff --git a/lib/quirc.h b/lib/quirc.h index 97b4bbe..d8d250d 100644 --- a/lib/quirc.h +++ b/lib/quirc.h @@ -168,6 +168,9 @@ void quirc_extract(const struct quirc *q, int index, quirc_decode_error_t quirc_decode(const struct quirc_code *code, struct quirc_data *data); +/* Flip a QR-code according to optional mirror feature of ISO 18004:2015 */ +void quirc_flip(struct quirc_code *code); + #ifdef __cplusplus } #endif