From 3371a27391e828c6417e6d805572cf261b138785 Mon Sep 17 00:00:00 2001 From: James Bursa Date: Fri, 3 Sep 2004 22:44:48 +0000 Subject: [PATCH] [project @ 2004-09-03 22:44:47 by bursa] Add generic bitmap functions. Move jpeg and mng code from riscos/ to image/ and update to use bitmap. Note: background tiling and drawfile export for jpeg and mng/png are broken. svn path=/import/netsurf/; revision=1265 --- content/content.c | 23 +++---- content/content.h | 14 ++--- content/content_type.h | 4 +- desktop/browser.h | 5 ++ gtk/gtk_bitmap.c | 131 +++++++++++++++++++++++++++++++++++++++ gtk/gtk_gui.c | 4 ++ gtk/gtk_window.c | 4 +- image/bitmap.h | 38 ++++++++++++ {riscos => image}/jpeg.c | 101 ++++++++++-------------------- {riscos => image}/jpeg.h | 15 ++--- {riscos => image}/mng.c | 125 +++++++++++++++++++++---------------- {riscos => image}/mng.h | 12 ++-- makefile | 26 ++++---- riscos/gui.h | 3 - riscos/htmlredraw.c | 14 ++--- riscos/save.c | 8 +-- riscos/save_draw.c | 13 ++-- utils/config.h | 6 +- 18 files changed, 349 insertions(+), 197 deletions(-) create mode 100644 gtk/gtk_bitmap.c create mode 100644 image/bitmap.h rename {riscos => image}/jpeg.c (70%) rename {riscos => image}/jpeg.h (52%) rename {riscos => image}/mng.c (84%) rename {riscos => image}/mng.h (83%) 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 + */ + +/** \file + * Generic bitmap handling (GDK / GTK+ implementation). + * + * This implements the interface given by desktop/bitmap.h using GdkPixbufs. + */ + +#include +#include +#include +#include +#include +#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 + */ + +/** \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 +#include + +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 similarity index 70% rename from riscos/jpeg.c rename to image/jpeg.c index b355be37b..85711bd2e 100644 --- a/riscos/jpeg.c +++ b/image/jpeg.c @@ -13,27 +13,25 @@ */ #include +#include #include #include #include #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 @@ -53,17 +51,6 @@ static void nsjpeg_skip_input_data(j_decompress_ptr cinfo, long num_bytes); 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 similarity index 52% rename from riscos/jpeg.h rename to image/jpeg.h index 90c7492a5..c20678537 100644 --- a/riscos/jpeg.h +++ b/image/jpeg.h @@ -5,23 +5,20 @@ * Copyright 2004 James Bursa */ -#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 similarity index 84% rename from riscos/mng.c rename to image/mng.c index 9326c7da6..fecebe6f3 100644 --- a/riscos/mng.c +++ b/image/mng.c @@ -5,20 +5,22 @@ * Copyright 2004 Richard Wilson */ +/** \file + * Content for image/mng, image/png, and image/jng (implementation). + */ + #include #include #include #include -#include "libmng/libmng.h" -#include "oslib/os.h" -#include "oslib/osspriteop.h" +#include +#include +#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; - /* Get the time in centiseconds and return in milliseconds - */ - xos_read_monotonic_time(&time); - return (time * 10); + gettimeofday(&tv, &tz); + if (start) { + t0 = tv.tv_sec; + start = false; + } + + 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 similarity index 83% rename from riscos/mng.h rename to image/mng.h index d5ba0ea2e..6a67b840e 100644 --- a/riscos/mng.h +++ b/image/mng.h @@ -5,11 +5,14 @@ * Copyright 2004 Richard Wilson */ -#ifndef _NETSURF_RISCOS_MNG_H_ -#define _NETSURF_RISCOS_MNG_H_ +/** \file + * Content for image/mng, image/png, and image/jng (interface). + */ -#include "libmng/libmng.h" -#include "oslib/osspriteop.h" +#ifndef _NETSURF_IMAGE_MNG_H_ +#define _NETSURF_IMAGE_MNG_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