expo-image-manipulator 12.0.0 → 12.0.2

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/CHANGELOG.md CHANGED
@@ -10,6 +10,16 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 12.0.2 — 2024-04-23
14
+
15
+ _This version does not introduce any user-facing changes._
16
+
17
+ ## 12.0.1 — 2024-04-22
18
+
19
+ ### 🎉 New features
20
+
21
+ - Added support for converting to WEBP on Android and iOS. ([#26379](https://github.com/expo/expo/pull/26379) by [@NikitaDudin](https://github.com/NikitaDudin))
22
+
13
23
  ## 12.0.0 — 2024-04-18
14
24
 
15
25
  ### 💡 Others
@@ -1,7 +1,7 @@
1
1
  apply plugin: 'com.android.library'
2
2
 
3
3
  group = 'host.exp.exponent'
4
- version = '12.0.0'
4
+ version = '12.0.2'
5
5
 
6
6
  def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
7
7
  apply from: expoModulesCorePlugin
@@ -14,7 +14,7 @@ android {
14
14
  namespace "expo.modules.imagemanipulator"
15
15
  defaultConfig {
16
16
  versionCode 23
17
- versionName "12.0.0"
17
+ versionName "12.0.2"
18
18
  }
19
19
  }
20
20
 
@@ -2,6 +2,7 @@ package expo.modules.imagemanipulator
2
2
 
3
3
  import android.content.Context
4
4
  import android.graphics.Bitmap.CompressFormat
5
+ import android.os.Build
5
6
  import java.io.File
6
7
  import java.io.IOException
7
8
  import java.util.*
@@ -26,6 +27,11 @@ internal object FileUtils {
26
27
  return when (compressFormat) {
27
28
  CompressFormat.JPEG -> ".jpg"
28
29
  CompressFormat.PNG -> ".png"
30
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
31
+ CompressFormat.WEBP_LOSSY
32
+ } else {
33
+ CompressFormat.WEBP
34
+ } -> ".webp"
29
35
  else -> ".jpg"
30
36
  }
31
37
  }
@@ -1,6 +1,7 @@
1
1
  package expo.modules.imagemanipulator
2
2
 
3
- import android.graphics.Bitmap
3
+ import android.graphics.Bitmap.CompressFormat
4
+ import android.os.Build
4
5
  import expo.modules.kotlin.records.Field
5
6
  import expo.modules.kotlin.records.Record
6
7
  import expo.modules.kotlin.types.Enumerable
@@ -17,15 +18,21 @@ data class SaveOptions(
17
18
  ) : Record {
18
19
  val compressFormat
19
20
  get() = when (format) {
20
- ImageFormat.JPEG, ImageFormat.JPG -> Bitmap.CompressFormat.JPEG
21
- ImageFormat.PNG -> Bitmap.CompressFormat.PNG
21
+ ImageFormat.JPEG, ImageFormat.JPG -> CompressFormat.JPEG
22
+ ImageFormat.PNG -> CompressFormat.PNG
23
+ ImageFormat.WEBP -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
24
+ CompressFormat.WEBP_LOSSY
25
+ } else {
26
+ CompressFormat.WEBP
27
+ }
22
28
  }
23
29
  }
24
30
 
25
31
  enum class ImageFormat(val value: String) : Enumerable {
26
32
  JPEG("jpeg"),
27
33
  JPG("jpg"),
28
- PNG("png")
34
+ PNG("png"),
35
+ WEBP("webp")
29
36
  }
30
37
 
