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-- |
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 |