Blender  V3.3
Classes | Macros | Typedefs | Functions | Variables
mask_rasterize.c File Reference
#include "CLG_log.h"
#include "MEM_guardedalloc.h"
#include "DNA_mask_types.h"
#include "DNA_scene_types.h"
#include "DNA_vec_types.h"
#include "BLI_memarena.h"
#include "BLI_scanfill.h"
#include "BLI_utildefines.h"
#include "BLI_linklist.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_rect.h"
#include "BLI_task.h"
#include "BKE_mask.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Classes

struct  MaskRasterLayer
 
struct  MaskRasterSplineInfo
 
struct  MaskRasterHandle
 
struct  MaskRasterizeBufferData
 

Macros

#define USE_SCANFILL_EDGE_WORKAROUND
 
#define SPLINE_RESOL_CAP_PER_PIXEL   2
 
#define SPLINE_RESOL_CAP_MIN   8
 
#define SPLINE_RESOL_CAP_MAX   64
 
#define BUCKET_PIXELS_PER_CELL   4
 
#define SF_EDGE_IS_BOUNDARY   0xff
 
#define SF_KEYINDEX_TEMP_ID   ((unsigned int)-1)
 
#define TRI_TERMINATOR_ID   ((unsigned int)-1)
 
#define TRI_VERT   ((unsigned int)-1)
 
#define FACE_ASSERT(face, vert_max)
 
#define CALC_CAP_RESOL
 

Typedefs

typedef struct MaskRasterLayer MaskRasterLayer
 
typedef struct MaskRasterSplineInfo MaskRasterSplineInfo
 
typedef struct MaskRasterizeBufferData MaskRasterizeBufferData
 

Functions

static void rotate_point_v2 (float r_p[2], const float p[2], const float cent[2], const float angle, const float asp[2])
 
BLI_INLINE unsigned int clampis_uint (const unsigned int v, const unsigned int min, const unsigned int max)
 
static ScanFillVertscanfill_vert_add_v2_with_depth (ScanFillContext *sf_ctx, const float co_xy[2], const float co_z)
 
MaskRasterHandleBKE_maskrasterize_handle_new (void)
 
void BKE_maskrasterize_handle_free (MaskRasterHandle *mr_handle)
 
static void maskrasterize_spline_differentiate_point_outset (float(*diff_feather_points)[2], float(*diff_points)[2], const unsigned int tot_diff_point, const float ofs, const bool do_test)
 
static bool layer_bucket_isect_test (const MaskRasterLayer *layer, unsigned int face_index, const unsigned int bucket_x, const unsigned int bucket_y, const float bucket_size_x, const float bucket_size_y, const float bucket_max_rad_squared)
 
static void layer_bucket_init_dummy (MaskRasterLayer *layer)
 
static void layer_bucket_init (MaskRasterLayer *layer, const float pixel_size)
 
void BKE_maskrasterize_handle_init (MaskRasterHandle *mr_handle, struct Mask *mask, const int width, const int height, const bool do_aspect_correct, const bool do_mask_aa, const bool do_feather)
 
