Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-07-18 00:40:12 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-07-18 00:40:12 +0400
commit7baa8d520318479037e2032df6de83b4ed3015a7 (patch)
tree84c0bf81de12d1d360ffcea6c23dbe0c55aa433f /source/blender/blenkernel/intern/mask_rasterize.c
parentb6a9ffffedb9204edcaa4081f4ab8fb2b722ef9f (diff)
mask rasterizer unfilled line end capping now works with aspect and blending.
Diffstat (limited to 'source/blender/blenkernel/intern/mask_rasterize.c')
-rw-r--r--source/blender/blenkernel/intern/mask_rasterize.c62
1 files changed, 38 insertions, 24 deletions
diff --git a/source/blender/blenkernel/intern/mask_rasterize.c b/source/blender/blenkernel/intern/mask_rasterize.c
index 4de39816e2d..9ee10186861 100644
--- a/source/blender/blenkernel/intern/mask_rasterize.c
+++ b/source/blender/blenkernel/intern/mask_rasterize.c
@@ -47,7 +47,7 @@
#ifndef USE_RASKTER
-#define SPLINE_RESOL_CAP 4
+#define SPLINE_RESOL_CAP 32
#define SPLINE_RESOL 32
#define BUCKET_PIXELS_PER_CELL 8
@@ -67,23 +67,26 @@
BLI_assert(_t[2] < vert_max || _t[2] == TRI_VERT); \
} (void)0
-void rotate_point(const float cent[2], const float angle, float p[2])
+void rotate_point(const float cent[2], const float angle, float p[2], const float asp[2])
{
- const float s = sinf(angle);
- const float c = cosf(angle);
- float p_new[2];
+ const float s = sinf(angle);
+ const float c = cosf(angle);
+ float p_new[2];
- /* translate point back to origin */
- p[0] -= cent[0];
- p[1] -= cent[1];
+ /* translate point back to origin */
+ p[0] -= cent[0];
+ p[1] -= cent[1];
- /* rotate point */
- p_new[0] = p[0] * c - p[1] * s;
- p_new[1] = p[0] * s + p[1] * c;
+ p[0] /= asp[0];
+ p[1] /= asp[1];
- /* translate point back */
- p[0] = p_new[0] + cent[0];
- p[1] = p_new[1] + cent[1];
+ /* rotate point */
+ p_new[0] = ((p[0] * c) - (p[1] * s)) * asp[0];
+ p_new[1] = ((p[0] * s) + (p[1] * c)) * asp[1];
+
+ /* translate point back */
+ p[0] = p_new[0] + cent[0];
+ p[1] = p_new[1] + cent[1];
}
/* --------------------------------------------------------------------- */
@@ -720,13 +723,25 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
/*cap ends */
if (!is_cyclic) {
-
unsigned int k;
+ float asp[2] = {1.0f, 1.0f};
+
+ if (do_aspect_correct) {
+ if (width != height) {
+ if (width < height) {
+ asp[1] = (float)width / (float)height;
+ }
+ else {
+ asp[0] = (float)height / (float)width;
+ }
+ }
+ }
+
for (k = 1; k < SPLINE_RESOL_CAP; k++) {
const float angle = (float)k * (1.0f / SPLINE_RESOL_CAP) * (float)M_PI;
copy_v2_v2(co_feather, diff_feather_points[0]);
- rotate_point(diff_points[0], angle, co_feather);
+ rotate_point(diff_points[0], angle, co_feather, asp);
sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
sf_vert->tmp.u = sf_vert_tot;
@@ -739,7 +754,7 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
for (k = 1; k < SPLINE_RESOL_CAP; k++) {
const float angle = (float)k * (1.0f / SPLINE_RESOL_CAP) * (float)M_PI;
copy_v2_v2(co_feather, diff_feather_points[tot_diff_point - 1]);
- rotate_point(diff_points[tot_diff_point - 1], -angle, co_feather);
+ rotate_point(diff_points[tot_diff_point - 1], -angle, co_feather, asp);
sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
sf_vert->tmp.u = sf_vert_tot;
@@ -879,7 +894,6 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
}
else {
unsigned int midvidx = start_vidx;
- // unsigned int repvidx; /* repeat vertex index, ugh */
/***************
* cap end 'a' */
@@ -887,9 +901,9 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
for (k = 0; k < SPLINE_RESOL_CAP - 2; k++, j++) {
*(face++) = midvidx + 0; /* z 1 */
+ *(face++) = midvidx + 0; /* z 1 */
*(face++) = j + 0; /* z 0 */
*(face++) = j + 1; /* z 0 */
- *(face++) = TRI_VERT;
face_index++;
FACE_ASSERT(face - 4, sf_vert_tot);
}
@@ -898,16 +912,16 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
/* 2 tris that join the original */
*(face++) = midvidx + 0; /* z 1 */
+ *(face++) = midvidx + 0; /* z 1 */
*(face++) = midvidx + 1; /* z 0 */
*(face++) = j + 0; /* z 0 */
- *(face++) = TRI_VERT;
face_index++;
FACE_ASSERT(face - 4, sf_vert_tot);
*(face++) = midvidx + 0; /* z 1 */
+ *(face++) = midvidx + 0; /* z 1 */
*(face++) = j + SPLINE_RESOL_CAP - 2; /* z 0 */
*(face++) = midvidx + 2; /* z 0 */
- *(face++) = TRI_VERT;
face_index++;
FACE_ASSERT(face - 4, sf_vert_tot);
@@ -922,9 +936,9 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
for (k = 0; k < SPLINE_RESOL_CAP - 2; k++, j++) {
*(face++) = midvidx; /* z 1 */
+ *(face++) = midvidx; /* z 1 */
*(face++) = j + 1; /* z 0 */
*(face++) = j + 0; /* z 0 */
- *(face++) = TRI_VERT;
face_index++;
FACE_ASSERT(face - 4, sf_vert_tot);
}
@@ -933,16 +947,16 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
/* 2 tris that join the original */
*(face++) = midvidx + 0; /* z 1 */
+ *(face++) = midvidx + 0; /* z 1 */
*(face++) = j + 0; /* z 0 */
*(face++) = midvidx + 1; /* z 0 */
- *(face++) = TRI_VERT;
face_index++;
FACE_ASSERT(face - 4, sf_vert_tot);
*(face++) = midvidx + 0; /* z 1 */
+ *(face++) = midvidx + 0; /* z 1 */
*(face++) = midvidx + 2; /* z 0 */
*(face++) = j + SPLINE_RESOL_CAP - 2; /* z 0 */
- *(face++) = TRI_VERT;
face_index++;
FACE_ASSERT(face - 4, sf_vert_tot);