Ret invert(Iterator* forward, Iterator* backward) { void* data1 = NULL; void* data2 = NULL; return_val_if_fail(forward != NULL && backward != NULL, RET_INVALID_PARAMS); for (; iterator_offset(forward) < iterator_offset(backward); iterator_next(forward), iterator_prev(backward)) { iterator_get(forward, &data1); iterator_get(backward, &data2); iterator_set(forward, data2); iterator_set(backward, data1); } return RET_OK; }
void imlib_binary(image_t *img, list_t *thresholds, bool invert, bool zero) { for (list_lnk_t *it = iterator_start_from_head(thresholds); it; it = iterator_next(it)) { color_thresholds_list_lnk_data_t lnk_data; iterator_get(thresholds, it, &lnk_data); switch(img->bpp) { case IMAGE_BPP_BINARY: { break; } case IMAGE_BPP_GRAYSCALE: { if (!zero) { for (uint8_t *start = IMAGE_COMPUTE_GRAYSCALE_PIXEL_ROW_PTR(img, 0), *end = IMAGE_COMPUTE_GRAYSCALE_PIXEL_ROW_PTR(img, img->h); start < end; start++) { *start = COLOR_THRESHOLD_GRAYSCALE(*start, &lnk_data, invert) ? COLOR_GRAYSCALE_BINARY_MAX : COLOR_GRAYSCALE_BINARY_MIN; } } else { for (uint8_t *start = IMAGE_COMPUTE_GRAYSCALE_PIXEL_ROW_PTR(img, 0), *end = IMAGE_COMPUTE_GRAYSCALE_PIXEL_ROW_PTR(img, img->h); start < end; start++) { if (COLOR_THRESHOLD_GRAYSCALE(*start, &lnk_data, invert)) *start = COLOR_GRAYSCALE_BINARY_MIN; } } break; } case IMAGE_BPP_RGB565: { if (!zero) { for (uint16_t *start = IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(img, 0), *end = IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(img, img->h); start < end; start++) { *start = COLOR_THRESHOLD_RGB565(*start, &lnk_data, invert) ? COLOR_RGB565_BINARY_MAX : COLOR_RGB565_BINARY_MIN; } } else { for (uint16_t *start = IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(img, 0), *end = IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(img, img->h); start < end; start++) { if (COLOR_THRESHOLD_RGB565(*start, &lnk_data, invert)) *start = COLOR_RGB565_BINARY_MIN; } } break; } default: { break; } } } }