diff --git a/Libraries/Image/AssetSourcePickScale.js b/Libraries/Image/AssetSourcePickScale.js new file mode 100644 index 00000000000000..70c35f3bcf34f8 --- /dev/null +++ b/Libraries/Image/AssetSourcePickScale.js @@ -0,0 +1,33 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + * @format + */ + +'use strict'; + +const PixelRatio = require('../Utilities/PixelRatio'); +function AssetSourcePickScale( + scales: Array, + deviceScale?: number, +): number { + if (deviceScale == null) { + deviceScale = PixelRatio.get(); + } + // Packager guarantees that `scales` array is sorted + for (let i = 0; i < scales.length; i++) { + if (scales[i] >= deviceScale) { + return scales[i]; + } + } + + // If nothing matches, device scale is larger than any available + // scales, so we return the biggest one. Unless the array is empty, + // in which case we default to 1 + return scales[scales.length - 1] || 1; +} +module.exports = AssetSourcePickScale; diff --git a/Libraries/Image/AssetSourceResolver.js b/Libraries/Image/AssetSourceResolver.js index 6c97f008e1bb21..4ddc2bf123050d 100644 --- a/Libraries/Image/AssetSourceResolver.js +++ b/Libraries/Image/AssetSourceResolver.js @@ -21,6 +21,7 @@ export type ResolvedAssetSource = {| import type {PackagerAsset} from '@react-native/assets/registry'; const PixelRatio = require('../Utilities/PixelRatio'); +const pickScale = require('./AssetSourcePickScale'); const Platform = require('../Utilities/Platform'); const invariant = require('invariant'); @@ -35,7 +36,7 @@ const { * Returns a path like 'assets/AwesomeModule/icon@2x.png' */ function getScaledAssetPath(asset): string { - const scale = AssetSourceResolver.pickScale(asset.scales, PixelRatio.get()); + const scale = pickScale(asset.scales, PixelRatio.get()); const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x'; const assetDir = getBasePath(asset); return assetDir + '/' + asset.name + scaleSuffix + '.' + asset.type; @@ -45,7 +46,7 @@ function getScaledAssetPath(asset): string { * Returns a path like 'drawable-mdpi/icon.png' */ function getAssetPathInDrawableFolder(asset): string { - const scale = AssetSourceResolver.pickScale(asset.scales, PixelRatio.get()); + const scale = pickScale(asset.scales, PixelRatio.get()); const drawbleFolder = getAndroidResourceFolderName(asset, scale); const fileName = getAndroidResourceIdentifier(asset); return drawbleFolder + '/' + fileName + '.' + asset.type; @@ -154,26 +155,14 @@ class AssetSourceResolver { width: this.asset.width, height: this.asset.height, uri: source, - scale: AssetSourceResolver.pickScale(this.asset.scales, PixelRatio.get()), + scale: pickScale(this.asset.scales, PixelRatio.get()), }; } - static pickScale(scales: Array, deviceScale?: number): number { - if (deviceScale == null) { - deviceScale = PixelRatio.get(); - } - // Packager guarantees that `scales` array is sorted - for (let i = 0; i < scales.length; i++) { - if (scales[i] >= deviceScale) { - return scales[i]; - } - } - - // If nothing matches, device scale is larger than any available - // scales, so we return the biggest one. Unless the array is empty, - // in which case we default to 1 - return scales[scales.length - 1] || 1; - } + static pickScale: ( + scales: Array, + deviceScale?: number, + ) => number = pickScale; } module.exports = AssetSourceResolver; diff --git a/Libraries/Image/resolveAssetSource.js b/Libraries/Image/resolveAssetSource.js index 71df2005163baa..19e9607ace5585 100644 --- a/Libraries/Image/resolveAssetSource.js +++ b/Libraries/Image/resolveAssetSource.js @@ -14,6 +14,7 @@ const AssetRegistry = require('@react-native/assets/registry'); const AssetSourceResolver = require('./AssetSourceResolver'); +const AssetSourcePickScale = require('./AssetSourcePickScale'); import type {ResolvedAssetSource} from './AssetSourceResolver'; @@ -105,5 +106,5 @@ function resolveAssetSource(source: any): ?ResolvedAssetSource { } module.exports = resolveAssetSource; -module.exports.pickScale = AssetSourceResolver.pickScale; +module.exports.pickScale = AssetSourcePickScale; module.exports.setCustomSourceTransformer = setCustomSourceTransformer;