summaryrefslogtreecommitdiff
path: root/riscos/thumbnail.c
blob: 704ef51a8e04d1f5a59091277a5eae104171767e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
 * This file is part of NetSurf, http://netsurf.sourceforge.net/
 * Licensed under the GNU General Public License,
 *                http://www.opensource.org/licenses/gpl-license
 * Copyright 2004 James Bursa <bursa@users.sourceforge.net>
 */

/** \file
 * Page thumbnail creation (implementation).
 *
 * Thumbnails are created by redirecting output to a sprite and rendering the
 * page at a small scale.
 */

#include "oslib/colourtrans.h"
#include "oslib/osspriteop.h"
#include "netsurf/content/content.h"
#include "netsurf/riscos/thumbnail.h"
#include "netsurf/utils/log.h"


/**
 * Create a thumbnail of a page.
 *
 * \param  content  content structure to thumbnail
 * \param  area     sprite area containing thumbnail sprite
 * \param  sprite   pointer to sprite
 * \param  width    sprite width / pixels
 * \param  height   sprite height / pixels
 *
 * The thumbnail is rendered in the given sprite.
 */

void thumbnail_create(struct content *content, osspriteop_area *area,
		osspriteop_header *sprite, int width, int height)
{
	int size;
	int context1, context2, context3;
	float scale;
	osspriteop_save_area *save_area;
	os_error *error;

	scale = (float) width / (float) content->width;

	/* allocate save area */
	error = xosspriteop_read_save_area_size(osspriteop_PTR, area,
			(osspriteop_id) sprite, &size);
	if (error) {
		LOG(("xosspriteop_read_save_area_size failed: 0x%x: %s",
				error->errnum, error->errmess));
		return;
	}
	save_area = malloc((unsigned) size);
	if (!save_area) {
		LOG(("malloc failed"));
		return;
	}
	save_area->a[0] = 0;

	/* switch output to sprite */
	error = xosspriteop_switch_output_to_sprite(osspriteop_PTR, area,
			(osspriteop_id) sprite, save_area,
			0, &context1, &context2, &context3);
	if (error) {
		LOG(("xosspriteop_switch_output_to_sprite failed: 0x%x: %s",
				error->errnum, error->errmess));
		return;
	}

	/* clear background to white */
	colourtrans_set_gcol(os_COLOUR_WHITE, colourtrans_SET_BG,
			os_ACTION_OVERWRITE, 0);
	os_clg();

	/* render content */
	content_redraw(content, 0, height * 2, width * 2, height * 2,
			0, 0, width * 2, height * 2, scale);

	/* switch output back to screen */
	error = xosspriteop_switch_output_to_sprite(osspriteop_PTR,
			(osspriteop_area *) context1,
			(osspriteop_id) context2,
			(osspriteop_save_area *) context3,
			0, 0, 0, 0);
	if (error) {
		LOG(("xosspriteop_switch_output_to_sprite failed: %s",
				error->errmess));
	}

	free(save_area);
}