Skip to content

Commit df9c9d1

Browse files
2 parents 5fd651c + 51f18b7 commit df9c9d1

File tree

3 files changed

+109
-9
lines changed

3 files changed

+109
-9
lines changed

cc/core/Rect.cc

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "Rect.h"
2+
#include "Size.h"
23

34
Nan::Persistent<v8::FunctionTemplate> Rect::constructor;
45

@@ -16,6 +17,8 @@ NAN_MODULE_INIT(Rect::Init) {
1617
Nan::SetPrototypeMethod(ctor, "or", Or);
1718
Nan::SetPrototypeMethod(ctor, "toSquare", ToSquare);
1819
Nan::SetPrototypeMethod(ctor, "toSquareAsync", ToSquareAsync);
20+
Nan::SetPrototypeMethod(ctor, "pad", Pad);
21+
Nan::SetPrototypeMethod(ctor, "padAsync", PadAsync);
1922
Nan::SetPrototypeMethod(ctor, "rescale", Rescale);
2023
Nan::SetPrototypeMethod(ctor, "rescaleAsync", RescaleAsync);
2124

@@ -132,6 +135,54 @@ NAN_METHOD(Rect::ToSquareAsync) {
132135
}
133136

134137

138+
struct Rect::PadWorker : SimpleWorker {
139+
public:
140+
cv::Rect2d rect;
141+
cv::Size2d newSize = cv::Size2d();
142+
cv::Rect2d outRect;
143+
144+
PadWorker(cv::Rect2d rect) {
145+
this->rect = rect;
146+
}
147+
148+
const char* execute() {
149+
double offX = (rect.width - newSize.width) / 2;
150+
double offY = (rect.height - newSize.height) / 2;
151+
outRect = cv::Rect(rect.x + offX, rect.y + offY, newSize.width, newSize.height);
152+
return "";
153+
}
154+
155+
bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
156+
bool isSizeArg = Size::Converter::hasInstance(info[0]);
157+
double f = 1;
158+
bool didThrow =
159+
(!isSizeArg && DoubleConverter::arg(0, &f, info))
160+
|| (isSizeArg && Size::Converter::arg(0, &newSize, info));
161+
162+
if (!isSizeArg) {
163+
newSize = cv::Size2d(rect.width * f, rect.height * f);
164+
}
165+
return didThrow;
166+
}
167+
168+
FF_VAL getReturnValue() {
169+
return Rect::Converter::wrap(outRect);
170+
}
171+
};
172+
173+
NAN_METHOD(Rect::Pad) {
174+
PadWorker worker(Rect::Converter::unwrap(info.This()));
175+
FF_WORKER_SYNC("Rect::Pad", worker);
176+
info.GetReturnValue().Set(worker.getReturnValue());
177+
178+
}
179+
180+
NAN_METHOD(Rect::PadAsync) {
181+
PadWorker worker(Rect::Converter::unwrap(info.This()));
182+
FF_WORKER_ASYNC("Rect::PadAsync", PadWorker, worker);
183+
}
184+
185+
135186
struct Rect::RescaleWorker : SimpleWorker {
136187
public:
137188
cv::Rect2d rect;
@@ -143,11 +194,7 @@ struct Rect::RescaleWorker : SimpleWorker {
143194
}
144195

145196
const char* execute() {
146-
double newWidth = rect.width * f;
147-
double newHeight = rect.height * f;
148-
double offX = (rect.width - newWidth) / 2;
149-
double offY = (rect.height - newHeight) / 2;
150-
outRect = cv::Rect(rect.x + offX, rect.y + offY, newWidth, newHeight);
197+
outRect = cv::Rect(f * rect.x, f * rect.y, f * rect.width, f * rect.height);
151198
return "";
152199
}
153200

cc/core/Rect.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ class Rect : public Nan::ObjectWrap {
2727
static NAN_METHOD(ToSquare);
2828
static NAN_METHOD(ToSquareAsync);
2929

30+
struct PadWorker;
31+
static NAN_METHOD(Pad);
32+
static NAN_METHOD(PadAsync);
33+
3034
struct RescaleWorker;
3135
static NAN_METHOD(Rescale);
3236
static NAN_METHOD(RescaleAsync);

test/tests/core/Rect.test.js

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,59 @@ describe('Rect', () => {
9595
});
9696
});
9797

98+
describe('pad', () => {
99+
describe('by factor', () => {
100+
describe('pad down', () => {
101+
generateAPITests({
102+
getDut: () => new cv.Rect(0, 0, 100, 100),
103+
methodName: 'pad',
104+
methodNameSpace: 'Rect',
105+
getRequiredArgs: () => [0.5],
106+
expectOutput: (res) => {
107+
expect(res.x).to.equal(25);
108+
expect(res.y).to.equal(25);
109+
expect(res.width).to.equal(50);
110+
expect(res.height).to.equal(50);
111+
}
112+
});
113+
});
114+
115+
describe('pad up', () => {
116+
generateAPITests({
117+
getDut: () => new cv.Rect(0, 0, 100, 100),
118+
methodName: 'pad',
119+
methodNameSpace: 'Rect',
120+
getRequiredArgs: () => [2],
121+
expectOutput: (res) => {
122+
expect(res.x).to.equal(-50);
123+
expect(res.y).to.equal(-50);
124+
expect(res.width).to.equal(200);
125+
expect(res.height).to.equal(200);
126+
}
127+
});
128+
});
129+
});
130+
131+
describe('by Size', () => {
132+
generateAPITests({
133+
getDut: () => new cv.Rect(0, 0, 100, 100),
134+
methodName: 'pad',
135+
methodNameSpace: 'Rect',
136+
getRequiredArgs: () => [new cv.Size(50, 200)],
137+
expectOutput: (res) => {
138+
expect(res.x).to.equal(25);
139+
expect(res.y).to.equal(-50);
140+
expect(res.width).to.equal(50);
141+
expect(res.height).to.equal(200);
142+
}
143+
});
144+
});
145+
});
146+
98147
describe('rescale', () => {
99148
describe('scale down', () => {
100149
generateAPITests({
101-
getDut: () => new cv.Rect(0, 0, 100, 100),
150+
getDut: () => new cv.Rect(50, 50, 100, 100),
102151
methodName: 'rescale',
103152
methodNameSpace: 'Rect',
104153
getRequiredArgs: () => [0.5],
@@ -113,13 +162,13 @@ describe('Rect', () => {
113162

114163
describe('scale up', () => {
115164
generateAPITests({
116-
getDut: () => new cv.Rect(0, 0, 100, 100),
165+
getDut: () => new cv.Rect(50, 50, 100, 100),
117166
methodName: 'rescale',
118167
methodNameSpace: 'Rect',
119168
getRequiredArgs: () => [2],
120169
expectOutput: (res) => {
121-
expect(res.x).to.equal(-50);
122-
expect(res.y).to.equal(-50);
170+
expect(res.x).to.equal(100);
171+
expect(res.y).to.equal(100);
123172
expect(res.width).to.equal(200);
124173
expect(res.height).to.equal(200);
125174
}

0 commit comments

Comments
 (0)