Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions Libraries/Image/AssetSourcePickScale.js
Original file line number Diff line number Diff line change
@@ -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<number>,
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;
27 changes: 8 additions & 19 deletions Libraries/Image/AssetSourceResolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -35,7 +36,7 @@ const {
* Returns a path like 'assets/AwesomeModule/[email protected]'
*/
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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<number>, 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<number>,
deviceScale?: number,
) => number = pickScale;
}

module.exports = AssetSourceResolver;
3 changes: 2 additions & 1 deletion Libraries/Image/resolveAssetSource.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

const AssetRegistry = require('@react-native/assets/registry');
const AssetSourceResolver = require('./AssetSourceResolver');
const AssetSourcePickScale = require('./AssetSourcePickScale');

import type {ResolvedAssetSource} from './AssetSourceResolver';

Expand Down Expand Up @@ -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;