diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2004-09-04 16:41:28 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2004-09-04 16:41:28 +0000 |
commit | 101c87958dfeb769c697136d221a2a1c63929e65 (patch) | |
tree | 99108a4a5c4b182ca9d385a9fa0330a9a6e3ea03 /riscos | |
parent | e223757e3504586f8c260991b81f8f62c3b75ffc (diff) | |
download | netsurf-101c87958dfeb769c697136d221a2a1c63929e65.tar.gz netsurf-101c87958dfeb769c697136d221a2a1c63929e65.tar.bz2 |
[project @ 2004-09-04 16:41:28 by jmb]
Fix jpeg redraw
Move png.c/h to /image and rework to use the bitmap code
Make RISC OS bitmap struct publically accessible (via riscos/bitmap.h)
Draw export now embeds JPEGs and PNGs/MNGs/JNGs correctly again.
Background images are now plotted correctly again.
svn path=/import/netsurf/; revision=1268
Diffstat (limited to 'riscos')
-rw-r--r-- | riscos/bitmap.c | 6 | ||||
-rw-r--r-- | riscos/bitmap.h | 17 | ||||
-rw-r--r-- | riscos/htmlredraw.c | 17 | ||||
-rw-r--r-- | riscos/png.c | 278 | ||||
-rw-r--r-- | riscos/png.h | 33 | ||||
-rw-r--r-- | riscos/save_draw.c | 26 |
6 files changed, 46 insertions, 331 deletions
diff --git a/riscos/bitmap.c b/riscos/bitmap.c index 2b705b8d4..892aed3b6 100644 --- a/riscos/bitmap.c +++ b/riscos/bitmap.c @@ -18,16 +18,12 @@ #include "oslib/osspriteop.h"
#include "netsurf/content/content.h"
#include "netsurf/image/bitmap.h"
+#include "netsurf/riscos/bitmap.h"
#include "netsurf/riscos/image.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/utils.h"
-struct bitmap {
- osspriteop_area sprite_area;
-};
-
-
/**
* Create a bitmap.
*
diff --git a/riscos/bitmap.h b/riscos/bitmap.h new file mode 100644 index 000000000..4c8545cb4 --- /dev/null +++ b/riscos/bitmap.h @@ -0,0 +1,17 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2004 James Bursa <bursa@users.sourceforge.net> + */ + +#ifndef _NETSURF_RISCOS_BITMAP_H_ +#define _NETSURF_RISCOS_BITMAP_H_ + +struct osspriteop_area; + +struct bitmap { + osspriteop_area sprite_area; +}; + +#endif diff --git a/riscos/htmlredraw.c b/riscos/htmlredraw.c index 20d50fb5f..6dfc0b220 100644 --- a/riscos/htmlredraw.c +++ b/riscos/htmlredraw.c @@ -25,6 +25,7 @@ #include "netsurf/render/font.h" #include "netsurf/render/form.h" #include "netsurf/render/html.h" +#include "netsurf/riscos/bitmap.h" #include "netsurf/riscos/gui.h" #include "netsurf/riscos/image.h" #include "netsurf/riscos/options.h" @@ -1010,38 +1011,38 @@ bool html_redraw_background(int xi, int yi, int width, int height, /* and plot the image */ switch (box->background->type) { #ifdef WITH_PNG - case CONTENT_PNG:/* - image_redraw(box->background->data.png.sprite_area, + case CONTENT_PNG: + image_redraw(&box->background->bitmap->sprite_area, x, y, image_width, image_height, box->background->width * 2, box->background->height * 2, background_colour, repeat_x, repeat_y, - IMAGE_PLOT_TINCT_ALPHA);*/ + IMAGE_PLOT_TINCT_ALPHA); break; #endif #ifdef WITH_MNG case CONTENT_JNG: case CONTENT_MNG: - /*image_redraw(box->background->data.mng.sprite_area, + image_redraw(&box->background->bitmap->sprite_area, x, y, image_width, image_height, box->background->width * 2, box->background->height * 2, background_colour, repeat_x, repeat_y, - IMAGE_PLOT_TINCT_ALPHA);*/ + IMAGE_PLOT_TINCT_ALPHA); break; #endif #ifdef WITH_JPEG - case CONTENT_JPEG:/* - image_redraw(box->background->data.jpeg.sprite_area, + case CONTENT_JPEG: + image_redraw(&box->background->bitmap->sprite_area, x, y, image_width, image_height, box->background->width * 2, box->background->height * 2, background_colour, repeat_x, repeat_y, IMAGE_PLOT_TINCT_OPAQUE); - */break; + break; #endif #ifdef WITH_GIF case CONTENT_GIF: diff --git a/riscos/png.c b/riscos/png.c deleted file mode 100644 index 8d6ae8265..000000000 --- a/riscos/png.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - * This file is part of NetSurf, http://netsurf.sourceforge.net/ - * Licensed under the GNU General Public License, - * http://www.opensource.org/licenses/gpl-license - * Copyright 2004 James Bursa <bursa@users.sourceforge.net> - * Copyright 2004 Richard Wilson <not_ginger_matt@hotmail.com> - */ - -#include <assert.h> -#include <stdbool.h> -#include <string.h> -#include <stdlib.h> -#include "libpng/png.h" -#include "oslib/osspriteop.h" -#include "netsurf/utils/config.h" -#include "netsurf/content/content.h" -#include "netsurf/riscos/gui.h" -#include "netsurf/riscos/image.h" -#include "netsurf/riscos/options.h" -#include "netsurf/riscos/png.h" -#include "netsurf/utils/log.h" -#include "netsurf/utils/messages.h" -#include "netsurf/utils/utils.h" - -#ifdef WITH_PNG -/* libpng uses names starting png_, so use nspng_ here to avoid clashes */ - -static void info_callback(png_structp png, png_infop info); -static void row_callback(png_structp png, png_bytep new_row, - png_uint_32 row_num, int pass); -static void end_callback(png_structp png, png_infop info); - - -bool nspng_create(struct content *c, const char *params[]) -{ - union content_msg_data msg_data; - - c->data.png.sprite_area = 0; - c->data.png.png = png_create_read_struct(PNG_LIBPNG_VER_STRING, - 0, 0, 0); - if (!c->data.png.png) { - msg_data.error = messages_get("NoMemory"); - content_broadcast(c, CONTENT_MSG_ERROR, msg_data); - warn_user("NoMemory", 0); - return false; - } - c->data.png.info = png_create_info_struct(c->data.png.png); - if (!c->data.png.info) { - png_destroy_read_struct(&c->data.png.png, - &c->data.png.info, 0); - - msg_data.error = messages_get("NoMemory"); - content_broadcast(c, CONTENT_MSG_ERROR, msg_data); - warn_user("NoMemory", 0); - return false; - } - - if (setjmp(png_jmpbuf(c->data.png.png))) { - png_destroy_read_struct(&c->data.png.png, - &c->data.png.info, 0); - LOG(("Failed to set callbacks")); - c->data.png.png = NULL; - c->data.png.info = NULL; - - msg_data.error = messages_get("PNGError"); - content_broadcast(c, CONTENT_MSG_ERROR, msg_data); - return false; - } - - png_set_progressive_read_fn(c->data.png.png, c, - info_callback, row_callback, end_callback); - - return true; -} - - -bool nspng_process_data(struct content *c, char *data, unsigned int size) -{ - union content_msg_data msg_data; - - if (setjmp(png_jmpbuf(c->data.png.png))) { - png_destroy_read_struct(&c->data.png.png, - &c->data.png.info, 0); - LOG(("Failed to process data")); - c->data.png.png = NULL; - c->data.png.info = NULL; - - msg_data.error = messages_get("PNGError"); - content_broadcast(c, CONTENT_MSG_ERROR, msg_data); - return false; - } - - png_process_data(c->data.png.png, c->data.png.info, data, size); - - return true; -} - - -/** - * info_callback -- PNG header has been completely received, prepare to process - * image data - */ - -void info_callback(png_structp png, png_infop info) -{ - int bit_depth, color_type, interlace, intent; - double gamma; - unsigned int rowbytes, sprite_size; - unsigned long width, height; - struct content *c = png_get_progressive_ptr(png); - osspriteop_area *sprite_area; - osspriteop_header *sprite; - - /* Read the PNG details - */ - png_get_IHDR(png, info, &width, &height, &bit_depth, - &color_type, &interlace, 0, 0); - - /* Claim the required memory for the converted PNG - */ - sprite_size = sizeof(*sprite_area) + sizeof(*sprite) + (height * width * 4); - sprite_area = xcalloc(sprite_size, 1); - - /* Fill in the sprite area header information - */ - sprite_area->size = sprite_size; - sprite_area->sprite_count = 1; - sprite_area->first = sizeof(*sprite_area); - sprite_area->used = sprite_size; - - /* Fill in the sprite header information - */ - sprite = (osspriteop_header *) (sprite_area + 1); - sprite->size = sprite_size - sizeof(*sprite_area); - memset(sprite->name, 0x00, 12); - strcpy(sprite->name, "png"); - sprite->width = width - 1; - sprite->height = height - 1; - sprite->left_bit = 0; - sprite->right_bit = 31; - sprite->mask = sprite->image = sizeof(*sprite); - sprite->mode = (os_mode) 0x301680b5; - - /* Store the sprite area - */ - c->data.png.sprite_area = sprite_area; - - /* Set up our transformations - */ - if (color_type == PNG_COLOR_TYPE_PALETTE) - png_set_palette_to_rgb(png); - if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) - png_set_gray_1_2_4_to_8(png); - if (png_get_valid(png, info, PNG_INFO_tRNS)) - png_set_tRNS_to_alpha(png); - if (bit_depth == 16) - png_set_strip_16(png); - if (color_type == PNG_COLOR_TYPE_GRAY || - color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb(png); - if (!(color_type & PNG_COLOR_MASK_ALPHA)) - png_set_filler(png, 0xff, PNG_FILLER_AFTER); - /* gamma correction - we use 2.2 as our screen gamma - * this appears to be correct (at least in respect to !Browse) - * see http://www.w3.org/Graphics/PNG/all_seven.html for a test case - */ - if (png_get_sRGB(png, info, &intent)) - png_set_gamma(png, 2.2, 0.45455); - else { - if (png_get_gAMA(png, info, &gamma)) - png_set_gamma(png, 2.2, gamma); - else - png_set_gamma(png, 2.2, 0.45455); - } - - - png_read_update_info(png, info); - - c->data.png.rowbytes = rowbytes = png_get_rowbytes(png, info); - c->data.png.interlace = (interlace == PNG_INTERLACE_ADAM7); - c->data.png.sprite_image = ((char *) sprite) + sprite->image; - c->width = width; - c->height = height; - - LOG(("size %li * %li, bpp %i, rowbytes %u", width, - height, bit_depth, rowbytes)); -} - - -static unsigned int interlace_start[8] = {0, 16, 0, 8, 0, 4, 0}; -static unsigned int interlace_step[8] = {28, 28, 12, 12, 4, 4, 0}; -static unsigned int interlace_row_start[8] = {0, 0, 4, 0, 2, 0, 1}; -static unsigned int interlace_row_step[8] = {8, 8, 8, 4, 4, 2, 2}; - -void row_callback(png_structp png, png_bytep new_row, - png_uint_32 row_num, int pass) -{ - struct content *c = png_get_progressive_ptr(png); - unsigned long i, j, rowbytes = c->data.png.rowbytes; - unsigned int start, step; - char *row = c->data.png.sprite_image + row_num * (c->width * 4); - - /* Abort if we've not got any data - */ - if (new_row == 0) - return; - - /* Handle interlaced sprites using the Adam7 algorithm - */ - if (c->data.png.interlace) { - start = interlace_start[pass]; - step = interlace_step[pass]; - row_num = interlace_row_start[pass] + - interlace_row_step[pass] * row_num; - - /* Copy the data to our current row taking into consideration interlacing - */ - row = c->data.png.sprite_image + row_num * (c->width * 4); - for (j = 0, i = start; i < rowbytes; i += step) { - row[i++] = new_row[j++]; - row[i++] = new_row[j++]; - row[i++] = new_row[j++]; - row[i++] = new_row[j++]; - } - } else { - /* Do a fast memcpy of the row data - */ - memcpy(row, new_row, rowbytes); - } -} - - -void end_callback(png_structp png, png_infop info) -{ - /*struct content *c = png_get_progressive_ptr(png);*/ - - LOG(("PNG end")); - - /*xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.png.sprite_area, - "png");*/ -} - - - -bool nspng_convert(struct content *c, int width, int height) -{ - assert(c->data.png.png); - assert(c->data.png.info); - - png_destroy_read_struct(&c->data.png.png, &c->data.png.info, 0); - - c->title = malloc(100); - if (c->title) - snprintf(c->title, 100, messages_get("PNGTitle"), - c->width, c->height, c->source_size); - c->size += (c->width * c->height * 4) + 16 + 44 + 100; - c->status = CONTENT_STATUS_DONE; - return true; -} - - -void nspng_destroy(struct content *c) -{ - free(c->title); - free(c->data.png.sprite_area); -} - - -bool nspng_redraw(struct content *c, int x, int y, - int width, int height, - int clip_x0, int clip_y0, int clip_x1, int clip_y1, - float scale, unsigned long background_colour) -{ - return image_redraw(c->data.png.sprite_area, x, y, width, height, - c->width * 2, c->height * 2, background_colour, - false, false, IMAGE_PLOT_TINCT_ALPHA); -} -#endif diff --git a/riscos/png.h b/riscos/png.h deleted file mode 100644 index b9cc784c0..000000000 --- a/riscos/png.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of NetSurf, http://netsurf.sourceforge.net/ - * Licensed under the GNU General Public License, - * http://www.opensource.org/licenses/gpl-license - * Copyright 2003 James Bursa <bursa@users.sourceforge.net> - */ - -#ifndef _NETSURF_RISCOS_PNG_H_ -#define _NETSURF_RISCOS_PNG_H_ - -#include "libpng/png.h" -#include "oslib/osspriteop.h" - -struct content; - -struct content_png_data { - png_structp png; - png_infop info; - unsigned long rowbytes; - int interlace; - osspriteop_area *sprite_area; - char *sprite_image; -}; - -bool nspng_create(struct content *c, const char *params[]); -bool nspng_process_data(struct content *c, char *data, unsigned int size); -bool nspng_convert(struct content *c, int width, int height); -void nspng_destroy(struct content *c); -bool nspng_redraw(struct content *c, int x, int y, - int width, int height, - int clip_x0, int clip_y0, int clip_x1, int clip_y1, - float scale, unsigned long background_colour); -#endif diff --git a/riscos/save_draw.c b/riscos/save_draw.c index e00ad3350..297cc34d2 100644 --- a/riscos/save_draw.c +++ b/riscos/save_draw.c @@ -25,6 +25,7 @@ #include "netsurf/render/font.h" #include "netsurf/render/form.h" #include "netsurf/render/layout.h" +#include "netsurf/riscos/bitmap.h" #include "netsurf/riscos/save_draw.h" #include "netsurf/utils/log.h" #include "netsurf/utils/utils.h" @@ -595,7 +596,9 @@ static bool add_box(struct box *box, colour cbc, int x, int y) if (box->object) { switch (box->object->type) { +#ifdef WITH_JPEG case CONTENT_JPEG: +#endif #ifdef WITH_PNG case CONTENT_PNG: #endif @@ -603,7 +606,9 @@ static bool add_box(struct box *box, colour cbc, int x, int y) case CONTENT_JNG: case CONTENT_MNG: #endif +#ifdef WITH_GIF case CONTENT_GIF: +#endif #ifdef WITH_SPRITE case CONTENT_SPRITE: #endif @@ -702,24 +707,27 @@ static bool add_graphic(struct content *content, struct box *box, /* cast-tastic... */ switch (content->type) { +#ifdef WITH_JPEG case CONTENT_JPEG: - return true; - /*sprite_length = ((osspriteop_header*)((char*)content->data.jpeg.sprite_area+content->data.jpeg.sprite_area->first))->size;*/ + sprite_length = ((osspriteop_header*)((char*)&content->bitmap->sprite_area+content->bitmap->sprite_area.first))->size; break; +#endif #ifdef WITH_PNG case CONTENT_PNG: - /*sprite_length = ((osspriteop_header*)((char*)content->data.png.sprite_area+content->data.png.sprite_area->first))->size;*/ + sprite_length = ((osspriteop_header*)((char*)&content->bitmap->sprite_area+content->bitmap->sprite_area.first))->size; break; #endif #ifdef WITH_MNG case CONTENT_JNG: case CONTENT_MNG: - /*sprite_length = ((osspriteop_header*)((char*)content->data.mng.sprite_area+content->data.mng.sprite_area->first))->size;*/ + sprite_length = ((osspriteop_header*)((char*)&content->bitmap->sprite_area+content->bitmap->sprite_area.first))->size; break; #endif +#ifdef WITH_GIF case CONTENT_GIF: sprite_length = ((osspriteop_header*)((char*)content->data.gif.gif->frame_image+content->data.gif.gif->frame_image->first))->size; break; +#endif #ifdef WITH_SPRITE case CONTENT_SPRITE: sprite_length = ((osspriteop_header*)((char*)content->data.sprite.data+(((osspriteop_area*)content->data.sprite.data)->first)))->size; @@ -742,23 +750,27 @@ static bool add_graphic(struct content *content, struct box *box, ds->bbox.y1 = y; switch (content->type) { +#ifdef WITH_JPEG case CONTENT_JPEG: - /*memcpy((char*)ds+16, (char*)content->data.jpeg.sprite_area+content->data.jpeg.sprite_area->first, (unsigned)sprite_length);*/ + memcpy((char*)ds+16, (char*)&content->bitmap->sprite_area+content->bitmap->sprite_area.first, (unsigned)sprite_length); break; +#endif #ifdef WITH_PNG case CONTENT_PNG: - /*memcpy((char*)ds+16, (char*)content->data.png.sprite_area+content->data.png.sprite_area->first, (unsigned)sprite_length);*/ + memcpy((char*)ds+16, (char*)&content->bitmap->sprite_area+content->bitmap->sprite_area.first, (unsigned)sprite_length); break; #endif #ifdef WITH_MNG case CONTENT_JNG: case CONTENT_MNG: - /*memcpy((char*)ds+16, (char*)content->data.mng.sprite_area+content->data.mng.sprite_area->first, (unsigned)sprite_length);*/ + memcpy((char*)ds+16, (char*)&content->bitmap->sprite_area+content->bitmap->sprite_area.first, (unsigned)sprite_length); break; #endif +#ifdef WITH_GIF case CONTENT_GIF: memcpy((char*)ds+16, (char*)content->data.gif.gif->frame_image+content->data.gif.gif->frame_image->first, (unsigned)sprite_length); break; +#endif #ifdef WITH_SPRITE case CONTENT_SPRITE: memcpy((char*)ds+16, (char*)content->data.sprite.data+((osspriteop_area*)content->data.sprite.data)->first, (unsigned)sprite_length); |