static float maskrasterize_layer_z_depth_quad (const float pt[2], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
 
static float maskrasterize_layer_isect (const unsigned int *face, float(*cos)[3], const float dist_orig, const float xy[2])
 
BLI_INLINE unsigned int layer_bucket_index_from_xy (MaskRasterLayer *layer, const float xy[2])
 
static float layer_bucket_depth_from_xy (MaskRasterLayer *layer, const float xy[2])
 
float BKE_maskrasterize_handle_sample (MaskRasterHandle *mr_handle, const float xy[2])
 
static void maskrasterize_buffer_cb (void *__restrict userdata, const int y, const TaskParallelTLS *__restrict UNUSED(tls))
 
void BKE_maskrasterize_buffer (MaskRasterHandle *mr_handle, const unsigned int width, const unsigned int height, float *buffer)
 Rasterize a buffer from a single mask (threaded execution). More...
 

Variables

static CLG_LogRef LOG = {"bke.mask_rasterize"}
 

Detailed Description

This module exposes a rasterizer that works as a black box - implementation details are confined to this file.

The basic method to access is:

This file is admittedly a bit confusticated, in quite few areas speed was chosen over readability, though it is commented - so shouldn't be so hard to see what's going on.

Implementation:

To rasterize the mask its converted into geometry that use a ray-cast for each pixel lookup.

Initially 'kdopbvh' was used but this ended up being too slow.

To gain some extra speed we take advantage of a few shortcuts that can be made rasterizing masks specifically.

Other Details:

This is getting a bit complicated with the addition of unfilled splines and end capping - If large changes are needed here we would be better off using an iterable BLI_mempool for triangles and converting to a contiguous array afterwards.

Definition in file mask_rasterize.c.

Macro Definition Documentation

◆ BUCKET_PIXELS_PER_CELL

#define BUCKET_PIXELS_PER_CELL   4

Definition at line 83 of file mask_rasterize.c.

◆ CALC_CAP_RESOL

#define CALC_CAP_RESOL
Value:
(unsigned int)(len_v2v2(fp_cent, fp_turn) / (pixel_size * SPLINE_RESOL_CAP_PER_PIXEL)), \
MINLINE float len_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
#define SPLINE_RESOL_CAP_MAX
#define SPLINE_RESOL_CAP_MIN
BLI_INLINE unsigned int clampis_uint(const unsigned int v, const unsigned int min, const unsigned int max)
#define SPLINE_RESOL_CAP_PER_PIXEL

◆ FACE_ASSERT

#define FACE_ASSERT (   face,
  vert_max 
)
Value:
{ \
unsigned int *_t = face; \
BLI_assert(_t[0] < vert_max); \
BLI_assert(_t[1] < vert_max); \
BLI_assert(_t[2] < vert_max); \
BLI_assert(_t[3] < vert_max || _t[3] == TRI_VERT); \
} \
(void)0
SyclQueue void void size_t num_bytes void
#define TRI_VERT

Definition at line 94 of file mask_rasterize.c.

◆ SF_EDGE_IS_BOUNDARY

#define SF_EDGE_IS_BOUNDARY   0xff

Definition at line 85 of file mask_rasterize.c.

◆ SF_KEYINDEX_TEMP_ID

#define SF_KEYINDEX_TEMP_ID   ((unsigned int)-1)

Definition at line 86 of file mask_rasterize.c.

◆ SPLINE_RESOL_CAP_MAX

#define SPLINE_RESOL_CAP_MAX   64

Definition at line 80 of file mask_rasterize.c.

◆ SPLINE_RESOL_CAP_MIN

#define SPLINE_RESOL_CAP_MIN   8

Definition at line 79 of file mask_rasterize.c.

◆ SPLINE_RESOL_CAP_PER_PIXEL

#define SPLINE_RESOL_CAP_PER_PIXEL   2

Definition at line 78 of file mask_rasterize.c.

◆ TRI_TERMINATOR_ID

#define TRI_TERMINATOR_ID   ((unsigned int)-1)

Definition at line 88 of file mask_rasterize.c.

◆ TRI_VERT

#define TRI_VERT   ((unsigned int)-1)

Definition at line 89 of file mask_rasterize.c.

◆ USE_SCANFILL_EDGE_WORKAROUND

#define USE_SCANFILL_EDGE_WORKAROUND

Definition at line 76 of file mask_rasterize.c.

Typedef Documentation

◆ MaskRasterizeBufferData

◆ MaskRasterLayer

A single MaskRasterHandle contains multiple MaskRasterLayer's, each MaskRasterLayer does its own lookup which contributes to the final pixel with its own blending mode and the final pixel is blended between these.

◆ MaskRasterSplineInfo

Function Documentation

◆ BKE_maskrasterize_buffer()

