Copy NCLX color profile. (#98)
* Copy nclx to a parent image.
* Check the profile format
* Use pointer to avoid copy
* Check that target image has no profile.
diff --git a/src/read.c b/src/read.c
index 1e1aa5e..70a6373 100644
--- a/src/read.c
+++ b/src/read.c
@@ -550,6 +550,9 @@
unsigned int tileHeight = firstTile->image->height;
unsigned int tileDepth = firstTile->image->depth;
avifPixelFormat tileFormat = firstTile->image->yuvFormat;
+
+ avifProfileFormat tileProfile = firstTile->image->profileFormat;
+ avifNclxColorProfile * tileNCLX = &firstTile->image->nclx;
avifRange tileRange = firstTile->image->yuvRange;
avifBool tileUVPresent = (firstTile->image->yuvPlanes[AVIF_CHAN_U] && firstTile->image->yuvPlanes[AVIF_CHAN_V]) ? AVIF_TRUE
: AVIF_FALSE;
@@ -558,7 +561,11 @@
avifTile * tile = &data->tiles.tile[firstTileIndex + i];
avifBool uvPresent = (tile->image->yuvPlanes[AVIF_CHAN_U] && tile->image->yuvPlanes[AVIF_CHAN_V]) ? AVIF_TRUE : AVIF_FALSE;
if ((tile->image->width != tileWidth) || (tile->image->height != tileHeight) || (tile->image->depth != tileDepth) ||
- (tile->image->yuvFormat != tileFormat) || (tile->image->yuvRange != tileRange) || (uvPresent != tileUVPresent)) {
+ (tile->image->yuvFormat != tileFormat) || (tile->image->yuvRange != tileRange) || (uvPresent != tileUVPresent) ||
+ ((tileProfile == AVIF_PROFILE_FORMAT_NCLX) &&
+ ((tile->image->profileFormat != tileProfile) ||
+ (tile->image->nclx.colourPrimaries != tileNCLX->colourPrimaries) || (tile->image->nclx.transferCharacteristics != tileNCLX->transferCharacteristics) ||
+ (tile->image->nclx.matrixCoefficients != tileNCLX->matrixCoefficients) || (tile->image->nclx.fullRangeFlag != tileNCLX->fullRangeFlag)))) {
return AVIF_FALSE;
}
}
@@ -576,6 +583,9 @@
dstImage->depth = tileDepth;
dstImage->yuvFormat = tileFormat;
dstImage->yuvRange = tileRange;
+ if(dstImage->profileFormat == AVIF_PROFILE_FORMAT_NONE && tileProfile == AVIF_PROFILE_FORMAT_NCLX) {
+ avifImageSetProfileNCLX(dstImage, tileNCLX);
+ }
}
avifImageAllocatePlanes(dstImage, alpha ? AVIF_PLANES_A : AVIF_PLANES_YUV);
@@ -2126,6 +2136,10 @@
decoder->image->width = srcColor->width;
decoder->image->height = srcColor->height;
decoder->image->depth = srcColor->depth;
+
+ if(decoder->image->profileFormat == AVIF_PROFILE_FORMAT_NONE && srcColor->profileFormat == AVIF_PROFILE_FORMAT_NCLX) {
+ avifImageSetProfileNCLX(decoder->image, &srcColor->nclx);
+ }
}
avifImageStealPlanes(decoder->image, srcColor, AVIF_PLANES_YUV);