summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2004-05-21 10:29:54 +0000
committerJames Bursa <james@netsurf-browser.org>2004-05-21 10:29:54 +0000
commitc2ebb7e4dee50b21c741cac6b3baf51a2504e575 (patch)
treecfce58d19b1331848359ea1c543a6e82a2973fa0
parent9412dfeaed8884e944589461b26a79650b8773d6 (diff)
downloadnetsurf-c2ebb7e4dee50b21c741cac6b3baf51a2504e575.tar.gz
netsurf-c2ebb7e4dee50b21c741cac6b3baf51a2504e575.tar.bz2
[project @ 2004-05-21 10:29:54 by bursa]
Fix divide-by-zero bug. svn path=/import/netsurf/; revision=879
-rw-r--r--riscos/thumbnail.c51
1 files changed, 27 insertions, 24 deletions
diff --git a/riscos/thumbnail.c b/riscos/thumbnail.c
index a20f965c2..66ff28fb3 100644
--- a/riscos/thumbnail.c
+++ b/riscos/thumbnail.c
@@ -46,7 +46,7 @@ static void thumbnail_test(void);
static struct thumbnail_save_area* thumbnail_switch_output(osspriteop_area *sprite_area,
osspriteop_header *sprite_header);
static void thumbnail_restore_output(struct thumbnail_save_area *save_area);
-
+
/**
* Create a thumbnail of a page.
@@ -74,7 +74,7 @@ void thumbnail_create(struct content *content, osspriteop_area *area,
*/
if (option_thumbnail_oversampling < 0) option_thumbnail_oversampling = 0;
if (option_thumbnail_oversampling > 4) option_thumbnail_oversampling = 4;
-
+
/* Get the oversampled sprite holder. We perform oversamling if either we
want to oversample, or the output sprite is 8bpp and we can do 32bpp and
thus improve the final rendition via dithering.
@@ -86,7 +86,7 @@ void thumbnail_create(struct content *content, osspriteop_area *area,
height << option_thumbnail_oversampling,
(os_mode)0x301680b5);
}
-
+
/* Oversample if we have an oversampled sprite, don't otherwise
*/
if (oversampled_area != NULL) {
@@ -112,7 +112,7 @@ void thumbnail_create(struct content *content, osspriteop_area *area,
*/
width = width >> option_thumbnail_oversampling;
height = height >> option_thumbnail_oversampling;
-
+
/* Switch output to the final sprite
*/
save_area = thumbnail_switch_output(area, sprite);
@@ -126,11 +126,11 @@ void thumbnail_create(struct content *content, osspriteop_area *area,
_swix(Tinct_PlotScaled, _IN(2) | _IN(3) | _IN(4) | _IN(5) | _IN(6) | _IN(7),
(char *)(oversampled_area + 1), 0, 0, width * 2, height * 2,
(1<<1) | (1<<2));
-
+
/* Restore output
- */
+ */
thumbnail_restore_output(save_area);
-
+
/* Free oversampled memory area
*/
free(oversampled_area);
@@ -138,7 +138,10 @@ void thumbnail_create(struct content *content, osspriteop_area *area,
} else {
/* Calculate the scale
*/
- scale = (float) width / (float) content->width;
+ if (content->width)
+ scale = (float) width / (float) content->width;
+ else
+ scale = 1.0;
LOG(("Scaling to %f and outputting at %ix%i", scale, width, height));
/* Switch output and redraw
@@ -173,7 +176,7 @@ osspriteop_area* thumbnail_initialise(int width, int height, os_mode mode) {
osspriteop_area *sprite_area;
osspriteop_header *sprite_header;
char *sprite_image;
-
+
/* Check if we can use 32bpp sprites if we haven't already. By
doing it this way we don't need to allocate lot of memory
first which will probably not be available on machines that
@@ -200,14 +203,14 @@ osspriteop_area* thumbnail_initialise(int width, int height, os_mode mode) {
LOG(("Insufficient memory to create thumbnail."));
return NULL;
}
-
+
/* Initialise the sprite area
*/
sprite_area->size = area_size;
sprite_area->sprite_count = 1;
sprite_area->first = 16;
sprite_area->used = area_size;
-
+
/* Initialise the sprite header. We can't trust OS_SpriteOp to
set up our palette properly due to insane legacy 8bpp palettes,
so we do it all manually.
@@ -222,9 +225,9 @@ osspriteop_area* thumbnail_initialise(int width, int height, os_mode mode) {
if (mode == (os_mode)0x301680b5) {
sprite_header->right_bit = 31;
sprite_header->width = width - 1;
- sprite_header->image = sizeof(osspriteop_header);
- sprite_header->mask = sizeof(osspriteop_header);
-
+ sprite_header->image = sizeof(osspriteop_header);
+ sprite_header->mask = sizeof(osspriteop_header);
+
/* Clear to white, full opacity
*/
sprite_image = ((char *)sprite_header) + sprite_header->image;
@@ -233,9 +236,9 @@ osspriteop_area* thumbnail_initialise(int width, int height, os_mode mode) {
} else {
sprite_header->right_bit = ((width << 3) - 1) & 31;
sprite_header->width = ((width + 3) >> 2) - 1;
- sprite_header->image = sizeof(osspriteop_header) + 2048;
+ sprite_header->image = sizeof(osspriteop_header) + 2048;
sprite_header->mask = sizeof(osspriteop_header) + 2048;
-
+
/* Create the palette. We don't read the necessary size
like we really should as we know it's going to have
256 entries of 8 bytes = 2048.
@@ -243,7 +246,7 @@ osspriteop_area* thumbnail_initialise(int width, int height, os_mode mode) {
xcolourtrans_read_palette((osspriteop_area *)mode, (osspriteop_id)0,
(os_palette *)(sprite_header + 1), 2048,
(colourtrans_palette_flags)(1 << 1), &remaining_bytes);
-
+
/* Clear to white
*/
sprite_image = ((char *)sprite_header) + sprite_header->image;
@@ -281,14 +284,14 @@ static void thumbnail_test(void) {
LOG(("Insufficient memory to perform sprite test."));
return;
}
-
+
/* Initialise the sprite area
*/
sprite_area->size = area_size + 1;
sprite_area->sprite_count = 0;
sprite_area->first = 16;
sprite_area->used = 16;
-
+
/* Try to create a 32bpp sprite
*/
if (xosspriteop_create_sprite(osspriteop_NAME, sprite_area,
@@ -297,7 +300,7 @@ static void thumbnail_test(void) {
} else {
thumbnail_32bpp_available = 1;
}
-
+
/* Free our memory
*/
free(sprite_area);
@@ -310,12 +313,12 @@ static struct thumbnail_save_area* thumbnail_switch_output(osspriteop_area *spri
osspriteop_header *sprite_header) {
struct thumbnail_save_area *save_area;
int size;
-
+
/* Create a save area
*/
save_area = calloc(sizeof(struct thumbnail_save_area), 1);
if (save_area == NULL) return NULL;
-
+
/* Allocate OS_SpriteOp save area
*/
if (xosspriteop_read_save_area_size(osspriteop_PTR, sprite_area,
@@ -350,7 +353,7 @@ static struct thumbnail_save_area* thumbnail_switch_output(osspriteop_area *spri
/* Restores output to the specified context, and destroys it.
*/
static void thumbnail_restore_output(struct thumbnail_save_area *save_area) {
-
+
/* We don't care if we err, as there's nothing we can do about it
*/
xosspriteop_switch_output_to_sprite(osspriteop_PTR,
@@ -358,7 +361,7 @@ static void thumbnail_restore_output(struct thumbnail_save_area *save_area) {
(osspriteop_id)save_area->context2,
(osspriteop_save_area *)save_area->context3,
0, 0, 0, 0);
-
+
/* Free our workspace
*/
free(save_area->save_area);