// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: braces fieldsfirst space lnc 

package com.google.zxing.common;

import com.google.zxing.Binarizer;
import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;

// Referenced classes of package com.google.zxing.common:
//            BitMatrix, BitArray

public class GlobalHistogramBinarizer extends Binarizer
{

    private static final int a = 5;
    private static final int b = 3;
    private static final int c = 32;
    private byte d[];
    private final int e[] = new int[32];

    public GlobalHistogramBinarizer(LuminanceSource luminancesource)
    {
        super(luminancesource);
        d = new byte[0];
    }

    private static int a(int ai[])
    {
        int i = 0;
        int j = ai.length;
        int k = 0;
        int l = 0;
        int i1 = 0;
        int j1 = 0;
        for (; k < j; k++)
        {
            if (ai[k] > l)
            {
                l = ai[k];
                i1 = k;
            }
            if (ai[k] > j1)
            {
                j1 = ai[k];
            }
        }

        int k1 = 0;
        int l1 = 0;
        while (i < j) 
        {
            int l3 = i - i1;
            int i4 = l3 * (l3 * ai[i]);
            int i2;
            int j2;
            int k2;
            int l2;
            int i3;
            int j3;
            int k3;
            int j4;
            if (i4 > k1)
            {
                j4 = i;
            } else
            {
                i4 = k1;
                j4 = l1;
            }
            i++;
            l1 = j4;
            k1 = i4;
        }
        if (i1 > l1)
        {
            i2 = l1;
            l1 = i1;
        } else
        {
            i2 = i1;
        }
        if (l1 - i2 <= j >> 4)
        {
            throw NotFoundException.getNotFoundInstance();
        }
        j2 = l1 - 1;
        k2 = -1;
        l2 = l1 - 1;
        while (l2 > i2) 
        {
            i3 = l2 - i2;
            j3 = i3 * i3 * (l1 - l2) * (j1 - ai[l2]);
            if (j3 > k2)
            {
                k3 = l2;
            } else
            {
                j3 = k2;
                k3 = j2;
            }
            l2--;
            j2 = k3;
            k2 = j3;
        }
        return j2 << 3;
    }

    private void a(int i)
    {
        if (d.length < i)
        {
            d = new byte[i];
        }
        for (int j = 0; j < 32; j++)
        {
            e[j] = 0;
        }

    }

    public Binarizer createBinarizer(LuminanceSource luminancesource)
    {
        return new GlobalHistogramBinarizer(luminancesource);
    }

    public BitMatrix getBlackMatrix()
    {
        LuminanceSource luminancesource = getLuminanceSource();
        int i = luminancesource.getWidth();
        int j = luminancesource.getHeight();
        BitMatrix bitmatrix = new BitMatrix(i, j);
        a(i);
        int ai[] = e;
        for (int k = 1; k < 5; k++)
        {
            byte abyte1[] = luminancesource.getRow((j * k) / 5, d);
            int l1 = (i << 2) / 5;
            for (int i2 = i / 5; i2 < l1; i2++)
            {
                int j2 = (0xff & abyte1[i2]) >> 3;
                ai[j2] = 1 + ai[j2];
            }

        }

        int l = a(ai);
        byte abyte0[] = luminancesource.getMatrix();
        for (int i1 = 0; i1 < j; i1++)
        {
            int j1 = i1 * i;
            for (int k1 = 0; k1 < i; k1++)
            {
                if ((0xff & abyte0[j1 + k1]) < l)
                {
                    bitmatrix.set(k1, i1);
                }
            }

        }

        return bitmatrix;
    }

    public BitArray getBlackRow(int i, BitArray bitarray)
    {
        int j = 1;
        LuminanceSource luminancesource = getLuminanceSource();
        int k = luminancesource.getWidth();
        byte abyte0[];
        int ai[];
        if (bitarray == null || bitarray.getSize() < k)
        {
            bitarray = new BitArray(k);
        } else
        {
            bitarray.clear();
        }
        a(k);
        abyte0 = luminancesource.getRow(i, d);
        ai = e;
        for (int l = 0; l < k; l++)
        {
            int j2 = (0xff & abyte0[l]) >> 3;
            ai[j2] = 1 + ai[j2];
        }

        int i1 = a(ai);
        int j1 = 0xff & abyte0[0];
        int k1 = 0xff & abyte0[j];
        int l1 = j1;
        while (j < k - 1) 
        {
            int i2 = 0xff & abyte0[j + 1];
            if ((k1 << 2) - l1 - i2 >> 1 < i1)
            {
                bitarray.set(j);
            }
            j++;
            l1 = k1;
            k1 = i2;
        }
        return bitarray;
    }
}