- MaskPackage *ptr = (MaskPackage*)package;
-
- 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;
- }
- }
- }
+ float *psf = engine->psf; int psz = engine->psz;
+ temp_t **orows = (temp_t**)out->get_rows();
+ temp_t **irows = (temp_t**)in->get_rows();
+ int w = in->get_w(), w1 = w-1;
+ for( int y=start_y; y<end_y; ++y ) {
+ temp_t *rp = irows[y];
+ for( int x=0; x<w; ++x ) {
+ temp_t c = rp[x], f = c * psf[0];
+ for( int i=1; i<psz; ++i ) {
+ int l = x-i; if( l < 0 ) l = 0;
+ int r = x+i; if( r > w1 ) r = w1;
+ temp_t g = bmax(rp[l], rp[r]) * psf[i];
+ if( f < g ) f = g;