DefaultImageFormatChecker.smali
.class public Lcom/facebook/imageformat/DefaultImageFormatChecker;
.super Ljava/lang/Object;
.source "DefaultImageFormatChecker.java"
# interfaces
.implements Lcom/facebook/imageformat/ImageFormat$FormatChecker;
# static fields
.field private static final BMP_HEADER:[B
.field private static final BMP_HEADER_LENGTH:I
.field private static final DNG_HEADER_II:[B
.field private static final DNG_HEADER_LENGTH:I
.field private static final DNG_HEADER_MM:[B
.field private static final EXTENDED_WEBP_HEADER_LENGTH:I = 0x15
.field private static final GIF_HEADER_87A:[B
.field private static final GIF_HEADER_89A:[B
.field private static final GIF_HEADER_LENGTH:I = 0x6
.field private static final HEIF_HEADER_LENGTH:I = 0xc
.field private static final HEIF_HEADER_PREFIX:[B
.field private static final HEIF_HEADER_SUFFIXES:[[B
.field private static final ICO_HEADER:[B
.field private static final ICO_HEADER_LENGTH:I
.field private static final JPEG_HEADER:[B
.field private static final JPEG_HEADER_LENGTH:I
.field private static final PNG_HEADER:[B
.field private static final PNG_HEADER_LENGTH:I
.field private static final SIMPLE_WEBP_HEADER_LENGTH:I = 0x14
# instance fields
.field final MAX_HEADER_LENGTH:I
.field private mUseNewOrder:Z
# direct methods
.method static constructor <clinit>()V
.registers 5
const/4 v0, 0x3
new-array v1, v0, [B
.line 141
fill-array-data v1, :array_90
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER:[B
.line 143
array-length v1, v1
sput v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER_LENGTH:I
const/16 v1, 0x8
new-array v1, v1, [B
.line 161
fill-array-data v1, :array_96
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER:[B
.line 164
array-length v1, v1
sput v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER_LENGTH:I
const-string v1, "GIF87a"
.line 184
invoke-static {v1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v1
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_87A:[B
const-string v1, "GIF89a"
.line 186
invoke-static {v1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v1
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_89A:[B
const-string v1, "BM"
.line 207
invoke-static {v1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v1
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER:[B
.line 209
array-length v1, v1
sput v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER_LENGTH:I
const/4 v1, 0x4
new-array v2, v1, [B
.line 228
fill-array-data v2, :array_9e
sput-object v2, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER:[B
.line 231
array-length v2, v2
sput v2, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER_LENGTH:I
const-string v2, "ftyp"
.line 254
invoke-static {v2}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v2
sput-object v2, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_PREFIX:[B
const/4 v2, 0x6
new-array v2, v2, [[B
const-string v3, "heic"
.line 257
invoke-static {v3}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v3
const/4 v4, 0x0
aput-object v3, v2, v4
const-string v3, "heix"
.line 258
invoke-static {v3}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v3
const/4 v4, 0x1
aput-object v3, v2, v4
const-string v3, "hevc"
.line 259
invoke-static {v3}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v3
const/4 v4, 0x2
aput-object v3, v2, v4
const-string v3, "hevx"
.line 260
invoke-static {v3}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v3
aput-object v3, v2, v0
const-string v0, "mif1"
.line 261
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
aput-object v0, v2, v1
const-string v0, "msf1"
.line 262
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
const/4 v3, 0x5
aput-object v0, v2, v3
sput-object v2, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_SUFFIXES:[[B
new-array v0, v1, [B
.line 303
fill-array-data v0, :array_a4
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->DNG_HEADER_II:[B
new-array v1, v1, [B
.line 306
fill-array-data v1, :array_aa
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->DNG_HEADER_MM:[B
.line 308
array-length v0, v0
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->DNG_HEADER_LENGTH:I
return-void
:array_90
.array-data 1
-0x1t
-0x28t
-0x1t
.end array-data
:array_96
.array-data 1
-0x77t
0x50t
0x4et
0x47t
0xdt
0xat
0x1at
0xat
.end array-data
:array_9e
.array-data 1
0x0t
0x0t
0x1t
0x0t
.end array-data
:array_a4
.array-data 1
0x49t
0x49t
0x2at
0x0t
.end array-data
:array_aa
.array-data 1
0x4dt
0x4dt
0x0t
0x2at
.end array-data
.end method
.method public constructor <init>()V
.registers 6
.line 19
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
const/16 v0, 0x8
new-array v0, v0, [I
const/16 v1, 0x15
const/4 v2, 0x0
aput v1, v0, v2
const/4 v1, 0x1
const/16 v3, 0x14
aput v3, v0, v1
.line 28
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER_LENGTH:I
const/4 v3, 0x2
aput v1, v0, v3
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER_LENGTH:I
const/4 v3, 0x3
aput v1, v0, v3
const/4 v1, 0x4
const/4 v3, 0x6
aput v3, v0, v1
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER_LENGTH:I
const/4 v4, 0x5
aput v1, v0, v4
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER_LENGTH:I
aput v1, v0, v3
const/4 v1, 0x7
const/16 v3, 0xc
aput v3, v0, v1
.line 29
invoke-static {v0}, Lcom/facebook/common/internal/Ints;->max([I)I
move-result v0
iput v0, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->MAX_HEADER_LENGTH:I
.line 39
iput-boolean v2, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->mUseNewOrder:Z
return-void
.end method
.method private static getWebpFormat([BI)Lcom/facebook/imageformat/ImageFormat;
.registers 4
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x10,
0x10
}
names = {
"imageHeaderBytes",
"headerSize"
}
.end annotation
const/4 v0, 0x0
.line 115
invoke-static {p0, v0, p1}, Lcom/facebook/common/webp/WebpSupportStatus;->isWebpHeader([BII)Z
move-result v1
invoke-static {v1}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
move-result-object v1
invoke-static {v1}, Lcom/facebook/common/internal/Preconditions;->checkArgument(Ljava/lang/Boolean;)V
.line 116
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isSimpleWebpHeader([BI)Z
move-result v1
if-eqz v1, :cond_15
.line 117
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_SIMPLE:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 120
:cond_15
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isLosslessWebpHeader([BI)Z
move-result v1
if-eqz v1, :cond_1e
.line 121
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_LOSSLESS:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 124
:cond_1e
invoke-static {p0, v0, p1}, Lcom/facebook/common/webp/WebpSupportStatus;->isExtendedWebpHeader([BII)Z
move-result p1
if-eqz p1, :cond_39
.line 125
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isAnimatedWebpHeader([BI)Z
move-result p1
if-eqz p1, :cond_2d
.line 126
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_ANIMATED:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 128
:cond_2d
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isExtendedWebpHeaderWithAlpha([BI)Z
move-result p0
if-eqz p0, :cond_36
.line 129
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_EXTENDED_WITH_ALPHA:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 131
:cond_36
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_EXTENDED:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 134
:cond_39
sget-object p0, Lcom/facebook/imageformat/ImageFormat;->UNKNOWN:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.end method
.method private static isBmpHeader([BI)Z
.registers 4
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x10,
0x10
}
names = {
"imageHeaderBytes",
"headerSize"
}
.end annotation
.line 221
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER:[B
array-length v1, v0
if-ge p1, v1, :cond_7
const/4 p0, 0x0
return p0
.line 224
:cond_7
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
return p0
.end method
.method private static isDngHeader([BI)Z
.registers 3
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x10,
0x10
}
names = {
"imageHeaderBytes",
"headerSize"
}
.end annotation
.line 322
sget v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->DNG_HEADER_LENGTH:I
if-lt p1, v0, :cond_16
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->DNG_HEADER_II:[B
.line 323
invoke-static {p0, p1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p1
if-nez p1, :cond_14
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->DNG_HEADER_MM:[B
.line 324
invoke-static {p0, p1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
if-eqz p0, :cond_16
:cond_14
const/4 p0, 0x1
goto :goto_17
:cond_16
const/4 p0, 0x0
:goto_17
return p0
.end method
.method private static isGifHeader([BI)Z
.registers 4
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x10,
0x10
}
names = {
"imageHeaderBytes",
"headerSize"
}
.end annotation
const/4 v0, 0x0
const/4 v1, 0x6
if-ge p1, v1, :cond_5
return v0
.line 202
:cond_5
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_87A:[B
invoke-static {p0, p1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p1
if-nez p1, :cond_15
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_89A:[B
.line 203
invoke-static {p0, p1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
if-eqz p0, :cond_16
:cond_15
const/4 v0, 0x1
:cond_16
return v0
.end method
.method private static isHeifHeader([BI)Z
.registers 7
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x10,
0x10
}
names = {
"imageHeaderBytes",
"headerSize"
}
.end annotation
const/4 v0, 0x0
const/16 v1, 0xc
if-ge p1, v1, :cond_6
return v0
:cond_6
const/4 p1, 0x3
.line 280
aget-byte p1, p0, p1
const/16 v1, 0x8
if-ge p1, v1, :cond_e
return v0
.line 285
:cond_e
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_PREFIX:[B
const/4 v2, 0x4
invoke-static {p0, p1, v2}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->hasPatternAt([B[BI)Z
move-result p1
if-nez p1, :cond_18
return v0
.line 289
:cond_18
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_SUFFIXES:[[B
array-length v2, p1
move v3, v0
:goto_1c
if-ge v3, v2, :cond_2b
aget-object v4, p1, v3
.line 290
invoke-static {p0, v4, v1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->hasPatternAt([B[BI)Z
move-result v4
if-eqz v4, :cond_28
const/4 p0, 0x1
return p0
:cond_28
add-int/lit8 v3, v3, 0x1
goto :goto_1c
:cond_2b
return v0
.end method
.method private static isIcoHeader([BI)Z
.registers 4
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x10,
0x10
}
names = {
"imageHeaderBytes",
"headerSize"
}
.end annotation
.line 243
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER:[B
array-length v1, v0
if-ge p1, v1, :cond_7
const/4 p0, 0x0
return p0
.line 246
:cond_7
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
return p0
.end method
.method private static isJpegHeader([BI)Z
.registers 4
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x10,
0x10
}
names = {
"imageHeaderBytes",
"headerSize"
}
.end annotation
.line 156
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER:[B
array-length v1, v0
if-lt p1, v1, :cond_d
.line 157
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
if-eqz p0, :cond_d
const/4 p0, 0x1
goto :goto_e
:cond_d
const/4 p0, 0x0
:goto_e
return p0
.end method
.method private static isPngHeader([BI)Z
.registers 4
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x10,
0x10
}
names = {
"imageHeaderBytes",
"headerSize"
}
.end annotation
.line 177
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER:[B
array-length v1, v0
if-lt p1, v1, :cond_d
.line 178
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
if-eqz p0, :cond_d
const/4 p0, 0x1
goto :goto_e
:cond_d
const/4 p0, 0x0
:goto_e
return p0
.end method
# virtual methods
.method public final determineFormat([BI)Lcom/facebook/imageformat/ImageFormat;
.registers 5
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x0,
0x0
}
names = {
"headerBytes",
"headerSize"
}
.end annotation
.annotation runtime Ljavax/annotation/Nullable;
.end annotation
.line 61
invoke-static {p1}, Lcom/facebook/common/internal/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
.line 63
iget-boolean v0, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->mUseNewOrder:Z
const/4 v1, 0x0
if-nez v0, :cond_13
invoke-static {p1, v1, p2}, Lcom/facebook/common/webp/WebpSupportStatus;->isWebpHeader([BII)Z
move-result v0
if-eqz v0, :cond_13
.line 64
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->getWebpFormat([BI)Lcom/facebook/imageformat/ImageFormat;
move-result-object p1
return-object p1
.line 67
:cond_13
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isJpegHeader([BI)Z
move-result v0
if-eqz v0, :cond_1c
.line 68
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->JPEG:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 71
:cond_1c
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isPngHeader([BI)Z
move-result v0
if-eqz v0, :cond_25
.line 72
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->PNG:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 75
:cond_25
iget-boolean v0, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->mUseNewOrder:Z
if-eqz v0, :cond_34
invoke-static {p1, v1, p2}, Lcom/facebook/common/webp/WebpSupportStatus;->isWebpHeader([BII)Z
move-result v0
if-eqz v0, :cond_34
.line 76
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->getWebpFormat([BI)Lcom/facebook/imageformat/ImageFormat;
move-result-object p1
return-object p1
.line 79
:cond_34
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isGifHeader([BI)Z
move-result v0
if-eqz v0, :cond_3d
.line 80
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->GIF:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 83
:cond_3d
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isBmpHeader([BI)Z
move-result v0
if-eqz v0, :cond_46
.line 84
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->BMP:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 87
:cond_46
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isIcoHeader([BI)Z
move-result v0
if-eqz v0, :cond_4f
.line 88
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->ICO:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 91
:cond_4f
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isHeifHeader([BI)Z
move-result v0
if-eqz v0, :cond_58
.line 92
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->HEIF:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 95
:cond_58
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isDngHeader([BI)Z
move-result p1
if-eqz p1, :cond_61
.line 96
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->DNG:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 99
:cond_61
sget-object p1, Lcom/facebook/imageformat/ImageFormat;->UNKNOWN:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.end method
.method public getHeaderSize()I
.registers 2
.line 47
iget v0, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->MAX_HEADER_LENGTH:I
return v0
.end method
.method public setUseNewOrder(Z)V
.registers 2
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x0
}
names = {
"useNewOrder"
}
.end annotation
.line 42
iput-boolean p1, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->mUseNewOrder:Z
return-void
.end method