netsurf/beos/beos_thumbnail.cpp

169 lines
4.0 KiB
C++

/*
* Copyright 2008 François Revol <mmu_man@users.sourceforge.net>
*
* 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/>.
*/
/** \file
* Page thumbnail creation (implementation).
*
* Thumbnails are created by setting the current drawing contexts to a BView
* attached to the BBitmap we are passed, and plotting the page at a small
* scale.
*/
#define __STDBOOL_H__ 1
#include <assert.h>
#include <sys/param.h>
#include <Bitmap.h>
#include <View.h>
extern "C" {
#include "content/content.h"
#include "content/urldb.h"
#include "desktop/plotters.h"
#include "desktop/browser.h"
#include "desktop/thumbnail.h"
#include "image/bitmap.h"
#include "render/font.h"
#include "utils/log.h"
}
#include "beos/beos_scaffolding.h"
#include "beos/beos_plotters.h"
#include "beos/beos_bitmap.h"
// Zeta PRIVATE: in libzeta for now.
extern status_t ScaleBitmap(const BBitmap& inBitmap, BBitmap& outBitmap);
#warning XXX do we need to set bitmap:shadow ?
/**
* Create a thumbnail of a page.
*
* \param content content structure to thumbnail
* \param bitmap the bitmap to draw to
* \param url the URL the thumnail belongs to, or NULL
*/
bool thumbnail_create(hlcache_handle *content, struct bitmap *bitmap,
const char *url)
{
BBitmap *thumbnail;
BBitmap *small;
BBitmap *big;
BView *oldView;
BView *view;
BView *thumbView;
float width;
float height;
int big_width;
int big_height;
int depth;
struct redraw_context ctx = {
.interactive = false,
.plot = &nsbeos_plotters
};
assert(content);
assert(bitmap);
thumbnail = nsbeos_bitmap_get_primary(bitmap);
width = thumbnail->Bounds().Width();
height = thumbnail->Bounds().Height();
depth = 32;
big_width = MIN(content_get_width(content), 1024);
big_height = (int)(((big_width * height) + (width / 2)) / width);
BRect contentRect(0, 0, big_width - 1, big_height - 1);
big = new BBitmap(contentRect, B_BITMAP_ACCEPTS_VIEWS, B_RGB32);
if (big->InitCheck() < B_OK) {
delete big;
return false;
}
small = new BBitmap(thumbnail->Bounds(),
B_BITMAP_ACCEPTS_VIEWS, B_RGB32);
if (small->InitCheck() < B_OK) {
delete small;
delete big;
return false;
}
//XXX: _lock ?
// backup the current gc
oldView = nsbeos_current_gc();
view = new BView(contentRect, "thumbnailer",
B_FOLLOW_NONE, B_WILL_DRAW);
big->AddChild(view);
thumbView = new BView(small->Bounds(), "thumbnail",
B_FOLLOW_NONE, B_WILL_DRAW);
small->AddChild(thumbView);
view->LockLooper();
/* impose our view on the content... */
nsbeos_current_gc_set(view);
/* render the content */
thumbnail_redraw(content, big_width, big_height, &ctx);
view->Sync();
view->UnlockLooper();
// restore the current gc
nsbeos_current_gc_set(oldView);
// now scale it down
//XXX: use Zeta's bilinear scaler ?
//#ifdef B_ZETA_VERSION
// err = ScaleBitmap(*shot, *scaledBmp);
//#else
thumbView->LockLooper();
thumbView->DrawBitmap(big, big->Bounds(), small->Bounds());
thumbView->Sync();
thumbView->UnlockLooper();
small->LockBits();
thumbnail->LockBits();
// copy it to the bitmap
memcpy(thumbnail->Bits(), small->Bits(), thumbnail->BitsLength());
thumbnail->UnlockBits();
small->UnlockBits();
/* register the thumbnail with the URL */
if (url)
urldb_set_thumbnail(url, bitmap);
bitmap_modified(bitmap);
// cleanup
small->RemoveChild(thumbView);
delete thumbView;
delete small;
big->RemoveChild(view);
delete view;
delete big;
return true;
}