mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Changed to use fb_alloc_mark, gb_alloc_free_till_mark. Renamed Image hint type and enums. Formatting fixes
This commit is contained in:
parent
85fbe0a87f
commit
8f8872537b
@ -81,11 +81,11 @@ while(True):
|
|||||||
|
|
||||||
apply_mask = CYCLE_MASK and ((value_mixer >> 9) & 1)
|
apply_mask = CYCLE_MASK and ((value_mixer >> 9) & 1)
|
||||||
if apply_mask:
|
if apply_mask:
|
||||||
img.draw_image(small_img, int(x), int(y), mask=small_img.to_bitmap(copy=True), x_scale=-rescale, y_scale=rescale, alpha=240, hint=image.INTERPOLATE_BILINEAR | image.IMAGE_CENTER)
|
img.draw_image(small_img, int(x), int(y), mask=small_img.to_bitmap(copy=True), x_scale=-rescale, y_scale=rescale, alpha=240, hint=image.IMAGE_HINT_BILINEAR | image.IMAGE_HINT_CENTER)
|
||||||
status += 'alpha:240 '
|
status += 'alpha:240 '
|
||||||
status += '+mask '
|
status += '+mask '
|
||||||
else:
|
else:
|
||||||
img.draw_image(small_img, int(x), int(y), x_scale=-rescale, y_scale=rescale, alpha=128, hint=image.INTERPOLATE_BILINEAR | image.IMAGE_CENTER)
|
img.draw_image(small_img, int(x), int(y), x_scale=-rescale, y_scale=rescale, alpha=128, hint=image.IMAGE_HINT_BILINEAR | image.IMAGE_HINT_CENTER)
|
||||||
status += 'alpha:128 '
|
status += 'alpha:128 '
|
||||||
|
|
||||||
img.draw_string(8, 0, status, mono_space = False)
|
img.draw_string(8, 0, status, mono_space = False)
|
||||||
|
|||||||
@ -566,7 +566,7 @@ inline bool pixel_to_binary(int bpp, uint32_t pixel) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by INTERPOLATE_BILINEAR to generate a grayscale linear interpolated row.
|
* Used by IMAGE_HINT_BILINEAR to generate a grayscale linear interpolated row.
|
||||||
* The drawing algorithm will later apply the vertical interpolation between two cached lines.
|
* The drawing algorithm will later apply the vertical interpolation between two cached lines.
|
||||||
*
|
*
|
||||||
* @param cache_line Where to write the line
|
* @param cache_line Where to write the line
|
||||||
@ -586,19 +586,19 @@ static void int_generate_cache_line_grayscale(uint16_t *cache_line, int alpha, u
|
|||||||
float other_x_float = x * over_xscale;
|
float other_x_float = x * over_xscale;
|
||||||
uint32_t other_x = fast_floorf(other_x_float);
|
uint32_t other_x = fast_floorf(other_x_float);
|
||||||
uint32_t weight_x = fast_floorf((other_x_float - other_x) * alpha);
|
uint32_t weight_x = fast_floorf((other_x_float - other_x) * alpha);
|
||||||
|
|
||||||
bool mask1 = true, mask2 = true;
|
bool mask1 = true, mask2 = true;
|
||||||
|
|
||||||
if (mask_row_ptr) {
|
if (mask_row_ptr) {
|
||||||
mask1 = pixel_to_binary(mask_bpp, imlib_get_pixel_fast(mask_bpp, mask_row_ptr, other_x));
|
mask1 = pixel_to_binary(mask_bpp, imlib_get_pixel_fast(mask_bpp, mask_row_ptr, other_x));
|
||||||
mask2 = pixel_to_binary(mask_bpp, imlib_get_pixel_fast(mask_bpp, mask_row_ptr, other_x + 1));
|
mask2 = pixel_to_binary(mask_bpp, imlib_get_pixel_fast(mask_bpp, mask_row_ptr, other_x + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t alpha1 = mask1 ? (alpha - weight_x) : 0;
|
uint32_t alpha1 = mask1 ? (alpha - weight_x) : 0;
|
||||||
uint32_t alpha2 = mask2 ? weight_x : 0;
|
uint32_t alpha2 = mask2 ? weight_x : 0;
|
||||||
|
|
||||||
uint32_t other_pixel1 = safe_map_pixel(IMAGE_BPP_GRAYSCALE, other_bpp, imlib_get_pixel_fast(other_bpp, other_row_ptr, other_x)) * alpha1;
|
uint32_t other_pixel1 = safe_map_pixel(IMAGE_BPP_GRAYSCALE, other_bpp, imlib_get_pixel_fast(other_bpp, other_row_ptr, other_x)) * alpha1;
|
||||||
uint32_t other_pixel2 = safe_map_pixel(IMAGE_BPP_GRAYSCALE, other_bpp, imlib_get_pixel_fast(other_bpp, other_row_ptr, other_x + 1)) * alpha2;
|
uint32_t other_pixel2 = safe_map_pixel(IMAGE_BPP_GRAYSCALE, other_bpp, imlib_get_pixel_fast(other_bpp, other_row_ptr, other_x + 1)) * alpha2;
|
||||||
|
|
||||||
// Image alpha is the remining alpha after applying other alpha
|
// Image alpha is the remaining alpha after applying other alpha
|
||||||
uint32_t img_alpha = 256 - (alpha1 + alpha2);
|
uint32_t img_alpha = 256 - (alpha1 + alpha2);
|
||||||
|
|
||||||
// Note img_alpha is now 0->128 to fit into a byte
|
// Note img_alpha is now 0->128 to fit into a byte
|
||||||
@ -608,7 +608,7 @@ static void int_generate_cache_line_grayscale(uint16_t *cache_line, int alpha, u
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by INTERPOLATE_BILINEAR to generate a RGB888 linear interpolated row.
|
* Used by IMAGE_HINT_BILINEAR to generate a RGB888 linear interpolated row.
|
||||||
* The drawing algorithm will later apply the vertical interpolation between two cached lines.
|
* The drawing algorithm will later apply the vertical interpolation between two cached lines.
|
||||||
*
|
*
|
||||||
* @param cache_line Where to write the line
|
* @param cache_line Where to write the line
|
||||||
@ -637,7 +637,6 @@ static void int_generate_cache_line_rgb565(uint32_t *cache_line, int alpha, cons
|
|||||||
|
|
||||||
uint32_t alpha1 = mask1 ? (alpha - weight_x) : 0;
|
uint32_t alpha1 = mask1 ? (alpha - weight_x) : 0;
|
||||||
uint32_t alpha2 = mask2 ? weight_x : 0;
|
uint32_t alpha2 = mask2 ? weight_x : 0;
|
||||||
|
|
||||||
uint32_t other_pixel1 = imlib_get_pixel_fast(other_bpp, other_row_ptr, other_x);
|
uint32_t other_pixel1 = imlib_get_pixel_fast(other_bpp, other_row_ptr, other_x);
|
||||||
uint32_t other_pixel2 = imlib_get_pixel_fast(other_bpp, other_row_ptr, other_x + 1);
|
uint32_t other_pixel2 = imlib_get_pixel_fast(other_bpp, other_row_ptr, other_x + 1);
|
||||||
|
|
||||||
@ -651,7 +650,7 @@ static void int_generate_cache_line_rgb565(uint32_t *cache_line, int alpha, cons
|
|||||||
other_pixel2 = color_palette ? color_palette[other_pixel2] : safe_map_pixel(IMAGE_BPP_RGB565, other_bpp, other_pixel2);
|
other_pixel2 = color_palette ? color_palette[other_pixel2] : safe_map_pixel(IMAGE_BPP_RGB565, other_bpp, other_pixel2);
|
||||||
other_pixel2 = draw_scaleop_RGB565_to_RGB888(other_pixel2, alpha2);
|
other_pixel2 = draw_scaleop_RGB565_to_RGB888(other_pixel2, alpha2);
|
||||||
|
|
||||||
// Image alpha is the remining alpha after applying other alpha
|
// Image alpha is the remaining alpha after applying other alpha
|
||||||
uint32_t img_alpha = 128 - (alpha1 + alpha2);
|
uint32_t img_alpha = 128 - (alpha1 + alpha2);
|
||||||
|
|
||||||
cache_line[i] = ((other_pixel1 + other_pixel2) << 8) + img_alpha; // RGBA8888
|
cache_line[i] = ((other_pixel1 + other_pixel2) << 8) + img_alpha; // RGBA8888
|
||||||
@ -671,16 +670,16 @@ static void int_generate_cache_line_rgb565(uint32_t *cache_line, int alpha, cons
|
|||||||
* @param mask Mask image, if interpolating must be the same size as the other image.
|
* @param mask Mask image, if interpolating must be the same size as the other image.
|
||||||
* @param color_palette Color palette for transforming grayscale images to RGB565.
|
* @param color_palette Color palette for transforming grayscale images to RGB565.
|
||||||
* @param alpha_palette Alpha palette for masking grayscale images.
|
* @param alpha_palette Alpha palette for masking grayscale images.
|
||||||
* @param hint Rendering hint. e.g. INTERPOLATE_BILINEAR, IMAGE_CENTER
|
* @param hint Rendering hint. e.g. IMAGE_HINT_BILINEAR, IMAGE_HINT_CENTER
|
||||||
*/
|
*/
|
||||||
void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float x_scale, float y_scale, int alpha, image_t *mask, const uint16_t *color_palette, const uint8_t *alpha_palette, image_hint_type hint)
|
void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float x_scale, float y_scale, int alpha, image_t *mask, const uint16_t *color_palette, const uint8_t *alpha_palette, image_hint_t hint)
|
||||||
{
|
{
|
||||||
// If alpha is 0 then nothing changes
|
// If alpha is 0 then nothing changes
|
||||||
if (alpha == 0) return;
|
if (alpha == 0) return;
|
||||||
|
|
||||||
if (hint & INTERPOLATE_BILINEAR) {
|
if (hint & IMAGE_HINT_BILINEAR) {
|
||||||
// Cannot interpolate a 1x1 pixel.
|
// Cannot interpolate a 1x1 pixel.
|
||||||
if (other->w <= 1 || other->h <= 1) hint &= ~INTERPOLATE_BILINEAR;
|
if (other->w <= 1 || other->h <= 1) hint &= ~IMAGE_HINT_BILINEAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scaled other size
|
// Scaled other size
|
||||||
@ -688,7 +687,7 @@ void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float
|
|||||||
int other_height_scaled = fast_floorf(fast_fabsf(y_scale) * other->h);
|
int other_height_scaled = fast_floorf(fast_fabsf(y_scale) * other->h);
|
||||||
|
|
||||||
// Center other if hint is set
|
// Center other if hint is set
|
||||||
if (hint & IMAGE_CENTER) {
|
if (hint & IMAGE_HINT_CENTER) {
|
||||||
x_off -= other_width_scaled >> 1;
|
x_off -= other_width_scaled >> 1;
|
||||||
y_off -= other_height_scaled >> 1;
|
y_off -= other_height_scaled >> 1;
|
||||||
}
|
}
|
||||||
@ -724,7 +723,7 @@ void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If we're linear interpolating the last pixel will overflow if we land on it, we want to land just before it.
|
// If we're linear interpolating the last pixel will overflow if we land on it, we want to land just before it.
|
||||||
if (hint & INTERPOLATE_BILINEAR) {
|
if (hint & IMAGE_HINT_BILINEAR) {
|
||||||
over_xscale *= (float)(other->w - 1) / other->w;
|
over_xscale *= (float)(other->w - 1) / other->w;
|
||||||
over_yscale *= (float)(other->h - 1) / other->h;
|
over_yscale *= (float)(other->h - 1) / other->h;
|
||||||
}
|
}
|
||||||
@ -757,7 +756,9 @@ void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IMAGE_BPP_GRAYSCALE: {
|
case IMAGE_BPP_GRAYSCALE: {
|
||||||
if (hint & INTERPOLATE_BILINEAR) {
|
if (hint & IMAGE_HINT_BILINEAR) {
|
||||||
|
fb_alloc_mark();
|
||||||
|
|
||||||
// Allocate cache lines
|
// Allocate cache lines
|
||||||
int bytes_per_img_line = img->w * sizeof(uint8_t) * 2; // (1 byte graysclae + 1 byte alpha) = * 2
|
int bytes_per_img_line = img->w * sizeof(uint8_t) * 2; // (1 byte graysclae + 1 byte alpha) = * 2
|
||||||
uint16_t *cache_line_1 = fb_alloc(bytes_per_img_line, FB_ALLOC_NO_HINT);
|
uint16_t *cache_line_1 = fb_alloc(bytes_per_img_line, FB_ALLOC_NO_HINT);
|
||||||
@ -834,10 +835,8 @@ void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// De-allocate cache lines
|
// De-allocate cache lines
|
||||||
fb_free(cache_line_1);
|
fb_alloc_free_till_mark();
|
||||||
fb_free(cache_line_2);
|
} else {
|
||||||
}
|
|
||||||
else {
|
|
||||||
// 00000000otheralph00000000imgalpha
|
// 00000000otheralph00000000imgalpha
|
||||||
uint32_t packed_alpha = (alpha << 16) + (256 - alpha);
|
uint32_t packed_alpha = (alpha << 16) + (256 - alpha);
|
||||||
|
|
||||||
@ -872,7 +871,9 @@ void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float
|
|||||||
// Alpha is 0->128
|
// Alpha is 0->128
|
||||||
alpha >>= 1;
|
alpha >>= 1;
|
||||||
|
|
||||||
if (hint & INTERPOLATE_BILINEAR) {
|
if (hint & IMAGE_HINT_BILINEAR) {
|
||||||
|
fb_alloc_mark();
|
||||||
|
|
||||||
// Allocate cache lines
|
// Allocate cache lines
|
||||||
int bytes_per_img_line = img->w * 4; // (3 bytes RGB888 + 1 byte alpha) = * 4
|
int bytes_per_img_line = img->w * 4; // (3 bytes RGB888 + 1 byte alpha) = * 4
|
||||||
uint32_t *cache_line_1 = fb_alloc(bytes_per_img_line, FB_ALLOC_NO_HINT);
|
uint32_t *cache_line_1 = fb_alloc(bytes_per_img_line, FB_ALLOC_NO_HINT);
|
||||||
@ -957,10 +958,8 @@ void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float
|
|||||||
}
|
}
|
||||||
|
|
||||||
// De-allocate cache lines
|
// De-allocate cache lines
|
||||||
fb_free(cache_line_1);
|
fb_alloc_free_till_mark();
|
||||||
fb_free(cache_line_2);
|
} else {
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint32_t va = __PKHBT((128 - alpha), alpha, 16);
|
uint32_t va = __PKHBT((128 - alpha), alpha, 16);
|
||||||
|
|
||||||
// Iterate the img area to be updated
|
// Iterate the img area to be updated
|
||||||
@ -979,6 +978,7 @@ void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float
|
|||||||
|
|
||||||
if (alpha_palette) {
|
if (alpha_palette) {
|
||||||
uint32_t temp_alpha = (alpha * alpha_palette[result_pixel]) >> 8;
|
uint32_t temp_alpha = (alpha * alpha_palette[result_pixel]) >> 8;
|
||||||
|
|
||||||
va = __PKHBT((128 - temp_alpha), temp_alpha, 16);
|
va = __PKHBT((128 - temp_alpha), temp_alpha, 16);
|
||||||
}
|
}
|
||||||
result_pixel = color_palette ? color_palette[result_pixel] : safe_map_pixel(IMAGE_BPP_RGB565, other_bpp, result_pixel);
|
result_pixel = color_palette ? color_palette[result_pixel] : safe_map_pixel(IMAGE_BPP_RGB565, other_bpp, result_pixel);
|
||||||
|
|||||||
@ -1142,9 +1142,9 @@ typedef struct find_barcodes_list_lnk_data {
|
|||||||
} find_barcodes_list_lnk_data_t;
|
} find_barcodes_list_lnk_data_t;
|
||||||
|
|
||||||
typedef enum image_hint {
|
typedef enum image_hint {
|
||||||
INTERPOLATE_BILINEAR = 1,
|
IMAGE_HINT_BILINEAR = 1,
|
||||||
IMAGE_CENTER = 128
|
IMAGE_HINT_CENTER = 128
|
||||||
} image_hint_type;
|
} image_hint_t;
|
||||||
|
|
||||||
|
|
||||||
/* Color space functions */
|
/* Color space functions */
|
||||||
@ -1290,7 +1290,7 @@ void imlib_draw_ellipse(image_t *img, int cx, int cy, int rx, int ry, int rotati
|
|||||||
void imlib_draw_string(image_t *img, int x_off, int y_off, const char *str, int c, float scale, int x_spacing, int y_spacing, bool mono_space,
|
void imlib_draw_string(image_t *img, int x_off, int y_off, const char *str, int c, float scale, int x_spacing, int y_spacing, bool mono_space,
|
||||||
int char_rotation, bool char_hmirror, bool char_vflip, int string_rotation, bool string_hmirror, bool string_hflip);
|
int char_rotation, bool char_hmirror, bool char_vflip, int string_rotation, bool string_hmirror, bool string_hflip);
|
||||||
void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float x_scale, float y_scale, int alpha, image_t *mask,
|
void imlib_draw_image(image_t *img, image_t *other, int x_off, int y_off, float x_scale, float y_scale, int alpha, image_t *mask,
|
||||||
const uint16_t *color_palette, const uint8_t *alpha_palette, image_hint_type hint);
|
const uint16_t *color_palette, const uint8_t *alpha_palette, image_hint_t hint);
|
||||||
void imlib_flood_fill(image_t *img, int x, int y,
|
void imlib_flood_fill(image_t *img, int x, int y,
|
||||||
float seed_threshold, float floating_threshold,
|
float seed_threshold, float floating_threshold,
|
||||||
int c, bool invert, bool clear_background, image_t *mask);
|
int c, bool invert, bool clear_background, image_t *mask);
|
||||||
|
|||||||
@ -1977,7 +1977,7 @@ STATIC mp_obj_t py_image_draw_image(uint n_args, const mp_obj_t *args, mp_map_t
|
|||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Palettes must be used with color images!"));
|
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Palettes must be used with color images!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
image_hint_type hint =
|
image_hint_t hint =
|
||||||
py_helper_keyword_int(n_args, args, offset + 6, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_hint), 0);
|
py_helper_keyword_int(n_args, args, offset + 6, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_hint), 0);
|
||||||
|
|
||||||
if (hint && arg_msk) {
|
if (hint && arg_msk) {
|
||||||
@ -7625,8 +7625,8 @@ static const mp_rom_map_elem_t globals_dict_table[] = {
|
|||||||
{MP_ROM_QSTR(MP_QSTR_CODE93), MP_ROM_INT(BARCODE_CODE93)},
|
{MP_ROM_QSTR(MP_QSTR_CODE93), MP_ROM_INT(BARCODE_CODE93)},
|
||||||
{MP_ROM_QSTR(MP_QSTR_CODE128), MP_ROM_INT(BARCODE_CODE128)},
|
{MP_ROM_QSTR(MP_QSTR_CODE128), MP_ROM_INT(BARCODE_CODE128)},
|
||||||
#endif
|
#endif
|
||||||
{MP_ROM_QSTR(MP_QSTR_INTERPOLATE_BILINEAR),MP_ROM_INT(INTERPOLATE_BILINEAR)},
|
{MP_ROM_QSTR(MP_QSTR_IMAGE_HINT_BILINEAR),MP_ROM_INT(IMAGE_HINT_BILINEAR)},
|
||||||
{MP_ROM_QSTR(MP_QSTR_IMAGE_CENTER), MP_ROM_INT(IMAGE_CENTER)},
|
{MP_ROM_QSTR(MP_QSTR_IMAGE_HINT_CENTER), MP_ROM_INT(IMAGE_HINT_CENTER)},
|
||||||
{MP_ROM_QSTR(MP_QSTR_ImageWriter), MP_ROM_PTR(&py_image_imagewriter_obj)},
|
{MP_ROM_QSTR(MP_QSTR_ImageWriter), MP_ROM_PTR(&py_image_imagewriter_obj)},
|
||||||
{MP_ROM_QSTR(MP_QSTR_ImageReader), MP_ROM_PTR(&py_image_imagereader_obj)},
|
{MP_ROM_QSTR(MP_QSTR_ImageReader), MP_ROM_PTR(&py_image_imagereader_obj)},
|
||||||
{MP_ROM_QSTR(MP_QSTR_binary_to_grayscale), MP_ROM_PTR(&py_image_binary_to_grayscale_obj)},
|
{MP_ROM_QSTR(MP_QSTR_binary_to_grayscale), MP_ROM_PTR(&py_image_binary_to_grayscale_obj)},
|
||||||
|
|||||||
@ -553,8 +553,8 @@ Q(draw_image)
|
|||||||
Q(alpha)
|
Q(alpha)
|
||||||
// duplicate Q(mask)
|
// duplicate Q(mask)
|
||||||
Q(hint)
|
Q(hint)
|
||||||
Q(INTERPOLATE_BILINEAR)
|
Q(IMAGE_HINT_BILINEAR)
|
||||||
Q(IMAGE_CENTER)
|
Q(IMAGE_HINT_CENTER)
|
||||||
|
|
||||||
// Draw Keypoints
|
// Draw Keypoints
|
||||||
Q(draw_keypoints)
|
Q(draw_keypoints)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user