ximagesrc: fix various width/height calculations being off by one,
ximagesrc: fix various width/height calculations being off by one,
and make it so a single pixel width/height can be captured (except
the top left one, as 0,0,0,0 is reserved for full screen as per
the property comments).
diff --git a/sys/ximage/gstximagesrc.c b/sys/ximage/gstximagesrc.c
index e525fbb..a1a9dbd 100644
--- a/sys/ximage/gstximagesrc.c
+++ b/sys/ximage/gstximagesrc.c
@@ -465,10 +465,10 @@
if (ximagesrc->endx > ximagesrc->startx &&
ximagesrc->endy > ximagesrc->starty) {
/* see if damage area intersects */
- if (rects[i].x + rects[i].width < ximagesrc->startx ||
+ if (rects[i].x + rects[i].width - 1 < ximagesrc->startx ||
rects[i].x > ximagesrc->endx) {
/* trivial reject */
- } else if (rects[i].y + rects[i].height < ximagesrc->starty ||
+ } else if (rects[i].y + rects[i].height - 1 < ximagesrc->starty ||
rects[i].y > ximagesrc->endy) {
/* trivial reject */
} else {
@@ -479,12 +479,12 @@
rects[i].x;
starty = (rects[i].y < ximagesrc->starty) ? ximagesrc->starty :
rects[i].y;
- width = (rects[i].x + rects[i].width < ximagesrc->endx) ?
+ width = (rects[i].x + rects[i].width - 1 < ximagesrc->endx) ?
rects[i].x + rects[i].width - startx :
- ximagesrc->endx - startx;
- height = (rects[i].y + rects[i].height < ximagesrc->endy) ?
+ ximagesrc->endx - startx + 1;
+ height = (rects[i].y + rects[i].height - 1 < ximagesrc->endy) ?
rects[i].y + rects[i].height - starty : ximagesrc->endy -
- starty;
+ starty + 1;
GST_LOG_OBJECT (ximagesrc,
"Retrieving damaged sub-region @ %d,%d size %dx%d as intersect region",
@@ -943,27 +943,36 @@
width = xcontext->width;
height = xcontext->height;
- if (s->endx > s->startx && s->endy > s->starty) {
+
+ /* property comments say 0 means right/bottom, means we can't capture
+ the top left pixel alone */
+ if (s->endx == 0)
+ s->endx = width - 1;
+ if (s->endy == 0)
+ s->endy = height - 1;
+
+ if (s->endx >= s->startx && s->endy >= s->starty) {
/* this means user has put in values */
if (s->startx < xcontext->width && s->endx < xcontext->width &&
- s->starty < xcontext->height && s->endy < xcontext->height) {
+ s->starty < xcontext->height && s->endy < xcontext->height &&
+ s->startx >= 0 && s->starty >= 0) {
/* values are fine */
- s->width = width = s->endx - s->startx;
- s->height = height = s->endy - s->starty;
+ s->width = width = s->endx - s->startx + 1;
+ s->height = height = s->endy - s->starty + 1;
} else {
GST_WARNING
("User put in co-ordinates overshooting the X resolution, setting to full screen");
s->startx = 0;
s->starty = 0;
- s->endx = 0;
- s->endy = 0;
+ s->endx = width - 1;
+ s->endy = height - 1;
}
} else {
GST_WARNING ("User put in bogus co-ordinates, setting to full screen");
s->startx = 0;
s->starty = 0;
- s->endx = 0;
- s->endy = 0;
+ s->endx = width - 1;
+ s->endy = height - 1;
}
GST_DEBUG ("width = %d, height=%d", width, height);
return gst_caps_new_simple ("video/x-raw-rgb",