mandelbrot.c
author Tero Marttila <terom@fixme.fi>
Fri, 06 Jun 2008 03:24:55 +0300
changeset 9 fb6632e6c1bb
parent 3 675be0a45157
child 11 082bfaf38cf0
permissions -rw-r--r--
two new modules, remote_node and remote_pool

committer: Tero Marttila <terom@fixme.fi>
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include <stdlib.h>
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <time.h>
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <png.h>
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     6
#include "render.h"
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include "mandelbrot.h"
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
#include "common.h"
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#define DETAIL 255
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
#define absdelta(a, b) (a>b ? a-b : b-a)
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
void user_write_data(png_structp png_ptr, png_bytep data, png_size_t length) {
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    struct render_ctx *ctx = (struct render_ctx *) png_get_io_ptr(png_ptr);
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    17
    if (ctx->io_write_fn)
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    18
        switch (ctx->io_write_fn(data, length, ctx->io_cb_arg)) {
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
            case RENDER_CB_ERR :
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    20
                ctx->io_error = 1;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
                break;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
            case RENDER_CB_OK :
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
                // great!
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
                break;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        }
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
}
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
void user_flush_data(png_structp png_ptr) {
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    struct render_ctx *ctx = (struct render_ctx *) png_get_io_ptr(png_ptr);
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    32
    if (ctx->io_flush_fn)
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    33
        switch (ctx->io_flush_fn(ctx->io_cb_arg)) {
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
            case RENDER_CB_ERR :
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    35
                ctx->io_error = 1;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
                break;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
            case RENDER_CB_OK :
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
                // great!
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
                break;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        }
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
}
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    44
int mandelbrot_render (render_t *ctx) {
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    45
    // libpng handles
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    46
    png_structp png_ptr = NULL;
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    47
    png_infop info_ptr = NULL;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    49
    // render algorithm vars
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    u_int32_t img_x, img_y;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    double x0, y0, x, y, _x, _y, w_scale, h_scale;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    u_int8_t iter;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    u_int8_t *row;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    // clear out any potential error in ctx
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    56
    ctx->io_error = 0;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    // calcluate the scale factors
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    59
    w_scale = ctx->img_w/absdelta(ctx->x1, ctx->x2);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    60
    h_scale = ctx->img_h/absdelta(ctx->y1, ctx->y2);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    // malloc the memory used to render each row
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    63
    row = (u_int8_t *) malloc(ctx->img_w);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    if (!row)
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    66
        goto error;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    68
    // PNG or not?
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    69
    if (ctx->mode == RENDER_PNG) {
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    70
        // libpng initialization
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    71
        png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    73
        if (!png_ptr)
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    74
            goto error;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    76
        info_ptr = png_create_info_struct(png_ptr);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    78
        if (!info_ptr)
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    79
            goto error;
3
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    80
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    81
        // libpng error handling
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    82
        if (setjmp(png_jmpbuf(png_ptr))) {
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    83
            goto error;
675be0a45157 working chunked-streaming of remote-rendered mandelbrots in web_main, next step will be flow control. Remote rendering doesn't compile in render_node.
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    84
        }
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    85
        
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    86
        if (ctx->io_stream) {
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    87
            // use normal libpng I/O
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    88
            png_init_io(png_ptr, ctx->io_stream);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    89
        } else {
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    90
            // setup our custom I/O callbacks
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    91
            png_set_write_fn(png_ptr, ctx, &user_write_data, &user_flush_data);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    92
        }
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    93
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    94
        // some PNG metadata
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    95
        png_set_IHDR(png_ptr, info_ptr, ctx->img_w, ctx->img_h, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    96
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    97
        // write out the PNG header
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    98
        png_write_info(png_ptr, info_ptr);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    99
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   100
        // possible error return
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   101
        if (ctx->io_error)
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   102
            goto error;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    }
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    // start rendering!
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   106
    for (img_y=0; img_y < ctx->img_h; img_y++) {
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        // render the current row
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   108
        for (img_x=0; img_x < ctx->img_w; img_x++) {
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
            x = 0;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
            y = 0;
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   111
            x0 = img_x/w_scale + ctx->x1;
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   112
            y0 = img_y/h_scale + ctx->y1;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
            iter = DETAIL; 
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
            while (x*x + y*y < (2*2) && iter > 0) {
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
                _x = x*x - y*y + x0;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
                _y = 2*x*y + y0;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
                x = _x;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
                y = _y;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
                iter--;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
            }
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
            
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
            row[img_x] = iter;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
        }
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   128
        if (ctx->mode == RENDER_PNG) {
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   129
            // write the raw pixels to libpng
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   130
            png_write_row(png_ptr, row);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   131
            
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   132
            // check for user errors return
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   133
            if (ctx->io_error)
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   134
                goto error;
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   135
        } else {
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   136
            // pass on the pixels to the io callback
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   137
            if (ctx->io_write_fn(row, ctx->img_w, ctx->io_cb_arg) == RENDER_CB_ERR) {
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   138
                ctx->io_error = 1;
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   139
                goto error;
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   140
            }
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        }
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    }
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   143
   
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   144
    if (ctx->mode == RENDER_PNG) {
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   145
        // finished writing
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   146
        png_write_end(png_ptr, info_ptr);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   147
    }
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
    // clean up
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    png_destroy_write_struct(&png_ptr, &info_ptr);
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   151
    free(row); row = NULL;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    // check for user errors return
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   154
    if (ctx->io_error)
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   155
        goto error;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
    
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
    // return succesfully
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    return MANDELBROT_OK;
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   159
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   160
error:
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   161
    if (png_ptr || info_ptr)
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   162
        png_destroy_write_struct(&png_ptr, &info_ptr);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   163
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   164
    if (row) 
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   165
        free(row);
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   166
    
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   167
    row = NULL;
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   168
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   169
    return MANDELBROT_ERR;
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
}
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   172
int mandelbrot_render_timed (render_t *ctx, double *duration) {
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
    clock_t t1 = clock();
1
6aa1a0d1f88d partial commit of new render module, render_file should work, web_main doesn't
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   174
    int ret = mandelbrot_render(ctx);
0
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    clock_t t2 = clock();
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
    *duration = ((double)(t2 - t1))/CLOCKS_PER_SEC;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    return ret;
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
}
5b010627d7ed initial code, render_file(local+remote), render_node, web_main(local)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181