/* Normalizes the text in @fmap and stores the result in @state's buffer. * Returns number of characters written to buffer. */ size_t text_normalize_map(struct text_norm_state *state, fmap_t *map, size_t offset) { const unsigned char *map_loc; unsigned int map_pgsz; uint64_t map_len; size_t buff_len; size_t acc; size_t acc_total; size_t acc_len; map_len = map->len; map_pgsz = map->pgsz; buff_len = state->out_len; acc_total = 0; acc = 0; while (1) { /* Break out if we've reached the end of the map or our buffer. */ if(!(acc_len = MIN_3(map_pgsz, map_len - offset, buff_len - acc_total))) break; /* If map_loc is NULL, then there's nothing left to do but recover. */ if(!(map_loc = fmap_need_off_once(map, offset, acc_len))) break; offset += acc_len; /* If we didn't normalize anything, no need to update values, just break out. */ if(!(acc = text_normalize_buffer(state, map_loc, acc_len))) break; acc_total += acc; } return acc_total; }
HSV RGB2HSV(RGBf rgb){ HSV hsv; float min, max, delta; int r, g, b; r = rgb.r; g = rgb.g; b = rgb.b; min = MIN_3(r, g, b); max = MAX_3(r, g, b); hsv.v = max; // v delta = max - min; if(delta == 0){ hsv.h = 0; hsv.s = 0; hsv.v = hsv.v / 255.0; return hsv; } if( max != 0 ) { hsv.s = delta / max; // s } else { // r = g = b = 0 // s = 0, v is undefined hsv.s = 0; hsv.h = -1; return hsv; } if( r == max ) hsv.h = ( g - b ) / delta; // between yellow & magenta else if( g == max ) hsv.h = 2 + ( b - r ) / delta; // between cyan & yellow else hsv.h = 4 + ( r - g ) / delta; // between magenta & cyan hsv.h *= 60; // degrees if( hsv.h < 0 ) hsv.h += 360; hsv.s *= 100; hsv.v = hsv.v / 255 * 100; return hsv; }