@shopify/react-native-skia 0.1.185 → 0.1.187
Sign up to get free protection for your applications and to get access to all the features.
- package/android/build.gradle +2 -1
- package/android/cpp/jni/JniPlatformContext.cpp +92 -3
- package/android/cpp/jni/include/JniPlatformContext.h +4 -0
- package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +8 -0
- package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java +17 -1
- package/android/src/main/java/com/shopify/reactnative/skia/ViewScreenshotService.java +180 -0
- package/cpp/api/JsiSkFont.h +1 -1
- package/cpp/api/JsiSkHostObjects.h +1 -1
- package/cpp/api/JsiSkImage.h +1 -1
- package/cpp/api/JsiSkImageFactory.h +29 -0
- package/cpp/api/JsiSkPaint.h +7 -7
- package/cpp/api/JsiSkPathFactory.h +1 -1
- package/cpp/api/JsiSkPicture.h +2 -2
- package/cpp/api/JsiSkRuntimeEffect.h +3 -3
- package/cpp/api/JsiSkSVG.h +12 -2
- package/cpp/api/JsiSkShader.h +1 -1
- package/cpp/api/JsiSkSurface.h +3 -3
- package/cpp/api/JsiSkSurfaceFactory.h +1 -1
- package/cpp/api/JsiSkTypeface.h +1 -1
- package/cpp/rnskia/RNSkAnimation.h +3 -3
- package/cpp/rnskia/RNSkDomView.h +9 -9
- package/cpp/rnskia/RNSkInfoParameter.h +2 -2
- package/cpp/rnskia/RNSkJsView.h +8 -8
- package/cpp/rnskia/RNSkJsiViewApi.h +5 -5
- package/cpp/rnskia/RNSkPictureView.h +8 -8
- package/cpp/rnskia/RNSkPlatformContext.h +32 -3
- package/cpp/rnskia/RNSkValueApi.h +5 -5
- package/cpp/rnskia/RNSkView.h +6 -6
- package/cpp/rnskia/dom/base/ConcatablePaint.h +6 -6
- package/cpp/rnskia/dom/base/Declaration.h +1 -1
- package/cpp/rnskia/dom/base/DeclarationContext.h +7 -7
- package/cpp/rnskia/dom/base/DrawingContext.h +3 -3
- package/cpp/rnskia/dom/base/NodePropsContainer.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiBlurMaskNode.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiColorFilterNodes.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiGlyphsNode.h +8 -7
- package/cpp/rnskia/dom/nodes/JsiImageFilterNodes.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiImageNode.h +5 -2
- package/cpp/rnskia/dom/nodes/JsiImageSvgNode.h +9 -9
- package/cpp/rnskia/dom/nodes/JsiPathEffectNodes.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiPathNode.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiPointsNode.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiShaderNodes.h +7 -3
- package/cpp/rnskia/dom/nodes/JsiTextNode.h +5 -4
- package/cpp/rnskia/dom/nodes/JsiTextPathNode.h +3 -1
- package/cpp/rnskia/dom/props/BlendModeProp.h +1 -1
- package/cpp/rnskia/dom/props/CircleProp.h +1 -1
- package/cpp/rnskia/dom/props/ClipProp.h +1 -1
- package/cpp/rnskia/dom/props/FontProp.h +15 -10
- package/cpp/rnskia/dom/props/ImageProps.h +30 -16
- package/cpp/rnskia/dom/props/PaintProps.h +1 -1
- package/cpp/rnskia/dom/props/PathProp.h +1 -1
- package/cpp/rnskia/dom/props/PointProp.h +1 -1
- package/cpp/rnskia/dom/props/PointsProp.h +1 -1
- package/cpp/rnskia/dom/props/RRectProp.h +2 -2
- package/cpp/rnskia/dom/props/RadiusProp.h +1 -1
- package/cpp/rnskia/dom/props/RectProp.h +1 -1
- package/cpp/rnskia/dom/props/StrokeProps.h +1 -1
- package/cpp/rnskia/dom/props/SvgProp.h +18 -12
- package/cpp/rnskia/dom/props/TextBlobProp.h +60 -57
- package/cpp/rnskia/dom/props/TileModeProp.h +1 -1
- package/cpp/rnskia/dom/props/UniformsProp.h +1 -1
- package/cpp/rnskia/dom/props/VertexModeProp.h +1 -1
- package/cpp/rnskia/dom/props/VerticesProps.h +1 -1
- package/cpp/rnskia/values/RNSkClockValue.h +2 -2
- package/cpp/rnskia/values/RNSkComputedValue.h +1 -1
- package/cpp/rnskia/values/RNSkReadonlyValue.h +3 -3
- package/cpp/rnskia/values/RNSkValue.h +4 -4
- package/cpp/utils/RNSkMeasureTime.h +1 -1
- package/cpp/utils/RNSkTimingInfo.h +1 -1
- package/globalJestSetup.js +6 -0
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +16 -13
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +8 -0
- package/ios/RNSkia-iOS/SkiaManager.mm +20 -1
- package/ios/RNSkia-iOS/ViewScreenshotService.h +21 -0
- package/ios/RNSkia-iOS/ViewScreenshotService.mm +79 -0
- package/jestSetup.js +2 -3
- package/lib/commonjs/dom/nodes/drawings/ImageNode.js +22 -1
- package/lib/commonjs/dom/nodes/drawings/ImageNode.js.map +1 -1
- package/lib/commonjs/dom/nodes/drawings/ImageSVG.js +5 -0
- package/lib/commonjs/dom/nodes/drawings/ImageSVG.js.map +1 -1
- package/lib/commonjs/dom/nodes/drawings/Text.d.ts +2 -2
- package/lib/commonjs/dom/nodes/drawings/Text.js +13 -2
- package/lib/commonjs/dom/nodes/drawings/Text.js.map +1 -1
- package/lib/commonjs/dom/nodes/paint/Shaders.js +5 -0
- package/lib/commonjs/dom/nodes/paint/Shaders.js.map +1 -1
- package/lib/commonjs/dom/types/Drawings.d.ts +5 -5
- package/lib/commonjs/dom/types/Drawings.js.map +1 -1
- package/lib/commonjs/dom/types/Shaders.d.ts +1 -1
- package/lib/commonjs/dom/types/Shaders.js.map +1 -1
- package/lib/commonjs/mock/index.d.ts +2 -15
- package/lib/commonjs/mock/index.js +37 -110
- package/lib/commonjs/mock/index.js.map +1 -1
- package/lib/commonjs/skia/core/Image.d.ts +14 -2
- package/lib/commonjs/skia/core/Image.js +37 -1
- package/lib/commonjs/skia/core/Image.js.map +1 -1
- package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +7 -0
- package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/commonjs/skia/types/SVG/SVG.d.ts +4 -1
- package/lib/commonjs/skia/types/SVG/SVG.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -1
- package/lib/commonjs/skia/web/JsiSkImageFactory.js +7 -0
- package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/module/dom/nodes/drawings/ImageNode.js +22 -1
- package/lib/module/dom/nodes/drawings/ImageNode.js.map +1 -1
- package/lib/module/dom/nodes/drawings/ImageSVG.js +5 -0
- package/lib/module/dom/nodes/drawings/ImageSVG.js.map +1 -1
- package/lib/module/dom/nodes/drawings/Text.d.ts +2 -2
- package/lib/module/dom/nodes/drawings/Text.js +13 -2
- package/lib/module/dom/nodes/drawings/Text.js.map +1 -1
- package/lib/module/dom/nodes/paint/Shaders.js +5 -0
- package/lib/module/dom/nodes/paint/Shaders.js.map +1 -1
- package/lib/module/dom/types/Drawings.d.ts +5 -5
- package/lib/module/dom/types/Drawings.js.map +1 -1
- package/lib/module/dom/types/Shaders.d.ts +1 -1
- package/lib/module/dom/types/Shaders.js.map +1 -1
- package/lib/module/mock/index.d.ts +2 -15
- package/lib/module/mock/index.js +33 -95
- package/lib/module/mock/index.js.map +1 -1
- package/lib/module/skia/core/Image.d.ts +14 -2
- package/lib/module/skia/core/Image.js +32 -0
- package/lib/module/skia/core/Image.js.map +1 -1
- package/lib/module/skia/types/Image/ImageFactory.d.ts +7 -0
- package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/module/skia/types/SVG/SVG.d.ts +4 -1
- package/lib/module/skia/types/SVG/SVG.js.map +1 -1
- package/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -1
- package/lib/module/skia/web/JsiSkImageFactory.js +7 -0
- package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/typescript/globalJestSetup.d.ts +2 -0
- package/lib/typescript/src/dom/nodes/drawings/Text.d.ts +2 -2
- package/lib/typescript/src/dom/types/Drawings.d.ts +5 -5
- package/lib/typescript/src/dom/types/Shaders.d.ts +1 -1
- package/lib/typescript/src/mock/index.d.ts +2 -15
- package/lib/typescript/src/skia/core/Image.d.ts +14 -2
- package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +7 -0
- package/lib/typescript/src/skia/types/SVG/SVG.d.ts +4 -1
- package/lib/typescript/src/skia/web/JsiSkImageFactory.d.ts +2 -1
- package/package.json +3 -2
- package/scripts/install-npm.js +3 -2
- package/src/dom/nodes/drawings/ImageNode.ts +9 -1
- package/src/dom/nodes/drawings/ImageSVG.ts +3 -0
- package/src/dom/nodes/drawings/Text.ts +13 -3
- package/src/dom/nodes/paint/Shaders.ts +4 -0
- package/src/dom/types/Drawings.ts +5 -5
- package/src/dom/types/Shaders.ts +1 -1
- package/src/mock/index.ts +35 -98
- package/src/skia/core/Image.ts +43 -1
- package/src/skia/types/Image/ImageFactory.ts +8 -0
- package/src/skia/types/SVG/SVG.ts +4 -1
- package/src/skia/web/JsiSkImageFactory.ts +8 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["Skia","useRawData","imgFactory","Image","MakeImageFromEncoded","bind","useImage","source","onError"],"sources":["Image.ts"],"sourcesContent":["import { Skia } from \"../Skia\";\nimport type { DataSourceParam } from \"../types\";\n\nimport { useRawData } from \"./Data\";\n\nconst imgFactory = Skia.Image.MakeImageFromEncoded.bind(Skia.Image);\n\n/**\n * Returns a Skia Image object\n * */\nexport const useImage = (\n source: DataSourceParam,\n onError?: (err: Error) => void\n) => useRawData(source, imgFactory, onError);\n"],"mappings":"AAAA,SAASA,IAAT,QAAqB,SAArB;AAGA,SAASC,UAAT,QAA2B,QAA3B;AAEA,MAAMC,UAAU,GAAGF,IAAI,CAACG,KAAL,CAAWC,oBAAX,CAAgCC,IAAhC,CAAqCL,IAAI,CAACG,KAA1C,CAAnB;AAEA;AACA;AACA;;AACA,OAAO,MAAMG,QAAQ,GAAG,CACtBC,MADsB,EAEtBC,OAFsB,KAGnBP,UAAU,CAACM,MAAD,EAASL,UAAT,EAAqBM,OAArB,CAHR"}
|
1
|
+
{"version":3,"names":["findNodeHandle","Platform","Skia","useRawData","imgFactory","Image","MakeImageFromEncoded","bind","useImage","source","onError","makeImageFromView","viewRef","callback","OS","Promise","reject","Error","viewTag","current","MakeImageFromViewTag"],"sources":["Image.ts"],"sourcesContent":["import { findNodeHandle, Platform } from \"react-native\";\n\nimport { Skia } from \"../Skia\";\nimport type { DataSourceParam, SkImage } from \"../types\";\n\nimport { useRawData } from \"./Data\";\n\nconst imgFactory = Skia.Image.MakeImageFromEncoded.bind(Skia.Image);\n\n/**\n * Returns a Skia Image object\n * */\nexport const useImage = (\n source: DataSourceParam,\n onError?: (err: Error) => void\n) => useRawData(source, imgFactory, onError);\n\n/**\n * Creates an image from a given view reference. NOTE: This method has different implementations\n * on web/native. On web, the callback is called with the view ref and the callback is expected to\n * return a promise that resolves to a Skia Image object. On native, the view ref is used to\n * find the view tag and the Skia Image object is created from the view tag. This means that on web\n * you will need to implement the logic to create the image from the view ref yourself.\n * @param viewRef Ref to the view we're creating an image from\n * @returns A promise that resolves to a Skia Image object or rejects\n * with an error id the view tag is invalid.\n */\nexport const makeImageFromView = <\n T extends\n | number\n | React.Component<unknown, unknown>\n | React.ComponentClass<unknown>\n>(\n viewRef: React.RefObject<T>,\n callback:\n | null\n | ((viewRef: React.RefObject<T>) => Promise<SkImage | null>) = null\n) => {\n // In web implementation we just delegate the work to the provided callback\n if (Platform.OS === \"web\") {\n if (callback) {\n return callback(viewRef);\n } else {\n Promise.reject(\n new Error(\n \"Callback is required on web in the makeImageFromView function.\"\n )\n );\n }\n }\n const viewTag = findNodeHandle(viewRef.current);\n if (viewTag !== null && viewTag !== 0) {\n return Skia.Image.MakeImageFromViewTag(viewTag);\n }\n return Promise.reject(new Error(\"Invalid view tag\"));\n};\n"],"mappings":"AAAA,SAASA,cAAT,EAAyBC,QAAzB,QAAyC,cAAzC;AAEA,SAASC,IAAT,QAAqB,SAArB;AAGA,SAASC,UAAT,QAA2B,QAA3B;AAEA,MAAMC,UAAU,GAAGF,IAAI,CAACG,KAAL,CAAWC,oBAAX,CAAgCC,IAAhC,CAAqCL,IAAI,CAACG,KAA1C,CAAnB;AAEA;AACA;AACA;;AACA,OAAO,MAAMG,QAAQ,GAAG,CACtBC,MADsB,EAEtBC,OAFsB,KAGnBP,UAAU,CAACM,MAAD,EAASL,UAAT,EAAqBM,OAArB,CAHR;AAKP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMC,iBAAiB,GAAG,UAM/BC,OAN+B,EAU5B;EAAA,IAHHC,QAGG,uEAD8D,IAC9D;;EACH;EACA,IAAIZ,QAAQ,CAACa,EAAT,KAAgB,KAApB,EAA2B;IACzB,IAAID,QAAJ,EAAc;MACZ,OAAOA,QAAQ,CAACD,OAAD,CAAf;IACD,CAFD,MAEO;MACLG,OAAO,CAACC,MAAR,CACE,IAAIC,KAAJ,CACE,gEADF,CADF;IAKD;EACF;;EACD,MAAMC,OAAO,GAAGlB,cAAc,CAACY,OAAO,CAACO,OAAT,CAA9B;;EACA,IAAID,OAAO,KAAK,IAAZ,IAAoBA,OAAO,KAAK,CAApC,EAAuC;IACrC,OAAOhB,IAAI,CAACG,KAAL,CAAWe,oBAAX,CAAgCF,OAAhC,CAAP;EACD;;EACD,OAAOH,OAAO,CAACC,MAAR,CAAe,IAAIC,KAAJ,CAAU,kBAAV,CAAf,CAAP;AACD,CA5BM"}
|
@@ -48,6 +48,13 @@ export interface ImageFactory {
|
|
48
48
|
* image, nullptr is returned.
|
49
49
|
*/
|
50
50
|
MakeImageFromEncoded: (encoded: SkData) => SkImage | null;
|
51
|
+
/**
|
52
|
+
* Returns an image that will be a screenshot of the view represented by
|
53
|
+
* the view tag
|
54
|
+
* @param viewTag - The tag of the view to make an image from.
|
55
|
+
* @returns Returns a valid SkImage, if the view tag is invalid, nullptr is returned.
|
56
|
+
*/
|
57
|
+
MakeImageFromViewTag: (viewTag: number) => Promise<SkImage | null>;
|
51
58
|
/**
|
52
59
|
* Returns an image with the given pixel data and format.
|
53
60
|
* Note that we will always make a copy of the pixel data, because of inconsistencies in
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["AlphaType","ColorType"],"sources":["ImageFactory.ts"],"sourcesContent":["import type { SkData } from \"../Data\";\n\nimport type { SkImage } from \"./Image\";\n\nexport enum AlphaType {\n Unknown,\n Opaque,\n Premul,\n Unpremul,\n}\n\nexport enum ColorType {\n Unknown, //!< uninitialized\n Alpha_8, //!< pixel with alpha in 8-bit byte\n RGB_565, //!< pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word\n ARGB_4444, //!< pixel with 4 bits for alpha, red, green, blue; in 16-bit word\n RGBA_8888, //!< pixel with 8 bits for red, green, blue, alpha; in 32-bit word\n RGB_888x, //!< pixel with 8 bits each for red, green, blue; in 32-bit word\n BGRA_8888, //!< pixel with 8 bits for blue, green, red, alpha; in 32-bit word\n RGBA_1010102, //!< 10 bits for red, green, blue; 2 bits for alpha; in 32-bit word\n BGRA_1010102, //!< 10 bits for blue, green, red; 2 bits for alpha; in 32-bit word\n RGB_101010x, //!< pixel with 10 bits each for red, green, blue; in 32-bit word\n BGR_101010x, //!< pixel with 10 bits each for blue, green, red; in 32-bit word\n Gray_8, //!< pixel with grayscale level in 8-bit byte\n RGBA_F16Norm, //!< pixel with half floats in [0,1] for red, green, blue, alpha;\n // in 64-bit word\n RGBA_F16, //!< pixel with half floats for red, green, blue, alpha;\n // in 64-bit word\n RGBA_F32, //!< pixel using C float for red, green, blue, alpha; in 128-bit word\n\n // The following 6 colortypes are just for reading from - not for rendering to\n R8G8_unorm, //!< pixel with a uint8_t for red and green\n\n A16_float, //!< pixel with a half float for alpha\n R16G16_float, //!< pixel with a half float for red and green\n\n A16_unorm, //!< pixel with a little endian uint16_t for alpha\n R16G16_unorm, //!< pixel with a little endian uint16_t for red and green\n R16G16B16A16_unorm, //!< pixel with a little endian uint16_t for red, green, blue\n // and alpha\n SRGBA_8888,\n}\n\nexport interface ImageInfo {\n alphaType: AlphaType;\n // TODO: add support for color space\n // colorSpace: ColorSpace;\n colorType: ColorType;\n height: number;\n width: number;\n}\n\nexport interface ImageFactory {\n /**\n * Return an Image backed by the encoded data, but attempt to defer decoding until the image\n * is actually used/drawn. This deferral allows the system to cache the result, either on the\n * CPU or on the GPU, depending on where the image is drawn.\n * This decoding uses the codecs that have been compiled into CanvasKit. If the bytes are\n * invalid (or an unrecognized codec), null will be returned. See Image.h for more details.\n * @param data - Data object with bytes of data\n * @returns If the encoded format is not supported, or subset is outside of the bounds of the decoded\n * image, nullptr is returned.\n */\n MakeImageFromEncoded: (encoded: SkData) => SkImage | null;\n\n /**\n * Returns an image with the given pixel data and format.\n * Note that we will always make a copy of the pixel data, because of inconsistencies in\n * behavior between GPU and CPU (i.e. the pixel data will be turned into a GPU texture and\n * not modifiable after creation).\n *\n * @param info\n * @param data - bytes representing the pixel data.\n * @param bytesPerRow\n */\n MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number): SkImage | null;\n}\n"],"mappings":"AAIA,WAAYA,SAAZ;;WAAYA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;GAAAA,S,KAAAA,S;;AAOZ,WAAYC,SAAZ;;WAAYA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;GAAAA,S,KAAAA,S"}
|
1
|
+
{"version":3,"names":["AlphaType","ColorType"],"sources":["ImageFactory.ts"],"sourcesContent":["import type { SkData } from \"../Data\";\n\nimport type { SkImage } from \"./Image\";\n\nexport enum AlphaType {\n Unknown,\n Opaque,\n Premul,\n Unpremul,\n}\n\nexport enum ColorType {\n Unknown, //!< uninitialized\n Alpha_8, //!< pixel with alpha in 8-bit byte\n RGB_565, //!< pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word\n ARGB_4444, //!< pixel with 4 bits for alpha, red, green, blue; in 16-bit word\n RGBA_8888, //!< pixel with 8 bits for red, green, blue, alpha; in 32-bit word\n RGB_888x, //!< pixel with 8 bits each for red, green, blue; in 32-bit word\n BGRA_8888, //!< pixel with 8 bits for blue, green, red, alpha; in 32-bit word\n RGBA_1010102, //!< 10 bits for red, green, blue; 2 bits for alpha; in 32-bit word\n BGRA_1010102, //!< 10 bits for blue, green, red; 2 bits for alpha; in 32-bit word\n RGB_101010x, //!< pixel with 10 bits each for red, green, blue; in 32-bit word\n BGR_101010x, //!< pixel with 10 bits each for blue, green, red; in 32-bit word\n Gray_8, //!< pixel with grayscale level in 8-bit byte\n RGBA_F16Norm, //!< pixel with half floats in [0,1] for red, green, blue, alpha;\n // in 64-bit word\n RGBA_F16, //!< pixel with half floats for red, green, blue, alpha;\n // in 64-bit word\n RGBA_F32, //!< pixel using C float for red, green, blue, alpha; in 128-bit word\n\n // The following 6 colortypes are just for reading from - not for rendering to\n R8G8_unorm, //!< pixel with a uint8_t for red and green\n\n A16_float, //!< pixel with a half float for alpha\n R16G16_float, //!< pixel with a half float for red and green\n\n A16_unorm, //!< pixel with a little endian uint16_t for alpha\n R16G16_unorm, //!< pixel with a little endian uint16_t for red and green\n R16G16B16A16_unorm, //!< pixel with a little endian uint16_t for red, green, blue\n // and alpha\n SRGBA_8888,\n}\n\nexport interface ImageInfo {\n alphaType: AlphaType;\n // TODO: add support for color space\n // colorSpace: ColorSpace;\n colorType: ColorType;\n height: number;\n width: number;\n}\n\nexport interface ImageFactory {\n /**\n * Return an Image backed by the encoded data, but attempt to defer decoding until the image\n * is actually used/drawn. This deferral allows the system to cache the result, either on the\n * CPU or on the GPU, depending on where the image is drawn.\n * This decoding uses the codecs that have been compiled into CanvasKit. If the bytes are\n * invalid (or an unrecognized codec), null will be returned. See Image.h for more details.\n * @param data - Data object with bytes of data\n * @returns If the encoded format is not supported, or subset is outside of the bounds of the decoded\n * image, nullptr is returned.\n */\n MakeImageFromEncoded: (encoded: SkData) => SkImage | null;\n\n /**\n * Returns an image that will be a screenshot of the view represented by\n * the view tag\n * @param viewTag - The tag of the view to make an image from.\n * @returns Returns a valid SkImage, if the view tag is invalid, nullptr is returned.\n */\n MakeImageFromViewTag: (viewTag: number) => Promise<SkImage | null>;\n\n /**\n * Returns an image with the given pixel data and format.\n * Note that we will always make a copy of the pixel data, because of inconsistencies in\n * behavior between GPU and CPU (i.e. the pixel data will be turned into a GPU texture and\n * not modifiable after creation).\n *\n * @param info\n * @param data - bytes representing the pixel data.\n * @param bytesPerRow\n */\n MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number): SkImage | null;\n}\n"],"mappings":"AAIA,WAAYA,SAAZ;;WAAYA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;GAAAA,S,KAAAA,S;;AAOZ,WAAYC,SAAZ;;WAAYA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;EAAAA,S,CAAAA,S;GAAAA,S,KAAAA,S"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":[],"sources":["SVG.ts"],"sourcesContent":["import type { JsiDisposable, SkJSIInstance } from \"../JsiInstance\";\n\nexport
|
1
|
+
{"version":3,"names":[],"sources":["SVG.ts"],"sourcesContent":["import type { JsiDisposable, SkJSIInstance } from \"../JsiInstance\";\n\nexport interface SkSVG extends SkJSIInstance<\"SVG\">, JsiDisposable {\n width(): number;\n height(): number;\n}\n"],"mappings":""}
|
@@ -1,10 +1,11 @@
|
|
1
1
|
import type { CanvasKit } from "canvaskit-wasm";
|
2
|
-
import type { SkData, ImageInfo } from "../types";
|
2
|
+
import type { SkData, ImageInfo, SkImage } from "../types";
|
3
3
|
import type { ImageFactory } from "../types/Image/ImageFactory";
|
4
4
|
import { Host } from "./Host";
|
5
5
|
import { JsiSkImage } from "./JsiSkImage";
|
6
6
|
export declare class JsiSkImageFactory extends Host implements ImageFactory {
|
7
7
|
constructor(CanvasKit: CanvasKit);
|
8
|
+
MakeImageFromViewTag(viewTag: number): Promise<SkImage | null>;
|
8
9
|
MakeImageFromEncoded(encoded: SkData): JsiSkImage | null;
|
9
10
|
MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number): JsiSkImage | null;
|
10
11
|
}
|
@@ -6,6 +6,13 @@ export class JsiSkImageFactory extends Host {
|
|
6
6
|
super(CanvasKit);
|
7
7
|
}
|
8
8
|
|
9
|
+
MakeImageFromViewTag(viewTag) {
|
10
|
+
const view = viewTag; // TODO: Implement screenshot from view in React JS
|
11
|
+
|
12
|
+
console.log(view);
|
13
|
+
return Promise.resolve(null);
|
14
|
+
}
|
15
|
+
|
9
16
|
MakeImageFromEncoded(encoded) {
|
10
17
|
const image = this.CanvasKit.MakeImageFromEncoded(JsiSkData.fromValue(encoded));
|
11
18
|
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["Host","ckEnum","JsiSkImage","JsiSkData","JsiSkImageFactory","constructor","CanvasKit","MakeImageFromEncoded","encoded","image","fromValue","MakeImage","info","data","bytesPerRow","alphaType","colorSpace","ColorSpace","SRGB","colorType","height","width"],"sources":["JsiSkImageFactory.ts"],"sourcesContent":["import type { CanvasKit } from \"canvaskit-wasm\";\n\nimport type { SkData, ImageInfo } from \"../types\";\nimport type { ImageFactory } from \"../types/Image/ImageFactory\";\n\nimport { Host, ckEnum } from \"./Host\";\nimport { JsiSkImage } from \"./JsiSkImage\";\nimport { JsiSkData } from \"./JsiSkData\";\n\nexport class JsiSkImageFactory extends Host implements ImageFactory {\n constructor(CanvasKit: CanvasKit) {\n super(CanvasKit);\n }\n\n MakeImageFromEncoded(encoded: SkData) {\n const image = this.CanvasKit.MakeImageFromEncoded(\n JsiSkData.fromValue(encoded)\n );\n if (image === null) {\n return null;\n }\n return new JsiSkImage(this.CanvasKit, image);\n }\n\n MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number) {\n // see toSkImageInfo() from canvaskit\n const image = this.CanvasKit.MakeImage(\n {\n alphaType: ckEnum(info.alphaType),\n colorSpace: this.CanvasKit.ColorSpace.SRGB,\n colorType: ckEnum(info.colorType),\n height: info.height,\n width: info.width,\n },\n JsiSkData.fromValue(data),\n bytesPerRow\n );\n if (image === null) {\n return null;\n }\n return new JsiSkImage(this.CanvasKit, image);\n }\n}\n"],"mappings":"AAKA,SAASA,IAAT,EAAeC,MAAf,QAA6B,QAA7B;AACA,SAASC,UAAT,QAA2B,cAA3B;AACA,SAASC,SAAT,QAA0B,aAA1B;AAEA,OAAO,MAAMC,iBAAN,SAAgCJ,IAAhC,CAA6D;EAClEK,WAAW,CAACC,SAAD,EAAuB;IAChC,MAAMA,SAAN;EACD;;EAEDC,oBAAoB,CAACC,OAAD,EAAkB;IACpC,MAAMC,KAAK,GAAG,
|
1
|
+
{"version":3,"names":["Host","ckEnum","JsiSkImage","JsiSkData","JsiSkImageFactory","constructor","CanvasKit","MakeImageFromViewTag","viewTag","view","console","log","Promise","resolve","MakeImageFromEncoded","encoded","image","fromValue","MakeImage","info","data","bytesPerRow","alphaType","colorSpace","ColorSpace","SRGB","colorType","height","width"],"sources":["JsiSkImageFactory.ts"],"sourcesContent":["import type { CanvasKit } from \"canvaskit-wasm\";\n\nimport type { SkData, ImageInfo, SkImage } from \"../types\";\nimport type { ImageFactory } from \"../types/Image/ImageFactory\";\n\nimport { Host, ckEnum } from \"./Host\";\nimport { JsiSkImage } from \"./JsiSkImage\";\nimport { JsiSkData } from \"./JsiSkData\";\n\nexport class JsiSkImageFactory extends Host implements ImageFactory {\n constructor(CanvasKit: CanvasKit) {\n super(CanvasKit);\n }\n\n MakeImageFromViewTag(viewTag: number): Promise<SkImage | null> {\n const view = viewTag as unknown as HTMLElement;\n // TODO: Implement screenshot from view in React JS\n console.log(view);\n return Promise.resolve(null);\n }\n\n MakeImageFromEncoded(encoded: SkData) {\n const image = this.CanvasKit.MakeImageFromEncoded(\n JsiSkData.fromValue(encoded)\n );\n if (image === null) {\n return null;\n }\n return new JsiSkImage(this.CanvasKit, image);\n }\n\n MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number) {\n // see toSkImageInfo() from canvaskit\n const image = this.CanvasKit.MakeImage(\n {\n alphaType: ckEnum(info.alphaType),\n colorSpace: this.CanvasKit.ColorSpace.SRGB,\n colorType: ckEnum(info.colorType),\n height: info.height,\n width: info.width,\n },\n JsiSkData.fromValue(data),\n bytesPerRow\n );\n if (image === null) {\n return null;\n }\n return new JsiSkImage(this.CanvasKit, image);\n }\n}\n"],"mappings":"AAKA,SAASA,IAAT,EAAeC,MAAf,QAA6B,QAA7B;AACA,SAASC,UAAT,QAA2B,cAA3B;AACA,SAASC,SAAT,QAA0B,aAA1B;AAEA,OAAO,MAAMC,iBAAN,SAAgCJ,IAAhC,CAA6D;EAClEK,WAAW,CAACC,SAAD,EAAuB;IAChC,MAAMA,SAAN;EACD;;EAEDC,oBAAoB,CAACC,OAAD,EAA2C;IAC7D,MAAMC,IAAI,GAAGD,OAAb,CAD6D,CAE7D;;IACAE,OAAO,CAACC,GAAR,CAAYF,IAAZ;IACA,OAAOG,OAAO,CAACC,OAAR,CAAgB,IAAhB,CAAP;EACD;;EAEDC,oBAAoB,CAACC,OAAD,EAAkB;IACpC,MAAMC,KAAK,GAAG,KAAKV,SAAL,CAAeQ,oBAAf,CACZX,SAAS,CAACc,SAAV,CAAoBF,OAApB,CADY,CAAd;;IAGA,IAAIC,KAAK,KAAK,IAAd,EAAoB;MAClB,OAAO,IAAP;IACD;;IACD,OAAO,IAAId,UAAJ,CAAe,KAAKI,SAApB,EAA+BU,KAA/B,CAAP;EACD;;EAEDE,SAAS,CAACC,IAAD,EAAkBC,IAAlB,EAAgCC,WAAhC,EAAqD;IAC5D;IACA,MAAML,KAAK,GAAG,KAAKV,SAAL,CAAeY,SAAf,CACZ;MACEI,SAAS,EAAErB,MAAM,CAACkB,IAAI,CAACG,SAAN,CADnB;MAEEC,UAAU,EAAE,KAAKjB,SAAL,CAAekB,UAAf,CAA0BC,IAFxC;MAGEC,SAAS,EAAEzB,MAAM,CAACkB,IAAI,CAACO,SAAN,CAHnB;MAIEC,MAAM,EAAER,IAAI,CAACQ,MAJf;MAKEC,KAAK,EAAET,IAAI,CAACS;IALd,CADY,EAQZzB,SAAS,CAACc,SAAV,CAAoBG,IAApB,CARY,EASZC,WATY,CAAd;;IAWA,IAAIL,KAAK,KAAK,IAAd,EAAoB;MAClB,OAAO,IAAP;IACD;;IACD,OAAO,IAAId,UAAJ,CAAe,KAAKI,SAApB,EAA+BU,KAA/B,CAAP;EACD;;AAvCiE"}
|
@@ -8,9 +8,9 @@ export declare class TextNode extends JsiDrawingNode<TextProps, null> {
|
|
8
8
|
protected deriveProps(): null;
|
9
9
|
draw({ canvas, paint }: DrawingContext): void;
|
10
10
|
}
|
11
|
-
export declare class TextPathNode extends JsiDrawingNode<TextPathProps, SkTextBlob> {
|
11
|
+
export declare class TextPathNode extends JsiDrawingNode<TextPathProps, SkTextBlob | null> {
|
12
12
|
constructor(ctx: NodeContext, props: TextPathProps);
|
13
|
-
deriveProps(): SkTextBlob;
|
13
|
+
deriveProps(): SkTextBlob | null;
|
14
14
|
draw({ canvas, paint }: DrawingContext): void;
|
15
15
|
}
|
16
16
|
export declare class TextBlobNode extends JsiDrawingNode<TextBlobProps, null> {
|
@@ -6,7 +6,7 @@ export interface DrawingNodeProps extends GroupProps {
|
|
6
6
|
}
|
7
7
|
export declare type ImageProps = DrawingNodeProps & RectDef & {
|
8
8
|
fit?: Fit;
|
9
|
-
image: SkImage;
|
9
|
+
image: SkImage | null;
|
10
10
|
};
|
11
11
|
export declare type CircleProps = CircleDef & DrawingNodeProps;
|
12
12
|
export interface PathProps extends DrawingNodeProps {
|
@@ -51,7 +51,7 @@ export interface VerticesProps extends DrawingNodeProps {
|
|
51
51
|
indices?: number[];
|
52
52
|
}
|
53
53
|
export declare type ImageSVGProps = RectDef & {
|
54
|
-
svg: SkSVG;
|
54
|
+
svg: SkSVG | null;
|
55
55
|
} & DrawingNodeProps;
|
56
56
|
export interface PictureProps extends DrawingNodeProps {
|
57
57
|
picture: SkPicture;
|
@@ -65,13 +65,13 @@ export interface DiffRectProps extends DrawingNodeProps {
|
|
65
65
|
outer: SkRRect;
|
66
66
|
}
|
67
67
|
export interface TextProps extends DrawingNodeProps {
|
68
|
-
font: SkFont;
|
68
|
+
font: SkFont | null;
|
69
69
|
text: string;
|
70
70
|
x: number;
|
71
71
|
y: number;
|
72
72
|
}
|
73
73
|
export interface TextPathProps extends DrawingNodeProps {
|
74
|
-
font: SkFont;
|
74
|
+
font: SkFont | null;
|
75
75
|
text: string;
|
76
76
|
path: PathDef;
|
77
77
|
initialOffset: number;
|
@@ -86,7 +86,7 @@ export interface Glyph {
|
|
86
86
|
pos: SkPoint;
|
87
87
|
}
|
88
88
|
export interface GlyphsProps extends DrawingNodeProps {
|
89
|
-
font: SkFont;
|
89
|
+
font: SkFont | null;
|
90
90
|
x: number;
|
91
91
|
y: number;
|
92
92
|
glyphs: Glyph[];
|
@@ -1,15 +1,2 @@
|
|
1
|
-
import type {
|
2
|
-
|
3
|
-
import type * as ValueExports from "../values";
|
4
|
-
import type * as AnimationExports from "../animation";
|
5
|
-
import { ShaderLib } from "../renderer/components/shaders/ShaderLib";
|
6
|
-
export declare const Skia: SkiaApi;
|
7
|
-
export declare const vec: (x?: number, y?: number) => {
|
8
|
-
x: number;
|
9
|
-
y: number;
|
10
|
-
};
|
11
|
-
export declare const Mock: typeof SkiaExports & typeof ValueExports & typeof AnimationExports & {
|
12
|
-
createDrawing: () => any;
|
13
|
-
createDeclaration: () => any;
|
14
|
-
ShaderLib: typeof ShaderLib;
|
15
|
-
};
|
1
|
+
import type { CanvasKit } from "canvaskit-wasm";
|
2
|
+
export declare const Mock: (CanvasKit: CanvasKit) => any;
|
@@ -1,5 +1,17 @@
|
|
1
|
-
|
1
|
+
/// <reference types="react" />
|
2
|
+
import type { DataSourceParam, SkImage } from "../types";
|
2
3
|
/**
|
3
4
|
* Returns a Skia Image object
|
4
5
|
* */
|
5
|
-
export declare const useImage: (source: DataSourceParam, onError?: ((err: Error) => void) | undefined) =>
|
6
|
+
export declare const useImage: (source: DataSourceParam, onError?: ((err: Error) => void) | undefined) => SkImage | null;
|
7
|
+
/**
|
8
|
+
* Creates an image from a given view reference. NOTE: This method has different implementations
|
9
|
+
* on web/native. On web, the callback is called with the view ref and the callback is expected to
|
10
|
+
* return a promise that resolves to a Skia Image object. On native, the view ref is used to
|
11
|
+
* find the view tag and the Skia Image object is created from the view tag. This means that on web
|
12
|
+
* you will need to implement the logic to create the image from the view ref yourself.
|
13
|
+
* @param viewRef Ref to the view we're creating an image from
|
14
|
+
* @returns A promise that resolves to a Skia Image object or rejects
|
15
|
+
* with an error id the view tag is invalid.
|
16
|
+
*/
|
17
|
+
export declare const makeImageFromView: <T extends number | import("react").Component<unknown, unknown, any> | import("react").ComponentClass<unknown, any>>(viewRef: import("react").RefObject<T>, callback?: ((viewRef: import("react").RefObject<T>) => Promise<SkImage | null>) | null) => Promise<SkImage | null>;
|
@@ -48,6 +48,13 @@ export interface ImageFactory {
|
|
48
48
|
* image, nullptr is returned.
|
49
49
|
*/
|
50
50
|
MakeImageFromEncoded: (encoded: SkData) => SkImage | null;
|
51
|
+
/**
|
52
|
+
* Returns an image that will be a screenshot of the view represented by
|
53
|
+
* the view tag
|
54
|
+
* @param viewTag - The tag of the view to make an image from.
|
55
|
+
* @returns Returns a valid SkImage, if the view tag is invalid, nullptr is returned.
|
56
|
+
*/
|
57
|
+
MakeImageFromViewTag: (viewTag: number) => Promise<SkImage | null>;
|
51
58
|
/**
|
52
59
|
* Returns an image with the given pixel data and format.
|
53
60
|
* Note that we will always make a copy of the pixel data, because of inconsistencies in
|
@@ -1,10 +1,11 @@
|
|
1
1
|
import type { CanvasKit } from "canvaskit-wasm";
|
2
|
-
import type { SkData, ImageInfo } from "../types";
|
2
|
+
import type { SkData, ImageInfo, SkImage } from "../types";
|
3
3
|
import type { ImageFactory } from "../types/Image/ImageFactory";
|
4
4
|
import { Host } from "./Host";
|
5
5
|
import { JsiSkImage } from "./JsiSkImage";
|
6
6
|
export declare class JsiSkImageFactory extends Host implements ImageFactory {
|
7
7
|
constructor(CanvasKit: CanvasKit);
|
8
|
+
MakeImageFromViewTag(viewTag: number): Promise<SkImage | null>;
|
8
9
|
MakeImageFromEncoded(encoded: SkData): JsiSkImage | null;
|
9
10
|
MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number): JsiSkImage | null;
|
10
11
|
}
|
package/package.json
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
"setup-skia-web": "./scripts/setup-canvaskit.js"
|
8
8
|
},
|
9
9
|
"title": "React Native Skia",
|
10
|
-
"version": "0.1.
|
10
|
+
"version": "0.1.187",
|
11
11
|
"description": "High-performance React Native Graphics using Skia",
|
12
12
|
"main": "lib/module/index.js",
|
13
13
|
"files": [
|
@@ -25,6 +25,7 @@
|
|
25
25
|
"libs/android/**",
|
26
26
|
"index.js",
|
27
27
|
"jestSetup.js",
|
28
|
+
"globalJestSetup.js",
|
28
29
|
"cpp/**/*.{h,cpp}",
|
29
30
|
"ios",
|
30
31
|
"libs/ios/libskia.xcframework",
|
@@ -88,7 +89,7 @@
|
|
88
89
|
"jest": "28.1.3",
|
89
90
|
"merge-dirs": "^0.2.1",
|
90
91
|
"react": "18.1.0",
|
91
|
-
"react-native": "0.71.
|
92
|
+
"react-native": "0.71.7",
|
92
93
|
"react-native-builder-bob": "^0.18.2",
|
93
94
|
"ts-jest": "^28.0.7",
|
94
95
|
"typescript": "4.8.3"
|
package/scripts/install-npm.js
CHANGED
@@ -8,9 +8,10 @@ const createSymlink = (p) => {
|
|
8
8
|
const srcDir = path.resolve(`./cpp/${p}`);
|
9
9
|
const dstDir = path.resolve(`./android/cpp/${p}`);
|
10
10
|
|
11
|
-
if (
|
12
|
-
fs.
|
11
|
+
if (fs.existsSync(dstDir)) {
|
12
|
+
fs.unlinkSync(dstDir);
|
13
13
|
}
|
14
|
+
fs.symlinkSync(srcDir, dstDir, "junction");
|
14
15
|
};
|
15
16
|
|
16
17
|
// Copy common cpp files from the package root to the android folder
|
@@ -15,6 +15,12 @@ export class ImageNode extends JsiDrawingNode<
|
|
15
15
|
|
16
16
|
deriveProps() {
|
17
17
|
const { image } = this.props;
|
18
|
+
if (!image) {
|
19
|
+
return {
|
20
|
+
src: { x: 0, y: 0, width: 0, height: 0 },
|
21
|
+
dst: { x: 0, y: 0, width: 0, height: 0 },
|
22
|
+
};
|
23
|
+
}
|
18
24
|
const fit = this.props.fit ?? "contain";
|
19
25
|
const rect = processRect(this.Skia, this.props);
|
20
26
|
const { src, dst } = fitRects(
|
@@ -36,6 +42,8 @@ export class ImageNode extends JsiDrawingNode<
|
|
36
42
|
throw new Error("ImageNode: src and dst are undefined");
|
37
43
|
}
|
38
44
|
const { src, dst } = this.derived;
|
39
|
-
|
45
|
+
if (image) {
|
46
|
+
canvas.drawImageRect(image, src, dst, paint);
|
47
|
+
}
|
40
48
|
}
|
41
49
|
}
|
@@ -15,6 +15,9 @@ export class ImageSVGNode extends JsiDrawingNode<ImageSVGProps, null> {
|
|
15
15
|
|
16
16
|
draw({ canvas }: DrawingContext) {
|
17
17
|
const { svg } = this.props;
|
18
|
+
if (!svg) {
|
19
|
+
return;
|
20
|
+
}
|
18
21
|
const { x, y, width, height } = processRect(this.Skia, this.props);
|
19
22
|
canvas.save();
|
20
23
|
canvas.translate(x, y);
|
@@ -22,11 +22,16 @@ export class TextNode extends JsiDrawingNode<TextProps, null> {
|
|
22
22
|
|
23
23
|
draw({ canvas, paint }: DrawingContext) {
|
24
24
|
const { text, x, y, font } = this.props;
|
25
|
-
|
25
|
+
if (font) {
|
26
|
+
canvas.drawText(text, x, y, paint, font);
|
27
|
+
}
|
26
28
|
}
|
27
29
|
}
|
28
30
|
|
29
|
-
export class TextPathNode extends JsiDrawingNode<
|
31
|
+
export class TextPathNode extends JsiDrawingNode<
|
32
|
+
TextPathProps,
|
33
|
+
SkTextBlob | null
|
34
|
+
> {
|
30
35
|
constructor(ctx: NodeContext, props: TextPathProps) {
|
31
36
|
super(ctx, NodeType.TextPath, props);
|
32
37
|
}
|
@@ -34,6 +39,9 @@ export class TextPathNode extends JsiDrawingNode<TextPathProps, SkTextBlob> {
|
|
34
39
|
deriveProps() {
|
35
40
|
const path = processPath(this.Skia, this.props.path);
|
36
41
|
const { font, initialOffset } = this.props;
|
42
|
+
if (!font) {
|
43
|
+
return null;
|
44
|
+
}
|
37
45
|
let { text } = this.props;
|
38
46
|
const ids = font.getGlyphIDs(text);
|
39
47
|
const widths = font.getGlyphWidths(ids);
|
@@ -117,6 +125,8 @@ export class GlyphsNode extends JsiDrawingNode<GlyphsProps, ProcessedGlyphs> {
|
|
117
125
|
}
|
118
126
|
const { glyphs, positions } = this.derived;
|
119
127
|
const { x, y, font } = this.props;
|
120
|
-
|
128
|
+
if (font) {
|
129
|
+
canvas.drawGlyphs(glyphs, positions, x, y, font, paint);
|
130
|
+
}
|
121
131
|
}
|
122
132
|
}
|
@@ -60,6 +60,10 @@ export class ImageShaderNode extends ShaderDeclaration<ImageShaderProps> {
|
|
60
60
|
|
61
61
|
decorate(ctx: DeclarationContext) {
|
62
62
|
const { fit, image, tx, ty, fm, mm, ...imageShaderProps } = this.props;
|
63
|
+
if (!image) {
|
64
|
+
return;
|
65
|
+
}
|
66
|
+
|
63
67
|
const rct = getRect(this.Skia, imageShaderProps);
|
64
68
|
const m3 = this.Skia.Matrix();
|
65
69
|
if (rct) {
|
@@ -35,7 +35,7 @@ export interface DrawingNodeProps extends GroupProps {
|
|
35
35
|
export type ImageProps = DrawingNodeProps &
|
36
36
|
RectDef & {
|
37
37
|
fit?: Fit;
|
38
|
-
image: SkImage;
|
38
|
+
image: SkImage | null;
|
39
39
|
};
|
40
40
|
|
41
41
|
export type CircleProps = CircleDef & DrawingNodeProps;
|
@@ -91,7 +91,7 @@ export interface VerticesProps extends DrawingNodeProps {
|
|
91
91
|
}
|
92
92
|
|
93
93
|
export type ImageSVGProps = RectDef & {
|
94
|
-
svg: SkSVG;
|
94
|
+
svg: SkSVG | null;
|
95
95
|
} & DrawingNodeProps;
|
96
96
|
|
97
97
|
export interface PictureProps extends DrawingNodeProps {
|
@@ -109,14 +109,14 @@ export interface DiffRectProps extends DrawingNodeProps {
|
|
109
109
|
}
|
110
110
|
|
111
111
|
export interface TextProps extends DrawingNodeProps {
|
112
|
-
font: SkFont;
|
112
|
+
font: SkFont | null;
|
113
113
|
text: string;
|
114
114
|
x: number;
|
115
115
|
y: number;
|
116
116
|
}
|
117
117
|
|
118
118
|
export interface TextPathProps extends DrawingNodeProps {
|
119
|
-
font: SkFont;
|
119
|
+
font: SkFont | null;
|
120
120
|
text: string;
|
121
121
|
path: PathDef;
|
122
122
|
initialOffset: number;
|
@@ -134,7 +134,7 @@ export interface Glyph {
|
|
134
134
|
}
|
135
135
|
|
136
136
|
export interface GlyphsProps extends DrawingNodeProps {
|
137
|
-
font: SkFont;
|
137
|
+
font: SkFont | null;
|
138
138
|
x: number;
|
139
139
|
y: number;
|
140
140
|
glyphs: Glyph[];
|
package/src/dom/types/Shaders.ts
CHANGED
package/src/mock/index.ts
CHANGED
@@ -1,102 +1,39 @@
|
|
1
|
-
|
1
|
+
import type { CanvasKit } from "canvaskit-wasm";
|
2
2
|
|
3
|
-
import
|
4
|
-
import
|
5
|
-
import * as ValuesHooks from "../values/hooks";
|
6
|
-
import { Selector } from "../values/selector";
|
7
|
-
import * as BaseSkia from "../skia/types";
|
8
|
-
import type * as SkiaExports from "../skia";
|
9
|
-
import type * as ValueExports from "../values";
|
10
|
-
import type * as AnimationExports from "../animation";
|
11
|
-
import * as timingFunctions from "../animation/timing";
|
12
|
-
import * as springFunctions from "../animation/spring";
|
13
|
-
import * as decayFunctions from "../animation/decay";
|
14
|
-
import * as interpolateFn from "../animation/functions/interpolate";
|
15
|
-
import * as interpolatePathFn from "../animation/functions/interpolatePaths";
|
16
|
-
import * as interpolateVectorFn from "../animation/functions/interpolateVector";
|
17
|
-
import { ShaderLib } from "../renderer/components/shaders/ShaderLib";
|
3
|
+
import { JsiSkApi } from "../skia/web";
|
4
|
+
import { ValueApi } from "../values/web";
|
18
5
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
get: () => new Stub(),
|
23
|
-
apply: () => new Stub(),
|
24
|
-
set: () => true,
|
25
|
-
});
|
26
|
-
}
|
27
|
-
}
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
7
|
+
const Noop: () => any = () => undefined;
|
8
|
+
const NoopValue = () => ({ current: 0 });
|
28
9
|
|
29
|
-
const
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
y,
|
59
|
-
width,
|
60
|
-
height,
|
61
|
-
}),
|
62
|
-
rrect: (r: SkRect, rx: number, ry: number) => ({
|
63
|
-
rect: r,
|
64
|
-
rx,
|
65
|
-
ry,
|
66
|
-
}),
|
67
|
-
point: vec,
|
68
|
-
add: (a: Vector, b: Vector) => vec(a.x + b.x, a.y + b.y),
|
69
|
-
sub: (a: Vector, b: Vector) => vec(a.x - b.x, a.y - b.y),
|
70
|
-
neg: (a: Vector) => vec(-a.x, -a.y),
|
71
|
-
dist: (a: Vector, b: Vector) => Math.hypot(a.x - b.x, a.y - b.y),
|
72
|
-
translate: ({ x, y }: Vector) =>
|
73
|
-
[{ translateX: x }, { translateY: y }] as const,
|
74
|
-
|
75
|
-
bounds: Noop,
|
76
|
-
topLeft: Noop,
|
77
|
-
topRight: Noop,
|
78
|
-
bottomLeft: Noop,
|
79
|
-
bottomRight: Noop,
|
80
|
-
center: Noop,
|
81
|
-
processTransform2d: Noop,
|
82
|
-
// ValueExports
|
83
|
-
...Values,
|
84
|
-
...ValuesHooks,
|
85
|
-
Selector,
|
86
|
-
// Animations
|
87
|
-
...timingFunctions,
|
88
|
-
...springFunctions,
|
89
|
-
...decayFunctions,
|
90
|
-
...interpolateFn,
|
91
|
-
...interpolatePathFn,
|
92
|
-
...interpolateVectorFn,
|
93
|
-
interpolateColors: (
|
94
|
-
_value: number,
|
95
|
-
_inputRange: number[],
|
96
|
-
_outputRange: Color[]
|
97
|
-
) => Float32Array.of(0, 0, 0, 0),
|
98
|
-
mixColors: (_v: number, _x: Color, _y: Color) => Float32Array.of(0, 0, 0, 0),
|
99
|
-
ShaderLib,
|
100
|
-
createDrawing: Noop,
|
101
|
-
createDeclaration: Noop,
|
10
|
+
export const Mock = (CanvasKit: CanvasKit) => {
|
11
|
+
global.SkiaApi = JsiSkApi(CanvasKit);
|
12
|
+
global.SkiaValueApi = ValueApi;
|
13
|
+
const Skia = global.SkiaApi;
|
14
|
+
return {
|
15
|
+
Skia,
|
16
|
+
...require("../renderer/components"),
|
17
|
+
...require("../skia"),
|
18
|
+
...require("../values"),
|
19
|
+
...require("../animation"),
|
20
|
+
...require("../dom/types"),
|
21
|
+
...require("../dom/nodes"),
|
22
|
+
// We could use the real Canvas if we mock the SkiaView component for node
|
23
|
+
Canvas: Noop,
|
24
|
+
useValue: NoopValue,
|
25
|
+
useComputedValue: NoopValue,
|
26
|
+
useTouchHandler: Noop,
|
27
|
+
useTiming: NoopValue,
|
28
|
+
useLoop: NoopValue,
|
29
|
+
useSpring: NoopValue,
|
30
|
+
useClockValue: NoopValue,
|
31
|
+
useValueEffect: Noop,
|
32
|
+
useRawData: Noop,
|
33
|
+
useData: Noop,
|
34
|
+
useFont: () => Skia.Font(undefined, 0),
|
35
|
+
useTypeface: () => null,
|
36
|
+
useImage: () => null,
|
37
|
+
useSVG: () => null,
|
38
|
+
};
|
102
39
|
};
|
package/src/skia/core/Image.ts
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
import { findNodeHandle, Platform } from "react-native";
|
2
|
+
|
1
3
|
import { Skia } from "../Skia";
|
2
|
-
import type { DataSourceParam } from "../types";
|
4
|
+
import type { DataSourceParam, SkImage } from "../types";
|
3
5
|
|
4
6
|
import { useRawData } from "./Data";
|
5
7
|
|
@@ -12,3 +14,43 @@ export const useImage = (
|
|
12
14
|
source: DataSourceParam,
|
13
15
|
onError?: (err: Error) => void
|
14
16
|
) => useRawData(source, imgFactory, onError);
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Creates an image from a given view reference. NOTE: This method has different implementations
|
20
|
+
* on web/native. On web, the callback is called with the view ref and the callback is expected to
|
21
|
+
* return a promise that resolves to a Skia Image object. On native, the view ref is used to
|
22
|
+
* find the view tag and the Skia Image object is created from the view tag. This means that on web
|
23
|
+
* you will need to implement the logic to create the image from the view ref yourself.
|
24
|
+
* @param viewRef Ref to the view we're creating an image from
|
25
|
+
* @returns A promise that resolves to a Skia Image object or rejects
|
26
|
+
* with an error id the view tag is invalid.
|
27
|
+
*/
|
28
|
+
export const makeImageFromView = <
|
29
|
+
T extends
|
30
|
+
| number
|
31
|
+
| React.Component<unknown, unknown>
|
32
|
+
| React.ComponentClass<unknown>
|
33
|
+
>(
|
34
|
+
viewRef: React.RefObject<T>,
|
35
|
+
callback:
|
36
|
+
| null
|
37
|
+
| ((viewRef: React.RefObject<T>) => Promise<SkImage | null>) = null
|
38
|
+
) => {
|
39
|
+
// In web implementation we just delegate the work to the provided callback
|
40
|
+
if (Platform.OS === "web") {
|
41
|
+
if (callback) {
|
42
|
+
return callback(viewRef);
|
43
|
+
} else {
|
44
|
+
Promise.reject(
|
45
|
+
new Error(
|
46
|
+
"Callback is required on web in the makeImageFromView function."
|
47
|
+
)
|
48
|
+
);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
const viewTag = findNodeHandle(viewRef.current);
|
52
|
+
if (viewTag !== null && viewTag !== 0) {
|
53
|
+
return Skia.Image.MakeImageFromViewTag(viewTag);
|
54
|
+
}
|
55
|
+
return Promise.reject(new Error("Invalid view tag"));
|
56
|
+
};
|
@@ -63,6 +63,14 @@ export interface ImageFactory {
|
|
63
63
|
*/
|
64
64
|
MakeImageFromEncoded: (encoded: SkData) => SkImage | null;
|
65
65
|
|
66
|
+
/**
|
67
|
+
* Returns an image that will be a screenshot of the view represented by
|
68
|
+
* the view tag
|
69
|
+
* @param viewTag - The tag of the view to make an image from.
|
70
|
+
* @returns Returns a valid SkImage, if the view tag is invalid, nullptr is returned.
|
71
|
+
*/
|
72
|
+
MakeImageFromViewTag: (viewTag: number) => Promise<SkImage | null>;
|
73
|
+
|
66
74
|
/**
|
67
75
|
* Returns an image with the given pixel data and format.
|
68
76
|
* Note that we will always make a copy of the pixel data, because of inconsistencies in
|