summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2004-09-04 16:41:28 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2004-09-04 16:41:28 +0000
commit101c87958dfeb769c697136d221a2a1c63929e65 (patch)
tree99108a4a5c4b182ca9d385a9fa0330a9a6e3ea03 /riscos
parente223757e3504586f8c260991b81f8f62c3b75ffc (diff)
downloadnetsurf-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.c6
-rw-r--r--riscos/bitmap.h17
-rw-r--r--riscos/htmlredraw.c17
-rw-r--r--riscos/png.c278
-rw-r--r--riscos/png.h33
-rw-r--r--riscos/save_draw.c26
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);