Skip to content

Commit

Permalink
Add binary XML format to default image formats
Browse files Browse the repository at this point in the history
Reviewed By: oprisnik

Differential Revision: D64332670
  • Loading branch information
Abbondanzo authored and facebook-github-bot committed Oct 16, 2024
1 parent 6318780 commit 481302d
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ class DefaultImageFormatChecker : FormatChecker {
GIF_HEADER_LENGTH,
BMP_HEADER_LENGTH,
ICO_HEADER_LENGTH,
HEIF_HEADER_LENGTH)
HEIF_HEADER_LENGTH,
BINARY_XML_HEADER_LENGTH,
)
.maxOrNull())

/**
Expand Down Expand Up @@ -61,6 +63,9 @@ class DefaultImageFormatChecker : FormatChecker {
if (isHeifHeader(headerBytes, headerSize)) {
return DefaultImageFormats.HEIF
}
if (isBinaryXmlHeader(headerBytes, headerSize)) {
return DefaultImageFormats.BINARY_XML
}
return if (isDngHeader(headerBytes, headerSize)) {
DefaultImageFormats.DNG
} else {
Expand Down Expand Up @@ -277,5 +282,27 @@ class DefaultImageFormatChecker : FormatChecker {
headerSize >= DNG_HEADER_LENGTH &&
(ImageFormatCheckerUtils.startsWithPattern(imageHeaderBytes, DNG_HEADER_II) ||
ImageFormatCheckerUtils.startsWithPattern(imageHeaderBytes, DNG_HEADER_MM))

/**
* These are the first 4 bytes of a binary XML file. We can only support binary XML files and
* not raw XML files because Android explicitly disallows raw XML files when inflating
* drawables. Binary XML files are created at build time by Android's AAPT.
*
* @see
* https://developer.android.com/reference/android/view/LayoutInflater#inflate(org.xmlpull.v1.XmlPullParser,%20android.view.ViewGroup)
*/
private val BINARY_XML_HEADER: ByteArray =
byteArrayOf(
3.toByte(),
0.toByte(),
8.toByte(),
0.toByte(),
)
private const val BINARY_XML_HEADER_LENGTH: Int = 4

private fun isBinaryXmlHeader(headerBytes: ByteArray, headerSize: Int): Boolean {
return headerSize >= BINARY_XML_HEADER_LENGTH &&
ImageFormatCheckerUtils.startsWithPattern(headerBytes, BINARY_XML_HEADER)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ object DefaultImageFormats {
@JvmField val WEBP_ANIMATED: ImageFormat = ImageFormat("WEBP_ANIMATED", "webp")
@JvmField val HEIF: ImageFormat = ImageFormat("HEIF", "heif")
@JvmField val DNG: ImageFormat = ImageFormat("DNG", "dng")
@JvmField val BINARY_XML: ImageFormat = ImageFormat("BINARY_XML", "xml")

/**
* Check if the given image format is a WebP image format (static or animated).
Expand Down Expand Up @@ -67,5 +68,6 @@ object DefaultImageFormats {
WEBP_EXTENDED_WITH_ALPHA,
WEBP_ANIMATED,
HEIF,
BINARY_XML,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ public class DefaultImageDecoder implements ImageDecoder {
return decodeGif(encodedImage, length, qualityInfo, options);
} else if (imageFormat == DefaultImageFormats.WEBP_ANIMATED) {
return decodeAnimatedWebp(encodedImage, length, qualityInfo, options);
} else if (imageFormat == DefaultImageFormats.BINARY_XML) {
throw new DecodeException("unsupported image format", encodedImage);
} else if (imageFormat == ImageFormat.UNKNOWN) {
throw new DecodeException("unknown image format", encodedImage);
}
Expand Down

0 comments on commit 481302d

Please sign in to comment.