@capgo/camera-preview 7.4.0-beta.20 → 7.4.0-beta.21
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/README.md +30 -24
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +56 -28
- package/dist/docs.json +41 -0
- package/dist/esm/definitions.d.ts +8 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/web.js +44 -5
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +44 -5
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +44 -5
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/CapgoCameraPreview/CameraController.swift +49 -38
- package/ios/Sources/CapgoCameraPreview/Plugin.swift +30 -11
- package/package.json +1 -1
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["export var DeviceType;\n(function (DeviceType) {\n DeviceType[\"ULTRA_WIDE\"] = \"ultraWide\";\n DeviceType[\"WIDE_ANGLE\"] = \"wideAngle\";\n DeviceType[\"TELEPHOTO\"] = \"telephoto\";\n DeviceType[\"TRUE_DEPTH\"] = \"trueDepth\";\n DeviceType[\"DUAL\"] = \"dual\";\n DeviceType[\"DUAL_WIDE\"] = \"dualWide\";\n DeviceType[\"TRIPLE\"] = \"triple\";\n})(DeviceType || (DeviceType = {}));\n//# sourceMappingURL=definitions.js.map","import { registerPlugin } from \"@capacitor/core\";\nconst CameraPreview = registerPlugin(\"CameraPreview\", {\n web: () => import(\"./web\").then((m) => new m.CameraPreviewWeb()),\n});\nexport * from \"./definitions\";\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nimport { DeviceType } from \"./definitions\";\nconst DEFAULT_VIDEO_ID = \"capgo_video\";\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n /**\n * track which camera is used based on start options\n * used in capture\n */\n this.isBackCamera = false;\n this.currentDeviceId = null;\n this.videoElement = null;\n this.isStarted = false;\n }\n async getSupportedPictureSizes() {\n throw new Error(\"getSupportedPictureSizes not supported under the web platform\");\n }\n async start(options) {\n if (options.aspectRatio && (options.width || options.height)) {\n throw new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\");\n }\n if (this.isStarted) {\n throw new Error(\"camera already started\");\n }\n this.isBackCamera = true;\n this.isStarted = false;\n const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || \"\");\n const gridMode = (options === null || options === void 0 ? void 0 : options.gridMode) || \"none\";\n if (options.position) {\n this.isBackCamera = options.position === \"rear\";\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.remove();\n }\n const container = options.parent\n ? document.getElementById(options.parent)\n : document.body;\n if (!container) {\n throw new Error(\"container not found\");\n }\n this.videoElement = document.createElement(\"video\");\n this.videoElement.id = DEFAULT_VIDEO_ID;\n this.videoElement.className = options.className || \"\";\n this.videoElement.playsInline = true;\n this.videoElement.muted = true;\n this.videoElement.autoplay = true;\n // Remove objectFit as we'll match camera's native aspect ratio\n this.videoElement.style.backgroundColor = \"transparent\";\n // Reset any default margins that might interfere\n this.videoElement.style.margin = \"0\";\n this.videoElement.style.padding = \"0\";\n container.appendChild(this.videoElement);\n if (options.toBack) {\n this.videoElement.style.zIndex = \"-1\";\n }\n // Default to 16:9 vertical (9:16 for portrait) if no aspect ratio or size specified\n const useDefaultAspectRatio = !options.aspectRatio && !options.width && !options.height;\n const effectiveAspectRatio = options.aspectRatio || (useDefaultAspectRatio ? \"16:9\" : null);\n if (options.width) {\n this.videoElement.width = options.width;\n this.videoElement.style.width = `${options.width}px`;\n }\n if (options.height) {\n this.videoElement.height = options.height;\n this.videoElement.style.height = `${options.height}px`;\n }\n // Handle positioning - center if x or y not provided\n const centerX = options.x === undefined;\n const centerY = options.y === undefined;\n // Always set position to absolute for proper positioning\n this.videoElement.style.position = \"absolute\";\n console.log(\"Initial positioning flags:\", {\n centerX,\n centerY,\n x: options.x,\n y: options.y,\n });\n if (options.x !== undefined) {\n this.videoElement.style.left = `${options.x}px`;\n }\n if (options.y !== undefined) {\n this.videoElement.style.top = `${options.y}px`;\n }\n // Create and add grid overlay if needed\n if (gridMode !== \"none\") {\n const gridOverlay = this.createGridOverlay(gridMode);\n gridOverlay.id = \"camera-grid-overlay\";\n parent === null || parent === void 0 ? void 0 : parent.appendChild(gridOverlay);\n }\n // Aspect ratio handling is now done after getting camera stream\n // Store centering flags for later use\n const needsCenterX = centerX;\n const needsCenterY = centerY;\n console.log(\"Centering flags stored:\", { needsCenterX, needsCenterY });\n // First get the camera stream with basic constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n },\n };\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (!stream) {\n throw new Error(\"could not acquire stream\");\n }\n if (!this.videoElement) {\n throw new Error(\"video element not found\");\n }\n // Get the actual camera dimensions from the video track\n const videoTrack = stream.getVideoTracks()[0];\n const settings = videoTrack.getSettings();\n const cameraWidth = settings.width || 640;\n const cameraHeight = settings.height || 480;\n const cameraAspectRatio = cameraWidth / cameraHeight;\n console.log(\"Camera native dimensions:\", {\n width: cameraWidth,\n height: cameraHeight,\n aspectRatio: cameraAspectRatio,\n });\n console.log(\"Container dimensions:\", {\n width: container.offsetWidth,\n height: container.offsetHeight,\n id: container.id,\n });\n // Now adjust video element size based on camera's native aspect ratio\n if (!options.width && !options.height && !options.aspectRatio) {\n // No size specified, fit camera view within container bounds\n const containerWidth = container.offsetWidth || window.innerWidth;\n const containerHeight = container.offsetHeight || window.innerHeight;\n // Calculate dimensions that fit within container while maintaining camera aspect ratio\n let targetWidth, targetHeight;\n // Try fitting to container width first\n targetWidth = containerWidth;\n targetHeight = targetWidth / cameraAspectRatio;\n // If height exceeds container, fit to height instead\n if (targetHeight > containerHeight) {\n targetHeight = containerHeight;\n targetWidth = targetHeight * cameraAspectRatio;\n }\n console.log(\"Video element dimensions:\", {\n width: targetWidth,\n height: targetHeight,\n container: { width: containerWidth, height: containerHeight },\n });\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const x = Math.round((containerWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n const y = Math.round((window.innerHeight - targetHeight) / 2);\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n // Force a style recalculation\n this.videoElement.offsetHeight;\n console.log(\"Centering video:\", {\n viewportHeight: window.innerHeight,\n targetHeight,\n calculatedY: y,\n actualTop: this.videoElement.style.top,\n position: this.videoElement.style.position,\n });\n }\n }\n else if (effectiveAspectRatio && !options.width && !options.height) {\n // Aspect ratio specified but no size\n const [widthRatio, heightRatio] = effectiveAspectRatio\n .split(\":\")\n .map(Number);\n const targetRatio = widthRatio / heightRatio;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n let targetWidth, targetHeight;\n // Try fitting to viewport width first\n targetWidth = viewportWidth;\n targetHeight = targetWidth / targetRatio;\n // If height exceeds viewport, fit to height instead\n if (targetHeight > viewportHeight) {\n targetHeight = viewportHeight;\n targetWidth = targetHeight * targetRatio;\n }\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const parentWidth = container.offsetWidth || viewportWidth;\n const x = Math.round((parentWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n const parentHeight = container.offsetHeight || viewportHeight;\n const y = Math.round((parentHeight - targetHeight) / 2);\n this.videoElement.style.top = `${y}px`;\n }\n }\n this.videoElement.srcObject = stream;\n if (!this.isBackCamera) {\n this.videoElement.style.transform = \"scaleX(-1)\";\n }\n // Set initial zoom level if specified and supported\n if (options.initialZoomLevel && options.initialZoomLevel !== 1.0) {\n // videoTrack already declared above\n if (videoTrack) {\n const capabilities = videoTrack.getCapabilities();\n if (capabilities.zoom) {\n const zoomLevel = options.initialZoomLevel;\n const minZoom = capabilities.zoom.min || 1;\n const maxZoom = capabilities.zoom.max || 1;\n if (zoomLevel < minZoom || zoomLevel > maxZoom) {\n stream.getTracks().forEach((track) => track.stop());\n throw new Error(`Initial zoom level ${zoomLevel} is not available. Valid range is ${minZoom} to ${maxZoom}`);\n }\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n console.warn(`Failed to set initial zoom level: ${error}`);\n // Don't throw, just continue without zoom\n }\n }\n }\n }\n this.isStarted = true;\n // Wait for video to be ready and get actual dimensions\n await new Promise((resolve) => {\n if (this.videoElement.readyState >= 2) {\n resolve();\n }\n else {\n this.videoElement.addEventListener(\"loadeddata\", () => resolve(), {\n once: true,\n });\n }\n });\n // Ensure centering is applied after DOM updates\n await new Promise((resolve) => requestAnimationFrame(resolve));\n console.log(\"About to re-center, flags:\", { needsCenterX, needsCenterY });\n // Re-apply centering with correct parent dimensions\n if (needsCenterX) {\n const parentWidth = container.offsetWidth;\n const x = Math.round((parentWidth - this.videoElement.offsetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n console.log(\"Re-centering X:\", {\n parentWidth,\n videoWidth: this.videoElement.offsetWidth,\n x,\n });\n }\n if (needsCenterY) {\n const y = Math.round((window.innerHeight - this.videoElement.offsetHeight) / 2);\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n console.log(\"Re-centering Y:\", {\n viewportHeight: window.innerHeight,\n videoHeight: this.videoElement.offsetHeight,\n y,\n position: this.videoElement.style.position,\n top: this.videoElement.style.top,\n });\n }\n // Get the actual rendered dimensions after video is loaded\n const rect = this.videoElement.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(this.videoElement);\n console.log(\"Final video element state:\", {\n rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\n style: {\n position: computedStyle.position,\n left: computedStyle.left,\n top: computedStyle.top,\n width: computedStyle.width,\n height: computedStyle.height,\n },\n });\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n };\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks)\n track.stop();\n }\n }\n async stop() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n this.isStarted = false;\n }\n // Remove grid overlay if it exists\n const gridOverlay = document.getElementById(\"camera-grid-overlay\");\n gridOverlay === null || gridOverlay === void 0 ? void 0 : gridOverlay.remove();\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n reject(new Error(\"camera is not running\"));\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n // Calculate capture dimensions\n let captureWidth = video.videoWidth;\n let captureHeight = video.videoHeight;\n let sourceX = 0;\n let sourceY = 0;\n // Check for conflicting parameters\n if (options.aspectRatio && (options.width || options.height)) {\n reject(new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\"));\n return;\n }\n // Handle aspect ratio if no width/height specified\n if (!options.width && !options.height && options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio.split(':').map(Number);\n if (widthRatio && heightRatio) {\n // For capture in portrait orientation, swap the aspect ratio (16:9 becomes 9:16)\n const isPortrait = video.videoHeight > video.videoWidth;\n const targetAspectRatio = isPortrait ? heightRatio / widthRatio : widthRatio / heightRatio;\n const videoAspectRatio = video.videoWidth / video.videoHeight;\n if (videoAspectRatio > targetAspectRatio) {\n // Video is wider than target - crop sides\n captureWidth = video.videoHeight * targetAspectRatio;\n captureHeight = video.videoHeight;\n sourceX = (video.videoWidth - captureWidth) / 2;\n }\n else {\n // Video is taller than target - crop top/bottom\n captureWidth = video.videoWidth;\n captureHeight = video.videoWidth / targetAspectRatio;\n sourceY = (video.videoHeight - captureHeight) / 2;\n }\n }\n }\n else if (options.width || options.height) {\n // If width or height is specified, use them\n if (options.width)\n captureWidth = options.width;\n if (options.height)\n captureHeight = options.height;\n }\n canvas.width = captureWidth;\n canvas.height = captureHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context === null || context === void 0 ? void 0 : context.translate(captureWidth, 0);\n context === null || context === void 0 ? void 0 : context.scale(-1, 1);\n }\n context === null || context === void 0 ? void 0 : context.drawImage(video, sourceX, sourceY, captureWidth, captureHeight, 0, 0, captureWidth, captureHeight);\n if (options.saveToGallery) {\n // saveToGallery is not supported on web\n }\n if (options.withExifLocation) {\n // withExifLocation is not supported on web\n }\n if ((options.format || \"jpeg\") === \"jpeg\") {\n base64EncodedImage = canvas\n .toDataURL(\"image/jpeg\", (options.quality || 85) / 100.0)\n .replace(\"data:image/jpeg;base64,\", \"\");\n }\n else {\n base64EncodedImage = canvas\n .toDataURL(\"image/png\")\n .replace(\"data:image/png;base64,\", \"\");\n }\n }\n resolve({\n value: base64EncodedImage,\n exif: {},\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async stopRecordVideo() {\n throw new Error(\"stopRecordVideo not supported under the web platform\");\n }\n async startRecordVideo(_options) {\n console.log(\"startRecordVideo\", _options);\n throw new Error(\"startRecordVideo not supported under the web platform\");\n }\n async getSupportedFlashModes() {\n throw new Error(\"getSupportedFlashModes not supported under the web platform\");\n }\n async getHorizontalFov() {\n throw new Error(\"getHorizontalFov not supported under the web platform\");\n }\n async setFlashMode(_options) {\n throw new Error(`setFlashMode not supported under the web platform${_options}`);\n }\n async flip() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Toggle camera position\n this.isBackCamera = !this.isBackCamera;\n // Get new constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update current device ID from the new stream\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n this.currentDeviceId = videoTrack.getSettings().deviceId || null;\n }\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to flip camera: ${error}`);\n }\n }\n async setOpacity(_options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!!video && !!_options.opacity)\n video.style.setProperty(\"opacity\", _options.opacity.toString());\n }\n async isRunning() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n return { isRunning: !!video && !!video.srcObject };\n }\n async getAvailableDevices() {\n var _a;\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.enumerateDevices)) {\n throw new Error(\"getAvailableDevices not supported under the web platform\");\n }\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n // Group devices by position (front/back)\n const frontDevices = [];\n const backDevices = [];\n videoDevices.forEach((device, index) => {\n const label = device.label || `Camera ${index + 1}`;\n const labelLower = label.toLowerCase();\n // Determine device type based on label\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n const lensInfo = {\n deviceId: device.deviceId,\n label,\n deviceType,\n focalLength: 4.25,\n baseZoomRatio,\n minZoom: 1.0,\n maxZoom: 1.0,\n };\n // Determine position and add to appropriate array\n if (labelLower.includes(\"back\") || labelLower.includes(\"rear\")) {\n backDevices.push(lensInfo);\n }\n else {\n frontDevices.push(lensInfo);\n }\n });\n const result = [];\n if (frontDevices.length > 0) {\n result.push({\n deviceId: frontDevices[0].deviceId,\n label: \"Front Camera\",\n position: \"front\",\n lenses: frontDevices,\n isLogical: false,\n minZoom: Math.min(...frontDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...frontDevices.map((d) => d.maxZoom)),\n });\n }\n if (backDevices.length > 0) {\n result.push({\n deviceId: backDevices[0].deviceId,\n label: \"Back Camera\",\n position: \"rear\",\n lenses: backDevices,\n isLogical: false,\n minZoom: Math.min(...backDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...backDevices.map((d) => d.maxZoom)),\n });\n }\n return { devices: result };\n }\n async getZoom() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n const settings = videoTrack.getSettings();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n // Get current device info to determine lens type\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (this.currentDeviceId) {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === this.currentDeviceId);\n if (device) {\n const labelLower = device.label.toLowerCase();\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n }\n }\n const currentZoom = settings.zoom || 1;\n const lensInfo = {\n focalLength: 4.25,\n deviceType,\n baseZoomRatio,\n digitalZoom: currentZoom / baseZoomRatio,\n };\n return {\n min: capabilities.zoom.min || 1,\n max: capabilities.zoom.max || 1,\n current: currentZoom,\n lens: lensInfo,\n };\n }\n async setZoom(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n const zoomLevel = Math.max(capabilities.zoom.min || 1, Math.min(capabilities.zoom.max || 1, options.level));\n // Note: autoFocus is not supported on web platform\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n throw new Error(`Failed to set zoom: ${error}`);\n }\n }\n async getFlashMode() {\n throw new Error(\"getFlashMode not supported under the web platform\");\n }\n async getDeviceId() {\n return { deviceId: this.currentDeviceId || \"\" };\n }\n async setDeviceId(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Update current device ID\n this.currentDeviceId = options.deviceId;\n // Get new constraints with specific device ID\n const constraints = {\n video: {\n deviceId: { exact: options.deviceId },\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n // Try to determine camera position from device\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === options.deviceId);\n this.isBackCamera =\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"back\")) ||\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"rear\")) ||\n false;\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to swap to device ${options.deviceId}: ${error}`);\n }\n }\n async getAspectRatio() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const width = video.offsetWidth;\n const height = video.offsetHeight;\n if (width && height) {\n const ratio = width / height;\n // Check for portrait camera ratios: 4:3 -> 3:4, 16:9 -> 9:16\n if (Math.abs(ratio - 3 / 4) < 0.01) {\n return { aspectRatio: \"4:3\" };\n }\n if (Math.abs(ratio - 9 / 16) < 0.01) {\n return { aspectRatio: \"16:9\" };\n }\n }\n // Default to 4:3 if no specific aspect ratio is matched\n return { aspectRatio: \"4:3\" };\n }\n async setAspectRatio(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n if (options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n // For camera, use portrait orientation: 4:3 becomes 3:4, 16:9 becomes 9:16\n const ratio = heightRatio / widthRatio;\n // Get current position and size\n const rect = video.getBoundingClientRect();\n const currentWidth = rect.width;\n const currentHeight = rect.height;\n const currentRatio = currentWidth / currentHeight;\n let newWidth;\n let newHeight;\n if (currentRatio > ratio) {\n // Width is larger, fit by height and center horizontally\n newWidth = currentHeight * ratio;\n newHeight = currentHeight;\n }\n else {\n // Height is larger, fit by width and center vertically\n newWidth = currentWidth;\n newHeight = currentWidth / ratio;\n }\n // Calculate position\n let x, y;\n if (options.x !== undefined && options.y !== undefined) {\n // Use provided coordinates, ensuring they stay within screen boundaries\n x = Math.max(0, Math.min(options.x, window.innerWidth - newWidth));\n y = Math.max(0, Math.min(options.y, window.innerHeight - newHeight));\n }\n else {\n // Auto-center the view\n x = (window.innerWidth - newWidth) / 2;\n y = (window.innerHeight - newHeight) / 2;\n }\n video.style.width = `${newWidth}px`;\n video.style.height = `${newHeight}px`;\n video.style.left = `${x}px`;\n video.style.top = `${y}px`;\n video.style.position = \"absolute\";\n const offsetX = newWidth / 8;\n const offsetY = newHeight / 8;\n return {\n width: Math.round(newWidth),\n height: Math.round(newHeight),\n x: Math.round(x + offsetX),\n y: Math.round(y + offsetY),\n };\n }\n else {\n video.style.objectFit = \"cover\";\n const rect = video.getBoundingClientRect();\n const offsetX = rect.width / 8;\n const offsetY = rect.height / 8;\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.left + offsetX),\n y: Math.round(rect.top + offsetY),\n };\n }\n }\n createGridOverlay(gridMode) {\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"absolute\";\n overlay.style.top = \"0\";\n overlay.style.left = \"0\";\n overlay.style.width = \"100%\";\n overlay.style.height = \"100%\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.zIndex = \"10\";\n const divisions = gridMode === \"3x3\" ? 3 : 4;\n // Create SVG for grid lines\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.style.width = \"100%\";\n svg.style.height = \"100%\";\n svg.style.position = \"absolute\";\n svg.style.top = \"0\";\n svg.style.left = \"0\";\n // Create grid lines\n for (let i = 1; i < divisions; i++) {\n // Vertical lines\n const verticalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n verticalLine.setAttribute(\"x1\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y1\", \"0%\");\n verticalLine.setAttribute(\"x2\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y2\", \"100%\");\n verticalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n verticalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(verticalLine);\n // Horizontal lines\n const horizontalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n horizontalLine.setAttribute(\"x1\", \"0%\");\n horizontalLine.setAttribute(\"y1\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"x2\", \"100%\");\n horizontalLine.setAttribute(\"y2\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n horizontalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(horizontalLine);\n }\n overlay.appendChild(svg);\n return overlay;\n }\n async setGridMode(options) {\n // Web implementation of grid mode would need to be implemented\n // For now, just resolve as a no-op\n console.warn(`Grid mode '${options.gridMode}' is not yet implemented for web platform`);\n }\n async getGridMode() {\n // Web implementation - default to none\n return { gridMode: \"none\" };\n }\n async getPreviewSize() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const offsetX = video.width / 8;\n const offsetY = video.height / 8;\n return {\n x: video.offsetLeft + offsetX,\n y: video.offsetTop + offsetY,\n width: video.width,\n height: video.height,\n };\n }\n async setPreviewSize(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n video.style.left = `${options.x}px`;\n video.style.top = `${options.y}px`;\n video.width = options.width;\n video.height = options.height;\n const offsetX = options.width / 8;\n const offsetY = options.height / 8;\n return {\n width: options.width,\n height: options.height,\n x: options.x + offsetX,\n y: options.y + offsetY,\n };\n }\n async setFocus(options) {\n // Reject if values are outside 0-1 range\n if (options.x < 0 || options.x > 1 || options.y < 0 || options.y > 1) {\n throw new Error(\"Focus coordinates must be between 0 and 1\");\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n // Check if focusing is supported\n if (capabilities.focusMode) {\n try {\n // Web API supports focus mode settings but not coordinate-based focus\n // Setting to manual mode allows for coordinate focus if supported\n await videoTrack.applyConstraints({\n advanced: [\n {\n focusMode: \"manual\",\n focusDistance: 0.5, // Mid-range focus as fallback\n },\n ],\n });\n }\n catch (error) {\n console.warn(`setFocus is not fully supported on this device: ${error}. Focus coordinates (${options.x}, ${options.y}) were provided but cannot be applied.`);\n }\n }\n else {\n console.warn(\"Focus control is not supported on this device. Focus coordinates were provided but cannot be applied.\");\n }\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["DeviceType","registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["export var DeviceType;\n(function (DeviceType) {\n DeviceType[\"ULTRA_WIDE\"] = \"ultraWide\";\n DeviceType[\"WIDE_ANGLE\"] = \"wideAngle\";\n DeviceType[\"TELEPHOTO\"] = \"telephoto\";\n DeviceType[\"TRUE_DEPTH\"] = \"trueDepth\";\n DeviceType[\"DUAL\"] = \"dual\";\n DeviceType[\"DUAL_WIDE\"] = \"dualWide\";\n DeviceType[\"TRIPLE\"] = \"triple\";\n})(DeviceType || (DeviceType = {}));\n//# sourceMappingURL=definitions.js.map","import { registerPlugin } from \"@capacitor/core\";\nconst CameraPreview = registerPlugin(\"CameraPreview\", {\n web: () => import(\"./web\").then((m) => new m.CameraPreviewWeb()),\n});\nexport * from \"./definitions\";\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nimport { DeviceType } from \"./definitions\";\nconst DEFAULT_VIDEO_ID = \"capgo_video\";\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n /**\n * track which camera is used based on start options\n * used in capture\n */\n this.isBackCamera = false;\n this.currentDeviceId = null;\n this.videoElement = null;\n this.isStarted = false;\n }\n async getSupportedPictureSizes() {\n throw new Error(\"getSupportedPictureSizes not supported under the web platform\");\n }\n async start(options) {\n if (options.aspectRatio && (options.width || options.height)) {\n throw new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\");\n }\n if (this.isStarted) {\n throw new Error(\"camera already started\");\n }\n this.isBackCamera = true;\n this.isStarted = false;\n const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || \"\");\n const gridMode = (options === null || options === void 0 ? void 0 : options.gridMode) || \"none\";\n const positioning = (options === null || options === void 0 ? void 0 : options.positioning) || \"center\";\n if (options.position) {\n this.isBackCamera = options.position === \"rear\";\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.remove();\n }\n const container = options.parent\n ? document.getElementById(options.parent)\n : document.body;\n if (!container) {\n throw new Error(\"container not found\");\n }\n this.videoElement = document.createElement(\"video\");\n this.videoElement.id = DEFAULT_VIDEO_ID;\n this.videoElement.className = options.className || \"\";\n this.videoElement.playsInline = true;\n this.videoElement.muted = true;\n this.videoElement.autoplay = true;\n // Remove objectFit as we'll match camera's native aspect ratio\n this.videoElement.style.backgroundColor = \"transparent\";\n // Reset any default margins that might interfere\n this.videoElement.style.margin = \"0\";\n this.videoElement.style.padding = \"0\";\n container.appendChild(this.videoElement);\n if (options.toBack) {\n this.videoElement.style.zIndex = \"-1\";\n }\n // Default to 16:9 vertical (9:16 for portrait) if no aspect ratio or size specified\n const useDefaultAspectRatio = !options.aspectRatio && !options.width && !options.height;\n const effectiveAspectRatio = options.aspectRatio || (useDefaultAspectRatio ? \"16:9\" : null);\n if (options.width) {\n this.videoElement.width = options.width;\n this.videoElement.style.width = `${options.width}px`;\n }\n if (options.height) {\n this.videoElement.height = options.height;\n this.videoElement.style.height = `${options.height}px`;\n }\n // Handle positioning - center if x or y not provided\n const centerX = options.x === undefined;\n const centerY = options.y === undefined;\n // Always set position to absolute for proper positioning\n this.videoElement.style.position = \"absolute\";\n console.log(\"Initial positioning flags:\", {\n centerX,\n centerY,\n x: options.x,\n y: options.y,\n });\n if (options.x !== undefined) {\n this.videoElement.style.left = `${options.x}px`;\n }\n if (options.y !== undefined) {\n this.videoElement.style.top = `${options.y}px`;\n }\n // Create and add grid overlay if needed\n if (gridMode !== \"none\") {\n const gridOverlay = this.createGridOverlay(gridMode);\n gridOverlay.id = \"camera-grid-overlay\";\n parent === null || parent === void 0 ? void 0 : parent.appendChild(gridOverlay);\n }\n // Aspect ratio handling is now done after getting camera stream\n // Store centering flags for later use\n const needsCenterX = centerX;\n const needsCenterY = centerY;\n console.log(\"Centering flags stored:\", { needsCenterX, needsCenterY });\n // First get the camera stream with basic constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n },\n };\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (!stream) {\n throw new Error(\"could not acquire stream\");\n }\n if (!this.videoElement) {\n throw new Error(\"video element not found\");\n }\n // Get the actual camera dimensions from the video track\n const videoTrack = stream.getVideoTracks()[0];\n const settings = videoTrack.getSettings();\n const cameraWidth = settings.width || 640;\n const cameraHeight = settings.height || 480;\n const cameraAspectRatio = cameraWidth / cameraHeight;\n console.log(\"Camera native dimensions:\", {\n width: cameraWidth,\n height: cameraHeight,\n aspectRatio: cameraAspectRatio,\n });\n console.log(\"Container dimensions:\", {\n width: container.offsetWidth,\n height: container.offsetHeight,\n id: container.id,\n });\n // Now adjust video element size based on camera's native aspect ratio\n if (!options.width && !options.height && !options.aspectRatio) {\n // No size specified, fit camera view within container bounds\n const containerWidth = container.offsetWidth || window.innerWidth;\n const containerHeight = container.offsetHeight || window.innerHeight;\n // Calculate dimensions that fit within container while maintaining camera aspect ratio\n let targetWidth, targetHeight;\n // Try fitting to container width first\n targetWidth = containerWidth;\n targetHeight = targetWidth / cameraAspectRatio;\n // If height exceeds container, fit to height instead\n if (targetHeight > containerHeight) {\n targetHeight = containerHeight;\n targetWidth = targetHeight * cameraAspectRatio;\n }\n console.log(\"Video element dimensions:\", {\n width: targetWidth,\n height: targetHeight,\n container: { width: containerWidth, height: containerHeight },\n });\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const x = Math.round((containerWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n // Force a style recalculation\n this.videoElement.offsetHeight;\n console.log(\"Positioning video:\", {\n positioning,\n viewportHeight: window.innerHeight,\n targetHeight,\n calculatedY: y,\n actualTop: this.videoElement.style.top,\n position: this.videoElement.style.position,\n });\n }\n }\n else if (effectiveAspectRatio && !options.width && !options.height) {\n // Aspect ratio specified but no size\n const [widthRatio, heightRatio] = effectiveAspectRatio\n .split(\":\")\n .map(Number);\n const targetRatio = widthRatio / heightRatio;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n let targetWidth, targetHeight;\n // Try fitting to viewport width first\n targetWidth = viewportWidth;\n targetHeight = targetWidth / targetRatio;\n // If height exceeds viewport, fit to height instead\n if (targetHeight > viewportHeight) {\n targetHeight = viewportHeight;\n targetWidth = targetHeight * targetRatio;\n }\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const parentWidth = container.offsetWidth || viewportWidth;\n const x = Math.round((parentWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n const parentHeight = container.offsetHeight || viewportHeight;\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = parentHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((parentHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.top = `${y}px`;\n }\n }\n this.videoElement.srcObject = stream;\n if (!this.isBackCamera) {\n this.videoElement.style.transform = \"scaleX(-1)\";\n }\n // Set initial zoom level if specified and supported\n if (options.initialZoomLevel && options.initialZoomLevel !== 1.0) {\n // videoTrack already declared above\n if (videoTrack) {\n const capabilities = videoTrack.getCapabilities();\n if (capabilities.zoom) {\n const zoomLevel = options.initialZoomLevel;\n const minZoom = capabilities.zoom.min || 1;\n const maxZoom = capabilities.zoom.max || 1;\n if (zoomLevel < minZoom || zoomLevel > maxZoom) {\n stream.getTracks().forEach((track) => track.stop());\n throw new Error(`Initial zoom level ${zoomLevel} is not available. Valid range is ${minZoom} to ${maxZoom}`);\n }\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n console.warn(`Failed to set initial zoom level: ${error}`);\n // Don't throw, just continue without zoom\n }\n }\n }\n }\n this.isStarted = true;\n // Wait for video to be ready and get actual dimensions\n await new Promise((resolve) => {\n if (this.videoElement.readyState >= 2) {\n resolve();\n }\n else {\n this.videoElement.addEventListener(\"loadeddata\", () => resolve(), {\n once: true,\n });\n }\n });\n // Ensure centering is applied after DOM updates\n await new Promise((resolve) => requestAnimationFrame(resolve));\n console.log(\"About to re-center, flags:\", { needsCenterX, needsCenterY });\n // Re-apply centering with correct parent dimensions\n if (needsCenterX) {\n const parentWidth = container.offsetWidth;\n const x = Math.round((parentWidth - this.videoElement.offsetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n console.log(\"Re-centering X:\", {\n parentWidth,\n videoWidth: this.videoElement.offsetWidth,\n x,\n });\n }\n if (needsCenterY) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - this.videoElement.offsetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - this.videoElement.offsetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n console.log(\"Re-positioning Y:\", {\n positioning,\n viewportHeight: window.innerHeight,\n videoHeight: this.videoElement.offsetHeight,\n y,\n position: this.videoElement.style.position,\n top: this.videoElement.style.top,\n });\n }\n // Get the actual rendered dimensions after video is loaded\n const rect = this.videoElement.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(this.videoElement);\n console.log(\"Final video element state:\", {\n rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\n style: {\n position: computedStyle.position,\n left: computedStyle.left,\n top: computedStyle.top,\n width: computedStyle.width,\n height: computedStyle.height,\n },\n });\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n };\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks)\n track.stop();\n }\n }\n async stop() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n this.isStarted = false;\n }\n // Remove grid overlay if it exists\n const gridOverlay = document.getElementById(\"camera-grid-overlay\");\n gridOverlay === null || gridOverlay === void 0 ? void 0 : gridOverlay.remove();\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n reject(new Error(\"camera is not running\"));\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n // Calculate capture dimensions\n let captureWidth = video.videoWidth;\n let captureHeight = video.videoHeight;\n let sourceX = 0;\n let sourceY = 0;\n // Check for conflicting parameters\n if (options.aspectRatio && (options.width || options.height)) {\n reject(new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\"));\n return;\n }\n // Handle aspect ratio if no width/height specified\n if (!options.width && !options.height && options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio.split(':').map(Number);\n if (widthRatio && heightRatio) {\n // For capture in portrait orientation, swap the aspect ratio (16:9 becomes 9:16)\n const isPortrait = video.videoHeight > video.videoWidth;\n const targetAspectRatio = isPortrait ? heightRatio / widthRatio : widthRatio / heightRatio;\n const videoAspectRatio = video.videoWidth / video.videoHeight;\n if (videoAspectRatio > targetAspectRatio) {\n // Video is wider than target - crop sides\n captureWidth = video.videoHeight * targetAspectRatio;\n captureHeight = video.videoHeight;\n sourceX = (video.videoWidth - captureWidth) / 2;\n }\n else {\n // Video is taller than target - crop top/bottom\n captureWidth = video.videoWidth;\n captureHeight = video.videoWidth / targetAspectRatio;\n sourceY = (video.videoHeight - captureHeight) / 2;\n }\n }\n }\n else if (options.width || options.height) {\n // If width or height is specified, use them\n if (options.width)\n captureWidth = options.width;\n if (options.height)\n captureHeight = options.height;\n }\n canvas.width = captureWidth;\n canvas.height = captureHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context === null || context === void 0 ? void 0 : context.translate(captureWidth, 0);\n context === null || context === void 0 ? void 0 : context.scale(-1, 1);\n }\n context === null || context === void 0 ? void 0 : context.drawImage(video, sourceX, sourceY, captureWidth, captureHeight, 0, 0, captureWidth, captureHeight);\n if (options.saveToGallery) {\n // saveToGallery is not supported on web\n }\n if (options.withExifLocation) {\n // withExifLocation is not supported on web\n }\n if ((options.format || \"jpeg\") === \"jpeg\") {\n base64EncodedImage = canvas\n .toDataURL(\"image/jpeg\", (options.quality || 85) / 100.0)\n .replace(\"data:image/jpeg;base64,\", \"\");\n }\n else {\n base64EncodedImage = canvas\n .toDataURL(\"image/png\")\n .replace(\"data:image/png;base64,\", \"\");\n }\n }\n resolve({\n value: base64EncodedImage,\n exif: {},\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async stopRecordVideo() {\n throw new Error(\"stopRecordVideo not supported under the web platform\");\n }\n async startRecordVideo(_options) {\n console.log(\"startRecordVideo\", _options);\n throw new Error(\"startRecordVideo not supported under the web platform\");\n }\n async getSupportedFlashModes() {\n throw new Error(\"getSupportedFlashModes not supported under the web platform\");\n }\n async getHorizontalFov() {\n throw new Error(\"getHorizontalFov not supported under the web platform\");\n }\n async setFlashMode(_options) {\n throw new Error(`setFlashMode not supported under the web platform${_options}`);\n }\n async flip() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Toggle camera position\n this.isBackCamera = !this.isBackCamera;\n // Get new constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update current device ID from the new stream\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n this.currentDeviceId = videoTrack.getSettings().deviceId || null;\n }\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to flip camera: ${error}`);\n }\n }\n async setOpacity(_options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!!video && !!_options.opacity)\n video.style.setProperty(\"opacity\", _options.opacity.toString());\n }\n async isRunning() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n return { isRunning: !!video && !!video.srcObject };\n }\n async getAvailableDevices() {\n var _a;\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.enumerateDevices)) {\n throw new Error(\"getAvailableDevices not supported under the web platform\");\n }\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n // Group devices by position (front/back)\n const frontDevices = [];\n const backDevices = [];\n videoDevices.forEach((device, index) => {\n const label = device.label || `Camera ${index + 1}`;\n const labelLower = label.toLowerCase();\n // Determine device type based on label\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n const lensInfo = {\n deviceId: device.deviceId,\n label,\n deviceType,\n focalLength: 4.25,\n baseZoomRatio,\n minZoom: 1.0,\n maxZoom: 1.0,\n };\n // Determine position and add to appropriate array\n if (labelLower.includes(\"back\") || labelLower.includes(\"rear\")) {\n backDevices.push(lensInfo);\n }\n else {\n frontDevices.push(lensInfo);\n }\n });\n const result = [];\n if (frontDevices.length > 0) {\n result.push({\n deviceId: frontDevices[0].deviceId,\n label: \"Front Camera\",\n position: \"front\",\n lenses: frontDevices,\n isLogical: false,\n minZoom: Math.min(...frontDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...frontDevices.map((d) => d.maxZoom)),\n });\n }\n if (backDevices.length > 0) {\n result.push({\n deviceId: backDevices[0].deviceId,\n label: \"Back Camera\",\n position: \"rear\",\n lenses: backDevices,\n isLogical: false,\n minZoom: Math.min(...backDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...backDevices.map((d) => d.maxZoom)),\n });\n }\n return { devices: result };\n }\n async getZoom() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n const settings = videoTrack.getSettings();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n // Get current device info to determine lens type\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (this.currentDeviceId) {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === this.currentDeviceId);\n if (device) {\n const labelLower = device.label.toLowerCase();\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n }\n }\n const currentZoom = settings.zoom || 1;\n const lensInfo = {\n focalLength: 4.25,\n deviceType,\n baseZoomRatio,\n digitalZoom: currentZoom / baseZoomRatio,\n };\n return {\n min: capabilities.zoom.min || 1,\n max: capabilities.zoom.max || 1,\n current: currentZoom,\n lens: lensInfo,\n };\n }\n async setZoom(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n const zoomLevel = Math.max(capabilities.zoom.min || 1, Math.min(capabilities.zoom.max || 1, options.level));\n // Note: autoFocus is not supported on web platform\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n throw new Error(`Failed to set zoom: ${error}`);\n }\n }\n async getFlashMode() {\n throw new Error(\"getFlashMode not supported under the web platform\");\n }\n async getDeviceId() {\n return { deviceId: this.currentDeviceId || \"\" };\n }\n async setDeviceId(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Update current device ID\n this.currentDeviceId = options.deviceId;\n // Get new constraints with specific device ID\n const constraints = {\n video: {\n deviceId: { exact: options.deviceId },\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n // Try to determine camera position from device\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === options.deviceId);\n this.isBackCamera =\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"back\")) ||\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"rear\")) ||\n false;\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to swap to device ${options.deviceId}: ${error}`);\n }\n }\n async getAspectRatio() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const width = video.offsetWidth;\n const height = video.offsetHeight;\n if (width && height) {\n const ratio = width / height;\n // Check for portrait camera ratios: 4:3 -> 3:4, 16:9 -> 9:16\n if (Math.abs(ratio - 3 / 4) < 0.01) {\n return { aspectRatio: \"4:3\" };\n }\n if (Math.abs(ratio - 9 / 16) < 0.01) {\n return { aspectRatio: \"16:9\" };\n }\n }\n // Default to 4:3 if no specific aspect ratio is matched\n return { aspectRatio: \"4:3\" };\n }\n async setAspectRatio(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n if (options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n // For camera, use portrait orientation: 4:3 becomes 3:4, 16:9 becomes 9:16\n const ratio = heightRatio / widthRatio;\n // Get current position and size\n const rect = video.getBoundingClientRect();\n const currentWidth = rect.width;\n const currentHeight = rect.height;\n const currentRatio = currentWidth / currentHeight;\n let newWidth;\n let newHeight;\n if (currentRatio > ratio) {\n // Width is larger, fit by height and center horizontally\n newWidth = currentHeight * ratio;\n newHeight = currentHeight;\n }\n else {\n // Height is larger, fit by width and center vertically\n newWidth = currentWidth;\n newHeight = currentWidth / ratio;\n }\n // Calculate position\n let x, y;\n if (options.x !== undefined && options.y !== undefined) {\n // Use provided coordinates, ensuring they stay within screen boundaries\n x = Math.max(0, Math.min(options.x, window.innerWidth - newWidth));\n y = Math.max(0, Math.min(options.y, window.innerHeight - newHeight));\n }\n else {\n // Auto-center the view\n x = (window.innerWidth - newWidth) / 2;\n y = (window.innerHeight - newHeight) / 2;\n }\n video.style.width = `${newWidth}px`;\n video.style.height = `${newHeight}px`;\n video.style.left = `${x}px`;\n video.style.top = `${y}px`;\n video.style.position = \"absolute\";\n const offsetX = newWidth / 8;\n const offsetY = newHeight / 8;\n return {\n width: Math.round(newWidth),\n height: Math.round(newHeight),\n x: Math.round(x + offsetX),\n y: Math.round(y + offsetY),\n };\n }\n else {\n video.style.objectFit = \"cover\";\n const rect = video.getBoundingClientRect();\n const offsetX = rect.width / 8;\n const offsetY = rect.height / 8;\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.left + offsetX),\n y: Math.round(rect.top + offsetY),\n };\n }\n }\n createGridOverlay(gridMode) {\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"absolute\";\n overlay.style.top = \"0\";\n overlay.style.left = \"0\";\n overlay.style.width = \"100%\";\n overlay.style.height = \"100%\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.zIndex = \"10\";\n const divisions = gridMode === \"3x3\" ? 3 : 4;\n // Create SVG for grid lines\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.style.width = \"100%\";\n svg.style.height = \"100%\";\n svg.style.position = \"absolute\";\n svg.style.top = \"0\";\n svg.style.left = \"0\";\n // Create grid lines\n for (let i = 1; i < divisions; i++) {\n // Vertical lines\n const verticalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n verticalLine.setAttribute(\"x1\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y1\", \"0%\");\n verticalLine.setAttribute(\"x2\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y2\", \"100%\");\n verticalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n verticalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(verticalLine);\n // Horizontal lines\n const horizontalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n horizontalLine.setAttribute(\"x1\", \"0%\");\n horizontalLine.setAttribute(\"y1\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"x2\", \"100%\");\n horizontalLine.setAttribute(\"y2\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n horizontalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(horizontalLine);\n }\n overlay.appendChild(svg);\n return overlay;\n }\n async setGridMode(options) {\n // Web implementation of grid mode would need to be implemented\n // For now, just resolve as a no-op\n console.warn(`Grid mode '${options.gridMode}' is not yet implemented for web platform`);\n }\n async getGridMode() {\n // Web implementation - default to none\n return { gridMode: \"none\" };\n }\n async getPreviewSize() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const offsetX = video.width / 8;\n const offsetY = video.height / 8;\n return {\n x: video.offsetLeft + offsetX,\n y: video.offsetTop + offsetY,\n width: video.width,\n height: video.height,\n };\n }\n async setPreviewSize(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n video.style.left = `${options.x}px`;\n video.style.top = `${options.y}px`;\n video.width = options.width;\n video.height = options.height;\n const offsetX = options.width / 8;\n const offsetY = options.height / 8;\n return {\n width: options.width,\n height: options.height,\n x: options.x + offsetX,\n y: options.y + offsetY,\n };\n }\n async setFocus(options) {\n // Reject if values are outside 0-1 range\n if (options.x < 0 || options.x > 1 || options.y < 0 || options.y > 1) {\n throw new Error(\"Focus coordinates must be between 0 and 1\");\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n // Check if focusing is supported\n if (capabilities.focusMode) {\n try {\n // Web API supports focus mode settings but not coordinate-based focus\n // Setting to manual mode allows for coordinate focus if supported\n await videoTrack.applyConstraints({\n advanced: [\n {\n focusMode: \"manual\",\n focusDistance: 0.5, // Mid-range focus as fallback\n },\n ],\n });\n }\n catch (error) {\n console.warn(`setFocus is not fully supported on this device: ${error}. Focus coordinates (${options.x}, ${options.y}) were provided but cannot be applied.`);\n }\n }\n else {\n console.warn(\"Focus control is not supported on this device. Focus coordinates were provided but cannot be applied.\");\n }\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["DeviceType","registerPlugin","WebPlugin"],"mappings":"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"}
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
//
|
|
2
|
-
// CameraController.swift
|
|
3
|
-
// Plugin
|
|
4
|
-
//
|
|
5
|
-
// Created by Ariel Hernandez Musa on 7/14/19.
|
|
6
|
-
// Copyright © 2019 Max Lynch. All rights reserved.
|
|
7
|
-
//
|
|
8
|
-
|
|
9
1
|
import AVFoundation
|
|
10
2
|
import UIKit
|
|
11
3
|
import CoreLocation
|
|
@@ -721,7 +713,9 @@ captureSession.addOutput(videoOutput)
|
|
|
721
713
|
self.updateVideoOrientation()
|
|
722
714
|
}
|
|
723
715
|
|
|
724
|
-
|
|
716
|
+
func captureImage(width: Int?, height: Int?, aspectRatio: String?, quality: Float, gpsLocation: CLLocation?, completion: @escaping (UIImage?, Error?) -> Void) {
|
|
717
|
+
print("[CameraPreview] captureImage called - width: \(width ?? -1), height: \(height ?? -1), aspectRatio: \(aspectRatio ?? "nil")")
|
|
718
|
+
|
|
725
719
|
guard let photoOutput = self.photoOutput else {
|
|
726
720
|
completion(nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Photo output is not available"]))
|
|
727
721
|
return
|
|
@@ -766,10 +760,13 @@ captureSession.addOutput(videoOutput)
|
|
|
766
760
|
|
|
767
761
|
var finalImage = image
|
|
768
762
|
|
|
769
|
-
//
|
|
770
|
-
if width
|
|
771
|
-
//
|
|
772
|
-
|
|
763
|
+
// Determine what to do based on parameters
|
|
764
|
+
if let width = width, let height = height {
|
|
765
|
+
// Specific dimensions requested - resize to exact size
|
|
766
|
+
finalImage = self.resizeImage(image: image, to: CGSize(width: width, height: height))!
|
|
767
|
+
print("[CameraPreview] Resized to exact dimensions: \(finalImage.size.width)x\(finalImage.size.height)")
|
|
768
|
+
} else if let aspectRatio = aspectRatio {
|
|
769
|
+
// Aspect ratio specified - crop to that ratio
|
|
773
770
|
let components = aspectRatio.split(separator: ":").compactMap { Double($0) }
|
|
774
771
|
if components.count == 2 {
|
|
775
772
|
// For capture in portrait orientation, swap the aspect ratio (16:9 becomes 9:16)
|
|
@@ -778,32 +775,33 @@ captureSession.addOutput(videoOutput)
|
|
|
778
775
|
let imageSize = image.size
|
|
779
776
|
let originalAspectRatio = imageSize.width / imageSize.height
|
|
780
777
|
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
778
|
+
// Only crop if the aspect ratios don't match
|
|
779
|
+
if abs(originalAspectRatio - targetAspectRatio) > 0.01 {
|
|
780
|
+
var targetSize = imageSize
|
|
781
|
+
|
|
782
|
+
if originalAspectRatio > targetAspectRatio {
|
|
783
|
+
// Original is wider than target - fit by height
|
|
784
|
+
targetSize.width = imageSize.height * CGFloat(targetAspectRatio)
|
|
785
|
+
} else {
|
|
786
|
+
// Original is taller than target - fit by width
|
|
787
|
+
targetSize.height = imageSize.width / CGFloat(targetAspectRatio)
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
// Center crop the image
|
|
791
|
+
if let croppedImage = self.cropImageToAspectRatio(image: image, targetSize: targetSize) {
|
|
792
|
+
finalImage = croppedImage
|
|
793
|
+
print("[CameraPreview] Applied aspect ratio crop: \(finalImage.size.width)x\(finalImage.size.height)")
|
|
794
|
+
}
|
|
794
795
|
}
|
|
795
796
|
}
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
}
|
|
797
|
+
} else {
|
|
798
|
+
// No parameters specified - crop to match what's visible in the preview
|
|
799
|
+
// This ensures we capture exactly what the user sees
|
|
800
|
+
if let previewLayer = self.previewLayer,
|
|
801
|
+
let previewCroppedImage = self.cropImageToMatchPreview(image: image, previewLayer: previewLayer) {
|
|
802
|
+
finalImage = previewCroppedImage
|
|
803
|
+
print("[CameraPreview] Cropped to match preview: \(finalImage.size.width)x\(finalImage.size.height)")
|
|
804
804
|
}
|
|
805
|
-
} else if let width = width, let height = height {
|
|
806
|
-
finalImage = self.resizeImage(image: image, to: CGSize(width: width, height: height))!
|
|
807
805
|
}
|
|
808
806
|
|
|
809
807
|
completion(finalImage, nil)
|
|
@@ -867,7 +865,9 @@ captureSession.addOutput(videoOutput)
|
|
|
867
865
|
}
|
|
868
866
|
|
|
869
867
|
func cropImageToMatchPreview(image: UIImage, previewLayer: AVCaptureVideoPreviewLayer) -> UIImage? {
|
|
870
|
-
//
|
|
868
|
+
// When using resizeAspectFill, the preview layer shows a cropped portion of the video
|
|
869
|
+
// We need to calculate what portion of the captured image corresponds to what's visible
|
|
870
|
+
|
|
871
871
|
let previewBounds = previewLayer.bounds
|
|
872
872
|
let previewAspectRatio = previewBounds.width / previewBounds.height
|
|
873
873
|
|
|
@@ -875,6 +875,9 @@ captureSession.addOutput(videoOutput)
|
|
|
875
875
|
let imageSize = image.size
|
|
876
876
|
let imageAspectRatio = imageSize.width / imageSize.height
|
|
877
877
|
|
|
878
|
+
print("[CameraPreview] cropImageToMatchPreview - Preview bounds: \(previewBounds.width)x\(previewBounds.height) (ratio: \(previewAspectRatio))")
|
|
879
|
+
print("[CameraPreview] cropImageToMatchPreview - Image size: \(imageSize.width)x\(imageSize.height) (ratio: \(imageAspectRatio))")
|
|
880
|
+
|
|
878
881
|
// Since we're using resizeAspectFill, we need to calculate what portion of the image
|
|
879
882
|
// is visible in the preview
|
|
880
883
|
var cropRect: CGRect
|
|
@@ -884,20 +887,28 @@ captureSession.addOutput(videoOutput)
|
|
|
884
887
|
let visibleWidth = imageSize.height * previewAspectRatio
|
|
885
888
|
let xOffset = (imageSize.width - visibleWidth) / 2
|
|
886
889
|
cropRect = CGRect(x: xOffset, y: 0, width: visibleWidth, height: imageSize.height)
|
|
890
|
+
print("[CameraPreview] cropImageToMatchPreview - Cropping horizontally: visible width = \(visibleWidth), offset = \(xOffset)")
|
|
887
891
|
} else {
|
|
888
892
|
// Image is taller than preview - crop vertically
|
|
889
893
|
let visibleHeight = imageSize.width / previewAspectRatio
|
|
890
894
|
let yOffset = (imageSize.height - visibleHeight) / 2
|
|
891
895
|
cropRect = CGRect(x: 0, y: yOffset, width: imageSize.width, height: visibleHeight)
|
|
896
|
+
print("[CameraPreview] cropImageToMatchPreview - Cropping vertically: visible height = \(visibleHeight), offset = \(yOffset)")
|
|
892
897
|
}
|
|
893
898
|
|
|
899
|
+
print("[CameraPreview] cropImageToMatchPreview - Crop rect: \(cropRect)")
|
|
900
|
+
|
|
894
901
|
// Create the cropped image
|
|
895
902
|
guard let cgImage = image.cgImage,
|
|
896
903
|
let croppedCGImage = cgImage.cropping(to: cropRect) else {
|
|
904
|
+
print("[CameraPreview] cropImageToMatchPreview - Failed to crop image")
|
|
897
905
|
return nil
|
|
898
906
|
}
|
|
899
907
|
|
|
900
|
-
|
|
908
|
+
let result = UIImage(cgImage: croppedCGImage, scale: image.scale, orientation: image.imageOrientation)
|
|
909
|
+
print("[CameraPreview] cropImageToMatchPreview - Result size: \(result.size.width)x\(result.size.height)")
|
|
910
|
+
|
|
911
|
+
return result
|
|
901
912
|
}
|
|
902
913
|
|
|
903
914
|
func captureSample(completion: @escaping (UIImage?, Error?) -> Void) {
|
|
@@ -89,6 +89,7 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
|
|
|
89
89
|
var currentLocation: CLLocation?
|
|
90
90
|
private var aspectRatio: String?
|
|
91
91
|
private var gridMode: String = "none"
|
|
92
|
+
private var positioning: String = "center"
|
|
92
93
|
private var permissionCallID: String?
|
|
93
94
|
private var waitingForLocation: Bool = false
|
|
94
95
|
|
|
@@ -435,6 +436,7 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
|
|
|
435
436
|
self.disableAudio = call.getBool("disableAudio") ?? true
|
|
436
437
|
self.aspectRatio = call.getString("aspectRatio")
|
|
437
438
|
self.gridMode = call.getString("gridMode") ?? "none"
|
|
439
|
+
self.positioning = call.getString("positioning") ?? "center"
|
|
438
440
|
let initialZoomLevel = call.getFloat("initialZoomLevel") ?? 1.0
|
|
439
441
|
if self.aspectRatio != nil && (call.getInt("width") != nil || call.getInt("height") != nil) {
|
|
440
442
|
call.reject("Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.")
|
|
@@ -471,6 +473,8 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
|
|
|
471
473
|
private func completeStartCamera(call: CAPPluginCall) {
|
|
472
474
|
// Create and configure the preview view first
|
|
473
475
|
self.updateCameraFrame()
|
|
476
|
+
|
|
477
|
+
print("[CameraPreview] completeStartCamera - Preview frame after updateCameraFrame: \(self.previewView.frame)")
|
|
474
478
|
|
|
475
479
|
// Make webview transparent - comprehensive approach
|
|
476
480
|
self.makeWebViewTransparent()
|
|
@@ -601,6 +605,7 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
|
|
|
601
605
|
}
|
|
602
606
|
|
|
603
607
|
@objc func capture(_ call: CAPPluginCall) {
|
|
608
|
+
print("[CameraPreview] capture called with options: \(call.options)")
|
|
604
609
|
let withExifLocation = call.getBool("withExifLocation", false)
|
|
605
610
|
print("[CameraPreview] capture called, withExifLocation: \(withExifLocation)")
|
|
606
611
|
|
|
@@ -675,12 +680,15 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
|
|
|
675
680
|
|
|
676
681
|
private func performCapture(call: CAPPluginCall) {
|
|
677
682
|
print("[CameraPreview] performCapture called")
|
|
683
|
+
print("[CameraPreview] Call parameters: \(call.options)")
|
|
678
684
|
let quality = call.getFloat("quality", 85)
|
|
679
685
|
let saveToGallery = call.getBool("saveToGallery", false)
|
|
680
686
|
let withExifLocation = call.getBool("withExifLocation", false)
|
|
681
687
|
let width = call.getInt("width")
|
|
682
688
|
let height = call.getInt("height")
|
|
683
689
|
let aspectRatio = call.getString("aspectRatio")
|
|
690
|
+
|
|
691
|
+
print("[CameraPreview] Raw parameter values - width: \(String(describing: width)), height: \(String(describing: height)), aspectRatio: \(String(describing: aspectRatio))")
|
|
684
692
|
|
|
685
693
|
// Check for conflicting parameters
|
|
686
694
|
if aspectRatio != nil && (width != nil || height != nil) {
|
|
@@ -689,16 +697,18 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
|
|
|
689
697
|
return
|
|
690
698
|
}
|
|
691
699
|
|
|
692
|
-
//
|
|
693
|
-
//
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
700
|
+
// When no dimensions are specified, we should capture exactly what's visible in the preview
|
|
701
|
+
// Don't pass aspectRatio in this case - let the capture method handle preview matching
|
|
702
|
+
print("[CameraPreview] Capture decision - width: \(width == nil), height: \(height == nil), aspectRatio param: \(aspectRatio == nil)")
|
|
703
|
+
print("[CameraPreview] Stored aspectRatio: \(self.aspectRatio ?? "nil")")
|
|
704
|
+
|
|
705
|
+
// Only pass aspectRatio if explicitly provided in the capture call
|
|
706
|
+
// Never use the stored aspectRatio when capturing without dimensions
|
|
707
|
+
let captureAspectRatio: String? = aspectRatio
|
|
699
708
|
|
|
700
709
|
print("[CameraPreview] Capture params - quality: \(quality), saveToGallery: \(saveToGallery), withExifLocation: \(withExifLocation), width: \(width ?? -1), height: \(height ?? -1), aspectRatio: \(aspectRatio ?? "nil"), using aspectRatio: \(captureAspectRatio ?? "nil")")
|
|
701
710
|
print("[CameraPreview] Current location: \(self.currentLocation?.description ?? "nil")")
|
|
711
|
+
print("[CameraPreview] Preview dimensions: \(self.previewView.frame.width)x\(self.previewView.frame.height)")
|
|
702
712
|
|
|
703
713
|
self.cameraController.captureImage(width: width, height: height, aspectRatio: captureAspectRatio, quality: quality, gpsLocation: self.currentLocation) { (image, error) in
|
|
704
714
|
print("[CameraPreview] captureImage callback received")
|
|
@@ -1365,12 +1375,21 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
|
|
|
1365
1375
|
finalX = currentX
|
|
1366
1376
|
}
|
|
1367
1377
|
|
|
1368
|
-
//
|
|
1378
|
+
// Position vertically if y is -1
|
|
1369
1379
|
if currentY == -1 {
|
|
1370
|
-
// Use full screen height for
|
|
1380
|
+
// Use full screen height for positioning
|
|
1371
1381
|
let screenHeight = UIScreen.main.bounds.size.height
|
|
1372
|
-
|
|
1373
|
-
|
|
1382
|
+
switch self.positioning {
|
|
1383
|
+
case "top":
|
|
1384
|
+
finalY = 0
|
|
1385
|
+
print("[CameraPreview] Positioning at top: finalY=0")
|
|
1386
|
+
case "bottom":
|
|
1387
|
+
finalY = screenHeight - finalHeight
|
|
1388
|
+
print("[CameraPreview] Positioning at bottom: screenHeight=\(screenHeight), finalHeight=\(finalHeight), finalY=\(finalY)")
|
|
1389
|
+
default: // "center"
|
|
1390
|
+
finalY = (screenHeight - finalHeight) / 2
|
|
1391
|
+
print("[CameraPreview] Centering vertically: screenHeight=\(screenHeight), finalHeight=\(finalHeight), finalY=\(finalY)")
|
|
1392
|
+
}
|
|
1374
1393
|
} else {
|
|
1375
1394
|
finalY = currentY
|
|
1376
1395
|
}
|