summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2017-05-07 19:21:49 +0200
committerStanislaw Halik <sthalik@misaki.pl>2017-05-10 11:19:22 +0200
commit1d3fa41e12c9f17f184084f734fe78a4f1468b60 (patch)
tree1c07b6c90ee3351adc66738540304fc9ced464c6
parentc114e085b3bb51da51c4a7ecceda146e095c7a2e (diff)
pose-widget: add empty space to prevent out-out-bounds writes
-rw-r--r--pose-widget/pose-widget.cpp33
-rw-r--r--pose-widget/pose-widget.hpp2
2 files changed, 18 insertions, 17 deletions
diff --git a/pose-widget/pose-widget.cpp b/pose-widget/pose-widget.cpp
index c3e87dff..54278c34 100644
--- a/pose-widget/pose-widget.cpp
+++ b/pose-widget/pose-widget.cpp
@@ -18,11 +18,12 @@
using namespace pose_widget_impl;
+static constexpr int offset = 2;
+
pose_transform::pose_transform(QWidget* dst) :
dst(dst),
- image(w, h, QImage::Format_ARGB32),
- image2(w, h, QImage::Format_ARGB32),
- width(w), height(h),
+ image(w+offset*2, h+offset*2, QImage::Format_ARGB32),
+ image2(w+offset*2, h+offset*2, QImage::Format_ARGB32),
fresh(false)
{
front = QImage(QString(":/images/side1.png"));
@@ -43,8 +44,10 @@ pose_transform::~pose_transform()
void pose_widget::paintEvent(QPaintEvent* event)
{
QPainter p(this);
- xform.with_image_lock([&](const QImage& image) {
- p.drawImage(event->rect(), image);
+
+ xform.with_image_lock([&](const QImage& image)
+ {
+ p.drawImage(event->rect(), image, offset, offset);
});
}
@@ -186,7 +189,7 @@ void pose_transform::project_quad_texture()
num dir;
vec2 pt[4];
- const int sx = width - 1, sy = height - 1;
+ const int sx = w - 1, sy = h - 1;
vec2 projected[3];
{
@@ -252,7 +255,7 @@ void pose_transform::project_quad_texture()
const unsigned dest_pitch = image.bytesPerLine();
const unsigned char* orig = tex.bits();
- unsigned char* dest = image.bits();
+ unsigned char* dest = image.bits() + offset*dest_pitch;
const int orig_depth = tex.depth() / 8;
const int dest_depth = image.depth() / 8;
@@ -309,7 +312,7 @@ void pose_transform::project_quad_texture()
const float ax = 1 - ax_;
const float ay = 1 - ay_;
- const unsigned pos = y * dest_pitch + x * dest_depth;
+ const unsigned pos = y * dest_pitch + (x+offset) * dest_depth;
for (int k = 0; k < 4; k++)
{
@@ -336,13 +339,13 @@ vec2 pose_transform::project(const vec3 &point)
vec3 ret = rotation * point;
num z = std::fmax(num(.5), 1 + translation.z()/-80);
- num w = width, h = height;
- num x = w * translation.x() / 2 / -80;
- if (fabs(x) > w/2)
- x = x > 0 ? w/2 : w/-2;
- num y = h * translation.y() / 2 / -80;
- if (fabs(y) > h/2)
- y = y > 0 ? h/2 : h/-2;
+ num w_ = w, h_ = h;
+ num x = w_ * translation.x() / 2 / -80;
+ if (fabs(x) > w_/2)
+ x = x > 0 ? w_/2 : w_/-2;
+ num y = h_ * translation.y() / 2 / -80;
+ if (fabs(y) > h_/2)
+ y = y > 0 ? h_/2 : h_/-2;
return vec2(z * (ret.x() + x), z * (ret.y() + y));
}
diff --git a/pose-widget/pose-widget.hpp b/pose-widget/pose-widget.hpp
index b528d394..1d34778a 100644
--- a/pose-widget/pose-widget.hpp
+++ b/pose-widget/pose-widget.hpp
@@ -69,8 +69,6 @@ class pose_transform final : private QThread
QImage front, back;
QImage image, image2;
- int width, height;
-
std::atomic<bool> fresh;
static constexpr int w = 320, h = 240;