void BKE_maskrasterize_buffer ( MaskRasterHandle mr_handle,
const unsigned int  width,
const unsigned int  height,
float buffer 
)

◆ BKE_maskrasterize_handle_free()

void BKE_maskrasterize_handle_free ( MaskRasterHandle mr_handle)

◆ BKE_maskrasterize_handle_init()

void BKE_maskrasterize_handle_init ( MaskRasterHandle mr_handle,
struct Mask mask,
const int  width,
const int  height,
const bool  do_aspect_correct,
const bool  do_mask_aa,
const bool  do_feather 
)

Definition at line 564 of file mask_rasterize.c.

References add_v2_v2v2(), MaskRasterLayer::alpha, MaskLayer::alpha, angle(), BKE_mask_spline_differentiate_with_resolution(), BKE_mask_spline_feather_collapse_inner_loops(), BKE_mask_spline_feather_differentiated_points_with_resolution(), BKE_mask_spline_feather_resolution(), BKE_mask_spline_resolution(), MaskRasterLayer::blend, MaskLayer::blend, MaskRasterLayer::blend_flag, MaskLayer::blend_flag, BLI_assert, BLI_listbase_count(), BLI_memarena_free(), BLI_memarena_new(), BLI_movelisttolist(), BLI_rctf_do_minmax_v(), BLI_rctf_init_minmax(), BLI_rctf_isect(), BLI_rctf_union(), BLI_remlink(), BLI_SCANFILL_ARENA_SIZE, BLI_scanfill_begin_arena(), BLI_scanfill_calc_ex(), BLI_SCANFILL_CALC_HOLES, BLI_SCANFILL_CALC_POLYS, BLI_scanfill_calc_self_isect(), BLI_scanfill_edge_add(), BLI_scanfill_end_arena(), bounds(), MaskRasterLayer::bounds, MaskRasterHandle::bounds, ScanFillEdge::c, CALC_CAP_RESOL, CLAMPIS, ScanFillVert::co, copy_v3_v3(), KDL::cos(), MaskRasterLayer::face_array, FACE_ASSERT, MaskRasterLayer::face_coords, MaskRasterLayer::face_tot, MaskRasterLayer::falloff, MaskLayer::falloff, ScanFillContext::filledgebase, ScanFillContext::fillfacebase, ScanFillContext::fillvertbase, ListBase::first, MaskSpline::flag, MaskLayer::flag, float(), height, MaskRasterSplineInfo::is_cyclic, is_cyclic(), ScanFillVert::keyindex, ListBase::last, layer_bucket_init(), layer_bucket_init_dummy(), MaskRasterHandle::layers, MaskRasterHandle::layers_tot, M_PI, mask(), MASK_HIDE_RENDER, MASK_LAYERFLAG_FILL_DISCRETE, MASK_LAYERFLAG_FILL_OVERLAP, MASK_SPLINE_CYCLIC, MASK_SPLINE_NOFILL, MASK_SPLINE_NOINTERSECT, maskrasterize_spline_differentiate_point_outset(), MAX2, MEM_callocN, MEM_freeN, MEM_mallocN, MEM_reallocN, min_ii(), ScanFillVert::next, ScanFillEdge::next, ScanFillFace::next, MaskSpline::next, MaskLayer::next, NULL, ScanFillContext::poly_nr, rotate_point_v2(), scanfill_vert_add_v2_with_depth(), SF_EDGE_IS_BOUNDARY, SF_KEYINDEX_TEMP_ID, MaskLayer::splines, sub_v2_v2v2(), ScanFillVert::tmp, ScanFillEdge::tmp, TRI_VERT, ScanFillVert::u, ScanFillEdge::v1, ScanFillFace::v1, ScanFillEdge::v2, ScanFillFace::v2, ScanFillFace::v3, MaskRasterSplineInfo::vertex_offset, MaskRasterSplineInfo::vertex_total, MaskRasterSplineInfo::vertex_total_cap_head, MaskRasterSplineInfo::vertex_total_cap_tail, MaskLayer::visibility_flag, void, and width.

