如何在 emscripten 中使用 canvas
How to use canvas in emscripten
我正在开发一个 webassembly 程序。
我可以使用 emscripten_set_canvas_size 设置 canvas 大小(虽然我读到我需要切换到新的 API 因为这个会被折旧)...
但我的问题是:如何设置 canvas 上的像素?
我的程序为 canvas 生成一个 32 位颜色的数组,我需要将这些位从我的内部存储器传输到 canvas。我该怎么做?
或者,如果我可以获得指向 canvas 数据的内存指针,我可以直接写入所述内存...
如果可能的话,我想做到这一点而不必求助于任何其他 API(GL、SDL...)我需要的只是将颜色转移到 canvas越快越好...仅此而已。
理想情况下,我正在寻找一个简短的示例程序:
#include <...>
uint32_t screen[320*320];
static void main_loop()
{
memset(screen, 0, 320*320*4); // Clear screen
for (int x=0; x<320; x++)
for (int y=0; y<320; y++)
screen[320*(x|y) + (x&y)]= 0xffffff; // set pixel(x or y, x and y) to white... (will draw a serpinsky triangle)
Copy_ToCanvas(screen); // THIS IS THE FUNCTION THAT I AM LOOKING FOR
}
int main()
{
emscripten_set_canvas_size(320, 320);
emscripten_set_main_loop(main_loop, 100, true);
return 0;
}
谢谢,
西里尔
没有 SDL,需要低级代码。
void Copy_ToCanvas(uint32_t* ptr, int w, int h) {
EM_ASM_({
let data = Module.HEAPU8.slice([=10=], [=10=] + * * 4);
let context = Module['canvas'].getContext('2d');
let imageData = context.getImageData(0, 0, , );
imageData.data.set(data);
context.putImageData(imageData, 0, 0);
}, ptr, w, h);
}
static void main_loop()
{
memset(screen, 0, 320*320*4); // Clear screen
for (int x=0; x<320; x++)
for (int y=0; y<320; y++)
screen[320*(x|y) + (x&y)]= 0xffffffff; // set pixel(x or y, x and y) to white... (will draw a serpinsky triangle)
Copy_ToCanvas(screen, 320, 320);
}
请注意,上面的有用答案不会正确显示,因为 memset() 调用不会将浏览器屏幕清除为黑色。显然,您必须明确设置 alpha 通道。所以不是 memset(),
int screen[320*320],idx=0;
for (int x=0; x<320*320; x++)
screen[idx++] = 0xff000000;
我正在开发一个 webassembly 程序。 我可以使用 emscripten_set_canvas_size 设置 canvas 大小(虽然我读到我需要切换到新的 API 因为这个会被折旧)...
但我的问题是:如何设置 canvas 上的像素? 我的程序为 canvas 生成一个 32 位颜色的数组,我需要将这些位从我的内部存储器传输到 canvas。我该怎么做?
或者,如果我可以获得指向 canvas 数据的内存指针,我可以直接写入所述内存...
如果可能的话,我想做到这一点而不必求助于任何其他 API(GL、SDL...)我需要的只是将颜色转移到 canvas越快越好...仅此而已。
理想情况下,我正在寻找一个简短的示例程序:
#include <...>
uint32_t screen[320*320];
static void main_loop()
{
memset(screen, 0, 320*320*4); // Clear screen
for (int x=0; x<320; x++)
for (int y=0; y<320; y++)
screen[320*(x|y) + (x&y)]= 0xffffff; // set pixel(x or y, x and y) to white... (will draw a serpinsky triangle)
Copy_ToCanvas(screen); // THIS IS THE FUNCTION THAT I AM LOOKING FOR
}
int main()
{
emscripten_set_canvas_size(320, 320);
emscripten_set_main_loop(main_loop, 100, true);
return 0;
}
谢谢, 西里尔
没有 SDL,需要低级代码。
void Copy_ToCanvas(uint32_t* ptr, int w, int h) {
EM_ASM_({
let data = Module.HEAPU8.slice([=10=], [=10=] + * * 4);
let context = Module['canvas'].getContext('2d');
let imageData = context.getImageData(0, 0, , );
imageData.data.set(data);
context.putImageData(imageData, 0, 0);
}, ptr, w, h);
}
static void main_loop()
{
memset(screen, 0, 320*320*4); // Clear screen
for (int x=0; x<320; x++)
for (int y=0; y<320; y++)
screen[320*(x|y) + (x&y)]= 0xffffffff; // set pixel(x or y, x and y) to white... (will draw a serpinsky triangle)
Copy_ToCanvas(screen, 320, 320);
}
请注意,上面的有用答案不会正确显示,因为 memset() 调用不会将浏览器屏幕清除为黑色。显然,您必须明确设置 alpha 通道。所以不是 memset(),
int screen[320*320],idx=0;
for (int x=0; x<320*320; x++)
screen[idx++] = 0xff000000;