Range (limited/full) cleanup and refactor

* Having two enums that meant the same thing but had slightly different values was awful
* No need to lose type safety in avifNclxColorProfile for read convenience
* This is a breaking change, but hopefully easy for maintainers to adjust to
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 08d4a83..b05b7e9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,9 @@
 ### Added
 - Added simple `avifdump` tool for aiding in AVIF debugging
 
+### Changed
+- avifRange cleanup/refactor
+
 ## [0.6.4] - 2020-04-14
 ### Added
 - Added `avifDecoderNthImageTiming()` for querying frame timing without needing to decode the frame
diff --git a/apps/avifenc.c b/apps/avifenc.c
index 2ed8cd4..c9561fd 100644
--- a/apps/avifenc.c
+++ b/apps/avifenc.c
@@ -31,7 +31,7 @@
     printf("                                        P = enum avifNclxColourPrimaries\n");
     printf("                                        T = enum avifNclxTransferCharacteristics\n");
     printf("                                        M = enum avifNclxMatrixCoefficients\n");
-    printf("                                        R = avifNclxRangeFlag (any nonzero value becomes AVIF_NCLX_FULL_RANGE)\n");
+    printf("                                        R = range (0 = limited range, nonzero = full range)\n");
     printf("    --min Q                           : Set min quantizer for color (%d-%d, where %d is lossless)\n",
            AVIF_QUANTIZER_BEST_QUALITY,
            AVIF_QUANTIZER_WORST_QUALITY,
@@ -99,7 +99,7 @@
         nclx->colourPrimaries = (uint16_t)values[0];
         nclx->transferCharacteristics = (uint16_t)values[1];
         nclx->matrixCoefficients = (uint16_t)values[2];
-        nclx->fullRangeFlag = values[3] ? AVIF_NCLX_FULL_RANGE : AVIF_NCLX_LIMITED_RANGE;
+        nclx->range = values[3] ? AVIF_RANGE_FULL : AVIF_RANGE_LIMITED;
         return AVIF_TRUE;
     }
     return AVIF_FALSE;
diff --git a/apps/shared/avifutil.c b/apps/shared/avifutil.c
index db7dee9..91d0add 100644
--- a/apps/shared/avifutil.c
+++ b/apps/shared/avifutil.c
@@ -24,7 +24,7 @@
                    avif->nclx.colourPrimaries,
                    avif->nclx.transferCharacteristics,
                    avif->nclx.matrixCoefficients,
-                   avif->nclx.fullRangeFlag ? "Full" : "Limited");
+                   (avif->nclx.range == AVIF_RANGE_FULL) ? "Full" : "Limited");
             break;
     }
 
diff --git a/apps/shared/y4m.c b/apps/shared/y4m.c
index 85d58bc..0e326e3 100644
--- a/apps/shared/y4m.c
+++ b/apps/shared/y4m.c
@@ -157,7 +157,7 @@
     int depth = -1;
     avifBool hasAlpha = AVIF_FALSE;
     avifPixelFormat format = AVIF_PIXEL_FORMAT_NONE;
-    avifNclxRangeFlag rangeFlag = AVIF_NCLX_LIMITED_RANGE;
+    avifRange range = AVIF_RANGE_LIMITED;
     while (p != end) {
         switch (*p) {
             case 'W': // width
@@ -182,7 +182,7 @@
                     goto cleanup;
                 }
                 if (!strcmp(tmpBuffer, "XCOLORRANGE=FULL")) {
-                    rangeFlag = AVIF_NCLX_FULL_RANGE;
+                    range = AVIF_RANGE_FULL;
                 }
                 break;
             default:
@@ -238,7 +238,7 @@
     avif->height = height;
     avif->depth = depth;
     avif->yuvFormat = format;
-    avif->yuvRange = (rangeFlag == AVIF_NCLX_LIMITED_RANGE) ? AVIF_RANGE_LIMITED : AVIF_RANGE_FULL;
+    avif->yuvRange = range;
     avifImageAllocatePlanes(avif, AVIF_PLANES_YUV);
 
     avifPixelFormatInfo info;
@@ -364,7 +364,7 @@
     }
 
     const char * rangeString = "XCOLORRANGE=FULL";
