static void gvevent_find_current_obj(GVJ_t * job, pointf pointer)
{
void *obj;
- pointf p, translation = job->translation, scale = job->compscale;
boxf b;
double closeenough;
+ pointf p, translation, scale;
+ translation = job->translation;
+ scale.x = job->zoom * job->devscale.x;
+ scale.y = job->zoom * job->devscale.y;
+
+ /* transform position in device units to poition in graph units */
if (job->rotation) {
p.x = pointer.y / scale.y - translation.x;
p.y = -pointer.x / scale.x - translation.y;
}
#if 0
-fprintf(stderr,"pointer = %g,%g compscale = %g,%g comptrans = %g,%g, graphpoint = %g,%g\n",
+fprintf(stderr,"pointer = %g,%g scale = %g,%g translation = %g,%g, graphpoint = %g,%g\n",
pointer.x, pointer.y,
scale.x, scale.y,
- trans.x, trans.y,
+ translation.x, translation.y,
p.x, p.y);
#endif
/* scrollwheel zoom in at current mouse x,y */
job->fit_mode = 0;
job->focus.x += (pointer.x - job->width / 2.)
- * (ZOOMFACTOR - 1.) / job->zoom;
- job->focus.y += -(pointer.y - job->height / 2.)
- * (ZOOMFACTOR - 1.) / job->zoom;
+ * (ZOOMFACTOR - 1.) / (job->zoom * job->devscale.x);
+ job->focus.y += (pointer.y - job->height / 2.)
+ * (ZOOMFACTOR - 1.) / (job->zoom * job->devscale.y);
job->zoom *= ZOOMFACTOR;
job->needs_refresh = 1;
break;
job->fit_mode = 0;
job->zoom /= ZOOMFACTOR;
job->focus.x -= (pointer.x - job->width / 2.)
- * (ZOOMFACTOR - 1.) / job->zoom;
+ * (ZOOMFACTOR - 1.) / (job->zoom * job->devscale.x);
job->focus.y -= -(pointer.y - job->height / 2.)
- * (ZOOMFACTOR - 1.) / job->zoom;
+ * (ZOOMFACTOR - 1.) / (job->zoom * job->devscale.y);
job->needs_refresh = 1;
break;
}
static void gvevent_motion(GVJ_t * job, pointf pointer)
{
- double dx = pointer.x - job->oldpointer.x;
- double dy = pointer.y - job->oldpointer.y;
+ /* dx,dy change in position, in device independent points */
+ double dx = (pointer.x - job->oldpointer.x) / job->devscale.x;
+ double dy = (pointer.y - job->oldpointer.y) / job->devscale.y;
if (abs(dx) < EPSILON && abs(dy) < EPSILON) /* ignore motion events with no motion */
return;
/* FIXME - to be implemented */
break;
case 2: /* drag with button 2 - pan graph */
- job->focus.x -= dx / job->zoom;
- job->focus.y -= -dy / job->zoom;
+ job->focus.x -= dx / job->zoom;
+ job->focus.y -= dy / job->zoom;
job->needs_refresh = 1;
break;
case 3: /* drag with button 3 - drag inserted node or uncompleted edge */
{
job->fit_mode = !job->fit_mode;
if (job->fit_mode) {
+ /* FIXME - this code looks wrong */
int dflt_width, dflt_height;
dflt_width = job->width;
dflt_height = job->height;
pointf gvrender_ptf(GVJ_t *job, pointf p)
{
- pointf rv, translation = job->translation, scale = job->compscale;
+ pointf rv, translation, scale;
+
+ translation = job->translation;
+ scale.x = job->zoom * job->devscale.x;
+ scale.y = job->zoom * job->devscale.y;
if (job->rotation) {
rv.x = -(p.y + translation.y) * scale.x;
pointf* gvrender_ptf_A(GVJ_t *job, pointf *af, pointf *AF, int n)
{
int i;
- pointf translation = job->translation, scale = job->compscale;
double t;
+ pointf translation, scale;
+
+ translation = job->translation;
+ scale.x = job->zoom * job->devscale.x;
+ scale.y = job->zoom * job->devscale.y;
if (job->rotation) {
for (i = 0; i < n; i++) {