mirror of
https://github.com/netsurf-browser/netsurf
synced 2025-02-22 17:34:19 +03:00
Update for modified libnsfb API
Make thumbnailing work svn path=/trunk/netsurf/; revision=13159
This commit is contained in:
parent
747c66c982
commit
820312eb35
@ -74,7 +74,7 @@ endif
|
||||
|
||||
# We make convert_image depend on fb_bitmap.h so that if we change
|
||||
# that header, we get new images built just in case.
|
||||
$(TOOLROOT)/convert_image: $(TOOLROOT)/created framebuffer/convert_image.c framebuffer/bitmap.h
|
||||
$(TOOLROOT)/convert_image: $(TOOLROOT)/created framebuffer/convert_image.c framebuffer/fbtk.h
|
||||
$(VQ)echo " HOST CC: $@"
|
||||
$(Q)$(HOST_CC) -o $@ framebuffer/convert_image.c -lpng
|
||||
|
||||
|
@ -18,11 +18,12 @@
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdbool.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <libnsfb.h>
|
||||
|
||||
#include "assert.h"
|
||||
#include "image/bitmap.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
|
||||
#include "utils/log.h"
|
||||
|
||||
/**
|
||||
@ -36,26 +37,29 @@
|
||||
|
||||
void *bitmap_create(int width, int height, unsigned int state)
|
||||
{
|
||||
struct bitmap *bitmap;
|
||||
nsfb_t *bm;
|
||||
|
||||
LOG(("width %d, height %d, state %u",width,height,state));
|
||||
|
||||
bitmap = calloc(1 , sizeof(struct bitmap));
|
||||
if (bitmap) {
|
||||
bitmap->pixdata = calloc(4, width * height);
|
||||
if (bitmap->pixdata != NULL) {
|
||||
bitmap->width = width;
|
||||
bitmap->height = height;
|
||||
bitmap->opaque = (state & BITMAP_OPAQUE) != 0;
|
||||
} else {
|
||||
free(bitmap);
|
||||
bitmap=NULL;
|
||||
}
|
||||
}
|
||||
bm = nsfb_new(NSFB_SURFACE_RAM);
|
||||
if (bm == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LOG(("bitmap %p", bitmap));
|
||||
if ((state & BITMAP_OPAQUE) == 0) {
|
||||
nsfb_set_geometry(bm, width, height, NSFB_FMT_ABGR8888);
|
||||
} else {
|
||||
nsfb_set_geometry(bm, width, height, NSFB_FMT_XBGR8888);
|
||||
}
|
||||
|
||||
return bitmap;
|
||||
if (nsfb_init(bm) == -1) {
|
||||
nsfb_free(bm);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LOG(("bitmap %p", bm));
|
||||
|
||||
return bm;
|
||||
}
|
||||
|
||||
|
||||
@ -71,14 +75,14 @@ void *bitmap_create(int width, int height, unsigned int state)
|
||||
|
||||
unsigned char *bitmap_get_buffer(void *bitmap)
|
||||
{
|
||||
struct bitmap *bm = bitmap;
|
||||
nsfb_t *bm = bitmap;
|
||||
unsigned char *bmpptr;
|
||||
|
||||
if (bitmap == NULL) {
|
||||
LOG(("NULL bitmap!"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return bm->pixdata;
|
||||
assert(bm != NULL);
|
||||
|
||||
nsfb_get_buffer(bm, &bmpptr, NULL);
|
||||
|
||||
return bmpptr;
|
||||
}
|
||||
|
||||
|
||||
@ -91,14 +95,14 @@ unsigned char *bitmap_get_buffer(void *bitmap)
|
||||
|
||||
size_t bitmap_get_rowstride(void *bitmap)
|
||||
{
|
||||
struct bitmap *bm = bitmap;
|
||||
nsfb_t *bm = bitmap;
|
||||
int bmpstride;
|
||||
|
||||
if (bitmap == NULL) {
|
||||
LOG(("NULL bitmap!"));
|
||||
return 0;
|
||||
}
|
||||
assert(bm != NULL);
|
||||
|
||||
return (bm->width) * 4;
|
||||
nsfb_get_buffer(bm, NULL, &bmpstride);
|
||||
|
||||
return bmpstride;
|
||||
}
|
||||
|
||||
|
||||
@ -110,15 +114,11 @@ size_t bitmap_get_rowstride(void *bitmap)
|
||||
|
||||
void bitmap_destroy(void *bitmap)
|
||||
{
|
||||
struct bitmap *bm = bitmap;
|
||||
nsfb_t *bm = bitmap;
|
||||
|
||||
if (bitmap == NULL) {
|
||||
LOG(("NULL bitmap!"));
|
||||
return;
|
||||
}
|
||||
|
||||
free(bm->pixdata);
|
||||
free(bm);
|
||||
assert(bm != NULL);
|
||||
|
||||
nsfb_free(bm);
|
||||
}
|
||||
|
||||
|
||||
@ -158,22 +158,24 @@ void bitmap_set_suspendable(void *bitmap, void *private_word,
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether a bitmap should be plotted opaque
|
||||
* Sets wether a bitmap should be plotted opaque
|
||||
*
|
||||
* \param bitmap a bitmap, as returned by bitmap_create()
|
||||
* \param opaque whether the bitmap should be plotted opaque
|
||||
*/
|
||||
void bitmap_set_opaque(void *bitmap, bool opaque)
|
||||
{
|
||||
struct bitmap *bm = bitmap;
|
||||
nsfb_t *bm = bitmap;
|
||||
|
||||
if (bitmap == NULL) {
|
||||
LOG(("NULL bitmap!"));
|
||||
return;
|
||||
}
|
||||
assert(bm != NULL);
|
||||
|
||||
LOG(("setting bitmap %p to %s", bm, opaque?"opaque":"transparent"));
|
||||
bm->opaque = opaque;
|
||||
|
||||
if (opaque) {
|
||||
nsfb_set_geometry(bm, 0, 0, NSFB_FMT_XBGR8888);
|
||||
} else {
|
||||
nsfb_set_geometry(bm, 0, 0, NSFB_FMT_ABGR8888);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -186,17 +188,21 @@ void bitmap_set_opaque(void *bitmap, bool opaque)
|
||||
bool bitmap_test_opaque(void *bitmap)
|
||||
{
|
||||
int tst;
|
||||
struct bitmap *bm = bitmap;
|
||||
nsfb_t *bm = bitmap;
|
||||
unsigned char *bmpptr;
|
||||
int width;
|
||||
int height;
|
||||
|
||||
if (bitmap == NULL) {
|
||||
LOG(("NULL bitmap!"));
|
||||
return false;
|
||||
}
|
||||
assert(bm != NULL);
|
||||
|
||||
tst = bm->width * bm->height;
|
||||
nsfb_get_buffer(bm, &bmpptr, NULL);
|
||||
|
||||
nsfb_get_geometry(bm, &width, &height, NULL);
|
||||
|
||||
tst = width * height;
|
||||
|
||||
while (tst-- > 0) {
|
||||
if (bm->pixdata[(tst << 2) + 3] != 0xff) {
|
||||
if (bmpptr[(tst << 2) + 3] != 0xff) {
|
||||
LOG(("bitmap %p has transparency",bm));
|
||||
return false;
|
||||
}
|
||||
@ -207,46 +213,50 @@ bool bitmap_test_opaque(void *bitmap)
|
||||
|
||||
|
||||
/**
|
||||
* Gets whether a bitmap should be plotted opaque
|
||||
* Gets weather a bitmap should be plotted opaque
|
||||
*
|
||||
* \param bitmap a bitmap, as returned by bitmap_create()
|
||||
*/
|
||||
bool bitmap_get_opaque(void *bitmap)
|
||||
{
|
||||
struct bitmap *bm = bitmap;
|
||||
nsfb_t *bm = bitmap;
|
||||
enum nsfb_format_e format;
|
||||
|
||||
if (bitmap == NULL) {
|
||||
LOG(("NULL bitmap!"));
|
||||
return false;
|
||||
}
|
||||
assert(bm != NULL);
|
||||
|
||||
return bm->opaque;
|
||||
nsfb_get_geometry(bm, NULL, NULL, &format);
|
||||
|
||||
if (format == NSFB_FMT_ABGR8888)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int bitmap_get_width(void *bitmap)
|
||||
{
|
||||
struct bitmap *bm = bitmap;
|
||||
nsfb_t *bm = bitmap;
|
||||
int width;
|
||||
|
||||
if (bitmap == NULL) {
|
||||
LOG(("NULL bitmap!"));
|
||||
return 0;
|
||||
}
|
||||
assert(bm != NULL);
|
||||
|
||||
return(bm->width);
|
||||
nsfb_get_geometry(bm, &width, NULL, NULL);
|
||||
|
||||
return(width);
|
||||
}
|
||||
|
||||
int bitmap_get_height(void *bitmap)
|
||||
{
|
||||
struct bitmap *bm = bitmap;
|
||||
nsfb_t *bm = bitmap;
|
||||
int height;
|
||||
|
||||
if (bitmap == NULL) {
|
||||
LOG(("NULL bitmap!"));
|
||||
return 0;
|
||||
}
|
||||
assert(bm != NULL);
|
||||
|
||||
return(bm->height);
|
||||
nsfb_get_geometry(bm, NULL, &height, NULL);
|
||||
|
||||
return(height);
|
||||
}
|
||||
|
||||
/* get bytes per pixel */
|
||||
size_t bitmap_get_bpp(void *bitmap)
|
||||
{
|
||||
return 4;
|
||||
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Copyright 2008 Vincent Sanders <vince@simtec.co.uk>
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#ifndef FRAMEBUFFER_BITMAP_H
|
||||
#define FRAMEBUFFER_BITMAP_H
|
||||
|
||||
struct bitmap {
|
||||
int width;
|
||||
int height;
|
||||
uint8_t *pixdata;
|
||||
bool opaque;
|
||||
|
||||
/* The following two are only used for cursors */
|
||||
int hot_x;
|
||||
int hot_y;
|
||||
};
|
||||
|
||||
#endif
|
@ -177,7 +177,10 @@ main(int argc, char **argv)
|
||||
fprintf(f, "#include <sys/types.h>\n\n");
|
||||
fprintf(f, "#include <stdint.h>\n\n");
|
||||
fprintf(f, "#include <stdbool.h>\n\n");
|
||||
fprintf(f, "#include \"framebuffer/bitmap.h\"\n\n");
|
||||
fprintf(f, "#include <libnsfb.h>\n\n");
|
||||
fprintf(f, "#include \"desktop/plot_style.h\"\n");
|
||||
fprintf(f, "#include \"framebuffer/gui.h\"\n");
|
||||
fprintf(f, "#include \"framebuffer/fbtk.h\"\n\n");
|
||||
|
||||
fprintf(f, "static uint8_t %s_pixdata[] = {\n", argv[3]);
|
||||
for (y = 0; y < HEIGHT; ++y) {
|
||||
@ -197,7 +200,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
fprintf(f, "};\n\n");
|
||||
|
||||
fprintf(f, "struct bitmap %s = {\n", argv[3]);
|
||||
fprintf(f, "struct fbtk_bitmap %s = {\n", argv[3]);
|
||||
fprintf(f, "\t.width\t\t= %d,\n", WIDTH);
|
||||
fprintf(f, "\t.height\t\t= %d,\n", HEIGHT);
|
||||
fprintf(f, "\t.hot_x\t\t= %d,\n", HOT_X);
|
||||
|
@ -61,6 +61,18 @@ typedef struct fbtk_callback_info {
|
||||
fbtk_widget_t *widget;
|
||||
} fbtk_callback_info;
|
||||
|
||||
/* structure for framebuffer toolkit bitmaps */
|
||||
struct fbtk_bitmap {
|
||||
int width;
|
||||
int height;
|
||||
uint8_t *pixdata;
|
||||
bool opaque;
|
||||
|
||||
/* The following two are only used for cursors */
|
||||
int hot_x;
|
||||
int hot_y;
|
||||
};
|
||||
|
||||
typedef int (*fbtk_callback)(fbtk_widget_t *widget, fbtk_callback_info *cbi);
|
||||
|
||||
/* enter pressed on writable icon */
|
||||
@ -349,9 +361,9 @@ void *fbtk_get_userpw(fbtk_widget_t *widget);
|
||||
* @param window The window to add the bitmap widget to.
|
||||
* @return new widget handle or NULL on error.
|
||||
*/
|
||||
fbtk_widget_t *fbtk_create_bitmap(fbtk_widget_t *window, int x, int y, int width, int height, colour c,struct bitmap *image);
|
||||
fbtk_widget_t *fbtk_create_bitmap(fbtk_widget_t *window, int x, int y, int width, int height, colour c,struct fbtk_bitmap *image);
|
||||
|
||||
void fbtk_set_bitmap(fbtk_widget_t *widget, struct bitmap *image);
|
||||
void fbtk_set_bitmap(fbtk_widget_t *widget, struct fbtk_bitmap *image);
|
||||
|
||||
/** Create a button widget.
|
||||
*
|
||||
@ -361,7 +373,7 @@ void fbtk_set_bitmap(fbtk_widget_t *widget, struct bitmap *image);
|
||||
* @param window The window to add the button widget to.
|
||||
* @return new widget handle or NULL on error.
|
||||
*/
|
||||
fbtk_widget_t *fbtk_create_button(fbtk_widget_t *window, int x, int y, int width, int height, colour c, struct bitmap *image, fbtk_callback click, void *pw);
|
||||
fbtk_widget_t *fbtk_create_button(fbtk_widget_t *window, int x, int y, int width, int height, colour c, struct fbtk_bitmap *image, fbtk_callback click, void *pw);
|
||||
|
||||
|
||||
|
||||
|
@ -28,7 +28,6 @@
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/image_data.h"
|
||||
|
||||
#include "widget.h"
|
||||
@ -70,7 +69,7 @@ fb_redraw_bitmap(fbtk_widget_t *widget, fbtk_callback_info *cbi)
|
||||
|
||||
/* exported function documented in fbtk.h */
|
||||
void
|
||||
fbtk_set_bitmap(fbtk_widget_t *widget, struct bitmap *image)
|
||||
fbtk_set_bitmap(fbtk_widget_t *widget, struct fbtk_bitmap *image)
|
||||
{
|
||||
if ((widget == NULL) || (widget->type != FB_WIDGET_TYPE_BITMAP))
|
||||
return;
|
||||
@ -88,7 +87,7 @@ fbtk_create_bitmap(fbtk_widget_t *parent,
|
||||
int width,
|
||||
int height,
|
||||
colour c,
|
||||
struct bitmap *image)
|
||||
struct fbtk_bitmap *image)
|
||||
{
|
||||
fbtk_widget_t *neww;
|
||||
|
||||
@ -111,7 +110,7 @@ fbtk_create_button(fbtk_widget_t *parent,
|
||||
int width,
|
||||
int height,
|
||||
colour c,
|
||||
struct bitmap *image,
|
||||
struct fbtk_bitmap *image,
|
||||
fbtk_callback click,
|
||||
void *pw)
|
||||
{
|
||||
|
@ -37,7 +37,6 @@
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/image_data.h"
|
||||
|
||||
#include "widget.h"
|
||||
|
@ -38,7 +38,6 @@
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/image_data.h"
|
||||
|
||||
#include "widget.h"
|
||||
@ -337,7 +336,7 @@ int
|
||||
fbtk_set_ptr(fbtk_widget_t *widget, fbtk_callback_info *cbi)
|
||||
{
|
||||
fbtk_widget_t *root = fbtk_get_root_widget(widget);
|
||||
struct bitmap *bm = cbi->context;
|
||||
struct fbtk_bitmap *bm = cbi->context;
|
||||
|
||||
nsfb_cursor_set(root->u.root.fb,
|
||||
(nsfb_colour_t *)bm->pixdata,
|
||||
|
@ -31,7 +31,6 @@
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/image_data.h"
|
||||
|
||||
#include "widget.h"
|
||||
|
@ -30,7 +30,6 @@
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/image_data.h"
|
||||
|
||||
#include "widget.h"
|
||||
|
@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <libnsfb.h>
|
||||
|
||||
#include "desktop/plotters.h"
|
||||
|
@ -165,7 +165,7 @@ struct fbtk_widget_s {
|
||||
|
||||
/* bitmap */
|
||||
struct {
|
||||
struct bitmap *bitmap;
|
||||
struct fbtk_bitmap *bitmap;
|
||||
} bitmap;
|
||||
|
||||
/* text */
|
||||
|
@ -30,11 +30,11 @@
|
||||
|
||||
#include "utils/log.h"
|
||||
#include "desktop/browser.h"
|
||||
#include "image/bitmap.h"
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/framebuffer.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/font.h"
|
||||
|
||||
/* netsurf framebuffer library handle */
|
||||
@ -175,8 +175,10 @@ framebuffer_plot_bitmap(int x, int y,
|
||||
nsfb_bbox_t clipbox;
|
||||
bool repeat_x = (flags & BITMAPF_REPEAT_X);
|
||||
bool repeat_y = (flags & BITMAPF_REPEAT_Y);
|
||||
|
||||
nsfb_plot_get_clip(nsfb, &clipbox);
|
||||
int bmwidth;
|
||||
int bmheight;
|
||||
unsigned char *bmptr;
|
||||
nsfb_t *bm = (nsfb_t *)bitmap;
|
||||
|
||||
/* x and y define coordinate of top left of of the initial explicitly
|
||||
* placed tile. The width and height are the image scaling and the
|
||||
@ -191,26 +193,19 @@ framebuffer_plot_bitmap(int x, int y,
|
||||
loc.x1 = loc.x0 + width;
|
||||
loc.y1 = loc.y0 + height;
|
||||
|
||||
if ((bitmap->width == 1) && (bitmap->height == 1)) {
|
||||
if ((*(nsfb_colour_t *)bitmap->pixdata & 0xff000000) == 0) {
|
||||
return true;
|
||||
}
|
||||
return nsfb_plot_rectangle_fill(nsfb, &loc, *(nsfb_colour_t *)bitmap->pixdata);
|
||||
|
||||
} else {
|
||||
return nsfb_plot_bitmap(nsfb, &loc,
|
||||
(nsfb_colour_t *)bitmap->pixdata,
|
||||
bitmap->width, bitmap->height,
|
||||
bitmap->width, !bitmap->opaque);
|
||||
}
|
||||
return nsfb_plot_copy(bm, NULL, nsfb, &loc);
|
||||
}
|
||||
|
||||
nsfb_plot_get_clip(nsfb, &clipbox);
|
||||
nsfb_get_geometry(bm, &bmwidth, &bmheight, NULL);
|
||||
nsfb_get_buffer(bm, &bmptr, NULL);
|
||||
|
||||
/* Optimise tiled plots of 1x1 bitmaps by replacing with a flat fill
|
||||
* of the area. Can only be done when image is fully opaque. */
|
||||
if ((bitmap->width == 1) && (bitmap->height == 1)) {
|
||||
if ((*(nsfb_colour_t *)bitmap->pixdata & 0xff000000) != 0) {
|
||||
if ((bmwidth == 1) && (bmheight == 1)) {
|
||||
if ((*(nsfb_colour_t *)bmptr & 0xff000000) != 0) {
|
||||
return nsfb_plot_rectangle_fill(nsfb, &clipbox,
|
||||
*(nsfb_colour_t *)bitmap->pixdata);
|
||||
*(nsfb_colour_t *)bmptr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -218,11 +213,11 @@ framebuffer_plot_bitmap(int x, int y,
|
||||
* a flat fill of the area. Can only be done when image is fully
|
||||
* opaque. */
|
||||
if ((width == 1) && (height == 1)) {
|
||||
if (bitmap->opaque) {
|
||||
if (bitmap_get_opaque(bm)) {
|
||||
/** TODO: Currently using top left pixel. Maybe centre
|
||||
* pixel or average value would be better. */
|
||||
return nsfb_plot_rectangle_fill(nsfb, &clipbox,
|
||||
*(nsfb_colour_t *)bitmap->pixdata);
|
||||
*(nsfb_colour_t *)bmptr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -243,10 +238,8 @@ framebuffer_plot_bitmap(int x, int y,
|
||||
loc.x1 = loc.x0 + width;
|
||||
loc.y1 = loc.y0 + height;
|
||||
|
||||
nsfb_plot_bitmap(nsfb, &loc,
|
||||
(nsfb_colour_t *)bitmap->pixdata,
|
||||
bitmap->width, bitmap->height,
|
||||
bitmap->width, !bitmap->opaque);
|
||||
nsfb_plot_copy(bm, NULL, nsfb, &loc);
|
||||
|
||||
if (!repeat_y)
|
||||
break;
|
||||
}
|
||||
@ -359,31 +352,63 @@ const struct plotter_table fb_plotters = {
|
||||
nsfb_t *
|
||||
framebuffer_initialise(const char *fename, int width, int height, int bpp)
|
||||
{
|
||||
enum nsfb_frontend_e fetype;
|
||||
enum nsfb_type_e fbtype;
|
||||
enum nsfb_format_e fbfmt;
|
||||
|
||||
fetype = nsfb_frontend_from_name(fename);
|
||||
if (fetype == NSFB_FRONTEND_NONE) {
|
||||
LOG(("The %s frontend is not available from libnsfb\n", fename));
|
||||
/* bpp is a proxy for the framebuffer format */
|
||||
switch (bpp) {
|
||||
case 32:
|
||||
fbfmt = NSFB_FMT_XRGB8888;
|
||||
break;
|
||||
|
||||
case 24:
|
||||
fbfmt = NSFB_FMT_RGB888;
|
||||
break;
|
||||
|
||||
case 16:
|
||||
fbfmt = NSFB_FMT_RGB565;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
fbfmt = NSFB_FMT_I8;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
fbfmt = NSFB_FMT_I4;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
fbfmt = NSFB_FMT_I1;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG(("Bad bits per pixel (%d)\n", bpp));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fbtype = nsfb_type_from_name(fename);
|
||||
if (fbtype == NSFB_SURFACE_NONE) {
|
||||
LOG(("The %s surface is not available from libnsfb\n", fename));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nsfb = nsfb_init(fetype);
|
||||
nsfb = nsfb_new(fbtype);
|
||||
if (nsfb == NULL) {
|
||||
LOG(("Unable to initialise nsfb with %s frontend\n", fename));
|
||||
LOG(("Unable to create %s fb surface\n", fename));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (nsfb_set_geometry(nsfb, width, height, bpp) == -1) {
|
||||
LOG(("Unable to set geometry\n"));
|
||||
nsfb_finalise(nsfb);
|
||||
if (nsfb_set_geometry(nsfb, width, height, fbfmt) == -1) {
|
||||
LOG(("Unable to set surface geometry\n"));
|
||||
nsfb_free(nsfb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nsfb_cursor_init(nsfb);
|
||||
|
||||
if (nsfb_init_frontend(nsfb) == -1) {
|
||||
LOG(("Unable to initialise nsfb frontend\n"));
|
||||
nsfb_finalise(nsfb);
|
||||
if (nsfb_init(nsfb) == -1) {
|
||||
LOG(("Unable to initialise nsfb surface\n"));
|
||||
nsfb_free(nsfb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -394,11 +419,19 @@ framebuffer_initialise(const char *fename, int width, int height, int bpp)
|
||||
void
|
||||
framebuffer_finalise(void)
|
||||
{
|
||||
nsfb_finalise(nsfb);
|
||||
nsfb_free(nsfb);
|
||||
}
|
||||
|
||||
bool
|
||||
framebuffer_set_cursor(struct bitmap *bm)
|
||||
framebuffer_set_cursor(struct fbtk_bitmap *bm)
|
||||
{
|
||||
return nsfb_cursor_set(nsfb, (nsfb_colour_t *)bm->pixdata, bm->width, bm->height, bm->width);
|
||||
}
|
||||
|
||||
nsfb_t *framebuffer_set_surface(nsfb_t *new_nsfb)
|
||||
{
|
||||
nsfb_t *old_nsfb;
|
||||
old_nsfb = nsfb;
|
||||
nsfb = new_nsfb;
|
||||
return old_nsfb;
|
||||
}
|
||||
|
@ -4,4 +4,10 @@ extern const struct plotter_table fb_plotters;
|
||||
|
||||
nsfb_t *framebuffer_initialise(const char *fename, int width, int height, int bpp);
|
||||
void framebuffer_finalise(void);
|
||||
bool framebuffer_set_cursor(struct bitmap *bm);
|
||||
bool framebuffer_set_cursor(struct fbtk_bitmap *bm);
|
||||
|
||||
/** Set framebuffer surface to render into
|
||||
*
|
||||
* @return return old surface
|
||||
*/
|
||||
nsfb_t *framebuffer_set_surface(nsfb_t *new_nsfb);
|
||||
|
@ -49,7 +49,6 @@
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/framebuffer.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/schedule.h"
|
||||
#include "framebuffer/findfile.h"
|
||||
#include "framebuffer/image_data.h"
|
||||
@ -222,7 +221,7 @@ fb_pan(fbtk_widget_t *widget,
|
||||
dstbox.y1 = dstbox.y0 + height + bwidget->pany;
|
||||
|
||||
/* move part that remains visible up */
|
||||
nsfb_plot_copy(nsfb, &srcbox, &dstbox);
|
||||
nsfb_plot_copy(nsfb, &srcbox, nsfb, &dstbox);
|
||||
|
||||
/* redraw newly exposed area */
|
||||
bwidget->scrolly += bwidget->pany;
|
||||
@ -242,7 +241,7 @@ fb_pan(fbtk_widget_t *widget,
|
||||
dstbox.y1 = dstbox.y0 + height - bwidget->pany;
|
||||
|
||||
/* move part that remains visible down */
|
||||
nsfb_plot_copy(nsfb, &srcbox, &dstbox);
|
||||
nsfb_plot_copy(nsfb, &srcbox, nsfb, &dstbox);
|
||||
|
||||
/* redraw newly exposed area */
|
||||
bwidget->scrolly += bwidget->pany;
|
||||
@ -262,7 +261,7 @@ fb_pan(fbtk_widget_t *widget,
|
||||
dstbox.y1 = dstbox.y0 + height;
|
||||
|
||||
/* move part that remains visible left */
|
||||
nsfb_plot_copy(nsfb, &srcbox, &dstbox);
|
||||
nsfb_plot_copy(nsfb, &srcbox, nsfb, &dstbox);
|
||||
|
||||
/* redraw newly exposed area */
|
||||
bwidget->scrollx += bwidget->panx;
|
||||
@ -282,7 +281,7 @@ fb_pan(fbtk_widget_t *widget,
|
||||
dstbox.y1 = dstbox.y0 + height;
|
||||
|
||||
/* move part that remains visible right */
|
||||
nsfb_plot_copy(nsfb, &srcbox, &dstbox);
|
||||
nsfb_plot_copy(nsfb, &srcbox, nsfb, &dstbox);
|
||||
|
||||
/* redraw newly exposed area */
|
||||
bwidget->scrollx += bwidget->panx;
|
||||
@ -1391,7 +1390,7 @@ static void
|
||||
throbber_advance(void *pw)
|
||||
{
|
||||
struct gui_window *g = pw;
|
||||
struct bitmap *image;
|
||||
struct fbtk_bitmap *image;
|
||||
|
||||
switch (g->throbber_index) {
|
||||
case 0:
|
||||
|
@ -19,39 +19,39 @@
|
||||
#ifndef FB_IMAGE_DATA
|
||||
#define FB_IMAGE_DATA
|
||||
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
|
||||
extern struct bitmap left_arrow;
|
||||
extern struct bitmap right_arrow;
|
||||
extern struct bitmap reload;
|
||||
extern struct bitmap stop_image;
|
||||
extern struct bitmap history_image;
|
||||
extern struct fbtk_bitmap left_arrow;
|
||||
extern struct fbtk_bitmap right_arrow;
|
||||
extern struct fbtk_bitmap reload;
|
||||
extern struct fbtk_bitmap stop_image;
|
||||
extern struct fbtk_bitmap history_image;
|
||||
|
||||
extern struct bitmap left_arrow_g;
|
||||
extern struct bitmap right_arrow_g;
|
||||
extern struct bitmap reload_g;
|
||||
extern struct bitmap stop_image_g;
|
||||
extern struct bitmap history_image_g;
|
||||
extern struct fbtk_bitmap left_arrow_g;
|
||||
extern struct fbtk_bitmap right_arrow_g;
|
||||
extern struct fbtk_bitmap reload_g;
|
||||
extern struct fbtk_bitmap stop_image_g;
|
||||
extern struct fbtk_bitmap history_image_g;
|
||||
|
||||
extern struct bitmap scrolll;
|
||||
extern struct bitmap scrollr;
|
||||
extern struct bitmap scrollu;
|
||||
extern struct bitmap scrolld;
|
||||
extern struct fbtk_bitmap scrolll;
|
||||
extern struct fbtk_bitmap scrollr;
|
||||
extern struct fbtk_bitmap scrollu;
|
||||
extern struct fbtk_bitmap scrolld;
|
||||
|
||||
extern struct bitmap pointer_image;
|
||||
extern struct bitmap hand_image;
|
||||
extern struct bitmap caret_image;
|
||||
extern struct bitmap menu_image;
|
||||
extern struct bitmap progress_image;
|
||||
extern struct fbtk_bitmap pointer_image;
|
||||
extern struct fbtk_bitmap hand_image;
|
||||
extern struct fbtk_bitmap caret_image;
|
||||
extern struct fbtk_bitmap menu_image;
|
||||
extern struct fbtk_bitmap progress_image;
|
||||
|
||||
extern struct bitmap throbber0;
|
||||
extern struct bitmap throbber1;
|
||||
extern struct bitmap throbber2;
|
||||
extern struct bitmap throbber3;
|
||||
extern struct bitmap throbber4;
|
||||
extern struct bitmap throbber5;
|
||||
extern struct bitmap throbber6;
|
||||
extern struct bitmap throbber7;
|
||||
extern struct bitmap throbber8;
|
||||
extern struct fbtk_bitmap throbber0;
|
||||
extern struct fbtk_bitmap throbber1;
|
||||
extern struct fbtk_bitmap throbber2;
|
||||
extern struct fbtk_bitmap throbber3;
|
||||
extern struct fbtk_bitmap throbber4;
|
||||
extern struct fbtk_bitmap throbber5;
|
||||
extern struct fbtk_bitmap throbber6;
|
||||
extern struct fbtk_bitmap throbber7;
|
||||
extern struct fbtk_bitmap throbber8;
|
||||
|
||||
#endif /* FB_IMAGE_DATA */
|
||||
|
@ -45,7 +45,6 @@
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/framebuffer.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/schedule.h"
|
||||
#include "framebuffer/findfile.h"
|
||||
#include "framebuffer/image_data.h"
|
||||
|
@ -16,14 +16,80 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <libnsfb.h>
|
||||
#include <libnsfb_plot.h>
|
||||
|
||||
#include "utils/log.h"
|
||||
#include "desktop/thumbnail.h"
|
||||
#include "content/urldb.h"
|
||||
|
||||
bool
|
||||
thumbnail_create(struct hlcache_handle *content,
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/framebuffer.h"
|
||||
|
||||
bool
|
||||
thumbnail_create(struct hlcache_handle *content,
|
||||
struct bitmap *bitmap,
|
||||
const char *url)
|
||||
{
|
||||
nsfb_t *tbm = (nsfb_t *)bitmap; /* target bitmap */
|
||||
nsfb_t *bm; /* temporary bitmap */
|
||||
nsfb_t *current; /* current main fb */
|
||||
int width, height; /* target bitmap width height */
|
||||
int cwidth, cheight;/* content width /height */
|
||||
nsfb_bbox_t loc;
|
||||
|
||||
struct redraw_context ctx = {
|
||||
.interactive = false,
|
||||
.plot = &fb_plotters
|
||||
};
|
||||
|
||||
|
||||
nsfb_get_geometry(tbm, &width, &height, NULL);
|
||||
|
||||
LOG(("width %d, height %d", width, height));
|
||||
|
||||
/* Calculate size of buffer to render the content into */
|
||||
/* We get the width from the content width, unless it exceeds 1024,
|
||||
* in which case we use 1024. This means we never create excessively
|
||||
* large render buffers for huge contents, which would eat memory and
|
||||
* cripple performance. */
|
||||
cwidth = min(content_get_width(content), 1024);
|
||||
/* The height is set in proportion with the width, according to the
|
||||
* aspect ratio of the required thumbnail. */
|
||||
cheight = ((cwidth * height) + (width / 2)) / width;
|
||||
|
||||
/* create temporary surface */
|
||||
bm = nsfb_new(NSFB_SURFACE_RAM);
|
||||
if (bm == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsfb_set_geometry(bm, cwidth, cheight, NSFB_FMT_XBGR8888);
|
||||
|
||||
if (nsfb_init(bm) == -1) {
|
||||
nsfb_free(bm);
|
||||
return false;
|
||||
}
|
||||
|
||||
current = framebuffer_set_surface(bm);
|
||||
|
||||
/* render the content into temporary surface */
|
||||
thumbnail_redraw(content, cwidth, cheight, &ctx);
|
||||
|
||||
framebuffer_set_surface(current);
|
||||
|
||||
loc.x0 = 0;
|
||||
loc.y0 = 0;
|
||||
loc.x1 = width;
|
||||
loc.y1 = height;
|
||||
|
||||
nsfb_plot_copy(bm, NULL, tbm, &loc);
|
||||
|
||||
nsfb_free(bm);
|
||||
|
||||
/* register the thumbnail with the URL */
|
||||
if (url != NULL)
|
||||
urldb_set_thumbnail(url, bitmap);
|
||||
|
Loading…
x
Reference in New Issue
Block a user