mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-16 09:12:44 +03:00
e7f9dbcb10
The bitmap and image handling interfaces have changed within NetSurf and the webp image handling has not been fixed up appropriately to cope. After discussion with the other developers it has been decided that the webp support is not worth the necessary development effort to rewrite and maintain. The webp format is not in wide usage and Mozilla, Microsoft and Apple have not adopted it. This means the removal will not adversely impact NetSurf. Resolves:2310
159 lines
3.5 KiB
C
159 lines
3.5 KiB
C
/*
|
|
* Copyright 2011 John-Mark Bell <jmb@netsurf-browser.org>
|
|
*
|
|
* 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/>.
|
|
*/
|
|
|
|
#include <stdbool.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "utils/log.h"
|
|
#include "utils/messages.h"
|
|
#include "content/content.h"
|
|
#include "desktop/plotters.h"
|
|
#include "desktop/gui_internal.h"
|
|
|
|
#include "image/bitmap.h"
|
|
#include "image/bmp.h"
|
|
#include "image/gif.h"
|
|
#include "image/ico.h"
|
|
#include "image/jpeg.h"
|
|
#include "image/nssprite.h"
|
|
#include "image/png.h"
|
|
#include "image/rsvg.h"
|
|
#include "image/svg.h"
|
|
#include "image/image.h"
|
|
|
|
/**
|
|
* Initialise image content handlers
|
|
*
|
|
* \return NSERROR_OK on success, appropriate error otherwise.
|
|
*/
|
|
nserror image_init(void)
|
|
{
|
|
nserror error;
|
|
|
|
#ifdef WITH_BMP
|
|
error = nsbmp_init();
|
|
if (error != NSERROR_OK)
|
|
return error;
|
|
#endif
|
|
|
|
#ifdef WITH_GIF
|
|
error = nsgif_init();
|
|
if (error != NSERROR_OK)
|
|
return error;
|
|
#endif
|
|
|
|
#ifdef WITH_BMP
|
|
error = nsico_init();
|
|
if (error != NSERROR_OK)
|
|
return error;
|
|
#endif
|
|
|
|
#ifdef WITH_JPEG
|
|
error = nsjpeg_init();
|
|
if (error != NSERROR_OK)
|
|
return error;
|
|
#endif
|
|
|
|
#ifdef WITH_PNG
|
|
error = nspng_init();
|
|
if (error != NSERROR_OK)
|
|
return error;
|
|
#endif
|
|
|
|
#ifdef WITH_NSSPRITE
|
|
error = nssprite_init();
|
|
if (error != NSERROR_OK)
|
|
return error;
|
|
#endif
|
|
|
|
/* Prefer rsvg over libsvgtiny for svgs */
|
|
#ifdef WITH_NS_SVG
|
|
error = svg_init();
|
|
if (error != NSERROR_OK)
|
|
return error;
|
|
#endif
|
|
#ifdef WITH_RSVG
|
|
error = nsrsvg_init();
|
|
if (error != NSERROR_OK)
|
|
return error;
|
|
#endif
|
|
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
|
|
bool image_bitmap_plot(struct bitmap *bitmap,
|
|
struct content_redraw_data *data,
|
|
const struct rect *clip,
|
|
const struct redraw_context *ctx)
|
|
{
|
|
bitmap_flags_t flags = BITMAPF_NONE;
|
|
|
|
int width;
|
|
int height;
|
|
unsigned char *pixel;
|
|
plot_style_t fill_style;
|
|
struct rect area;
|
|
|
|
width = guit->bitmap->get_width(bitmap);
|
|
if (width == 1) {
|
|
height = guit->bitmap->get_height(bitmap);
|
|
if (height == 1) {
|
|
/* optimise 1x1 bitmap plot */
|
|
pixel = guit->bitmap->get_buffer(bitmap);
|
|
fill_style.fill_colour = pixel_to_colour(pixel);
|
|
|
|
if (guit->bitmap->get_opaque(bitmap) ||
|
|
((fill_style.fill_colour & 0xff000000) == 0xff000000)) {
|
|
|
|
area = *clip;
|
|
|
|
if (data->repeat_x != true) {
|
|
area.x0 = data->x;
|
|
area.x1 = data->x + data->width;
|
|
}
|
|
|
|
if (data->repeat_y != true) {
|
|
area.y0 = data->y;
|
|
area.y1 = data->y + data->height;
|
|
}
|
|
|
|
fill_style.stroke_type = PLOT_OP_TYPE_NONE;
|
|
fill_style.fill_type = PLOT_OP_TYPE_SOLID;
|
|
|
|
return ctx->plot->rectangle(area.x0, area.y0,
|
|
area.x1, area.y1,
|
|
&fill_style);
|
|
|
|
} else if ((fill_style.fill_colour & 0xff000000) == 0) {
|
|
/* transparent pixel used as spacer, skip it */
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* do the plot */
|
|
if (data->repeat_x)
|
|
flags |= BITMAPF_REPEAT_X;
|
|
if (data->repeat_y)
|
|
flags |= BITMAPF_REPEAT_Y;
|
|
|
|
return ctx->plot->bitmap(data->x, data->y, data->width, data->height,
|
|
bitmap, data->background_colour, flags);
|
|
}
|