Skip to content

Commit 4846d70

Browse files
dream-approachingzhengjinshou
andauthored
feat: 鸿蒙化空实现 (#3)
Co-authored-by: zhengjinshou <zhengjinshou@huawei.com>
1 parent 55a40a0 commit 4846d70

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1525
-272
lines changed

cvimage.js

Lines changed: 61 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -6,91 +6,81 @@
66
* @flow
77
* @author Adam Freeman, adamgf@gmail.com
88
*/
9-
import { NativeModules } from 'react-native';
10-
import React, {Component} from 'react';
9+
import React, { Component } from 'react';
1110
import { Platform, Image } from 'react-native';
12-
const { RNOpencv3 } = NativeModules;
13-
import { ColorConv } from './constants';
11+
import RNOpencv3 from './spec/turbomodule/NativeRNOpencv3';
12+
import { downloadAssetSource } from './downloadAssetSource';
1413

15-
var RNFS = require('react-native-fs')
14+
var RNFS = require('react-native-fs');
1615

1716
export class CvImage extends Component {
18-
1917
constructor(props) {
20-
super(props)
21-
this.resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource')
22-
this.state = { 'destFile' : '' }
18+
super(props);
19+
this.resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource');
20+
this.state = { destFile: '' };
2321
}
2422

2523
componentDidMount = () => {
26-
const assetSource = this.props.source
27-
const uri = this.resolveAssetSource(assetSource).uri
28-
const downloadAssetSource = require('./downloadAssetSource');
29-
30-
downloadAssetSource(uri)
31-
.then((sourceFile) => {
32-
let srcMat
33-
let dstMat
34-
RNOpencv3.Mat().then((res) => {
35-
dstMat = res
36-
RNOpencv3.imageToMat(sourceFile).then((res) => {
37-
srcMat = res
38-
RNFS.unlink(sourceFile).then(() => {
24+
const assetSource = this.props.source;
25+
const uri = this.resolveAssetSource(assetSource).uri;
3926

40-
// replace srcMat and dstMat strings with actual srcMat and dstMat
41-
const { cvinvoke } = this.props
42-
if (cvinvoke) {
43-
for (let i=0;i < cvinvoke.paramsArr.length;i++) {
44-
let params = cvinvoke.paramsArr[i]
45-
for (let j=0;j < Object.keys(params).length;j++) {
46-
const pnum = 'p' + (j + 1).toString()
47-
if (params[pnum] && params[pnum] === 'srcMat') {
48-
params[pnum] = srcMat
49-
}
50-
if (params[pnum] && params[pnum] === 'dstMat') {
51-
params[pnum] = dstMat
27+
downloadAssetSource(uri)
28+
.then(sourceFile => {
29+
let srcMat;
30+
let dstMat;
31+
RNOpencv3.Mat().then(res => {
32+
dstMat = res;
33+
RNOpencv3.imageToMat(sourceFile).then(res => {
34+
srcMat = res;
35+
RNFS.unlink(sourceFile)
36+
.then(() => {
37+
// replace srcMat and dstMat strings with actual srcMat and dstMat
38+
const { cvinvoke } = this.props;
39+
if (cvinvoke) {
40+
for (let i = 0; i < cvinvoke.paramsArr.length; i++) {
41+
let params = cvinvoke.paramsArr[i];
42+
for (let j = 0; j < Object.keys(params).length; j++) {
43+
const pnum = 'p' + (j + 1).toString();
44+
if (params[pnum] && params[pnum] === 'srcMat') {
45+
params[pnum] = srcMat;
46+
}
47+
if (params[pnum] && params[pnum] === 'dstMat') {
48+
params[pnum] = dstMat;
49+
}
50+
}
5251
}
52+
//alert('cvinvoke is: ' + JSON.stringify(this.props.cvinvoke))
53+
RNOpencv3.invokeMethods(cvinvoke);
5354
}
54-
}
55-
//alert('cvinvoke is: ' + JSON.stringify(this.props.cvinvoke))
56-
RNOpencv3.invokeMethods(cvinvoke)
57-
}
5855

59-
RNOpencv3.matToImage(dstMat, sourceFile)
60-
.then((image) => {
61-
RNOpencv3.deleteMat(srcMat)
62-
RNOpencv3.deleteMat(dstMat)
63-
const { width, height, uri } = image
64-
if (uri && uri.length > 0) {
65-
this.setState({ destFile : uri })
66-
}
67-
else {
68-
console.error('Error getting image information.')
69-
}
70-
})
71-
.catch((err) => {
72-
console.error(err)
73-
})
74-
})
75-
.catch((err) => {
76-
console.error(err)
77-
})
78-
})
56+
RNOpencv3.matToImage(dstMat, sourceFile)
57+
.then(image => {
58+
RNOpencv3.deleteMat(srcMat);
59+
RNOpencv3.deleteMat(dstMat);
60+
const { width, height, uri } = image;
61+
if (uri && uri.length > 0) {
62+
this.setState({ destFile: uri });
63+
} else {
64+
console.warning('Error getting image information.');
65+
}
66+
})
67+
.catch(err => {
68+
console.warning(err);
69+
});
70+
})
71+
.catch(err => {
72+
console.warning(err);
73+
});
74+
});
75+
});
7976
})
80-
})
81-
.catch((err) => {
82-
console.error(err)
83-
})
84-
}
77+
.catch(err => {
78+
console.warning(err);
79+
});
80+
};
8581

8682
render() {
87-
let imageFilePath = this.resolveAssetSource(this.props.source).uri
88-
if (this.state.destFile.length > 0) {
89-
const prependFilename = Platform.OS === 'ios' ? '' : 'file://'
90-
imageFilePath = prependFilename + this.state.destFile
91-
}
92-
return(
93-
<Image {...this.props} source={{uri:`${imageFilePath}`}} />
94-
)
83+
let imageFilePath = this.resolveAssetSource(this.props.source).uri;
84+
return <Image {...this.props} source={{ uri: `${imageFilePath}` }} />;
9585
}
9686
}

downloadAssetSource.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,4 @@ async function downloadAssetSource(uri) {
5959
})
6060
}
6161

62-
module.exports = downloadAssetSource;
62+
export {downloadAssetSource}

harmony/opencv3/.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/node_modules
2+
/oh_modules
3+
/.preview
4+
/build
5+
/.cxx
6+
/.test

harmony/opencv3/Index.ets

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from "./src/main/ets/RNOpencvPackage";
2+
export * from "./src/main/ets/CvCameraView"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"apiType": "stageMode",
3+
"buildOption": {
4+
},
5+
"targets": [
6+
{
7+
"name": "default"
8+
},
9+
{
10+
"name": "ohosTest"
11+
}
12+
]
13+
}

harmony/opencv3/hvigorfile.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { harTasks } from '@ohos/hvigor-ohos-plugin';
2+
3+
export default {
4+
system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
5+
plugins:[] /* Custom plugin to extend the functionality of Hvigor. */
6+
}

harmony/opencv3/oh-package.json5

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "@react-native-oh-tpl/react-native-opencv3",
3+
"version": "1.0.0",
4+
"description": "Please describe the basic information.",
5+
"main": "Index.ets",
6+
"author": "",
7+
"license": "Apache-2.0",
8+
"dependencies": {}
9+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
cmake_minimum_required(VERSION 3.13)
3+
set(CMAKE_VERBOSE_MAKEFILE on)
4+
set(rnoh_opencv_generated_dir "${CMAKE_CURRENT_SOURCE_DIR}/generated")
5+
6+
file(GLOB rnoh_opencv_SRC CONFIGURE_DEPENDS *.cpp)
7+
file(GLOB_RECURSE rnoh_opencv_generated_SRC "${rnoh_opencv_generated_dir}/**/*.cpp")
8+
9+
add_library(rnoh_opencv SHARED ${rnoh_opencv_SRC} ${rnoh_opencv_generated_SRC})
10+
target_include_directories(rnoh_opencv PUBLIC
11+
${CMAKE_CURRENT_SOURCE_DIR}
12+
${rnoh_opencv_generated_dir}
13+
${CMAKE_CURRENT_SOURCE_DIR}/generated/react/render/components/react_native_opencv3
14+
)
15+
16+
target_link_libraries(rnoh_opencv PUBLIC rnoh)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
3+
#include "RNOH/generated/BaseReactNativeOpencv3Package.h"
4+
5+
namespace rnoh {
6+
7+
class OpencvPackage : public BaseReactNativeOpencv3Package {
8+
using Super = BaseReactNativeOpencv3Package;
9+
10+
public:
11+
OpencvPackage(Package::Context ctx) : Super(ctx) {}
12+
};
13+
} // namespace rnoh
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* This code was generated by "react-native codegen-lib-harmony"
3+
*/
4+
5+
#pragma once
6+
7+
#include <react/renderer/components/react_native_opencv3/ComponentDescriptors.h>
8+
#include "RNOH/Package.h"
9+
#include "RNOH/ArkTSTurboModule.h"
10+
#include "RNOH/generated/turbo_modules/CvCameraModule.h"
11+
#include "RNOH/generated/turbo_modules/RNOpencv3.h"
12+
#include "RNOH/generated/components/CvCameraViewJSIBinder.h"
13+
14+
namespace rnoh {
15+
16+
class BaseReactNativeOpencv3PackageTurboModuleFactoryDelegate : public TurboModuleFactoryDelegate {
17+
public:
18+
SharedTurboModule createTurboModule(Context ctx, const std::string &name) const override {
19+
if (name == "CvCameraModule") {
20+
return std::make_shared<CvCameraModule>(ctx, name);
21+
}
22+
if (name == "RNOpencv3") {
23+
return std::make_shared<RNOpencv3>(ctx, name);
24+
}
25+
return nullptr;
26+
};
27+
};
28+
29+
class BaseReactNativeOpencv3PackageEventEmitRequestHandler : public EventEmitRequestHandler {
30+
public:
31+
void handleEvent(Context const &ctx) override {
32+
auto eventEmitter = ctx.shadowViewRegistry->getEventEmitter<facebook::react::EventEmitter>(ctx.tag);
33+
if (eventEmitter == nullptr) {
34+
return;
35+
}
36+
37+
std::vector<std::string> supportedEventNames = {
38+
"facesDetectedCv",
39+
"cameraFrame",
40+
"frameSize",
41+
};
42+
if (std::find(supportedEventNames.begin(), supportedEventNames.end(), ctx.eventName) != supportedEventNames.end()) {
43+
eventEmitter->dispatchEvent(ctx.eventName, ArkJS(ctx.env).getDynamic(ctx.payload));
44+
}
45+
}
46+
};
47+
48+
49+
class BaseReactNativeOpencv3Package : public Package {
50+
public:
51+
BaseReactNativeOpencv3Package(Package::Context ctx) : Package(ctx){};
52+
53+
std::unique_ptr<TurboModuleFactoryDelegate> createTurboModuleFactoryDelegate() override {
54+
return std::make_unique<BaseReactNativeOpencv3PackageTurboModuleFactoryDelegate>();
55+
}
56+
57+
std::vector<facebook::react::ComponentDescriptorProvider> createComponentDescriptorProviders() override {
58+
return {
59+
facebook::react::concreteComponentDescriptorProvider<facebook::react::CvCameraViewComponentDescriptor>(),
60+
};
61+
}
62+
63+
ComponentJSIBinderByString createComponentJSIBinderByName() override {
64+
return {
65+
{"CvCameraView", std::make_shared<CvCameraViewJSIBinder>()},
66+
};
67+
};
68+
69+
EventEmitRequestHandlers createEventEmitRequestHandlers() override {
70+
return {
71+
std::make_shared<BaseReactNativeOpencv3PackageEventEmitRequestHandler>(),
72+
};
73+
}
74+
};
75+
76+
} // namespace rnoh

0 commit comments

Comments
 (0)