31
38
  data class ManipulateAction(
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoImageManipulator.web.d.ts","sourceRoot":"","sources":["../src/ExpoImageManipulator.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;;yBA8CnE,MAAM,WACF,MAAM,EAAE,uBACR,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC;;AALzB,wBA0BE"}
1
+ {"version":3,"file":"ExpoImageManipulator.web.d.ts","sourceRoot":"","sources":["../src/ExpoImageManipulator.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;;yBA8CnE,MAAM,0CAEF,WAAW,GACnB,QAAQ,WAAW,CAAC;;AALzB,wBA0BE"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoImageManipulator.web.js","sourceRoot":"","sources":["../src/ExpoImageManipulator.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { ImageResult, SaveOptions, Action } from './ImageManipulator.types';\nimport { crop, extent, flip, resize, rotate } from './actions/index.web';\nimport { getContext } from './utils/getContext.web';\n\nfunction getResults(canvas: HTMLCanvasElement, options?: SaveOptions): ImageResult {\n let uri: string;\n if (options) {\n const { format = 'png' } = options;\n if (options.format === 'png' && options.compress !== undefined) {\n console.warn('compress is not supported with png format.');\n }\n const quality = Math.min(1, Math.max(0, options.compress ?? 1));\n uri = canvas.toDataURL('image/' + format, quality);\n } else {\n // defaults to PNG with no loss\n uri = canvas.toDataURL();\n }\n return {\n uri,\n width: canvas.width,\n height: canvas.height,\n base64: uri.replace(/^data:image\\/\\w+;base64,/, ''),\n };\n}\n\nfunction loadImageAsync(uri: string): Promise<HTMLCanvasElement> {\n return new Promise((resolve, reject) => {\n const imageSource = new Image();\n imageSource.crossOrigin = 'anonymous';\n const canvas = document.createElement('canvas');\n imageSource.onload = () => {\n canvas.width = imageSource.naturalWidth;\n canvas.height = imageSource.naturalHeight;\n\n const context = getContext(canvas);\n context.drawImage(imageSource, 0, 0, imageSource.naturalWidth, imageSource.naturalHeight);\n\n resolve(canvas);\n };\n imageSource.onerror = () => reject(canvas);\n imageSource.src = uri;\n });\n}\n\nexport default {\n async manipulateAsync(\n uri: string,\n actions: Action[] = [],\n options: SaveOptions\n ): Promise<ImageResult> {\n const originalCanvas = await loadImageAsync(uri);\n\n const resultCanvas = actions.reduce((canvas, action) => {\n if ('crop' in action) {\n return crop(canvas, action.crop);\n } else if ('extent' in action) {\n return extent(canvas, action.extent);\n } else if ('resize' in action) {\n return resize(canvas, action.resize);\n } else if ('flip' in action) {\n return flip(canvas, action.flip);\n } else if ('rotate' in action) {\n return rotate(canvas, action.rotate);\n } else {\n return canvas;\n }\n }, originalCanvas);\n\n return getResults(resultCanvas, options);\n },\n};\n"]}
1
+ {"version":3,"file":"ExpoImageManipulator.web.js","sourceRoot":"","sources":["../src/ExpoImageManipulator.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { ImageResult, SaveOptions, Action } from './ImageManipulator.types';\nimport { crop, extent, flip, resize, rotate } from './actions/index.web';\nimport { getContext } from './utils/getContext.web';\n\nfunction getResults(canvas: HTMLCanvasElement, options?: SaveOptions): ImageResult {\n let uri: string;\n if (options) {\n const { format = 'png' } = options;\n if (options.format === 'png' && options.compress !== undefined) {\n console.warn('compress is not supported with png format.');\n }\n const quality = Math.min(1, Math.max(0, options.compress ?? 1));\n uri = canvas.toDataURL('image/' + format, quality);\n } else {\n // defaults to PNG with no loss\n uri = canvas.toDataURL();\n }\n return {\n uri,\n width: canvas.width,\n height: canvas.height,\n base64: uri.replace(/^data:image\\/\\w+;base64,/, ''),\n };\n}\n\nfunction loadImageAsync(uri: string): Promise<HTMLCanvasElement> {\n return new Promise((resolve, reject) => {\n const imageSource = new Image();\n imageSource.crossOrigin = 'anonymous';\n const canvas = document.createElement('canvas');\n imageSource.onload = () => {\n canvas.width = imageSource.naturalWidth;\n canvas.height = imageSource.naturalHeight;\n\n const context = getContext(canvas);\n context.drawImage(imageSource, 0, 0, imageSource.naturalWidth, imageSource.naturalHeight);\n\n resolve(canvas);\n };\n imageSource.onerror = () => reject(canvas);\n imageSource.src = uri;\n });\n}\n\nexport default {\n async manipulateAsync(\n uri: string,\n actions: Action[] = [],\n options: SaveOptions\n ): Promise<ImageResult> {\n const originalCanvas = await loadImageAsync(uri);\n\n const resultCanvas = actions.reduce((canvas, action) => {\n if ('crop' in action) {\n return crop(canvas, action.crop);\n } else if ('extent' in action) {\n return extent(canvas, action.extent);\n } else if ('resize' in action) {\n return resize(canvas, action.resize);\n } else if ('flip' in action) {\n return flip(canvas, action.flip);\n } else if ('rotate' in action) {\n return rotate(canvas, action.rotate);\n } else {\n return canvas;\n }\n }, originalCanvas);\n\n return getResults(resultCanvas, options);\n },\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ImageManipulator.js","sourceRoot":"","sources":["../src/ImageManipulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAuB,UAAU,EAAe,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,cAAc;AACd;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,UAAoB,EAAE,EACtB,cAA2B,EAAE;IAE7B,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IACvE,CAAC;IAED,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAE7C,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC;IAC1D,OAAO,MAAM,oBAAoB,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,cAAc,0BAA0B,CAAC","sourcesContent":["import { UnavailabilityError } from 'expo-modules-core';\n\nimport ExpoImageManipulator from './ExpoImageManipulator';\nimport { Action, ImageResult, SaveFormat, SaveOptions } from './ImageManipulator.types';\nimport { validateArguments } from './validators';\n\n// @needsAudit\n/**\n * Manipulate the image provided via `uri`. Available modifications are rotating, flipping (mirroring),\n * resizing and cropping. Each invocation results in a new file. With one invocation you can provide\n * a set of actions to perform over the image. Overwriting the source file would not have an effect\n * in displaying the result as images are cached.\n * @param uri URI of the file to manipulate. Should be on the local file system or a base64 data URI.\n * @param actions An array of objects representing manipulation options. Each object should have\n * __only one__ of the keys that corresponds to specific transformation.\n * @param saveOptions A map defining how modified image should be saved.\n * @return Promise which fulfils with [`ImageResult`](#imageresult) object.\n */\nexport async function manipulateAsync(\n uri: string,\n actions: Action[] = [],\n saveOptions: SaveOptions = {}\n): Promise<ImageResult> {\n if (!ExpoImageManipulator.manipulateAsync) {\n throw new UnavailabilityError('ImageManipulator', 'manipulateAsync');\n }\n\n validateArguments(uri, actions, saveOptions);\n\n const { format = SaveFormat.JPEG, ...rest } = saveOptions;\n return await ExpoImageManipulator.manipulateAsync(uri, actions, { format, ...rest });\n}\n\nexport * from './ImageManipulator.types';\n"]}
1
+ {"version":3,"file":"ImageManipulator.js","sourceRoot":"","sources":["../src/ImageManipulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAuB,UAAU,EAAe,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,cAAc;AACd;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,UAAoB,EAAE,EACtB,cAA2B,EAAE;IAE7B,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE;QACzC,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;KACtE;IAED,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAE7C,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC;IAC1D,OAAO,MAAM,oBAAoB,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,cAAc,0BAA0B,CAAC","sourcesContent":["import { UnavailabilityError } from 'expo-modules-core';\n\nimport ExpoImageManipulator from './ExpoImageManipulator';\nimport { Action, ImageResult, SaveFormat, SaveOptions } from './ImageManipulator.types';\nimport { validateArguments } from './validators';\n\n// @needsAudit\n/**\n * Manipulate the image provided via `uri`. Available modifications are rotating, flipping (mirroring),\n * resizing and cropping. Each invocation results in a new file. With one invocation you can provide\n * a set of actions to perform over the image. Overwriting the source file would not have an effect\n * in displaying the result as images are cached.\n * @param uri URI of the file to manipulate. Should be on the local file system or a base64 data URI.\n * @param actions An array of objects representing manipulation options. Each object should have\n * __only one__ of the keys that corresponds to specific transformation.\n * @param saveOptions A map defining how modified image should be saved.\n * @return Promise which fulfils with [`ImageResult`](#imageresult) object.\n */\nexport async function manipulateAsync(\n uri: string,\n actions: Action[] = [],\n saveOptions: SaveOptions = {}\n): Promise<ImageResult> {\n if (!ExpoImageManipulator.manipulateAsync) {\n throw new UnavailabilityError('ImageManipulator', 'manipulateAsync');\n }\n\n validateArguments(uri, actions, saveOptions);\n\n const { format = SaveFormat.JPEG, ...rest } = saveOptions;\n return await ExpoImageManipulator.manipulateAsync(uri, actions, { format, ...rest });\n}\n\nexport * from './ImageManipulator.types';\n"]}
@@ -77,9 +77,6 @@ export type Action = ActionResize | ActionRotate | ActionFlip | ActionCrop | Act
77
77
  export declare enum SaveFormat {
78
78
  JPEG = "jpeg",
79
79
  PNG = "png",
80
- /**
81
- * @platform web
82
- */
83
80
  WEBP = "webp"
84
81
  }
85
82
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ImageManipulator.types.d.ts","sourceRoot":"","sources":["../src/ImageManipulator.types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,oBAAY,QAAQ;IAClB,QAAQ,aAAa;IACrB,UAAU,eAAe;CAC1B;AAGD,MAAM,MAAM,UAAU,GAAG;IACvB;;;OAGG;IACH,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAGF,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;OAKG;IACH,MAAM,EAAE;QACN,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAG1F,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,GAAG,QAAQ;IACX;;OAEG;IACH,IAAI,SAAS;CACd;AAGD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC"}
1
+ {"version":3,"file":"ImageManipulator.types.d.ts","sourceRoot":"","sources":["../src/ImageManipulator.types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,oBAAY,QAAQ;IAClB,QAAQ,aAAa;IACrB,UAAU,eAAe;CAC1B;AAGD,MAAM,MAAM,UAAU,GAAG;IACvB;;;OAGG;IACH,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAGF,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;OAKG;IACH,MAAM,EAAE;QACN,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAG1F,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AAGD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC"}
@@ -9,9 +9,6 @@ export var SaveFormat;
9
9
  (function (SaveFormat) {
10
10
  SaveFormat["JPEG"] = "jpeg";
11
11
  SaveFormat["PNG"] = "png";
12
- /**
13
- * @platform web
14
- */
15
12
  SaveFormat["WEBP"] = "webp";
16
13
  })(SaveFormat || (SaveFormat = {}));
17
14
  //# sourceMappingURL=ImageManipulator.types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageManipulator.types.js","sourceRoot":"","sources":["../src/ImageManipulator.types.ts"],"names":[],"mappings":"AA4CA,eAAe;AACf,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,qCAAyB,CAAA;AAC3B,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB;AA4CD,eAAe;AACf,MAAM,CAAN,IAAY,UAOX;AAPD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,yBAAW,CAAA;IACX;;OAEG;IACH,2BAAa,CAAA;AACf,CAAC,EAPW,UAAU,KAAV,UAAU,QAOrB","sourcesContent":["// @needsAudit\nexport type ImageResult = {\n /**\n * An URI to the modified image (usable as the source for an `Image` or `Video` element).\n */\n uri: string;\n /**\n * Width of the image or video.\n */\n width: number;\n /**\n * Height of the image or video.\n */\n height: number;\n /**\n * It is included if the `base64` save option was truthy, and is a string containing the\n * JPEG/PNG (depending on `format`) data of the image in Base64. Prepend that with `'data:image/xxx;base64,'`\n * to get a data URI, which you can use as the source for an `Image` element for example\n * (where `xxx` is `jpeg` or `png`).\n */\n base64?: string;\n};\n\n// @needsAudit\nexport type ActionResize = {\n /**\n * Values correspond to the result image dimensions. If you specify only one value, the other will\n * be calculated automatically to preserve image ratio.\n */\n resize: {\n width?: number;\n height?: number;\n };\n};\n\n// @needsAudit\nexport type ActionRotate = {\n /**\n * Degrees to rotate the image. Rotation is clockwise when the value is positive and\n * counter-clockwise when negative.\n */\n rotate: number;\n};\n\n// @docsMissing\nexport enum FlipType {\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n}\n\n// @needsAudit\nexport type ActionFlip = {\n /**\n * An axis on which image will be flipped. Only one flip per transformation is available. If you\n * want to flip according to both axes then provide two separate transformations.\n */\n flip: FlipType;\n};\n\n// @needsAudit\nexport type ActionCrop = {\n /**\n * Fields specify top-left corner and dimensions of a crop rectangle.\n */\n crop: {\n originX: number;\n originY: number;\n width: number;\n height: number;\n };\n};\n\n// @needsAudit\nexport type ActionExtent = {\n /**\n * Set the image size and offset. If the image is enlarged, unfilled areas are set to the `backgroundColor`.\n * To position the image, use `originX` and `originY`.\n *\n * @platform web\n */\n extent: {\n backgroundColor?: string | null;\n originX?: number;\n originY?: number;\n width: number;\n height: number;\n };\n};\n\n// @docsMissing\nexport type Action = ActionResize | ActionRotate | ActionFlip | ActionCrop | ActionExtent;\n\n// @docsMissing\nexport enum SaveFormat {\n JPEG = 'jpeg',\n PNG = 'png',\n /**\n * @platform web\n */\n WEBP = 'webp',\n}\n\n// @needsAudit\n/**\n * A map defining how modified image should be saved.\n */\nexport type SaveOptions = {\n /**\n * Whether to also include the image data in Base64 format.\n */\n base64?: boolean;\n /**\n * A value in range `0.0` - `1.0` specifying compression level of the result image. `1` means\n * no compression (highest quality) and `0` the highest compression (lowest quality).\n */\n compress?: number;\n /**\n * Specifies what type of compression should be used and what is the result file extension.\n * `SaveFormat.PNG` compression is lossless but slower, `SaveFormat.JPEG` is faster but the image\n * has visible artifacts. Defaults to `SaveFormat.JPEG`\n */\n format?: SaveFormat;\n};\n"]}
1
+ {"version":3,"file":"ImageManipulator.types.js","sourceRoot":"","sources":["../src/ImageManipulator.types.ts"],"names":[],"mappings":"AA4CA,eAAe;AACf,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,qCAAyB,CAAA;AAC3B,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB;AA4CD,eAAe;AACf,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,yBAAW,CAAA;IACX,2BAAa,CAAA;AACf,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB","sourcesContent":["// @needsAudit\nexport type ImageResult = {\n /**\n * An URI to the modified image (usable as the source for an `Image` or `Video` element).\n */\n uri: string;\n /**\n * Width of the image or video.\n */\n width: number;\n /**\n * Height of the image or video.\n */\n height: number;\n /**\n * It is included if the `base64` save option was truthy, and is a string containing the\n * JPEG/PNG (depending on `format`) data of the image in Base64. Prepend that with `'data:image/xxx;base64,'`\n * to get a data URI, which you can use as the source for an `Image` element for example\n * (where `xxx` is `jpeg` or `png`).\n */\n base64?: string;\n};\n\n// @needsAudit\nexport type ActionResize = {\n /**\n * Values correspond to the result image dimensions. If you specify only one value, the other will\n * be calculated automatically to preserve image ratio.\n */\n resize: {\n width?: number;\n height?: number;\n };\n};\n\n// @needsAudit\nexport type ActionRotate = {\n /**\n * Degrees to rotate the image. Rotation is clockwise when the value is positive and\n * counter-clockwise when negative.\n */\n rotate: number;\n};\n\n// @docsMissing\nexport enum FlipType {\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n}\n\n// @needsAudit\nexport type ActionFlip = {\n /**\n * An axis on which image will be flipped. Only one flip per transformation is available. If you\n * want to flip according to both axes then provide two separate transformations.\n */\n flip: FlipType;\n};\n\n// @needsAudit\nexport type ActionCrop = {\n /**\n * Fields specify top-left corner and dimensions of a crop rectangle.\n */\n crop: {\n originX: number;\n originY: number;\n width: number;\n height: number;\n };\n};\n\n// @needsAudit\nexport type ActionExtent = {\n /**\n * Set the image size and offset. If the image is enlarged, unfilled areas are set to the `backgroundColor`.\n * To position the image, use `originX` and `originY`.\n *\n * @platform web\n */\n extent: {\n backgroundColor?: string | null;\n originX?: number;\n originY?: number;\n width: number;\n height: number;\n };\n};\n\n// @docsMissing\nexport type Action = ActionResize | ActionRotate | ActionFlip | ActionCrop | ActionExtent;\n\n// @docsMissing\nexport enum SaveFormat {\n JPEG = 'jpeg',\n PNG = 'png',\n WEBP = 'webp',\n}\n\n// @needsAudit\n/**\n * A map defining how modified image should be saved.\n */\nexport type SaveOptions = {\n /**\n * Whether to also include the image data in Base64 format.\n */\n base64?: boolean;\n /**\n * A value in range `0.0` - `1.0` specifying compression level of the result image. `1` means\n * no compression (highest quality) and `0` the highest compression (lowest quality).\n */\n compress?: number;\n /**\n * Specifies what type of compression should be used and what is the result file extension.\n * `SaveFormat.PNG` compression is lossless but slower, `SaveFormat.JPEG` is faster but the image\n * has visible artifacts. Defaults to `SaveFormat.JPEG`\n */\n format?: SaveFormat;\n};\n"]}
@@ -1,4 +1,4 @@
1
1
  import { ActionCrop } from '../ImageManipulator.types';
2
- declare const _default: (canvas: HTMLCanvasElement, options: ActionCrop["crop"]) => HTMLCanvasElement;
2
+ declare const _default: (canvas: HTMLCanvasElement, options: ActionCrop['crop']) => HTMLCanvasElement;
3
3
  export default _default;
4
4
  //# sourceMappingURL=CropAction.web.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CropAction.web.js","sourceRoot":"","sources":["../../src/actions/CropAction.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,eAAe,CAAC,MAAyB,EAAE,OAA2B,EAAE,EAAE;IACxE,6BAA6B;IAC7B,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAClE,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAChE,sBAAsB;IACtB,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAExC,oBAAoB;IACpB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IAC1D,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IAE7D,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,UAAU,CAClB,4BAA4B,EAC5B,oCAAoC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CACxE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEvB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAEhF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { CodedError } from 'expo-modules-core';\n\nimport { ActionCrop } from '../ImageManipulator.types';\nimport { getContext } from '../utils/getContext.web';\n\nexport default (canvas: HTMLCanvasElement, options: ActionCrop['crop']) => {\n // ensure values are defined.\n let { originX = 0, originY = 0, width = 0, height = 0 } = options;\n const clamp = (value, max) => Math.max(0, Math.min(max, value));\n // lock within bounds.\n width = clamp(width, canvas.width);\n height = clamp(height, canvas.height);\n originX = clamp(originX, canvas.width);\n originY = clamp(originY, canvas.height);\n\n // lock sum of crop.\n width = Math.min(originX + width, canvas.width) - originX;\n height = Math.min(originY + height, canvas.height) - originY;\n\n if (width === 0 || height === 0) {\n throw new CodedError(\n 'ERR_IMAGE_MANIPULATOR_CROP',\n 'Crop size must be greater than 0: ' + JSON.stringify(options, null, 2)\n );\n }\n\n const result = document.createElement('canvas');\n result.width = width;\n result.height = height;\n\n const context = getContext(result);\n context.drawImage(canvas, originX, originY, width, height, 0, 0, width, height);\n\n return result;\n};\n"]}
1
+ {"version":3,"file":"CropAction.web.js","sourceRoot":"","sources":["../../src/actions/CropAction.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,eAAe,CAAC,MAAyB,EAAE,OAA2B,EAAE,EAAE;IACxE,6BAA6B;IAC7B,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAClE,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAChE,sBAAsB;IACtB,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAExC,oBAAoB;IACpB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IAC1D,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IAE7D,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE;QAC/B,MAAM,IAAI,UAAU,CAClB,4BAA4B,EAC5B,oCAAoC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CACxE,CAAC;KACH;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEvB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAEhF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { CodedError } from 'expo-modules-core';\n\nimport { ActionCrop } from '../ImageManipulator.types';\nimport { getContext } from '../utils/getContext.web';\n\nexport default (canvas: HTMLCanvasElement, options: ActionCrop['crop']) => {\n // ensure values are defined.\n let { originX = 0, originY = 0, width = 0, height = 0 } = options;\n const clamp = (value, max) => Math.max(0, Math.min(max, value));\n // lock within bounds.\n width = clamp(width, canvas.width);\n height = clamp(height, canvas.height);\n originX = clamp(originX, canvas.width);\n originY = clamp(originY, canvas.height);\n\n // lock sum of crop.\n width = Math.min(originX + width, canvas.width) - originX;\n height = Math.min(originY + height, canvas.height) - originY;\n\n if (width === 0 || height === 0) {\n throw new CodedError(\n 'ERR_IMAGE_MANIPULATOR_CROP',\n 'Crop size must be greater than 0: ' + JSON.stringify(options, null, 2)\n );\n }\n\n const result = document.createElement('canvas');\n result.width = width;\n result.height = height;\n\n const context = getContext(result);\n context.drawImage(canvas, originX, originY, width, height, 0, 0, width, height);\n\n return result;\n};\n"]}
@@ -1,4 +1,4 @@
1
1
  import { ActionExtent } from '../ImageManipulator.types';
2
- declare const _default: (canvas: HTMLCanvasElement, options: ActionExtent["extent"]) => HTMLCanvasElement;
2
+ declare const _default: (canvas: HTMLCanvasElement, options: ActionExtent['extent']) => HTMLCanvasElement;
3
3
  export default _default;
4
4
  //# sourceMappingURL=ExtentAction.web.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExtentAction.web.js","sourceRoot":"","sources":["../../src/actions/ExtentAction.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,eAAe,CAAC,MAAyB,EAAE,OAA+B,EAAE,EAAE;IAC5E,6BAA6B;IAC7B,MAAM,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAE5F,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,UAAU,CAClB,8BAA8B,EAC9B,sCAAsC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEvB,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACrC,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACrC,MAAM,EAAE,GACN,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;IAClG,MAAM,EAAE,GACN,OAAO,GAAG,CAAC;QACT,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;IAEhD,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC;QACpC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAE1D,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { CodedError } from 'expo-modules-core';\n\nimport { ActionExtent } from '../ImageManipulator.types';\nimport { getContext } from '../utils/getContext.web';\n\nexport default (canvas: HTMLCanvasElement, options: ActionExtent['extent']) => {\n // ensure values are defined.\n const { backgroundColor = null, originX = 0, originY = 0, width = 0, height = 0 } = options;\n\n if (width === 0 || height === 0) {\n throw new CodedError(\n 'ERR_IMAGE_MANIPULATOR_EXTENT',\n 'Extent size must be greater than 0: ' + JSON.stringify(options, null, 2)\n );\n }\n\n const result = document.createElement('canvas');\n result.width = width;\n result.height = height;\n\n const sx = originX < 0 ? 0 : originX;\n const sy = originY < 0 ? 0 : originY;\n const sw =\n originX < 0 ? Math.min(canvas.width, width + originX) : Math.min(canvas.width - originX, width);\n const sh =\n originY < 0\n ? Math.min(canvas.height, height + originY)\n : Math.min(canvas.height - originY, height);\n\n const dx = originX < 0 ? -originX : 0;\n const dy = originY < 0 ? -originY : 0;\n\n const context = getContext(result);\n\n if (backgroundColor != null) {\n context.fillStyle = backgroundColor;\n context.fillRect(0, 0, width, height);\n }\n\n context.drawImage(canvas, sx, sy, sw, sh, dx, dy, sw, sh);\n\n return result;\n};\n"]}
1
+ {"version":3,"file":"ExtentAction.web.js","sourceRoot":"","sources":["../../src/actions/ExtentAction.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,eAAe,CAAC,MAAyB,EAAE,OAA+B,EAAE,EAAE;IAC5E,6BAA6B;IAC7B,MAAM,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAE5F,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE;QAC/B,MAAM,IAAI,UAAU,CAClB,8BAA8B,EAC9B,sCAAsC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAC1E,CAAC;KACH;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEvB,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACrC,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACrC,MAAM,EAAE,GACN,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;IAClG,MAAM,EAAE,GACN,OAAO,GAAG,CAAC;QACT,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;IAEhD,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,eAAe,IAAI,IAAI,EAAE;QAC3B,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC;QACpC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;KACvC;IAED,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAE1D,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { CodedError } from 'expo-modules-core';\n\nimport { ActionExtent } from '../ImageManipulator.types';\nimport { getContext } from '../utils/getContext.web';\n\nexport default (canvas: HTMLCanvasElement, options: ActionExtent['extent']) => {\n // ensure values are defined.\n const { backgroundColor = null, originX = 0, originY = 0, width = 0, height = 0 } = options;\n\n if (width === 0 || height === 0) {\n throw new CodedError(\n 'ERR_IMAGE_MANIPULATOR_EXTENT',\n 'Extent size must be greater than 0: ' + JSON.stringify(options, null, 2)\n );\n }\n\n const result = document.createElement('canvas');\n result.width = width;\n result.height = height;\n\n const sx = originX < 0 ? 0 : originX;\n const sy = originY < 0 ? 0 : originY;\n const sw =\n originX < 0 ? Math.min(canvas.width, width + originX) : Math.min(canvas.width - originX, width);\n const sh =\n originY < 0\n ? Math.min(canvas.height, height + originY)\n : Math.min(canvas.height - originY, height);\n\n const dx = originX < 0 ? -originX : 0;\n const dy = originY < 0 ? -originY : 0;\n\n const context = getContext(result);\n\n if (backgroundColor != null) {\n context.fillStyle = backgroundColor;\n context.fillRect(0, 0, width, height);\n }\n\n context.drawImage(canvas, sx, sy, sw, sh, dx, dy, sw, sh);\n\n return result;\n};\n"]}
@@ -1,4 +1,4 @@
1
1
  import { ActionFlip } from '../ImageManipulator.types';
2
- declare const _default: (canvas: HTMLCanvasElement, flip: ActionFlip["flip"]) => HTMLCanvasElement;
2
+ declare const _default: (canvas: HTMLCanvasElement, flip: ActionFlip['flip']) => HTMLCanvasElement;
3
3
  export default _default;
4
4
  //# sourceMappingURL=FlipAction.web.d.ts.map
@@ -1,4 +1,4 @@
1
1
  import { ActionResize } from '../ImageManipulator.types';
2
- declare const _default: (canvas: HTMLCanvasElement, { width, height }: ActionResize["resize"]) => HTMLCanvasElement;
2
+ declare const _default: (canvas: HTMLCanvasElement, { width, height }: ActionResize['resize']) => HTMLCanvasElement;
3
3
  export default _default;
4
4
  //# sourceMappingURL=ResizeAction.web.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResizeAction.web.js","sourceRoot":"","sources":["../../src/actions/ResizeAction.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { ActionResize } from '../ImageManipulator.types';\nimport { getContext } from '../utils/getContext.web';\n\n/**\n * Hermite resize - fast image resize/resample using Hermite filter. 1 cpu version!\n * https://stackoverflow.com/a/18320662/4047926\n *\n * @param {HTMLCanvasElement} canvas\n * @param {int} width\n * @param {int} height\n * @param {boolean} resizeCanvas if true, canvas will be resized. Optional.\n */\nfunction resampleSingle(\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n resizeCanvas: boolean = false\n): HTMLCanvasElement {\n const result = document.createElement('canvas');\n result.width = canvas.width;\n result.height = canvas.height;\n\n const widthSource = canvas.width;\n const heightSource = canvas.height;\n width = Math.round(width);\n height = Math.round(height);\n\n const wRatio = widthSource / width;\n const hRatio = heightSource / height;\n const wRatioHalf = Math.ceil(wRatio / 2);\n const hRatioHalf = Math.ceil(hRatio / 2);\n\n const ctx = getContext(canvas);\n\n const img = ctx.getImageData(0, 0, widthSource, heightSource);\n const img2 = ctx.createImageData(width, height);\n const data = img.data;\n const data2 = img2.data;\n\n for (let j = 0; j < height; j++) {\n for (let i = 0; i < width; i++) {\n const x2 = (i + j * width) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gx_r = 0;\n let gx_g = 0;\n let gx_b = 0;\n let gx_a = 0;\n const yCenter = (j + 0.5) * hRatio;\n const yy_start = Math.floor(j * hRatio);\n const yy_stop = Math.ceil((j + 1) * hRatio);\n for (let yy = yy_start; yy < yy_stop; yy++) {\n const dy = Math.abs(yCenter - (yy + 0.5)) / hRatioHalf;\n const center_x = (i + 0.5) * wRatio;\n const w0 = dy * dy; //pre-calc part of w\n const xx_start = Math.floor(i * wRatio);\n const xx_stop = Math.ceil((i + 1) * wRatio);\n for (let xx = xx_start; xx < xx_stop; xx++) {\n const dx = Math.abs(center_x - (xx + 0.5)) / wRatioHalf;\n const w = Math.sqrt(w0 + dx * dx);\n if (w >= 1) {\n //pixel too far\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n const xPosition = 4 * (xx + yy * widthSource);\n //alpha\n gx_a += weight * data[xPosition + 3];\n weightsAlpha += weight;\n //colors\n if (data[xPosition + 3] < 255) {\n weight = (weight * data[xPosition + 3]) / 250;\n }\n gx_r += weight * data[xPosition];\n gx_g += weight * data[xPosition + 1];\n gx_b += weight * data[xPosition + 2];\n weights += weight;\n }\n }\n data2[x2] = gx_r / weights;\n data2[x2 + 1] = gx_g / weights;\n data2[x2 + 2] = gx_b / weights;\n data2[x2 + 3] = gx_a / weightsAlpha;\n }\n }\n\n //resize canvas\n if (resizeCanvas) {\n result.width = width;\n result.height = height;\n }\n\n //draw\n const context = getContext(result);\n context.putImageData(img2, 0, 0);\n\n return result;\n}\n\nexport default (canvas: HTMLCanvasElement, { width, height }: ActionResize['resize']) => {\n const imageRatio = canvas.width / canvas.height;\n\n let requestedWidth: number = 0;\n let requestedHeight: number = 0;\n if (width !== undefined) {\n requestedWidth = width;\n requestedHeight = requestedWidth / imageRatio;\n }\n if (height !== undefined) {\n requestedHeight = height;\n if (requestedWidth === 0) {\n requestedWidth = requestedHeight * imageRatio;\n }\n }\n\n return resampleSingle(canvas, requestedWidth, requestedHeight, true);\n};\n"]}
1
+ {"version":3,"file":"ResizeAction.web.js","sourceRoot":"","sources":["../../src/actions/ResizeAction.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { ActionResize } from '../ImageManipulator.types';\nimport { getContext } from '../utils/getContext.web';\n\n/**\n * Hermite resize - fast image resize/resample using Hermite filter. 1 cpu version!\n * https://stackoverflow.com/a/18320662/4047926\n *\n * @param {HTMLCanvasElement} canvas\n * @param {int} width\n * @param {int} height\n * @param {boolean} resizeCanvas if true, canvas will be resized. Optional.\n */\nfunction resampleSingle(\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n resizeCanvas: boolean = false\n): HTMLCanvasElement {\n const result = document.createElement('canvas');\n result.width = canvas.width;\n result.height = canvas.height;\n\n const widthSource = canvas.width;\n const heightSource = canvas.height;\n width = Math.round(width);\n height = Math.round(height);\n\n const wRatio = widthSource / width;\n const hRatio = heightSource / height;\n const wRatioHalf = Math.ceil(wRatio / 2);\n const hRatioHalf = Math.ceil(hRatio / 2);\n\n const ctx = getContext(canvas);\n\n const img = ctx.getImageData(0, 0, widthSource, heightSource);\n const img2 = ctx.createImageData(width, height);\n const data = img.data;\n const data2 = img2.data;\n\n for (let j = 0; j < height; j++) {\n for (let i = 0; i < width; i++) {\n const x2 = (i + j * width) * 4;\n let weight = 0;\n let weights = 0;\n let weightsAlpha = 0;\n let gx_r = 0;\n let gx_g = 0;\n let gx_b = 0;\n let gx_a = 0;\n const yCenter = (j + 0.5) * hRatio;\n const yy_start = Math.floor(j * hRatio);\n const yy_stop = Math.ceil((j + 1) * hRatio);\n for (let yy = yy_start; yy < yy_stop; yy++) {\n const dy = Math.abs(yCenter - (yy + 0.5)) / hRatioHalf;\n const center_x = (i + 0.5) * wRatio;\n const w0 = dy * dy; //pre-calc part of w\n const xx_start = Math.floor(i * wRatio);\n const xx_stop = Math.ceil((i + 1) * wRatio);\n for (let xx = xx_start; xx < xx_stop; xx++) {\n const dx = Math.abs(center_x - (xx + 0.5)) / wRatioHalf;\n const w = Math.sqrt(w0 + dx * dx);\n if (w >= 1) {\n //pixel too far\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n const xPosition = 4 * (xx + yy * widthSource);\n //alpha\n gx_a += weight * data[xPosition + 3];\n weightsAlpha += weight;\n //colors\n if (data[xPosition + 3] < 255) {\n weight = (weight * data[xPosition + 3]) / 250;\n }\n gx_r += weight * data[xPosition];\n gx_g += weight * data[xPosition + 1];\n gx_b += weight * data[xPosition + 2];\n weights += weight;\n }\n }\n data2[x2] = gx_r / weights;\n data2[x2 + 1] = gx_g / weights;\n data2[x2 + 2] = gx_b / weights;\n data2[x2 + 3] = gx_a / weightsAlpha;\n }\n }\n\n //resize canvas\n if (resizeCanvas) {\n result.width = width;\n result.height = height;\n }\n\n //draw\n const context = getContext(result);\n context.putImageData(img2, 0, 0);\n\n return result;\n}\n\nexport default (canvas: HTMLCanvasElement, { width, height }: ActionResize['resize']) => {\n const imageRatio = canvas.width / canvas.height;\n\n let requestedWidth: number = 0;\n let requestedHeight: number = 0;\n if (width !== undefined) {\n requestedWidth = width;\n requestedHeight = requestedWidth / imageRatio;\n }\n if (height !== undefined) {\n requestedHeight = height;\n if (requestedWidth === 0) {\n requestedWidth = requestedHeight * imageRatio;\n }\n }\n\n return resampleSingle(canvas, requestedWidth, requestedHeight, true);\n};\n"]}
@@ -1,4 +1,4 @@
1
1
  import { ActionRotate } from '../ImageManipulator.types';
2
- declare const _default: (canvas: HTMLCanvasElement, degrees: ActionRotate["rotate"]) => HTMLCanvasElement;
2
+ declare const _default: (canvas: HTMLCanvasElement, degrees: ActionRotate['rotate']) => HTMLCanvasElement;
3
3
  export default _default;
4
4
  //# sourceMappingURL=RotateAction.web.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RotateAction.web.js","sourceRoot":"","sources":["../../src/actions/RotateAction.web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,SAAS,aAAa,CACpB,KAAa,EACb,MAAc,EACd,KAAa;IAEb,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACV,CAAC,GAAG,CAAC,CAAC,CAAC;IACT,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACV,CAAC,GAAG,CAAC,CAAC,CAAC;IACT,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,eAAe,CAAC,MAAyB,EAAE,OAA+B,EAAE,EAAE;IAC5E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9E,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEvB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnC,4CAA4C;IAC5C,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEvD,sCAAsC;IACtC,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAExB,iBAAiB;IACjB,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAE9F,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { ActionRotate } from '../ImageManipulator.types';\nimport { getContext } from '../utils/getContext.web';\n\nfunction sizeFromAngle(\n width: number,\n height: number,\n angle: number\n): { width: number; height: number } {\n const radians = (angle * Math.PI) / 180;\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n if (s < 0) {\n s = -s;\n }\n if (c < 0) {\n c = -c;\n }\n return { width: height * s + width * c, height: height * c + width * s };\n}\n\nexport default (canvas: HTMLCanvasElement, degrees: ActionRotate['rotate']) => {\n const { width, height } = sizeFromAngle(canvas.width, canvas.height, degrees);\n\n const result = document.createElement('canvas');\n result.width = width;\n result.height = height;\n\n const context = getContext(result);\n\n // Set the origin to the center of the image\n context.translate(result.width / 2, result.height / 2);\n\n // Rotate the canvas around the origin\n const radians = (degrees * Math.PI) / 180;\n context.rotate(radians);\n\n // Draw the image\n context.drawImage(canvas, -canvas.width / 2, -canvas.height / 2, canvas.width, canvas.height);\n\n return result;\n};\n"]}
1
+ {"version":3,"file":"RotateAction.web.js","sourceRoot":"","sources":["../../src/actions/RotateAction.web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,SAAS,aAAa,CACpB,KAAa,EACb,MAAc,EACd,KAAa;IAEb,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,CAAC,GAAG,CAAC,CAAC,CAAC;KACR;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,CAAC,GAAG,CAAC,CAAC,CAAC;KACR;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,eAAe,CAAC,MAAyB,EAAE,OAA+B,EAAE,EAAE;IAC5E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9E,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEvB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnC,4CAA4C;IAC5C,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEvD,sCAAsC;IACtC,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAExB,iBAAiB;IACjB,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAE9F,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { ActionRotate } from '../ImageManipulator.types';\nimport { getContext } from '../utils/getContext.web';\n\nfunction sizeFromAngle(\n width: number,\n height: number,\n angle: number\n): { width: number; height: number } {\n const radians = (angle * Math.PI) / 180;\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n if (s < 0) {\n s = -s;\n }\n if (c < 0) {\n c = -c;\n }\n return { width: height * s + width * c, height: height * c + width * s };\n}\n\nexport default (canvas: HTMLCanvasElement, degrees: ActionRotate['rotate']) => {\n const { width, height } = sizeFromAngle(canvas.width, canvas.height, degrees);\n\n const result = document.createElement('canvas');\n result.width = width;\n result.height = height;\n\n const context = getContext(result);\n\n // Set the origin to the center of the image\n context.translate(result.width / 2, result.height / 2);\n\n // Rotate the canvas around the origin\n const radians = (degrees * Math.PI) / 180;\n context.rotate(radians);\n\n // Draw the image\n context.drawImage(canvas, -canvas.width / 2, -canvas.height / 2, canvas.width, canvas.height);\n\n return result;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getContext.web.js","sourceRoot":"","sources":["../../src/utils/getContext.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,UAAU,CAAC,uBAAuB,EAAE,iCAAiC,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import { CodedError } from 'expo-modules-core';\n\nexport function getContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D {\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new CodedError('ERR_IMAGE_MANIPULATOR', 'Failed to create canvas context');\n }\n return ctx;\n}\n"]}
1
+ {"version":3,"file":"getContext.web.js","sourceRoot":"","sources":["../../src/utils/getContext.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE;QACR,MAAM,IAAI,UAAU,CAAC,uBAAuB,EAAE,iCAAiC,CAAC,CAAC;KAClF;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import { CodedError } from 'expo-modules-core';\n\nexport function getContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D {\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new CodedError('ERR_IMAGE_MANIPULATOR', 'Failed to create canvas context');\n }\n return ctx;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Action,\n ActionCrop,\n ActionExtent,\n ActionFlip,\n ActionResize,\n ActionRotate,\n FlipType,\n SaveFormat,\n SaveOptions,\n} from './ImageManipulator.types';\n\nexport function validateArguments(uri: string, actions: Action[], saveOptions: SaveOptions) {\n validateUri(uri);\n validateActions(actions);\n validateSaveOptions(saveOptions);\n}\n\nexport function validateUri(uri: string): void {\n if (!(typeof uri === 'string')) {\n throw new TypeError('The \"uri\" argument must be a string');\n }\n}\n\nexport function validateActions(actions: Action[]): void {\n if (!Array.isArray(actions)) {\n throw new TypeError('The \"actions\" argument must be an array');\n }\n for (const action of actions) {\n if (typeof action !== 'object' || action === null) {\n throw new TypeError('Action must be an object');\n }\n const supportedActionTypes = ['crop', 'extent', 'flip', 'rotate', 'resize'];\n const actionKeys = Object.keys(action);\n if (actionKeys.length !== 1) {\n throw new TypeError(\n `Single action must contain exactly one transformation: ${supportedActionTypes.join(', ')}`\n );\n }\n const actionType = actionKeys[0];\n if (!supportedActionTypes.includes(actionType)) {\n throw new TypeError(`Unsupported action type: ${actionType}`);\n }\n\n if (actionType === 'crop') {\n validateCropAction(action as ActionCrop);\n } else if (actionType === 'extent') {\n validateExtentAction(action as ActionExtent);\n } else if (actionType === 'flip') {\n validateFlipAction(action as ActionFlip);\n } else if (actionType === 'rotate') {\n validateRotateAction(action as ActionRotate);\n } else if (actionType === 'resize') {\n validateResizeAction(action as ActionResize);\n }\n }\n}\n\nfunction validateCropAction(action: ActionCrop): void {\n const isValid =\n typeof action.crop === 'object' &&\n action.crop !== null &&\n typeof action.crop.originX === 'number' &&\n typeof action.crop.originY === 'number' &&\n typeof action.crop.width === 'number' &&\n typeof action.crop.height === 'number';\n if (!isValid) {\n throw new TypeError(\n 'Crop action must be an object of shape { originX: number; originY: number; width: number; height: number }'\n );\n }\n}\n\nfunction validateExtentAction(action: ActionExtent): void {\n const isValid =\n typeof action.extent === 'object' &&\n action.extent !== null &&\n (action.extent.backgroundColor == null || typeof action.extent.backgroundColor === 'string') &&\n (action.extent.originX == null || typeof action.extent.originX === 'number') &&\n (action.extent.originY == null || typeof action.extent.originY === 'number') &&\n typeof action.extent.width === 'number' &&\n typeof action.extent.height === 'number';\n if (!isValid) {\n throw new TypeError(\n 'Extent action must be an object of shape { backgroundColor?: string; originX?: number; originY?: number; width: number; height: number }'\n );\n }\n}\n\nfunction validateFlipAction(action: ActionFlip): void {\n if (\n typeof action.flip !== 'string' ||\n ![FlipType.Horizontal, FlipType.Vertical].includes(action.flip)\n ) {\n throw new TypeError(`Unsupported flip type: ${action.flip}`);\n }\n}\n\nfunction validateRotateAction(action: ActionRotate): void {\n if (typeof action.rotate !== 'number') {\n throw new TypeError('Rotation must be a number');\n }\n}\n\nfunction validateResizeAction(action: ActionResize): void {\n const isValid =\n typeof action.resize === 'object' &&\n action.resize !== null &&\n (typeof action.resize.width === 'number' || typeof action.resize.width === 'undefined') &&\n (typeof action.resize.height === 'number' || typeof action.resize.height === 'undefined');\n if (!isValid) {\n throw new TypeError(\n 'Resize action must be an object of shape { width?: number; height?: number }'\n );\n }\n}\n\nexport function validateSaveOptions({ base64, compress, format }: SaveOptions): void {\n if (base64 !== undefined && typeof base64 !== 'boolean') {\n throw new TypeError('The \"base64\" argument must be a boolean');\n }\n if (compress !== undefined) {\n if (typeof compress !== 'number') {\n throw new TypeError('The \"compress\" argument must be a number');\n }\n if (compress < 0 || compress > 1) {\n throw new TypeError('The \"compress\" argument must be a number between 0 and 1');\n }\n }\n const allowedFormats = [SaveFormat.JPEG, SaveFormat.PNG, SaveFormat.WEBP];\n if (format !== undefined && !allowedFormats.includes(format)) {\n throw new TypeError(`The \"format\" argument must be one of: ${allowedFormats.join(', ')}`);\n }\n}\n"]}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Action,\n ActionCrop,\n ActionExtent,\n ActionFlip,\n ActionResize,\n ActionRotate,\n FlipType,\n SaveFormat,\n SaveOptions,\n} from './ImageManipulator.types';\n\nexport function validateArguments(uri: string, actions: Action[], saveOptions: SaveOptions) {\n validateUri(uri);\n validateActions(actions);\n validateSaveOptions(saveOptions);\n}\n\nexport function validateUri(uri: string): void {\n if (!(typeof uri === 'string')) {\n throw new TypeError('The \"uri\" argument must be a string');\n }\n}\n\nexport function validateActions(actions: Action[]): void {\n if (!Array.isArray(actions)) {\n throw new TypeError('The \"actions\" argument must be an array');\n }\n for (const action of actions) {\n if (typeof action !== 'object' || action === null) {\n throw new TypeError('Action must be an object');\n }\n const supportedActionTypes = ['crop', 'extent', 'flip', 'rotate', 'resize'];\n const actionKeys = Object.keys(action);\n if (actionKeys.length !== 1) {\n throw new TypeError(\n `Single action must contain exactly one transformation: ${supportedActionTypes.join(', ')}`\n );\n }\n const actionType = actionKeys[0];\n if (!supportedActionTypes.includes(actionType)) {\n throw new TypeError(`Unsupported action type: ${actionType}`);\n }\n\n if (actionType === 'crop') {\n validateCropAction(action as ActionCrop);\n } else if (actionType === 'extent') {\n validateExtentAction(action as ActionExtent);\n } else if (actionType === 'flip') {\n validateFlipAction(action as ActionFlip);\n } else if (actionType === 'rotate') {\n validateRotateAction(action as ActionRotate);\n } else if (actionType === 'resize') {\n validateResizeAction(action as ActionResize);\n }\n }\n}\n\nfunction validateCropAction(action: ActionCrop): void {\n const isValid =\n typeof action.crop === 'object' &&\n action.crop !== null &&\n typeof action.crop.originX === 'number' &&\n typeof action.crop.originY === 'number' &&\n typeof action.crop.width === 'number' &&\n typeof action.crop.height === 'number';\n if (!isValid) {\n throw new TypeError(\n 'Crop action must be an object of shape { originX: number; originY: number; width: number; height: number }'\n );\n }\n}\n\nfunction validateExtentAction(action: ActionExtent): void {\n const isValid =\n typeof action.extent === 'object' &&\n action.extent !== null &&\n (action.extent.backgroundColor == null || typeof action.extent.backgroundColor === 'string') &&\n (action.extent.originX == null || typeof action.extent.originX === 'number') &&\n (action.extent.originY == null || typeof action.extent.originY === 'number') &&\n typeof action.extent.width === 'number' &&\n typeof action.extent.height === 'number';\n if (!isValid) {\n throw new TypeError(\n 'Extent action must be an object of shape { backgroundColor?: string; originX?: number; originY?: number; width: number; height: number }'\n );\n }\n}\n\nfunction validateFlipAction(action: ActionFlip): void {\n if (\n typeof action.flip !== 'string' ||\n ![FlipType.Horizontal, FlipType.Vertical].includes(action.flip)\n ) {\n throw new TypeError(`Unsupported flip type: ${action.flip}`);\n }\n}\n\nfunction validateRotateAction(action: ActionRotate): void {\n if (typeof action.rotate !== 'number') {\n throw new TypeError('Rotation must be a number');\n }\n}\n\nfunction validateResizeAction(action: ActionResize): void {\n const isValid =\n typeof action.resize === 'object' &&\n action.resize !== null &&\n (typeof action.resize.width === 'number' || typeof action.resize.width === 'undefined') &&\n (typeof action.resize.height === 'number' || typeof action.resize.height === 'undefined');\n if (!isValid) {\n throw new TypeError(\n 'Resize action must be an object of shape { width?: number; height?: number }'\n );\n }\n}\n\nexport function validateSaveOptions({ base64, compress, format }: SaveOptions): void {\n if (base64 !== undefined && typeof base64 !== 'boolean') {\n throw new TypeError('The \"base64\" argument must be a boolean');\n }\n if (compress !== undefined) {\n if (typeof compress !== 'number') {\n throw new TypeError('The \"compress\" argument must be a number');\n }\n if (compress < 0 || compress > 1) {\n throw new TypeError('The \"compress\" argument must be a number between 0 and 1');\n }\n }\n const allowedFormats = [SaveFormat.JPEG, SaveFormat.PNG, SaveFormat.WEBP];\n if (format !== undefined && !allowedFormats.includes(format)) {\n throw new TypeError(`The \"format\" argument must be one of: ${allowedFormats.join(', ')}`);\n }\n}\n"]}
@@ -17,6 +17,7 @@ Pod::Spec.new do |s|
17
17
 
18
18
  s.dependency 'ExpoModulesCore'
19
19
  s.dependency 'EXImageLoader'
20
+ s.dependency 'SDWebImageWebPCoder'
20
21
 
21
22
  # Swift/Objective-C compatibility
22
23
  s.pod_target_xcconfig = {
@@ -81,6 +81,7 @@ internal enum ImageFormat: String, EnumArgument {
81
81
  case jpeg
82
82
  case jpg
83
83
  case png
84
+ case webp
84
85
 
85
86
  var fileExtension: String {
86
87
  switch self {
@@ -88,6 +89,8 @@ internal enum ImageFormat: String, EnumArgument {
88
89
  return ".jpg"
89
90
  case .png:
90
91
  return ".png"
92
+ case .webp:
93
+ return ".webp"
91
94
  }
92
95
  }
93
96
  }
@@ -4,6 +4,7 @@ import CoreGraphics
4
4
  import Photos
5
5
  import UIKit
6
6
  import ExpoModulesCore
7
+ import SDWebImageWebPCoder
7
8
 
8
9
  public class ImageManipulatorModule: Module {
9
10
  typealias LoadImageCallback = (Result<UIImage, Error>) -> Void
@@ -128,5 +129,7 @@ func imageData(from image: UIImage, format: ImageFormat, compression: Double) ->
128
129
  return image.jpegData(compressionQuality: compression)
129
130
  case .png:
130
131
  return image.pngData()
132
+ case .webp:
133
+ return SDImageWebPCoder.shared.encodedData(with: image, format: .webP, options: [.encodeCompressionQuality: compression])
131
134
  }
132
135
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-image-manipulator",
3
- "version": "12.0.0",
3
+ "version": "12.0.2",
4
4
  "description": "Provides functions that let you manipulation images on the local file system, eg: resize, crop.",
5
5
  "main": "build/ImageManipulator.js",
6
6
  "types": "build/ImageManipulator.d.ts",
@@ -39,5 +39,5 @@
39
39
  "peerDependencies": {
40
40
  "expo": "*"
41
41
  },
42
- "gitHead": "4165b8d72e1b9a1889c2767534cc619e21468110"
42
+ "gitHead": "ee4f30ef3b5fa567ad1bf94794197f7683fdd481"
43
43
  }
@@ -94,9 +94,6 @@ export type Action = ActionResize | ActionRotate | ActionFlip | ActionCrop | Act
94
94
  export enum SaveFormat {
95
95
  JPEG = 'jpeg',
96
96
  PNG = 'png',
97
- /**
98
- * @platform web
99
- */
100
97
  WEBP = 'webp',
101
98
  }
102
99