-    if ((avif->profileFormat == AVIF_PROFILE_FORMAT_NCLX) && !avif->nclx.fullRangeFlag) {
+    if ((avif->yuvRange == AVIF_RANGE_LIMITED)) {
         rangeString = "XCOLORRANGE=LIMITED";
     }
 
diff --git a/include/avif/avif.h b/include/avif/avif.h
index 0516fac..d59151e 100644
--- a/include/avif/avif.h
+++ b/include/avif/avif.h
@@ -146,6 +146,15 @@
 void avifGetPixelFormatInfo(avifPixelFormat format, avifPixelFormatInfo * info);
 
 // ---------------------------------------------------------------------------
+// avifRange
+
+typedef enum avifRange
+{
+    AVIF_RANGE_LIMITED = 0,
+    AVIF_RANGE_FULL = 0x80
+} avifRange;
+
+// ---------------------------------------------------------------------------
 // avifNclxColorProfile
 
 typedef enum avifNclxColourPrimaries
@@ -234,31 +243,15 @@
     AVIF_NCLX_MATRIX_COEFFICIENTS_ICTCP = 14
 } avifNclxMatrixCoefficients;
 
-// for fullRangeFlag
-typedef enum avifNclxRangeFlag
-{
-    AVIF_NCLX_LIMITED_RANGE = 0,
-    AVIF_NCLX_FULL_RANGE = 0x80
-} avifNclxRangeFlag;
-
 typedef struct avifNclxColorProfile
 {
-    uint16_t colourPrimaries;
-    uint16_t transferCharacteristics;
-    uint16_t matrixCoefficients;
-    uint8_t fullRangeFlag;
+    avifNclxColourPrimaries colourPrimaries;
+    avifNclxTransferCharacteristics transferCharacteristics;
+    avifNclxMatrixCoefficients matrixCoefficients;
+    avifRange range;
 } avifNclxColorProfile;
 
 // ---------------------------------------------------------------------------
-// avifRange
-
-typedef enum avifRange
-{
-    AVIF_RANGE_LIMITED = 0,
-    AVIF_RANGE_FULL,
-} avifRange;
-
-// ---------------------------------------------------------------------------
 // avifProfileFormat
 
 typedef enum avifProfileFormat
diff --git a/src/codec_aom.c b/src/codec_aom.c
index 1f131cd..640f56a 100644
--- a/src/codec_aom.c
+++ b/src/codec_aom.c
@@ -142,7 +142,7 @@
             nclx.colourPrimaries = (uint16_t)codec->internal->image->cp;
             nclx.transferCharacteristics = (uint16_t)codec->internal->image->tc;
             nclx.matrixCoefficients = (uint16_t)codec->internal->image->mc;
-            nclx.fullRangeFlag = (image->yuvRange == AVIF_RANGE_LIMITED) ? AVIF_NCLX_LIMITED_RANGE : AVIF_NCLX_FULL_RANGE;
+            nclx.range = image->yuvRange;
             avifImageSetProfileNCLX(image, &nclx);
         }
 
diff --git a/src/codec_dav1d.c b/src/codec_dav1d.c
index d3c45bf..fef0642 100644
--- a/src/codec_dav1d.c
+++ b/src/codec_dav1d.c
@@ -150,7 +150,7 @@
             nclx.colourPrimaries = (uint16_t)dav1dImage->seq_hdr->pri;
             nclx.transferCharacteristics = (uint16_t)dav1dImage->seq_hdr->trc;
             nclx.matrixCoefficients = (uint16_t)dav1dImage->seq_hdr->mtrx;
-            nclx.fullRangeFlag = (image->yuvRange == AVIF_RANGE_LIMITED) ? AVIF_NCLX_LIMITED_RANGE : AVIF_NCLX_FULL_RANGE;
+            nclx.range = image->yuvRange;
             avifImageSetProfileNCLX(image, &nclx);
         }
 
diff --git a/src/codec_libgav1.c b/src/codec_libgav1.c
index eb61c97..547138e 100644
--- a/src/codec_libgav1.c
+++ b/src/codec_libgav1.c
@@ -112,7 +112,7 @@
             nclx.colourPrimaries = (uint16_t)gav1Image->color_primary;
             nclx.transferCharacteristics = (uint16_t)gav1Image->transfer_characteristics;
             nclx.matrixCoefficients = (uint16_t)gav1Image->matrix_coefficients;
