@amazon-devices/expo-image 2.0.1758683737
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +2 -0
- package/CHANGELOG.md +285 -0
- package/CMakeLists.txt +91 -0
- package/LICENSE +7 -0
- package/README.kepler.md +123 -0
- package/README.md +54 -0
- package/THIRD_PARTY_NOTICES.txt +24 -0
- package/android/build.gradle +124 -0
- package/android/proguard-rules.pro +28 -0
- package/android/src/main/AndroidManifest.xml +15 -0
- package/android/src/main/java/expo/modules/image/Exceptions.kt +9 -0
- package/android/src/main/java/expo/modules/image/ExpoImageAppGlideModule.kt +19 -0
- package/android/src/main/java/expo/modules/image/ExpoImageModule.kt +192 -0
- package/android/src/main/java/expo/modules/image/ExpoImageView.kt +220 -0
- package/android/src/main/java/expo/modules/image/ExpoImageViewWrapper.kt +652 -0
- package/android/src/main/java/expo/modules/image/GlideModel.kt +73 -0
- package/android/src/main/java/expo/modules/image/ImageUtils.kt +50 -0
- package/android/src/main/java/expo/modules/image/ImageViewWrapperTarget.kt +313 -0
- package/android/src/main/java/expo/modules/image/ResourceIdHelper.kt +47 -0
- package/android/src/main/java/expo/modules/image/ThumbnailRequestCoordinatorExtension.kt +21 -0
- package/android/src/main/java/expo/modules/image/YogaUtils.kt +20 -0
- package/android/src/main/java/expo/modules/image/blurhash/BlurHashFetcher.kt +32 -0
- package/android/src/main/java/expo/modules/image/blurhash/BlurhashDecoder.kt +189 -0
- package/android/src/main/java/expo/modules/image/blurhash/BlurhashModelLoader.kt +30 -0
- package/android/src/main/java/expo/modules/image/blurhash/BlurhashModelLoaderFactory.kt +14 -0
- package/android/src/main/java/expo/modules/image/blurhash/BlurhashModule.kt +17 -0
- package/android/src/main/java/expo/modules/image/dataurls/Base64DataFetcher.kt +27 -0
- package/android/src/main/java/expo/modules/image/dataurls/Base64ModelLoader.kt +24 -0
- package/android/src/main/java/expo/modules/image/dataurls/Base64ModelLoaderFactory.kt +12 -0
- package/android/src/main/java/expo/modules/image/dataurls/Base64Module.kt +16 -0
- package/android/src/main/java/expo/modules/image/drawing/OutlineProvider.kt +201 -0
- package/android/src/main/java/expo/modules/image/enums/ContentFit.kt +89 -0
- package/android/src/main/java/expo/modules/image/enums/ImageCacheType.kt +14 -0
- package/android/src/main/java/expo/modules/image/enums/Priority.kt +15 -0
- package/android/src/main/java/expo/modules/image/events/GlideRequestListener.kt +64 -0
- package/android/src/main/java/expo/modules/image/events/OkHttpProgressListener.kt +26 -0
- package/android/src/main/java/expo/modules/image/okhttp/ExpoImageOkHttpClientGlideModule.kt +80 -0
- package/android/src/main/java/expo/modules/image/okhttp/GlideUrlWrapperLoader.kt +55 -0
- package/android/src/main/java/expo/modules/image/records/CachePolicy.kt +10 -0
- package/android/src/main/java/expo/modules/image/records/ContentPosition.kt +89 -0
- package/android/src/main/java/expo/modules/image/records/ImageTransition.kt +8 -0
- package/android/src/main/java/expo/modules/image/records/SourceMap.kt +160 -0
- package/android/src/main/java/expo/modules/image/records/events.kt +25 -0
- package/android/src/main/java/expo/modules/image/svg/SVGDecoder.kt +33 -0
- package/android/src/main/java/expo/modules/image/svg/SVGDrawableTranscoder.kt +37 -0
- package/android/src/main/java/expo/modules/image/svg/SVGModule.kt +26 -0
- package/android/src/main/java/expo/modules/image/thumbhash/ThumbhashDecoder.kt +365 -0
- package/android/src/main/java/expo/modules/image/thumbhash/ThumbhashFetcher.kt +31 -0
- package/android/src/main/java/expo/modules/image/thumbhash/ThumbhashModelLoader.kt +26 -0
- package/android/src/main/java/expo/modules/image/thumbhash/ThumbhashModelLoaderFactory.kt +14 -0
- package/android/src/main/java/expo/modules/image/thumbhash/ThumbhashModule.kt +17 -0
- package/build/ExpoImage.d.ts +15 -0
- package/build/ExpoImage.d.ts.map +1 -0
- package/build/ExpoImage.js +75 -0
- package/build/ExpoImage.js.map +1 -0
- package/build/ExpoImage.kepler.d.ts +23 -0
- package/build/ExpoImage.kepler.d.ts.map +1 -0
- package/build/ExpoImage.kepler.js +71 -0
- package/build/ExpoImage.kepler.js.map +1 -0
- package/build/ExpoImage.web.d.ts +9 -0
- package/build/ExpoImage.web.d.ts.map +1 -0
- package/build/ExpoImage.web.js +90 -0
- package/build/ExpoImage.web.js.map +1 -0
- package/build/ExpoImageModules.d.ts +3 -0
- package/build/ExpoImageModules.d.ts.map +1 -0
- package/build/ExpoImageModules.js +4 -0
- package/build/ExpoImageModules.js.map +1 -0
- package/build/ExpoImageModules.kepler.d.ts +6 -0
- package/build/ExpoImageModules.kepler.d.ts.map +1 -0
- package/build/ExpoImageModules.kepler.js +5 -0
- package/build/ExpoImageModules.kepler.js.map +1 -0
- package/build/Image.d.ts +30 -0
- package/build/Image.d.ts.map +1 -0
- package/build/Image.js +49 -0
- package/build/Image.js.map +1 -0
- package/build/Image.types.d.ts +374 -0
- package/build/Image.types.d.ts.map +1 -0
- package/build/Image.types.js +2 -0
- package/build/Image.types.js.map +1 -0
- package/build/ImageBackground.d.ts +6 -0
- package/build/ImageBackground.d.ts.map +1 -0
- package/build/ImageBackground.js +13 -0
- package/build/ImageBackground.js.map +1 -0
- package/build/ImageViewNativeComponent.d.ts +20 -0
- package/build/ImageViewNativeComponent.d.ts.map +1 -0
- package/build/ImageViewNativeComponent.js +42 -0
- package/build/ImageViewNativeComponent.js.map +1 -0
- package/build/NativeImageLoaderKepler.d.ts +18 -0
- package/build/NativeImageLoaderKepler.d.ts.map +1 -0
- package/build/NativeImageLoaderKepler.js +3 -0
- package/build/NativeImageLoaderKepler.js.map +1 -0
- package/build/fabric/registerNativeComponent.d.ts +15 -0
- package/build/fabric/registerNativeComponent.d.ts.map +1 -0
- package/build/fabric/registerNativeComponent.js +47 -0
- package/build/fabric/registerNativeComponent.js.map +1 -0
- package/build/index.d.ts +4 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +4 -0
- package/build/index.js.map +1 -0
- package/build/utils/AssetSourceResolver.web.d.ts +24 -0
- package/build/utils/AssetSourceResolver.web.d.ts.map +1 -0
- package/build/utils/AssetSourceResolver.web.js +67 -0
- package/build/utils/AssetSourceResolver.web.js.map +1 -0
- package/build/utils/blurhash/base83.d.ts +3 -0
- package/build/utils/blurhash/base83.d.ts.map +1 -0
- package/build/utils/blurhash/base83.js +103 -0
- package/build/utils/blurhash/base83.js.map +1 -0
- package/build/utils/blurhash/decode.d.ts +7 -0
- package/build/utils/blurhash/decode.d.ts.map +1 -0
- package/build/utils/blurhash/decode.js +92 -0
- package/build/utils/blurhash/decode.js.map +1 -0
- package/build/utils/blurhash/error.d.ts +4 -0
- package/build/utils/blurhash/error.d.ts.map +1 -0
- package/build/utils/blurhash/error.js +8 -0
- package/build/utils/blurhash/error.js.map +1 -0
- package/build/utils/blurhash/useBlurhash.d.ts +8 -0
- package/build/utils/blurhash/useBlurhash.d.ts.map +1 -0
- package/build/utils/blurhash/useBlurhash.js +64 -0
- package/build/utils/blurhash/useBlurhash.js.map +1 -0
- package/build/utils/blurhash/utils.d.ts +5 -0
- package/build/utils/blurhash/utils.d.ts.map +1 -0
- package/build/utils/blurhash/utils.js +21 -0
- package/build/utils/blurhash/utils.js.map +1 -0
- package/build/utils/resolveAssetSource.d.ts +3 -0
- package/build/utils/resolveAssetSource.d.ts.map +1 -0
- package/build/utils/resolveAssetSource.js +3 -0
- package/build/utils/resolveAssetSource.js.map +1 -0
- package/build/utils/resolveAssetSource.web.d.ts +9 -0
- package/build/utils/resolveAssetSource.web.d.ts.map +1 -0
- package/build/utils/resolveAssetSource.web.js +31 -0
- package/build/utils/resolveAssetSource.web.js.map +1 -0
- package/build/utils/resolveHashString.d.ts +14 -0
- package/build/utils/resolveHashString.d.ts.map +1 -0
- package/build/utils/resolveHashString.js +31 -0
- package/build/utils/resolveHashString.js.map +1 -0
- package/build/utils/resolveHashString.web.d.ts +20 -0
- package/build/utils/resolveHashString.web.d.ts.map +1 -0
- package/build/utils/resolveHashString.web.js +31 -0
- package/build/utils/resolveHashString.web.js.map +1 -0
- package/build/utils/resolveSources.d.ts +8 -0
- package/build/utils/resolveSources.d.ts.map +1 -0
- package/build/utils/resolveSources.js +45 -0
- package/build/utils/resolveSources.js.map +1 -0
- package/build/utils/thumbhash/thumbhash.d.ts +66 -0
- package/build/utils/thumbhash/thumbhash.d.ts.map +1 -0
- package/build/utils/thumbhash/thumbhash.js +338 -0
- package/build/utils/thumbhash/thumbhash.js.map +1 -0
- package/build/utils.d.ts +17 -0
- package/build/utils.d.ts.map +1 -0
- package/build/utils.js +85 -0
- package/build/utils.js.map +1 -0
- package/build/web/AnimationManager.d.ts +37 -0
- package/build/web/AnimationManager.d.ts.map +1 -0
- package/build/web/AnimationManager.js +155 -0
- package/build/web/AnimationManager.js.map +1 -0
- package/build/web/ColorTintFilter.d.ts +12 -0
- package/build/web/ColorTintFilter.d.ts.map +1 -0
- package/build/web/ColorTintFilter.js +30 -0
- package/build/web/ColorTintFilter.js.map +1 -0
- package/build/web/ImageWrapper.d.ts +5 -0
- package/build/web/ImageWrapper.d.ts.map +1 -0
- package/build/web/ImageWrapper.js +44 -0
- package/build/web/ImageWrapper.js.map +1 -0
- package/build/web/ImageWrapper.types.d.ts +29 -0
- package/build/web/ImageWrapper.types.d.ts.map +1 -0
- package/build/web/ImageWrapper.types.js +2 -0
- package/build/web/ImageWrapper.types.js.map +1 -0
- package/build/web/getImageWrapperEventHandler.d.ts +8 -0
- package/build/web/getImageWrapperEventHandler.d.ts.map +1 -0
- package/build/web/getImageWrapperEventHandler.js +25 -0
- package/build/web/getImageWrapperEventHandler.js.map +1 -0
- package/build/web/hooks.d.ts +13 -0
- package/build/web/hooks.d.ts.map +1 -0
- package/build/web/hooks.js +58 -0
- package/build/web/hooks.js.map +1 -0
- package/build/web/imageStyles.d.ts +2 -0
- package/build/web/imageStyles.d.ts.map +1 -0
- package/build/web/imageStyles.js +137 -0
- package/build/web/imageStyles.js.map +1 -0
- package/build/web/positioning.d.ts +11 -0
- package/build/web/positioning.d.ts.map +1 -0
- package/build/web/positioning.js +35 -0
- package/build/web/positioning.js.map +1 -0
- package/build/web/useSourceSelection.d.ts +14 -0
- package/build/web/useSourceSelection.d.ts.map +1 -0
- package/build/web/useSourceSelection.js +98 -0
- package/build/web/useSourceSelection.js.map +1 -0
- package/expo-module.config.json +9 -0
- package/ios/Blurhash.swift +326 -0
- package/ios/BlurhashLoader.swift +52 -0
- package/ios/ContentFit.swift +55 -0
- package/ios/ContentPosition.swift +108 -0
- package/ios/ExpoImage.podspec +30 -0
- package/ios/ImageCachePolicy.swift +24 -0
- package/ios/ImageCacheType.swift +21 -0
- package/ios/ImageModule.swift +127 -0
- package/ios/ImagePriority.swift +22 -0
- package/ios/ImageSource.swift +44 -0
- package/ios/ImageTransition.swift +67 -0
- package/ios/ImageUtils.swift +227 -0
- package/ios/ImageView.swift +469 -0
- package/ios/Loaders/PhotoLibraryAssetLoader.swift +146 -0
- package/ios/Thumbhash.swift +550 -0
- package/ios/ThumbhashLoader.swift +53 -0
- package/jest.config.js +3 -0
- package/kepler/ExpoImage.cpp +63 -0
- package/kepler/ExpoImage.h +29 -0
- package/kepler/ExpoImageCacheHandler.cpp +15 -0
- package/kepler/ExpoImageCacheHandler.h +28 -0
- package/kepler/ExpoImageComponent.cpp +579 -0
- package/kepler/ExpoImageComponent.h +199 -0
- package/kepler/ImageWrapper/BlurhashImageWrapper.cpp +37 -0
- package/kepler/ImageWrapper/BlurhashImageWrapper.h +23 -0
- package/kepler/ImageWrapper/CacheImageWrapper.cpp +80 -0
- package/kepler/ImageWrapper/CacheImageWrapper.h +41 -0
- package/kepler/ImageWrapper/HashImageWrapper.cpp +21 -0
- package/kepler/ImageWrapper/HashImageWrapper.h +22 -0
- package/kepler/ImageWrapper/ImageWrapper.cpp +24 -0
- package/kepler/ImageWrapper/ImageWrapper.h +33 -0
- package/kepler/ImageWrapper/LocalImageWrapper.cpp +61 -0
- package/kepler/ImageWrapper/LocalImageWrapper.h +30 -0
- package/kepler/ImageWrapper/ThumbhashImageWrapper.cpp +33 -0
- package/kepler/ImageWrapper/ThumbhashImageWrapper.h +20 -0
- package/kepler/KeplerImageViewComponent.h +64 -0
- package/kepler/KeplerInit.cpp +35 -0
- package/kepler/blurhash/common.h +32 -0
- package/kepler/blurhash/decode.cpp +187 -0
- package/kepler/blurhash/decode.h +58 -0
- package/kepler/contentposition/ImageContentPosition.cpp +86 -0
- package/kepler/contentposition/ImageContentPosition.h +48 -0
- package/kepler/enums/ImageContentFit.h +17 -0
- package/kepler/enums/ImagePriority.h +17 -0
- package/kepler/managers/ExpoImageManager.cpp +38 -0
- package/kepler/managers/ExpoImageManager.h +23 -0
- package/kepler/test/ExpoImage.cpp +73 -0
- package/kepler/test/ExpoImageComponent.cpp +290 -0
- package/kepler/test/blurhash/decode.cpp +39 -0
- package/kepler/test/contentposition/ImageContentPosition.cpp +100 -0
- package/kepler/test/managers/ExpoImageManager.cpp +39 -0
- package/kepler/test/thumbhash/decode.cpp +18 -0
- package/kepler/test/utils/LoaderDelegate.cpp +130 -0
- package/kepler/thumbhash/decode.cpp +166 -0
- package/kepler/thumbhash/decode.h +22 -0
- package/kepler/utils/PlaceholderImageLoaderDelegate.cpp +26 -0
- package/kepler/utils/PlaceholderImageLoaderDelegate.h +26 -0
- package/kepler/utils/PrefetchImageLoaderDelegate.cpp +55 -0
- package/kepler/utils/PrefetchImageLoaderDelegate.h +35 -0
- package/kepler/utils/SourceImageLoaderDelegate.cpp +47 -0
- package/kepler/utils/SourceImageLoaderDelegate.h +42 -0
- package/kepler/utils/SourceImageLoaderDelegateEmitter.cpp +15 -0
- package/kepler/utils/SourceImageLoaderDelegateEmitter.h +28 -0
- package/kepler-compatibility.json +8 -0
- package/package.json +1 -0
- package/react-native.config.js +22 -0
- package/src/ExpoImage.kepler.tsx +119 -0
- package/src/ExpoImage.tsx +119 -0
- package/src/ExpoImage.web.tsx +155 -0
- package/src/ExpoImageModules.kepler.ts +7 -0
- package/src/ExpoImageModules.ts +4 -0
- package/src/Image.tsx +82 -0
- package/src/Image.types.ts +450 -0
- package/src/ImageBackground.tsx +18 -0
- package/src/ImageViewNativeComponent.ts +59 -0
- package/src/NativeImageLoaderKepler.ts +22 -0
- package/src/fabric/registerNativeComponent.ts +70 -0
- package/src/index.ts +3 -0
- package/src/utils/AssetSourceResolver.web.ts +88 -0
- package/src/utils/blurhash/base83.ts +104 -0
- package/src/utils/blurhash/decode.ts +114 -0
- package/src/utils/blurhash/error.ts +7 -0
- package/src/utils/blurhash/useBlurhash.tsx +81 -0
- package/src/utils/blurhash/utils.ts +21 -0
- package/src/utils/resolveAssetSource.tsx +3 -0
- package/src/utils/resolveAssetSource.web.ts +40 -0
- package/src/utils/resolveHashString.tsx +36 -0
- package/src/utils/resolveHashString.web.tsx +33 -0
- package/src/utils/resolveSources.tsx +48 -0
- package/src/utils/thumbhash/thumbhash.ts +387 -0
- package/src/utils.ts +109 -0
- package/src/web/AnimationManager.tsx +224 -0
- package/src/web/ColorTintFilter.tsx +36 -0
- package/src/web/ImageWrapper.tsx +85 -0
- package/src/web/ImageWrapper.types.ts +36 -0
- package/src/web/getImageWrapperEventHandler.ts +29 -0
- package/src/web/hooks.ts +72 -0
- package/src/web/imageStyles.tsx +136 -0
- package/src/web/positioning.ts +48 -0
- package/src/web/useSourceSelection.ts +151 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registerNativeComponent.js","sourceRoot":"","sources":["../../src/fabric/registerNativeComponent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,6CAA6C;AAC7C,OAAO,sBAAsB,MAAM,yDAAyD,CAAC;AAC7F,6CAA6C;AAC7C,OAAO,QAAQ,MAAM,8DAA8D,CAAC;AAkBpF,SAAS,uBAAuB,CAC9B,aAAqB,EACrB,OAAwB;IAExB,6CAA6C;IAC7C,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC7B,QAAQ,CAAC,aAAa,EAAE;YACtB,eAAe,EAAE,aAAa;YAC9B,eAAe,EAAE;gBACf,GAAG,OAAO,EAAE,eAAe;aAC5B;YACD,gBAAgB,EAAE;gBAChB,YAAY,EAAE;oBACZ,gBAAgB,EAAE,aAAa;iBAChC;gBACD,WAAW,EAAE;oBACX,gBAAgB,EAAE,YAAY;iBAC/B;gBACD,QAAQ,EAAE;oBACR,gBAAgB,EAAE,SAAS;iBAC5B;gBACD,cAAc,EAAE;oBACd,gBAAgB,EAAE,eAAe;iBAClC;gBACD,OAAO,EAAE;oBACP,gBAAgB,EAAE,QAAQ;iBAC3B;gBACD,UAAU,EAAE;oBACV,gBAAgB,EAAE,WAAW;iBAC9B;aACF;SACF,CAAC,CAAC;QAEH,OAAO,aAAgD,CAAC;IAC1D,CAAC;IACD,OAAO,sBAAsB,CAAQ,aAAa,CAAC,CAAC;AACtD,CAAC;AAED,eAAe,uBAAuB,CAAC","sourcesContent":["/*\n * Copyright (c) 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *\n * PROPRIETARY/CONFIDENTIAL\n *\n * Use is subject to license terms.\n */\n\nimport { Platform } from 'react-native';\nimport type { HostComponent, ViewProps as VP } from 'react-native';\n// @ts-ignore For some reason this is unknown\nimport codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';\n// @ts-ignore For some reason this is unknown\nimport register from 'react-native/Libraries/Utilities/registerGeneratedViewConfig';\n\ntype ViewProps = Omit<VP, 'pointerEvents'>;\n\ntype ValidAttributeTypes<Props> = Record<keyof Omit<Required<Props>, keyof ViewProps>, true> & {\n accessibilityLabel: true;\n};\n\n// Taken from react-native/Libraries/Utilities/codegenNativeComponent.ts with additional Kepler option\ntype Options<Props> = Readonly<{\n interfaceOnly?: boolean;\n paperComponentName?: string;\n paperComponentNameDeprecated?: string;\n excludedPlatforms?: ReadonlyArray<'iOS' | 'android'>;\n // Kepler specific\n validAttributes?: ValidAttributeTypes<Props>;\n}>;\n\nfunction registerNativeComponent<Props extends ViewProps>(\n componentName: string,\n options?: Options<Props>\n): HostComponent<Props> {\n // @ts-ignore - Kepler should be in platforms\n if (Platform.OS === 'kepler') {\n register(componentName, {\n uiViewClassName: componentName,\n validAttributes: {\n ...options?.validAttributes,\n },\n directEventTypes: {\n topLoadStart: {\n registrationName: 'onLoadStart',\n },\n topProgress: {\n registrationName: 'onProgress',\n },\n topError: {\n registrationName: 'onError',\n },\n topPartialLoad: {\n registrationName: 'onPartialLoad',\n },\n topLoad: {\n registrationName: 'onLoad',\n },\n topLoadEnd: {\n registrationName: 'onLoadEnd',\n },\n },\n });\n\n return componentName as unknown as HostComponent<Props>;\n }\n return codegenNativeComponent<Props>(componentName);\n}\n\nexport default registerNativeComponent;\n"]}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC","sourcesContent":["export * from './Image';\nexport * from './Image.types';\nexport * from './ImageBackground';\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PackagerAsset } from 'react-native/Libraries/Image/AssetRegistry';
|
|
2
|
+
export type ResolvedAssetSource = {
|
|
3
|
+
__packager_asset: boolean;
|
|
4
|
+
width?: number;
|
|
5
|
+
height?: number;
|
|
6
|
+
uri: string;
|
|
7
|
+
scale: number;
|
|
8
|
+
};
|
|
9
|
+
export default class AssetSourceResolver {
|
|
10
|
+
serverUrl: string;
|
|
11
|
+
jsbundleUrl?: string | null;
|
|
12
|
+
asset: PackagerAsset;
|
|
13
|
+
constructor(serverUrl: string | undefined | null, jsbundleUrl: string | undefined | null, asset: PackagerAsset);
|
|
14
|
+
isLoadedFromServer(): boolean;
|
|
15
|
+
isLoadedFromFileSystem(): boolean;
|
|
16
|
+
defaultAsset(): ResolvedAssetSource;
|
|
17
|
+
/**
|
|
18
|
+
* @returns absolute remote URL for the hosted asset.
|
|
19
|
+
*/
|
|
20
|
+
assetServerURL(): ResolvedAssetSource;
|
|
21
|
+
fromSource(source: string): ResolvedAssetSource;
|
|
22
|
+
static pickScale(scales: number[], deviceScale: number): number;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=AssetSourceResolver.web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetSourceResolver.web.d.ts","sourceRoot":"","sources":["../../src/utils/AssetSourceResolver.web.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAE3E,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAcF,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACtC,SAAS,EAAE,MAAM,CAAC;IAGlB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,KAAK,EAAE,aAAa,CAAC;gBAGnB,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EACpC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EACtC,KAAK,EAAE,aAAa;IAQtB,kBAAkB,IAAI,OAAO;IAK7B,sBAAsB,IAAI,OAAO;IAIjC,YAAY,IAAI,mBAAmB;IAInC;;OAEG;IACH,cAAc,IAAI,mBAAmB;IAUrC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAU/C,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAQhE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Platform } from 'expo-modules-core';
|
|
2
|
+
import { PixelRatio } from 'react-native';
|
|
3
|
+
// Returns the Metro dev server-specific asset location.
|
|
4
|
+
function getScaledAssetPath(asset) {
|
|
5
|
+
const scale = AssetSourceResolver.pickScale(asset.scales, PixelRatio.get());
|
|
6
|
+
const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x';
|
|
7
|
+
const type = !asset.type ? '' : `.${asset.type}`;
|
|
8
|
+
if (__DEV__) {
|
|
9
|
+
return asset.httpServerLocation + '/' + asset.name + scaleSuffix + type;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
return asset.httpServerLocation.replace(/\.\.\//g, '_') + '/' + asset.name + scaleSuffix + type;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export default class AssetSourceResolver {
|
|
16
|
+
serverUrl;
|
|
17
|
+
// where the jsbundle is being run from
|
|
18
|
+
// NOTE(EvanBacon): Never defined on web.
|
|
19
|
+
jsbundleUrl;
|
|
20
|
+
// the asset to resolve
|
|
21
|
+
asset;
|
|
22
|
+
constructor(serverUrl, jsbundleUrl, asset) {
|
|
23
|
+
this.serverUrl = serverUrl || 'https://expo.dev';
|
|
24
|
+
this.jsbundleUrl = null;
|
|
25
|
+
this.asset = asset;
|
|
26
|
+
}
|
|
27
|
+
// Always true for web runtimes
|
|
28
|
+
isLoadedFromServer() {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
// Always false for web runtimes
|
|
32
|
+
isLoadedFromFileSystem() {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
defaultAsset() {
|
|
36
|
+
return this.assetServerURL();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @returns absolute remote URL for the hosted asset.
|
|
40
|
+
*/
|
|
41
|
+
assetServerURL() {
|
|
42
|
+
const fromUrl = new URL(getScaledAssetPath(this.asset), this.serverUrl);
|
|
43
|
+
fromUrl.searchParams.set('platform', Platform.OS);
|
|
44
|
+
fromUrl.searchParams.set('hash', this.asset.hash);
|
|
45
|
+
return this.fromSource(
|
|
46
|
+
// Relative on web
|
|
47
|
+
fromUrl.toString().replace(fromUrl.origin, ''));
|
|
48
|
+
}
|
|
49
|
+
fromSource(source) {
|
|
50
|
+
return {
|
|
51
|
+
__packager_asset: true,
|
|
52
|
+
width: this.asset.width ?? undefined,
|
|
53
|
+
height: this.asset.height ?? undefined,
|
|
54
|
+
uri: source,
|
|
55
|
+
scale: AssetSourceResolver.pickScale(this.asset.scales, PixelRatio.get()),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
static pickScale(scales, deviceScale) {
|
|
59
|
+
for (let i = 0; i < scales.length; i++) {
|
|
60
|
+
if (scales[i] >= deviceScale) {
|
|
61
|
+
return scales[i];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return scales[scales.length - 1] || 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=AssetSourceResolver.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetSourceResolver.web.js","sourceRoot":"","sources":["../../src/utils/AssetSourceResolver.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform } from 'expo-modules-core';\nimport { PixelRatio } from 'react-native';\nimport { PackagerAsset } from 'react-native/Libraries/Image/AssetRegistry';\n\nexport type ResolvedAssetSource = {\n __packager_asset: boolean;\n width?: number;\n height?: number;\n uri: string;\n scale: number;\n};\n\n// Returns the Metro dev server-specific asset location.\nfunction getScaledAssetPath(asset): string {\n const scale = AssetSourceResolver.pickScale(asset.scales, PixelRatio.get());\n const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x';\n const type = !asset.type ? '' : `.${asset.type}`;\n if (__DEV__) {\n return asset.httpServerLocation + '/' + asset.name + scaleSuffix + type;\n } else {\n return asset.httpServerLocation.replace(/\\.\\.\\//g, '_') + '/' + asset.name + scaleSuffix + type;\n }\n}\n\nexport default class AssetSourceResolver {\n serverUrl: string;\n // where the jsbundle is being run from\n // NOTE(EvanBacon): Never defined on web.\n jsbundleUrl?: string | null;\n // the asset to resolve\n asset: PackagerAsset;\n\n constructor(\n serverUrl: string | undefined | null,\n jsbundleUrl: string | undefined | null,\n asset: PackagerAsset\n ) {\n this.serverUrl = serverUrl || 'https://expo.dev';\n this.jsbundleUrl = null;\n this.asset = asset;\n }\n\n // Always true for web runtimes\n isLoadedFromServer(): boolean {\n return true;\n }\n\n // Always false for web runtimes\n isLoadedFromFileSystem(): boolean {\n return false;\n }\n\n defaultAsset(): ResolvedAssetSource {\n return this.assetServerURL();\n }\n\n /**\n * @returns absolute remote URL for the hosted asset.\n */\n assetServerURL(): ResolvedAssetSource {\n const fromUrl = new URL(getScaledAssetPath(this.asset), this.serverUrl);\n fromUrl.searchParams.set('platform', Platform.OS);\n fromUrl.searchParams.set('hash', this.asset.hash);\n return this.fromSource(\n // Relative on web\n fromUrl.toString().replace(fromUrl.origin, '')\n );\n }\n\n fromSource(source: string): ResolvedAssetSource {\n return {\n __packager_asset: true,\n width: this.asset.width ?? undefined,\n height: this.asset.height ?? undefined,\n uri: source,\n scale: AssetSourceResolver.pickScale(this.asset.scales, PixelRatio.get()),\n };\n }\n\n static pickScale(scales: number[], deviceScale: number): number {\n for (let i = 0; i < scales.length; i++) {\n if (scales[i] >= deviceScale) {\n return scales[i];\n }\n }\n return scales[scales.length - 1] || 1;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base83.d.ts","sourceRoot":"","sources":["../../../src/utils/blurhash/base83.ts"],"names":[],"mappings":"AAsFA,eAAO,MAAM,QAAQ,QAAS,MAAM,WAQnC,CAAC;AAEF,eAAO,MAAM,QAAQ,MAAO,MAAM,UAAU,MAAM,KAAG,MAOpD,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
const digitCharacters = [
|
|
2
|
+
'0',
|
|
3
|
+
'1',
|
|
4
|
+
'2',
|
|
5
|
+
'3',
|
|
6
|
+
'4',
|
|
7
|
+
'5',
|
|
8
|
+
'6',
|
|
9
|
+
'7',
|
|
10
|
+
'8',
|
|
11
|
+
'9',
|
|
12
|
+
'A',
|
|
13
|
+
'B',
|
|
14
|
+
'C',
|
|
15
|
+
'D',
|
|
16
|
+
'E',
|
|
17
|
+
'F',
|
|
18
|
+
'G',
|
|
19
|
+
'H',
|
|
20
|
+
'I',
|
|
21
|
+
'J',
|
|
22
|
+
'K',
|
|
23
|
+
'L',
|
|
24
|
+
'M',
|
|
25
|
+
'N',
|
|
26
|
+
'O',
|
|
27
|
+
'P',
|
|
28
|
+
'Q',
|
|
29
|
+
'R',
|
|
30
|
+
'S',
|
|
31
|
+
'T',
|
|
32
|
+
'U',
|
|
33
|
+
'V',
|
|
34
|
+
'W',
|
|
35
|
+
'X',
|
|
36
|
+
'Y',
|
|
37
|
+
'Z',
|
|
38
|
+
'a',
|
|
39
|
+
'b',
|
|
40
|
+
'c',
|
|
41
|
+
'd',
|
|
42
|
+
'e',
|
|
43
|
+
'f',
|
|
44
|
+
'g',
|
|
45
|
+
'h',
|
|
46
|
+
'i',
|
|
47
|
+
'j',
|
|
48
|
+
'k',
|
|
49
|
+
'l',
|
|
50
|
+
'm',
|
|
51
|
+
'n',
|
|
52
|
+
'o',
|
|
53
|
+
'p',
|
|
54
|
+
'q',
|
|
55
|
+
'r',
|
|
56
|
+
's',
|
|
57
|
+
't',
|
|
58
|
+
'u',
|
|
59
|
+
'v',
|
|
60
|
+
'w',
|
|
61
|
+
'x',
|
|
62
|
+
'y',
|
|
63
|
+
'z',
|
|
64
|
+
'#',
|
|
65
|
+
'$',
|
|
66
|
+
'%',
|
|
67
|
+
'*',
|
|
68
|
+
'+',
|
|
69
|
+
',',
|
|
70
|
+
'-',
|
|
71
|
+
'.',
|
|
72
|
+
':',
|
|
73
|
+
';',
|
|
74
|
+
'=',
|
|
75
|
+
'?',
|
|
76
|
+
'@',
|
|
77
|
+
'[',
|
|
78
|
+
']',
|
|
79
|
+
'^',
|
|
80
|
+
'_',
|
|
81
|
+
'{',
|
|
82
|
+
'|',
|
|
83
|
+
'}',
|
|
84
|
+
'~',
|
|
85
|
+
];
|
|
86
|
+
export const decode83 = (str) => {
|
|
87
|
+
let value = 0;
|
|
88
|
+
for (let i = 0; i < str.length; i++) {
|
|
89
|
+
const c = str[i];
|
|
90
|
+
const digit = digitCharacters.indexOf(c);
|
|
91
|
+
value = value * 83 + digit;
|
|
92
|
+
}
|
|
93
|
+
return value;
|
|
94
|
+
};
|
|
95
|
+
export const encode83 = (n, length) => {
|
|
96
|
+
let result = '';
|
|
97
|
+
for (let i = 1; i <= length; i++) {
|
|
98
|
+
const digit = (Math.floor(n) / Math.pow(83, length - i)) % 83;
|
|
99
|
+
result += digitCharacters[Math.floor(digit)];
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=base83.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base83.js","sourceRoot":"","sources":["../../../src/utils/blurhash/base83.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG;IACtB,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;IACtC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzC,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,MAAc,EAAU,EAAE;IAC5D,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9D,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["const digitCharacters = [\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F',\n 'G',\n 'H',\n 'I',\n 'J',\n 'K',\n 'L',\n 'M',\n 'N',\n 'O',\n 'P',\n 'Q',\n 'R',\n 'S',\n 'T',\n 'U',\n 'V',\n 'W',\n 'X',\n 'Y',\n 'Z',\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'f',\n 'g',\n 'h',\n 'i',\n 'j',\n 'k',\n 'l',\n 'm',\n 'n',\n 'o',\n 'p',\n 'q',\n 'r',\n 's',\n 't',\n 'u',\n 'v',\n 'w',\n 'x',\n 'y',\n 'z',\n '#',\n '$',\n '%',\n '*',\n '+',\n ',',\n '-',\n '.',\n ':',\n ';',\n '=',\n '?',\n '@',\n '[',\n ']',\n '^',\n '_',\n '{',\n '|',\n '}',\n '~',\n];\n\nexport const decode83 = (str: string) => {\n let value = 0;\n for (let i = 0; i < str.length; i++) {\n const c = str[i];\n const digit = digitCharacters.indexOf(c);\n value = value * 83 + digit;\n }\n return value;\n};\n\nexport const encode83 = (n: number, length: number): string => {\n let result = '';\n for (let i = 1; i <= length; i++) {\n const digit = (Math.floor(n) / Math.pow(83, length - i)) % 83;\n result += digitCharacters[Math.floor(digit)];\n }\n return result;\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const isBlurhashValid: (blurhash: string) => {
|
|
2
|
+
result: boolean;
|
|
3
|
+
errorReason?: string;
|
|
4
|
+
};
|
|
5
|
+
declare const decode: (blurhash: string, width: number, height: number, punch?: number) => Uint8ClampedArray<ArrayBuffer>;
|
|
6
|
+
export default decode;
|
|
7
|
+
//# sourceMappingURL=decode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../../src/utils/blurhash/decode.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAQzF,CAAC;AAuBF,QAAA,MAAM,MAAM,aAAc,MAAM,SAAS,MAAM,UAAU,MAAM,UAAU,MAAM,mCAsD9E,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { decode83 } from './base83';
|
|
2
|
+
import { ValidationError } from './error';
|
|
3
|
+
import { sRGBToLinear, signPow, linearTosRGB } from './utils';
|
|
4
|
+
/**
|
|
5
|
+
* Returns an error message if invalid or undefined if valid
|
|
6
|
+
* @param blurhash
|
|
7
|
+
*/
|
|
8
|
+
const validateBlurhash = (blurhash) => {
|
|
9
|
+
if (!blurhash || blurhash.length < 6) {
|
|
10
|
+
throw new ValidationError('The blurhash string must be at least 6 characters');
|
|
11
|
+
}
|
|
12
|
+
const sizeFlag = decode83(blurhash[0]);
|
|
13
|
+
const numY = Math.floor(sizeFlag / 9) + 1;
|
|
14
|
+
const numX = (sizeFlag % 9) + 1;
|
|
15
|
+
if (blurhash.length !== 4 + 2 * numX * numY) {
|
|
16
|
+
throw new ValidationError(`blurhash length mismatch: length is ${blurhash.length} but it should be ${4 + 2 * numX * numY}`);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const isBlurhashValid = (blurhash) => {
|
|
20
|
+
try {
|
|
21
|
+
validateBlurhash(blurhash);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
return { result: false, errorReason: error.message };
|
|
25
|
+
}
|
|
26
|
+
return { result: true };
|
|
27
|
+
};
|
|
28
|
+
const decodeDC = (value) => {
|
|
29
|
+
const intR = value >> 16;
|
|
30
|
+
const intG = (value >> 8) & 255;
|
|
31
|
+
const intB = value & 255;
|
|
32
|
+
return [sRGBToLinear(intR), sRGBToLinear(intG), sRGBToLinear(intB)];
|
|
33
|
+
};
|
|
34
|
+
const decodeAC = (value, maximumValue) => {
|
|
35
|
+
const quantR = Math.floor(value / (19 * 19));
|
|
36
|
+
const quantG = Math.floor(value / 19) % 19;
|
|
37
|
+
const quantB = value % 19;
|
|
38
|
+
const rgb = [
|
|
39
|
+
signPow((quantR - 9) / 9, 2.0) * maximumValue,
|
|
40
|
+
signPow((quantG - 9) / 9, 2.0) * maximumValue,
|
|
41
|
+
signPow((quantB - 9) / 9, 2.0) * maximumValue,
|
|
42
|
+
];
|
|
43
|
+
return rgb;
|
|
44
|
+
};
|
|
45
|
+
const decode = (blurhash, width, height, punch) => {
|
|
46
|
+
validateBlurhash(blurhash);
|
|
47
|
+
punch = (punch || 1) | 1;
|
|
48
|
+
const sizeFlag = decode83(blurhash[0]);
|
|
49
|
+
const numY = Math.floor(sizeFlag / 9) + 1;
|
|
50
|
+
const numX = (sizeFlag % 9) + 1;
|
|
51
|
+
const quantisedMaximumValue = decode83(blurhash[1]);
|
|
52
|
+
const maximumValue = (quantisedMaximumValue + 1) / 166;
|
|
53
|
+
const colors = new Array(numX * numY);
|
|
54
|
+
for (let i = 0; i < colors.length; i++) {
|
|
55
|
+
if (i === 0) {
|
|
56
|
+
const value = decode83(blurhash.substring(2, 6));
|
|
57
|
+
colors[i] = decodeDC(value);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const value = decode83(blurhash.substring(4 + i * 2, 6 + i * 2));
|
|
61
|
+
colors[i] = decodeAC(value, maximumValue * punch);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const bytesPerRow = width * 4;
|
|
65
|
+
const pixels = new Uint8ClampedArray(bytesPerRow * height);
|
|
66
|
+
for (let y = 0; y < height; y++) {
|
|
67
|
+
for (let x = 0; x < width; x++) {
|
|
68
|
+
let r = 0;
|
|
69
|
+
let g = 0;
|
|
70
|
+
let b = 0;
|
|
71
|
+
for (let j = 0; j < numY; j++) {
|
|
72
|
+
for (let i = 0; i < numX; i++) {
|
|
73
|
+
const basis = Math.cos((Math.PI * x * i) / width) * Math.cos((Math.PI * y * j) / height);
|
|
74
|
+
const color = colors[i + j * numX];
|
|
75
|
+
r += color[0] * basis;
|
|
76
|
+
g += color[1] * basis;
|
|
77
|
+
b += color[2] * basis;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const intR = linearTosRGB(r);
|
|
81
|
+
const intG = linearTosRGB(g);
|
|
82
|
+
const intB = linearTosRGB(b);
|
|
83
|
+
pixels[4 * x + 0 + y * bytesPerRow] = intR;
|
|
84
|
+
pixels[4 * x + 1 + y * bytesPerRow] = intG;
|
|
85
|
+
pixels[4 * x + 2 + y * bytesPerRow] = intB;
|
|
86
|
+
pixels[4 * x + 3 + y * bytesPerRow] = 255; // alpha
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return pixels;
|
|
90
|
+
};
|
|
91
|
+
export default decode;
|
|
92
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../src/utils/blurhash/decode.ts"],"names":[],"mappings":"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","sourcesContent":["import { decode83 } from './base83';\nimport { ValidationError } from './error';\nimport { sRGBToLinear, signPow, linearTosRGB } from './utils';\n\n/**\n * Returns an error message if invalid or undefined if valid\n * @param blurhash\n */\nconst validateBlurhash = (blurhash: string) => {\n if (!blurhash || blurhash.length < 6) {\n throw new ValidationError('The blurhash string must be at least 6 characters');\n }\n\n const sizeFlag = decode83(blurhash[0]);\n const numY = Math.floor(sizeFlag / 9) + 1;\n const numX = (sizeFlag % 9) + 1;\n\n if (blurhash.length !== 4 + 2 * numX * numY) {\n throw new ValidationError(\n `blurhash length mismatch: length is ${blurhash.length} but it should be ${\n 4 + 2 * numX * numY\n }`\n );\n }\n};\n\nexport const isBlurhashValid = (blurhash: string): { result: boolean; errorReason?: string } => {\n try {\n validateBlurhash(blurhash);\n } catch (error) {\n return { result: false, errorReason: error.message };\n }\n\n return { result: true };\n};\n\nconst decodeDC = (value: number) => {\n const intR = value >> 16;\n const intG = (value >> 8) & 255;\n const intB = value & 255;\n return [sRGBToLinear(intR), sRGBToLinear(intG), sRGBToLinear(intB)];\n};\n\nconst decodeAC = (value: number, maximumValue: number) => {\n const quantR = Math.floor(value / (19 * 19));\n const quantG = Math.floor(value / 19) % 19;\n const quantB = value % 19;\n\n const rgb = [\n signPow((quantR - 9) / 9, 2.0) * maximumValue,\n signPow((quantG - 9) / 9, 2.0) * maximumValue,\n signPow((quantB - 9) / 9, 2.0) * maximumValue,\n ];\n\n return rgb;\n};\n\nconst decode = (blurhash: string, width: number, height: number, punch?: number) => {\n validateBlurhash(blurhash);\n\n punch = (punch || 1) | 1;\n\n const sizeFlag = decode83(blurhash[0]);\n const numY = Math.floor(sizeFlag / 9) + 1;\n const numX = (sizeFlag % 9) + 1;\n\n const quantisedMaximumValue = decode83(blurhash[1]);\n const maximumValue = (quantisedMaximumValue + 1) / 166;\n\n const colors = new Array(numX * numY);\n\n for (let i = 0; i < colors.length; i++) {\n if (i === 0) {\n const value = decode83(blurhash.substring(2, 6));\n colors[i] = decodeDC(value);\n } else {\n const value = decode83(blurhash.substring(4 + i * 2, 6 + i * 2));\n colors[i] = decodeAC(value, maximumValue * punch);\n }\n }\n\n const bytesPerRow = width * 4;\n const pixels = new Uint8ClampedArray(bytesPerRow * height);\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n let r = 0;\n let g = 0;\n let b = 0;\n\n for (let j = 0; j < numY; j++) {\n for (let i = 0; i < numX; i++) {\n const basis = Math.cos((Math.PI * x * i) / width) * Math.cos((Math.PI * y * j) / height);\n const color = colors[i + j * numX];\n r += color[0] * basis;\n g += color[1] * basis;\n b += color[2] * basis;\n }\n }\n\n const intR = linearTosRGB(r);\n const intG = linearTosRGB(g);\n const intB = linearTosRGB(b);\n\n pixels[4 * x + 0 + y * bytesPerRow] = intR;\n pixels[4 * x + 1 + y * bytesPerRow] = intG;\n pixels[4 * x + 2 + y * bytesPerRow] = intB;\n pixels[4 * x + 3 + y * bytesPerRow] = 255; // alpha\n }\n }\n return pixels;\n};\n\nexport default decode;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/utils/blurhash/error.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAK5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/utils/blurhash/error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF","sourcesContent":["export class ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n this.message = message;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBlurhash.d.ts","sourceRoot":"","sources":["../../../src/utils/blurhash/useBlurhash.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,WAAW,CACzB,QAAQ,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAAG,IAAI,EAC9E,KAAK,GAAE,MAAU;;SA6DlB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// adapted from https://gist.github.com/ngbrown/d62eb518753378eb0a9bf02bb4723235
|
|
2
|
+
// modified from https://gist.github.com/WorldMaker/a3cbe0059acd827edee568198376b95a
|
|
3
|
+
// https://github.com/woltapp/react-blurhash/issues/3
|
|
4
|
+
import { useEffect, useState, useMemo } from 'react';
|
|
5
|
+
import decode from './decode';
|
|
6
|
+
import { isBlurhashString } from '../resolveSources';
|
|
7
|
+
const DEFAULT_SIZE = {
|
|
8
|
+
width: 32,
|
|
9
|
+
height: 32,
|
|
10
|
+
};
|
|
11
|
+
// We scale up the canvas to avoid an irritating visual glitch when animating in Chrome.
|
|
12
|
+
const scaleRatio = 10;
|
|
13
|
+
export function useBlurhash(blurhash, punch = 1) {
|
|
14
|
+
punch = punch || 1;
|
|
15
|
+
const [uri, setUri] = useState(null);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
let isCanceled = false;
|
|
18
|
+
if (!blurhash || !blurhash.uri || !isBlurhashString(blurhash.uri))
|
|
19
|
+
return;
|
|
20
|
+
const pixels = decode(blurhash.uri, blurhash?.width ?? DEFAULT_SIZE.width, blurhash?.height ?? DEFAULT_SIZE.height, punch);
|
|
21
|
+
const canvas = document.createElement('canvas');
|
|
22
|
+
const upscaledCanvas = document.createElement('canvas');
|
|
23
|
+
canvas.width = blurhash?.width ?? DEFAULT_SIZE.width;
|
|
24
|
+
canvas.height = blurhash?.height ?? DEFAULT_SIZE.height;
|
|
25
|
+
upscaledCanvas.width = (blurhash?.width ?? DEFAULT_SIZE.width) * scaleRatio;
|
|
26
|
+
upscaledCanvas.height = (blurhash?.height ?? DEFAULT_SIZE.height) * scaleRatio;
|
|
27
|
+
const context = canvas.getContext('2d');
|
|
28
|
+
if (!context) {
|
|
29
|
+
console.warn('Failed to decode blurhash');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const imageData = context.createImageData(canvas.width, canvas.height);
|
|
33
|
+
imageData.data.set(pixels);
|
|
34
|
+
context.putImageData(imageData, 0, 0);
|
|
35
|
+
const upscaledContext = upscaledCanvas.getContext('2d');
|
|
36
|
+
if (!upscaledContext) {
|
|
37
|
+
console.warn('Failed to decode blurhash');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
upscaledContext.scale(scaleRatio, scaleRatio);
|
|
41
|
+
upscaledContext.drawImage(canvas, 0, 0);
|
|
42
|
+
upscaledCanvas.toBlob((blob) => {
|
|
43
|
+
if (!isCanceled) {
|
|
44
|
+
setUri((oldUrl) => {
|
|
45
|
+
if (oldUrl) {
|
|
46
|
+
URL.revokeObjectURL(oldUrl);
|
|
47
|
+
}
|
|
48
|
+
return blob ? URL.createObjectURL(blob) : oldUrl;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return function cleanupBlurhash() {
|
|
53
|
+
isCanceled = true;
|
|
54
|
+
setUri((oldUrl) => {
|
|
55
|
+
if (oldUrl) {
|
|
56
|
+
URL.revokeObjectURL(oldUrl);
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
}, [blurhash?.uri, blurhash?.height, blurhash?.width, punch]);
|
|
62
|
+
return useMemo(() => (uri ? { uri } : null), [uri]);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=useBlurhash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBlurhash.js","sourceRoot":"","sources":["../../../src/utils/blurhash/useBlurhash.tsx"],"names":[],"mappings":"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","sourcesContent":["// adapted from https://gist.github.com/ngbrown/d62eb518753378eb0a9bf02bb4723235\n// modified from https://gist.github.com/WorldMaker/a3cbe0059acd827edee568198376b95a\n// https://github.com/woltapp/react-blurhash/issues/3\n\nimport { useEffect, useState, useMemo } from 'react';\n\nimport decode from './decode';\nimport { isBlurhashString } from '../resolveSources';\n\nconst DEFAULT_SIZE = {\n width: 32,\n height: 32,\n};\n\n// We scale up the canvas to avoid an irritating visual glitch when animating in Chrome.\nconst scaleRatio = 10;\n\nexport function useBlurhash(\n blurhash: { uri?: string; width?: number; height?: number } | undefined | null,\n punch: number = 1\n) {\n punch = punch || 1;\n\n const [uri, setUri] = useState<string | null>(null);\n\n useEffect(() => {\n let isCanceled = false;\n\n if (!blurhash || !blurhash.uri || !isBlurhashString(blurhash.uri)) return;\n\n const pixels = decode(\n blurhash.uri,\n blurhash?.width ?? DEFAULT_SIZE.width,\n blurhash?.height ?? DEFAULT_SIZE.height,\n punch\n );\n\n const canvas = document.createElement('canvas');\n const upscaledCanvas = document.createElement('canvas');\n canvas.width = blurhash?.width ?? DEFAULT_SIZE.width;\n canvas.height = blurhash?.height ?? DEFAULT_SIZE.height;\n upscaledCanvas.width = (blurhash?.width ?? DEFAULT_SIZE.width) * scaleRatio;\n upscaledCanvas.height = (blurhash?.height ?? DEFAULT_SIZE.height) * scaleRatio;\n const context = canvas.getContext('2d');\n if (!context) {\n console.warn('Failed to decode blurhash');\n return;\n }\n const imageData = context.createImageData(canvas.width, canvas.height);\n imageData.data.set(pixels);\n context.putImageData(imageData, 0, 0);\n const upscaledContext = upscaledCanvas.getContext('2d');\n if (!upscaledContext) {\n console.warn('Failed to decode blurhash');\n return;\n }\n upscaledContext.scale(scaleRatio, scaleRatio);\n upscaledContext.drawImage(canvas, 0, 0);\n upscaledCanvas.toBlob((blob) => {\n if (!isCanceled) {\n setUri((oldUrl) => {\n if (oldUrl) {\n URL.revokeObjectURL(oldUrl);\n }\n return blob ? URL.createObjectURL(blob) : oldUrl;\n });\n }\n });\n\n return function cleanupBlurhash() {\n isCanceled = true;\n setUri((oldUrl) => {\n if (oldUrl) {\n URL.revokeObjectURL(oldUrl);\n }\n return null;\n });\n };\n }, [blurhash?.uri, blurhash?.height, blurhash?.width, punch]);\n return useMemo(() => (uri ? { uri } : null), [uri]);\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const sRGBToLinear: (value: number) => number;
|
|
2
|
+
export declare const linearTosRGB: (value: number) => number;
|
|
3
|
+
export declare const sign: (n: number) => 1 | -1;
|
|
4
|
+
export declare const signPow: (val: number, exp: number) => number;
|
|
5
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/utils/blurhash/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,UAAW,MAAM,WAOzC,CAAC;AAEF,eAAO,MAAM,YAAY,UAAW,MAAM,WAOzC,CAAC;AAEF,eAAO,MAAM,IAAI,MAAO,MAAM,WAAqB,CAAC;AAEpD,eAAO,MAAM,OAAO,QAAS,MAAM,OAAO,MAAM,WAA6C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const sRGBToLinear = (value) => {
|
|
2
|
+
const v = value / 255;
|
|
3
|
+
if (v <= 0.04045) {
|
|
4
|
+
return v / 12.92;
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
return Math.pow((v + 0.055) / 1.055, 2.4);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
export const linearTosRGB = (value) => {
|
|
11
|
+
const v = Math.max(0, Math.min(1, value));
|
|
12
|
+
if (v <= 0.0031308) {
|
|
13
|
+
return Math.trunc(v * 12.92 * 255 + 0.5);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
return Math.trunc((1.055 * Math.pow(v, 1 / 2.4) - 0.055) * 255 + 0.5);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const sign = (n) => (n < 0 ? -1 : 1);
|
|
20
|
+
export const signPow = (val, exp) => sign(val) * Math.pow(Math.abs(val), exp);
|
|
21
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/blurhash/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;IAC5C,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;IACtB,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;IAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACxE,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC","sourcesContent":["export const sRGBToLinear = (value: number) => {\n const v = value / 255;\n if (v <= 0.04045) {\n return v / 12.92;\n } else {\n return Math.pow((v + 0.055) / 1.055, 2.4);\n }\n};\n\nexport const linearTosRGB = (value: number) => {\n const v = Math.max(0, Math.min(1, value));\n if (v <= 0.0031308) {\n return Math.trunc(v * 12.92 * 255 + 0.5);\n } else {\n return Math.trunc((1.055 * Math.pow(v, 1 / 2.4) - 0.055) * 255 + 0.5);\n }\n};\n\nexport const sign = (n: number) => (n < 0 ? -1 : 1);\n\nexport const signPow = (val: number, exp: number) => sign(val) * Math.pow(Math.abs(val), exp);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveAssetSource.d.ts","sourceRoot":"","sources":["../../src/utils/resolveAssetSource.tsx"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,iDAAiD,CAAC;AAEjF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveAssetSource.js","sourceRoot":"","sources":["../../src/utils/resolveAssetSource.tsx"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,iDAAiD,CAAC;AAEjF,eAAe,kBAAkB,CAAC","sourcesContent":["import resolveAssetSource from 'react-native/Libraries/Image/resolveAssetSource';\n\nexport default resolveAssetSource;\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import AssetSourceResolver, { ResolvedAssetSource } from './AssetSourceResolver.web';
|
|
2
|
+
export declare function setCustomSourceTransformer(transformer: (resolver: AssetSourceResolver) => ResolvedAssetSource): void;
|
|
3
|
+
/**
|
|
4
|
+
* `source` is either a number (opaque type returned by require('./foo.png'))
|
|
5
|
+
* or an `ImageSource` like { uri: '<http location || file path>' }
|
|
6
|
+
*/
|
|
7
|
+
export default function resolveAssetSource(source: any): ResolvedAssetSource | undefined;
|
|
8
|
+
export declare const pickScale: typeof AssetSourceResolver.pickScale;
|
|
9
|
+
//# sourceMappingURL=resolveAssetSource.web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveAssetSource.web.d.ts","sourceRoot":"","sources":["../../src/utils/resolveAssetSource.web.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,EAAE,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrF,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,mBAAmB,GAClE,IAAI,CAEN;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,mBAAmB,GAAG,SAAS,CAevF;AAQD,eAAO,MAAQ,SAAS,sCAAwB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getAssetByID } from 'react-native/Libraries/Image/AssetRegistry';
|
|
2
|
+
import AssetSourceResolver from './AssetSourceResolver.web';
|
|
3
|
+
let _customSourceTransformer;
|
|
4
|
+
export function setCustomSourceTransformer(transformer) {
|
|
5
|
+
_customSourceTransformer = transformer;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* `source` is either a number (opaque type returned by require('./foo.png'))
|
|
9
|
+
* or an `ImageSource` like { uri: '<http location || file path>' }
|
|
10
|
+
*/
|
|
11
|
+
export default function resolveAssetSource(source) {
|
|
12
|
+
if (typeof source === 'object') {
|
|
13
|
+
return source;
|
|
14
|
+
}
|
|
15
|
+
const asset = getAssetByID(source);
|
|
16
|
+
if (!asset) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const resolver = new AssetSourceResolver('https://expo.dev', null, asset);
|
|
20
|
+
if (_customSourceTransformer) {
|
|
21
|
+
return _customSourceTransformer(resolver);
|
|
22
|
+
}
|
|
23
|
+
return resolver.defaultAsset();
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(resolveAssetSource, 'setCustomSourceTransformer', {
|
|
26
|
+
get() {
|
|
27
|
+
return setCustomSourceTransformer;
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
export const { pickScale } = AssetSourceResolver;
|
|
31
|
+
//# sourceMappingURL=resolveAssetSource.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveAssetSource.web.js","sourceRoot":"","sources":["../../src/utils/resolveAssetSource.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAE1E,OAAO,mBAA4C,MAAM,2BAA2B,CAAC;AAErF,IAAI,wBAAwB,CAAC;AAE7B,MAAM,UAAU,0BAA0B,CACxC,WAAmE;IAEnE,wBAAwB,GAAG,WAAW,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,MAAW;IACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1E,IAAI,wBAAwB,EAAE,CAAC;QAC7B,OAAO,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,cAAc,CAAC,kBAAkB,EAAE,4BAA4B,EAAE;IACtE,GAAG;QACD,OAAO,0BAA0B,CAAC;IACpC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC","sourcesContent":["import { getAssetByID } from 'react-native/Libraries/Image/AssetRegistry';\n\nimport AssetSourceResolver, { ResolvedAssetSource } from './AssetSourceResolver.web';\n\nlet _customSourceTransformer;\n\nexport function setCustomSourceTransformer(\n transformer: (resolver: AssetSourceResolver) => ResolvedAssetSource\n): void {\n _customSourceTransformer = transformer;\n}\n\n/**\n * `source` is either a number (opaque type returned by require('./foo.png'))\n * or an `ImageSource` like { uri: '<http location || file path>' }\n */\nexport default function resolveAssetSource(source: any): ResolvedAssetSource | undefined {\n if (typeof source === 'object') {\n return source;\n }\n\n const asset = getAssetByID(source);\n if (!asset) {\n return undefined;\n }\n\n const resolver = new AssetSourceResolver('https://expo.dev', null, asset);\n if (_customSourceTransformer) {\n return _customSourceTransformer(resolver);\n }\n return resolver.defaultAsset();\n}\n\nObject.defineProperty(resolveAssetSource, 'setCustomSourceTransformer', {\n get() {\n return setCustomSourceTransformer;\n },\n});\n\nexport const { pickScale } = AssetSourceResolver;\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ImageSource } from '../Image.types';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a blurhash string (`blurhash:/<hash>/<width>/<height>` or <hash>/<width>/<height>) into an `ImageSource`.
|
|
4
|
+
*
|
|
5
|
+
* @return An ImageSource representing the provided blurhash.
|
|
6
|
+
* */
|
|
7
|
+
export declare function resolveBlurhashString(str: string): ImageSource;
|
|
8
|
+
/**
|
|
9
|
+
* Converts a thumbhash string (`thumbhash:/<hash>` or `<hash>`) into an `ImageSource`.
|
|
10
|
+
*
|
|
11
|
+
* @return An ImageSource representing the provided thumbhash.
|
|
12
|
+
* */
|
|
13
|
+
export declare function resolveThumbhashString(str: string): ImageSource;
|
|
14
|
+
//# sourceMappingURL=resolveHashString.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveHashString.d.ts","sourceRoot":"","sources":["../../src/utils/resolveHashString.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAS7C;;;;KAIK;AACL,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAO9D;AAED;;;;KAIK;AACL,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAO/D"}
|