MultiFinderPatternFinder.smali
.class final Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;
.super Lcom/google/zxing/qrcode/detector/FinderPatternFinder;
.source "MultiFinderPatternFinder.java"
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/google/zxing/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/google/zxing/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/google/zxing/qrcode/detector/FinderPatternInfo;
.line 51
sput-object v0, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->EMPTY_RESULT_ARRAY:[Lcom/google/zxing/qrcode/detector/FinderPatternInfo;
return-void
.end method
.method constructor <init>(Lcom/google/zxing/common/BitMatrix;)V
.registers 2
.line 93
invoke-direct {p0, p1}, Lcom/google/zxing/qrcode/detector/FinderPatternFinder;-><init>(Lcom/google/zxing/common/BitMatrix;)V
return-void
.end method
.method constructor <init>(Lcom/google/zxing/common/BitMatrix;Lcom/google/zxing/ResultPointCallback;)V
.registers 3
.line 97
invoke-direct {p0, p1, p2}, Lcom/google/zxing/qrcode/detector/FinderPatternFinder;-><init>(Lcom/google/zxing/common/BitMatrix;Lcom/google/zxing/ResultPointCallback;)V
return-void
.end method
.method private selectMutipleBestPatterns()[[Lcom/google/zxing/qrcode/detector/FinderPattern;
.registers 20
.annotation system Ldalvik/annotation/Throws;
value = {
Lcom/google/zxing/NotFoundException;
}
.end annotation
.line 107
invoke-virtual/range {p0 .. p0}, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->getPossibleCenters()Ljava/util/List;
move-result-object v0
.line 108
invoke-interface {v0}, Ljava/util/List;->size()I
move-result v1
const/4 v2, 0x3
if-lt v1, v2, :cond_177
const/4 v3, 0x2
const/4 v4, 0x0
const/4 v5, 0x1
if-ne v1, v2, :cond_2f
new-array v1, v5, [[Lcom/google/zxing/qrcode/detector/FinderPattern;
new-array v2, v2, [Lcom/google/zxing/qrcode/detector/FinderPattern;
.line 121
invoke-interface {v0, v4}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v6
check-cast v6, Lcom/google/zxing/qrcode/detector/FinderPattern;
aput-object v6, v2, v4
.line 122
invoke-interface {v0, v5}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v6
check-cast v6, Lcom/google/zxing/qrcode/detector/FinderPattern;
aput-object v6, v2, v5
.line 123
invoke-interface {v0, v3}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v0
check-cast v0, Lcom/google/zxing/qrcode/detector/FinderPattern;
aput-object v0, v2, v3
aput-object v2, v1, v4
return-object v1
.line 129
:cond_2f
new-instance v6, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder$ModuleSizeComparator;
const/4 v7, 0x0
invoke-direct {v6, v7}, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder$ModuleSizeComparator;-><init>(Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder$1;)V
invoke-static {v0, v6}, Ljava/util/Collections;->sort(Ljava/util/List;Ljava/util/Comparator;)V
.line 146
new-instance v6, Ljava/util/ArrayList;
invoke-direct {v6}, Ljava/util/ArrayList;-><init>()V
const/4 v7, 0x0
:goto_3e
add-int/lit8 v8, v1, -0x2
if-ge v7, v8, :cond_15f
.line 149
invoke-interface {v0, v7}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v8
check-cast v8, Lcom/google/zxing/qrcode/detector/FinderPattern;
if-eqz v8, :cond_156
add-int/lit8 v9, v7, 0x1
:goto_4c
add-int/lit8 v10, v1, -0x1
if-ge v9, v10, :cond_156
.line 155
invoke-interface {v0, v9}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v10
check-cast v10, Lcom/google/zxing/qrcode/detector/FinderPattern;
if-eqz v10, :cond_14d
.line 161
invoke-virtual {v8}, Lcom/google/zxing/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
move-result v11
invoke-virtual {v10}, Lcom/google/zxing/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
move-result v12
sub-float/2addr v11, v12
.line 162
invoke-virtual {v8}, Lcom/google/zxing/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
move-result v12
invoke-virtual {v10}, Lcom/google/zxing/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 163
invoke-virtual {v8}, Lcom/google/zxing/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
move-result v12
invoke-virtual {v10}, Lcom/google/zxing/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 v13, 0x3d4ccccd # 0.05f
const/high16 v14, 0x3f000000 # 0.5f
cmpl-float v12, v12, v14
if-lez v12, :cond_88
cmpl-float v11, v11, v13
if-gez v11, :cond_156
:cond_88
add-int/lit8 v11, v9, 0x1
:goto_8a
if-ge v11, v1, :cond_14d
.line 171
invoke-interface {v0, v11}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v12
check-cast v12, Lcom/google/zxing/qrcode/detector/FinderPattern;
if-eqz v12, :cond_13f
.line 177
invoke-virtual {v10}, Lcom/google/zxing/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
move-result v15
invoke-virtual {v12}, Lcom/google/zxing/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
move-result v16
sub-float v15, v15, v16
.line 178
invoke-virtual {v10}, Lcom/google/zxing/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
move-result v3
invoke-virtual {v12}, Lcom/google/zxing/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 179
invoke-virtual {v10}, Lcom/google/zxing/qrcode/detector/FinderPattern;->getEstimatedModuleSize()F
move-result v3
invoke-virtual {v12}, Lcom/google/zxing/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, v14
if-lez v3, :cond_c0
cmpl-float v3, v15, v13
if-gez v3, :cond_14d
:cond_c0
new-array v3, v2, [Lcom/google/zxing/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 187
invoke-static {v3}, Lcom/google/zxing/ResultPoint;->orderBestPatterns([Lcom/google/zxing/ResultPoint;)V
.line 190
new-instance v12, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;
invoke-direct {v12, v3}, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;-><init>([Lcom/google/zxing/qrcode/detector/FinderPattern;)V
.line 191
invoke-virtual {v12}, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;->getTopLeft()Lcom/google/zxing/qrcode/detector/FinderPattern;
move-result-object v2
invoke-virtual {v12}, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;->getBottomLeft()Lcom/google/zxing/qrcode/detector/FinderPattern;
move-result-object v4
invoke-static {v2, v4}, Lcom/google/zxing/ResultPoint;->distance(Lcom/google/zxing/ResultPoint;Lcom/google/zxing/ResultPoint;)F
move-result v2
.line 192
invoke-virtual {v12}, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;->getTopRight()Lcom/google/zxing/qrcode/detector/FinderPattern;
move-result-object v4
invoke-virtual {v12}, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;->getBottomLeft()Lcom/google/zxing/qrcode/detector/FinderPattern;
move-result-object v5
invoke-static {v4, v5}, Lcom/google/zxing/ResultPoint;->distance(Lcom/google/zxing/ResultPoint;Lcom/google/zxing/ResultPoint;)F
move-result v4
.line 193
invoke-virtual {v12}, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;->getTopLeft()Lcom/google/zxing/qrcode/detector/FinderPattern;
move-result-object v5
invoke-virtual {v12}, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;->getTopRight()Lcom/google/zxing/qrcode/detector/FinderPattern;
move-result-object v12
invoke-static {v5, v12}, Lcom/google/zxing/ResultPoint;->distance(Lcom/google/zxing/ResultPoint;Lcom/google/zxing/ResultPoint;)F
move-result v5
add-float v12, v2, v5
.line 196
invoke-virtual {v8}, Lcom/google/zxing/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_140
const/high16 v17, 0x41100000 # 9.0f
cmpg-float v12, v12, v17
if-ltz v12, :cond_140
sub-float v12, v2, v5
.line 203
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-gez v12, :cond_140
mul-float v2, v2, v2
mul-float v5, v5, v5
add-float/2addr v2, v5
float-to-double v13, v2
.line 209
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 211
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-gez v2, :cond_140
.line 218
invoke-interface {v6, v3}, Ljava/util/List;->add(Ljava/lang/Object;)Z
goto :goto_140
:cond_13f
const/4 v15, 0x2
:cond_140
:goto_140
add-int/lit8 v11, v11, 0x1
const/4 v2, 0x3
const/4 v3, 0x2
const/4 v4, 0x0
const/4 v5, 0x1
const v13, 0x3d4ccccd # 0.05f
const/high16 v14, 0x3f000000 # 0.5f
goto/16 :goto_8a
:cond_14d
const/4 v15, 0x2
add-int/lit8 v9, v9, 0x1
const/4 v2, 0x3
const/4 v3, 0x2
const/4 v4, 0x0
const/4 v5, 0x1
goto/16 :goto_4c
:cond_156
const/4 v15, 0x2
add-int/lit8 v7, v7, 0x1
const/4 v2, 0x3
const/4 v3, 0x2
const/4 v4, 0x0
const/4 v5, 0x1
goto/16 :goto_3e
.line 223
:cond_15f
invoke-interface {v6}, Ljava/util/List;->isEmpty()Z
move-result v0
if-nez v0, :cond_172
.line 224
invoke-interface {v6}, Ljava/util/List;->size()I
move-result v0
new-array v0, v0, [[Lcom/google/zxing/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/google/zxing/qrcode/detector/FinderPattern;
return-object v0
.line 228
:cond_172
invoke-static {}, Lcom/google/zxing/NotFoundException;->getNotFoundInstance()Lcom/google/zxing/NotFoundException;
move-result-object v0
throw v0
.line 112
:cond_177
invoke-static {}, Lcom/google/zxing/NotFoundException;->getNotFoundInstance()Lcom/google/zxing/NotFoundException;
move-result-object v0
throw v0
.end method
# virtual methods
.method public findMulti(Ljava/util/Map;)[Lcom/google/zxing/qrcode/detector/FinderPatternInfo;
.registers 16
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/util/Map<",
"Lcom/google/zxing/DecodeHintType;",
"*>;)[",
"Lcom/google/zxing/qrcode/detector/FinderPatternInfo;"
}
.end annotation
.annotation system Ldalvik/annotation/Throws;
value = {
Lcom/google/zxing/NotFoundException;
}
.end annotation
const/4 v0, 0x1
const/4 v1, 0x0
if-eqz p1, :cond_e
.line 232
sget-object v2, Lcom/google/zxing/DecodeHintType;->TRY_HARDER:Lcom/google/zxing/DecodeHintType;
invoke-interface {p1, v2}, Ljava/util/Map;->containsKey(Ljava/lang/Object;)Z
move-result v2
if-eqz v2, :cond_e
const/4 v2, 0x1
goto :goto_f
:cond_e
const/4 v2, 0x0
:goto_f
if-eqz p1, :cond_1b
.line 233
sget-object v3, Lcom/google/zxing/DecodeHintType;->PURE_BARCODE:Lcom/google/zxing/DecodeHintType;
invoke-interface {p1, v3}, Ljava/util/Map;->containsKey(Ljava/lang/Object;)Z
move-result p1
if-eqz p1, :cond_1b
const/4 p1, 0x1
goto :goto_1c
:cond_1b
const/4 p1, 0x0
.line 234
:goto_1c
invoke-virtual {p0}, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->getImage()Lcom/google/zxing/common/BitMatrix;
move-result-object v3
.line 235
invoke-virtual {v3}, Lcom/google/zxing/common/BitMatrix;->getHeight()I
move-result v4
.line 236
invoke-virtual {v3}, Lcom/google/zxing/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 v6, v6, v7
float-to-int v6, v6
const/4 v7, 0x3
if-lt v6, v7, :cond_36
if-eqz v2, :cond_37
:cond_36
const/4 v6, 0x3
:cond_37
const/4 v2, 0x5
new-array v2, v2, [I
add-int/lit8 v8, v6, -0x1
:goto_3c
if-ge v8, v4, :cond_ab
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
const/4 v11, 0x0
const/4 v12, 0x0
:goto_4c
if-ge v11, v5, :cond_a0
.line 259
invoke-virtual {v3, v11, v8}, Lcom/google/zxing/common/BitMatrix;->get(II)Z
move-result v13
if-eqz v13, :cond_60
and-int/lit8 v13, v12, 0x1
if-ne v13, v0, :cond_5a
add-int/lit8 v12, v12, 0x1
.line 264
:cond_5a
aget v13, v2, v12
add-int/2addr v13, v0
aput v13, v2, v12
goto :goto_9d
:cond_60
and-int/lit8 v13, v12, 0x1
if-nez v13, :cond_98
if-ne v12, v10, :cond_90
.line 268
invoke-static {v2}, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->foundPatternCross([I)Z
move-result v12
if-eqz v12, :cond_7e
invoke-virtual {p0, v2, v8, v11, p1}, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->handlePossibleCenter([IIIZ)Z
move-result v12
if-eqz v12, :cond_7e
aput v1, v2, v1
aput v1, v2, v0
aput v1, v2, v9
aput v1, v2, v7
aput v1, v2, v10
const/4 v12, 0x0
goto :goto_9d
.line 277
:cond_7e
aget v12, v2, v9
aput v12, v2, v1
.line 278
aget v12, v2, v7
aput v12, v2, v0
.line 279
aget v12, v2, v10
aput v12, v2, v9
aput v0, v2, v7
aput v1, v2, v10
const/4 v12, 0x3
goto :goto_9d
:cond_90
add-int/lit8 v12, v12, 0x1
.line 285
aget v13, v2, v12
add-int/2addr v13, v0
aput v13, v2, v12
goto :goto_9d
.line 288
:cond_98
aget v13, v2, v12
add-int/2addr v13, v0
aput v13, v2, v12
:goto_9d
add-int/lit8 v11, v11, 0x1
goto :goto_4c
.line 293
:cond_a0
invoke-static {v2}, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->foundPatternCross([I)Z
move-result v9
if-eqz v9, :cond_a9
.line 294
invoke-virtual {p0, v2, v8, v5, p1}, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->handlePossibleCenter([IIIZ)Z
:cond_a9
add-int/2addr v8, v6
goto :goto_3c
.line 297
:cond_ab
invoke-direct {p0}, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->selectMutipleBestPatterns()[[Lcom/google/zxing/qrcode/detector/FinderPattern;
move-result-object p1
.line 298
new-instance v0, Ljava/util/ArrayList;
invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V
.line 299
array-length v2, p1
:goto_b5
if-ge v1, v2, :cond_c7
aget-object v3, p1, v1
.line 300
invoke-static {v3}, Lcom/google/zxing/ResultPoint;->orderBestPatterns([Lcom/google/zxing/ResultPoint;)V
.line 301
new-instance v4, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;
invoke-direct {v4, v3}, Lcom/google/zxing/qrcode/detector/FinderPatternInfo;-><init>([Lcom/google/zxing/qrcode/detector/FinderPattern;)V
invoke-interface {v0, v4}, Ljava/util/List;->add(Ljava/lang/Object;)Z
add-int/lit8 v1, v1, 0x1
goto :goto_b5
.line 304
:cond_c7
invoke-interface {v0}, Ljava/util/List;->isEmpty()Z
move-result p1
if-eqz p1, :cond_d0
.line 305
sget-object p1, Lcom/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder;->EMPTY_RESULT_ARRAY:[Lcom/google/zxing/qrcode/detector/FinderPatternInfo;
return-object p1
.line 307
:cond_d0
invoke-interface {v0}, Ljava/util/List;->size()I
move-result p1
new-array p1, p1, [Lcom/google/zxing/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/google/zxing/qrcode/detector/FinderPatternInfo;
return-object p1
.end method