Referenced by edit_uv_mask_texture(), blender::compositor::MaskOperation::init_execution(), mask_rasterize(), and seq_render_mask().

◆ BKE_maskrasterize_handle_new()

MaskRasterHandle* BKE_maskrasterize_handle_new ( void  )

◆ BKE_maskrasterize_handle_sample()

float BKE_maskrasterize_handle_sample ( MaskRasterHandle mr_handle,
const float  xy[2] 
)

◆ clampis_uint()

BLI_INLINE unsigned int clampis_uint ( const unsigned int  v,
const unsigned int  min,
const unsigned int  max 
)

Definition at line 130 of file mask_rasterize.c.

References max, min, and v.

◆ layer_bucket_depth_from_xy()

static float layer_bucket_depth_from_xy ( MaskRasterLayer layer,
const float  xy[2] 
)
static

◆ layer_bucket_index_from_xy()

BLI_INLINE unsigned int layer_bucket_index_from_xy ( MaskRasterLayer layer,
const float  xy[2] 
)

◆ layer_bucket_init()

static void layer_bucket_init ( MaskRasterLayer layer,
const float  pixel_size 
)
static

◆ layer_bucket_init_dummy()

static void layer_bucket_init_dummy ( MaskRasterLayer layer)
static

◆ layer_bucket_isect_test()

static bool layer_bucket_isect_test ( const MaskRasterLayer layer,
unsigned int  face_index,
const unsigned int  bucket_x,
const unsigned int  bucket_y,
const float  bucket_size_x,
const float  bucket_size_y,
const float  bucket_max_rad_squared 
)
static

◆ maskrasterize_buffer_cb()

static void maskrasterize_buffer_cb ( void *__restrict  userdata,
const int  y,
const TaskParallelTLS *__restrict   UNUSEDtls 
)
static

Definition at line 1434 of file mask_rasterize.c.

References BKE_maskrasterize_handle_sample(), buffer, data, float(), width, x, xy, and y.

Referenced by BKE_maskrasterize_buffer().

◆ maskrasterize_layer_isect()

static float maskrasterize_layer_isect ( const unsigned int *  face,
float(*)  cos[3],
const float  dist_orig,
const float  xy[2] 
)
static

◆ maskrasterize_layer_z_depth_quad()

static float maskrasterize_layer_z_depth_quad ( const float  pt[2],
const float  v1[3],
const float  v2[3],
const float  v3[3],
const float  v4[3] 
)
static

Definition at line 1223 of file mask_rasterize.c.

References barycentric_weights_v2_quad(), v1, v2, and w().

Referenced by maskrasterize_layer_isect().

◆ maskrasterize_spline_differentiate_point_outset()

static void maskrasterize_spline_differentiate_point_outset ( float(*)  diff_feather_points[2],
float(*)  diff_points[2],
const unsigned int  tot_diff_point,
const float  ofs,
const bool  do_test 
)
static

◆ rotate_point_v2()

static void rotate_point_v2 ( float  r_p[2],
const float  p[2],
const float  cent[2],
const float  angle,
const float  asp[2] 
)
static

Definition at line 110 of file mask_rasterize.c.

References angle(), Freestyle::c, cosf, and sinf.

Referenced by BKE_maskrasterize_handle_init().

◆ scanfill_vert_add_v2_with_depth()

static ScanFillVert* scanfill_vert_add_v2_with_depth ( ScanFillContext sf_ctx,
const float  co_xy[2],
const float  co_z 
)
static

Definition at line 137 of file mask_rasterize.c.

References BLI_scanfill_vert_add().

Referenced by BKE_maskrasterize_handle_init().

Variable Documentation

◆ LOG

CLG_LogRef LOG = {"bke.mask_rasterize"}
static

Definition at line 108 of file mask_rasterize.c.

Referenced by BKE_maskrasterize_handle_sample().