Allegro.cc - Online Community

Allegro.cc Forums » Programming Questions » [A5] how to use a bitmap as a pattern to fill a rectangular area?

Credits go to Don Freeman and SiegeLord for helping out!
This thread is locked; no one can reply to it. rss feed Print
[A5] how to use a bitmap as a pattern to fill a rectangular area?
axilmar
Member #1,204
April 2001

Hi, I'd like to fill a rectangular area with a bitmap used as a pattern. How do I do that with A5?

Don Freeman
Member #5,110
October 2004
avatar

Use the primitives addon. Look at the source code for the primitives example...

--
"Everyone tells me I should forget about you, you don’t deserve me. They’re right, you don’t deserve me, but I deserve you."
"It’s so simple to be wise. Just think of something stupid to say and then don’t say it."

axilmar
Member #1,204
April 2001

Thanks. After lots of experimentation, I came up with this:

#SelectExpand
1void al_draw_bitmap_rect(ALLEGRO_BITMAP *bmp, int sx, int sy, int sw, int sh, float dx, float dy, float dw, float dh, int flags) { 2 ALLEGRO_BITMAP *sub = al_create_sub_bitmap(bmp, sx, sy, sw, sh); 3 ALLEGRO_BITMAP *clone = al_clone_bitmap(sub); 4 5 ALLEGRO_COLOR c = al_map_rgb(255, 255, 255); 6 7 ALLEGRO_VERTEX vertices[4]; 8 9 vertices[0].x = dx; 10 vertices[0].y = dy; 11 vertices[0].z = 0; 12 vertices[0].color = c; 13 vertices[0].u = 0; 14 vertices[0].v = 0; 15 16 vertices[1].x = dx + dw; 17 vertices[1].y = dy; 18 vertices[1].z = 0; 19 vertices[1].color = c; 20 vertices[1].u = dw; 21 vertices[1].v = 0; 22 23 vertices[2].x = dx; 24 vertices[2].y = dy + dh; 25 vertices[2].z = 0; 26 vertices[2].color = c; 27 vertices[2].u = 0; 28 vertices[2].v = dh; 29 30 vertices[3].x = dx + dw; 31 vertices[3].y = dy + dh; 32 vertices[3].z = 0; 33 vertices[3].color = c; 34 vertices[3].u = dw; 35 vertices[3].v = dh; 36 37 al_draw_prim(vertices, nullptr, clone, 0, 4, ALLEGRO_PRIM_TRIANGLE_STRIP); 38 39 al_destroy_bitmap(clone); 40 al_destroy_bitmap(sub); 41}

Am I doing it correctly? the visual output seems correct.

The function obviously creates and destroys bitmaps, so it's not the fastest thing. Other than pre-creating the bitmaps, is there another way to specify a subarea of the bitmap? perhaps using the vertices?

SiegeLord
Member #7,827
October 2006
avatar

axilmar said:

Other than pre-creating the bitmaps, is there another way to specify a subarea of the bitmap? perhaps using the vertices?

Can't be done without shaders, which is why Allegro doesn't support this operation.

"For in much wisdom is much grief: and he that increases knowledge increases sorrow."-Ecclesiastes 1:18
[SiegeLord's Abode][Codes]:[DAllegro5]:[RustAllegro]

axilmar
Member #1,204
April 2001

SiegeLord said:

Can't be done without shaders, which is why Allegro doesn't support this operation.

Thanks. So it seems I would have to actually split the bitmap into other bitmaps.

Go to: