Rename IIIF features to supports

Avoid terminology confusion between OpenLayers map features and IIIF
region/size calculation capability features.
This commit is contained in:
Lutz Helm
2019-03-21 16:10:34 +01:00
committed by Lutz Helm
parent 3f3fbe7e4b
commit 063bc51c59
2 changed files with 31 additions and 29 deletions
+17 -17
View File
@@ -3,7 +3,7 @@
*/ */
/** /**
* Supported image formats, qualities and region / size calculation features * Supported image formats, qualities and supported region / size calculation features
* for different image API versions and compliance levels * for different image API versions and compliance levels
* @const * @const
* @type {Object<string, Object<string, Array<string>>>} * @type {Object<string, Object<string, Array<string>>>}
@@ -11,17 +11,17 @@
const IIIF_PROFILE_VALUES = { const IIIF_PROFILE_VALUES = {
version1: { version1: {
level0: { level0: {
features: [], supports: [],
formats: [], formats: [],
qualities: ['native'] qualities: ['native']
}, },
level1: { level1: {
features: ['regionByPx', 'sizeByW', 'sizeByH', 'sizeByPct'], supports: ['regionByPx', 'sizeByW', 'sizeByH', 'sizeByPct'],
formats: ['jpg'], formats: ['jpg'],
qualities: ['native'] qualities: ['native']
}, },
level2: { level2: {
features: ['regionByPx', 'regionByPct', 'sizeByW', 'sizeByH', 'sizeByPct', supports: ['regionByPx', 'regionByPct', 'sizeByW', 'sizeByH', 'sizeByPct',
'sizeByConfinedWh', 'sizeByWh'], 'sizeByConfinedWh', 'sizeByWh'],
formats: ['jpg', 'png'], formats: ['jpg', 'png'],
qualities: ['native', 'color', 'grey', 'bitonal'] qualities: ['native', 'color', 'grey', 'bitonal']
@@ -29,17 +29,17 @@ const IIIF_PROFILE_VALUES = {
}, },
version2: { version2: {
level0: { level0: {
features: [], supports: [],
formats: ['jpg'], formats: ['jpg'],
qualities: ['default'] qualities: ['default']
}, },
level1: { level1: {
features: ['regionByPx', 'sizeByW', 'sizeByH', 'sizeByPct'], supports: ['regionByPx', 'sizeByW', 'sizeByH', 'sizeByPct'],
formats: ['jpg'], formats: ['jpg'],
qualities: ['default'] qualities: ['default']
}, },
level2: { level2: {
features: ['regionByPx', 'regionByPct', 'sizeByW', 'sizeByH', 'sizeByPct', supports: ['regionByPx', 'regionByPct', 'sizeByW', 'sizeByH', 'sizeByPct',
'sizeByConfinedWh', 'sizeByDistortedWh', 'sizeByWh'], 'sizeByConfinedWh', 'sizeByDistortedWh', 'sizeByWh'],
formats: ['jpg', 'png'], formats: ['jpg', 'png'],
qualities: ['default', 'bitonal'] qualities: ['default', 'bitonal']
@@ -47,24 +47,24 @@ const IIIF_PROFILE_VALUES = {
}, },
version3: { version3: {
level0: { level0: {
features: [], supports: [],
formats: ['jpg'], formats: ['jpg'],
qualities: ['default'] qualities: ['default']
}, },
level1: { level1: {
features: ['regionByPx', 'regionSquare', 'sizeByW', 'sizeByH'], supports: ['regionByPx', 'regionSquare', 'sizeByW', 'sizeByH'],
formats: ['jpg'], formats: ['jpg'],
qualities: ['default'] qualities: ['default']
}, },
level2: { level2: {
features: ['regionByPx', 'regionSquare', 'regionByPct', supports: ['regionByPx', 'regionSquare', 'regionByPct',
'sizeByW', 'sizeByH', 'sizeByPct', 'sizeByConfinedWh', 'sizeByWh'], 'sizeByW', 'sizeByH', 'sizeByPct', 'sizeByConfinedWh', 'sizeByWh'],
formats: ['jpg'], formats: ['jpg'],
qualities: ['default', 'bitonal'] qualities: ['default', 'bitonal']
} }
}, },
none: { none: {
features: [], supports: [],
formats: [], formats: [],
qualities: [] qualities: []
} }
@@ -131,7 +131,7 @@ function generateVersion1Options(imageInfo) {
const levelProfile = getLevelProfileForImageInfo(imageInfo); const levelProfile = getLevelProfileForImageInfo(imageInfo);
return { return {
url: imageInfo['@id'].replace(/\/?(info.json)?$/g, ''), url: imageInfo['@id'].replace(/\/?(info.json)?$/g, ''),
features: levelProfile.features, supports: levelProfile.supports,
formats: [...levelProfile.formats, imageInfo.formats === undefined ? formats: [...levelProfile.formats, imageInfo.formats === undefined ?
[] : imageInfo.formats [] : imageInfo.formats
], ],
@@ -148,7 +148,7 @@ function generateVersion1Options(imageInfo) {
function generateVersion2Options(imageInfo) { function generateVersion2Options(imageInfo) {
const levelProfile = getLevelProfileForImageInfo(imageInfo), const levelProfile = getLevelProfileForImageInfo(imageInfo),
additionalProfile = Array.isArray(imageInfo.profile) && imageInfo.profile.length > 1, additionalProfile = Array.isArray(imageInfo.profile) && imageInfo.profile.length > 1,
profileFeatures = additionalProfile && imageInfo.profile[1].supports ? imageInfo.profile[1].supports : [], profileSupports = additionalProfile && imageInfo.profile[1].supports ? imageInfo.profile[1].supports : [],
profileFormats = additionalProfile && imageInfo.profile[1].formats ? imageInfo.profile[1].formats : [], profileFormats = additionalProfile && imageInfo.profile[1].formats ? imageInfo.profile[1].formats : [],
profileQualities = additionalProfile && imageInfo.profile[1].qualities ? imageInfo.profile[1].qualities : [], profileQualities = additionalProfile && imageInfo.profile[1].qualities ? imageInfo.profile[1].qualities : [],
attributions = []; attributions = [];
@@ -181,7 +181,7 @@ function generateVersion2Options(imageInfo) {
imageInfo.tiles.map(function(tile) { imageInfo.tiles.map(function(tile) {
return tile.scaleFactors; return tile.scaleFactors;
})[0], })[0],
features: [...levelProfile.features, ...profileFeatures], supports: [...levelProfile.supports, ...profileSupports],
formats: [...levelProfile.formats, ...profileFormats], formats: [...levelProfile.formats, ...profileFormats],
qualities: [...levelProfile.qualities, ...profileQualities], qualities: [...levelProfile.qualities, ...profileQualities],
attributions: attributions.length == 0 ? undefined : attributions attributions: attributions.length == 0 ? undefined : attributions
@@ -207,8 +207,8 @@ function generateVersion3Options(imageInfo) {
imageInfo.tiles.map(function(tile) { imageInfo.tiles.map(function(tile) {
return tile.scaleFactors; return tile.scaleFactors;
})[0], })[0],
features: imageInfo.extraFeatures === undefined ? levelProfile.features : supports: imageInfo.extraFeatures === undefined ? levelProfile.supports :
[...levelProfile.features, ...imageInfo.extraFeatures], [...levelProfile.supports, ...imageInfo.extraFeatures],
formats: imageInfo.extraFormats === undefined ? levelProfile.formats : formats: imageInfo.extraFormats === undefined ? levelProfile.formats :
[...levelProfile.formats, ...imageInfo.extraFormats], [...levelProfile.formats, ...imageInfo.extraFormats],
qualities: imageInfo.extraQualities === undefined ? levelProfile.qualities : qualities: imageInfo.extraQualities === undefined ? levelProfile.qualities :
@@ -239,7 +239,7 @@ function getOptionsForImageInformation(imageInfo, preferredOptions) {
size: [imageInfo.width, imageInfo.height], size: [imageInfo.width, imageInfo.height],
sizes: imageOptions.sizes, sizes: imageOptions.sizes,
format: imageOptions.formats.includes(options.format) ? options.format : 'jpg', format: imageOptions.formats.includes(options.format) ? options.format : 'jpg',
features: imageOptions.features, supports: imageOptions.supports,
quality: options.quality && imageOptions.qualities.includes(options.quality) ? quality: options.quality && imageOptions.qualities.includes(options.quality) ?
options.quality : imageOptions.qualities.includes('native') ? 'native' : 'default', options.quality : imageOptions.qualities.includes('native') ? 'native' : 'default',
resolutions: Array.isArray(imageOptions.resolutions) ? imageOptions.resolutions.sort(function(a, b) { resolutions: Array.isArray(imageOptions.resolutions) ? imageOptions.resolutions.sort(function(a, b) {
+14 -12
View File
@@ -25,6 +25,8 @@ import TileImage from './TileImage.js';
* @property {import("../size.js").Size[]} [sizes] Supported scaled image sizes. * @property {import("../size.js").Size[]} [sizes] Supported scaled image sizes.
* Content of the IIIF info.json 'sizes' property, but as array of Size objects. * Content of the IIIF info.json 'sizes' property, but as array of Size objects.
* @property {import("../extent.js").Extent} [extent=[0, -height, width, 0]] * @property {import("../extent.js").Extent} [extent=[0, -height, width, 0]]
* @property {Array<string>} [supports=[]] Supported IIIF region and size calculation
* features.
* @property {number} [transition] * @property {number} [transition]
* @property {number|import("../size.js").Size} [tileSize] Tile size. * @property {number|import("../size.js").Size} [tileSize] Tile size.
* Same tile size is used for all zoom levels. If tile size is a number, * Same tile size is used for all zoom levels. If tile size is a number,
@@ -62,15 +64,15 @@ class IIIF extends TileImage {
const format = options.format || 'jpg'; const format = options.format || 'jpg';
const quality = options.quality || (options.version == Versions.VERSION1 ? 'native' : 'default'); const quality = options.quality || (options.version == Versions.VERSION1 ? 'native' : 'default');
let resolutions = options.resolutions || []; let resolutions = options.resolutions || [];
const features = options.features || []; const supports = options.supports || [];
const extent = options.extent || [0, -height, width, 0]; const extent = options.extent || [0, -height, width, 0];
const supportsListedSizes = sizes != undefined && Array.isArray(sizes) && sizes.length > 0; const supportsListedSizes = sizes != undefined && Array.isArray(sizes) && sizes.length > 0;
const supportsListedTiles = tileSize != undefined && (Number.isInteger(tileSize) && tileSize > 0 || Array.isArray(tileSize) && tileSize.length > 0); const supportsListedTiles = tileSize != undefined && (Number.isInteger(tileSize) && tileSize > 0 || Array.isArray(tileSize) && tileSize.length > 0);
const supportsArbitraryTiling = features != undefined && Array.isArray(features) && const supportsArbitraryTiling = supports != undefined && Array.isArray(supports) &&
(features.includes('regionByPx') || features.includes('regionByPct')) && (supports.includes('regionByPx') || supports.includes('regionByPct')) &&
(features.includes('sizeByWh') || features.includes('sizeByH') || (supports.includes('sizeByWh') || supports.includes('sizeByH') ||
features.includes('sizeByW') || features.includes('sizeByPct')); supports.includes('sizeByW') || supports.includes('sizeByPct'));
let tileWidth, let tileWidth,
tileHeight, tileHeight,
@@ -187,24 +189,24 @@ class IIIF extends TileImage {
if (regionX == 0 && regionW == width && regionY == 0 && regionH == height) { if (regionX == 0 && regionW == width && regionY == 0 && regionH == height) {
// canonical full image region parameter is 'full', not 'x,y,w,h' // canonical full image region parameter is 'full', not 'x,y,w,h'
regionParam = 'full'; regionParam = 'full';
} else if (!supportsArbitraryTiling || features.includes('regionByPx')) { } else if (!supportsArbitraryTiling || supports.includes('regionByPx')) {
regionParam = regionX + ',' + regionY + ',' + regionW + ',' + regionH; regionParam = regionX + ',' + regionY + ',' + regionW + ',' + regionH;
} else if (features.includes('regionByPct')) { } else if (supports.includes('regionByPct')) {
const pctX = formatPercentage(regionX / width * 100), const pctX = formatPercentage(regionX / width * 100),
pctY = formatPercentage(regionY / height * 100), pctY = formatPercentage(regionY / height * 100),
pctW = formatPercentage(regionW / width * 100), pctW = formatPercentage(regionW / width * 100),
pctH = formatPercentage(regionH / height * 100); pctH = formatPercentage(regionH / height * 100);
regionParam = 'pct:' + pctX + ',' + pctY + ',' + pctW + ',' + pctH; regionParam = 'pct:' + pctX + ',' + pctY + ',' + pctW + ',' + pctH;
} }
if (version == Versions.VERSION3 && (!supportsArbitraryTiling || features.includes('sizeByWh'))) { if (version == Versions.VERSION3 && (!supportsArbitraryTiling || supports.includes('sizeByWh'))) {
sizeParam = sizeW + ',' + sizeH; sizeParam = sizeW + ',' + sizeH;
} else if (!supportsArbitraryTiling || features.includes('sizeByW')) { } else if (!supportsArbitraryTiling || supports.includes('sizeByW')) {
sizeParam = sizeW + ','; sizeParam = sizeW + ',';
} else if (features.includes('sizeByH')) { } else if (supports.includes('sizeByH')) {
sizeParam = ',' + sizeH; sizeParam = ',' + sizeH;
} else if (features.includes('sizeByWh')) { } else if (supports.includes('sizeByWh')) {
sizeParam = sizeW + ',' + sizeH; sizeParam = sizeW + ',' + sizeH;
} else if (features.includes('sizeByPct')) { } else if (supports.includes('sizeByPct')) {
sizeParam = 'pct:' + formatPercentage(100 / scale); sizeParam = 'pct:' + formatPercentage(100 / scale);
} }
} else { } else {