function [ vyst_obraz ] = kompozice(vst_obraz, koeficienty,filters, urovne )
%KOMPOZICE Funkce provede rekonstrukci obrazu
%   Vstupy funkce:
%       vst_obraz - jedna se o obraz, ktery byl drive transformovan.
%                   Zajisti spravnou velikost rekonstruovaneho obrazu.
%       koeficienty - Vstupem funkce budou bunky poli matic koeficientu nasledujiciho tvaru:
%                   koeficienty = cell(urovne,1) - obsahuje vnorene pole matic koef.
%                                                  pro kazdou uroven rozkladu
%                   koeficienty{1,1} = cell(4,4) - matice koeficientu ur. rozkladu
%       filters - banka filtru o rozmerech cell(4,1)
%       urovne - pocet urovni dekompozice

    pocet_filtru = length(filters);
    celk_kompozice = cell(urovne,1);
    mezi_kompozice = cell(pocet_filtru,1);
    delka_filtr = length(filters{1,1});
    
    %XXX = 1;
    
    m = length(filters{1,1});
    zbytky = zeros(urovne,2);
    [xrows,xcols] = size(vst_obraz);

%   pro spravne obnoveni rozmeru urovne nad je potreba urcit, kdy se odecital zbytek po deleni    
for ur_deleni = 1:urovne
    zbytky(ur_deleni,1) = rem(xrows+m-1,2); % zbytek se bude pricitat do velikosti obrazu vyssi urovne
    xrows = (((xrows+m-1)/2)-zbytky(ur_deleni,1)/2);
    
    zbytky(ur_deleni,2) = rem(xcols+m-1,2);
    xcols = (((xcols+m-1)/2)-zbytky(ur_deleni,2)/2);   
end
    

%   kompozice se provadi od posledni urovne transformace zpet
for p_ur =  1:urovne
    posl_ur = urovne + 1 - p_ur;
    
    
    for p_row = 1:pocet_filtru % vertik. kompozice radku filtru
        
            
            % rows a cols udavaji rozmery matice
            [rows,cols] = size(koeficienty{posl_ur,1}{p_row,2});
            xxhat = cell(pocet_filtru,1);
            act_col_x = cell(pocet_filtru,1);
            
            for col = 1:cols
                if (p_ur == 1) && (p_row == 1)
                    act_col_x{1,1} = koeficienty{urovne,1}{1,1}(:,col);
                elseif p_row ==1
                    act_col_x{1,1} = celk_kompozice{posl_ur+1,1}(:,col);
                else
                    act_col_x{1,1} = koeficienty{posl_ur,1}{p_row,1}(:,col);
                end
                
                
                
                for i = 2:pocet_filtru
                    act_col_x{i,1} = koeficienty{posl_ur,1}{p_row,i}(:,col);
                end
% %                 act_col_b = koeficienty{posl_ur,1}{p_row,2}(:,col);
% %                 act_col_c = koeficienty{posl_ur,1}{p_row,3}(:,col);
% %                 act_col_d = koeficienty{posl_ur,1}{p_row,4}(:,col);
                

                % upsampling a inverzní transformace
                for i = 1:pocet_filtru
                    xihat = conv(dyadup(act_col_x{i,1}),fliplr(filters{i,1}));
                    xxhat{i,1}(:,col) = xihat(delka_filtr:end-delka_filtr+zbytky(posl_ur,1))';
                end
% %                 x1hat = conv(dyadup(act_col_a),fliplr(filters{1,1}));
% %                 x2hat = conv(dyadup(act_col_b),fliplr(filters{2,1}));
% %                 x3hat = conv(dyadup(act_col_c),fliplr(filters{3,1}));
% %                 x4hat = conv(dyadup(act_col_d),fliplr(filters{4,1}));
                
