[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
This commit is contained in:
James Bursa 2004-09-03 22:44:48 +00:00
parent fb5082605c
commit 3371a27391
18 changed files with 349 additions and 197 deletions

View File

@ -22,17 +22,15 @@
#include "netsurf/content/fetch.h" #include "netsurf/content/fetch.h"
#include "netsurf/content/fetchcache.h" #include "netsurf/content/fetchcache.h"
#include "netsurf/css/css.h" #include "netsurf/css/css.h"
#include "netsurf/image/bitmap.h"
#include "netsurf/desktop/options.h" #include "netsurf/desktop/options.h"
#include "netsurf/render/html.h" #include "netsurf/render/html.h"
#include "netsurf/render/textplain.h" #include "netsurf/render/textplain.h"
#ifdef WITH_JPEG #ifdef WITH_JPEG
#include "netsurf/riscos/jpeg.h" #include "netsurf/image/jpeg.h"
#endif
#ifdef WITH_PNG
#include "netsurf/riscos/png.h"
#endif #endif
#ifdef WITH_MNG #ifdef WITH_MNG
#include "netsurf/riscos/mng.h" #include "netsurf/image/mng.h"
#endif #endif
#ifdef WITH_GIF #ifdef WITH_GIF
#include "netsurf/riscos/gif.h" #include "netsurf/riscos/gif.h"
@ -82,7 +80,7 @@ static const struct mime_entry mime_map[] = {
#ifdef WITH_JPEG #ifdef WITH_JPEG
{"image/pjpeg", CONTENT_JPEG}, {"image/pjpeg", CONTENT_JPEG},
#endif #endif
#ifdef WITH_PNG #ifdef WITH_MNG
{"image/png", CONTENT_PNG}, {"image/png", CONTENT_PNG},
#endif #endif
#ifdef WITH_DRAW #ifdef WITH_DRAW
@ -115,10 +113,8 @@ const char *content_type_name[] = {
#ifdef WITH_GIF #ifdef WITH_GIF
"GIF", "GIF",
#endif #endif
#ifdef WITH_PNG
"PNG",
#endif
#ifdef WITH_MNG #ifdef WITH_MNG
"PNG",
"JNG", "JNG",
"MNG", "MNG",
#endif #endif
@ -173,18 +169,16 @@ static const struct handler_entry handler_map[] = {
0, 0, 0, 0, 0, 0, true}, 0, 0, 0, 0, 0, 0, true},
{0, 0, css_convert, 0, css_destroy, 0, 0, 0, 0, false}, {0, 0, css_convert, 0, css_destroy, 0, 0, 0, 0, false},
#ifdef WITH_JPEG #ifdef WITH_JPEG
{nsjpeg_create, 0, nsjpeg_convert, {0, 0, nsjpeg_convert,
0, nsjpeg_destroy, 0, nsjpeg_redraw, 0, 0, false}, 0, nsjpeg_destroy, 0, bitmap_redraw, 0, 0, false},
#endif #endif
#ifdef WITH_GIF #ifdef WITH_GIF
{nsgif_create, 0, nsgif_convert, {nsgif_create, 0, nsgif_convert,
0, nsgif_destroy, 0, nsgif_redraw, 0, 0, false}, 0, nsgif_destroy, 0, nsgif_redraw, 0, 0, false},
#endif #endif
#ifdef WITH_PNG #ifdef WITH_MNG
{nsmng_create, nsmng_process_data, nsmng_convert, {nsmng_create, nsmng_process_data, nsmng_convert,
0, nsmng_destroy, 0, nsmng_redraw, 0, 0, false}, 0, nsmng_destroy, 0, nsmng_redraw, 0, 0, false},
#endif
#ifdef WITH_MNG
{nsmng_create, nsmng_process_data, nsmng_convert, {nsmng_create, nsmng_process_data, nsmng_convert,
0, nsmng_destroy, 0, nsmng_redraw, 0, 0, false}, 0, nsmng_destroy, 0, nsmng_redraw, 0, 0, false},
{nsmng_create, nsmng_process_data, nsmng_convert, {nsmng_create, nsmng_process_data, nsmng_convert,
@ -270,6 +264,7 @@ struct content * content_create(const char *url)
c->width = 0; c->width = 0;
c->height = 0; c->height = 0;
c->available_width = 0; c->available_width = 0;
c->bitmap = 0;
c->fresh = false; c->fresh = false;
c->size = sizeof(struct content); c->size = sizeof(struct content);
c->title = 0; c->title = 0;

View File

@ -102,7 +102,7 @@
#include "netsurf/css/css.h" #include "netsurf/css/css.h"
#include "netsurf/render/html.h" #include "netsurf/render/html.h"
#ifdef WITH_JPEG #ifdef WITH_JPEG
#include "netsurf/riscos/jpeg.h" #include "netsurf/image/jpeg.h"
#endif #endif
#ifdef WITH_GIF #ifdef WITH_GIF
#include "netsurf/riscos/gif.h" #include "netsurf/riscos/gif.h"
@ -110,11 +110,8 @@
#ifdef WITH_PLUGIN #ifdef WITH_PLUGIN
#include "netsurf/riscos/plugin.h" #include "netsurf/riscos/plugin.h"
#endif #endif
#ifdef WITH_PNG
#include "netsurf/riscos/png.h"
#endif
#ifdef WITH_MNG #ifdef WITH_MNG
#include "netsurf/riscos/mng.h" #include "netsurf/image/mng.h"
#endif #endif
#ifdef WITH_SPRITE #ifdef WITH_SPRITE
#include "netsurf/riscos/sprite.h" #include "netsurf/riscos/sprite.h"
@ -124,6 +121,7 @@
#endif #endif
struct bitmap;
struct box; struct box;
struct browser_window; struct browser_window;
struct content; struct content;
@ -208,9 +206,6 @@ struct content {
#ifdef WITH_GIF #ifdef WITH_GIF
struct content_gif_data gif; struct content_gif_data gif;
#endif #endif
#ifdef WITH_PNG
struct content_png_data png;
#endif
#ifdef WITH_MNG #ifdef WITH_MNG
struct content_mng_data mng; struct content_mng_data mng;
#endif #endif
@ -225,6 +220,9 @@ struct content {
#endif #endif
} data; } data;
/** Bitmap, for various image contents. */
struct bitmap *bitmap;
/** This content may be given to new users. Indicates that the content /** This content may be given to new users. Indicates that the content
* was fetched using a simple GET, has not expired, and may be * was fetched using a simple GET, has not expired, and may be
* shared between users. */ * shared between users. */

View File

@ -28,10 +28,8 @@ typedef enum {
#ifdef WITH_GIF #ifdef WITH_GIF
CONTENT_GIF, CONTENT_GIF,
#endif #endif
#ifdef WITH_PNG
CONTENT_PNG,
#endif
#ifdef WITH_MNG #ifdef WITH_MNG
CONTENT_PNG,
CONTENT_JNG, CONTENT_JNG,
CONTENT_MNG, CONTENT_MNG,
#endif #endif

View File

@ -100,4 +100,9 @@ void history_forward(struct browser_window *bw, struct history *history);
bool history_back_available(struct history *history); bool history_back_available(struct history *history);
bool history_forward_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 #endif

131
gtk/gtk_bitmap.c Normal file
View File

@ -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;
}

View File

@ -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, void gui_401login_open(struct browser_window *bw, struct content *c,
char *realm) {} 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) {}

View File

@ -34,8 +34,8 @@ struct gui_window {
struct browser_window *bw; struct browser_window *bw;
}; };
static GtkWidget *current_widget; static GtkWidget *current_widget;
static GdkDrawable *current_drawable; GdkDrawable *current_drawable;
static GdkGC *current_gc; GdkGC *current_gc;
static gboolean gui_window_expose_event(GtkWidget *widget, static gboolean gui_window_expose_event(GtkWidget *widget,

38
image/bitmap.h Normal file
View File

@ -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

View File

@ -13,27 +13,25 @@
*/ */
#include <assert.h> #include <assert.h>
#include <setjmp.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#define JPEG_INTERNAL_OPTIONS #define JPEG_INTERNAL_OPTIONS
#include "libjpeg/jpeglib.h" #include "libjpeg/jpeglib.h"
#include "oslib/osspriteop.h"
#include "netsurf/utils/config.h" #include "netsurf/utils/config.h"
#include "netsurf/content/content.h" #include "netsurf/content/content.h"
#include "netsurf/riscos/gui.h" #include "netsurf/image/bitmap.h"
#include "netsurf/riscos/image.h" #include "netsurf/image/jpeg.h"
#include "netsurf/riscos/jpeg.h"
#include "netsurf/riscos/options.h"
#include "netsurf/utils/log.h" #include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h" #include "netsurf/utils/messages.h"
#include "netsurf/utils/utils.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. */ * copying data during decoding. */
#if RGB_RED != 0 || RGB_GREEN != 1 || RGB_BLUE != 2 || RGB_PIXELSIZE != 4 #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 #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); 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. * Convert a CONTENT_JPEG for display.
*/ */
@ -78,16 +65,17 @@ bool nsjpeg_convert(struct content *c, int w, int h)
nsjpeg_term_source }; nsjpeg_term_source };
unsigned int height; unsigned int height;
unsigned int width; unsigned int width;
unsigned int area_size; struct bitmap *bitmap = NULL;
osspriteop_area *sprite_area = 0; char *pixels;
osspriteop_header *sprite; size_t rowstride;
union content_msg_data msg_data; union content_msg_data msg_data;
cinfo.err = jpeg_std_error(&jerr.pub); cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = nsjpeg_error_exit; jerr.pub.error_exit = nsjpeg_error_exit;
if (setjmp(jerr.setjmp_buffer)) { if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_decompress(&cinfo); jpeg_destroy_decompress(&cinfo);
free(sprite_area); if (bitmap)
bitmap_destroy(bitmap);
msg_data.error = nsjpeg_error_buffer; msg_data.error = nsjpeg_error_buffer;
content_broadcast(c, CONTENT_MSG_ERROR, msg_data); 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; width = cinfo.output_width;
height = cinfo.output_height; height = cinfo.output_height;
area_size = 16 + 44 + width * height * 4; bitmap = bitmap_create(width, height);
sprite_area = malloc(area_size); if (!bitmap) {
if (!sprite_area) {
LOG(("malloc failed"));
jpeg_destroy_decompress(&cinfo); jpeg_destroy_decompress(&cinfo);
msg_data.error = messages_get("NoMemory"); msg_data.error = messages_get("NoMemory");
@ -117,45 +103,40 @@ bool nsjpeg_convert(struct content *c, int w, int h)
return false; return false;
} }
/* area control block */ pixels = bitmap_get_buffer(bitmap);
sprite_area->size = area_size; rowstride = bitmap_get_rowstride(bitmap);
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;
do { do {
JSAMPROW scanlines[1]; JSAMPROW scanlines[1];
scanlines[0] = (JSAMPROW) ((char *) sprite + 44 + scanlines[0] = (JSAMPROW) (pixels +
width * cinfo.output_scanline * 4); rowstride * cinfo.output_scanline);
jpeg_read_scanlines(&cinfo, scanlines, 1); 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); } while (cinfo.output_scanline != cinfo.output_height);
jpeg_finish_decompress(&cinfo); jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo); jpeg_destroy_decompress(&cinfo);
/*xosspriteop_save_sprite_file(osspriteop_USER_AREA,
sprite_area, "jpeg");*/
c->width = width; c->width = width;
c->height = height; c->height = height;
c->data.jpeg.sprite_area = sprite_area; c->bitmap = bitmap;
c->title = malloc(100); c->title = malloc(100);
if (c->title) if (c->title)
snprintf(c->title, 100, messages_get("JPEGTitle"), snprintf(c->title, 100, messages_get("JPEGTitle"),
width, height, c->source_size); width, height, c->source_size);
c->size += area_size + 100; c->size += height * rowstride + 100;
c->status = CONTENT_STATUS_DONE; c->status = CONTENT_STATUS_DONE;
return true; return true;
} }
@ -232,21 +213,7 @@ void nsjpeg_term_source(j_decompress_ptr cinfo)
void nsjpeg_destroy(struct content *c) void nsjpeg_destroy(struct content *c)
{ {
free(c->data.jpeg.sprite_area); if (c->bitmap)
bitmap_destroy(c->bitmap);
free(c->title); 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);
}

