- MaskPackage *ptr = (MaskPackage*)package;
- float engine_value = engine->value;
- int engine_mode = engine->mode;
-
- if( engine->recalculate && engine->step == DO_MASK ) {
- VFrame *mask = engine->feather > 0 ? engine->temp_mask : engine->mask;
-// 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;
- if( temp &&
- (temp->get_w() != oversampled_package_w ||
- temp->get_h() != oversampled_package_h) ) {
- delete temp; temp = 0;
- }
- if( !temp ) {
- temp = new VFrame(oversampled_package_w, oversampled_package_h, BC_A8, 0);
- }
- temp->clear_frame();
-// 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;
- }
- }
-// 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 = 0, 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 ) {
- --total;
- value = value ? 0 : max;
- }
- 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;