Skip to content

Commit

Permalink
New stroke matching algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
thjaeger committed Feb 10, 2009
1 parent 63567c8 commit 0e0286c
Show file tree
Hide file tree
Showing 21 changed files with 610 additions and 783 deletions.
7 changes: 4 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ LOCALEDIR= $(PREFIX)/share/locale
DFLAGS =
OFLAGS = -Os
AOFLAGS = -O3
STROKEFLAGS = -Wall -std=c99 $(DFLAGS)
CXXFLAGS = -Wall $(DFLAGS) -DLOCALEDIR=\"$(LOCALEDIR)\" `pkg-config gtkmm-2.4 dbus-glib-1 --cflags`
LDFLAGS = $(DFLAGS)

Expand All @@ -33,7 +34,7 @@ MANPAGE = easystroke.1

CCFILES = $(wildcard *.cc)
HFILES = $(wildcard *.h)
OFILES = $(patsubst %.cc,%.o,$(CCFILES)) gui.o desktop.o version.o
OFILES = $(patsubst %.cc,%.o,$(CCFILES)) stroke.o gui.o desktop.o version.o
POFILES = $(wildcard po/*.po)
MOFILES = $(patsubst po/%.po,po/%/LC_MESSAGES/easystroke.mo,$(POFILES))
MODIRS = $(patsubst po/%.po,po/%,$(POFILES))
Expand Down Expand Up @@ -61,8 +62,8 @@ include $(DEPFILES)
$(BINARY): $(OFILES)
$(CXX) $(LDFLAGS) -o $@ $(OFILES) $(LIBS)

stroke.o: stroke.cc
$(CXX) $(CXXFLAGS) $(AOFLAGS) -MT $@ -MMD -MP -MF $*.Po -o $@ -c $<
stroke.o: stroke.c
$(CC) $(STROKEFLAGS) $(AOFLAGS) -MT $@ -MMD -MP -MF $*.Po -o $@ -c $<

%.o: %.cc
$(CXX) $(CXXFLAGS) $(OFLAGS) -MT $@ -MMD -MP -MF $*.Po -o $@ -c $<
Expand Down
14 changes: 7 additions & 7 deletions actiondb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -303,18 +303,18 @@ RAction ActionListDiff::handle(RStroke s, Ranking &r) const {
if (!s)
return RAction();
r.stroke = s;
r.score = -1;
r.score = 0.0;
boost::shared_ptr<std::map<Unique *, StrokeSet> > strokes = get_strokes();
for (std::map<Unique *, StrokeSet>::const_iterator i = strokes->begin(); i!=strokes->end(); i++) {
for (StrokeSet::iterator j = i->second.begin(); j!=i->second.end(); j++) {
double score;
bool match = Stroke::compare(s, *j, score);
if (score < 0.25)
int match = Stroke::compare(s, *j, score);
if (match < 0)
continue;
RStrokeInfo si = get_info(i->first);
r.r.insert(pair<double, pair<std::string, RStroke> >
(score, pair<std::string, RStroke>(si->name, *j)));
if (score >= r.score) {
if (score > r.score) {
r.score = score;
if (match) {
r.name = si->name;
Expand Down Expand Up @@ -348,8 +348,8 @@ void ActionListDiff::handle_advanced(RStroke s, std::map<guint, RAction> &as,
continue;
s->button = b;
double score;
bool match = Stroke::compare(s, *j, score);
if (score < 0.25)
int match = Stroke::compare(s, *j, score);
if (match < 0)
continue;
Ranking *r;
if (b == b1)
Expand All @@ -365,7 +365,7 @@ void ActionListDiff::handle_advanced(RStroke s, std::map<guint, RAction> &as,
RStrokeInfo si = get_info(i->first);
r->r.insert(pair<double, pair<std::string, RStroke> >
(score, pair<std::string, RStroke>(si->name, *j)));
if (score >= r->score) {
if (score > r->score) {
r->score = score;
if (match) {
r->name = si->name;
Expand Down
2 changes: 1 addition & 1 deletion actiondb.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#include <boost/serialization/split_member.hpp>
#include <iostream>

#include "stroke.h"
#include "gesture.h"
#include "prefdb.h"

class Action;
Expand Down
21 changes: 0 additions & 21 deletions doc/Makefile

This file was deleted.

42 changes: 0 additions & 42 deletions doc/algo.tex

This file was deleted.

106 changes: 106 additions & 0 deletions gesture.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
* Copyright (c) 2008-2009, Thomas Jaeger <[email protected]>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "gesture.h"
#include "prefdb.h"

void update_triple(RTriple e, float x, float y, Time t) {
e->x = x;
e->y = y;
e->t = t;
}

RTriple create_triple(float x, float y, Time t) {
RTriple e(new Triple);
update_triple(e, x, y, t);
return e;
}

Stroke::Stroke(PreStroke &ps, int trigger_, int button_, bool timeout_) : button(button_), timeout(timeout_) {
trigger = (trigger_ == get_default_button()) ? 0 : trigger_;

if (ps.valid()) {
stroke_t *s = stroke_alloc(ps.size());
for (std::vector<RTriple>::iterator i = ps.begin(); i != ps.end(); ++i)
stroke_add_point(s, (*i)->x, (*i)->y);
stroke_finish(s);
stroke.reset(s, &stroke_free);
}
}

int Stroke::compare(RStroke a, RStroke b, double &score) {
score = 0.0;
if (!a || !b)
return -1;
if (!a->timeout != !b->timeout)
return -1;
if (a->button != b->button)
return -1;
if (a->trigger != b->trigger) {
if (a->trigger && b->trigger)
return -1;
if (a->trigger + b->trigger != get_default_button())
return -1;
}
if (!a->stroke || !b->stroke) {
if (!a->stroke && !b->stroke) {
score = 1.0;
return 1;
}
else
return -1;
}
double cost = stroke_compare(a->stroke.get(), b->stroke.get(), NULL, NULL);
if (cost >= stroke_infinity)
return -1;
score = MAX(1.0 - 2.5*cost, 0.0);
if (a->timeout)
return score > 0.85;
else
return score > 0.7;
}

Glib::RefPtr<Gdk::Pixbuf> Stroke::draw(int size, double width) const {
if (size != STROKE_SIZE || (width != 2.0 && width != 4.0))
return draw_(size, width);
int i = width == 2.0;
if (pb[i])
return pb[i];
pb[i] = draw_(size, width);
return pb[i];
}

Glib::RefPtr<Gdk::Pixbuf> Stroke::pbEmpty;

Glib::RefPtr<Gdk::Pixbuf> Stroke::drawEmpty(int size) {
if (size != STROKE_SIZE)
return drawEmpty_(size);
if (pbEmpty)
return pbEmpty;
pbEmpty = drawEmpty_(size);
return pbEmpty;
}


RStroke Stroke::trefoil() {
PreStroke s;
const int n = 40;
for (int i = 0; i<=n; i++) {
double phi = M_PI*(-4.0*i/n)-2.7;
double r = exp(1.0 + sin(6.0*M_PI*i/n)) + 2.0;
s.add(create_triple(r*cos(phi), r*sin(phi), i));
}
return Stroke::create(s, 0, 0, false);
}
Loading

0 comments on commit 0e0286c

Please sign in to comment.