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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion example/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
camerawesome: a961fa32dafc00d2f093d824311c84f849586b58
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
google_mlkit_barcode_scanning: 8f5987f244a43fe1167689c548342a5174108159
google_mlkit_commons: 2abe6a70e1824e431d16a51085cb475b672c8aab
google_mlkit_face_detection: 754da2113a1952f063c7c5dc347ac6ae8934fb77
Expand Down
8 changes: 4 additions & 4 deletions example/ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objectVersion = 60;
objects = {

/* Begin PBXBuildFile section */
Expand Down Expand Up @@ -245,7 +245,7 @@
);
mainGroup = 97C146E51CF9000F007C117D;
packageReferences = (
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */,
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */,
);
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -775,7 +775,7 @@
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = Q8N2T428YG;
DEVELOPMENT_TEAM = RDYY3LBWQM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
Expand Down Expand Up @@ -826,7 +826,7 @@
/* End XCConfigurationList section */

/* Begin XCLocalSwiftPackageReference section */
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = {
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = {
isa = XCLocalSwiftPackageReference;
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1510"
version = "1.3">
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
Expand Down Expand Up @@ -69,7 +69,7 @@
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
Expand Down
59 changes: 36 additions & 23 deletions lib/src/widgets/camera_awesome_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:async';
import 'package:camerawesome/camerawesome_plugin.dart';
import 'package:camerawesome/pigeon.dart';
import 'package:camerawesome/src/orchestrator/camera_context.dart';
import 'package:camerawesome/src/widgets/preview/awesome_preview_fit.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

Expand Down Expand Up @@ -118,6 +119,8 @@ class CameraAwesomeBuilder extends StatefulWidget {
/// You can use it to do whatever you want once a media has been saved
final OnMediaCaptureEvent? onMediaCaptureEvent;

final FuncTransformMatrix? transformMatrix;

const CameraAwesomeBuilder._({
required this.sensorConfig,
required this.enablePhysicalButton,
Expand All @@ -127,6 +130,7 @@ class CameraAwesomeBuilder extends StatefulWidget {
required this.builder,
required this.previewFit,
required this.defaultFilter,
required this.transformMatrix,
this.onImageForAnalysis,
this.imageAnalysisConfig,
this.onPreviewTapBuilder,
Expand Down Expand Up @@ -162,29 +166,30 @@ class CameraAwesomeBuilder extends StatefulWidget {
/// If you want to do image analysis (for AI for instance), you can set the
/// [imageAnaysisConfig] and listen to the stream of images with
/// [onImageForAnalysis].
CameraAwesomeBuilder.awesome(
{SensorConfig? sensorConfig,
bool enablePhysicalButton = false,
Widget? progressIndicator,
required SaveConfig saveConfig,
Function(MediaCapture)? onMediaTap,
OnImageForAnalysis? onImageForAnalysis,
AnalysisConfig? imageAnalysisConfig,
OnPreviewTap Function(CameraState)? onPreviewTapBuilder,
OnPreviewScale Function(CameraState)? onPreviewScaleBuilder,
CameraPreviewFit? previewFit,
CameraLayoutBuilder? previewDecoratorBuilder,
AwesomeTheme? theme,
Widget Function(CameraState state)? topActionsBuilder,
Widget Function(CameraState state)? bottomActionsBuilder,
Widget Function(CameraState state)? middleContentBuilder,
EdgeInsets previewPadding = EdgeInsets.zero,
Alignment previewAlignment = Alignment.center,
PictureInPictureConfigBuilder? pictureInPictureConfigBuilder,
AwesomeFilter? defaultFilter,
List<AwesomeFilter>? availableFilters,
OnMediaCaptureEvent? onMediaCaptureEvent})
: this._(
CameraAwesomeBuilder.awesome({
SensorConfig? sensorConfig,
bool enablePhysicalButton = false,
Widget? progressIndicator,
required SaveConfig saveConfig,
Function(MediaCapture)? onMediaTap,
OnImageForAnalysis? onImageForAnalysis,
AnalysisConfig? imageAnalysisConfig,
OnPreviewTap Function(CameraState)? onPreviewTapBuilder,
OnPreviewScale Function(CameraState)? onPreviewScaleBuilder,
CameraPreviewFit? previewFit,
CameraLayoutBuilder? previewDecoratorBuilder,
AwesomeTheme? theme,
Widget Function(CameraState state)? topActionsBuilder,
Widget Function(CameraState state)? bottomActionsBuilder,
Widget Function(CameraState state)? middleContentBuilder,
EdgeInsets previewPadding = EdgeInsets.zero,
Alignment previewAlignment = Alignment.center,
PictureInPictureConfigBuilder? pictureInPictureConfigBuilder,
AwesomeFilter? defaultFilter,
List<AwesomeFilter>? availableFilters,
OnMediaCaptureEvent? onMediaCaptureEvent,
FuncTransformMatrix? transformMatrix,
}) : this._(
sensorConfig: sensorConfig ??
SensorConfig.single(
sensor: Sensor.position(SensorPosition.back),
Expand Down Expand Up @@ -215,6 +220,7 @@ class CameraAwesomeBuilder extends StatefulWidget {
defaultFilter: defaultFilter,
availableFilters: availableFilters ?? awesomePresetFiltersList,
onMediaCaptureEvent: onMediaCaptureEvent,
transformMatrix: transformMatrix,
);

/// 🚧 Experimental
Expand All @@ -239,6 +245,7 @@ class CameraAwesomeBuilder extends StatefulWidget {
PictureInPictureConfigBuilder? pictureInPictureConfigBuilder,
List<AwesomeFilter>? filters,
OnMediaCaptureEvent? onMediaCaptureEvent,
FuncTransformMatrix? transformMatrix,
}) : this._(
sensorConfig: sensorConfig ??
SensorConfig.single(
Expand All @@ -262,6 +269,7 @@ class CameraAwesomeBuilder extends StatefulWidget {
pictureInPictureConfigBuilder: pictureInPictureConfigBuilder,
availableFilters: filters,
onMediaCaptureEvent: onMediaCaptureEvent,
transformMatrix: transformMatrix,
);

/// Use this constructor when you don't want to take pictures or record videos.
Expand All @@ -279,6 +287,7 @@ class CameraAwesomeBuilder extends StatefulWidget {
EdgeInsets previewPadding = EdgeInsets.zero,
Alignment previewAlignment = Alignment.center,
PictureInPictureConfigBuilder? pictureInPictureConfigBuilder,
FuncTransformMatrix? transformMatrix,
}) : this._(
sensorConfig: sensorConfig ??
SensorConfig.single(sensor: Sensor.position(SensorPosition.back)),
Expand All @@ -298,6 +307,7 @@ class CameraAwesomeBuilder extends StatefulWidget {
previewPadding: previewPadding,
previewAlignment: previewAlignment,
pictureInPictureConfigBuilder: pictureInPictureConfigBuilder,
transformMatrix: transformMatrix,
);

/// Use this constructor when you only want to do image analysis.
Expand All @@ -314,6 +324,7 @@ class CameraAwesomeBuilder extends StatefulWidget {
required CameraLayoutBuilder builder,
required OnImageForAnalysis onImageForAnalysis,
AnalysisConfig? imageAnalysisConfig,
FuncTransformMatrix? transformMatrix,
}) : this._(
sensorConfig: sensorConfig ??
SensorConfig.single(sensor: Sensor.position(SensorPosition.back)),
Expand All @@ -334,6 +345,7 @@ class CameraAwesomeBuilder extends StatefulWidget {
previewAlignment: Alignment.center,
showPreview: false,
pictureInPictureConfigBuilder: null,
transformMatrix: transformMatrix,
);

@override
Expand Down Expand Up @@ -446,6 +458,7 @@ class _CameraWidgetBuilder extends State<CameraAwesomeBuilder>
state: snapshot.requireData,
padding: widget.previewPadding,
alignment: widget.previewAlignment,
transformMatrix: widget.transformMatrix,
onPreviewTap: widget.onPreviewTapBuilder
?.call(snapshot.requireData) ??
OnPreviewTap(
Expand Down
3 changes: 3 additions & 0 deletions lib/src/widgets/preview/awesome_camera_floating_preview.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ class AwesomeCameraFloatingPreview extends StatefulWidget {
final double aspectRatio;
final Sensor sensor;
final PictureInPictureConfig pictureInPictureConfig;
final FuncTransformMatrix? transformMatrix;

AwesomeCameraFloatingPreview({
super.key,
required this.index,
required this.sensor,
required this.texture,
required this.aspectRatio,
required this.transformMatrix,
PictureInPictureConfig? pictureInPictureConfig,
}) : pictureInPictureConfig =
pictureInPictureConfig ?? PictureInPictureConfig(sensor: sensor);
Expand Down Expand Up @@ -58,6 +60,7 @@ class _AwesomeCameraFloatingPreviewState
: null,
child: widget.pictureInPictureConfig.pictureInPictureBuilder(
AnimatedPreviewFit(
transformMatrix: widget.transformMatrix,
previewFit: CameraPreviewFit.cover,
previewSize: PreviewSize(
width: 1000,
Expand Down
4 changes: 4 additions & 0 deletions lib/src/widgets/preview/awesome_camera_preview.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class AwesomeCameraPreview extends StatefulWidget {
final EdgeInsets padding;
final Alignment alignment;
final PictureInPictureConfigBuilder? pictureInPictureConfigBuilder;
final FuncTransformMatrix? transformMatrix;

const AwesomeCameraPreview({
super.key,
Expand All @@ -40,6 +41,7 @@ class AwesomeCameraPreview extends StatefulWidget {
this.previewDecoratorBuilder,
required this.padding,
required this.alignment,
required this.transformMatrix,
this.pictureInPictureConfigBuilder,
});

Expand Down Expand Up @@ -161,6 +163,7 @@ class AwesomeCameraPreviewState extends State<AwesomeCameraPreview> {
children: [
Positioned.fill(
child: AnimatedPreviewFit(
transformMatrix: widget.transformMatrix,
alignment: widget.alignment,
previewFit: widget.previewFit,
previewSize: _previewSize!,
Expand Down Expand Up @@ -246,6 +249,7 @@ class AwesomeCameraPreviewState extends State<AwesomeCameraPreview> {
final texture = _textures[i];
final sensor = sensors[kDebugMode ? 0 : i];
final frame = AwesomeCameraFloatingPreview(
transformMatrix: widget.transformMatrix,
index: i,
sensor: sensor,
texture: texture,
Expand Down
14 changes: 12 additions & 2 deletions lib/src/widgets/preview/awesome_preview_fit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class AnimatedPreviewFit extends StatefulWidget {
final Widget child;
final OnPreviewCalculated? onPreviewCalculated;
final Sensor sensor;
final FuncTransformMatrix? transformMatrix;

const AnimatedPreviewFit({
super.key,
Expand All @@ -26,6 +27,7 @@ class AnimatedPreviewFit extends StatefulWidget {
required this.constraints,
required this.sensor,
required this.child,
required this.transformMatrix,
this.onPreviewCalculated,
this.previewPadding,
});
Expand Down Expand Up @@ -108,6 +110,7 @@ class _AnimatedPreviewFitState extends State<AnimatedPreviewFit> {
constraints: widget.constraints,
previewFit: widget.previewFit,
previewSize: widget.previewSize,
transformMatrix: widget.transformMatrix,
scale: ratio,
maxSize: maxSize!,
previewPadding: widget.previewPadding,
Expand All @@ -122,6 +125,8 @@ class _AnimatedPreviewFitState extends State<AnimatedPreviewFit> {
}
}

typedef FuncTransformMatrix = Matrix4 Function(PreviewSize size, double scale);

class PreviewFitWidget extends StatelessWidget {
final Alignment alignment;
final BoxConstraints constraints;
Expand All @@ -131,6 +136,7 @@ class PreviewFitWidget extends StatelessWidget {
final double scale;
final Size maxSize;
final EdgeInsets? previewPadding;
final FuncTransformMatrix? transformMatrix;

const PreviewFitWidget({
super.key,
Expand All @@ -141,13 +147,17 @@ class PreviewFitWidget extends StatelessWidget {
required this.child,
required this.scale,
required this.maxSize,
required this.transformMatrix,
this.previewPadding,
});

@override
Widget build(BuildContext context) {
final transformController = TransformationController()
..value = (Matrix4.identity()..scale(scale));
var mx = Matrix4.identity()..scale(scale);
if (transformMatrix != null) {
mx = transformMatrix!(previewSize, scale);
}
final transformController = TransformationController()..value = (mx);

return Align(
alignment: alignment,
Expand Down