{$O+}
type
cvsize = packed record
width : cint;
height: cint;
end;
cvstatus=cint;
function icvBayer2BGR_8u_C1C3R( bayer0:pbbyte;bayer_step:cint;dst0:pbbyte;dst_step:cint;size:cvsize;code:cint):CVSTATUS;
var blue : cint;
start_with_green : cint;
t0,t1 :cint;
bayer_end,
bayer,dst : pbbyte;
label 123;
begin
if (code= CV_BayerBG2BGR ) or (code= CV_BayerGB2BGR) then
blue:=-1
else
blue:=1;
if (code = CV_BayerGB2BGR) or (code =CV_BayerGR2BGR) then
start_with_green:=1
else
start_with_green:=0;
// int blue = code == CV_BayerBG2BGR || code == CV_BayerGB2BGR ? -1 : 1;
// int start_with_green = code == CV_BayerGB2BGR || code == CV_BayerGR2BGR;
fillchar(dst0^,size.width*3*sizeof(dst0[0]),#0);
fillchar( (dst0 + (size.height - 1)*dst_step)^, size.width*3*sizeof(dst0[0]),#0 );
// memset( dst0, 0, size.width*3*sizeof(dst0[0]) );
// memset( dst0 + (size.height - 1)*dst_step, 0, size.width*3*sizeof(dst0[0]) );
inc(dst0 ,dst_step + 3 + 1);
dec(size.height , 2);
dec(size.width , 2);
repeat
// for( ; size.height-- > 0; bayer0 += bayer_step, dst0 += dst_step )
bayer:=bayer0;
dst:=dst0;
bayer_end:=bayer+size.width;
{ const uchar* bayer = bayer0;
uchar* dst = dst0;
const uchar* bayer_end = bayer + size.width;
}
dst[-4] :=0;
dst[-3] :=0;
dst[-2] :=0;
dst[size.width*3-1] :=0;
dst[size.width*3] :=0;
dst[size.width*3+1] :=0;
if( size.width <= 0 ) then
goto 123; // continue; // can't use contineu because of decrement operator abuse + for
if( start_with_green )<>0 then
begin
t0 := (ord(bayer[1]) + ord(bayer[bayer_step*2+1]) + 1) shr {>>} 1;
t1 := (ord(bayer[bayer_step]) + ord(bayer[bayer_step+2]) + 1) shr {>>} 1;
dst[-blue] := t0;
dst[0] := bayer[bayer_step+1];
dst[blue] := (t1);
inc(bayer);
inc(dst, 3);
end;
if( blue > 0 ) then
begin
repeat
// for( ; bayer <= bayer_end - 2; bayer += 2, dst += 6 )
t0 := (ord(bayer[0]) + ord(bayer[2]) + ord(bayer[bayer_step*2]) +
ord(bayer[bayer_step*2+2]) + 2) shr {>>} 2;
t1 := (ord(bayer[1]) + ord(bayer[bayer_step]) +
ord(bayer[bayer_step+2]) + ord(bayer[bayer_step*2+1])+2) shr {>>} 2;
dst[-1] := (t0);
dst[0] := (t1);
dst[1] := bayer[bayer_step+1];
t0 := (ord(bayer[2]) + ord(bayer[bayer_step*2+2]) + 1) shr {>>} 1;
t1 := (ord(bayer[bayer_step+1]) + ord(bayer[bayer_step+3]) + 1) shr {>>} 1;
dst[2] := (t0);
dst[3] := bayer[bayer_step+2];
dst[4] := (t1);
inc(bayer,2);
inc(dst,6);
until bayer>(bayer_end-2);
end
else
begin
// for( ; bayer <= bayer_end - 2; bayer += 2, dst += 6 ) {\
repeat
t0 := (ord(bayer[0]) + ord(bayer[2]) + ord(bayer[bayer_step*2]) +
ord(bayer[bayer_step*2+2]) + 2) {>>} shr 2;
t1 := (ord(bayer[1]) + ord(bayer[bayer_step]) +
ord(bayer[bayer_step+2]) + ord(bayer[bayer_step*2+1])+2) {>>} shr 2;
dst[1] := (t0);
dst[0] := (t1);
dst[-1] := bayer[bayer_step+1];
t0 := (ord(bayer[2]) + ord(bayer[bayer_step*2+2]) + 1) {>>} shr 1;
t1 := (ord(bayer[bayer_step+1]) + ord(bayer[bayer_step+3]) + 1) {>>} shr 1;
dst[4] := (t0);
dst[3] := bayer[bayer_step+2];
dst[2] := (t1);
inc(bayer,2);
inc(dst,6);
until bayer>(bayer_end-2);
end;
if( bayer < bayer_end ) then
begin
t0 := (ord(bayer[0]) + ord(bayer[2]) + ord(bayer[bayer_step*2]) +
ord(bayer[bayer_step*2+2]) + 2) {>>} shr 2;
t1 := (ord(bayer[1]) + ord(bayer[bayer_step]) +
ord(bayer[bayer_step+2]) + ord(bayer[bayer_step*2+1])+2) shr { >>} 2;
dst[-blue] := (t0);
dst[0] := (t1);
dst[blue] := bayer[bayer_step+1];
inc(bayer);
inc(dst,3);
end;
blue := -blue;
start_with_green := not start_with_green;
//( ; size.height-- > 0; bayer0 += bayer_step, dst0 += dst_step )
123:
inc(bayer0,bayer_step);
inc(dst0,dst_step);
dec(size.height);
until (size.height<=0);
result:=CV_OK;
end;