static int mask_draw_labq( Mask *mask ) { float *lab_buffer; float ink_buffer[3]; int y; if( !(lab_buffer = IM_ARRAY( NULL, mask->image_clip.width * 3, float )) ) return( -1 ); imb_LabQ2Lab( DRAW( mask )->ink, ink_buffer, 1 ); for( y = 0; y < mask->image_clip.height; y++ ) { PEL *to = (PEL *) IM_IMAGE_ADDR( DRAW( mask )->im, mask->image_clip.left, y + mask->image_clip.top ); PEL *mask_line = (PEL *) IM_IMAGE_ADDR( mask->mask_im, mask->mask_clip.left, y + mask->mask_clip.top ); imb_LabQ2Lab( to, lab_buffer, mask->image_clip.width ); DBLEND( float, lab_buffer, ink_buffer ); imb_Lab2LabQ( lab_buffer, to, mask->image_clip.width ); } im_free( lab_buffer ); return( 0 ); }
/* Top-bottom blend function for IM_CODING_LABQ images. */ static int tb_blend_labpack( REGION *or, MergeInfo *inf, Overlapping *ovlap, Rect *oreg ) { REGION *rir = inf->rir; REGION *sir = inf->sir; Rect prr, psr; int y, yr, ys; /* Make sure we have a complete first/last set for this area. This * will just look at the top 8 bits of L, not all 10, but should be OK. */ if( make_firstlast( inf, ovlap, oreg ) ) return( -1 ); /* Part of rr which we will output. */ prr = *oreg; prr.left -= ovlap->rarea.left; prr.top -= ovlap->rarea.top; /* Part of sr which we will output. */ psr = *oreg; psr.left -= ovlap->sarea.left; psr.top -= ovlap->sarea.top; /* Make pixels. */ if( im_prepare( rir, &prr ) ) return( -1 ); if( im_prepare( sir, &psr ) ) return( -1 ); /* Loop down overlap area. */ for( y = oreg->top, yr = prr.top, ys = psr.top; y < IM_RECT_BOTTOM( oreg ); y++, yr++, ys++ ) { PEL *pr = (PEL *) IM_REGION_ADDR( rir, prr.left, yr ); PEL *ps = (PEL *) IM_REGION_ADDR( sir, psr.left, ys ); PEL *q = (PEL *) IM_REGION_ADDR( or, oreg->left, y ); const int j = oreg->left - ovlap->overlap.left; const int *first = ovlap->first + j; const int *last = ovlap->last + j; float *fq = inf->merge; float *r = inf->from1; float *s = inf->from2; /* Unpack two bits we want. */ imb_LabQ2Lab( pr, r, oreg->width ); imb_LabQ2Lab( ps, s, oreg->width ); /* Blend as floats. */ fblend( float, 3, r, s, fq ); /* Re-pack to output buffer. */ imb_Lab2LabQ( inf->merge, q, oreg->width ); } return( 0 ); }