render_slices.c
author Tero Marttila <terom@fixme.fi>
Tue, 17 Jun 2008 16:39:55 +0300
changeset 19 d18606bb6f20
parent 18 86f2e5b7191b
child 22 4627760fc0d1
permissions -rw-r--r--
a working threaded sliced render, plus modifications to other modules to use this in web_main

committer: Tero Marttila <terom@fixme.fi>
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:
diff changeset
     1
#include <stdlib.h>
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:
diff changeset
     2
#include <assert.h>
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:
diff changeset
     3
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:
diff changeset
     4
#include "common.h"
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:
diff changeset
     5
#include "render_struct.h"
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:
diff changeset
     6
#include "render_slices_struct.h"
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:
diff changeset
     7
#include "render_slices.h"
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:
diff changeset
     8
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:
diff changeset
     9
void render_slices_free (struct render_slices *ctx) {
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:
diff changeset
    10
    render_slices_deinit(ctx);
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:
diff changeset
    11
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:
diff changeset
    12
    if (ctx->owned_by_me)
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:
diff changeset
    13
        free(ctx);
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:
diff changeset
    14
}
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:
diff changeset
    15
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    16
void render_slices_deinit (struct render_slices *ctx) {
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    17
    if (ctx->rowbuf) {
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    18
        free(ctx->rowbuf);
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    19
        ctx->rowbuf = NULL;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    20
    }
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:
diff changeset
    21
    
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:
diff changeset
    22
    render_png_deinit(&ctx->png_info);
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:
diff changeset
    23
}
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:
diff changeset
    24
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:
diff changeset
    25
#define HALF(a, b) (( a + b) / 2)
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:
diff changeset
    26
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:
diff changeset
    27
int render_slices_init (struct render_slices *ctx, struct render *render) {
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:
diff changeset
    28
    // initialize the slices
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:
diff changeset
    29
    // for now, just split it in half into two render_ts
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:
diff changeset
    30
    ctx->slices[0].info.index = 0;
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:
diff changeset
    31
    ctx->slices[0].info.render_info = &ctx->slices[0].render_info;
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:
diff changeset
    32
    ctx->slices[0].self = ctx;
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:
diff changeset
    33
    ctx->slices[0].row_offset = 0;
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:
diff changeset
    34
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:
diff changeset
    35
    ctx->slices[1].info.index = 1;
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:
diff changeset
    36
    ctx->slices[1].info.render_info = &ctx->slices[1].render_info;
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:
diff changeset
    37
    ctx->slices[1].self = ctx;
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:
diff changeset
    38
    ctx->slices[1].row_offset = render->img_w / 2;
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:
diff changeset
    39
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:
diff changeset
    40
    ctx->num_slices = 2;
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:
diff changeset
    41
    ctx->render_row = 0;
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:
diff changeset
    42
    ctx->done_row = -1;
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:
diff changeset
    43
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:
diff changeset
    44
    assert(RENDER_SLICES_MAX >= 2);
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:
diff changeset
    45
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:
diff changeset
    46
    if (
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:
diff changeset
    47
            render_init         (&ctx->slices[0].render_info,   RENDER_RAW)
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:
diff changeset
    48
         || render_init         (&ctx->slices[1].render_info,   RENDER_RAW)
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:
diff changeset
    49
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:
diff changeset
    50
         || render_set_size     (&ctx->slices[0].render_info,   render->img_w / 2,                      render->img_h)
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:
diff changeset
    51
         || render_set_size     (&ctx->slices[1].render_info,   render->img_w / 2 + render->img_w % 2,  render->img_h)
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:
diff changeset
    52
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:
diff changeset
    53
         || render_region_raw   (&ctx->slices[0].render_info,   render->x1,                     render->y1, HALF(render->x1, render->x2),   render->y2)
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:
diff changeset
    54
         || render_region_raw   (&ctx->slices[1].render_info,   HALF(render->x1, render->x2),   render->y1, render->x2,                     render->y2)
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:
diff changeset
    55
    )
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:
diff changeset
    56
        ERROR("render_{init,set_size,set_region_raw}");
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:
diff changeset
    57
 
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:
diff changeset
    58
    // allocate the rowbuf
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:
diff changeset
    59
    if (!(ctx->rowbuf = malloc(render->img_w * 2)))
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:
diff changeset
    60
        ERROR("malloc");
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:
diff changeset
    61
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:
diff changeset
    62
    // update the slice_buf pointers
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:
diff changeset
    63
    ctx->rows[0] = ctx->rowbuf;
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:
diff changeset
    64
    ctx->rows[1] = ctx->rowbuf + render->img_w;
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:
diff changeset
    65
    ctx->slices[0].info.render_buf = ctx->rows[ctx->render_row] + ctx->slices[0].row_offset;
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:
diff changeset
    66
    ctx->slices[1].info.render_buf = ctx->rows[ctx->render_row] + ctx->slices[1].row_offset;
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:
diff changeset
    67
    
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:
diff changeset
    68
    // png info
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:
diff changeset
    69
    if (render_png_init(&ctx->png_info, render))
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:
diff changeset
    70
        ERROR("render_png_init");
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:
diff changeset
    71
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:
diff changeset
    72
    // great success!
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:
diff changeset
    73
    return 0;
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:
diff changeset
    74
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:
diff changeset
    75
error:
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:
diff changeset
    76
    render_slices_deinit(ctx);
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:
diff changeset
    77
    return -1;
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:
diff changeset
    78
}
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:
diff changeset
    79
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:
diff changeset
    80
