Math Lib: use x-span for fill_poly_v2i_n callback

Instead of running the callback per-pixel,
pass the x-span to the callback.
This commit is contained in:
2016-01-08 23:29:42 +11:00
parent 0634fd0e97
commit e830334357
6 changed files with 45 additions and 12 deletions

View File

@@ -814,11 +814,14 @@ typedef struct TrackMaskSetPixelData {
int mask_height;
} TrackMaskSetPixelData;
static void track_mask_set_pixel_cb(int x, int y, void *user_data)
static void track_mask_set_pixel_cb(int x, int x_end, int y, void *user_data)
{
TrackMaskSetPixelData *data = (TrackMaskSetPixelData *)user_data;
size_t index = (size_t)y * data->mask_width + x;
data->mask[index] = 1.0f;
size_t index = (size_t)y * data->mask_width + x;
size_t index_end = (size_t)y * data->mask_width + x_end;
do {
data->mask[index] = 1.0f;
} while (++index != index_end);
}
static void track_mask_gpencil_layer_rasterize(int frame_width, int frame_height,

View File

@@ -291,7 +291,7 @@ void plot_line_v2v2i(const int p1[2], const int p2[2], bool (*callback)(int, int
void fill_poly_v2i_n(
const int xmin, const int ymin, const int xmax, const int ymax,
const int polyXY[][2], const int polyCorners,
void (*callback)(int, int, void *), void *userData);
void (*callback)(int x, int x_end, int y, void *), void *userData);
/****************************** Interpolation ********************************/
/* tri or quad, d can be NULL */

View File

@@ -2642,10 +2642,20 @@ void plot_line_v2v2i(const int p1[2], const int p2[2], bool (*callback)(int, int
}
}
/**
* \param callback: Takes the x, y coords and x-span (\a x_end is not inclusive),
* note that \a x_end will always be greater than \a x, so we can use:
*
* \code{.c}
* do {
* func(x, y);
* } while (++x != x_end);
* \endcode
*/
void fill_poly_v2i_n(
const int xmin, const int ymin, const int xmax, const int ymax,
const int verts[][2], const int nr,
void (*callback)(int, int, void *), void *userData)
void (*callback)(int x, int x_end, int y, void *), void *userData)
{
/* originally by Darel Rex Finley, 2007 */
@@ -2686,9 +2696,18 @@ void fill_poly_v2i_n(
if (node_x[i + 1] > xmin) {
if (node_x[i ] < xmin) node_x[i ] = xmin;
if (node_x[i + 1] > xmax) node_x[i + 1] = xmax;
#if 0
/* for many x/y calls */
for (j = node_x[i]; j < node_x[i + 1]; j++) {
callback(j - xmin, pixel_y - ymin, userData);
}
#else
/* for single call per x-span */
if (node_x[i] < node_x[i + 1]) {
callback(node_x[i] - xmin, node_x[i + 1] - xmin, pixel_y - ymin, userData);
}
#endif
}
}
}

View File

@@ -249,10 +249,14 @@ struct LassoMaskData {
int width;
};
static void edbm_mask_lasso_px_cb(int x, int y, void *user_data)
static void edbm_mask_lasso_px_cb(int x, int x_end, int y, void *user_data)
{
struct LassoMaskData *data = user_data;
data->px[(y * data->width) + x] = true;
unsigned int *px = &data->px[(y * data->width) + x];
do {
*px = true;
px++;
} while (++x != x_end);
}

View File

@@ -315,10 +315,14 @@ static bool is_effected_lasso(LassoMaskData *data, float co[3])
return BLI_BITMAP_TEST_BOOL(data->px, scr_co_s[1] * data->width + scr_co_s[0]);
}
static void mask_lasso_px_cb(int x, int y, void *user_data)
static void mask_lasso_px_cb(int x, int x_end, int y, void *user_data)
{
struct LassoMaskData *data = user_data;
BLI_BITMAP_ENABLE(data->px, (y * data->width) + x);
int index = (y * data->width) + x;
int index_end = (y * data->width) + x_end;
do {
BLI_BITMAP_ENABLE(data->px, index);
} while (++index != index_end);
}
static int paint_mask_gesture_lasso_exec(bContext *C, wmOperator *op)

View File

@@ -235,12 +235,15 @@ struct LassoFillData {
int width;
};
static void draw_filled_lasso_px_cb(int x, int y, void *user_data)
static void draw_filled_lasso_px_cb(int x, int x_end, int y, void *user_data)
{
struct LassoFillData *data = user_data;
unsigned char *col = (unsigned char *)&(data->px[(y * data->width) + x]);
col[0] = col[1] = col[2] = 0xff;
col[3] = 0x10;
do {
col[0] = col[1] = col[2] = 0xff;
col[3] = 0x10;
col += 4;
} while (++x != x_end);
}
static void draw_filled_lasso(wmWindow *win, wmGesture *gt)