% %                 xxhat{1,1}(:,col) = x1hat(delka_filtr:end-delka_filtr+zbytky(posl_ur,1))';
% %                 xxhat{2,1}(:,col) = x2hat(delka_filtr:end-delka_filtr+zbytky(posl_ur,1))';
% %                 xxhat{3,1}(:,col) = x3hat(delka_filtr:end-delka_filtr+zbytky(posl_ur,1))';
% %                 xxhat{4,1}(:,col) = x4hat(delka_filtr:end-delka_filtr+zbytky(posl_ur,1))';
            end
            
            mezi_kompozice{p_row,1} = xxhat{1,1};
            
            % secteni jednotlivych vysledku
            for i = 2:pocet_filtru
                mezi_kompozice{p_row,1} = mezi_kompozice{p_row,1} + xxhat{i,1};
            end
                
% %             mezi_kompozice{p_row,1} = xxhat{1,1} + xxhat{2,1} + xxhat{3,1} + xxhat{4,1};
    end
    
    
        [rows,cols] = size(mezi_kompozice{1,1});
        x_rows = cell(pocet_filtru,1);
        
        for i = 1:pocet_filtru
            x_rows{i,1} = zeros(rows,cols*2-delka_filtr+1+zbytky(posl_ur,2));
        end
        
% %          a_rows = zeros(rows,cols*2-delka_filtr+1+zbytky(posl_ur,2));
% %          b_rows = zeros(rows,cols*2-delka_filtr+1+zbytky(posl_ur,2));
% %          c_rows = zeros(rows,cols*2-delka_filtr+1+zbytky(posl_ur,2));
% %          d_rows = zeros(rows,cols*2-delka_filtr+1+zbytky(posl_ur,2));
        
            for row = 1:rows
                
                act_row_x = cell(pocet_filtru,1);
                x = cell(pocet_filtru,1);
                
                for i = 1:pocet_filtru
                    act_row_x{i,1} = mezi_kompozice{i,1}(row,:);
                    % upsampling a inverzní transformace
                    x{i,1} = conv(dyadup(act_row_x{i,1}),fliplr(filters{i,1}));
                    x_rows{i,1}(row,:) = x{i,1}(delka_filtr:end-delka_filtr+zbytky(posl_ur,2))';
                end
                
% %                 act_row_a = mezi_kompozice{1,1}(row,:);
% %                 act_row_b = mezi_kompozice{2,1}(row,:);
% %                 act_row_c = mezi_kompozice{3,1}(row,:);
% %                 act_row_d = mezi_kompozice{4,1}(row,:);
                % upsampling a inverzní transformace
% %                 a = conv(dyadup(act_row_a),fliplr(filters{1,1}));
% %                 b = conv(dyadup(act_row_b),fliplr(filters{2,1}));
% %                 c = conv(dyadup(act_row_c),fliplr(filters{3,1}));
% %                 d = conv(dyadup(act_row_d),fliplr(filters{4,1}));
% %                 a_rows(row,:) = a(delka_filtr:end-delka_filtr+zbytky(posl_ur,2))';
% %                 b_rows(row,:) = b(delka_filtr:end-delka_filtr+zbytky(posl_ur,2))';
% %                 c_rows(row,:) = c(delka_filtr:end-delka_filtr+zbytky(posl_ur,2))';
% %                 d_rows(row,:) = d(delka_filtr:end-delka_filtr+zbytky(posl_ur,2))';
            end
            
        
        celk_kompozice{posl_ur,1} = x_rows{1,1};    
        
        for i = 2:pocet_filtru
            celk_kompozice{posl_ur,1} = celk_kompozice{posl_ur,1} + x_rows{i,1};
        end
            
% %     celk_kompozice{posl_ur,1} = a_rows + b_rows + c_rows + d_rows;
    
end

vysl_obr = celk_kompozice{1,1};
%vyst_obr = log(abs(vysl_obr)/max(max(abs(vysl_obr)))+1);
vyst_obraz = vysl_obr*255;
%vyst_obraz = uint8(vyst_obr*255);
%vyst_obraz = vyst_obr;

end
