public Image doTonalMappingAlg1(HdrImage hdrImage) {

        // dane hdr
        float[] rgb = hdrImage.getHdrData();
        
        double logAvg = 0;
        double maxLum = 0;
        float avgLum = 0;

        // konwersja obrazu hdr do Yxy i wyliczenie maksymalnej, sredniej oraz
        // średniej logaryticznej wartości luminancji
        for (int pix = 0; pix < rgb.length; pix += 3)
        {
           double gray = 0.21*rgb[pix]+0.71*rgb[pix+1]+0.07*rgb[pix+2];
           avgLum += gray;
           
           final double y = RGB2XYZ[3] * rgb[pix] + RGB2XYZ[4] * rgb[pix + 1] + RGB2XYZ[5] * rgb[pix + 2];
           logAvg += Math.log(1e-4 + y);
           if (y > maxLum)
              maxLum = y;
        }
        logAvg = Math.exp(logAvg / (rgb.length / 3.0));
        avgLum = (avgLum / (rgb.length / 3)) / 255;

        // srednia luminancja w obrazie - jesli obliczenie wychodza poza zakres
        // (10%;90%) wtedy wartosc domyslna 18%
        if (avgLum < 0.1 || avgLum > 0.9)
            avgLum = 0.18f;

        double scale = avgLum / logAvg;
        scale *= factor;

        return scaleLum(scale, rgb, maxLum, hdrImage.getWidth(), hdrImage.getHeight());
    }