-            nclx.fullRangeFlag = (image->yuvRange == AVIF_RANGE_LIMITED) ? AVIF_NCLX_LIMITED_RANGE : AVIF_NCLX_FULL_RANGE;
+            nclx.range = image->yuvRange;
             avifImageSetProfileNCLX(image, &nclx);
         }
 
diff --git a/src/read.c b/src/read.c
index 882a689..bae84cd 100644
--- a/src/read.c
+++ b/src/read.c
@@ -576,8 +576,7 @@
             ((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)))) {
+              (tile->image->nclx.matrixCoefficients != tileNCLX->matrixCoefficients) || (tile->image->nclx.range != tileNCLX->range)))) {
             return AVIF_FALSE;
         }
     }
@@ -848,16 +847,21 @@
         data->properties.prop[propertyIndex].colr.icc = avifROStreamCurrent(&s);
         data->properties.prop[propertyIndex].colr.iccSize = avifROStreamRemainingBytes(&s);
     } else if (!memcmp(colourType, "nclx", 4)) {
+        uint16_t tmp16;
         // unsigned int(16) colour_primaries;
-        CHECK(avifROStreamReadU16(&s, &data->properties.prop[propertyIndex].colr.nclx.colourPrimaries));
+        CHECK(avifROStreamReadU16(&s, &tmp16));
+        data->properties.prop[propertyIndex].colr.nclx.colourPrimaries = (avifNclxColourPrimaries)tmp16;
         // unsigned int(16) transfer_characteristics;
-        CHECK(avifROStreamReadU16(&s, &data->properties.prop[propertyIndex].colr.nclx.transferCharacteristics));
+        CHECK(avifROStreamReadU16(&s, &tmp16));
+        data->properties.prop[propertyIndex].colr.nclx.transferCharacteristics = (avifNclxTransferCharacteristics)tmp16;
         // unsigned int(16) matrix_coefficients;
-        CHECK(avifROStreamReadU16(&s, &data->properties.prop[propertyIndex].colr.nclx.matrixCoefficients));
+        CHECK(avifROStreamReadU16(&s, &tmp16));
+        data->properties.prop[propertyIndex].colr.nclx.matrixCoefficients = (avifNclxMatrixCoefficients)tmp16;
         // unsigned int(1) full_range_flag;
         // unsigned int(7) reserved = 0;
-        CHECK(avifROStreamRead(&s, &data->properties.prop[propertyIndex].colr.nclx.fullRangeFlag, 1));
-        data->properties.prop[propertyIndex].colr.nclx.fullRangeFlag |= 0x80;
+        uint8_t tmp8;
+        CHECK(avifROStreamRead(&s, &tmp8, 1));
+        data->properties.prop[propertyIndex].colr.nclx.range = (avifRange)(tmp8 | 0x80);
         data->properties.prop[propertyIndex].colr.format = AVIF_PROFILE_FORMAT_NCLX;
     }
     return AVIF_TRUE;
diff --git a/src/write.c b/src/write.c
index d50436d..41b3865 100644
--- a/src/write.c
+++ b/src/write.c
@@ -401,7 +401,7 @@
                 avifRWStreamWriteU16(&s, item->image->nclx.colourPrimaries);         // unsigned int(16) colour_primaries;
                 avifRWStreamWriteU16(&s, item->image->nclx.transferCharacteristics); // unsigned int(16) transfer_characteristics;
                 avifRWStreamWriteU16(&s, item->image->nclx.matrixCoefficients);      // unsigned int(16) matrix_coefficients;
-                avifRWStreamWriteU8(&s, item->image->nclx.fullRangeFlag & 0x80);     // unsigned int(1) full_range_flag;
+                avifRWStreamWriteU8(&s, item->image->nclx.range & 0x80);             // unsigned int(1) full_range_flag;
                                                                                      // unsigned int(7) reserved = 0;
                 avifRWStreamFinishBox(&s, colr);
                 ipmaPush(&item->ipma, ++itemPropertyIndex);