1
0
mirror of https://github.com/azure-rtos/guix.git synced 2025-01-28 07:03:11 +08:00
guix/test/example_internal/all_widgets_1bpp/image_convert_screen.c
Ting Zhu 0e6fdbf5ab
Add GUIX regression tests. (#68)
Add GUIX regression tests.
2023-11-16 15:56:54 +08:00

179 lines
4.9 KiB
C

/* This is a small demo of the high-performance GUIX graphics framework. */
#include <stdio.h>
#include "gx_api.h"
#include "all_widgets_1bpp_resources.h"
#include "all_widgets_1bpp_specifications.h"
extern VOID memory_free(VOID *mem);
GX_PIXELMAP pixelmap_memory[2];
GX_PIXELMAP *png_to_1bpp_map = GX_NULL;
GX_PIXELMAP *jpeg_to_1bpp_map = GX_NULL;
GX_IMAGE_READER image_reader;
GX_UBYTE image_reader_mode = GX_IMAGE_READER_MODE_ALPHA | GX_IMAGE_READER_MODE_COMPRESS |GX_IMAGE_READER_MODE_DITHER;
/* Convert png/jpeg 1bpp format pixelmap. */
void png_jpeg_to_1bpp_convert()
{
GX_PIXELMAP *pixelmap;
png_to_1bpp_map = &pixelmap_memory[0];
jpeg_to_1bpp_map = &pixelmap_memory[1];
gx_widget_pixelmap_get((GX_WIDGET *)&image_convert_screen.image_convert_screen_png_to_1bpp_win,
GX_PIXELMAP_ID_RED_APPLE_PNG, &pixelmap);
gx_image_reader_create(&image_reader,
pixelmap->gx_pixelmap_data,
pixelmap->gx_pixelmap_data_size,
GX_COLOR_FORMAT_MONOCHROME, image_reader_mode);
if (gx_image_reader_start(&image_reader, png_to_1bpp_map) != GX_SUCCESS)
{
png_to_1bpp_map = GX_NULL;
}
gx_widget_pixelmap_get((GX_WIDGET *)&image_convert_screen.image_convert_screen_jpeg_to_1bpp_win,
GX_PIXELMAP_ID_ICON_FOOT_JPEG, &pixelmap);
gx_image_reader_create(&image_reader,
pixelmap->gx_pixelmap_data,
pixelmap->gx_pixelmap_data_size,
GX_COLOR_FORMAT_MONOCHROME, image_reader_mode);
if (gx_image_reader_start(&image_reader, jpeg_to_1bpp_map) != GX_SUCCESS)
{
jpeg_to_1bpp_map = GX_NULL;
}
}
/* Cleanup converted pixlemap. */
void cleanup_output_pixelmaps()
{
if (png_to_1bpp_map)
{
if (png_to_1bpp_map->gx_pixelmap_data)
{
memory_free((VOID *)png_to_1bpp_map->gx_pixelmap_data);
png_to_1bpp_map->gx_pixelmap_data = GX_NULL;
}
if (png_to_1bpp_map->gx_pixelmap_aux_data)
{
memory_free((VOID *)png_to_1bpp_map->gx_pixelmap_aux_data);
png_to_1bpp_map->gx_pixelmap_aux_data = GX_NULL;
}
png_to_1bpp_map = GX_NULL;
}
if (jpeg_to_1bpp_map)
{
if (jpeg_to_1bpp_map->gx_pixelmap_data)
{
memory_free((VOID *)jpeg_to_1bpp_map->gx_pixelmap_data);
jpeg_to_1bpp_map->gx_pixelmap_data = GX_NULL;
}
if (jpeg_to_1bpp_map->gx_pixelmap_aux_data)
{
memory_free((VOID *)jpeg_to_1bpp_map->gx_pixelmap_aux_data);
jpeg_to_1bpp_map->gx_pixelmap_aux_data = GX_NULL;
}
jpeg_to_1bpp_map = GX_NULL;
}
}
void convert_start()
{
cleanup_output_pixelmaps();
png_jpeg_to_1bpp_convert();
gx_system_dirty_mark((GX_WIDGET *)&image_convert_screen.image_convert_screen_png_to_1bpp_win);
gx_system_dirty_mark((GX_WIDGET *)&image_convert_screen.image_convert_screen_jpeg_to_1bpp_win);
}
UINT image_convert_screen_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
{
switch (event_ptr->gx_event_type)
{
case GX_EVENT_SHOW:
gx_window_event_process(window, event_ptr);
png_jpeg_to_1bpp_convert();
break;
case GX_EVENT_HIDE:
gx_window_event_process(window, event_ptr);
cleanup_output_pixelmaps();
break;
case GX_SIGNAL(ID_ALPHA, GX_EVENT_TOGGLE_ON):
image_reader_mode |= GX_IMAGE_READER_MODE_ALPHA;
convert_start();
break;
case GX_SIGNAL(ID_ALPHA, GX_EVENT_TOGGLE_OFF):
image_reader_mode &= ~GX_IMAGE_READER_MODE_ALPHA;
convert_start();
break;
case GX_SIGNAL(ID_COMPRESSED, GX_EVENT_TOGGLE_ON):
image_reader_mode |= GX_IMAGE_READER_MODE_COMPRESS;
convert_start();
break;
case GX_SIGNAL(ID_COMPRESSED, GX_EVENT_TOGGLE_OFF):
image_reader_mode &= ~GX_IMAGE_READER_MODE_COMPRESS;
convert_start();
break;
case GX_SIGNAL(ID_DITHER, GX_EVENT_TOGGLE_ON):
image_reader_mode |= GX_IMAGE_READER_MODE_DITHER;
convert_start();
break;
case GX_SIGNAL(ID_DITHER, GX_EVENT_TOGGLE_OFF):
image_reader_mode &= ~GX_IMAGE_READER_MODE_DITHER;
convert_start();
break;
default:
return next_button_handler(window, event_ptr);
}
return GX_SUCCESS;
}
VOID png_to_1bpp_win_draw(GX_WINDOW *window)
{
int xpos;
int ypos;
gx_widget_background_draw(window);
if (png_to_1bpp_map)
{
xpos = window->gx_window_client.gx_rectangle_left + 10;
ypos = window->gx_widget_clip.gx_rectangle_top + 10;
gx_canvas_pixelmap_draw(xpos, ypos, png_to_1bpp_map);
}
}
VOID jpeg_to_1bpp_win_draw(GX_WINDOW *window)
{
int xpos;
int ypos;
gx_widget_background_draw(window);
if (jpeg_to_1bpp_map)
{
xpos = window->gx_window_client.gx_rectangle_left + 10;
ypos = window->gx_widget_clip.gx_rectangle_top + 10;
gx_canvas_pixelmap_draw(xpos, ypos, jpeg_to_1bpp_map);
}
}