Update for modified libnsfb API

Make thumbnailing work

svn path=/trunk/netsurf/; revision=13159
This commit is contained in:
Vincent Sanders 2011-11-21 08:45:08 +00:00
parent 747c66c982
commit 820312eb35
18 changed files with 289 additions and 199 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -37,7 +37,6 @@
#include "framebuffer/gui.h"
#include "framebuffer/fbtk.h"
#include "framebuffer/bitmap.h"
#include "framebuffer/image_data.h"
#include "widget.h"

View File

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

View File

@ -31,7 +31,6 @@
#include "framebuffer/gui.h"
#include "framebuffer/fbtk.h"
#include "framebuffer/bitmap.h"
#include "framebuffer/image_data.h"
#include "widget.h"

View File

@ -30,7 +30,6 @@
#include "framebuffer/gui.h"
#include "framebuffer/fbtk.h"
#include "framebuffer/bitmap.h"
#include "framebuffer/image_data.h"
#include "widget.h"

View File

@ -19,7 +19,7 @@
*/
#include <stdlib.h>
#include <stdbool.h>
#include <libnsfb.h>
#include "desktop/plotters.h"

View File

@ -165,7 +165,7 @@ struct fbtk_widget_s {
/* bitmap */
struct {
struct bitmap *bitmap;
struct fbtk_bitmap *bitmap;
} bitmap;
/* text */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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