struct render_slices *render_slices_alloc (struct render *render) {
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:
diff changeset
    81
    struct render_slices *ctx = NULL;
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:
diff changeset
    82
    
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:
diff changeset
    83
    // allocate it
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:
diff changeset
    84
    if (!(ctx = calloc(1, sizeof(*ctx))))
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:
diff changeset
    85
        ERROR("calloc");
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:
diff changeset
    86
    
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:
diff changeset
    87
    // mark it for free()ing
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:
diff changeset
    88
    ctx->owned_by_me = 1;
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:
diff changeset
    89
    
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:
diff changeset
    90
    // initialize it
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:
diff changeset
    91
    if (render_slices_init(ctx, render))
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:
diff changeset
    92
        goto error;
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:
diff changeset
    93
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:
diff changeset
    94
    return ctx;
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:
diff changeset
    95
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:
diff changeset
    96
error :
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:
diff changeset
    97
    render_slices_free(ctx);
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:
diff changeset
    98
    return NULL;
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:
diff changeset
    99
}
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:
diff changeset
   100
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:
diff changeset
   101
int render_slices_get_count (struct render_slices *ctx) {
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:
diff changeset
   102
    return ctx->num_slices;
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:
diff changeset
   103
}
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:
diff changeset
   104
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:
diff changeset
   105
struct render_slice_info *render_slices_get_slice_info (struct render_slices *ctx, int index) {
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:
diff changeset
   106
    assert(index >= 0 && index < ctx->num_slices);
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:
diff changeset
   107
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:
diff changeset
   108
    return &ctx->slices[index].info;
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:
diff changeset
   109
}
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:
diff changeset
   110
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:
diff changeset
   111
