DefaultImageFormatChecker.smali
.class public Lcom/facebook/imageformat/DefaultImageFormatChecker;
.super Ljava/lang/Object;
.source "SourceFile"
# 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 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
.field private static final HEIF_HEADER_PREFIX:Ljava/lang/String; = "ftyp"
.field private static final HEIF_HEADER_SUFFIXES:[Ljava/lang/String;
.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 public final MAX_HEADER_LENGTH:I
# direct methods
.method public static constructor <clinit>()V
.registers 7
const/4 v0, 0x3
new-array v0, v0, [B
.line 1
fill-array-data v0, :array_68
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER:[B
.line 2
array-length v0, v0
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER_LENGTH:I
const/16 v0, 0x8
new-array v0, v0, [B
.line 3
fill-array-data v0, :array_6e
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER:[B
.line 4
array-length v0, v0
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER_LENGTH:I
const-string v0, "GIF87a"
.line 5
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_87A:[B
const-string v0, "GIF89a"
.line 6
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_89A:[B
const-string v0, "BM"
.line 7
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER:[B
.line 8
array-length v0, v0
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER_LENGTH:I
const/4 v0, 0x4
new-array v0, v0, [B
.line 9
fill-array-data v0, :array_76
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER:[B
.line 10
array-length v0, v0
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER_LENGTH:I
const-string v1, "heic"
const-string v2, "heix"
const-string v3, "hevc"
const-string v4, "hevx"
const-string v5, "mif1"
const-string v6, "msf1"
.line 11
filled-new-array/range {v1 .. v6}, [Ljava/lang/String;
move-result-object v0
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_SUFFIXES:[Ljava/lang/String;
const-string v1, "ftyp"
.line 12
invoke-static {v1}, Landroid/support/v4/media/c;->c(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const/4 v2, 0x0
.line 13
aget-object v0, v0, v2
invoke-virtual {v1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
.line 14
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
array-length v0, v0
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_LENGTH:I
return-void
nop
:array_68
.array-data 1
-0x1t
-0x28t
-0x1t
.end array-data
:array_6e
.array-data 1
-0x77t
0x50t
0x4et
0x47t
0xdt
0xat
0x1at
0xat
.end array-data
:array_76
.array-data 1
0x0t
0x0t
0x1t
0x0t
.end array-data
.end method
.method public constructor <init>()V
.registers 5
.line 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
const/16 v0, 0x8
new-array v0, v0, [I
const/4 v1, 0x0
const/16 v2, 0x15
aput v2, v0, v1
const/4 v1, 0x1
const/16 v2, 0x14
aput v2, v0, v1
.line 2
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER_LENGTH:I
const/4 v2, 0x2
aput v1, v0, v2
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER_LENGTH:I
const/4 v2, 0x3
aput v1, v0, v2
const/4 v1, 0x4
const/4 v2, 0x6
aput v2, v0, v1
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER_LENGTH:I
const/4 v3, 0x5
aput v1, v0, v3
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER_LENGTH:I
aput v1, v0, v2
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_LENGTH:I
const/4 v2, 0x7
aput v1, v0, v2
.line 3
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
return-void
.end method
.method private static getWebpFormat([BI)Lcom/facebook/imageformat/ImageFormat;
.registers 4
const/4 v0, 0x0
.line 1
invoke-static {p0, v0, p1}, Lcom/facebook/common/webp/WebpSupportStatus;->isWebpHeader([BII)Z
move-result v1
invoke-static {v1}, Lcom/facebook/common/internal/Preconditions;->checkArgument(Z)V
.line 2
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isSimpleWebpHeader([BI)Z
move-result v1
if-eqz v1, :cond_11
.line 3
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_SIMPLE:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 4
:cond_11
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isLosslessWebpHeader([BI)Z
move-result v1
if-eqz v1, :cond_1a
.line 5
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_LOSSLESS:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 6
:cond_1a
invoke-static {p0, v0, p1}, Lcom/facebook/common/webp/WebpSupportStatus;->isExtendedWebpHeader([BII)Z
move-result p1
if-eqz p1, :cond_35
.line 7
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isAnimatedWebpHeader([BI)Z
move-result p1
if-eqz p1, :cond_29
.line 8
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_ANIMATED:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 9
:cond_29
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isExtendedWebpHeaderWithAlpha([BI)Z
move-result p0
if-eqz p0, :cond_32
.line 10
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_EXTENDED_WITH_ALPHA:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 11
:cond_32
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_EXTENDED:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 12
:cond_35
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
.line 1
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 2
:cond_7
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
return p0
.end method
.method private static isGifHeader([BI)Z
.registers 4
const/4 v0, 0x0
const/4 v1, 0x6
if-ge p1, v1, :cond_5
return v0
.line 1
: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 2
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 9
.line 1
sget v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_LENGTH:I
const/4 v1, 0x0
if-ge p1, v0, :cond_6
return v1
:cond_6
const/4 p1, 0x3
.line 2
aget-byte p1, p0, p1
const/16 v0, 0x8
if-ge p1, v0, :cond_e
return v1
.line 3
:cond_e
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_SUFFIXES:[Ljava/lang/String;
array-length v0, p1
const/4 v2, 0x0
:goto_12
if-ge v2, v0, :cond_3a
aget-object v3, p1, v2
.line 4
array-length v4, p0
new-instance v5, Ljava/lang/StringBuilder;
invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V
const-string v6, "ftyp"
invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v5, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
.line 5
invoke-static {v3}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v3
sget v5, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_LENGTH:I
.line 6
invoke-static {p0, v4, v3, v5}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->indexOfPattern([BI[BI)I
move-result v3
const/4 v4, -0x1
if-le v3, v4, :cond_37
const/4 p0, 0x1
return p0
:cond_37
add-int/lit8 v2, v2, 0x1
goto :goto_12
:cond_3a
return v1
.end method
.method private static isIcoHeader([BI)Z
.registers 4
.line 1
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 2
: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
.line 1
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER:[B
array-length v1, v0
if-lt p1, v1, :cond_d
.line 2
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
.line 1
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER:[B
array-length v1, v0
if-lt p1, v1, :cond_d
.line 2
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 4
.line 1
invoke-static {p1}, Lcom/facebook/common/internal/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
const/4 v0, 0x0
.line 2
invoke-static {p1, v0, p2}, Lcom/facebook/common/webp/WebpSupportStatus;->isWebpHeader([BII)Z
move-result v0
if-eqz v0, :cond_f
.line 3
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->getWebpFormat([BI)Lcom/facebook/imageformat/ImageFormat;
move-result-object p1
return-object p1
.line 4
:cond_f
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isJpegHeader([BI)Z
move-result v0
if-eqz v0, :cond_18
.line 5
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->JPEG:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 6
:cond_18
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isPngHeader([BI)Z
move-result v0
if-eqz v0, :cond_21
.line 7
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->PNG:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 8
:cond_21
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isGifHeader([BI)Z
move-result v0
if-eqz v0, :cond_2a
.line 9
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->GIF:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 10
:cond_2a
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isBmpHeader([BI)Z
move-result v0
if-eqz v0, :cond_33
.line 11
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->BMP:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 12
:cond_33
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isIcoHeader([BI)Z
move-result v0
if-eqz v0, :cond_3c
.line 13
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->ICO:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 14
:cond_3c
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isHeifHeader([BI)Z
move-result p1
if-eqz p1, :cond_45
.line 15
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->HEIF:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 16
:cond_45
sget-object p1, Lcom/facebook/imageformat/ImageFormat;->UNKNOWN:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.end method
.method public getHeaderSize()I
.registers 2
iget v0, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->MAX_HEADER_LENGTH:I
return v0
.end method