2004-07-16 23:47:03 +04:00
|
|
|
/*
|
2005-04-11 05:14:18 +04:00
|
|
|
* Copyright 2005 Richard Wilson <info@tinct.net>
|
2007-08-08 20:16:03 +04:00
|
|
|
*
|
|
|
|
* This file is part of NetSurf, http://www.netsurf-browser.org/
|
|
|
|
*
|
|
|
|
* NetSurf is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; version 2 of the License.
|
|
|
|
*
|
|
|
|
* NetSurf is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2004-07-16 23:47:03 +04:00
|
|
|
*/
|
|
|
|
|
2004-09-04 02:44:48 +04:00
|
|
|
/** \file
|
|
|
|
* Content for image/mng, image/png, and image/jng (implementation).
|
|
|
|
*/
|
|
|
|
|
2008-05-14 01:38:30 +04:00
|
|
|
#include "utils/config.h"
|
|
|
|
#ifdef WITH_MNG
|
|
|
|
|
2008-09-16 00:23:02 +04:00
|
|
|
/* This must come first due to libpng issues */
|
|
|
|
#include "content/content.h"
|
|
|
|
|
2004-07-16 23:47:03 +04:00
|
|
|
#include <assert.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
2004-09-04 02:44:48 +04:00
|
|
|
#include <sys/time.h>
|
|
|
|
#include <time.h>
|
2007-05-31 02:39:54 +04:00
|
|
|
#include <libmng.h>
|
|
|
|
#include "desktop/browser.h"
|
|
|
|
#include "desktop/options.h"
|
|
|
|
#include "desktop/plotters.h"
|
|
|
|
#include "image/bitmap.h"
|
|
|
|
#include "image/mng.h"
|
|
|
|
#include "utils/log.h"
|
|
|
|
#include "utils/messages.h"
|
|
|
|
#include "utils/utils.h"
|
2004-07-16 23:47:03 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* We do not currently support any form of colour/gamma correction, nor do
|
|
|
|
we support dynamic MNGs.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
static mng_bool nsmng_openstream(mng_handle mng);
|
2009-03-27 04:58:55 +03:00
|
|
|
static mng_bool nsmng_readdata(mng_handle mng, mng_ptr buffer,
|
|
|
|
mng_uint32 size, mng_uint32 *bytesread);
|
2004-07-26 00:45:16 +04:00
|
|
|
static mng_bool nsmng_closestream(mng_handle mng);
|
2009-03-27 04:58:55 +03:00
|
|
|
static mng_bool nsmng_processheader(mng_handle mng, mng_uint32 width,
|
|
|
|
mng_uint32 height);
|
2004-07-26 00:45:16 +04:00
|
|
|
static mng_ptr nsmng_getcanvasline(mng_handle mng, mng_uint32 line);
|
|
|
|
static mng_uint32 nsmng_gettickcount(mng_handle mng);
|
2009-03-27 04:58:55 +03:00
|
|
|
static mng_bool nsmng_refresh(mng_handle mng, mng_uint32 x, mng_uint32 y,
|
|
|
|
mng_uint32 w, mng_uint32 h);
|
2004-07-26 00:45:16 +04:00
|
|
|
static mng_bool nsmng_settimer(mng_handle mng, mng_uint32 msecs);
|
|
|
|
static void nsmng_animate(void *p);
|
2008-06-01 04:15:53 +04:00
|
|
|
static bool nsmng_broadcast_error(struct content *c, mng_retcode code);
|
2004-08-11 20:26:13 +04:00
|
|
|
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);
|
2004-09-04 02:44:48 +04:00
|
|
|
#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
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
bool nsmng_create(struct content *c, const char *params[])
|
|
|
|
{
|
2008-06-01 04:15:53 +04:00
|
|
|
mng_retcode code;
|
|
|
|
union content_msg_data msg_data;
|
2004-07-26 00:45:16 +04:00
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(c != NULL);
|
|
|
|
assert(params != NULL);
|
|
|
|
|
2004-09-04 02:44:48 +04:00
|
|
|
/* Initialise the library
|
2004-07-26 00:45:16 +04:00
|
|
|
*/
|
2004-09-04 02:44:48 +04:00
|
|
|
#ifdef MNG_INTERNAL_MEMMNGMT
|
2004-07-26 00:45:16 +04:00
|
|
|
c->data.mng.handle = mng_initialize(c, MNG_NULL, MNG_NULL, MNG_NULL);
|
2004-09-04 02:44:48 +04:00
|
|
|
#else
|
|
|
|
c->data.mng.handle = mng_initialize(c, nsmng_alloc, nsmng_free, MNG_NULL);
|
|
|
|
#endif
|
2004-07-26 00:45:16 +04:00
|
|
|
if (c->data.mng.handle == MNG_NULL) {
|
|
|
|
LOG(("Unable to initialise MNG library."));
|
2008-06-01 04:15:53 +04:00
|
|
|
msg_data.error = messages_get("NoMemory");
|
|
|
|
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
|
|
|
|
return false;
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* We need to decode in suspension mode
|
|
|
|
*/
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_set_suspensionmode(c->data.mng.handle, MNG_TRUE);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set suspension mode."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* We need to register our callbacks
|
|
|
|
*/
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_openstream(c->data.mng.handle, nsmng_openstream);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set openstream callback."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_readdata(c->data.mng.handle, nsmng_readdata);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set readdata callback."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_closestream(c->data.mng.handle, nsmng_closestream);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set closestream callback."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_processheader(c->data.mng.handle, nsmng_processheader);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set processheader callback."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Register our callbacks for displaying
|
|
|
|
*/
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_getcanvasline(c->data.mng.handle, nsmng_getcanvasline);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set getcanvasline callback."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_refresh(c->data.mng.handle, nsmng_refresh);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set refresh callback."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_gettickcount(c->data.mng.handle, nsmng_gettickcount);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set gettickcount callback."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_settimer(c->data.mng.handle, nsmng_settimer);
|
|
|
|
if (code) {
|
2004-07-26 00:45:16 +04:00
|
|
|
LOG(("Unable to set settimer callback."));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-08-11 20:26:13 +04:00
|
|
|
/* register error handling function */
|
2008-06-01 04:15:53 +04:00
|
|
|
code = mng_setcb_errorproc(c->data.mng.handle, nsmng_errorproc);
|
|
|
|
if (code) {
|
2004-08-11 20:26:13 +04:00
|
|
|
LOG(("Unable to set errorproc"));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, code);
|
2004-08-11 20:26:13 +04:00
|
|
|
}
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Initialise the reading
|
|
|
|
*/
|
|
|
|
c->data.mng.read_start = true;
|
|
|
|
c->data.mng.read_resume = false;
|
|
|
|
c->data.mng.read_size = 0;
|
|
|
|
c->data.mng.waiting = false;
|
2005-09-17 23:59:02 +04:00
|
|
|
|
|
|
|
c->data.mng.displayed = false;
|
2004-07-26 00:45:16 +04:00
|
|
|
return true;
|
2004-07-16 23:47:03 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* START OF CALLBACKS REQUIRED FOR READING
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_bool nsmng_openstream(mng_handle mng)
|
|
|
|
{
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
2004-07-26 00:45:16 +04:00
|
|
|
return MNG_TRUE;
|
|
|
|
}
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_bool nsmng_readdata(mng_handle mng, mng_ptr buffer, mng_uint32 size,
|
|
|
|
mng_uint32 *bytesread)
|
|
|
|
{
|
2004-07-26 00:45:16 +04:00
|
|
|
struct content *c;
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
|
|
|
assert(buffer != NULL);
|
|
|
|
assert(bytesread != NULL);
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Get our content back
|
|
|
|
*/
|
|
|
|
c = (struct content *)mng_get_userdata(mng);
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(c != NULL);
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Copy any data we have (maximum of 'size')
|
|
|
|
*/
|
|
|
|
*bytesread = ((c->source_size - c->data.mng.read_size) < size) ?
|
|
|
|
(c->source_size - c->data.mng.read_size) : size;
|
2004-08-11 20:26:13 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
if ((*bytesread) > 0) {
|
2009-03-27 04:58:55 +03:00
|
|
|
memcpy(buffer, c->source_data + c->data.mng.read_size,
|
|
|
|
*bytesread);
|
2004-07-26 00:45:16 +04:00
|
|
|
c->data.mng.read_size += *bytesread;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return success
|
|
|
|
*/
|
|
|
|
return MNG_TRUE;
|
|
|
|
}
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_bool nsmng_closestream(mng_handle mng)
|
|
|
|
{
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
2004-07-26 00:45:16 +04:00
|
|
|
return MNG_TRUE;
|
|
|
|
}
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_bool nsmng_processheader(mng_handle mng, mng_uint32 width,
|
|
|
|
mng_uint32 height)
|
|
|
|
{
|
2004-07-26 00:45:16 +04:00
|
|
|
struct content *c;
|
|
|
|
union content_msg_data msg_data;
|
2008-08-13 18:11:05 +04:00
|
|
|
uint8_t *buffer;
|
2004-07-26 00:45:16 +04:00
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
/* This function is called when the header has been read and we
|
|
|
|
know the dimensions of the canvas.
|
2004-07-26 00:45:16 +04:00
|
|
|
*/
|
|
|
|
c = (struct content *)mng_get_userdata(mng);
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(c != NULL);
|
|
|
|
|
2006-02-22 04:58:19 +03:00
|
|
|
c->bitmap = bitmap_create(width, height, BITMAP_NEW);
|
2004-09-04 02:44:48 +04:00
|
|
|
if (!c->bitmap) {
|
2004-07-26 00:45:16 +04:00
|
|
|
msg_data.error = messages_get("NoMemory");
|
|
|
|
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
|
|
|
|
LOG(("Insufficient memory to create canvas."));
|
|
|
|
return MNG_FALSE;
|
|
|
|
}
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2008-06-01 04:15:53 +04:00
|
|
|
/* Get the buffer to ensure that it is allocated and the calls in
|
|
|
|
* nsmng_getcanvasline() succeed. */
|
|
|
|
buffer = bitmap_get_buffer(c->bitmap);
|
|
|
|
if (!buffer) {
|
|
|
|
msg_data.error = messages_get("NoMemory");
|
|
|
|
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
|
|
|
|
LOG(("Insufficient memory to create canvas."));
|
|
|
|
return MNG_FALSE;
|
|
|
|
}
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Initialise the content size
|
|
|
|
*/
|
|
|
|
c->width = width;
|
|
|
|
c->height = height;
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Set the canvas style
|
|
|
|
*/
|
|
|
|
if (mng_set_canvasstyle(mng, MNG_CANVAS_RGBA8) != MNG_NOERROR) {
|
|
|
|
LOG(("Error setting canvas style."));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return success
|
|
|
|
*/
|
|
|
|
return MNG_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* END OF CALLBACKS REQUIRED FOR READING
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
bool nsmng_process_data(struct content *c, char *data, unsigned int size)
|
|
|
|
{
|
2004-07-26 00:45:16 +04:00
|
|
|
mng_retcode status;
|
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(c != NULL);
|
|
|
|
assert(data != NULL);
|
|
|
|
|
|
|
|
/* We only need to do any processing if we're starting/resuming reading.
|
|
|
|
*/
|
2009-03-27 04:58:55 +03:00
|
|
|
if ((!c->data.mng.read_resume) && (!c->data.mng.read_start))
|
|
|
|
return true;
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Try to start processing, or process some more data
|
|
|
|
*/
|
|
|
|
if (c->data.mng.read_start) {
|
|
|
|
status = mng_read(c->data.mng.handle);
|
|
|
|
c->data.mng.read_start = false;
|
|
|
|
} else {
|
|
|
|
status = mng_read_resume(c->data.mng.handle);
|
|
|
|
}
|
|
|
|
c->data.mng.read_resume = (status == MNG_NEEDMOREDATA);
|
|
|
|
if ((status != MNG_NOERROR) && (status != MNG_NEEDMOREDATA)) {
|
|
|
|
LOG(("Failed to start/continue reading (%i).", status));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, status);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Continue onwards
|
2004-07-30 20:14:44 +04:00
|
|
|
*/
|
2004-07-16 23:47:03 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
bool nsmng_convert(struct content *c, int width, int height)
|
|
|
|
{
|
2004-07-26 00:45:16 +04:00
|
|
|
mng_retcode status;
|
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
union content_msg_data msg_data;
|
|
|
|
|
|
|
|
assert(c != NULL);
|
|
|
|
|
2005-01-26 00:42:37 +03:00
|
|
|
/* by this point, the png should have been parsed
|
|
|
|
* and the bitmap created, so ensure that's the case
|
|
|
|
*/
|
|
|
|
if (!c->bitmap)
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, -1);
|
2004-07-26 00:45:16 +04:00
|
|
|
|
|
|
|
/* Set the title
|
|
|
|
*/
|
|
|
|
c->title = malloc(100);
|
2005-01-02 07:04:41 +03:00
|
|
|
if (!c->title) {
|
|
|
|
msg_data.error = messages_get("NoMemory");
|
|
|
|
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (c->type == CONTENT_MNG) {
|
|
|
|
snprintf(c->title, 100, messages_get("MNGTitle"),
|
|
|
|
c->width, c->height, c->source_size);
|
|
|
|
} else if (c->type == CONTENT_PNG) {
|
|
|
|
snprintf(c->title, 100, messages_get("PNGTitle"),
|
|
|
|
c->width, c->height, c->source_size);
|
|
|
|
} else {
|
|
|
|
snprintf(c->title, 100, messages_get("JNGTitle"),
|
|
|
|
c->width, c->height, c->source_size);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2005-01-02 07:04:41 +03:00
|
|
|
|
2004-09-04 02:44:48 +04:00
|
|
|
c->size += c->width * c->height * 4 + 100;
|
2004-07-26 00:45:16 +04:00
|
|
|
c->status = CONTENT_STATUS_DONE;
|
2008-03-10 15:41:41 +03:00
|
|
|
/* Done: update status bar */
|
|
|
|
content_set_status(c, "");
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2005-09-17 23:59:02 +04:00
|
|
|
/* jmb: I'm really not sure that this should be here.
|
|
|
|
* The *_convert functions are for converting a content into a
|
|
|
|
* displayable format. They should not, however, do anything which
|
|
|
|
* could cause the content to be displayed; the content may have
|
|
|
|
* hidden visibility or be a fallback for an object; this
|
|
|
|
* information is not available here (nor is there any need for it
|
|
|
|
* to be).
|
|
|
|
* The specific issue here is that mng_display calls the display
|
|
|
|
* callbacks, which include nsmng_refresh. nsmng_refresh forces
|
|
|
|
* a content to be redrawn regardless of whether it should be
|
|
|
|
* displayed or not.
|
|
|
|
*/
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Start displaying
|
|
|
|
*/
|
|
|
|
status = mng_display(c->data.mng.handle);
|
|
|
|
if ((status != MNG_NOERROR) && (status != MNG_NEEDTIMERWAIT)) {
|
|
|
|
LOG(("Unable to start display (%i)", status));
|
2008-06-01 04:15:53 +04:00
|
|
|
return nsmng_broadcast_error(c, status);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2005-06-23 21:22:28 +04:00
|
|
|
bitmap_modified(c->bitmap);
|
2004-10-18 01:12:32 +04:00
|
|
|
|
2004-10-05 03:54:42 +04:00
|
|
|
/* Optimise the plotting of JNG/PNGs
|
|
|
|
*/
|
2009-03-27 04:58:55 +03:00
|
|
|
c->data.mng.opaque_test_pending = (c->type == CONTENT_PNG) ||
|
|
|
|
(c->type == CONTENT_JNG);
|
2005-04-29 05:35:52 +04:00
|
|
|
if (c->data.mng.opaque_test_pending)
|
|
|
|
bitmap_set_opaque(c->bitmap, false);
|
2006-12-03 23:53:56 +03:00
|
|
|
|
|
|
|
/* free associated memory except for mngs where it may be subsequently needed for
|
|
|
|
* animation decoding. */
|
|
|
|
if (c->type != CONTENT_MNG)
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_cleanup((mng_handle *) &c->data.mng.handle);
|
2004-07-16 23:47:03 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* START OF CALLBACKS REQUIRED FOR DISPLAYING
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_ptr nsmng_getcanvasline(mng_handle mng, mng_uint32 line)
|
|
|
|
{
|
2004-07-26 00:45:16 +04:00
|
|
|
struct content *c;
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Get our content back
|
|
|
|
*/
|
|
|
|
c = (struct content *)mng_get_userdata(mng);
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(c != NULL);
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Calculate the address
|
|
|
|
*/
|
2004-09-04 02:44:48 +04:00
|
|
|
return bitmap_get_buffer(c->bitmap) +
|
|
|
|
bitmap_get_rowstride(c->bitmap) * line;
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-09-04 02:44:48 +04:00
|
|
|
/**
|
|
|
|
* Get the wall-clock time in milliseconds since some fixed time.
|
|
|
|
*/
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_uint32 nsmng_gettickcount(mng_handle mng)
|
|
|
|
{
|
2004-09-04 02:44:48 +04:00
|
|
|
static bool start = true;
|
|
|
|
static time_t t0;
|
|
|
|
struct timeval tv;
|
2008-08-11 20:44:12 +04:00
|
|
|
#if defined(__SVR4) && defined(__sun) || defined(__NetBSD__) || \
|
|
|
|
defined(__APPLE__)
|
|
|
|
/* Solaris, NetBSD, and OS X don't have this structure, and ignore the
|
|
|
|
* second parameter to gettimeofday()
|
2007-06-16 02:07:11 +04:00
|
|
|
*/
|
|
|
|
int tz;
|
|
|
|
#else
|
2004-09-04 02:44:48 +04:00
|
|
|
struct timezone tz;
|
2007-06-16 02:07:11 +04:00
|
|
|
#endif
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
|
|
|
|
2004-09-04 02:44:48 +04:00
|
|
|
gettimeofday(&tv, &tz);
|
|
|
|
if (start) {
|
|
|
|
t0 = tv.tv_sec;
|
|
|
|
start = false;
|
|
|
|
}
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-09-04 02:44:48 +04:00
|
|
|
return (tv.tv_sec - t0) * 1000 + tv.tv_usec / 1000;
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
|
|
|
|
2004-09-04 02:44:48 +04:00
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_bool nsmng_refresh(mng_handle mng, mng_uint32 x, mng_uint32 y,
|
|
|
|
mng_uint32 w, mng_uint32 h)
|
|
|
|
{
|
2004-07-26 00:45:16 +04:00
|
|
|
union content_msg_data data;
|
|
|
|
struct content *c;
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Get our content back
|
|
|
|
*/
|
|
|
|
c = (struct content *)mng_get_userdata(mng);
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(c != NULL);
|
2004-07-26 00:45:16 +04:00
|
|
|
|
|
|
|
/* Set the minimum redraw area
|
|
|
|
*/
|
|
|
|
data.redraw.x = x;
|
|
|
|
data.redraw.y = y;
|
|
|
|
data.redraw.width = w;
|
|
|
|
data.redraw.height = h;
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
/* Set the redraw area to the whole canvas to ensure that if
|
|
|
|
we can redraw something to trigger animation later then we do
|
2004-07-26 00:45:16 +04:00
|
|
|
*/
|
|
|
|
/* data.redraw.x = 0;
|
|
|
|
data.redraw.y = 0;
|
|
|
|
data.redraw.width = c->width;
|
|
|
|
data.redraw.height = c->height;
|
|
|
|
*/
|
|
|
|
/* Always redraw everything
|
|
|
|
*/
|
|
|
|
data.redraw.full_redraw = true;
|
|
|
|
|
|
|
|
/* Set the object characteristics
|
|
|
|
*/
|
|
|
|
data.redraw.object = c;
|
|
|
|
data.redraw.object_x = 0;
|
|
|
|
data.redraw.object_y = 0;
|
|
|
|
data.redraw.object_width = c->width;
|
|
|
|
data.redraw.object_height = c->height;
|
|
|
|
|
2005-09-17 23:59:02 +04:00
|
|
|
/* Only attempt to force the redraw if we've been requested to
|
|
|
|
* display the image in the first place (i.e. nsmng_redraw has
|
|
|
|
* been called). This avoids the situation of forcibly redrawing
|
|
|
|
* an image that shouldn't be shown (e.g. if the image is a fallback
|
|
|
|
* for an object that can't be rendered)
|
|
|
|
*/
|
|
|
|
if (c->data.mng.displayed)
|
|
|
|
content_broadcast(c, CONTENT_MSG_REDRAW, data);
|
|
|
|
|
2004-07-30 20:14:44 +04:00
|
|
|
return MNG_TRUE;
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_bool nsmng_settimer(mng_handle mng, mng_uint32 msecs)
|
|
|
|
{
|
2004-07-26 00:45:16 +04:00
|
|
|
struct content *c;
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Get our content back
|
|
|
|
*/
|
|
|
|
c = (struct content *)mng_get_userdata(mng);
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(c != NULL);
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Perform the scheduling
|
|
|
|
*/
|
|
|
|
schedule(msecs / 10, nsmng_animate, c);
|
2004-07-30 20:14:44 +04:00
|
|
|
return MNG_TRUE;
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* END OF CALLBACKS REQUIRED FOR DISPLAYING
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2009-03-27 04:58:55 +03:00
|
|
|
void nsmng_destroy(struct content *c)
|
|
|
|
{
|
2005-01-02 07:04:41 +03:00
|
|
|
|
|
|
|
assert (c != NULL);
|
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Cleanup the MNG structure and release the canvas memory
|
|
|
|
*/
|
|
|
|
schedule_remove(nsmng_animate, c);
|
2006-12-03 23:53:56 +03:00
|
|
|
if (c->type == CONTENT_MNG)
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_cleanup((mng_handle *) &c->data.mng.handle);
|
2004-09-04 02:44:48 +04:00
|
|
|
if (c->bitmap)
|
|
|
|
bitmap_destroy(c->bitmap);
|
2004-07-30 20:14:44 +04:00
|
|
|
free(c->title);
|
2004-07-16 23:47:03 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-08-11 20:26:13 +04:00
|
|
|
bool nsmng_redraw(struct content *c, int x, int y,
|
2004-07-16 23:47:03 +04:00
|
|
|
int width, int height,
|
|
|
|
int clip_x0, int clip_y0, int clip_x1, int clip_y1,
|
2008-09-29 02:37:13 +04:00
|
|
|
float scale, colour background_colour)
|
2006-02-21 23:49:12 +03:00
|
|
|
{
|
2006-03-04 23:46:54 +03:00
|
|
|
bool ret;
|
|
|
|
|
|
|
|
/* mark image as having been requested to display */
|
|
|
|
c->data.mng.displayed = true;
|
|
|
|
|
|
|
|
if ((c->bitmap) && (c->data.mng.opaque_test_pending)) {
|
|
|
|
bitmap_set_opaque(c->bitmap, bitmap_test_opaque(c->bitmap));
|
|
|
|
c->data.mng.opaque_test_pending = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = plot.bitmap(x, y, width, height,
|
First merge of Adam Blokus' GSoC work from his branch 'branches/adamblokus/netsurf'.
Merged revisions 4212-4552,4554-4709,4711-4724 via svnmerge from
svn://svn.netsurf-browser.org/branches/adamblokus/netsurf
........
r4212 | adamblokus | 2008-05-26 19:42:31 +0200 (Mon, 26 May 2008) | 4 lines
Pdf plotting skeleton pinned on Print Preview in GTK.
Just creates a file and draws lines.
........
r4213 | adamblokus | 2008-05-27 00:11:03 +0200 (Tue, 27 May 2008) | 4 lines
Pdf plotter - added drawing some graphic primitives.
Still with limited functionality, but a snapshot of the
currently viewed page can be made and resembles the original.
........
r4214 | adamblokus | 2008-05-27 11:43:31 +0200 (Tue, 27 May 2008) | 2 lines
Corrected encoding name
........
r4215 | adamblokus | 2008-05-27 12:47:26 +0200 (Tue, 27 May 2008) | 3 lines
Colours and polygons added.
........
r4217 | adamblokus | 2008-05-27 21:39:35 +0200 (Tue, 27 May 2008) | 6 lines
Added rectangles, filled boxes and clipping.
Taken into consideration joty's comments.
Added a todo list for this part.
Added some debug stuff and checking boundaries.
........
r4218 | adamblokus | 2008-05-28 12:37:30 +0200 (Wed, 28 May 2008) | 2 lines
Added path ploting (not sure if valid argument order for bezier) and dashed/dotted line styles
........
r4221 | adamblokus | 2008-05-28 22:11:05 +0200 (Wed, 28 May 2008) | 3 lines
Some more options in graphic primitives and normalizing some parameters.
........
r4235 | adamblokus | 2008-05-31 22:54:56 +0200 (Sat, 31 May 2008) | 4 lines
Plotting changed as jmb suggested (is the least invasive one from the possible)
Added dummy bitmap plotting - way of plotting an image is determined by its type.
........
r4251 | adamblokus | 2008-06-03 17:12:15 +0200 (Tue, 03 Jun 2008) | 3 lines
Added plotting jpg and png images - quite a lot to improve in this code, but it seems to work ;)
........
r4263 | adamblokus | 2008-06-05 14:20:32 +0200 (Thu, 05 Jun 2008) | 3 lines
Added hadling images other than png and jpeg - with transparency.
........
r4267 | adamblokus | 2008-06-06 15:36:34 +0200 (Fri, 06 Jun 2008) | 5 lines
Added handling NULL-returns from all mallocs.
Added plot_bitmap_tile handling.
Changed code style a little.
........
r4327 | adamblokus | 2008-06-12 17:46:34 +0200 (Thu, 12 Jun 2008) | 5 lines
Added a first prototype of the paged-output organization.
Still not sure about naming, file locations etc.
Works with the same pdf plotting as before.
........
r4328 | adamblokus | 2008-06-13 13:52:15 +0200 (Fri, 13 Jun 2008) | 4 lines
Added primitive width adjustment and outputing the whole
website in multiple pages.
........
r4336 | joty | 2008-06-15 15:06:57 +0200 (Sun, 15 Jun 2008) | 1 line
Fix RISC OS build failure (change r4235 wasn't complete).
........
r4337 | joty | 2008-06-15 18:15:32 +0200 (Sun, 15 Jun 2008) | 16 lines
This enables "Export PDF" in RISC OS build:
- Docs/Doxyfile(PREDEFINED): Added WITH_PDF_EXPORT
- Makefile.sources(S_PDF): Add to RISC OS target as well.
- utils/config.h: Define WITH_PDF_EXPORT which controls if we want to have
PDF export functionality or not.
- riscos/save_pdf.c,riscos/save_pdf.h(save_as_pdf): Use PDF print API made
by Adam Blokus to write a PDF file under RISC OS.
- riscos/save.c: Call save_as_pdf added.
- riscos/menus.c: Add 'Export->PDF' menu entry.
- riscos/menus.h(menu_action): Added BROWSER_EXPORT_PDF.
- desktop/gui.h(gui_save_type): Added GUI_SAVE_PDF.
- desktop/print.c(print_run): Added return value.
- Makefile(CCACHE): Moved closed to the place where CC is set for the first time.
(LDFLAGS): Centralised adding all non-pkgconfig libraries and added Haru + PNG libs.
........
r4343 | adamblokus | 2008-06-16 01:08:52 +0200 (Mon, 16 Jun 2008) | 3 lines
Added margins and page size adjustment.
........
r4412 | adamblokus | 2008-06-21 20:22:07 +0200 (Sat, 21 Jun 2008) | 4 lines
Added 'fuzzy' margins on page bottom.
Disabled direct png embedding, because it is too unstable in Haru now.
........
r4421 | adamblokus | 2008-06-22 18:52:28 +0200 (Sun, 22 Jun 2008) | 2 lines
Added "Save as.." dialog and Export->PDF menu entry. Print preview still works with default path.
........
r4437 | adamblokus | 2008-06-25 02:44:46 +0200 (Wed, 25 Jun 2008) | 4 lines
Added skeleton of applying loose layout.
Minor code cleaning-up.
........
r4492 | adamblokus | 2008-07-02 09:02:42 +0200 (Wed, 02 Jul 2008) | 5 lines
Implemented the elementar ideas of the loose layout.
Added scaling in the printing routine.
Added some basic demonstrations.
........
r4493 | adamblokus | 2008-07-02 09:05:55 +0200 (Wed, 02 Jul 2008) | 3 lines
Cleaned up the loosing code - commited to much of leftover rubbish code.
........
r4507 | adamblokus | 2008-07-04 14:25:48 +0200 (Fri, 04 Jul 2008) | 4 lines
Added duplicating box tree and current content - window flickering during printing solved.
Minor error checking after new HPDF_Image_AddSMask call.
........
r4515 | adamblokus | 2008-07-06 22:28:16 +0200 (Sun, 06 Jul 2008) | 2 lines
Changes in loosen layout (image resizing).
........
r4517 | adamblokus | 2008-07-06 22:38:23 +0200 (Sun, 06 Jul 2008) | 2 lines
Added pdf font handling and rendering functions with the use of Haru functions.
........
r4555 | adamblokus | 2008-07-10 00:59:05 +0200 (Thu, 10 Jul 2008) | 2 lines
Added a very basic and still buggy GTK print implementation.
........
r4565 | adamblokus | 2008-07-10 14:50:16 +0200 (Thu, 10 Jul 2008) | 2 lines
Added gtk printing one more time - I have forgotten to add the main file.
........
r4566 | adamblokus | 2008-07-10 14:57:02 +0200 (Thu, 10 Jul 2008) | 2 lines
removed error with comment
........
r4569 | adamblokus | 2008-07-10 15:52:55 +0200 (Thu, 10 Jul 2008) | 5 lines
Major style improvements - added a lot of doxygen comments,
followed tlsa's style guide.
Added some more error checking, too.
........
r4575 | adamblokus | 2008-07-10 18:48:26 +0200 (Thu, 10 Jul 2008) | 2 lines
Cleaned up the code.
........
r4687 | adamblokus | 2008-07-17 14:17:19 +0200 (Thu, 17 Jul 2008) | 2 lines
Changed everything according to jmb's review plus some minor bug fixes to gtk_print.
........
r4688 | adamblokus | 2008-07-17 17:16:34 +0200 (Thu, 17 Jul 2008) | 2 lines
Solved the netsurf.glade clash from r4421.
........
r4693 | adamblokus | 2008-07-18 18:11:51 +0200 (Fri, 18 Jul 2008) | 2 lines
Fixed bug with wrong number of pages in gtk printing.
........
r4695 | adamblokus | 2008-07-18 19:59:24 +0200 (Fri, 18 Jul 2008) | 3 lines
- fixed uncommented line from the previous commit
- fixed bug with scale bigger than 1.0 (incorretly clipped page)
........
r4696 | adamblokus | 2008-07-18 23:28:00 +0200 (Fri, 18 Jul 2008) | 2 lines
Fixed bug in gtk_print_font_paint (and nsfont_paint).
........
r4697 | adamblokus | 2008-07-18 23:35:38 +0200 (Fri, 18 Jul 2008) | 2 lines
Bug fix in nsfont_paint.
........
r4711 | adamblokus | 2008-07-19 22:44:15 +0200 (Sat, 19 Jul 2008) | 2 lines
Added gtk_selection files.
........
r4712 | adamblokus | 2008-07-20 11:15:06 +0200 (Sun, 20 Jul 2008) | 2 lines
Addam missing glade files.
........
r4713 | joty | 2008-07-20 17:13:10 +0200 (Sun, 20 Jul 2008) | 1 line
Follow change r4517 for RISC OS and BeOS platforms : Added pdf font handling and rendering functions with the use of Haru functions.
........
r4714 | joty | 2008-07-20 18:19:50 +0200 (Sun, 20 Jul 2008) | 1 line
Declare haru_nsfont iso define an instance for each C source including the font_haru.h header. This fixes breakage of PDF export on RISC OS.
........
r4724 | adamblokus | 2008-07-23 03:30:08 +0200 (Wed, 23 Jul 2008) | 6 lines
Applied changes according to joty's review.
Added checking the dimensions of a plotted image to pdf plotter.
Commented out jpg embedding (it seems to cause some problems
I'll bring it back when I figure out what's wrong) .
Added back some files removed by mistake.
........
svn path=/trunk/netsurf/; revision=4741
2008-07-26 20:01:59 +04:00
|
|
|
c->bitmap, background_colour, c);
|
2006-03-04 23:46:54 +03:00
|
|
|
|
|
|
|
/* Check if we need to restart the animation
|
|
|
|
*/
|
|
|
|
if ((c->data.mng.waiting) && (option_animate_images))
|
|
|
|
nsmng_animate(c);
|
|
|
|
|
|
|
|
return ret;
|
2006-02-21 23:49:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool nsmng_redraw_tiled(struct content *c, int x, int y,
|
|
|
|
int width, int height,
|
|
|
|
int clip_x0, int clip_y0, int clip_x1, int clip_y1,
|
2008-09-29 02:37:13 +04:00
|
|
|
float scale, colour background_colour,
|
2006-02-21 23:49:12 +03:00
|
|
|
bool repeat_x, bool repeat_y)
|
2004-08-15 23:06:24 +04:00
|
|
|
{
|
|
|
|
bool ret;
|
2005-01-02 07:04:41 +03:00
|
|
|
|
2005-09-17 23:59:02 +04:00
|
|
|
/* mark image as having been requested to display */
|
2006-02-21 23:49:12 +03:00
|
|
|
c->data.mng.displayed = true;
|
2005-09-17 23:59:02 +04:00
|
|
|
|
2005-04-11 05:14:18 +04:00
|
|
|
if ((c->bitmap) && (c->data.mng.opaque_test_pending)) {
|
2004-12-16 17:12:04 +03:00
|
|
|
bitmap_set_opaque(c->bitmap, bitmap_test_opaque(c->bitmap));
|
2005-04-11 05:14:18 +04:00
|
|
|
c->data.mng.opaque_test_pending = false;
|
|
|
|
}
|
2004-07-16 23:47:03 +04:00
|
|
|
|
2006-02-21 23:49:12 +03:00
|
|
|
ret = plot.bitmap_tile(x, y, width, height,
|
|
|
|
c->bitmap, background_colour,
|
First merge of Adam Blokus' GSoC work from his branch 'branches/adamblokus/netsurf'.
Merged revisions 4212-4552,4554-4709,4711-4724 via svnmerge from
svn://svn.netsurf-browser.org/branches/adamblokus/netsurf
........
r4212 | adamblokus | 2008-05-26 19:42:31 +0200 (Mon, 26 May 2008) | 4 lines
Pdf plotting skeleton pinned on Print Preview in GTK.
Just creates a file and draws lines.
........
r4213 | adamblokus | 2008-05-27 00:11:03 +0200 (Tue, 27 May 2008) | 4 lines
Pdf plotter - added drawing some graphic primitives.
Still with limited functionality, but a snapshot of the
currently viewed page can be made and resembles the original.
........
r4214 | adamblokus | 2008-05-27 11:43:31 +0200 (Tue, 27 May 2008) | 2 lines
Corrected encoding name
........
r4215 | adamblokus | 2008-05-27 12:47:26 +0200 (Tue, 27 May 2008) | 3 lines
Colours and polygons added.
........
r4217 | adamblokus | 2008-05-27 21:39:35 +0200 (Tue, 27 May 2008) | 6 lines
Added rectangles, filled boxes and clipping.
Taken into consideration joty's comments.
Added a todo list for this part.
Added some debug stuff and checking boundaries.
........
r4218 | adamblokus | 2008-05-28 12:37:30 +0200 (Wed, 28 May 2008) | 2 lines
Added path ploting (not sure if valid argument order for bezier) and dashed/dotted line styles
........
r4221 | adamblokus | 2008-05-28 22:11:05 +0200 (Wed, 28 May 2008) | 3 lines
Some more options in graphic primitives and normalizing some parameters.
........
r4235 | adamblokus | 2008-05-31 22:54:56 +0200 (Sat, 31 May 2008) | 4 lines
Plotting changed as jmb suggested (is the least invasive one from the possible)
Added dummy bitmap plotting - way of plotting an image is determined by its type.
........
r4251 | adamblokus | 2008-06-03 17:12:15 +0200 (Tue, 03 Jun 2008) | 3 lines
Added plotting jpg and png images - quite a lot to improve in this code, but it seems to work ;)
........
r4263 | adamblokus | 2008-06-05 14:20:32 +0200 (Thu, 05 Jun 2008) | 3 lines
Added hadling images other than png and jpeg - with transparency.
........
r4267 | adamblokus | 2008-06-06 15:36:34 +0200 (Fri, 06 Jun 2008) | 5 lines
Added handling NULL-returns from all mallocs.
Added plot_bitmap_tile handling.
Changed code style a little.
........
r4327 | adamblokus | 2008-06-12 17:46:34 +0200 (Thu, 12 Jun 2008) | 5 lines
Added a first prototype of the paged-output organization.
Still not sure about naming, file locations etc.
Works with the same pdf plotting as before.
........
r4328 | adamblokus | 2008-06-13 13:52:15 +0200 (Fri, 13 Jun 2008) | 4 lines
Added primitive width adjustment and outputing the whole
website in multiple pages.
........
r4336 | joty | 2008-06-15 15:06:57 +0200 (Sun, 15 Jun 2008) | 1 line
Fix RISC OS build failure (change r4235 wasn't complete).
........
r4337 | joty | 2008-06-15 18:15:32 +0200 (Sun, 15 Jun 2008) | 16 lines
This enables "Export PDF" in RISC OS build:
- Docs/Doxyfile(PREDEFINED): Added WITH_PDF_EXPORT
- Makefile.sources(S_PDF): Add to RISC OS target as well.
- utils/config.h: Define WITH_PDF_EXPORT which controls if we want to have
PDF export functionality or not.
- riscos/save_pdf.c,riscos/save_pdf.h(save_as_pdf): Use PDF print API made
by Adam Blokus to write a PDF file under RISC OS.
- riscos/save.c: Call save_as_pdf added.
- riscos/menus.c: Add 'Export->PDF' menu entry.
- riscos/menus.h(menu_action): Added BROWSER_EXPORT_PDF.
- desktop/gui.h(gui_save_type): Added GUI_SAVE_PDF.
- desktop/print.c(print_run): Added return value.
- Makefile(CCACHE): Moved closed to the place where CC is set for the first time.
(LDFLAGS): Centralised adding all non-pkgconfig libraries and added Haru + PNG libs.
........
r4343 | adamblokus | 2008-06-16 01:08:52 +0200 (Mon, 16 Jun 2008) | 3 lines
Added margins and page size adjustment.
........
r4412 | adamblokus | 2008-06-21 20:22:07 +0200 (Sat, 21 Jun 2008) | 4 lines
Added 'fuzzy' margins on page bottom.
Disabled direct png embedding, because it is too unstable in Haru now.
........
r4421 | adamblokus | 2008-06-22 18:52:28 +0200 (Sun, 22 Jun 2008) | 2 lines
Added "Save as.." dialog and Export->PDF menu entry. Print preview still works with default path.
........
r4437 | adamblokus | 2008-06-25 02:44:46 +0200 (Wed, 25 Jun 2008) | 4 lines
Added skeleton of applying loose layout.
Minor code cleaning-up.
........
r4492 | adamblokus | 2008-07-02 09:02:42 +0200 (Wed, 02 Jul 2008) | 5 lines
Implemented the elementar ideas of the loose layout.
Added scaling in the printing routine.
Added some basic demonstrations.
........
r4493 | adamblokus | 2008-07-02 09:05:55 +0200 (Wed, 02 Jul 2008) | 3 lines
Cleaned up the loosing code - commited to much of leftover rubbish code.
........
r4507 | adamblokus | 2008-07-04 14:25:48 +0200 (Fri, 04 Jul 2008) | 4 lines
Added duplicating box tree and current content - window flickering during printing solved.
Minor error checking after new HPDF_Image_AddSMask call.
........
r4515 | adamblokus | 2008-07-06 22:28:16 +0200 (Sun, 06 Jul 2008) | 2 lines
Changes in loosen layout (image resizing).
........
r4517 | adamblokus | 2008-07-06 22:38:23 +0200 (Sun, 06 Jul 2008) | 2 lines
Added pdf font handling and rendering functions with the use of Haru functions.
........
r4555 | adamblokus | 2008-07-10 00:59:05 +0200 (Thu, 10 Jul 2008) | 2 lines
Added a very basic and still buggy GTK print implementation.
........
r4565 | adamblokus | 2008-07-10 14:50:16 +0200 (Thu, 10 Jul 2008) | 2 lines
Added gtk printing one more time - I have forgotten to add the main file.
........
r4566 | adamblokus | 2008-07-10 14:57:02 +0200 (Thu, 10 Jul 2008) | 2 lines
removed error with comment
........
r4569 | adamblokus | 2008-07-10 15:52:55 +0200 (Thu, 10 Jul 2008) | 5 lines
Major style improvements - added a lot of doxygen comments,
followed tlsa's style guide.
Added some more error checking, too.
........
r4575 | adamblokus | 2008-07-10 18:48:26 +0200 (Thu, 10 Jul 2008) | 2 lines
Cleaned up the code.
........
r4687 | adamblokus | 2008-07-17 14:17:19 +0200 (Thu, 17 Jul 2008) | 2 lines
Changed everything according to jmb's review plus some minor bug fixes to gtk_print.
........
r4688 | adamblokus | 2008-07-17 17:16:34 +0200 (Thu, 17 Jul 2008) | 2 lines
Solved the netsurf.glade clash from r4421.
........
r4693 | adamblokus | 2008-07-18 18:11:51 +0200 (Fri, 18 Jul 2008) | 2 lines
Fixed bug with wrong number of pages in gtk printing.
........
r4695 | adamblokus | 2008-07-18 19:59:24 +0200 (Fri, 18 Jul 2008) | 3 lines
- fixed uncommented line from the previous commit
- fixed bug with scale bigger than 1.0 (incorretly clipped page)
........
r4696 | adamblokus | 2008-07-18 23:28:00 +0200 (Fri, 18 Jul 2008) | 2 lines
Fixed bug in gtk_print_font_paint (and nsfont_paint).
........
r4697 | adamblokus | 2008-07-18 23:35:38 +0200 (Fri, 18 Jul 2008) | 2 lines
Bug fix in nsfont_paint.
........
r4711 | adamblokus | 2008-07-19 22:44:15 +0200 (Sat, 19 Jul 2008) | 2 lines
Added gtk_selection files.
........
r4712 | adamblokus | 2008-07-20 11:15:06 +0200 (Sun, 20 Jul 2008) | 2 lines
Addam missing glade files.
........
r4713 | joty | 2008-07-20 17:13:10 +0200 (Sun, 20 Jul 2008) | 1 line
Follow change r4517 for RISC OS and BeOS platforms : Added pdf font handling and rendering functions with the use of Haru functions.
........
r4714 | joty | 2008-07-20 18:19:50 +0200 (Sun, 20 Jul 2008) | 1 line
Declare haru_nsfont iso define an instance for each C source including the font_haru.h header. This fixes breakage of PDF export on RISC OS.
........
r4724 | adamblokus | 2008-07-23 03:30:08 +0200 (Wed, 23 Jul 2008) | 6 lines
Applied changes according to joty's review.
Added checking the dimensions of a plotted image to pdf plotter.
Commented out jpg embedding (it seems to cause some problems
I'll bring it back when I figure out what's wrong) .
Added back some files removed by mistake.
........
svn path=/trunk/netsurf/; revision=4741
2008-07-26 20:01:59 +04:00
|
|
|
repeat_x, repeat_y, c);
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* Check if we need to restart the animation
|
|
|
|
*/
|
2004-12-09 13:30:44 +03:00
|
|
|
if ((c->data.mng.waiting) && (option_animate_images))
|
|
|
|
nsmng_animate(c);
|
2004-08-11 20:26:13 +04:00
|
|
|
|
2004-08-15 23:06:24 +04:00
|
|
|
return ret;
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Animates to the next frame
|
|
|
|
*/
|
2009-03-27 04:58:55 +03:00
|
|
|
void nsmng_animate(void *p)
|
|
|
|
{
|
2005-01-02 07:04:41 +03:00
|
|
|
struct content *c;
|
|
|
|
|
|
|
|
assert(p != NULL);
|
|
|
|
|
|
|
|
c = (struct content *)p;
|
2004-07-30 20:14:44 +04:00
|
|
|
|
2004-07-26 00:45:16 +04:00
|
|
|
/* If we used the last animation we advance, if not we try again later
|
|
|
|
*/
|
|
|
|
if (c->user_list->next == NULL) {
|
|
|
|
c->data.mng.waiting = true;
|
|
|
|
} else {
|
|
|
|
c->data.mng.waiting = false;
|
|
|
|
mng_display_resume(c->data.mng.handle);
|
2005-04-11 05:14:18 +04:00
|
|
|
c->data.mng.opaque_test_pending = true;
|
2005-06-23 21:22:28 +04:00
|
|
|
if (c->bitmap)
|
|
|
|
bitmap_modified(c->bitmap);
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Broadcasts an error message and returns false
|
|
|
|
*
|
|
|
|
* \param c the content to broadcast for
|
|
|
|
* \return false
|
|
|
|
*/
|
2008-06-01 04:15:53 +04:00
|
|
|
bool nsmng_broadcast_error(struct content *c, mng_retcode code)
|
|
|
|
{
|
2004-07-26 00:45:16 +04:00
|
|
|
union content_msg_data msg_data;
|
2008-06-01 04:15:53 +04:00
|
|
|
char error[100];
|
2005-01-02 07:04:41 +03:00
|
|
|
|
|
|
|
assert(c != NULL);
|
|
|
|
|
2008-06-01 04:15:53 +04:00
|
|
|
if (code == MNG_OUTOFMEMORY) {
|
|
|
|
msg_data.error = messages_get("NoMemory");
|
|
|
|
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
|
|
|
|
return false;
|
2004-07-26 00:45:16 +04:00
|
|
|
}
|
2008-06-01 04:15:53 +04:00
|
|
|
|
|
|
|
snprintf(error, sizeof error, messages_get("MNGError"), code);
|
|
|
|
msg_data.error = error;
|
2004-07-26 00:45:16 +04:00
|
|
|
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
|
|
|
|
return false;
|
2004-07-16 23:47:03 +04:00
|
|
|
}
|
2004-08-11 20:26:13 +04:00
|
|
|
|
2008-06-01 04:15:53 +04:00
|
|
|
|
2004-08-11 20:26:13 +04:00
|
|
|
mng_bool nsmng_errorproc(mng_handle mng, mng_int32 code,
|
2009-03-27 04:58:55 +03:00
|
|
|
mng_int8 severity, mng_chunkid chunktype, mng_uint32 chunkseq,
|
|
|
|
mng_int32 extra1, mng_int32 extra2, mng_pchar text)
|
2004-08-11 20:26:13 +04:00
|
|
|
{
|
|
|
|
struct content *c;
|
|
|
|
char chunk[5];
|
|
|
|
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(mng != NULL);
|
|
|
|
|
2004-08-11 20:26:13 +04:00
|
|
|
c = (struct content *)mng_get_userdata(mng);
|
2005-01-02 07:04:41 +03:00
|
|
|
assert(c != NULL);
|
2004-08-11 20:26:13 +04:00
|
|
|
|
|
|
|
chunk[0] = (char)((chunktype >> 24) & 0xFF);
|
|
|
|
chunk[1] = (char)((chunktype >> 16) & 0xFF);
|
|
|
|
chunk[2] = (char)((chunktype >> 8) & 0xFF);
|
|
|
|
chunk[3] = (char)((chunktype ) & 0xFF);
|
|
|
|
chunk[4] = '\0';
|
|
|
|
|
|
|
|
LOG(("error playing '%s' chunk %s (%d):", c->url, chunk, chunkseq));
|
|
|
|
LOG(("code %d severity %d extra1 %d extra2 %d text:'%s'", code,
|
|
|
|
severity, extra1, extra2, text));
|
|
|
|
|
|
|
|
return (0);
|
|
|
|
}
|
2004-09-04 02:44:48 +04:00
|
|
|
|
|
|
|
|
|
|
|
#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
|
|
|
|
|
2004-07-16 23:47:03 +04:00
|
|
|
#endif
|