int render_slices_segment_done (struct render_slices *ctx, int index) {
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:
diff changeset
   112
    assert(index >= 0 && index < ctx->num_slices);
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   113
    assert(ctx->render_row >= 0);
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   114
    assert(ctx->segments_done >= 0 && ctx->segments_done < ctx->num_slices);
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:
diff changeset
   115
    
18
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   116
    // our return status
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   117
    int i, status = 0;
18
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   118
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   119
    // is this row now complete?
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   120
    if (++ctx->segments_done == ctx->num_slices) {
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:
diff changeset
   121
        // the row is complete
18
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   122
        ctx->segments_done = 0;
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   123
    
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   124
        // once we fill up a row we can always call process_row
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   125
        status |= SLICE_PROCESS_ROW;
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:
diff changeset
   126
        
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   127
        // is the other row already rendered?
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:
diff changeset
   128
        if (ctx->done_row < 0) {
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   129
            // yes, point the done_row at this row, point the render buffers to the unused row
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:
diff changeset
   130
            ctx->done_row = ctx->render_row;
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:
diff changeset
   131
            ctx->render_row = (ctx->render_row == 0 ? 1 : 0);
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:
diff changeset
   132
            
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   133
            // can now continue rendering as well as call process_row
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   134
            status |= SLICE_CONTINUE;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   135
            
18
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   136
            // update the remaining render buffers
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:
diff changeset
   137
            for (i = 0; i < ctx->num_slices; i++) {
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:
diff changeset
   138
                ctx->slices[i].info.render_buf = ctx->rows[ctx->render_row] + ctx->slices[i].row_offset;
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:
diff changeset
   139
            }
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:
diff changeset
   140
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:
diff changeset
   141
        } else {
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:
diff changeset
   142
            // cannot continue rendering, need to have process_row complete first
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   143
            
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   144
            ctx->render_row = -1;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   145
        }
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:
diff changeset
   146
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:
diff changeset
   147
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:
diff changeset
   148
    } else {
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:
diff changeset
   149
        // the row is not complete, do not render the next segment, do not call process_row
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:
diff changeset
   150
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:
diff changeset
   151
    }
18
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   152
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   153
    return status;
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:
diff changeset
   154
}
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:
diff changeset
   155
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:
diff changeset
   156
int render_slices_process_row (struct render_slices *ctx) {
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:
diff changeset
   157
    assert(ctx->done_row >= 0);
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:
diff changeset
   158
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   159
    int i;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   160
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:
diff changeset
   161
    // pass the data to render_png, this results in calls to _render_multi_png_data
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:
diff changeset
   162
    if (render_png_row(&ctx->png_info, ctx->rows[ctx->done_row]))
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:
diff changeset
   163
        ERROR("render_png_row");
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:
diff changeset
   164
    
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   165
    // is the other row still in the process of being assembled?
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   166
    if (ctx->render_row == -1) {
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   167
        // no, both rows were full
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   168
        ctx->render_row = ctx->done_row;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   169
        ctx->done_row = (ctx->done_row == 0 ? 1 : 0);
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   170
        
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   171
        // update the remaining render buffers
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   172
        for (i = 0; i < ctx->num_slices; i++) {
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   173
            ctx->slices[i].info.render_buf = ctx->rows[ctx->render_row] + ctx->slices[i].row_offset;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   174
        }
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   175
        
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   176
        // you can call me again, but also segment_done
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   177
        return SLICE_PROCESS_ROW | SLICE_CONTINUE;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   178
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   179
    } else {
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   180
        // yes, so that still needs to be finished
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   181
        ctx->done_row = -1;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   182
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   183
        if (ctx->segments_done == 0) {
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   184
            // that row is empty, then we can continue
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   185
            return SLICE_CONTINUE;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   186
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   187
        } else {
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   188
            // that row is partially built, so some segment is still on the way - don't resume the other slices until that's arrived!
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   189
            return 0;
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   190
        }
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   191
    }
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:
diff changeset
   192
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:
diff changeset
   193
error:
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:
diff changeset
   194
    // user needs to deinit/free us
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:
diff changeset
   195
    return -1;
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:
diff changeset
   196
}   
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:
diff changeset
   197
18
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   198
int render_slices_done (struct render_slices *ctx) {
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   199
    // finish off render_png
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   200
    if (render_png_done(&ctx->png_info))
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   201
        goto error;
18
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   202
    
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   203
    return 0;
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:
diff changeset
   204
18
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   205
error:
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   206
    render_slices_free(ctx);
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   207
    return -1;
86f2e5b7191b render_multi uses render_slices now, and seems to work
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   208
}
19
d18606bb6f20 a working threaded sliced render, plus modifications to other modules to use this in web_main
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   209