render_local.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 Aug 2008 21:30:32 +0300
changeset 41 540737bf6bac
parent 24 8307d28329ae
permissions -rw-r--r--
sending requests, and partial support for receiving -- incomplete, not tested
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include <stdlib.h>
12
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
     2
#include <time.h>
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <assert.h>
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include "common.h"
17
8e8b56b0e0f5 a half-working render_slices. Render_multi is currently semantically broken/buggy, but it's time to go to sleep
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
     6
#include "render_struct.h"
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include "render_local.h"
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
#include "render_png.h"
13
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
     9
#include "render_raw.h"
12
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    10
#include "render_mandelbrot.h"
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
int render_local (struct render *render, double *duration) {
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    13
    struct render_local ctx;
12
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    14
    
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    15
    if (render_local_init(&ctx, render))
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    16
        return -1;
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    17
        
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    18
    int err = render_local_run(&ctx, duration);
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    19
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    20
    render_local_deinit(&ctx);
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    21
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    22
    return err;
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    23
}
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    25
int render_local_init (struct render_local *ctx, struct render *render) {
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    26
    // zero
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    27
    memset(ctx, 0, sizeof(*ctx));
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    28
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    29
    ctx->render_info = render;
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    // alloc the memory buffer
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    32
    if (!(ctx->rowbuf = malloc(render->img_w)))
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        ERROR("malloc");
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
 
13
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    35
    // what mode?
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    36
    switch (render->mode) {
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    37
        case RENDER_PNG :
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    38
            // the render_png stuff
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    39
            memset(&ctx->png_ctx, 0, sizeof(ctx->png_ctx));
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    40
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    41
            if (render_png_init(&ctx->png_ctx, render))
13
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    42
                ERROR("render_png_init");
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    43
            
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    44
            ctx->must_deinit = RENDER_PNG;
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    45
13
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    46
            //  set render_* to use the render_png
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    47
            if (render_local_mem(render, &ctx->rowbuf, (int(*)(void *arg, unsigned char *)) &render_png_row, &ctx->png_ctx))
13
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    48
                ERROR("render_local_mem");
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    49
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    50
            break;
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    51
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    52
        case RENDER_RAW :
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    53
            // the render_raw stuff
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    54
            memset(&ctx->raw_ctx, 0, sizeof(ctx->raw_ctx));
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    55
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    56
            if (render_raw_init(&ctx->raw_ctx, render))
13
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    57
                ERROR("render_raw_init");
23
31307efd7e78 new render_threads module, make node_main use it, compiles, not yet tested
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    58
            
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    59
            ctx->must_deinit = RENDER_RAW;
13
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    60
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    61
            //  set render_* to use the render_raw
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    62
            if (render_local_mem(render, &ctx->rowbuf, (int(*)(void *arg, unsigned char *)) &render_raw_row, &ctx->raw_ctx))
13
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    63
                ERROR("render_local_mem");
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    64
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    65
            break;
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    66
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    67
        default :
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    68
            assert(0);
ee426f453cf5 * fix some (of the) stupid things in Makefile
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    69
    }
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    70
    
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    71
    // success
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    72
    return 0;
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    73
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    74
error:
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    75
    render_local_deinit(ctx);
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    76
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    77
    return -1;
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    78
}
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    79
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    80
int render_local_run (struct render_local *ctx, double *duration) {
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    81
    clock_t t1, t2;
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    82
    
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    83
    if (duration)
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    84
        *duration = -1;
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    85
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    // then we can actually render
12
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    87
    t1 = clock();
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    88
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    89
    if (render_mandelbrot(ctx->render_info))
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    90
        goto error;
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
12
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    92
    t2 = clock();
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    93
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    94
    // flush the PNG
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    95
    if (render_png_done(&ctx->png_ctx))
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    96
        goto error;
12
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    97
    
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    98
    // calculate the time taken
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    99
    if (duration)
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   100
        *duration = ((double)(t2 - t1))/CLOCKS_PER_SEC;
43297144f196 * rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   101
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    // success
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    return 0;
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
error:
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   106
    // caller must deinit
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   107
    //
11
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    return -1;
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
}
082bfaf38cf0 * massive structural rewrite. Split off code into several new modules (render, render_png, render_local) and updated new modules to use them.
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
24
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   111
void render_local_deinit (struct render_local *ctx) {
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   112
    free(ctx->rowbuf);
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   113
    
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   114
    if (ctx->must_deinit == RENDER_PNG)
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   115
        render_png_deinit(&ctx->png_ctx);
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   116
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   117
    else if (ctx->must_deinit == RENDER_RAW)
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   118
        render_raw_deinit(&ctx->raw_ctx);
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   119
}
8307d28329ae render_thread works now
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   120