From d211c9aa0aaa68fe126ce632746b705903d03173 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Sat, 15 Dec 2018 11:47:24 +0300 Subject: BLI_bitmap: add functions operating on the whole bitmask. There is no point having operations that iterate over the whole bit array as macros, so convert BLI_BITMAP_SET_ALL to a function. Also, add more utilities for copying and manipulating masks. Reviewers: brecht, campbellbarton Differential Revision: https://developer.blender.org/D4101 --- source/blender/blenkernel/intern/bvhutils.c | 2 +- source/blender/blenkernel/intern/mesh_evaluate.c | 2 +- source/blender/blenkernel/intern/mesh_remap.c | 4 +- source/blender/blenkernel/intern/multires.c | 2 +- source/blender/blenkernel/intern/subdiv_foreach.c | 2 +- source/blender/blenlib/BLI_bitmap.h | 16 ++--- source/blender/blenlib/CMakeLists.txt | 1 + source/blender/blenlib/intern/astar.c | 2 +- source/blender/blenlib/intern/bitmap.c | 75 ++++++++++++++++++++++ .../blender/windowmanager/intern/wm_files_link.c | 4 +- 10 files changed, 91 insertions(+), 19 deletions(-) create mode 100644 source/blender/blenlib/intern/bitmap.c (limited to 'source') diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c index 83b18a57ba4..c264eb8a1d2 100644 --- a/source/blender/blenkernel/intern/bvhutils.c +++ b/source/blender/blenkernel/intern/bvhutils.c @@ -1043,7 +1043,7 @@ static BLI_bitmap *loose_verts_map_get( int *r_loose_vert_num) { BLI_bitmap *loose_verts_mask = BLI_BITMAP_NEW(verts_num, __func__); - BLI_BITMAP_SET_ALL(loose_verts_mask, true, verts_num); + BLI_bitmap_set_all(loose_verts_mask, true, verts_num); const MEdge *e = medge; int num_linked_verts = 0; diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c index b6ba4a15e40..c5bcb72165e 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.c +++ b/source/blender/blenkernel/intern/mesh_evaluate.c @@ -1769,7 +1769,7 @@ static void mesh_normals_loop_custom_set( &lnors_spacearr, NULL, loop_to_poly); } else { - BLI_BITMAP_SET_ALL(done_loops, true, (size_t)numLoops); + BLI_bitmap_set_all(done_loops, true, (size_t)numLoops); } /* And we just have to convert plain object-space custom normals to our lnor space-encoded ones. */ diff --git a/source/blender/blenkernel/intern/mesh_remap.c b/source/blender/blenkernel/intern/mesh_remap.c index bdf5b3fddcc..85b09848a72 100644 --- a/source/blender/blenkernel/intern/mesh_remap.c +++ b/source/blender/blenkernel/intern/mesh_remap.c @@ -1336,7 +1336,7 @@ void BKE_mesh_remap_calc_loops_from_mesh( for (tindex = 0; tindex < num_trees; tindex++) { MeshElemMap *isld = island_store.islands[tindex]; int num_verts_active = 0; - BLI_BITMAP_SET_ALL(verts_active, false, (size_t)num_verts_src); + BLI_bitmap_set_all(verts_active, false, (size_t)num_verts_src); for (i = 0; i < isld->count; i++) { mp_src = &polys_src[isld->indices[i]]; for (lidx_src = mp_src->loopstart; lidx_src < mp_src->loopstart + mp_src->totloop; lidx_src++) { @@ -1370,7 +1370,7 @@ void BKE_mesh_remap_calc_loops_from_mesh( for (tindex = 0; tindex < num_trees; tindex++) { int num_looptri_active = 0; - BLI_BITMAP_SET_ALL(looptri_active, false, (size_t)num_looptri_src); + BLI_bitmap_set_all(looptri_active, false, (size_t)num_looptri_src); for (i = 0; i < num_looptri_src; i++) { mp_src = &polys_src[looptri_src[i].poly]; if (island_store.items_to_islands[mp_src->loopstart] == tindex) { diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index a21e919bca7..d2f307362e6 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -275,7 +275,7 @@ static MDisps *multires_mdisps_initialize_hidden(Mesh *me, int level) BLI_assert(!md->hidden); md->hidden = BLI_BITMAP_NEW(gridarea, "MDisps.hidden initialize"); - BLI_BITMAP_SET_ALL(md->hidden, true, gridarea); + BLI_bitmap_set_all(md->hidden, true, gridarea); } } diff --git a/source/blender/blenkernel/intern/subdiv_foreach.c b/source/blender/blenkernel/intern/subdiv_foreach.c index 511536c31b5..f049b23a9ef 100644 --- a/source/blender/blenkernel/intern/subdiv_foreach.c +++ b/source/blender/blenkernel/intern/subdiv_foreach.c @@ -288,7 +288,7 @@ static void subdiv_foreach_ctx_init(Subdiv *subdiv, /* Calculate number of geometry in the result subdivision mesh. */ subdiv_foreach_ctx_count(ctx); /* Re-set maps which were used at this step. */ - BLI_BITMAP_SET_ALL(ctx->coarse_edges_used_map, false, coarse_mesh->totedge); + BLI_bitmap_set_all(ctx->coarse_edges_used_map, false, coarse_mesh->totedge); ctx->face_ptex_offset = BKE_subdiv_face_ptex_offset_get(subdiv); } diff --git a/source/blender/blenlib/BLI_bitmap.h b/source/blender/blenlib/BLI_bitmap.h index 8e873c76dc9..c3be39c5bc5 100644 --- a/source/blender/blenlib/BLI_bitmap.h +++ b/source/blender/blenlib/BLI_bitmap.h @@ -107,16 +107,6 @@ typedef unsigned int BLI_bitmap; BLI_BITMAP_DISABLE(_bitmap, _index); \ } (void)0 -/* set or clear the value of the whole bitmap (needs size info) */ -#define BLI_BITMAP_SET_ALL(_bitmap, _set, _tot) \ - { \ - CHECK_TYPE(_bitmap, BLI_bitmap *); \ - if (_set) \ - memset(_bitmap, UCHAR_MAX, BLI_BITMAP_SIZE(_tot)); \ - else \ - memset(_bitmap, 0, BLI_BITMAP_SIZE(_tot)); \ - } (void)0 - /* resize bitmap to have space for '_tot' bits */ #define BLI_BITMAP_RESIZE(_bitmap, _tot) \ { \ @@ -124,4 +114,10 @@ typedef unsigned int BLI_bitmap; (_bitmap) = MEM_reallocN(_bitmap, BLI_BITMAP_SIZE(_tot)); \ } (void)0 +void BLI_bitmap_set_all(BLI_bitmap *bitmap, bool set, size_t bits); +void BLI_bitmap_flip_all(BLI_bitmap *bitmap, size_t bits); +void BLI_bitmap_copy_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits); +void BLI_bitmap_and_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits); +void BLI_bitmap_or_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits); + #endif diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index 921ecc29e18..90d24d0b84e 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -62,6 +62,7 @@ set(SRC intern/array_store_utils.c intern/array_utils.c intern/astar.c + intern/bitmap.c intern/bitmap_draw_2d.c intern/boxpack_2d.c intern/buffer.c diff --git a/source/blender/blenlib/intern/astar.c b/source/blender/blenlib/intern/astar.c index ff4dfea2401..4a94c385b59 100644 --- a/source/blender/blenlib/intern/astar.c +++ b/source/blender/blenlib/intern/astar.c @@ -216,7 +216,7 @@ bool BLI_astar_graph_solve( r_solution->steps = 0; prev_nodes[node_index_src] = -1; - BLI_BITMAP_SET_ALL(done_nodes, false, as_graph->node_num); + BLI_bitmap_set_all(done_nodes, false, as_graph->node_num); copy_vn_fl(g_costs, as_graph->node_num, FLT_MAX); g_costs[node_index_src] = 0.0f; g_steps[node_index_src] = 0; diff --git a/source/blender/blenlib/intern/bitmap.c b/source/blender/blenlib/intern/bitmap.c new file mode 100644 index 00000000000..fab8b3dedf6 --- /dev/null +++ b/source/blender/blenlib/intern/bitmap.c @@ -0,0 +1,75 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2012 by Nicholas Bishop + * All rights reserved. + * + * The Original Code is: all of this file. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/blenlib/intern/bitmap.c + * \ingroup bli + * + * Utility functions for variable size bitmasks. + */ + +#include +#include + +#include "BLI_utildefines.h" +#include "BLI_bitmap.h" + +/** Set or clear all bits in the bitmap. */ +void BLI_bitmap_set_all(BLI_bitmap *bitmap, bool set, size_t bits) +{ + memset(bitmap, set ? UCHAR_MAX : 0, BLI_BITMAP_SIZE(bits)); +} + +/** Invert all bits in the bitmap. */ +void BLI_bitmap_flip_all(BLI_bitmap *bitmap, size_t bits) +{ + size_t num_blocks = _BITMAP_NUM_BLOCKS(bits); + for (size_t i = 0; i < num_blocks; i++) { + bitmap[i] ^= ~(BLI_bitmap)0; + } +} + +/** Copy all bits from one bitmap to another. */ +void BLI_bitmap_copy_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits) +{ + memcpy(dst, src, BLI_BITMAP_SIZE(bits)); +} + +/** Combine two bitmaps with boolean AND. */ +void BLI_bitmap_and_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits) +{ + size_t num_blocks = _BITMAP_NUM_BLOCKS(bits); + for (size_t i = 0; i < num_blocks; i++) { + dst[i] &= src[i]; + } +} + +/** Combine two bitmaps with boolean OR. */ +void BLI_bitmap_or_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits) +{ + size_t num_blocks = _BITMAP_NUM_BLOCKS(bits); + for (size_t i = 0; i < num_blocks; i++) { + dst[i] |= src[i]; + } +} diff --git a/source/blender/windowmanager/intern/wm_files_link.c b/source/blender/windowmanager/intern/wm_files_link.c index bc21276ff45..07ed7a8f59e 100644 --- a/source/blender/windowmanager/intern/wm_files_link.c +++ b/source/blender/windowmanager/intern/wm_files_link.c @@ -270,7 +270,7 @@ static void wm_link_do( if (new_id) { /* If the link is successful, clear item's libs 'todo' flags. * This avoids trying to link same item with other libraries to come. */ - BLI_BITMAP_SET_ALL(item->libraries, false, lapp_data->num_libraries); + BLI_bitmap_set_all(item->libraries, false, lapp_data->num_libraries); item->new_id = new_id; } } @@ -633,7 +633,7 @@ static void lib_relocate_do( /* Note that non-linkable IDs (like e.g. shapekeys) are also explicitly linked here... */ BLI_remlink(lbarray[lba_idx], id); item = wm_link_append_data_item_add(lapp_data, id->name + 2, idcode, id); - BLI_BITMAP_SET_ALL(item->libraries, true, lapp_data->num_libraries); + BLI_bitmap_set_all(item->libraries, true, lapp_data->num_libraries); #ifdef PRINT_DEBUG printf("\tdatablock to seek for: %s\n", id->name); -- cgit v1.2.3