summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/content.c23
-rw-r--r--content/content.h14
-rw-r--r--content/content_type.h4
-rw-r--r--desktop/browser.h5
-rw-r--r--gtk/gtk_bitmap.c131
-rw-r--r--gtk/gtk_gui.c4
-rw-r--r--gtk/gtk_window.c4
-rw-r--r--image/bitmap.h38
-rw-r--r--image/jpeg.c (renamed from riscos/jpeg.c)101
-rw-r--r--image/jpeg.h (renamed from riscos/jpeg.h)15
-rw-r--r--image/mng.c (renamed from riscos/mng.c)125
-rw-r--r--image/mng.h (renamed from riscos/mng.h)12
-rw-r--r--makefile26
-rw-r--r--riscos/gui.h3
-rw-r--r--riscos/htmlredraw.c14
-rw-r--r--riscos/save.c8
-rw-r--r--riscos/save_draw.c13
-rw-r--r--utils/config.h6
18 files changed, 349 insertions, 197 deletions
diff --git a/content/content.c b/content/content.c
index 4fd6c9b71..cf15364e7 100644
--- a/content/content.c
+++ b/content/content.c
@@ -22,17 +22,15 @@
#include "netsurf/content/fetch.h"
#include "netsurf/content/fetchcache.h"
#include "netsurf/css/css.h"
+#include "netsurf/image/bitmap.h"
#include "netsurf/desktop/options.h"
#include "netsurf/render/html.h"
#include "netsurf/render/textplain.h"
#ifdef WITH_JPEG
-#include "netsurf/riscos/jpeg.h"
-#endif
-#ifdef WITH_PNG
-#include "netsurf/riscos/png.h"
+#include "netsurf/image/jpeg.h"
#endif
#ifdef WITH_MNG
-#include "netsurf/riscos/mng.h"
+#include "netsurf/image/mng.h"
#endif
#ifdef WITH_GIF
#include "netsurf/riscos/gif.h"
@@ -82,7 +80,7 @@ static const struct mime_entry mime_map[] = {
#ifdef WITH_JPEG
{"image/pjpeg", CONTENT_JPEG},
#endif
-#ifdef WITH_PNG
+#ifdef WITH_MNG
{"image/png", CONTENT_PNG},
#endif
#ifdef WITH_DRAW
@@ -115,10 +113,8 @@ const char *content_type_name[] = {
#ifdef WITH_GIF
"GIF",
#endif
-#ifdef WITH_PNG
- "PNG",
-#endif
#ifdef WITH_MNG
+ "PNG",
"JNG",
"MNG",
#endif
@@ -173,18 +169,16 @@ static const struct handler_entry handler_map[] = {
0, 0, 0, 0, 0, 0, true},
{0, 0, css_convert, 0, css_destroy, 0, 0, 0, 0, false},
#ifdef WITH_JPEG
- {nsjpeg_create, 0, nsjpeg_convert,
- 0, nsjpeg_destroy, 0, nsjpeg_redraw, 0, 0, false},
+ {0, 0, nsjpeg_convert,
+ 0, nsjpeg_destroy, 0, bitmap_redraw, 0, 0, false},
#endif
#ifdef WITH_GIF
{nsgif_create, 0, nsgif_convert,
0, nsgif_destroy, 0, nsgif_redraw, 0, 0, false},
#endif
-#ifdef WITH_PNG
+#ifdef WITH_MNG
{nsmng_create, nsmng_process_data, nsmng_convert,
0, nsmng_destroy, 0, nsmng_redraw, 0, 0, false},
-#endif
-#ifdef WITH_MNG
{nsmng_create, nsmng_process_data, nsmng_convert,
0, nsmng_destroy, 0, nsmng_redraw, 0, 0, false},
{nsmng_create, nsmng_process_data, nsmng_convert,
@@ -270,6 +264,7 @@ struct content * content_create(const char *url)
c->width = 0;
c->height = 0;
c->available_width = 0;
+ c->bitmap = 0;
c->fresh = false;
c->size = sizeof(struct content);
c->title = 0;
diff --git a/content/content.h b/content/content.h
index 4a28eb442..19d60fe6e 100644
--- a/content/content.h
+++ b/content/content.h
@@ -102,7 +102,7 @@
#include "netsurf/css/css.h"
#include "netsurf/render/html.h"
#ifdef WITH_JPEG
-#include "netsurf/riscos/jpeg.h"
+#include "netsurf/image/jpeg.h"
#endif
#ifdef WITH_GIF
#include "netsurf/riscos/gif.h"
@@ -110,11 +110,8 @@
#ifdef WITH_PLUGIN
#include "netsurf/riscos/plugin.h"
#endif
-#ifdef WITH_PNG
-#include "netsurf/riscos/png.h"
-#endif
#ifdef WITH_MNG
-#include "netsurf/riscos/mng.h"
+#include "netsurf/image/mng.h"
#endif
#ifdef WITH_SPRITE
#include "netsurf/riscos/sprite.h"
@@ -124,6 +121,7 @@
#endif
+struct bitmap;
struct box;
struct browser_window;
struct content;
@@ -208,9 +206,6 @@ struct content {
#ifdef WITH_GIF
struct content_gif_data gif;
#endif
-#ifdef WITH_PNG
- struct content_png_data png;
-#endif
#ifdef WITH_MNG
struct content_mng_data mng;
#endif
@@ -225,6 +220,9 @@ struct content {
#endif
} data;
+ /** Bitmap, for various image contents. */
+ struct bitmap *bitmap;
+
/** This content may be given to new users. Indicates that the content
* was fetched using a simple GET, has not expired, and may be
* shared between users. */
diff --git a/content/content_type.h b/content/content_type.h
index 661a116a8..484a877a6 100644
--- a/content/content_type.h
+++ b/content/content_type.h
@@ -28,10 +28,8 @@ typedef enum {
#ifdef WITH_GIF
CONTENT_GIF,
#endif
-#ifdef WITH_PNG
- CONTENT_PNG,
-#endif
#ifdef WITH_MNG
+ CONTENT_PNG,
CONTENT_JNG,
CONTENT_MNG,
#endif
diff --git a/desktop/browser.h b/desktop/browser.h
index 51db1c8c6..ba0bd0e04 100644
--- a/desktop/browser.h
+++ b/desktop/browser.h
@@ -100,4 +100,9 @@ void history_forward(struct browser_window *bw, struct history *history);
bool history_back_available(struct history *history);
bool history_forward_available(struct history *history);
+/* In platform specific schedule.c. */
+void schedule(int t, void (*callback)(void *p), void *p);
+void schedule_remove(void (*callback)(void *p), void *p);
+void schedule_run(void);
+
#endif
diff --git a/gtk/gtk_bitmap.c b/gtk/gtk_bitmap.c
new file mode 100644
index 000000000..7aaedf075
--- /dev/null
+++ b/gtk/gtk_bitmap.c
@@ -0,0 +1,131 @@
+/*
+ * 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>
+ */
+
+/** \file
+ * Generic bitmap handling (GDK / GTK+ implementation).
+ *
+ * This implements the interface given by desktop/bitmap.h using GdkPixbufs.
+ */
+
+#include <assert.h>
+#include <stdbool.h>
+#include <string.h>
+#include <gdk/gdk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include "netsurf/content/content.h"
+#include "netsurf/image/bitmap.h"
+
+
+extern GdkDrawable *current_drawable;
+extern GdkGC *current_gc;
+
+
+struct bitmap;
+
+
+/**
+ * Create a bitmap.
+ *
+ * \param width width of image in pixels
+ * \param height width of image in pixels
+ * \return an opaque struct bitmap, or NULL on memory exhaustion
+ */
+
+struct bitmap *bitmap_create(int width, int height)
+{
+ GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8,
+ width, height);
+ return (struct bitmap *) pixbuf;
+}
+
+
+/**
+ * Return a pointer to the pixel data in a bitmap.
+ *
+ * \param bitmap a bitmap, as returned by bitmap_create()
+ * \return pointer to the pixel buffer
+ *
+ * The pixel data is packed as BITMAP_FORMAT, possibly with padding at the end
+ * of rows. The width of a row in bytes is given by bitmap_get_rowstride().
+ */
+
+char *bitmap_get_buffer(struct bitmap *bitmap)
+{
+ assert(bitmap);
+ return gdk_pixbuf_get_pixels((GdkPixbuf *) bitmap);
+}
+
+
+/**
+ * Find the width of a pixel row in bytes.
+ *
+ * \param bitmap a bitmap, as returned by bitmap_create()
+ * \return width of a pixel row in the bitmap
+ */
+
+size_t bitmap_get_rowstride(struct bitmap *bitmap)
+{
+ assert(bitmap);
+ return gdk_pixbuf_get_rowstride((GdkPixbuf *) bitmap);
+}
+
+
+/**
+ * Free a bitmap.
+ *
+ * \param bitmap a bitmap, as returned by bitmap_create()
+ */
+
+void bitmap_destroy(struct bitmap *bitmap)
+{
+ assert(bitmap);
+ g_object_unref((GdkPixbuf *) bitmap);
+}
+
+
+/**
+ * Render a bitmap.
+ */
+
+bool bitmap_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)
+{
+ GdkPixbuf *scaled;
+
+ scaled = gdk_pixbuf_scale_simple((GdkPixbuf *) c->bitmap,
+ width, height,
+ GDK_INTERP_BILINEAR);
+ if (!scaled)
+ return false;
+
+ gdk_draw_pixbuf(current_drawable, current_gc,
+ scaled,
+ 0, 0,
+ x, y,
+ width, height,
+ GDK_RGB_DITHER_NORMAL, 0, 0);
+
+ g_object_unref(scaled);
+
+ return true;
+}
+
+
+/**
+ * Save a bitmap in the platform's native format.
+ *
+ * \param bitmap a bitmap, as returned by bitmap_create()
+ * \param path pathname for file
+ * \return true on success, false on error and error reported
+ */
+
+bool bitmap_save(struct bitmap *bitmap, const char *path)
+{
+ return true;
+}
diff --git a/gtk/gtk_gui.c b/gtk/gtk_gui.c
index c249e1c25..291ea3b74 100644
--- a/gtk/gtk_gui.c
+++ b/gtk/gtk_gui.c
@@ -121,3 +121,7 @@ void history_forward(struct browser_window *bw, struct history *history) {}
void gui_401login_open(struct browser_window *bw, struct content *c,
char *realm) {}
+
+void schedule(int t, void (*callback)(void *p), void *p) {}
+void schedule_remove(void (*callback)(void *p), void *p) {}
+void schedule_run(void) {}
diff --git a/gtk/gtk_window.c b/gtk/gtk_window.c
index 8e336df5f..ded7a6514 100644
--- a/gtk/gtk_window.c
+++ b/gtk/gtk_window.c
@@ -34,8 +34,8 @@ struct gui_window {
struct browser_window *bw;
};
static GtkWidget *current_widget;
-static GdkDrawable *current_drawable;
-static GdkGC *current_gc;
+GdkDrawable *current_drawable;
+GdkGC *current_gc;
static gboolean gui_window_expose_event(GtkWidget *widget,
diff --git a/image/bitmap.h b/image/bitmap.h
new file mode 100644
index 000000000..052a3a4f4
--- /dev/null
+++ b/image/bitmap.h
@@ -0,0 +1,38 @@
+/*
+ * 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>
+ */
+
+/** \file
+ * Generic bitmap handling (interface).
+ *
+ * This interface wraps the native platform-specific image format, so that
+ * portable image convertors can be written.
+ *
+ * The bitmap format is either RGBA.
+ */
+
+#ifndef _NETSURF_IMAGE_BITMAP_H_
+#define _NETSURF_IMAGE_BITMAP_H_
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+struct content;
+
+/** An opaque image. */
+struct bitmap;
+
+struct bitmap *bitmap_create(int width, int height);
+char *bitmap_get_buffer(struct bitmap *bitmap);
+size_t bitmap_get_rowstride(struct bitmap *bitmap);
+void bitmap_destroy(struct bitmap *bitmap);
+bool bitmap_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);
+bool bitmap_save(struct bitmap *bitmap, const char *path);
+
+#endif
diff --git a/riscos/jpeg.c b/image/jpeg.c
index b355be37b..85711bd2e 100644
--- a/riscos/jpeg.c
+++ b/image/jpeg.c
@@ -13,27 +13,25 @@
*/
#include <assert.h>
+#include <setjmp.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define JPEG_INTERNAL_OPTIONS
#include "libjpeg/jpeglib.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/jpeg.h"
-#include "netsurf/riscos/options.h"
+#include "netsurf/image/bitmap.h"
+#include "netsurf/image/jpeg.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/utils.h"
-/* We require a the library to be configured with these options to save
+/* We prefer the library to be configured with these options to save
* copying data during decoding. */
#if RGB_RED != 0 || RGB_GREEN != 1 || RGB_BLUE != 2 || RGB_PIXELSIZE != 4
-#error JPEG library incorrectly configured.
+#warning JPEG library not optimally configured. Decoding will be slower.
#endif
@@ -54,17 +52,6 @@ static void nsjpeg_term_source(j_decompress_ptr cinfo);
/**
- * Create a CONTENT_JPEG.
- */
-
-bool nsjpeg_create(struct content *c, const char *params[])
-{
- c->data.jpeg.sprite_area = 0;
- return true;
-}
-
-
-/**
* Convert a CONTENT_JPEG for display.
*/
@@ -78,16 +65,17 @@ bool nsjpeg_convert(struct content *c, int w, int h)
nsjpeg_term_source };
unsigned int height;
unsigned int width;
- unsigned int area_size;
- osspriteop_area *sprite_area = 0;
- osspriteop_header *sprite;
+ struct bitmap *bitmap = NULL;
+ char *pixels;
+ size_t rowstride;
union content_msg_data msg_data;
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = nsjpeg_error_exit;
if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_decompress(&cinfo);
- free(sprite_area);
+ if (bitmap)
+ bitmap_destroy(bitmap);
msg_data.error = nsjpeg_error_buffer;
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
@@ -105,10 +93,8 @@ bool nsjpeg_convert(struct content *c, int w, int h)
width = cinfo.output_width;
height = cinfo.output_height;
- area_size = 16 + 44 + width * height * 4;
- sprite_area = malloc(area_size);
- if (!sprite_area) {
- LOG(("malloc failed"));
+ bitmap = bitmap_create(width, height);
+ if (!bitmap) {
jpeg_destroy_decompress(&cinfo);
msg_data.error = messages_get("NoMemory");
@@ -117,45 +103,40 @@ bool nsjpeg_convert(struct content *c, int w, int h)
return false;
}
- /* area control block */
- sprite_area->size = area_size;
- sprite_area->sprite_count = 1;
- sprite_area->first = 16;
- sprite_area->used = area_size;
-
- /* sprite control block */
- sprite = (osspriteop_header *) (sprite_area + 1);
- sprite->size = area_size - 16;
- memset(sprite->name, 0x00, 12);
- strncpy(sprite->name, "jpeg", 12);
- sprite->width = width - 1;
- sprite->height = height - 1;
- sprite->left_bit = 0;
- sprite->right_bit = 31;
- sprite->image = sprite->mask = 44;
- sprite->mode = (os_mode) 0x301680b5;
-
+ pixels = bitmap_get_buffer(bitmap);
+ rowstride = bitmap_get_rowstride(bitmap);
do {
JSAMPROW scanlines[1];
- scanlines[0] = (JSAMPROW) ((char *) sprite + 44 +
- width * cinfo.output_scanline * 4);
+ scanlines[0] = (JSAMPROW) (pixels +
+ rowstride * cinfo.output_scanline);
jpeg_read_scanlines(&cinfo, scanlines, 1);
+
+#if RGB_RED != 0 || RGB_GREEN != 1 || RGB_BLUE != 2 || RGB_PIXELSIZE != 4
+ /* expand to RGBA */
+ for (int i = width - 1; 0 <= i; i--) {
+ int r = scanlines[0][i * RGB_PIXELSIZE + RGB_RED];
+ int g = scanlines[0][i * RGB_PIXELSIZE + RGB_GREEN];
+ int b = scanlines[0][i * RGB_PIXELSIZE + RGB_BLUE];
+ scanlines[0][i * 4 + 0] = r;
+ scanlines[0][i * 4 + 1] = g;
+ scanlines[0][i * 4 + 2] = b;
+ scanlines[0][i * 4 + 3] = 0xff;
+ }
+
+#endif
} while (cinfo.output_scanline != cinfo.output_height);
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
- /*xosspriteop_save_sprite_file(osspriteop_USER_AREA,
- sprite_area, "jpeg");*/
-
c->width = width;
c->height = height;
- c->data.jpeg.sprite_area = sprite_area;
+ c->bitmap = bitmap;
c->title = malloc(100);
if (c->title)
snprintf(c->title, 100, messages_get("JPEGTitle"),
width, height, c->source_size);
- c->size += area_size + 100;
+ c->size += height * rowstride + 100;
c->status = CONTENT_STATUS_DONE;
return true;
}
@@ -232,21 +213,7 @@ void nsjpeg_term_source(j_decompress_ptr cinfo)
void nsjpeg_destroy(struct content *c)
{
- free(c->data.jpeg.sprite_area);
+ if (c->bitmap)
+ bitmap_destroy(c->bitmap);
free(c->title);
}
-
-
-/**
- * Redraw a CONTENT_JPEG.
- */
-
-bool nsjpeg_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.jpeg.sprite_area, x, y, width, height,
- c->width * 2, c->height *2, background_colour,
- false, false, IMAGE_PLOT_TINCT_OPAQUE);
-}
diff --git a/riscos/jpeg.h b/image/jpeg.h
index 90c7492a5..c20678537 100644
--- a/riscos/jpeg.h
+++ b/image/jpeg.h
@@ -5,23 +5,20 @@
* Copyright 2004 James Bursa <bursa@users.sourceforge.net>
*/
-#ifndef _NETSURF_RISCOS_JPEG_H_
-#define _NETSURF_RISCOS_JPEG_H_
+/** \file
+ * Content for image/jpeg (interface).
+ */
-#include "oslib/osspriteop.h"
+#ifndef _NETSURF_IMAGE_JPEG_H_
+#define _NETSURF_IMAGE_JPEG_H_
+struct bitmap;
struct content;
struct content_jpeg_data {
- osspriteop_area *sprite_area;
};
-bool nsjpeg_create(struct content *c, const char *params[]);
bool nsjpeg_convert(struct content *c, int width, int height);
void nsjpeg_destroy(struct content *c);
-bool nsjpeg_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/mng.c b/image/mng.c
index 9326c7da6..fecebe6f3 100644
--- a/riscos/mng.c
+++ b/image/mng.c
@@ -5,20 +5,22 @@
* Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
*/
+/** \file
+ * Content for image/mng, image/png, and image/jng (implementation).
+ */
+
#include <assert.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
-#include "libmng/libmng.h"
-#include "oslib/os.h"
-#include "oslib/osspriteop.h"
+#include <sys/time.h>
+#include <time.h>
+#include "libmng.h"
#include "netsurf/utils/config.h"
#include "netsurf/content/content.h"
-#include "netsurf/riscos/gui.h"
-#include "netsurf/riscos/image.h"
-#include "netsurf/riscos/mng.h"
-#include "netsurf/riscos/options.h"
-#include "netsurf/riscos/wimp.h"
+#include "netsurf/desktop/browser.h"
+#include "netsurf/image/bitmap.h"
+#include "netsurf/image/mng.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/utils.h"
@@ -44,13 +46,21 @@ static mng_bool nsmng_trace(mng_handle mng, mng_int32 iFunNr, mng_int32 iFuncseq
static mng_bool nsmng_errorproc(mng_handle mng, mng_int32 code,
mng_int8 severity, mng_chunkid chunktype, mng_uint32 chunkseq,
mng_int32 extra1, mng_int32 extra2, mng_pchar text);
+#ifndef MNG_INTERNAL_MEMMNGMT
+static mng_ptr nsmng_alloc(mng_size_t n);
+static void nsmng_free(mng_ptr p, mng_size_t n);
+#endif
+
bool nsmng_create(struct content *c, const char *params[]) {
- /* Initialise the library (libmng is compiled with MNG_INTERNAL_MEMMNGMT)
+ /* Initialise the library
*/
- c->data.mng.sprite_area = NULL;
+#ifdef MNG_INTERNAL_MEMMNGMT
c->data.mng.handle = mng_initialize(c, MNG_NULL, MNG_NULL, MNG_NULL);
+#else
+ c->data.mng.handle = mng_initialize(c, nsmng_alloc, nsmng_free, MNG_NULL);
+#endif
if (c->data.mng.handle == MNG_NULL) {
LOG(("Unable to initialise MNG library."));
return nsmng_broadcast_error(c);
@@ -155,18 +165,14 @@ mng_bool nsmng_closestream(mng_handle mng) {
mng_bool nsmng_processheader(mng_handle mng, mng_uint32 width, mng_uint32 height) {
struct content *c;
- int sprite_size;
- osspriteop_area *sprite_area;
- osspriteop_header *sprite_header;
union content_msg_data msg_data;
/* This function is called when the header has been read and we know
the dimensions of the canvas.
*/
c = (struct content *)mng_get_userdata(mng);
- sprite_size = width * height * 4 + sizeof(osspriteop_header) + sizeof(osspriteop_area);
- c->data.mng.sprite_area = (osspriteop_area *)malloc(sprite_size);
- if (!(c->data.mng.sprite_area)) {
+ c->bitmap = bitmap_create(width, height);
+ if (!c->bitmap) {
msg_data.error = messages_get("NoMemory");
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
LOG(("Insufficient memory to create canvas."));
@@ -178,27 +184,6 @@ mng_bool nsmng_processheader(mng_handle mng, mng_uint32 width, mng_uint32 height
c->width = width;
c->height = height;
- /* Initialise the sprite area
- */
- sprite_area = c->data.mng.sprite_area;
- sprite_area->size = sprite_size;
- sprite_area->sprite_count = 1;
- sprite_area->first = sizeof(osspriteop_area);
- sprite_area->used = sprite_size;
-
- /* Initialise the sprite header
- */
- sprite_header = (osspriteop_header *)(sprite_area + 1);
- sprite_header->size = sprite_size - sizeof(osspriteop_area);
- memset(sprite_header->name, 0x00, 12);
- strcpy(sprite_header->name, "mng");
- sprite_header->width = width - 1;
- sprite_header->height = height - 1;
- sprite_header->left_bit = 0;
- sprite_header->right_bit = 31;
- sprite_header->mask = sprite_header->image = sizeof(osspriteop_header);
- sprite_header->mode = (os_mode) 0x301680b5;
-
/* Set the canvas style
*/
if (mng_set_canvasstyle(mng, MNG_CANVAS_RGBA8) != MNG_NOERROR) {
@@ -262,7 +247,7 @@ bool nsmng_convert(struct content *c, int width, int height) {
c->width, c->height, c->source_size);
}
}
- c->size += (c->width * c->height * 4) + sizeof(osspriteop_header) + sizeof(osspriteop_area) + 100;
+ c->size += c->width * c->height * 4 + 100;
c->status = CONTENT_STATUS_DONE;
@@ -282,7 +267,6 @@ bool nsmng_convert(struct content *c, int width, int height) {
mng_ptr nsmng_getcanvasline(mng_handle mng, mng_uint32 line) {
- char *base;
struct content *c;
/* Get our content back
@@ -291,21 +275,31 @@ mng_ptr nsmng_getcanvasline(mng_handle mng, mng_uint32 line) {
/* Calculate the address
*/
- base = ((char *) c->data.mng.sprite_area + c->data.mng.sprite_area->first);
- base += sizeof(osspriteop_header);
- return base + (c->width * 4) * line;
+ return bitmap_get_buffer(c->bitmap) +
+ bitmap_get_rowstride(c->bitmap) * line;
}
+/**
+ * Get the wall-clock time in milliseconds since some fixed time.
+ */
+
mng_uint32 nsmng_gettickcount(mng_handle mng) {
- os_t time;
+ static bool start = true;
+ static time_t t0;
+ struct timeval tv;
+ struct timezone tz;
+
+ gettimeofday(&tv, &tz);
+ if (start) {
+ t0 = tv.tv_sec;
+ start = false;
+ }
- /* Get the time in centiseconds and return in milliseconds
- */
- xos_read_monotonic_time(&time);
- return (time * 10);
+ return (tv.tv_sec - t0) * 1000 + tv.tv_usec / 1000;
}
+
mng_bool nsmng_refresh(mng_handle mng, mng_uint32 x, mng_uint32 y, mng_uint32 w, mng_uint32 h) {
union content_msg_data data;
struct content *c;
@@ -368,10 +362,8 @@ void nsmng_destroy(struct content *c) {
*/
schedule_remove(nsmng_animate, c);
mng_cleanup(&c->data.mng.handle);
- if (c->data.mng.sprite_area) {
- free(c->data.mng.sprite_area);
- c->data.mng.sprite_area = NULL;
- }
+ if (c->bitmap)
+ bitmap_destroy(c->bitmap);
free(c->title);
}
@@ -383,9 +375,9 @@ bool nsmng_redraw(struct content *c, int x, int y,
{
bool ret;
- ret = image_redraw(c->data.mng.sprite_area, x, y, width, height,
- c->width * 2, c->height * 2, background_colour,
- false, false, IMAGE_PLOT_TINCT_ALPHA);
+ ret = bitmap_redraw(c, x, y, width, height,
+ clip_x0, clip_y0, clip_x1, clip_y1,
+ scale, background_colour);
/* Check if we need to restart the animation
*/
@@ -460,4 +452,29 @@ mng_bool nsmng_errorproc(mng_handle mng, mng_int32 code,
return (0);
}
+
+
+#ifndef MNG_INTERNAL_MEMMNGMT
+
+/**
+ * Memory allocation callback for libmng.
+ */
+
+mng_ptr nsmng_alloc(mng_size_t n)
+{
+ return calloc(1, n);
+}
+
+
+/**
+ * Memory free callback for libmng.
+ */
+
+void nsmng_free(mng_ptr p, mng_size_t n)
+{
+ free(p);
+}
+
+#endif
+
#endif
diff --git a/riscos/mng.h b/image/mng.h
index d5ba0ea2e..6a67b840e 100644
--- a/riscos/mng.h
+++ b/image/mng.h
@@ -5,11 +5,14 @@
* Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
*/
-#ifndef _NETSURF_RISCOS_MNG_H_
-#define _NETSURF_RISCOS_MNG_H_
+/** \file
+ * Content for image/mng, image/png, and image/jng (interface).
+ */
+
+#ifndef _NETSURF_IMAGE_MNG_H_
+#define _NETSURF_IMAGE_MNG_H_
-#include "libmng/libmng.h"
-#include "oslib/osspriteop.h"
+#include "libmng.h"
struct content;
@@ -19,7 +22,6 @@ struct content_mng_data {
int read_size;
bool waiting;
mng_handle handle;
- osspriteop_area *sprite_area;
};
bool nsmng_create(struct content *c, const char *params[]);
diff --git a/makefile b/makefile
index ecefa1770..58f5b30d8 100644
--- a/makefile
+++ b/makefile
@@ -23,12 +23,14 @@ OBJECTS_COMMON += box.o form.o html.o layout.o textplain.o # render/
OBJECTS_COMMON += messages.o pool.o translit.o url.o utils.o # utils/
OBJECTS_COMMON += imagemap.o loginlist.o options.o # desktop/
-OBJECTS_RISCOS = $(OBJECTS_COMMON)
+OBJECTS_IMAGE = jpeg.o mng.o # image/
+
+OBJECTS_RISCOS = $(OBJECTS_COMMON) $(OBJECTS_IMAGE)
OBJECTS_RISCOS += browser.o netsurf.o version.o # desktop/
-OBJECTS_RISCOS += 401login.o debugwin.o \
+OBJECTS_RISCOS += 401login.o bitmap.o debugwin.o \
buffer.o dialog.o download.o draw.o filetype.o font.o gif.o \
gifread.o gui.o help.o history.o hotlist.o htmlredraw.o image.o \
- jpeg.o menus.o mng.o mouseactions.o plugin.o print.o \
+ menus.o mouseactions.o plugin.o print.o \
save.o save_complete.o save_draw.o save_text.o \
schedule.o search.o sprite.o textselection.o theme.o thumbnail.o \
ufont.o uri.o url_protocol.o wimp.o window.o # riscos/
@@ -36,22 +38,22 @@ OBJECTS_RISCOS += 401login.o debugwin.o \
OBJECTS_NCOS = $(OBJECTS_RISCOS)
-OBJECTS_DEBUG = $(OBJECTS_COMMON)
-OBJECTS_DEBUG += filetyped.o fontd.o netsurfd.o # debug/
-OBJECTS_DEBUG += gif.o gifread.o jpeg.o mng.o save_complete.o \
+OBJECTS_DEBUG = $(OBJECTS_COMMON) $(OBJECTS_IMAGE)
+OBJECTS_DEBUG += debug_bitmap.o filetyped.o fontd.o netsurfd.o # debug/
+OBJECTS_DEBUG += gif.o gifread.o save_complete.o \
schedule.o # riscos/
-OBJECTS_DEBUGRO = $(OBJECTS_COMMON)
+OBJECTS_DEBUGRO = $(OBJECTS_COMMON) $(OBJECTS_IMAGE)
OBJECTS_DEBUGRO += netsurfd.o # debug/
OBJECTS_DEBUGRO += version.o # desktop/
-OBJECTS_DEBUGRO += draw.o filetype.o font.o \
- gif.o gifread.o image.o jpeg.o mng.o save_complete.o \
+OBJECTS_DEBUGRO += bitmap.o draw.o filetype.o font.o \
+ gif.o gifread.o image.o jpeg.o save_complete.o \
schedule.o sprite.o ufont.o # riscos/
-OBJECTS_GTK = $(OBJECTS_COMMON)
+OBJECTS_GTK = $(OBJECTS_COMMON) $(OBJECTS_IMAGE)
OBJECTS_GTK += filetyped.o # debug/
OBJECTS_GTK += browser.o netsurf.o version.o # desktop/
-OBJECTS_GTK += font_pango.o gtk_gui.o gtk_window.o # gtk/
+OBJECTS_GTK += font_pango.o gtk_bitmap.o gtk_gui.o gtk_window.o # gtk/
OBJDIR_RISCOS = $(shell $(CC) -dumpmachine)
@@ -82,7 +84,7 @@ else
include posix.mk
endif
-VPATH = content:css:desktop:render:riscos:utils:debug:gtk
+VPATH = content:css:desktop:image:render:riscos:utils:debug:gtk
WARNFLAGS = -W -Wall -Wundef -Wpointer-arith -Wcast-qual \
-Wcast-align -Wwrite-strings -Wstrict-prototypes \
diff --git a/riscos/gui.h b/riscos/gui.h
index 5c9c0c653..f3457ce8f 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -230,9 +230,6 @@ int ro_content_filetype(struct content *content);
/* in schedule.c */
extern bool sched_active;
extern os_t sched_time;
-void schedule(int t, void (*callback)(void *p), void *p);
-void schedule_remove(void (*callback)(void *p), void *p);
-void schedule_run(void);
/* in debugwin.c */
void ro_gui_debugwin_open(void);
diff --git a/riscos/htmlredraw.c b/riscos/htmlredraw.c
index 2a29d8eca..20d50fb5f 100644
--- a/riscos/htmlredraw.c
+++ b/riscos/htmlredraw.c
@@ -1010,30 +1010,30 @@ 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:
+ case CONTENT_PNG:/*
image_redraw(box->background->data.png.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);
- break;
+ 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->data.mng.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:
+ case CONTENT_JPEG:/*
image_redraw(box->background->data.jpeg.sprite_area,
x, y, image_width, image_height,
box->background->width * 2,
@@ -1041,7 +1041,7 @@ bool html_redraw_background(int xi, int yi, int width, int height,
background_colour,
repeat_x, repeat_y,
IMAGE_PLOT_TINCT_OPAQUE);
- break;
+ */break;
#endif
#ifdef WITH_GIF
case CONTENT_GIF:
diff --git a/riscos/save.c b/riscos/save.c
index 1fafee589..6b0c49e35 100644
--- a/riscos/save.c
+++ b/riscos/save.c
@@ -430,18 +430,18 @@ void ro_gui_save_object_native(struct content *c, char *path)
switch (c->type) {
#ifdef WITH_JPEG
case CONTENT_JPEG:
- error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.jpeg.sprite_area, path);
+ bitmap_save(c->bitmap, path);
break;
#endif
#ifdef WITH_PNG
case CONTENT_PNG:
- error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.png.sprite_area, path);
- break;
+/* error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.png.sprite_area, path);
+ break;*/
#endif
#ifdef WITH_MNG
case CONTENT_JNG:
case CONTENT_MNG:
- error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.mng.sprite_area, path);
+ bitmap_save(c->bitmap, path);
break;
#endif
#ifdef WITH_GIF
diff --git a/riscos/save_draw.c b/riscos/save_draw.c
index 469d5a3d5..e00ad3350 100644
--- a/riscos/save_draw.c
+++ b/riscos/save_draw.c
@@ -703,17 +703,18 @@ static bool add_graphic(struct content *content, struct box *box,
/* cast-tastic... */
switch (content->type) {
case CONTENT_JPEG:
- sprite_length = ((osspriteop_header*)((char*)content->data.jpeg.sprite_area+content->data.jpeg.sprite_area->first))->size;
+ return true;
+ /*sprite_length = ((osspriteop_header*)((char*)content->data.jpeg.sprite_area+content->data.jpeg.sprite_area->first))->size;*/
break;
#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->data.png.sprite_area+content->data.png.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->data.mng.sprite_area+content->data.mng.sprite_area->first))->size;*/
break;
#endif
case CONTENT_GIF:
@@ -742,17 +743,17 @@ static bool add_graphic(struct content *content, struct box *box,
switch (content->type) {
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->data.jpeg.sprite_area+content->data.jpeg.sprite_area->first, (unsigned)sprite_length);*/
break;
#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->data.png.sprite_area+content->data.png.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->data.mng.sprite_area+content->data.mng.sprite_area->first, (unsigned)sprite_length);*/
break;
#endif
case CONTENT_GIF:
diff --git a/utils/config.h b/utils/config.h
index a7c844424..3010f5fcc 100644
--- a/utils/config.h
+++ b/utils/config.h
@@ -23,11 +23,11 @@
#define WITH_COOKIES
/* Image renderering modules */
+#define WITH_JPEG
+#define WITH_MNG
+#define WITH_PNG
#if defined(riscos) || defined(ncos) || defined(debug)
#define WITH_GIF
- #define WITH_JPEG
- #define WITH_PNG
- #define WITH_MNG
#endif
#if defined(riscos) || defined(ncos)
#define WITH_DRAW