MultiFinderPatternFinder.smali 
.class final Lcom/dcloud/zxing2/multi/qrcode/detector/MultiFinderPatternFinder;
.super Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lcom/dcloud/zxing2/multi/qrcode/detector/MultiFinderPatternFinder$ModuleSizeComparator;
    }
.end annotation
# static fields
.field private static final DIFF_MODSIZE_CUTOFF:F = 0.5f
.field private static final DIFF_MODSIZE_CUTOFF_PERCENT:F = 0.05f
.field private static final EMPTY_RESULT_ARRAY:[Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
.field private static final MAX_MODULE_COUNT_PER_EDGE:F = 180.0f
.field private static final MIN_MODULE_COUNT_PER_EDGE:F = 9.0f
# direct methods
.method static constructor <clinit>()V
    .registers 1
    const/4 v0, 0x0
    new-array v0, v0, [Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
    .line 1
    sput-object v0, Lcom/dcloud/zxing2/multi/qrcode/detector/MultiFinderPatternFinder;->EMPTY_RESULT_ARRAY:[Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
    return-void
.end method
.method constructor <init>(Lcom/dcloud/zxing2/common/BitMatrix;)V
    .registers 2
    .line 1
    invoke-direct {p0, p1}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;-><init>(Lcom/dcloud/zxing2/common/BitMatrix;)V
    return-void
.end method
.method constructor <init>(Lcom/dcloud/zxing2/common/BitMatrix;Lcom/dcloud/zxing2/ResultPointCallback;)V
    .registers 3
    .line 2
    invoke-direct {p0, p1, p2}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;-><init>(Lcom/dcloud/zxing2/common/BitMatrix;Lcom/dcloud/zxing2/ResultPointCallback;)V
    return-void
.end method
.method private selectMutipleBestPatterns()[[Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    .registers 20
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Lcom/dcloud/zxing2/NotFoundException;
        }
    .end annotation
    .line 1
    invoke-virtual/range {p0 .. p0}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;->getPossibleCenters()Ljava/util/List;
    move-result-object v0
    .line 2
    invoke-interface {v0}, Ljava/util/List;->size()I
    move-result v1
    const/4 v2, 0x3
    if-lt v1, v2, :cond_181
    const/4 v3, 0x2
    const/4 v4, 0x0
    const/4 v5, 0x1
    if-ne v1, v2, :cond_2f
    new-array v1, v5, [[Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    new-array v2, v2, [Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    .line 15
    invoke-interface {v0, v4}, Ljava/util/List;->get(I)Ljava/lang/Object;
    move-result-object v6
    check-cast v6, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    aput-object v6, v2, v4
    .line 16
    invoke-interface {v0, v5}, Ljava/util/List;->get(I)Ljava/lang/Object;
    move-result-object v6
    check-cast v6, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    aput-object v6, v2, v5
    .line 17
    invoke-interface {v0, v3}, Ljava/util/List;->get(I)Ljava/lang/Object;
    move-result-object v0
    check-cast v0, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    aput-object v0, v2, v3
    aput-object v2, v1, v4
    return-object v1
    .line 23
    :cond_2f
    new-instance v6, Lcom/dcloud/zxing2/multi/qrcode/detector/MultiFinderPatternFinder$ModuleSizeComparator;
    const/4 v7, 0x0
    invoke-direct {v6, v7}, Lcom/dcloud/zxing2/multi/qrcode/detector/MultiFinderPatternFinder$ModuleSizeComparator;-><init>(Lcom/dcloud/zxing2/multi/qrcode/detector/MultiFinderPatternFinder$1;)V
    invoke-static {v0, v6}, Ljava/util/Collections;->sort(Ljava/util/List;Ljava/util/Comparator;)V
    .line 40
    new-instance v6, Ljava/util/ArrayList;
    invoke-direct {v6}, Ljava/util/ArrayList;-><init>()V
    move v7, v4
    :goto_3e
    add-int/lit8 v8, v1, -0x2
    if-ge v7, v8, :cond_169
    .line 43
    invoke-interface {v0, v7}, Ljava/util/List;->get(I)Ljava/lang/Object;
    move-result-object v8
    check-cast v8, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    if-nez v8, :cond_4d
    :cond_4a
    :goto_4a
    move v15, v3
    goto/16 :goto_161
    :cond_4d
    add-int/lit8 v9, v7, 0x1
    :goto_4f
    add-int/lit8 v10, v1, -0x1
    if-ge v9, v10, :cond_4a
    .line 49
    invoke-interface {v0, v9}, Ljava/util/List;->get(I)Ljava/lang/Object;
    move-result-object v10
    check-cast v10, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    if-nez v10, :cond_5e
    :cond_5b
    move v15, v3
    goto/16 :goto_159
    .line 55
    :cond_5e
    invoke-virtual {v8}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v11
    invoke-virtual {v10}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v12
    sub-float/2addr v11, v12
    .line 56
    invoke-virtual {v8}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v12
    invoke-virtual {v10}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v13
    invoke-static {v12, v13}, Ljava/lang/Math;->min(FF)F
    move-result v12
    div-float/2addr v11, v12
    .line 57
    invoke-virtual {v8}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v12
    invoke-virtual {v10}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v13
    sub-float/2addr v12, v13
    invoke-static {v12}, Ljava/lang/Math;->abs(F)F
    move-result v12
    const/high16 v13, 0x3f000000    # 0.5f
    cmpl-float v12, v12, v13
    const v14, 0x3d4ccccd    # 0.05f
    if-lez v12, :cond_8f
    cmpl-float v11, v11, v14
    if-ltz v11, :cond_8f
    goto :goto_4a
    :cond_8f
    add-int/lit8 v11, v9, 0x1
    :goto_91
    if-ge v11, v1, :cond_5b
    .line 65
    invoke-interface {v0, v11}, Ljava/util/List;->get(I)Ljava/lang/Object;
    move-result-object v12
    check-cast v12, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    if-nez v12, :cond_9e
    move v15, v3
    goto/16 :goto_14c
    .line 71
    :cond_9e
    invoke-virtual {v10}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v15
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v16
    sub-float v15, v15, v16
    .line 72
    invoke-virtual {v10}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v3
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v5
    invoke-static {v3, v5}, Ljava/lang/Math;->min(FF)F
    move-result v3
    div-float/2addr v15, v3
    .line 73
    invoke-virtual {v10}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v3
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v5
    sub-float/2addr v3, v5
    invoke-static {v3}, Ljava/lang/Math;->abs(F)F
    move-result v3
    cmpl-float v3, v3, v13
    if-lez v3, :cond_cd
    cmpl-float v3, v15, v14
    if-ltz v3, :cond_cd
    const/4 v15, 0x2
    goto/16 :goto_159
    :cond_cd
    new-array v3, v2, [Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    aput-object v8, v3, v4
    const/4 v5, 0x1
    aput-object v10, v3, v5
    const/4 v15, 0x2
    aput-object v12, v3, v15
    .line 81
    invoke-static {v3}, Lcom/dcloud/zxing2/ResultPoint;->orderBestPatterns([Lcom/dcloud/zxing2/ResultPoint;)V
    .line 84
    new-instance v12, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
    invoke-direct {v12, v3}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;-><init>([Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;)V
    .line 85
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;->getTopLeft()Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    move-result-object v2
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;->getBottomLeft()Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    move-result-object v4
    invoke-static {v2, v4}, Lcom/dcloud/zxing2/ResultPoint;->distance(Lcom/dcloud/zxing2/ResultPoint;Lcom/dcloud/zxing2/ResultPoint;)F
    move-result v2
    .line 86
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;->getTopRight()Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    move-result-object v4
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;->getBottomLeft()Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    move-result-object v5
    invoke-static {v4, v5}, Lcom/dcloud/zxing2/ResultPoint;->distance(Lcom/dcloud/zxing2/ResultPoint;Lcom/dcloud/zxing2/ResultPoint;)F
    move-result v4
    .line 87
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;->getTopLeft()Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    move-result-object v5
    invoke-virtual {v12}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;->getTopRight()Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    move-result-object v12
    invoke-static {v5, v12}, Lcom/dcloud/zxing2/ResultPoint;->distance(Lcom/dcloud/zxing2/ResultPoint;Lcom/dcloud/zxing2/ResultPoint;)F
    move-result v5
    add-float v12, v2, v5
    .line 90
    invoke-virtual {v8}, Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
    move-result v17
    const/high16 v18, 0x40000000    # 2.0f
    mul-float v17, v17, v18
    div-float v12, v12, v17
    const/high16 v17, 0x43340000    # 180.0f
    cmpl-float v17, v12, v17
    if-gtz v17, :cond_14c
    const/high16 v17, 0x41100000    # 9.0f
    cmpg-float v12, v12, v17
    if-gez v12, :cond_11c
    goto :goto_14c
    :cond_11c
    sub-float v12, v2, v5
    .line 97
    invoke-static {v2, v5}, Ljava/lang/Math;->min(FF)F
    move-result v17
    div-float v12, v12, v17
    invoke-static {v12}, Ljava/lang/Math;->abs(F)F
    move-result v12
    const v17, 0x3dcccccd    # 0.1f
    cmpl-float v12, v12, v17
    if-ltz v12, :cond_130
    goto :goto_14c
    :cond_130
    mul-float/2addr v2, v2
    mul-float/2addr v5, v5
    add-float/2addr v2, v5
    float-to-double v13, v2
    .line 103
    invoke-static {v13, v14}, Ljava/lang/Math;->sqrt(D)D
    move-result-wide v13
    double-to-float v2, v13
    sub-float v13, v4, v2
    .line 105
    invoke-static {v4, v2}, Ljava/lang/Math;->min(FF)F
    move-result v2
    div-float/2addr v13, v2
    invoke-static {v13}, Ljava/lang/Math;->abs(F)F
    move-result v2
    cmpl-float v2, v2, v17
    if-ltz v2, :cond_149
    goto :goto_14c
    .line 112
    :cond_149
    invoke-interface {v6, v3}, Ljava/util/List;->add(Ljava/lang/Object;)Z
    :cond_14c
    :goto_14c
    add-int/lit8 v11, v11, 0x1
    move v3, v15
    const/4 v2, 0x3
    const/4 v4, 0x0
    const/4 v5, 0x1
    const/high16 v13, 0x3f000000    # 0.5f
    const v14, 0x3d4ccccd    # 0.05f
    goto/16 :goto_91
    :goto_159
    add-int/lit8 v9, v9, 0x1
    move v3, v15
    const/4 v2, 0x3
    const/4 v4, 0x0
    const/4 v5, 0x1
    goto/16 :goto_4f
    :goto_161
    add-int/lit8 v7, v7, 0x1
    move v3, v15
    const/4 v2, 0x3
    const/4 v4, 0x0
    const/4 v5, 0x1
    goto/16 :goto_3e
    .line 117
    :cond_169
    invoke-interface {v6}, Ljava/util/List;->isEmpty()Z
    move-result v0
    if-nez v0, :cond_17c
    .line 118
    invoke-interface {v6}, Ljava/util/List;->size()I
    move-result v0
    new-array v0, v0, [[Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    invoke-interface {v6, v0}, Ljava/util/List;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
    move-result-object v0
    check-cast v0, [[Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    return-object v0
    .line 122
    :cond_17c
    invoke-static {}, Lcom/dcloud/zxing2/NotFoundException;->getNotFoundInstance()Lcom/dcloud/zxing2/NotFoundException;
    move-result-object v0
    throw v0
    .line 123
    :cond_181
    invoke-static {}, Lcom/dcloud/zxing2/NotFoundException;->getNotFoundInstance()Lcom/dcloud/zxing2/NotFoundException;
    move-result-object v0
    throw v0
.end method
# virtual methods
.method public findMulti(Ljava/util/Map;)[Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
    .registers 16
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Ljava/util/Map<",
            "Lcom/dcloud/zxing2/DecodeHintType;",
            "*>;)[",
            "Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;"
        }
    .end annotation
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Lcom/dcloud/zxing2/NotFoundException;
        }
    .end annotation
    const/4 v0, 0x1
    const/4 v1, 0x0
    if-eqz p1, :cond_e
    .line 1
    sget-object v2, Lcom/dcloud/zxing2/DecodeHintType;->TRY_HARDER:Lcom/dcloud/zxing2/DecodeHintType;
    invoke-interface {p1, v2}, Ljava/util/Map;->containsKey(Ljava/lang/Object;)Z
    move-result v2
    if-eqz v2, :cond_e
    move v2, v0
    goto :goto_f
    :cond_e
    move v2, v1
    :goto_f
    if-eqz p1, :cond_1b
    .line 2
    sget-object v3, Lcom/dcloud/zxing2/DecodeHintType;->PURE_BARCODE:Lcom/dcloud/zxing2/DecodeHintType;
    invoke-interface {p1, v3}, Ljava/util/Map;->containsKey(Ljava/lang/Object;)Z
    move-result p1
    if-eqz p1, :cond_1b
    move p1, v0
    goto :goto_1c
    :cond_1b
    move p1, v1
    .line 3
    :goto_1c
    invoke-virtual {p0}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;->getImage()Lcom/dcloud/zxing2/common/BitMatrix;
    move-result-object v3
    .line 4
    invoke-virtual {v3}, Lcom/dcloud/zxing2/common/BitMatrix;->getHeight()I
    move-result v4
    .line 5
    invoke-virtual {v3}, Lcom/dcloud/zxing2/common/BitMatrix;->getWidth()I
    move-result v5
    int-to-float v6, v4
    const/high16 v7, 0x43640000    # 228.0f
    div-float/2addr v6, v7
    const/high16 v7, 0x40400000    # 3.0f
    mul-float/2addr v6, v7
    float-to-int v6, v6
    const/4 v7, 0x3
    if-lt v6, v7, :cond_35
    if-eqz v2, :cond_36
    :cond_35
    move v6, v7
    :cond_36
    const/4 v2, 0x5
    new-array v2, v2, [I
    add-int/lit8 v8, v6, -0x1
    :goto_3b
    if-ge v8, v4, :cond_aa
    aput v1, v2, v1
    aput v1, v2, v0
    const/4 v9, 0x2
    aput v1, v2, v9
    aput v1, v2, v7
    const/4 v10, 0x4
    aput v1, v2, v10
    move v11, v1
    move v12, v11
    :goto_4b
    if-ge v11, v5, :cond_9f
    .line 28
    invoke-virtual {v3, v11, v8}, Lcom/dcloud/zxing2/common/BitMatrix;->get(II)Z
    move-result v13
    if-eqz v13, :cond_5f
    and-int/lit8 v13, v12, 0x1
    if-ne v13, v0, :cond_59
    add-int/lit8 v12, v12, 0x1
    .line 33
    :cond_59
    aget v13, v2, v12
    add-int/2addr v13, v0
    aput v13, v2, v12
    goto :goto_9c
    :cond_5f
    and-int/lit8 v13, v12, 0x1
    if-nez v13, :cond_97
    if-ne v12, v10, :cond_8f
    .line 37
    invoke-static {v2}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;->foundPatternCross([I)Z
    move-result v12
    if-eqz v12, :cond_7d
    invoke-virtual {p0, v2, v8, v11, p1}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;->handlePossibleCenter([IIIZ)Z
    move-result v12
    if-eqz v12, :cond_7d
    aput v1, v2, v1
    aput v1, v2, v0
    aput v1, v2, v9
    aput v1, v2, v7
    aput v1, v2, v10
    move v12, v1
    goto :goto_9c
    .line 46
    :cond_7d
    aget v12, v2, v9
    aput v12, v2, v1
    .line 47
    aget v12, v2, v7
    aput v12, v2, v0
    .line 48
    aget v12, v2, v10
    aput v12, v2, v9
    aput v0, v2, v7
    aput v1, v2, v10
    move v12, v7
    goto :goto_9c
    :cond_8f
    add-int/lit8 v12, v12, 0x1
    .line 54
    aget v13, v2, v12
    add-int/2addr v13, v0
    aput v13, v2, v12
    goto :goto_9c
    .line 57
    :cond_97
    aget v13, v2, v12
    add-int/2addr v13, v0
    aput v13, v2, v12
    :goto_9c
    add-int/lit8 v11, v11, 0x1
    goto :goto_4b
    .line 62
    :cond_9f
    invoke-static {v2}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;->foundPatternCross([I)Z
    move-result v9
    if-eqz v9, :cond_a8
    .line 63
    invoke-virtual {p0, v2, v8, v5, p1}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternFinder;->handlePossibleCenter([IIIZ)Z
    :cond_a8
    add-int/2addr v8, v6
    goto :goto_3b
    .line 66
    :cond_aa
    invoke-direct {p0}, Lcom/dcloud/zxing2/multi/qrcode/detector/MultiFinderPatternFinder;->selectMutipleBestPatterns()[[Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;
    move-result-object p1
    .line 67
    new-instance v0, Ljava/util/ArrayList;
    invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V
    .line 68
    array-length v2, p1
    :goto_b4
    if-ge v1, v2, :cond_c6
    aget-object v3, p1, v1
    .line 69
    invoke-static {v3}, Lcom/dcloud/zxing2/ResultPoint;->orderBestPatterns([Lcom/dcloud/zxing2/ResultPoint;)V
    .line 70
    new-instance v4, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
    invoke-direct {v4, v3}, Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;-><init>([Lcom/dcloud/zxing2/qrcode/detector/FinderPattern;)V
    invoke-interface {v0, v4}, Ljava/util/List;->add(Ljava/lang/Object;)Z
    add-int/lit8 v1, v1, 0x1
    goto :goto_b4
    .line 73
    :cond_c6
    invoke-interface {v0}, Ljava/util/List;->isEmpty()Z
    move-result p1
    if-eqz p1, :cond_cf
    .line 74
    sget-object p1, Lcom/dcloud/zxing2/multi/qrcode/detector/MultiFinderPatternFinder;->EMPTY_RESULT_ARRAY:[Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
    return-object p1
    .line 76
    :cond_cf
    invoke-interface {v0}, Ljava/util/List;->size()I
    move-result p1
    new-array p1, p1, [Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
    invoke-interface {v0, p1}, Ljava/util/List;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
    move-result-object p1
    check-cast p1, [Lcom/dcloud/zxing2/qrcode/detector/FinderPatternInfo;
    return-object p1
.end method