2010-01-31 03:36:02 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2009 Mark Benjamin <netsurf-browser.org.MarkBenjamin@dfgh.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/>.
|
|
|
|
*/
|
|
|
|
|
2010-10-14 00:29:30 +04:00
|
|
|
#include <windows.h>
|
|
|
|
|
2010-01-31 03:36:02 +03:00
|
|
|
#include "content/urldb.h"
|
|
|
|
#include "desktop/browser.h"
|
2011-02-20 01:17:54 +03:00
|
|
|
#include "desktop/thumbnail.h"
|
2010-01-31 03:36:02 +03:00
|
|
|
#include "utils/log.h"
|
2010-10-14 23:33:00 +04:00
|
|
|
#include "image/bitmap.h"
|
2010-01-31 03:36:02 +03:00
|
|
|
|
|
|
|
#include "windows/bitmap.h"
|
|
|
|
#include "windows/gui.h"
|
|
|
|
#include "windows/plot.h"
|
2010-03-28 16:56:39 +04:00
|
|
|
#include "content/hlcache.h"
|
2010-01-31 03:36:02 +03:00
|
|
|
|
|
|
|
|
2010-03-28 16:56:39 +04:00
|
|
|
bool
|
|
|
|
thumbnail_create(hlcache_handle *content,
|
|
|
|
struct bitmap *bitmap,
|
|
|
|
const char *url)
|
2010-01-31 03:36:02 +03:00
|
|
|
{
|
2010-10-14 23:33:00 +04:00
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
HDC hdc, bufferdc, minidc;
|
2011-06-30 19:48:07 +04:00
|
|
|
struct redraw_context ctx = {
|
|
|
|
.interactive = false,
|
|
|
|
.plot = &win_plotters
|
|
|
|
};
|
2010-10-14 23:33:00 +04:00
|
|
|
|
|
|
|
struct bitmap *fsbitmap;
|
|
|
|
|
2011-02-20 18:48:27 +03:00
|
|
|
width = min(content_get_width(content), 1024);
|
|
|
|
height = ((width * bitmap->height) + (bitmap->width / 2)) /
|
|
|
|
bitmap->width;
|
2010-10-14 23:33:00 +04:00
|
|
|
|
|
|
|
LOG(("bitmap %p for url %s content %p width %d, height %d",
|
|
|
|
bitmap, url, content, width, height));
|
|
|
|
|
|
|
|
/* create two memory device contexts to put the bitmaps in */
|
|
|
|
bufferdc = CreateCompatibleDC(NULL);
|
|
|
|
if ((bufferdc == NULL)) {
|
2010-03-28 16:56:39 +04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-10-14 23:33:00 +04:00
|
|
|
minidc = CreateCompatibleDC(NULL);
|
|
|
|
if ((minidc == NULL)) {
|
2010-01-31 03:36:02 +03:00
|
|
|
DeleteDC(bufferdc);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-10-14 23:33:00 +04:00
|
|
|
/* create a full size bitmap and plot into it */
|
|
|
|
fsbitmap = bitmap_create(width, height, BITMAP_NEW | BITMAP_CLEAR_MEMORY | BITMAP_OPAQUE | BITMAP_PERSISTENT);
|
|
|
|
|
|
|
|
SelectObject(bufferdc, fsbitmap->windib);
|
|
|
|
|
|
|
|
hdc = plot_hdc;
|
|
|
|
plot_hdc = bufferdc;
|
2011-06-30 19:48:07 +04:00
|
|
|
thumbnail_redraw(content, width, height, &ctx);
|
2010-10-14 23:33:00 +04:00
|
|
|
plot_hdc = hdc;
|
2010-01-31 03:36:02 +03:00
|
|
|
|
2010-10-14 23:33:00 +04:00
|
|
|
/* scale bitmap bufferbm into minibm */
|
|
|
|
SelectObject(minidc, bitmap->windib);
|
|
|
|
|
|
|
|
bitmap->opaque = true;
|
|
|
|
|
|
|
|
StretchBlt(minidc, 0, 0, bitmap->width, bitmap->height, bufferdc, 0, 0, width, height, SRCCOPY);
|
2010-01-31 03:36:02 +03:00
|
|
|
|
2010-10-14 23:33:00 +04:00
|
|
|
DeleteDC(bufferdc);
|
2010-01-31 03:36:02 +03:00
|
|
|
DeleteDC(minidc);
|
2010-10-14 23:33:00 +04:00
|
|
|
bitmap_destroy(fsbitmap);
|
|
|
|
|
2010-01-31 03:36:02 +03:00
|
|
|
if (url)
|
|
|
|
urldb_set_thumbnail(url, bitmap);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|