diff options
| author | [email protected] <[email protected]> | 2011-01-31 00:02:45 +0000 |
|---|---|---|
| committer | [email protected] <[email protected]> | 2011-01-31 00:02:45 +0000 |
| commit | 7cca94e5a335274b63dcd92bbbe1640f7614844b (patch) | |
| tree | c9c689c56ca0466f7c90e0c7ac57def876860847 /components/rtgui | |
| parent | a6d0f9b9422e59dbf9d692638f968f7ffeaf9c30 (diff) | |
add image related building script.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1267 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/rtgui')
| -rw-r--r-- | components/rtgui/SConscript | 2 | ||||
| -rw-r--r-- | components/rtgui/common/image_bmp.c | 1152 | ||||
| -rw-r--r-- | components/rtgui/common/image_jpg.c | 2 | ||||
| -rw-r--r-- | components/rtgui/common/image_png.c | 2 | ||||
| -rw-r--r-- | components/rtgui/common/jpeg/SConscript | 38 | ||||
| -rw-r--r-- | components/rtgui/common/libpng/SConscript | 28 | ||||
| -rw-r--r-- | components/rtgui/common/libz/SConscript | 23 | ||||
| -rw-r--r-- | components/rtgui/include/rtgui/rtgui_config.h | 4 |
8 files changed, 672 insertions, 579 deletions
diff --git a/components/rtgui/SConscript b/components/rtgui/SConscript index 9c210bcd10..aa55d2ecd4 100644 --- a/components/rtgui/SConscript +++ b/components/rtgui/SConscript @@ -18,6 +18,8 @@ common/image.c common/image_xpm.c
common/image_hdc.c
common/image_bmp.c
+common/image_png.c
+common/image_jpg.c
common/image_container.c
common/font.c
common/font_bmp.c
diff --git a/components/rtgui/common/image_bmp.c b/components/rtgui/common/image_bmp.c index 838a2f9915..f68dd507e6 100644 --- a/components/rtgui/common/image_bmp.c +++ b/components/rtgui/common/image_bmp.c @@ -1,553 +1,554 @@ -#include <rtthread.h> -#include <rtgui/dc_hw.h> -#include <rtgui/image.h> -#include <rtgui/rtgui_system.h> -#include <rtgui/image_bmp.h> -#include <rtgui/blit.h> - -/* Compression encodings for BMP files */ -#ifndef BI_RGB -#define BI_RGB 0 -#define BI_RLE8 1 -#define BI_RLE4 2 -#define BI_BITFIELDS 3 -#endif - -#define hw_driver (rtgui_graphic_driver_get_default()) - -struct rtgui_image_bmp -{ - rt_bool_t is_loaded; - - rt_uint32_t Rmask; - rt_uint32_t Gmask; - rt_uint32_t Bmask; - - rt_size_t pixel_offset; - - rt_uint8_t byte_per_pixel; - rt_uint8_t pad; - rt_uint8_t ExpandBMP; - - rt_uint8_t *pixels; - rt_uint8_t *line_pixels; - rt_uint32_t pitch; - - struct rtgui_filerw* filerw; -}; - -struct rtgui_image_bmp_header -{ - /* The Win32 BMP file header (14 bytes) */ - char magic[2]; - rt_uint32_t bfSize; - rt_uint16_t bfReserved1; - rt_uint16_t bfReserved2; - rt_uint32_t bfOffBits; - - /* The Win32 BITMAPINFOHEADER struct (40 bytes) */ - rt_uint32_t biSize; - rt_int32_t biWidth; - rt_int32_t biHeight; - rt_uint16_t biPlanes; - rt_uint16_t biBitCount; - rt_uint32_t biCompression; - rt_uint32_t biSizeImage; - rt_int32_t biXPelsPerMeter; - rt_int32_t biYPelsPerMeter; - rt_uint32_t biClrUsed; - rt_uint32_t biClrImportant; -}; - -static rt_bool_t rtgui_image_bmp_check(struct rtgui_filerw* file); -static rt_bool_t rtgui_image_bmp_load(struct rtgui_image* image, struct rtgui_filerw* file, rt_bool_t load); -static void rtgui_image_bmp_unload(struct rtgui_image* image); -static void rtgui_image_bmp_blit(struct rtgui_image* image, struct rtgui_dc* dc, struct rtgui_rect* rect); - -struct rtgui_image_engine rtgui_image_bmp_engine = -{ - "bmp", - { RT_NULL }, - rtgui_image_bmp_check, - rtgui_image_bmp_load, - rtgui_image_bmp_unload, - rtgui_image_bmp_blit -}; - -rt_inline rt_uint32_t rtgui_filerw_read32(struct rtgui_filerw* src) -{ - rt_uint32_t value; - rtgui_filerw_read(src, &value, (sizeof value), 1); - return value; -} - -rt_inline rt_uint16_t rtgui_filerw_read16(struct rtgui_filerw* src) -{ - rt_uint16_t value; - rtgui_filerw_read(src, &value, (sizeof value), 1); - return value; - -} - -static rt_bool_t rtgui_image_bmp_check(struct rtgui_filerw* file) -{ - char magic[2]; - rt_bool_t is_bmp; - rt_off_t start; - - if ( !file ) return 0; - - start = rtgui_filerw_tell(file); - - /* move to the beginning of file */ - rtgui_filerw_seek(file, 0, RTGUI_FILE_SEEK_SET); - - is_bmp = RT_FALSE; - if ( rtgui_filerw_read(file, magic, 1, sizeof(magic)) == sizeof(magic) ) - { - if (magic[0] == 'B' && - magic[1] == 'M') - { - is_bmp = RT_TRUE; - } - } - - rtgui_filerw_seek(file, start, RTGUI_FILE_SEEK_SET); - - return(is_bmp); -} - -static struct rtgui_image_palette* rtgui_image_bmp_load_palette(struct rtgui_image_bmp_header* header, struct rtgui_filerw* src) -{ - /* Load the palette, if any */ - rt_size_t i; - struct rtgui_image_palette* palette; - - if (header->biClrUsed == 0) - header->biClrUsed = 1 << header->biBitCount; - - palette = rtgui_image_palette_create(header->biClrUsed); - if (palette == RT_NULL) return RT_NULL; - - if ( header->biSize == 12 ) - { - rt_uint8_t r, g, b; - for ( i = 0; i < (int)header->biClrUsed; ++i ) - { - rtgui_filerw_read(src, &b, 1, 1); - rtgui_filerw_read(src, &g, 1, 1); - rtgui_filerw_read(src, &r, 1, 1); - palette->colors[i] = RTGUI_RGB(r, g, b); - } - } - else - { - rt_uint8_t r, g, b, a; - for ( i = 0; i < (int)header->biClrUsed; ++i ) - { - rtgui_filerw_read(src, &b, 1, 1); - rtgui_filerw_read(src, &g, 1, 1); - rtgui_filerw_read(src, &r, 1, 1); - rtgui_filerw_read(src, &a, 1, 1); - palette->colors[i] = RTGUI_ARGB(a, r, g, b); - } - } - - return palette; -} - -static rt_bool_t rtgui_image_bmp_load(struct rtgui_image* image, struct rtgui_filerw* src, rt_bool_t load) -{ - rt_uint32_t Rmask; - rt_uint32_t Gmask; - rt_uint32_t Bmask; - int ExpandBMP, bmpPitch; - struct rtgui_image_bmp* bmp; - struct rtgui_image_bmp_header* header; - struct rtgui_image_palette* palette; - - bmp = RT_NULL; - header = RT_NULL; - palette = RT_NULL; - header = (struct rtgui_image_bmp_header*) rtgui_malloc(sizeof(struct rtgui_image_bmp_header)); - if (header == RT_NULL) return RT_FALSE; - - if ( rtgui_filerw_read(src, header->magic, 1, sizeof(header->magic)) == - sizeof(sizeof(header->magic)) ) - { - if (header->magic[0] != 'B' || - header->magic[1] != 'M') - { - goto __exit; - } - } - - header->bfSize = rtgui_filerw_read32(src); - header->bfReserved1 = rtgui_filerw_read16(src); - header->bfReserved2 = rtgui_filerw_read16(src); - header->bfOffBits = rtgui_filerw_read32(src); - - /* Read the Win32 BITMAPINFOHEADER */ - header->biSize = rtgui_filerw_read32(src); - if ( header->biSize == 12 ) - { - header->biWidth = (rt_uint32_t)rtgui_filerw_read16(src); - header->biHeight = (rt_uint32_t)rtgui_filerw_read16(src); - header->biPlanes = rtgui_filerw_read16(src); - header->biBitCount = rtgui_filerw_read16(src); - header->biCompression = BI_RGB; - header->biSizeImage = 0; - header->biXPelsPerMeter = 0; - header->biYPelsPerMeter = 0; - header->biClrUsed = 0; - - header->biClrImportant = 0; - - } - else - { - header->biWidth = rtgui_filerw_read32(src); - header->biHeight = rtgui_filerw_read32(src); - header->biPlanes = rtgui_filerw_read16(src); - header->biBitCount = rtgui_filerw_read16(src); - header->biCompression = rtgui_filerw_read32(src); - header->biSizeImage = rtgui_filerw_read32(src); - header->biXPelsPerMeter = rtgui_filerw_read32(src); - header->biYPelsPerMeter = rtgui_filerw_read32(src); - header->biClrUsed = rtgui_filerw_read32(src); - header->biClrImportant = rtgui_filerw_read32(src); - - } - - /* allocate palette and expand 1 and 4 bit bitmaps to 8 bits per pixel */ - switch (header->biBitCount) - { - case 1: - ExpandBMP = header->biBitCount; - palette = rtgui_image_bmp_load_palette(header, src); - header->biBitCount = 8; - break; - - case 4: - ExpandBMP = header->biBitCount; - palette = rtgui_image_bmp_load_palette(header, src); - header->biBitCount = 8; - break; - - case 8: - palette = rtgui_image_bmp_load_palette(header, src); - ExpandBMP = 0; - break; - - default: - ExpandBMP = 0; - break; - } - - /* We don't support any BMP compression right now */ - Rmask = Gmask = Bmask = 0; - switch (header->biCompression) - { - case BI_RGB: - /* If there are no masks, use the defaults */ - if ( header->bfOffBits == (14 + header->biSize) ) - { - /* Default values for the BMP format */ - switch (header->biBitCount) - { - case 15: - case 16: - Rmask = 0x7C00; - Gmask = 0x03E0; - Bmask = 0x001F; - break; - - case 24: - case 32: - Rmask = 0x00FF0000; - Gmask = 0x0000FF00; - Bmask = 0x000000FF; - break; - - default: - break; - } - break; - } - /* Fall through -- read the RGB masks */ - - case BI_BITFIELDS: - switch (header->biBitCount) - { - case 15: - case 16: - case 32: - Rmask = rtgui_filerw_read32(src); - Gmask = rtgui_filerw_read32(src); - Bmask = rtgui_filerw_read32(src); - break; - - default: - break; - } - break; - - default: - rt_kprintf("Compressed BMP files not supported\n"); - goto __exit; - } - - bmp = (struct rtgui_image_bmp*) rtgui_malloc(sizeof(struct rtgui_image_bmp)); - if (bmp == RT_NULL) - goto __exit; - - /* set image information */ - image->w = header->biWidth; - image->h = header->biHeight; - image->engine = &rtgui_image_bmp_engine; - image->data = bmp; - bmp->filerw = src; - bmp->byte_per_pixel = header->biBitCount/8; - bmp->pitch = image->w * bmp->byte_per_pixel; - bmp->pixel_offset = header->bfOffBits; - bmp->Rmask = Rmask; bmp->Gmask = Gmask; bmp->Bmask = Bmask; - bmp->ExpandBMP = ExpandBMP; - if (palette != RT_NULL) image->palette = palette; - - /* get padding */ - switch (ExpandBMP) - { - case 1: - bmpPitch = (header->biWidth + 7) >> 3; - bmp->pad = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0); - break; - - case 4: - bmpPitch = (header->biWidth + 1) >> 1; - bmp->pad = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0); - break; - - default: - bmp->pad = ((bmp->pitch%4) ? (4-(bmp->pitch%4)) : 0); - break; - } - - if (load == RT_TRUE) - { - rt_uint8_t *bits; - rt_uint32_t i; - - /* load all pixels */ - bmp->pixels = rtgui_malloc(image->h * bmp->pitch); - if (bmp->pixels == RT_NULL) - goto __exit; - - /* Read the pixels. Note that the bmp image is upside down */ - if ( rtgui_filerw_seek(src, bmp->pixel_offset, RTGUI_FILE_SEEK_SET) < 0) - goto __exit; - - bits = bmp->pixels + image->h * bmp->pitch; - while ( bits > bmp->pixels ) - { - bits -= bmp->pitch; - switch (ExpandBMP) - { - case 1: - case 4: - { - rt_uint8_t pixel = 0; - int shift = (8 - ExpandBMP); - for ( i=0; i < image->w; ++i ) - { - if ( i % (8/ExpandBMP) == 0 ) - { - if ( !rtgui_filerw_read(src, &pixel, 1, 1) ) - goto __exit; - - } - *(bits+i) = (pixel>>shift); - pixel <<= ExpandBMP; - } - } - break; - - default: - if ( rtgui_filerw_read(src, bits, 1, bmp->pitch) != bmp->pitch ) goto __exit; - break; - } - - /* Skip padding bytes */ - if ( bmp->pad ) - { - rt_uint8_t padbyte; - for ( i=0; i < bmp->pad; ++i ) - { - rtgui_filerw_read(src, &padbyte, 1, 1); - } - } - } - - rtgui_filerw_close(bmp->filerw); - bmp->line_pixels = RT_NULL; - bmp->filerw = RT_NULL; - bmp->pixel_offset = 0; - } - else - { - bmp->pixels = RT_NULL; - bmp->line_pixels = rtgui_malloc(bmp->pitch); - } - - return RT_TRUE; - -__exit: - rtgui_free(header); - if (palette != RT_NULL) - { - rtgui_free(palette); - image->palette = RT_NULL; - } - - if (bmp != RT_NULL) - rtgui_free(bmp->pixels); - rtgui_free(bmp); - return RT_FALSE; -} - -static void rtgui_image_bmp_unload(struct rtgui_image* image) -{ - struct rtgui_image_bmp* bmp; - - if (image != RT_NULL) - { - bmp = (struct rtgui_image_bmp*) image->data; - - if (bmp->pixels != RT_NULL) rtgui_free(bmp->pixels); - if (bmp->line_pixels != RT_NULL) rtgui_free(bmp->line_pixels); - if (bmp->filerw != RT_NULL) - { - rtgui_filerw_close(bmp->filerw); - bmp->filerw = RT_NULL; - } - - /* release data */ - rtgui_free(bmp); - } -} - -static void rtgui_image_bmp_blit(struct rtgui_image* image, struct rtgui_dc* dc, struct rtgui_rect* dst_rect) -{ - int y; - rt_uint16_t w, h; - struct rtgui_image_bmp* bmp; - - RT_ASSERT(image != RT_NULL || dc != RT_NULL || dst_rect != RT_NULL); - - /* this dc is not visible */ - if (rtgui_dc_get_visible(dc) != RT_TRUE) return; - - bmp = (struct rtgui_image_bmp*) image->data; - RT_ASSERT(bmp != RT_NULL); - - /* the minimum rect */ - if (image->w < rtgui_rect_width(*dst_rect)) w = image->w; - else w = rtgui_rect_width(*dst_rect); - if (image->h < rtgui_rect_height(*dst_rect)) h = image->h; - else h = rtgui_rect_height(*dst_rect); - - if (bmp->pixels != RT_NULL) - { - rt_uint8_t* ptr; - - /* get pixel pointer */ - ptr = bmp->pixels; - if (bmp->byte_per_pixel == hw_driver->byte_per_pixel) - { - for (y = 0; y < h; y ++) - { - dc->engine->blit_line(dc, - dst_rect->x1, dst_rect->x1 + w, - dst_rect->y1 + y, - ptr); - ptr += bmp->pitch; - } - } - else - { - rt_size_t pitch; - rt_uint8_t *line_ptr; - - if (image->palette == RT_NULL) - { - rtgui_blit_line_func blit_line; - line_ptr = (rt_uint8_t*) rtgui_malloc(hw_driver->byte_per_pixel * w); - blit_line = rtgui_blit_line_get(hw_driver->byte_per_pixel , bmp->byte_per_pixel); - pitch = w * bmp->byte_per_pixel; - if (line_ptr != RT_NULL) - { - for (y = 0; y < h; y ++) - { - blit_line(line_ptr, ptr, pitch); - dc->engine->blit_line(dc, - dst_rect->x1, dst_rect->x1 + w, - dst_rect->y1 + y, - line_ptr); - ptr += bmp->pitch; - } - } - rtgui_free(line_ptr); - } - else - { - int x; - rtgui_color_t color; - - /* use palette */ - for (y = 0; y < h; y ++) - { - ptr = bmp->pixels + (y * bmp->pitch); - for (x = 0; x < w; x ++) - { - color = image->palette->colors[*ptr]; ptr ++; - rtgui_dc_draw_color_point(dc, dst_rect->x1 + x, dst_rect->y1 + y, color); - } - } - } - } - } - else - { - int offset; +#include <rtthread.h>
+#include <rtgui/dc_hw.h>
+#include <rtgui/image.h>
+#include <rtgui/rtgui_system.h>
+#include <rtgui/image_bmp.h>
+#include <rtgui/blit.h>
+
+#ifdef RTGUI_IMAGE_BMP
+/* Compression encodings for BMP files */
+#ifndef BI_RGB
+#define BI_RGB 0
+#define BI_RLE8 1
+#define BI_RLE4 2
+#define BI_BITFIELDS 3
+#endif
+
+#define hw_driver (rtgui_graphic_driver_get_default())
+
+struct rtgui_image_bmp
+{
+ rt_bool_t is_loaded;
+
+ rt_uint32_t Rmask;
+ rt_uint32_t Gmask;
+ rt_uint32_t Bmask;
+
+ rt_size_t pixel_offset;
+
+ rt_uint8_t byte_per_pixel;
+ rt_uint8_t pad;
+ rt_uint8_t ExpandBMP;
+
+ rt_uint8_t *pixels;
+ rt_uint8_t *line_pixels;
+ rt_uint32_t pitch;
+
+ struct rtgui_filerw* filerw;
+};
+
+struct rtgui_image_bmp_header
+{
+ /* The Win32 BMP file header (14 bytes) */
+ char magic[2];
+ rt_uint32_t bfSize;
+ rt_uint16_t bfReserved1;
+ rt_uint16_t bfReserved2;
+ rt_uint32_t bfOffBits;
+
+ /* The Win32 BITMAPINFOHEADER struct (40 bytes) */
+ rt_uint32_t biSize;
+ rt_int32_t biWidth;
+ rt_int32_t biHeight;
+ rt_uint16_t biPlanes;
+ rt_uint16_t biBitCount;
+ rt_uint32_t biCompression;
+ rt_uint32_t biSizeImage;
+ rt_int32_t biXPelsPerMeter;
+ rt_int32_t biYPelsPerMeter;
+ rt_uint32_t biClrUsed;
+ rt_uint32_t biClrImportant;
+};
+
+static rt_bool_t rtgui_image_bmp_check(struct rtgui_filerw* file);
+static rt_bool_t rtgui_image_bmp_load(struct rtgui_image* image, struct rtgui_filerw* file, rt_bool_t load);
+static void rtgui_image_bmp_unload(struct rtgui_image* image);
+static void rtgui_image_bmp_blit(struct rtgui_image* image, struct rtgui_dc* dc, struct rtgui_rect* rect);
+
+struct rtgui_image_engine rtgui_image_bmp_engine =
+{
+ "bmp",
+ { RT_NULL },
+ rtgui_image_bmp_check,
+ rtgui_image_bmp_load,
+ rtgui_image_bmp_unload,
+ rtgui_image_bmp_blit
+};
+
+rt_inline rt_uint32_t rtgui_filerw_read32(struct rtgui_filerw* src)
+{
+ rt_uint32_t value;
+ rtgui_filerw_read(src, &value, (sizeof value), 1);
+ return value;
+}
+
+rt_inline rt_uint16_t rtgui_filerw_read16(struct rtgui_filerw* src)
+{
+ rt_uint16_t value;
+ rtgui_filerw_read(src, &value, (sizeof value), 1);
+ return value;
+
+}
+
+static rt_bool_t rtgui_image_bmp_check(struct rtgui_filerw* file)
+{
+ char magic[2];
+ rt_bool_t is_bmp;
+ rt_off_t start;
+
+ if ( !file ) return 0;
+
+ start = rtgui_filerw_tell(file);
+
+ /* move to the beginning of file */
+ rtgui_filerw_seek(file, 0, RTGUI_FILE_SEEK_SET);
+
+ is_bmp = RT_FALSE;
+ if ( rtgui_filerw_read(file, magic, 1, sizeof(magic)) == sizeof(magic) )
+ {
+ if (magic[0] == 'B' &&
+ magic[1] == 'M')
+ {
+ is_bmp = RT_TRUE;
+ }
+ }
+
+ rtgui_filerw_seek(file, start, RTGUI_FILE_SEEK_SET);
+
+ return(is_bmp);
+}
+
+static struct rtgui_image_palette* rtgui_image_bmp_load_palette(struct rtgui_image_bmp_header* header, struct rtgui_filerw* src)
+{
+ /* Load the palette, if any */
+ rt_size_t i;
+ struct rtgui_image_palette* palette;
+
+ if (header->biClrUsed == 0)
+ header->biClrUsed = 1 << header->biBitCount;
+
+ palette = rtgui_image_palette_create(header->biClrUsed);
+ if (palette == RT_NULL) return RT_NULL;
+
+ if ( header->biSize == 12 )
+ {
+ rt_uint8_t r, g, b;
+ for ( i = 0; i < (int)header->biClrUsed; ++i )
+ {
+ rtgui_filerw_read(src, &b, 1, 1);
+ rtgui_filerw_read(src, &g, 1, 1);
+ rtgui_filerw_read(src, &r, 1, 1);
+ palette->colors[i] = RTGUI_RGB(r, g, b);
+ }
+ }
+ else
+ {
+ rt_uint8_t r, g, b, a;
+ for ( i = 0; i < (int)header->biClrUsed; ++i )
+ {
+ rtgui_filerw_read(src, &b, 1, 1);
+ rtgui_filerw_read(src, &g, 1, 1);
+ rtgui_filerw_read(src, &r, 1, 1);
+ rtgui_filerw_read(src, &a, 1, 1);
+ palette->colors[i] = RTGUI_ARGB(a, r, g, b);
+ }
+ }
+
+ return palette;
+}
+
+static rt_bool_t rtgui_image_bmp_load(struct rtgui_image* image, struct rtgui_filerw* src, rt_bool_t load)
+{
+ rt_uint32_t Rmask;
+ rt_uint32_t Gmask;
+ rt_uint32_t Bmask;
+ int ExpandBMP, bmpPitch;
+ struct rtgui_image_bmp* bmp;
+ struct rtgui_image_bmp_header* header;
+ struct rtgui_image_palette* palette;
+
+ bmp = RT_NULL;
+ header = RT_NULL;
+ palette = RT_NULL;
+ header = (struct rtgui_image_bmp_header*) rtgui_malloc(sizeof(struct rtgui_image_bmp_header));
+ if (header == RT_NULL) return RT_FALSE;
+
+ if ( rtgui_filerw_read(src, header->magic, 1, sizeof(header->magic)) ==
+ sizeof(sizeof(header->magic)) )
+ {
+ if (header->magic[0] != 'B' ||
+ header->magic[1] != 'M')
+ {
+ goto __exit;
+ }
+ }
+
+ header->bfSize = rtgui_filerw_read32(src);
+ header->bfReserved1 = rtgui_filerw_read16(src);
+ header->bfReserved2 = rtgui_filerw_read16(src);
+ header->bfOffBits = rtgui_filerw_read32(src);
+
+ /* Read the Win32 BITMAPINFOHEADER */
+ header->biSize = rtgui_filerw_read32(src);
+ if ( header->biSize == 12 )
+ {
+ header->biWidth = (rt_uint32_t)rtgui_filerw_read16(src);
+ header->biHeight = (rt_uint32_t)rtgui_filerw_read16(src);
+ header->biPlanes = rtgui_filerw_read16(src);
+ header->biBitCount = rtgui_filerw_read16(src);
+ header->biCompression = BI_RGB;
+ header->biSizeImage = 0;
+ header->biXPelsPerMeter = 0;
+ header->biYPelsPerMeter = 0;
+ header->biClrUsed = 0;
+
+ header->biClrImportant = 0;
+
+ }
+ else
+ {
+ header->biWidth = rtgui_filerw_read32(src);
+ header->biHeight = rtgui_filerw_read32(src);
+ header->biPlanes = rtgui_filerw_read16(src);
+ header->biBitCount = rtgui_filerw_read16(src);
+ header->biCompression = rtgui_filerw_read32(src);
+ header->biSizeImage = rtgui_filerw_read32(src);
+ header->biXPelsPerMeter = rtgui_filerw_read32(src);
+ header->biYPelsPerMeter = rtgui_filerw_read32(src);
+ header->biClrUsed = rtgui_filerw_read32(src);
+ header->biClrImportant = rtgui_filerw_read32(src);
+
+ }
+
+ /* allocate palette and expand 1 and 4 bit bitmaps to 8 bits per pixel */
+ switch (header->biBitCount)
+ {
+ case 1:
+ ExpandBMP = header->biBitCount;
+ palette = rtgui_image_bmp_load_palette(header, src);
+ header->biBitCount = 8;
+ break;
+
+ case 4:
+ ExpandBMP = header->biBitCount;
+ palette = rtgui_image_bmp_load_palette(header, src);
+ header->biBitCount = 8;
+ break;
+
+ case 8:
+ palette = rtgui_image_bmp_load_palette(header, src);
+ ExpandBMP = 0;
+ break;
+
+ default:
+ ExpandBMP = 0;
+ break;
+ }
+
+ /* We don't support any BMP compression right now */
+ Rmask = Gmask = Bmask = 0;
+ switch (header->biCompression)
+ {
+ case BI_RGB:
+ /* If there are no masks, use the defaults */
+ if ( header->bfOffBits == (14 + header->biSize) )
+ {
+ /* Default values for the BMP format */
+ switch (header->biBitCount)
+ {
+ case 15:
+ case 16:
+ Rmask = 0x7C00;
+ Gmask = 0x03E0;
+ Bmask = 0x001F;
+ break;
+
+ case 24:
+ case 32:
+ Rmask = 0x00FF0000;
+ Gmask = 0x0000FF00;
+ Bmask = 0x000000FF;
+ break;
+
+ default:
+ break;
+ }
+ break;
+ }
+ /* Fall through -- read the RGB masks */
+
+ case BI_BITFIELDS:
+ switch (header->biBitCount)
+ {
+ case 15:
+ case 16:
+ case 32:
+ Rmask = rtgui_filerw_read32(src);
+ Gmask = rtgui_filerw_read32(src);
+ Bmask = rtgui_filerw_read32(src);
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ rt_kprintf("Compressed BMP files not supported\n");
+ goto __exit;
+ }
+
+ bmp = (struct rtgui_image_bmp*) rtgui_malloc(sizeof(struct rtgui_image_bmp));
+ if (bmp == RT_NULL)
+ goto __exit;
+
+ /* set image information */
+ image->w = header->biWidth;
+ image->h = header->biHeight;
+ image->engine = &rtgui_image_bmp_engine;
+ image->data = bmp;
+ bmp->filerw = src;
+ bmp->byte_per_pixel = header->biBitCount/8;
+ bmp->pitch = image->w * bmp->byte_per_pixel;
+ bmp->pixel_offset = header->bfOffBits;
+ bmp->Rmask = Rmask; bmp->Gmask = Gmask; bmp->Bmask = Bmask;
+ bmp->ExpandBMP = ExpandBMP;
+ if (palette != RT_NULL) image->palette = palette;
+
+ /* get padding */
+ switch (ExpandBMP)
+ {
+ case 1:
+ bmpPitch = (header->biWidth + 7) >> 3;
+ bmp->pad = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0);
+ break;
+
+ case 4:
+ bmpPitch = (header->biWidth + 1) >> 1;
+ bmp->pad = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0);
+ break;
+
+ default:
+ bmp->pad = ((bmp->pitch%4) ? (4-(bmp->pitch%4)) : 0);
+ break;
+ }
+
+ if (load == RT_TRUE)
+ {
rt_uint8_t *bits;
- - /* calculate offset */ - switch (bmp->ExpandBMP) - { - case 1: - offset = (image->h - h) * (image->w/8) * bmp->byte_per_pixel; - break; - - case 4: - offset = (image->h - h) * (image->w/2) * bmp->byte_per_pixel; - break; - - default: - offset = (image->h - h) * image->w * bmp->byte_per_pixel; - break; - } - /* seek to the begin of pixel data */ - rtgui_filerw_seek(bmp->filerw, bmp->pixel_offset + offset, RTGUI_FILE_SEEK_SET); - - if (bmp->ExpandBMP == 1 || bmp->ExpandBMP == 4) - { + rt_uint32_t i;
+
+ /* load all pixels */
+ bmp->pixels = rtgui_malloc(image->h * bmp->pitch);
+ if (bmp->pixels == RT_NULL)
+ goto __exit;
+
+ /* Read the pixels. Note that the bmp image is upside down */
+ if ( rtgui_filerw_seek(src, bmp->pixel_offset, RTGUI_FILE_SEEK_SET) < 0)
+ goto __exit;
+
+ bits = bmp->pixels + image->h * bmp->pitch;
+ while ( bits > bmp->pixels )
+ {
+ bits -= bmp->pitch;
+ switch (ExpandBMP)
+ {
+ case 1:
+ case 4:
+ {
+ rt_uint8_t pixel = 0;
+ int shift = (8 - ExpandBMP);
+ for ( i=0; i < image->w; ++i )
+ {
+ if ( i % (8/ExpandBMP) == 0 )
+ {
+ if ( !rtgui_filerw_read(src, &pixel, 1, 1) )
+ goto __exit;
+
+ }
+ *(bits+i) = (pixel>>shift);
+ pixel <<= ExpandBMP;
+ }
+ }
+ break;
+
+ default:
+ if ( rtgui_filerw_read(src, bits, 1, bmp->pitch) != bmp->pitch ) goto __exit;
+ break;
+ }
+
+ /* Skip padding bytes */
+ if ( bmp->pad )
+ {
+ rt_uint8_t padbyte;
+ for ( i=0; i < bmp->pad; ++i )
+ {
+ rtgui_filerw_read(src, &padbyte, 1, 1);
+ }
+ }
+ }
+
+ rtgui_filerw_close(bmp->filerw);
+ bmp->line_pixels = RT_NULL;
+ bmp->filerw = RT_NULL;
+ bmp->pixel_offset = 0;
+ }
+ else
+ {
+ bmp->pixels = RT_NULL;
+ bmp->line_pixels = rtgui_malloc(bmp->pitch);
+ }
+
+ return RT_TRUE;
+
+__exit:
+ rtgui_free(header);
+ if (palette != RT_NULL)
+ {
+ rtgui_free(palette);
+ image->palette = RT_NULL;
+ }
+
+ if (bmp != RT_NULL)
+ rtgui_free(bmp->pixels);
+ rtgui_free(bmp);
+ return RT_FALSE;
+}
+
+static void rtgui_image_bmp_unload(struct rtgui_image* image)
+{
+ struct rtgui_image_bmp* bmp;
+
+ if (image != RT_NULL)
+ {
+ bmp = (struct rtgui_image_bmp*) image->data;
+
+ if (bmp->pixels != RT_NULL) rtgui_free(bmp->pixels);
+ if (bmp->line_pixels != RT_NULL) rtgui_free(bmp->line_pixels);
+ if (bmp->filerw != RT_NULL)
+ {
+ rtgui_filerw_close(bmp->filerw);
+ bmp->filerw = RT_NULL;
+ }
+
+ /* release data */
+ rtgui_free(bmp);
+ }
+}
+
+static void rtgui_image_bmp_blit(struct rtgui_image* image, struct rtgui_dc* dc, struct rtgui_rect* dst_rect)
+{
+ int y;
+ rt_uint16_t w, h;
+ struct rtgui_image_bmp* bmp;
+
+ RT_ASSERT(image != RT_NULL || dc != RT_NULL || dst_rect != RT_NULL);
+
+ /* this dc is not visible */
+ if (rtgui_dc_get_visible(dc) != RT_TRUE) return;
+
+ bmp = (struct rtgui_image_bmp*) image->data;
+ RT_ASSERT(bmp != RT_NULL);
+
+ /* the minimum rect */
+ if (image->w < rtgui_rect_width(*dst_rect)) w = image->w;
+ else w = rtgui_rect_width(*dst_rect);
+ if (image->h < rtgui_rect_height(*dst_rect)) h = image->h;
+ else h = rtgui_rect_height(*dst_rect);
+
+ if (bmp->pixels != RT_NULL)
+ {
+ rt_uint8_t* ptr;
+
+ /* get pixel pointer */
+ ptr = bmp->pixels;
+ if (bmp->byte_per_pixel == hw_driver->byte_per_pixel)
+ {
+ for (y = 0; y < h; y ++)
+ {
+ dc->engine->blit_line(dc,
+ dst_rect->x1, dst_rect->x1 + w,
+ dst_rect->y1 + y,
+ ptr);
+ ptr += bmp->pitch;
+ }
+ }
+ else
+ {
+ rt_size_t pitch;
+ rt_uint8_t *line_ptr;
+
+ if (image->palette == RT_NULL)
+ {
+ rtgui_blit_line_func blit_line;
+ line_ptr = (rt_uint8_t*) rtgui_malloc(hw_driver->byte_per_pixel * w);
+ blit_line = rtgui_blit_line_get(hw_driver->byte_per_pixel , bmp->byte_per_pixel);
+ pitch = w * bmp->byte_per_pixel;
+ if (line_ptr != RT_NULL)
+ {
+ for (y = 0; y < h; y ++)
+ {
+ blit_line(line_ptr, ptr, pitch);
+ dc->engine->blit_line(dc,
+ dst_rect->x1, dst_rect->x1 + w,
+ dst_rect->y1 + y,
+ line_ptr);
+ ptr += bmp->pitch;
+ }
+ }
+ rtgui_free(line_ptr);
+ }
+ else
+ {
+ int x;
+ rtgui_color_t color;
+
+ /* use palette */
+ for (y = 0; y < h; y ++)
+ {
+ ptr = bmp->pixels + (y * bmp->pitch);
+ for (x = 0; x < w; x ++)
+ {
+ color = image->palette->colors[*ptr]; ptr ++;
+ rtgui_dc_draw_color_point(dc, dst_rect->x1 + x, dst_rect->y1 + y, color);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ int offset;
+ rt_uint8_t *bits;
+
+ /* calculate offset */
+ switch (bmp->ExpandBMP)
+ {
+ case 1:
+ offset = (image->h - h) * (image->w/8) * bmp->byte_per_pixel;
+ break;
+
+ case 4:
+ offset = (image->h - h) * (image->w/2) * bmp->byte_per_pixel;
+ break;
+
+ default:
+ offset = (image->h - h) * image->w * bmp->byte_per_pixel;
+ break;
+ }
+ /* seek to the begin of pixel data */
+ rtgui_filerw_seek(bmp->filerw, bmp->pixel_offset + offset, RTGUI_FILE_SEEK_SET);
+
+ if (bmp->ExpandBMP == 1 || bmp->ExpandBMP == 4)
+ {
int x;
rtgui_color_t color;
- /* 1, 4 bit per pixels */ - - /* draw each line */ - for (y = h - 1; y >= 0; y --) - { - /* read pixel data */ + /* 1, 4 bit per pixels */
+
+ /* draw each line */
+ for (y = h - 1; y >= 0; y --)
+ {
+ /* read pixel data */
rt_uint8_t pixel = 0;
int shift = (8 - bmp->ExpandBMP);
int i;
@@ -581,17 +582,17 @@ static void rtgui_image_bmp_blit(struct rtgui_image* image, struct rtgui_dc* dc, rtgui_dc_draw_color_point(dc, dst_rect->x1 + x, dst_rect->y1 + y, color);
}
}
- } - else - { + }
+ else
+ {
rt_uint8_t *line_ptr = (rt_uint8_t*) rtgui_malloc(hw_driver->byte_per_pixel * w);
if (line_ptr == RT_NULL) return;
- /* draw each line */ - for (y = h - 1; y >= 0; y --) - { - /* read line pixels */ - rtgui_filerw_read(bmp->filerw, bmp->line_pixels, 1, bmp->pitch); + /* draw each line */
+ for (y = h - 1; y >= 0; y --)
+ {
+ /* read line pixels */
+ rtgui_filerw_read(bmp->filerw, bmp->line_pixels, 1, bmp->pitch);
/* Skip padding bytes */
if (bmp->pad)
@@ -601,10 +602,10 @@ static void rtgui_image_bmp_blit(struct rtgui_image* image, struct rtgui_dc* dc, for ( i=0; i < bmp->pad; ++i )
rtgui_filerw_read(bmp->filerw, &padbyte, 1, 1);
}
- - if (image->palette == RT_NULL) - { - int pitch; +
+ if (image->palette == RT_NULL)
+ {
+ int pitch;
rtgui_blit_line_func blit_line;
blit_line = rtgui_blit_line_get(hw_driver->byte_per_pixel , bmp->byte_per_pixel);
pitch = w * bmp->byte_per_pixel;
@@ -616,9 +617,9 @@ static void rtgui_image_bmp_blit(struct rtgui_image* image, struct rtgui_dc* dc, dst_rect->y1 + y,
line_ptr);
}
- } - else - { + }
+ else
+ {
int x;
rtgui_color_t color;
@@ -628,16 +629,17 @@ static void rtgui_image_bmp_blit(struct rtgui_image* image, struct rtgui_dc* dc, {
color = image->palette->colors[*bits]; bits ++;
rtgui_dc_draw_color_point(dc, dst_rect->x1 + x, dst_rect->y1 + y, color);
- } - } - } - if (line_ptr != RT_NULL) rtgui_free(line_ptr); - } - } -} - -void rtgui_image_bmp_init() -{ - /* register bmp on image system */ - rtgui_image_register_engine(&rtgui_image_bmp_engine); -} + }
+ }
+ }
+ if (line_ptr != RT_NULL) rtgui_free(line_ptr);
+ }
+ }
+}
+
+void rtgui_image_bmp_init()
+{
+ /* register bmp on image system */
+ rtgui_image_register_engine(&rtgui_image_bmp_engine);
+}
+#endif
diff --git a/components/rtgui/common/image_jpg.c b/components/rtgui/common/image_jpg.c index 9146559230..c445c6a14f 100644 --- a/components/rtgui/common/image_jpg.c +++ b/components/rtgui/common/image_jpg.c @@ -1,7 +1,7 @@ #include <rtthread.h> #include <rtgui/rtgui.h> -#ifdef RTGUI_USING_JPEG +#ifdef RTGUI_IMAGE_JPEG #include <stdio.h> #include <stdlib.h> #include "jpeg/jpeglib.h" diff --git a/components/rtgui/common/image_png.c b/components/rtgui/common/image_png.c index bb6e1b4bf8..0c63e80cf8 100644 --- a/components/rtgui/common/image_png.c +++ b/components/rtgui/common/image_png.c @@ -1,7 +1,7 @@ #include <rtthread.h> #include <rtgui/rtgui_system.h> -#ifdef RTGUI_USING_PNG +#ifdef RTGUI_IMAGE_PNG #include "libpng/png.h" #include <rtgui/image_png.h> diff --git a/components/rtgui/common/jpeg/SConscript b/components/rtgui/common/jpeg/SConscript new file mode 100644 index 0000000000..72ead4f3d0 --- /dev/null +++ b/components/rtgui/common/jpeg/SConscript @@ -0,0 +1,38 @@ +Import('RTT_ROOT')
+Import('rtconfig')
+from building import *
+
+src = Split('''
+jaricom.c
+jcomapi.c
+jutils.c
+jerror.c
+jmemmgr.c
+jdapimin.c
+jdapistd.c
+jdarith.c
+jdtrans.c
+jdatasrc.c
+jdmaster.c
+jdinput.c
+jdmarker.c
+jdhuff.c
+jdmainct.c
+jdcoefct.c
+jdpostct.c
+jddctmgr.c
+jidctfst.c
+jidctflt.c
+jidctint.c
+jdsample.c
+jdcolor.c
+jquant1.c
+jquant2.c
+jdmerge.c
+jmemnobs.c
+''')
+CPPPATH = [RTT_ROOT + '/components/rtgui/common/jpeg']
+
+group = DefineGroup('jpeg', src, depend = ['RTGUI_IMAGE_JPEG'], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/components/rtgui/common/libpng/SConscript b/components/rtgui/common/libpng/SConscript new file mode 100644 index 0000000000..74c369c071 --- /dev/null +++ b/components/rtgui/common/libpng/SConscript @@ -0,0 +1,28 @@ +Import('RTT_ROOT')
+Import('rtconfig')
+from building import *
+
+src = Split('''
+png.c
+pngerror.c
+pnggccrd.c
+pngget.c
+pngmem.c
+pngpread.c
+pngread.c
+pngrio.c
+pngrtran.c
+pngrutil.c
+pngset.c
+pngtrans.c
+pngvcrd.c
+pngwio.c
+pngwrite.c
+pngwtran.c
+pngwutil.c
+''')
+CPPPATH = [RTT_ROOT + '/components/rtgui/common/libpng']
+
+group = DefineGroup('libpng', src, depend = ['RTGUI_IMAGE_PNG'], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/components/rtgui/common/libz/SConscript b/components/rtgui/common/libz/SConscript new file mode 100644 index 0000000000..4c763df343 --- /dev/null +++ b/components/rtgui/common/libz/SConscript @@ -0,0 +1,23 @@ +Import('RTT_ROOT')
+Import('rtconfig')
+from building import *
+
+src = Split('''
+adler32.c
+compress.c
+crc32.c
+deflate.c
+gzio.c
+infback.c
+inffast.c
+inflate.c
+inftrees.c
+trees.c
+uncompr.c
+zutil.c
+''')
+CPPPATH = [RTT_ROOT + '/components/rtgui/common/libz']
+
+group = DefineGroup('libz', src, depend = ['RTGUI_IMAGE_PNG'], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/components/rtgui/include/rtgui/rtgui_config.h b/components/rtgui/include/rtgui/rtgui_config.h index 84c9c819f5..2bd82a7b74 100644 --- a/components/rtgui/include/rtgui/rtgui_config.h +++ b/components/rtgui/include/rtgui/rtgui_config.h @@ -38,8 +38,8 @@ #define RTGUI_IMAGE_CONTAINER
#define RTGUI_IMAGE_XPM
#define RTGUI_IMAGE_BMP
- // #define RTGUI_IMAGE_PNG
- // #define RTGUI_IMAGE_JPEG
+ #define RTGUI_IMAGE_PNG
+ #define RTGUI_IMAGE_JPEG
#define RTGUI_USING_FONT12
#define RTGUI_USING_HZ_BMP
#define RTGUI_MEM_TRACE
|
