|
79 | 79 | } |
80 | 80 | } |
81 | 81 |
|
| 82 | + var canvas; |
| 83 | + var canvasCtx; |
| 84 | + var imageData; |
| 85 | + var data; |
82 | 86 | if (opt.graphical) { |
83 | | - throw "CPU fallback for graphical output is not supported!"; |
| 87 | + canvas = gpu.getCanvas('cpu'); |
| 88 | + canvas.width = threadDim[0]; |
| 89 | + canvas.height = threadDim[1]; |
| 90 | + |
| 91 | + canvasCtx = canvas.getContext("2d"); |
| 92 | + imageData = canvasCtx.createImageData(threadDim[0], threadDim[1]); |
| 93 | + data = new Uint8ClampedArray(threadDim[0]*threadDim[1]*4); |
84 | 94 | } |
85 | 95 |
|
86 | 96 | var ctx = { |
|
89 | 99 | y: 0, |
90 | 100 | z: 0 |
91 | 101 | }, |
92 | | - dimensions: threadDim, |
93 | | - color: function(r, g, b, a) { |
94 | | - console.warn("color() does nothing on fallback mode"); |
| 102 | + dimensions: { |
| 103 | + x: threadDim[0], |
| 104 | + y: threadDim[1], |
| 105 | + z: threadDim[2] |
95 | 106 | } |
96 | 107 | }; |
97 | 108 |
|
| 109 | + ctx.color = function(r, g, b, a) { |
| 110 | + if (a == undefined) { |
| 111 | + a = 1.0; |
| 112 | + } |
| 113 | + |
| 114 | + r = Math.floor(r * 255); |
| 115 | + g = Math.floor(g * 255); |
| 116 | + b = Math.floor(b * 255); |
| 117 | + a = Math.floor(a * 255); |
| 118 | + |
| 119 | + var width = ctx.dimensions.x; |
| 120 | + var height = ctx.dimensions.y; |
| 121 | + |
| 122 | + var x = ctx.thread.x; |
| 123 | + var y = height - ctx.thread.y - 1; |
| 124 | + |
| 125 | + var index = x + y*width; |
| 126 | + |
| 127 | + data[index*4+0] = r; |
| 128 | + data[index*4+1] = g; |
| 129 | + data[index*4+2] = b; |
| 130 | + data[index*4+3] = a; |
| 131 | + }; |
| 132 | + |
98 | 133 | for (ctx.thread.z=0; ctx.thread.z<threadDim[2]; ctx.thread.z++) { |
99 | 134 | for (ctx.thread.y=0; ctx.thread.y<threadDim[1]; ctx.thread.y++) { |
100 | 135 | for (ctx.thread.x=0; ctx.thread.x<threadDim[0]; ctx.thread.x++) { |
101 | 136 | ret[ctx.thread.z][ctx.thread.y][ctx.thread.x] = kernel.apply(ctx, kernelArgs); |
102 | 137 | } |
103 | 138 | } |
104 | 139 | } |
105 | | - |
| 140 | + |
| 141 | + if (opt.graphical) { |
| 142 | + imageData.data.set(data); |
| 143 | + canvasCtx.putImageData(imageData, 0, 0); |
| 144 | + } |
| 145 | + |
106 | 146 | if (opt.dimensions.length == 1) { |
107 | 147 | ret = ret[0][0]; |
108 | 148 | } else if (opt.dimensions.length == 2) { |
|
117 | 157 | return ret; |
118 | 158 | }; |
119 | 159 |
|
| 160 | + ret.debug = function(flag) { |
| 161 | + opt.debug = flag; |
| 162 | + return ret; |
| 163 | + }; |
| 164 | + |
| 165 | + ret.graphical = function(flag) { |
| 166 | + opt.graphical = flag; |
| 167 | + return ret; |
| 168 | + }; |
| 169 | + |
120 | 170 | ret.wraparound = function() { |
121 | 171 | opt.wraparound = false; |
122 | 172 | return ret; |
|
137 | 187 | return gpu.createKernel(kernel, opt); |
138 | 188 | }; |
139 | 189 |
|
| 190 | + ret.getCanvas = function() { |
| 191 | + return gpu.getCanvas('cpu'); |
| 192 | + }; |
| 193 | + |
140 | 194 | return ret; |
141 | 195 | }; |
142 | 196 | })(GPU); |
0 commit comments