-
- if(engine->recalculate &&
- engine->step == DO_MASK)
- {
- VFrame *mask;
- if(engine->feather > 0)
- mask = engine->temp_mask;
- else
- mask = engine->mask;
-
-SET_TRACE
-// Generated oversampling frame
- int mask_w = mask->get_w();
- //int mask_h = mask->get_h();
- int oversampled_package_w = mask_w * OVERSAMPLE;
- int oversampled_package_h = (ptr->end_y - ptr->start_y) * OVERSAMPLE;
-//printf("MaskUnit::process_package 1\n");
-
-SET_TRACE
- if(temp &&
- (temp->get_w() != oversampled_package_w ||
- temp->get_h() != oversampled_package_h)) {
- delete temp; temp = 0;
- }
-//printf("MaskUnit::process_package 1\n");
-
-SET_TRACE
- if(!temp) {
- temp = new VFrame(oversampled_package_w, oversampled_package_h, BC_A8, 0);
- }
-
-SET_TRACE
- temp->clear_frame();
-//printf("MaskUnit::process_package 1 %d\n", engine->point_sets.total);
-
-SET_TRACE
-
-// Draw oversampled region of polygons on temp
- for(int k = 0; k < engine->point_sets.total; k++)
- {
- int old_x, old_y;
- unsigned char max = k + 1;
- ArrayList<MaskPoint*> *points = engine->point_sets.values[k];
-
- if(points->total < 3) continue;
-//printf("MaskUnit::process_package 2 %d %d\n", k, points->total);
- for(int i = 0; i < points->total; i++)
- {
- MaskPoint *point1 = points->values[i];
- MaskPoint *point2 = (i >= points->total - 1) ?
- points->values[0] :
- points->values[i + 1];
-
- float x, y;
- int segments = (int)(sqrt(SQR(point1->x - point2->x) + SQR(point1->y - point2->y)));
- if(point1->control_x2 == 0 &&
- point1->control_y2 == 0 &&
- point2->control_x1 == 0 &&
- point2->control_y1 == 0)
- segments = 1;
- float x0 = point1->x;
- float y0 = point1->y;
- float x1 = point1->x + point1->control_x2;
- float y1 = point1->y + point1->control_y2;
- float x2 = point2->x + point2->control_x1;
- float y2 = point2->y + point2->control_y1;
- float x3 = point2->x;
- float y3 = point2->y;
-
- for(int j = 0; j <= segments; j++)
- {
- float t = (float)j / segments;
- float tpow2 = t * t;
- float tpow3 = t * t * t;
- float invt = 1 - t;
- float invtpow2 = invt * invt;
- float invtpow3 = invt * invt * invt;
-
- x = ( invtpow3 * x0
- + 3 * t * invtpow2 * x1
- + 3 * tpow2 * invt * x2
- + tpow3 * x3);
- y = ( invtpow3 * y0
- + 3 * t * invtpow2 * y1
- + 3 * tpow2 * invt * y2
- + tpow3 * y3);
-
- y -= ptr->start_y;
- x *= OVERSAMPLE;
- y *= OVERSAMPLE;
-
- if(j > 0)
- {
- draw_line_clamped(temp, old_x, old_y, (int)x, (int)y, max);
- }
-
- old_x = (int)x;
- old_y = (int)y;
- }
- }
-
-SET_TRACE
-//printf("MaskUnit::process_package 1\n");
-
-
-
-
-
-// Fill in the polygon in the horizontal direction
- for(int i = 0; i < oversampled_package_h; i++)
- {
- unsigned char *row = (unsigned char*)temp->get_rows()[i];
- int value = 0x0;
- int total = 0;
-
- for(int j = 0; j < oversampled_package_w; j++)
- if(row[j] == max) total++;
-
- if(total > 1)
- {
- if(total & 0x1) total--;
- for(int j = 0; j < oversampled_package_w; j++)
- {
- if(row[j] == max && total > 0)
- {
- if(value)
- value = 0x0;
- else
- value = max;
- total--;
- }
- else
- {
- if(value) row[j] = value;
- }
- }
- }
+ start_y = ptr->start_y;
+ end_y = ptr->end_y;
+ if( start_y >= end_y ) return;
+ mask_model = engine->mask->get_color_model();
+ VFrame *temp = engine->temp;
+ if( engine->recalculate && engine->step == DO_MASK ) {
+// Draw masked region of polygons on temp
+ for( int k=0; k<engine->edges.size(); ++k ) {
+ if( !engine->edges[k] ) continue;
+ MaskEdge &edge = *engine->edges[k];
+ if( edge.size() < 3 ) continue;
+ int v = k + 1;
+ for( int i=0; i<edge.size(); ++i ) {
+ MaskCoord a = edge[i];
+ MaskCoord b = i<edge.size()-1 ? edge[i+1] : edge[0];
+ draw_line(v, a.x,a.y, b.x,b.y);