View File

@ -5,23 +5,20 @@
* Copyright 2004 James Bursa <bursa@users.sourceforge.net> * Copyright 2004 James Bursa <bursa@users.sourceforge.net>
*/ */
#ifndef _NETSURF_RISCOS_JPEG_H_ /** \file
#define _NETSURF_RISCOS_JPEG_H_ * 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;
struct content_jpeg_data { 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); bool nsjpeg_convert(struct content *c, int width, int height);
void nsjpeg_destroy(struct content *c); 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 #endif

View File

@ -5,20 +5,22 @@
* Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net> * 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 <assert.h>
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "libmng/libmng.h" #include <sys/time.h>
#include "oslib/os.h" #include <time.h>
#include "oslib/osspriteop.h" #include "libmng.h"
#include "netsurf/utils/config.h" #include "netsurf/utils/config.h"
#include "netsurf/content/content.h" #include "netsurf/content/content.h"
#include "netsurf/riscos/gui.h" #include "netsurf/desktop/browser.h"
#include "netsurf/riscos/image.h" #include "netsurf/image/bitmap.h"
#include "netsurf/riscos/mng.h" #include "netsurf/image/mng.h"
#include "netsurf/riscos/options.h"
#include "netsurf/riscos/wimp.h"
#include "netsurf/utils/log.h" #include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h" #include "netsurf/utils/messages.h"
#include "netsurf/utils/utils.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, static mng_bool nsmng_errorproc(mng_handle mng, mng_int32 code,
mng_int8 severity, mng_chunkid chunktype, mng_uint32 chunkseq, mng_int8 severity, mng_chunkid chunktype, mng_uint32 chunkseq,
mng_int32 extra1, mng_int32 extra2, mng_pchar text); 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[]) { 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); 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) { if (c->data.mng.handle == MNG_NULL) {
LOG(("Unable to initialise MNG library.")); LOG(("Unable to initialise MNG library."));
return nsmng_broadcast_error(c); 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) { mng_bool nsmng_processheader(mng_handle mng, mng_uint32 width, mng_uint32 height) {
struct content *c; struct content *c;
int sprite_size;
osspriteop_area *sprite_area;
osspriteop_header *sprite_header;
union content_msg_data msg_data; union content_msg_data msg_data;
/* This function is called when the header has been read and we know /* This function is called when the header has been read and we know
the dimensions of the canvas. the dimensions of the canvas.
*/ */
c = (struct content *)mng_get_userdata(mng); c = (struct content *)mng_get_userdata(mng);
sprite_size = width * height * 4 + sizeof(osspriteop_header) + sizeof(osspriteop_area); c->bitmap = bitmap_create(width, height);
c->data.mng.sprite_area = (osspriteop_area *)malloc(sprite_size); if (!c->bitmap) {
if (!(c->data.mng.sprite_area)) {
msg_data.error = messages_get("NoMemory"); msg_data.error = messages_get("NoMemory");
content_broadcast(c, CONTENT_MSG_ERROR, msg_data); content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
LOG(("Insufficient memory to create canvas.")); 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->width = width;
c->height = height; 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 /* Set the canvas style
*/ */
if (mng_set_canvasstyle(mng, MNG_CANVAS_RGBA8) != MNG_NOERROR) { 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->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; 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) { mng_ptr nsmng_getcanvasline(mng_handle mng, mng_uint32 line) {
char *base;
struct content *c; struct content *c;
/* Get our content back /* Get our content back
@ -291,21 +275,31 @@ mng_ptr nsmng_getcanvasline(mng_handle mng, mng_uint32 line) {
/* Calculate the address /* Calculate the address
*/ */
base = ((char *) c->data.mng.sprite_area + c->data.mng.sprite_area->first); return bitmap_get_buffer(c->bitmap) +
base += sizeof(osspriteop_header); bitmap_get_rowstride(c->bitmap) * line;
return base + (c->width * 4) * line;
} }
/**
* Get the wall-clock time in milliseconds since some fixed time.
*/
mng_uint32 nsmng_gettickcount(mng_handle mng) { 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 gettimeofday(&tv, &tz);
*/ if (start) {
xos_read_monotonic_time(&time); t0 = tv.tv_sec;
return (time * 10); 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) { mng_bool nsmng_refresh(mng_handle mng, mng_uint32 x, mng_uint32 y, mng_uint32 w, mng_uint32 h) {
union content_msg_data data; union content_msg_data data;
struct content *c; struct content *c;
@ -368,10 +362,8 @@ void nsmng_destroy(struct content *c) {
*/ */
schedule_remove(nsmng_animate, c); schedule_remove(nsmng_animate, c);
mng_cleanup(&c->data.mng.handle); mng_cleanup(&c->data.mng.handle);
if (c->data.mng.sprite_area) { if (c->bitmap)
free(c->data.mng.sprite_area); bitmap_destroy(c->bitmap);
c->data.mng.sprite_area = NULL;
}
free(c->title); free(c->title);
} }
@ -383,9 +375,9 @@ bool nsmng_redraw(struct content *c, int x, int y,
{ {
bool ret; bool ret;
ret = image_redraw(c->data.mng.sprite_area, x, y, width, height, ret = bitmap_redraw(c, x, y, width, height,
c->width * 2, c->height * 2, background_colour, clip_x0, clip_y0, clip_x1, clip_y1,
false, false, IMAGE_PLOT_TINCT_ALPHA); scale, background_colour);
/* Check if we need to restart the animation /* Check if we need to restart the animation
*/ */
@ -460,4 +452,29 @@ mng_bool nsmng_errorproc(mng_handle mng, mng_int32 code,
return (0); 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 #endif

View File

@ -5,11 +5,14 @@
* Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net> * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
*/ */
#ifndef _NETSURF_RISCOS_MNG_H_ /** \file
#define _NETSURF_RISCOS_MNG_H_ * Content for image/mng, image/png, and image/jng (interface).
*/
#include "libmng/libmng.h" #ifndef _NETSURF_IMAGE_MNG_H_
#include "oslib/osspriteop.h" #define _NETSURF_IMAGE_MNG_H_
#include "libmng.h"
struct content; struct content;
@ -19,7 +22,6 @@ struct content_mng_data {
int read_size; int read_size;
bool waiting; bool waiting;
mng_handle handle; mng_handle handle;
osspriteop_area *sprite_area;
}; };
bool nsmng_create(struct content *c, const char *params[]); bool nsmng_create(struct content *c, const char *params[]);

View File

@ -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 += messages.o pool.o translit.o url.o utils.o # utils/
OBJECTS_COMMON += imagemap.o loginlist.o options.o # desktop/ 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 += 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 \ 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 \ 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 \ save.o save_complete.o save_draw.o save_text.o \
schedule.o search.o sprite.o textselection.o theme.o thumbnail.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/ 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_NCOS = $(OBJECTS_RISCOS)
OBJECTS_DEBUG = $(OBJECTS_COMMON) OBJECTS_DEBUG = $(OBJECTS_COMMON) $(OBJECTS_IMAGE)
OBJECTS_DEBUG += filetyped.o fontd.o netsurfd.o # debug/ OBJECTS_DEBUG += debug_bitmap.o filetyped.o fontd.o netsurfd.o # debug/
OBJECTS_DEBUG += gif.o gifread.o jpeg.o mng.o save_complete.o \ OBJECTS_DEBUG += gif.o gifread.o save_complete.o \
schedule.o # riscos/ schedule.o # riscos/
OBJECTS_DEBUGRO = $(OBJECTS_COMMON) OBJECTS_DEBUGRO = $(OBJECTS_COMMON) $(OBJECTS_IMAGE)
OBJECTS_DEBUGRO += netsurfd.o # debug/ OBJECTS_DEBUGRO += netsurfd.o # debug/
OBJECTS_DEBUGRO += version.o # desktop/ OBJECTS_DEBUGRO += version.o # desktop/
OBJECTS_DEBUGRO += draw.o filetype.o font.o \ OBJECTS_DEBUGRO += bitmap.o draw.o filetype.o font.o \
gif.o gifread.o image.o jpeg.o mng.o save_complete.o \ gif.o gifread.o image.o jpeg.o save_complete.o \
schedule.o sprite.o ufont.o # riscos/ schedule.o sprite.o ufont.o # riscos/
OBJECTS_GTK = $(OBJECTS_COMMON) OBJECTS_GTK = $(OBJECTS_COMMON) $(OBJECTS_IMAGE)
OBJECTS_GTK += filetyped.o # debug/ OBJECTS_GTK += filetyped.o # debug/
OBJECTS_GTK += browser.o netsurf.o version.o # desktop/ 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) OBJDIR_RISCOS = $(shell $(CC) -dumpmachine)
@ -82,7 +84,7 @@ else
include posix.mk include posix.mk
endif 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 \ WARNFLAGS = -W -Wall -Wundef -Wpointer-arith -Wcast-qual \
-Wcast-align -Wwrite-strings -Wstrict-prototypes \ -Wcast-align -Wwrite-strings -Wstrict-prototypes \

View File

@ -230,9 +230,6 @@ int ro_content_filetype(struct content *content);
/* in schedule.c */ /* in schedule.c */
extern bool sched_active; extern bool sched_active;
extern os_t sched_time; 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 */ /* in debugwin.c */
void ro_gui_debugwin_open(void); void ro_gui_debugwin_open(void);

View File

@ -1010,30 +1010,30 @@ bool html_redraw_background(int xi, int yi, int width, int height,
/* and plot the image */ /* and plot the image */
switch (box->background->type) { switch (box->background->type) {
#ifdef WITH_PNG #ifdef WITH_PNG
case CONTENT_PNG: case CONTENT_PNG:/*
image_redraw(box->background->data.png.sprite_area, image_redraw(box->background->data.png.sprite_area,
x, y, image_width, image_height, x, y, image_width, image_height,
box->background->width * 2, box->background->width * 2,
box->background->height * 2, box->background->height * 2,
background_colour, background_colour,
repeat_x, repeat_y, repeat_x, repeat_y,
IMAGE_PLOT_TINCT_ALPHA); IMAGE_PLOT_TINCT_ALPHA);*/
break; break;
#endif #endif
#ifdef WITH_MNG #ifdef WITH_MNG
case CONTENT_JNG: case CONTENT_JNG:
case CONTENT_MNG: 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, x, y, image_width, image_height,
box->background->width * 2, box->background->width * 2,
box->background->height * 2, box->background->height * 2,
background_colour, background_colour,
repeat_x, repeat_y, repeat_x, repeat_y,
IMAGE_PLOT_TINCT_ALPHA); IMAGE_PLOT_TINCT_ALPHA);*/
break; break;
#endif #endif
#ifdef WITH_JPEG #ifdef WITH_JPEG
case CONTENT_JPEG: case CONTENT_JPEG:/*
image_redraw(box->background->data.jpeg.sprite_area, image_redraw(box->background->data.jpeg.sprite_area,
x, y, image_width, image_height, x, y, image_width, image_height,
box->background->width * 2, box->background->width * 2,
@ -1041,7 +1041,7 @@ bool html_redraw_background(int xi, int yi, int width, int height,
background_colour, background_colour,
repeat_x, repeat_y, repeat_x, repeat_y,
IMAGE_PLOT_TINCT_OPAQUE); IMAGE_PLOT_TINCT_OPAQUE);
break; */break;
#endif #endif
#ifdef WITH_GIF #ifdef WITH_GIF
case CONTENT_GIF: case CONTENT_GIF:

View File

@ -430,18 +430,18 @@ void ro_gui_save_object_native(struct content *c, char *path)
switch (c->type) { switch (c->type) {
#ifdef WITH_JPEG #ifdef WITH_JPEG
case CONTENT_JPEG: case CONTENT_JPEG:
error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.jpeg.sprite_area, path); bitmap_save(c->bitmap, path);
break; break;
#endif #endif
#ifdef WITH_PNG #ifdef WITH_PNG
case CONTENT_PNG: case CONTENT_PNG:
error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.png.sprite_area, path); /* error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.png.sprite_area, path);
break; break;*/
#endif #endif
#ifdef WITH_MNG #ifdef WITH_MNG
case CONTENT_JNG: case CONTENT_JNG:
case CONTENT_MNG: case CONTENT_MNG:
error = xosspriteop_save_sprite_file(osspriteop_USER_AREA, c->data.mng.sprite_area, path); bitmap_save(c->bitmap, path);
break; break;
#endif #endif
#ifdef WITH_GIF #ifdef WITH_GIF

View File

@ -703,17 +703,18 @@ static bool add_graphic(struct content *content, struct box *box,
/* cast-tastic... */ /* cast-tastic... */
switch (content->type) { switch (content->type) {
case CONTENT_JPEG: 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; break;
#ifdef WITH_PNG #ifdef WITH_PNG
case CONTENT_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; break;
#endif #endif
#ifdef WITH_MNG #ifdef WITH_MNG
case CONTENT_JNG: case CONTENT_JNG:
case CONTENT_MNG: 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; break;
#endif #endif
case CONTENT_GIF: case CONTENT_GIF:
@ -742,17 +743,17 @@ static bool add_graphic(struct content *content, struct box *box,
switch (content->type) { switch (content->type) {
case CONTENT_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->data.jpeg.sprite_area+content->data.jpeg.sprite_area->first, (unsigned)sprite_length);*/
break; break;
#ifdef WITH_PNG #ifdef WITH_PNG
case CONTENT_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; break;
#endif #endif
#ifdef WITH_MNG #ifdef WITH_MNG
case CONTENT_JNG: case CONTENT_JNG:
case CONTENT_MNG: 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; break;
#endif #endif
case CONTENT_GIF: case CONTENT_GIF:

View File

@ -23,11 +23,11 @@
#define WITH_COOKIES #define WITH_COOKIES
/* Image renderering modules */ /* Image renderering modules */
#define WITH_JPEG
#define WITH_MNG
#define WITH_PNG
#if defined(riscos) || defined(ncos) || defined(debug) #if defined(riscos) || defined(ncos) || defined(debug)
#define WITH_GIF #define WITH_GIF
#define WITH_JPEG
#define WITH_PNG
#define WITH_MNG
#endif #endif
#if defined(riscos) || defined(ncos) #if defined(riscos) || defined(ncos)
#define WITH_DRAW #define WITH_DRAW