diff options
Diffstat (limited to 'packages/nonworking/freenote/freenote-1.6.1/compile.patch')
-rw-r--r-- | packages/nonworking/freenote/freenote-1.6.1/compile.patch | 3285 |
1 files changed, 0 insertions, 3285 deletions
diff --git a/packages/nonworking/freenote/freenote-1.6.1/compile.patch b/packages/nonworking/freenote/freenote-1.6.1/compile.patch deleted file mode 100644 index de3e93ac9c..0000000000 --- a/packages/nonworking/freenote/freenote-1.6.1/compile.patch +++ /dev/null @@ -1,3285 +0,0 @@ - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- FreeNote_1.6.1_arm/FmtEngine.cpp~compile 2003-12-23 15:53:46.000000000 +0100 -+++ FreeNote_1.6.1_arm/FmtEngine.cpp 2004-02-01 18:42:32.000000000 +0100 -@@ -1,409 +1,410 @@ --/* FreeNote for Sharp SLA300, B500, C7x0 Linux PDA -- Copyright (C) 2003 Joe Kanemori.<kanemori@ymg.urban.ne.jp> -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --*/ --/* --2003/12/16-19 FreeNote ver 1.5.5pre --・曲線描画ロジックの改良 -- --2003/12/14 FreeNote 1.5.4pre --・曲線描画ロジックの改良 -- --2003/11/30-2003/12/04 FreeNote 1.5.3pre --・ベジェ関数のスペルミスを修正 -- --2003/11/16 FreeNote 1.5.2pre --・円描画のロジックを追加 -- --2003/11/13 FreeNote 1.5.1pre --・スムージング追加 --2003/11/10-12 --・曲線整形モード追加 --2003/11/09 追加 --*/ --#include "fmtengine.h" --#include <qpointarray.h> --#include <qpe/qmath.h> --#include <math.h> --int SNAP_SIZE = 32; --int PHASE1_ANGLE = 30; --int PHASE2_ANGLE = 30; --double Surface(const QPoint& p1, const QPoint& p2) --{ -- return 0.5 * abs(p1.x() * p2.y() - p1.y() * p2.x()); --} -- --bool IsLinear(const QPoint& p1, const QPoint& p2, const QPoint& p3) --{ -- double s1 = Surface(p1, p2); -- double s2 = Surface(p2, p3); -- double s3 = Surface(p1, p3); -- if (s1 + s2 == s3) { -- return true; -- } else { -- return false; -- } --} -- --const double Angle(const QPoint& p1, const QPoint& p2) --{ -- return qATan2((double)(p2.y() - p1.y()), (double)(p2.x() - p1.x())); --} -- --const double DiffAngle(const QPoint& p1, const QPoint& p2, const QPoint& p3) --{ -- return fabs(Angle(p1, p2) - Angle(p2, p3)); --} -- --const double ToDegree(double t) --{ -- return t * 180 / M_PI; --} -- --const double ToRadian(double d) --{ -- return d * M_PI / 180; --} -- --const double Distance(const QPoint& p1, const QPoint& p2) --{ -- return hypot(p1.x() - p2.x(), p1.y() - p2.y()); --} -- --const QPoint SnapPoint(const QPoint& p) --{ -- int x = ((int)(p.x() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE; -- int y = ((int)(p.y() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE; -- return QPoint(x, y); --} -- --const QPoint ArrangePoint(const QPoint& p1, const QPoint& p2) --{ -- int x = p2.x(); -- int y = p2.y(); -- if (p1.x() - SNAP_SIZE / 2 <= x && p1.x() + SNAP_SIZE / 2 >= x) { -- x = p1.x(); -- } -- if (p1.y() - SNAP_SIZE / 2 <= y && p1.y() + SNAP_SIZE / 2 >= y) { -- y = p1.y(); -- } -- return QPoint(x, y); --} -- --FNPointList ReducePoints(FNPointList& p) --{ -- if (3 >= p.count()) { -- return p; -- } -- FNPointList rt; -- rt.append(p.first()); -- QPoint* p1 = p.first(); -- QPoint* p2 = p.at(1); -- QPoint* p3 = NULL; -- for (uint i = 2; i < p.count(); ++i) { -- p3 = p.at(i); -- if (false == IsLinear(*p1, *p2, *p3)) { -- rt.append(p2); -- p1 = p2; -- } -- p2 = p3; -- } -- rt.append(p3); -- return rt; --} -- --FNPointList ExtractAngle2(FNPointList& p, const int deg) --{ -- FNPointList rt; -- rt.append(p.first()); -- QPoint* st = p.first(); -- QPoint* mp = p.at(1); -- QPoint* ed = p.last(); -- for (uint i = 2; i < p.count(); ++i) { -- ed = p.at(i); -- if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) { -- st = mp; -- rt.append(mp); -- } -- mp = ed; -- } -- rt.append(ed); -- return rt; --} -- --FNPointList ExtractAngle(FNPointList& p, const int deg) --{ -- FNPointList rt; -- rt.append(p.first()); -- QPoint* st = p.first(); -- QPoint* mp = p.at(1); -- QPoint* ed = p.last(); -- for (uint i = 2; i < p.count(); ++i) { -- ed = p.at(i); -- if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) { -- st = mp; -- rt.append(mp); -- } -- mp = ed; -- } -- if (SNAP_SIZE / 2 > Distance(*p.first(), *p.last()) && 3 < p.count()) { -- rt.append(p.first()); -- } else { -- rt.append(ed); -- } -- return rt; --} -- --FNPointList SumupPoints(FNPointList& p) --{ -- if (3 >= p.count()) { -- return p; -- } -- FNPointList rt; -- rt.append(p.first()); -- QPoint* p1 = p.first(); -- QPoint* p2 = NULL; -- double pred = 0; -- for (uint i = 1; i < p.count() - 1; ++i) { -- p2 = p.at(i); -- double d = Distance(*p1, *p2); -- if (SNAP_SIZE / 2 < d || pred > d) { -- rt.append(p2); -- p1 = p2; -- d = 0; -- } -- pred = d; -- } -- rt.append(p.last()); -- return rt; --} -- --FNPointList SnapPoints(FNPointList& p) --{ -- FNPointList rt; -- for (uint i = 0; i < p.count(); ++i) { -- QPoint tp = SnapPoint(*p.at(i)); -- p.at(i)->setX(tp.x()); -- p.at(i)->setY(tp.y()); -- rt.append(p.at(i)); -- } -- return rt; --} -- --FNPointList ArrangePoints(FNPointList& p) --{ -- if (3 >= p.count() && 2 != p.count()) { -- return p; -- } -- FNPointList rt; -- rt.append(p.first()); -- QPoint* p1 = p.first(); -- QPoint* p2 = NULL; -- for (uint i = 1; i < p.count(); ++i) { -- p2 = p.at(i); -- QPoint tp = ArrangePoint(*p1, *p2); -- p2->setX(tp.x()); -- p2->setY(tp.y()); -- rt.append(p2); -- p1 = p2; -- } -- if (*p.first() == *p.last()) { -- QPoint tp = ArrangePoint(*p1, *p.first()); -- rt.first()->setX(tp.x()); -- rt.first()->setY(tp.y()); -- } -- return rt; --} -- --FNPointList TuningPoints(FNPointList& p) --{ -- FNPointList rt; -- if (3 >= p.count()) { -- for (uint i = 0; i < p.count(); ++i) { -- rt.append(new QPoint(*p.at(i))); -- } -- return rt; -- } -- rt.append(new QPoint(*p.at(0))); -- for (uint i = 1; i < p.count() - 1; ++i) { -- QPoint* p1 = p.at(i); -- QPoint* p2 = p.at(i + 1); -- rt.append(new QPoint(*p1)); -- if (i < p.count() - 2) { -- rt.append(new QPoint((p1->x() + p2->x())/2, (p1->y() + p2->y())/2)); -- } -- } -- rt.append(new QPoint(*p.at(p.count()-1))); -- return rt; --} -- --FNPointList ToBezier(FNPointList& p) { -- FNPointList rt; -- rt.append(new QPoint(*p.at(0))); -- for (uint i = 0; i < p.count() - 2; i += 2) { -- int x1 = p.at(i)->x(); -- int xa = p.at(i + 1)->x(); -- int x4 = p.at(i + 2)->x(); -- -- int x2 = (x1 + xa) / 2; -- int x3 = (xa + x4) / 2; -- -- int y1 = p.at(i)->y(); -- int ya = p.at(i + 1)->y(); -- int y4 = p.at(i + 2)->y(); -- -- int y2 = (y1 + ya) / 2; -- int y3 = (ya + y4) / 2; -- -- rt.append(new QPoint(x2 ,y2)); -- rt.append(new QPoint(x3 ,y3)); -- rt.append(new QPoint(x4 ,y4)); -- } -- return rt; --} -- --FNPointList ToCurves(FNPointList& p) { -- if (3 <= p.count()) { -- //ベジェによる補完 -- return ToBezier(p); -- } else { -- FNPointList rt; -- for (uint i = 0; i < p.count(); ++i) { -- rt.append(new QPoint(*p.at(i))); -- } -- return rt; -- } --} -- --FNPointList AutoFormat(FNPointList& p) --{ -- FNPointList tp = ExtractAngle(p, PHASE1_ANGLE); -- uint n; -- do { -- n = tp.count(); -- tp = SumupPoints(tp); -- tp = ExtractAngle(tp, PHASE1_ANGLE); -- tp = ArrangePoints(tp); -- } while (n > tp.count()); -- tp = SnapPoints(tp); -- tp = ReducePoints(tp); -- FNPointList rt; -- if (2 == tp.count()) { -- if (*tp.first() == *tp.last()) { -- return rt; -- } -- } -- for (uint i = 0; i < tp.count(); ++i) { -- rt.append(new QPoint(*tp.at(i))); -- } -- return rt; --} -- --FNPointList ToEllipse(int x, int y, int w, int h) { -- FNPointList rt; -- QPointArray pa; -- pa.makeEllipse(x, y, w, h); -- for (uint i = 0; i < pa.count(); ++i) { -- rt.append(new QPoint(pa.point(i))); -- } -- return rt; --} -- --FNPointList AutoCurve(FNPointList& p) --{ -- FNPointList tp2; -- tp2.setAutoDelete(true); -- FNPointList tp4; -- tp4.setAutoDelete(true); -- QPoint sp = SnapPoint(*p.at(0)); -- QPoint ep = SnapPoint(*p.at(p.count()-1)); -- if (sp == ep) { -- //楕円 -- int sx = p.at(0)->x(); -- int sy = p.at(0)->y(); -- int ex = sx; -- int ey = sy; -- for (uint i = 1; i < p.count(); ++i) { -- QPoint tp = *p.at(i); -- if (sx > tp.x()) { -- sx = tp.x(); -- } else if (ex < tp.x()) { -- ex = tp.x(); -- } -- if (sy > tp.y()) { -- sy = tp.y(); -- } else if (ey < tp.y()) { -- ey = tp.y(); -- } -- } -- sp = SnapPoint(QPoint(sx, sy)); -- ep = SnapPoint(QPoint(ex, ey)); -- tp2.append(new QPoint(sp.x(), sp.y())); -- tp2.append(new QPoint(ep.x(), ep.y())); -- } else { -- FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE); -- uint n; -- do { -- n = tp.count(); -- tp = SumupPoints(tp); -- tp = ExtractAngle2(tp, PHASE2_ANGLE); -- tp = SnapPoints(tp); -- } while (n > tp.count()); -- tp = SumupPoints(tp); -- tp = ReducePoints(tp); -- tp4 = TuningPoints(tp); -- tp2 = ToCurves(tp4); -- } -- FNPointList rt; -- if (2 == tp2.count()) { -- if (*tp2.first() == *tp2.last()) { -- return rt; -- } -- } -- for (uint i = 0; i < tp2.count(); ++i) { -- rt.append(new QPoint(*tp2.at(i))); -- } -- return rt; --} -- --FNPointList Smoothing(FNPointList& p) --{ -- int tsnap = SNAP_SIZE; -- SNAP_SIZE=8; -- FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE); -- tp = SumupPoints(tp); -- tp = ReducePoints(tp); -- FNPointList tp4 = TuningPoints(tp); -- tp4.setAutoDelete(true); -- FNPointList tp2 = ToCurves(tp4); -- tp2.setAutoDelete(true); -- FNPointList rt; -- for (uint i = 0; i < tp2.count(); ++i) { -- rt.append(new QPoint(*tp2.at(i))); -- } -- SNAP_SIZE = tsnap; -- return rt; --} -- --FNPointList Reduce(FNPointList& p) --{ -- FNPointList tp = ReducePoints(p); -- FNPointList rt; -- for (uint i = 0; i < tp.count(); ++i) { -- rt.append(new QPoint(*tp.at(i))); -- } -- return rt; --} -+/* FreeNote for Sharp SLA300, B500, C7x0 Linux PDA -+ Copyright (C) 2003 Joe Kanemori.<kanemori@ymg.urban.ne.jp> -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+*/ -+/* -+2003/12/16-19 FreeNote ver 1.5.5pre -+・曲線描画ロジックの改良 -+ -+2003/12/14 FreeNote 1.5.4pre -+・曲線描画ロジックの改良 -+ -+2003/11/30-2003/12/04 FreeNote 1.5.3pre -+・ベジェ関数のスペルミスを修正 -+ -+2003/11/16 FreeNote 1.5.2pre -+・円描画のロジックを追加 -+ -+2003/11/13 FreeNote 1.5.1pre -+・スムージング追加 -+2003/11/10-12 -+・曲線整形モード追加 -+2003/11/09 追加 -+*/ -+#include "fmtengine.h" -+#include <qpointarray.h> -+#include <qpe/qmath.h> -+#include <math.h> -+#include <stdlib.h> // abs -+int SNAP_SIZE = 32; -+int PHASE1_ANGLE = 30; -+int PHASE2_ANGLE = 30; -+double Surface(const QPoint& p1, const QPoint& p2) -+{ -+ return 0.5 * abs(p1.x() * p2.y() - p1.y() * p2.x()); -+} -+ -+bool IsLinear(const QPoint& p1, const QPoint& p2, const QPoint& p3) -+{ -+ double s1 = Surface(p1, p2); -+ double s2 = Surface(p2, p3); -+ double s3 = Surface(p1, p3); -+ if (s1 + s2 == s3) { -+ return true; -+ } else { -+ return false; -+ } -+} -+ -+const double Angle(const QPoint& p1, const QPoint& p2) -+{ -+ return qATan2((double)(p2.y() - p1.y()), (double)(p2.x() - p1.x())); -+} -+ -+const double DiffAngle(const QPoint& p1, const QPoint& p2, const QPoint& p3) -+{ -+ return fabs(Angle(p1, p2) - Angle(p2, p3)); -+} -+ -+const double ToDegree(double t) -+{ -+ return t * 180 / M_PI; -+} -+ -+const double ToRadian(double d) -+{ -+ return d * M_PI / 180; -+} -+ -+const double Distance(const QPoint& p1, const QPoint& p2) -+{ -+ return hypot(p1.x() - p2.x(), p1.y() - p2.y()); -+} -+ -+const QPoint SnapPoint(const QPoint& p) -+{ -+ int x = ((int)(p.x() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE; -+ int y = ((int)(p.y() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE; -+ return QPoint(x, y); -+} -+ -+const QPoint ArrangePoint(const QPoint& p1, const QPoint& p2) -+{ -+ int x = p2.x(); -+ int y = p2.y(); -+ if (p1.x() - SNAP_SIZE / 2 <= x && p1.x() + SNAP_SIZE / 2 >= x) { -+ x = p1.x(); -+ } -+ if (p1.y() - SNAP_SIZE / 2 <= y && p1.y() + SNAP_SIZE / 2 >= y) { -+ y = p1.y(); -+ } -+ return QPoint(x, y); -+} -+ -+FNPointList ReducePoints(FNPointList& p) -+{ -+ if (3 >= p.count()) { -+ return p; -+ } -+ FNPointList rt; -+ rt.append(p.first()); -+ QPoint* p1 = p.first(); -+ QPoint* p2 = p.at(1); -+ QPoint* p3 = NULL; -+ for (uint i = 2; i < p.count(); ++i) { -+ p3 = p.at(i); -+ if (false == IsLinear(*p1, *p2, *p3)) { -+ rt.append(p2); -+ p1 = p2; -+ } -+ p2 = p3; -+ } -+ rt.append(p3); -+ return rt; -+} -+ -+FNPointList ExtractAngle2(FNPointList& p, const int deg) -+{ -+ FNPointList rt; -+ rt.append(p.first()); -+ QPoint* st = p.first(); -+ QPoint* mp = p.at(1); -+ QPoint* ed = p.last(); -+ for (uint i = 2; i < p.count(); ++i) { -+ ed = p.at(i); -+ if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) { -+ st = mp; -+ rt.append(mp); -+ } -+ mp = ed; -+ } -+ rt.append(ed); -+ return rt; -+} -+ -+FNPointList ExtractAngle(FNPointList& p, const int deg) -+{ -+ FNPointList rt; -+ rt.append(p.first()); -+ QPoint* st = p.first(); -+ QPoint* mp = p.at(1); -+ QPoint* ed = p.last(); -+ for (uint i = 2; i < p.count(); ++i) { -+ ed = p.at(i); -+ if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) { -+ st = mp; -+ rt.append(mp); -+ } -+ mp = ed; -+ } -+ if (SNAP_SIZE / 2 > Distance(*p.first(), *p.last()) && 3 < p.count()) { -+ rt.append(p.first()); -+ } else { -+ rt.append(ed); -+ } -+ return rt; -+} -+ -+FNPointList SumupPoints(FNPointList& p) -+{ -+ if (3 >= p.count()) { -+ return p; -+ } -+ FNPointList rt; -+ rt.append(p.first()); -+ QPoint* p1 = p.first(); -+ QPoint* p2 = NULL; -+ double pred = 0; -+ for (uint i = 1; i < p.count() - 1; ++i) { -+ p2 = p.at(i); -+ double d = Distance(*p1, *p2); -+ if (SNAP_SIZE / 2 < d || pred > d) { -+ rt.append(p2); -+ p1 = p2; -+ d = 0; -+ } -+ pred = d; -+ } -+ rt.append(p.last()); -+ return rt; -+} -+ -+FNPointList SnapPoints(FNPointList& p) -+{ -+ FNPointList rt; -+ for (uint i = 0; i < p.count(); ++i) { -+ QPoint tp = SnapPoint(*p.at(i)); -+ p.at(i)->setX(tp.x()); -+ p.at(i)->setY(tp.y()); -+ rt.append(p.at(i)); -+ } -+ return rt; -+} -+ -+FNPointList ArrangePoints(FNPointList& p) -+{ -+ if (3 >= p.count() && 2 != p.count()) { -+ return p; -+ } -+ FNPointList rt; -+ rt.append(p.first()); -+ QPoint* p1 = p.first(); -+ QPoint* p2 = NULL; -+ for (uint i = 1; i < p.count(); ++i) { -+ p2 = p.at(i); -+ QPoint tp = ArrangePoint(*p1, *p2); -+ p2->setX(tp.x()); -+ p2->setY(tp.y()); -+ rt.append(p2); -+ p1 = p2; -+ } -+ if (*p.first() == *p.last()) { -+ QPoint tp = ArrangePoint(*p1, *p.first()); -+ rt.first()->setX(tp.x()); -+ rt.first()->setY(tp.y()); -+ } -+ return rt; -+} -+ -+FNPointList TuningPoints(FNPointList& p) -+{ -+ FNPointList rt; -+ if (3 >= p.count()) { -+ for (uint i = 0; i < p.count(); ++i) { -+ rt.append(new QPoint(*p.at(i))); -+ } -+ return rt; -+ } -+ rt.append(new QPoint(*p.at(0))); -+ for (uint i = 1; i < p.count() - 1; ++i) { -+ QPoint* p1 = p.at(i); -+ QPoint* p2 = p.at(i + 1); -+ rt.append(new QPoint(*p1)); -+ if (i < p.count() - 2) { -+ rt.append(new QPoint((p1->x() + p2->x())/2, (p1->y() + p2->y())/2)); -+ } -+ } -+ rt.append(new QPoint(*p.at(p.count()-1))); -+ return rt; -+} -+ -+FNPointList ToBezier(FNPointList& p) { -+ FNPointList rt; -+ rt.append(new QPoint(*p.at(0))); -+ for (uint i = 0; i < p.count() - 2; i += 2) { -+ int x1 = p.at(i)->x(); -+ int xa = p.at(i + 1)->x(); -+ int x4 = p.at(i + 2)->x(); -+ -+ int x2 = (x1 + xa) / 2; -+ int x3 = (xa + x4) / 2; -+ -+ int y1 = p.at(i)->y(); -+ int ya = p.at(i + 1)->y(); -+ int y4 = p.at(i + 2)->y(); -+ -+ int y2 = (y1 + ya) / 2; -+ int y3 = (ya + y4) / 2; -+ -+ rt.append(new QPoint(x2 ,y2)); -+ rt.append(new QPoint(x3 ,y3)); -+ rt.append(new QPoint(x4 ,y4)); -+ } -+ return rt; -+} -+ -+FNPointList ToCurves(FNPointList& p) { -+ if (3 <= p.count()) { -+ //ベジェによる補完 -+ return ToBezier(p); -+ } else { -+ FNPointList rt; -+ for (uint i = 0; i < p.count(); ++i) { -+ rt.append(new QPoint(*p.at(i))); -+ } -+ return rt; -+ } -+} -+ -+FNPointList AutoFormat(FNPointList& p) -+{ -+ FNPointList tp = ExtractAngle(p, PHASE1_ANGLE); -+ uint n; -+ do { -+ n = tp.count(); -+ tp = SumupPoints(tp); -+ tp = ExtractAngle(tp, PHASE1_ANGLE); -+ tp = ArrangePoints(tp); -+ } while (n > tp.count()); -+ tp = SnapPoints(tp); -+ tp = ReducePoints(tp); -+ FNPointList rt; -+ if (2 == tp.count()) { -+ if (*tp.first() == *tp.last()) { -+ return rt; -+ } -+ } -+ for (uint i = 0; i < tp.count(); ++i) { -+ rt.append(new QPoint(*tp.at(i))); -+ } -+ return rt; -+} -+ -+FNPointList ToEllipse(int x, int y, int w, int h) { -+ FNPointList rt; -+ QPointArray pa; -+ pa.makeEllipse(x, y, w, h); -+ for (uint i = 0; i < pa.count(); ++i) { -+ rt.append(new QPoint(pa.point(i))); -+ } -+ return rt; -+} -+ -+FNPointList AutoCurve(FNPointList& p) -+{ -+ FNPointList tp2; -+ tp2.setAutoDelete(true); -+ FNPointList tp4; -+ tp4.setAutoDelete(true); -+ QPoint sp = SnapPoint(*p.at(0)); -+ QPoint ep = SnapPoint(*p.at(p.count()-1)); -+ if (sp == ep) { -+ //楕円 -+ int sx = p.at(0)->x(); -+ int sy = p.at(0)->y(); -+ int ex = sx; -+ int ey = sy; -+ for (uint i = 1; i < p.count(); ++i) { -+ QPoint tp = *p.at(i); -+ if (sx > tp.x()) { -+ sx = tp.x(); -+ } else if (ex < tp.x()) { -+ ex = tp.x(); -+ } -+ if (sy > tp.y()) { -+ sy = tp.y(); -+ } else if (ey < tp.y()) { -+ ey = tp.y(); -+ } -+ } -+ sp = SnapPoint(QPoint(sx, sy)); -+ ep = SnapPoint(QPoint(ex, ey)); -+ tp2.append(new QPoint(sp.x(), sp.y())); -+ tp2.append(new QPoint(ep.x(), ep.y())); -+ } else { -+ FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE); -+ uint n; -+ do { -+ n = tp.count(); -+ tp = SumupPoints(tp); -+ tp = ExtractAngle2(tp, PHASE2_ANGLE); -+ tp = SnapPoints(tp); -+ } while (n > tp.count()); -+ tp = SumupPoints(tp); -+ tp = ReducePoints(tp); -+ tp4 = TuningPoints(tp); -+ tp2 = ToCurves(tp4); -+ } -+ FNPointList rt; -+ if (2 == tp2.count()) { -+ if (*tp2.first() == *tp2.last()) { -+ return rt; -+ } -+ } -+ for (uint i = 0; i < tp2.count(); ++i) { -+ rt.append(new QPoint(*tp2.at(i))); -+ } -+ return rt; -+} -+ -+FNPointList Smoothing(FNPointList& p) -+{ -+ int tsnap = SNAP_SIZE; -+ SNAP_SIZE=8; -+ FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE); -+ tp = SumupPoints(tp); -+ tp = ReducePoints(tp); -+ FNPointList tp4 = TuningPoints(tp); -+ tp4.setAutoDelete(true); -+ FNPointList tp2 = ToCurves(tp4); -+ tp2.setAutoDelete(true); -+ FNPointList rt; -+ for (uint i = 0; i < tp2.count(); ++i) { -+ rt.append(new QPoint(*tp2.at(i))); -+ } -+ SNAP_SIZE = tsnap; -+ return rt; -+} -+ -+FNPointList Reduce(FNPointList& p) -+{ -+ FNPointList tp = ReducePoints(p); -+ FNPointList rt; -+ for (uint i = 0; i < tp.count(); ++i) { -+ rt.append(new QPoint(*tp.at(i))); -+ } -+ return rt; -+} ---- FreeNote_1.6.1_arm/FNCanvas.cpp~compile 2003-12-24 15:20:16.000000000 +0100 -+++ FreeNote_1.6.1_arm/FNCanvas.cpp 2004-02-01 18:43:35.000000000 +0100 -@@ -1,1227 +1,1228 @@ --/* FreeNote for Sharp SLA300, B500, C7x0 Linux PDA -- Copyright (C) 2003 Joe Kanemori.<kanemori@ymg.urban.ne.jp> -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --*/ --/* --2003/12/23 ver 1.6.1 --・保存情報のサイズ縮小 -- --2003/12/16-19 ver 1.5.5pre --・ペンサイズの追加(1-8) --・アンドゥ・リドゥの実装 -- --2003/12/14 ver 1.5.4pre --・ペンサイズを選択可能に。 -- --2003/12/05 ver 1.5.3Apre --・グリッドの色を修正 -- --2003/12/04 ver 1.5.3pre --・グリッドの描画を一部修正 -- --2003/11/10 ver 1.5.1pre --・曲線整形モード追加 -- --2003/11/09 ver 1.5.0pre --・自動整形モード追加 -- --2003/09/03 ver 1.3.4pre --・Use all quadrant OFF時に表示位置がリセットされる場合があるバグ対応。 -- --2003/09/01-03 ver 1.3.3pre --・スクロールの改良 --・Use all quadrant(全象限を使用する)メニューを追加 -- --2003/08/31 FreeNote 1.3.2pre --・全方向スクロール -- --2003/08/23 FreeNote 1.3.0pre --・CR動作の修正 -- --2003/08/15 FreeNote 1.2.1を公開 --・保存時のバグ修正 --・完了ダイアログの自動消去 --・PNGファイルへの出力 -- --2003/08/15 FreeNote 1.2を公開 --・オプション追加 --・スクロールガイド --・Freeファイル関連付け --・アイコンの変更 -- --2003/08/05 FreeNote 1.1.1preを公開 --・高速起動時に閉じた状態を保持 --・描画モード切替え時に消しゴム表示 --・保存時間短縮 --・Viewモードの挙動を変更 --・メニューの見た目を変更 --*/ --#include "fncanvas.h" --#include <stdio.h> --#include <qfile.h> --#include <qmessagebox.h> --#include <qtextstream.h> --#include <qpen.h> --#include <qcolor.h> --#include <qpoint.h> --#include <qthread.h> --#include <qimage.h> --#include <math.h> --#include "fnmessagebox.h" --#include "fmtengine.h" -- --int snap(int v) { -- int tv = abs(v); -- tv = ((int)(tv + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE; -- if (0 > v) { -- return -tv; -- } else { -- return tv; -- } --} -- --FNCanvas::FNCanvas(QWidget* parent = 0, const char* name = 0, WFlags f = 0) -- :QWidget(parent, name, f), -- _pen(black, 1, SolidLine, RoundCap, RoundJoin), -- _asMode(AS_NONE), -- _drawMode(MODE_DRAW), -- _disp_offset(0), -- _eraser_l(50), -- _eraser_s(10), -- _h_step(100), -- _v_step(100), -- _margin(5), -- _scrollTiming(800), -- _viewMode(false), -- _isWaiting(false), -- _isDragging(false), -- _isHeadingEnables(false), -- _isShowGuide(false), -- _isUseAllQuadrant(false), -- _scale_x(1.0), -- _scale_y(1.0) --{ -- _tracks.setAutoDelete(true); -- this->setBackgroundMode(NoBackground); -- _timer = new QTimer(this); -- connect(_timer, SIGNAL(timeout()), this, SLOT(autoScroll())); --} -- --FNCanvas::~FNCanvas() --{ -- _timer->stop(); -- delete _timer; -- -- _tracks.clear(); -- clearList(_draws); --} -- --void FNCanvas::setScrollTiming(int v) --{ -- _scrollTiming = v; --} -- -- --void FNCanvas::setVStep(int v) --{ -- _v_step = v; --} -- --void FNCanvas::setHStep(int v) --{ -- _h_step = v; --} -- --void FNCanvas::setSEraser(int v) --{ -- _eraser_s = v; --} -- --void FNCanvas::setLEraser(int v) --{ -- _eraser_l = v; --} -- -- --void FNCanvas::setMargin(int v) --{ -- if (v < 3) { -- v = 3; -- } -- _margin = v; --} -- --void FNCanvas::setScrollMode(int as) --{ -- _asMode = as; -- redraw(); --} -- --void FNCanvas::autoScroll() --{ -- if (AS_NONE == _asMode) { -- if (MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode || MODE_SMOOTH == _drawMode) { -- setOrigin(_origin.x(), _origin.y()); -- } -- return; -- } -- bool tmp = _isHeadingEnables; -- int dx = 0; -- int dy = 0; -- if (AS_BOTH == _asMode || AS_HORIZONTAL == _asMode) { -- if (_last.x() > width() * (_margin - 1) / _margin) { -- dx = _h_step; -- } else if (_last.x() < width() / _margin) { -- dx = -_h_step; -- } -- } -- if (AS_BOTH == _asMode || AS_VERTICAL == _asMode) { -- if (_last.y() > height() * (_margin - 1) / _margin) { -- dy = _v_step; -- } else if (_last.y() < height() / _margin) { -- dy = -_v_step; -- } -- } -- setOrigin(_origin.x() + dx, _origin.y() + dy); -- _isHeadingEnables = tmp; --} -- --void FNCanvas::mousePressEvent(QMouseEvent* evt) --{ -- setFocus(); -- _timer->stop(); -- _tracks.clear(); -- if (_viewMode) { -- _isWaiting = true; -- _viewMode = false; -- setOrigin((int)((evt->x()) / _scale_x) - width() / 2, (int)((evt->y()) / _scale_y) - height() / 2); -- redraw(); -- emit resetViewMode(); -- } else if (MODE_ERASE != _drawMode) { -- _last = evt->pos(); -- _tracks.append(new QPoint(_last)); -- } else { -- redraw(); -- _last = evt->pos(); -- _tracks.append(new QPoint(_last)); -- -- QPainter pbuf; -- QPainter pwin; -- pbuf.begin(&_buffer); -- pwin.begin(this); -- -- int w = _eraser_s; -- if (PENWIDTH_MAX / 2 < _pen.width()) { -- w = _eraser_l; -- } -- pbuf.setRasterOp(XorROP); -- pbuf.setPen(QPen(white, 1)); -- pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -- -- pwin.setRasterOp(XorROP); -- pwin.setPen(QPen(white, 1)); -- pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -- -- pbuf.end(); -- pwin.end(); -- } -- _isDragging = true; --} -- --void FNCanvas::mouseMoveEvent(QMouseEvent* evt) --{ -- if (_isWaiting) { -- return; -- } -- if (MODE_ERASE != _drawMode) { -- QPainter pwin; -- QPainter pbuf; -- -- pwin.begin(this); -- pbuf.begin(&_buffer); -- -- pwin.setPen(_pen); -- pbuf.setPen(_pen); -- -- pwin.drawLine(_last, evt->pos()); -- pbuf.drawLine(_last, evt->pos()); -- -- pwin.end(); -- pbuf.end(); -- _last = evt->pos(); -- _tracks.append(new QPoint(_last)); -- } else { -- //redraw(); -- if (_last.x() == -1) { -- return; -- } -- QPainter pbuf; -- QPainter pwin; -- -- pbuf.begin(&_buffer); -- pwin.begin(this); -- -- int w = _eraser_s; -- if (PENWIDTH_MAX / 2 < _pen.width()) { -- w = _eraser_l; -- } -- pbuf.setRasterOp(XorROP); -- pwin.setRasterOp(XorROP); -- pbuf.setPen(QPen(white, 1)); -- pwin.setPen(QPen(white, 1)); -- pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -- pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -- -- _tracks.append(new QPoint(evt->pos())); -- _last = evt->pos(); -- -- pbuf.setRasterOp(CopyROP); -- pwin.setRasterOp(CopyROP); -- QRect r = QRect(0, 0, width(), height()); -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- FNPolygon* p = _draws.at(i); -- if (r.intersects(p->boundingRect())) { -- bool f = false; -- QRect selected(_last.x() - w / 2, _last.y() - w / 2, w, w); -- for (uint j = 0; j < p->points().count(); ++j) { -- QPoint& pts = p->points().at(j); -- if (selected.contains(pts)) { -- f = true; -- break; -- } -- } -- if (f) { -- p->drawShape(pbuf, f); -- p->drawShape(pwin, f); -- } -- } -- } -- pbuf.setRasterOp(XorROP); -- pwin.setRasterOp(XorROP); -- pbuf.setPen(QPen(white, 1)); -- pwin.setPen(QPen(white, 1)); -- pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -- pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -- pbuf.end(); -- pwin.end(); -- } --} -- --void FNCanvas::mouseReleaseEvent(QMouseEvent* evt) --{ -- _isDragging = false; -- if (_isWaiting) { -- _isWaiting = false; -- return; -- } -- _last = evt->pos(); -- if (MODE_ERASE != _drawMode) { -- if (1 < _tracks.count()) { -- FNPolygon* p = NULL; -- if (MODE_FORMAT == _drawMode) { -- p = new FNPolygon(_pen); -- _tracks = AutoFormat(_tracks); -- } else if (MODE_CURVE == _drawMode) { -- QPoint sp = SnapPoint(*_tracks.at(0)); -- QPoint ep = SnapPoint(*_tracks.at(_tracks.count()-1)); -- _tracks = AutoCurve(_tracks); -- if (sp == ep) { -- p = new FNEllipse(_pen); -- } else if (2 < _tracks.count()) { -- p = new FNBezier(_pen); -- } else { -- p = new FNPolygon(_pen); -- } -- } else if (MODE_SMOOTH == _drawMode) { -- _tracks = Smoothing(_tracks); -- if (2 < _tracks.count()) { -- p = new FNBezier(_pen); -- } else { -- p = new FNPolygon(_pen); -- } -- } else { -- _tracks = Reduce(_tracks); -- p = new FNPolygon(_pen); -- } -- if (1 < _tracks.count()) { -- p->setPoints(_tracks); -- redobuf_flush(); -- _draws.append(p); -- } -- } -- _tracks.clear(); -- _isHeadingEnables = true; -- _timer->start(_scrollTiming, true); -- } else { -- _last = QPoint(-1, -1); -- _tracks.append(new QPoint(evt->pos())); -- redraw(); -- } --} -- --void FNCanvas::paintEvent(QPaintEvent* evt) --{ -- bitBlt(this, 0, 0, &_buffer); --} -- --void FNCanvas::resizeEvent(QResizeEvent* evt) --{ -- QPixmap save(_buffer); -- _buffer.resize(evt->size()); -- _buffer.fill(white); -- bitBlt(&_buffer, 0, 0, &save); -- redraw(); --} -- --void FNCanvas::setOrigin(QPoint& o) --{ -- this->setOrigin(o.x(), o.y()); --} -- --QPoint FNCanvas::getTopLeft() --{ -- if (0 == _draws.count() || !_isUseAllQuadrant) { -- return _origin; -- } -- -- int dx = ((FNPolygon*)_draws.at(0))->boundingRect().x(); -- int dy = ((FNPolygon*)_draws.at(0))->boundingRect().y(); -- for (uint i = 1; i < _draws.count(); ++i) { -- FNPolygon* p = _draws.at(i); -- if (dx > p->boundingRect().x()) { -- dx = p->boundingRect().x(); -- } -- if (dy > p->boundingRect().y()) { -- dy = p->boundingRect().y(); -- } -- } -- return QPoint(snap(dx), snap(dy)); --} -- -- --void FNCanvas::rebuild() --{ -- if (0 == _draws.count() || !_isUseAllQuadrant) { -- return; -- } -- -- QPoint d = getTopLeft(); -- for (uint i = 0; i < _draws.count(); ++i) { -- FNPolygon* p = _draws.at(i); -- p->translate(-d.x(), -d.y()); -- } -- -- _origin = QPoint(0, 0); --} -- -- --void FNCanvas::setOrigin(int ox, int oy) --{ -- ox = snap(ox); -- oy = snap(oy); -- _isHeadingEnables = false; -- _timer->stop(); -- -- -- int dx = 0; -- int dy = 0; -- if (!_isUseAllQuadrant) { -- if (0 > ox) { -- ox = 0; -- } -- if (0 > oy) { -- oy = 0; -- } -- dx = _origin.x() - ox; -- dy = _origin.y() - oy; -- } else { -- dx = _origin.x() - ox; -- dy = _origin.y() - oy; -- if (0 > ox) { -- ox = 0; -- } -- if (0 > oy) { -- oy = 0; -- } -- } -- for (uint i = 0; i < _tracks.count(); ++i) { -- QPoint* p = _tracks.at(i); -- p->setX(p->x() + dx); -- p->setY(p->y() + dy); -- } -- -- for (uint i = 0; i < _draws.count(); ++i) { -- FNPolygon* p = _draws.at(i); -- p->translate(dx, dy); -- } -- _origin = QPoint(ox, oy); -- emit originChanged(ox, oy); -- redraw(); --} -- --void FNCanvas::redraw() --{ -- if (!this->isVisible()) { -- return; -- } -- _buffer.fill(white); -- QPainter pbuf; -- QRect r = QRect(0, 0, width(), height()); -- pbuf.begin(&_buffer); -- if (_viewMode) { -- float wx = 0; -- float wy = 0; -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- FNPolygon* p = _draws.at(i); -- QRect r = p->boundingRect(); -- if (wx < r.right()) { -- wx = r.right(); -- } -- if (wy < r.bottom()) { -- wy = r.bottom(); -- } -- } -- wx += SNAP_SIZE; -- wy += SNAP_SIZE; -- wx = snap((int)wx); -- wy = snap((int)wy); -- wx = wx + _origin.x(); -- wy = wy + _origin.y(); -- _scale_x = (float)width() / wx; -- _scale_y = (float)height() / wy; -- if (1.0f < _scale_x) { -- _scale_x = 1.0f; -- } -- if (1.0f < _scale_y) { -- _scale_y = 1.0f; -- } -- if (_scale_x > _scale_y) { -- _scale_x = _scale_y; -- } else if (_scale_x < _scale_y) { -- _scale_y = _scale_x; -- } -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- FNPolygon* p = _draws.at(i); -- FNPolygon* t = NULL; -- if (p->type() == FN_BEZIER) { -- t = new FNBezier(*(FNBezier*)p); -- } else if (p->type() == FN_ELLIPSE) { -- t = new FNEllipse(*(FNEllipse*)p); -- } else { -- t = new FNPolygon(*p); -- } -- t->translate(-_origin.x(), -_origin.y()); -- for (uint j = 0; j < t->points().count(); ++j) { -- QPoint& pts = t->points().at(j); -- int x = (int)(pts.x() * _scale_x); -- int y = (int)(pts.y() * _scale_y); -- pts.setX(x); -- pts.setY(y); -- } -- double pensize = t->pen().width(); -- if (_scale_x > _scale_y) { -- pensize = pensize * _scale_y; -- } else { -- pensize = pensize * _scale_x; -- } -- if (0 >= pensize) { -- pensize = 1; -- } -- t->pen().setWidth(pensize); -- t->drawShape(pbuf); -- delete t; -- } -- } else if (MODE_ERASE != _drawMode) { -- if (MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode) { -- QPen pen1(QColor(0, 240, 240), 1); -- QPen pen2(QColor(0, 0, 0), 1); -- pbuf.setPen(QPen(QColor(0, 240, 240), 1)); -- pbuf.setPen(pen1); -- for (int x = 0; x < width() + SNAP_SIZE; x += SNAP_SIZE) { -- pbuf.drawLine(x - SNAP_SIZE / 2, 0, x - SNAP_SIZE / 2, height()); -- for (int y = 0; y < height() + SNAP_SIZE; y += SNAP_SIZE) { -- pbuf.drawLine(0, y - SNAP_SIZE / 2, width(), y - SNAP_SIZE / 2); -- pbuf.drawRect(x-1,y-1,2,2); -- } -- } -- } -- if (_isShowGuide) { -- pbuf.setPen(QPen(cyan, 1, DashLine)); -- if (AS_HORIZONTAL == _asMode || AS_BOTH == _asMode) { -- if (0 != _origin.x() || _isUseAllQuadrant) { -- pbuf.drawLine(width() / _margin, 0, width() / _margin, height()); -- } -- pbuf.drawLine(width() * (_margin - 1) / _margin, 0, width() * (_margin - 1) / _margin, height()); -- } -- -- if (AS_VERTICAL == _asMode || AS_BOTH == _asMode) { -- if (0 != _origin.y() || _isUseAllQuadrant) { -- pbuf.drawLine(0, height() / _margin, width(), height() / _margin); -- } -- pbuf.drawLine(0, height() * (_margin - 1) / _margin, width(), height() * (_margin - 1) / _margin); -- } -- } -- -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- FNPolygon* p = _draws.at(i); -- if (r.intersects(p->boundingRect())) { -- p->drawShape(pbuf); -- } -- } -- } else { -- int w = _eraser_s; -- if (PENWIDTH_MAX / 2 < _pen.width()) { -- w = _eraser_l; -- } -- FNPointList removes; -- for (uint i = 0; i < _tracks.count(); ++i) { -- removes.append(_tracks.at(i)); -- } -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- FNPolygon* p = _draws.at(i); -- if (r.intersects(p->boundingRect())) { -- bool f = false; -- for (uint j = 0; j < _tracks.count(); ++j) { -- QPoint* pts = _tracks.at(j); -- QRect selected(pts->x() - w / 2, pts->y() - w / 2, w, w); -- for (uint k = 0; k < p->points().count(); ++k) { -- QPoint& pts2 = p->points().at(k); -- if (selected.contains(pts2)) { -- f = true; -- removes.remove(pts); -- break; -- } -- } -- if (f) { -- break; -- } -- } -- p->drawShape(pbuf, f); -- } -- } -- for (uint i = 0; i < removes.count(); ++i) { -- _tracks.remove(removes.at(i)); -- } -- /* -- if (_isDragging) { -- pbuf.setPen(QPen(black, 1)); -- pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -- } -- */ -- } -- pbuf.end(); -- repaint(); --} -- --void FNCanvas::changeColor(QRgb c) --{ -- _pen.setColor(QColor(c)); --} -- --void FNCanvas::undo() --{ -- if (MODE_ERASE != _drawMode) { -- ++_disp_offset; -- if (_disp_offset > _draws.count()) { -- _disp_offset = _draws.count(); -- } -- } else { -- _draws = _undobuf; -- _marks.clear(); -- } -- redraw(); --} -- --void FNCanvas::redo() --{ -- if (MODE_ERASE != _drawMode) { -- if (0 < _disp_offset) { -- --_disp_offset; -- } -- } -- redraw(); --} -- --void FNCanvas::clearList(FNPolygonList& list) --{ -- list.setAutoDelete(true); -- list.clear(); -- list.setAutoDelete(false); --} -- --void FNCanvas::clear() --{ -- _disp_offset = 0; -- clearList(_draws); -- _undobuf.clear(); -- setOrigin(0, 0); -- redraw(); --} -- --void FNCanvas::viewChanged(bool flg) --{ -- _tracks.clear(); -- _viewMode = flg; -- if (_viewMode) { -- if (_isUseAllQuadrant) { -- rebuild(); -- } -- setOrigin(0, 0); -- } -- redraw(); --} -- --void FNCanvas::redobuf_flush() --{ -- for (uint i = 0; i < _disp_offset; ++i) { -- FNPolygon* p = _draws.last(); -- _draws.remove(p); -- delete p; -- } -- _disp_offset = 0; --} -- --void FNCanvas::modeChanged(int mode) --{ -- _tracks.clear(); -- _drawMode = mode; -- redobuf_flush(); -- if (MODE_ERASE == _drawMode) { -- _marks.clear(); -- _undobuf = _draws; -- } else { -- if (_draws.count() != _undobuf.count()) { -- for (uint i = 0; i < _marks.count(); ++i) { -- FNPolygon* p = _marks.at(i); -- _draws.remove(p); -- } -- clearList(_marks); -- } -- } -- redraw(); --} -- --QRect FNCanvas::getMatrix(const QRect& r) const --{ -- int ox = _origin.x(); -- int oy = _origin.y(); -- const int wide = 100; -- -- int left = r.left() + ox; -- int top = r.top() + oy; -- int right = r.right() + ox; -- int bottom = r.bottom() + oy; -- -- left = (int)(left / wide) * wide; -- top = (int)(top / wide) * wide; -- right = (right % wide == 0 && left != right) ? right : (int)((right + wide) / wide) * wide; -- bottom = (bottom % wide == 0 && top != bottom) ? bottom : (int)((bottom + wide) / wide) * wide; -- -- return QRect(left - ox, top - oy, right - left, bottom - top); --} -- --void FNCanvas::CR() --{ -- if (MODE_ERASE == _drawMode) { -- return; -- } -- if (_isHeadingEnables) { -- //lastから、左方向に向けて探索する。 -- QRect r = getMatrix(_draws.last()->boundingRect()); -- bool isSearching = true; -- r.moveBy(-100, 0); -- while (isSearching) { -- isSearching = false; -- for (uint i = 0; i < _draws.count(); ++i) { -- FNPolygon* p = _draws.at(i); -- const QRect& r2 = p->boundingRect(); -- if (r.intersects(r2)) { -- if (r.left() + 100 > r2.left()) { -- r = getMatrix(r2); -- r.moveBy(-100, 0); -- isSearching = true; -- break; -- } -- } -- } -- } -- r.moveBy(100, 0); -- //lastが画面の4/5以下ならば、スクロールアップする。 -- //そうでなければ、ヘッディングのみ。 -- if (_last.y() > height() * 4 / 5) { -- setOrigin(_origin.x() + r.x(), _origin.y() + 50); -- } else { -- setOrigin(_origin.x() + r.x(), _origin.y()); -- } -- _isHeadingEnables = false; -- } else { -- //lastの周囲に何も無い場合は、縦にスクロールする。 -- setOrigin(_origin.x(), _origin.y() + 50); -- } --} -- --void FNCanvas::erase() --{ -- if (MODE_ERASE != _drawMode) { -- return; -- } -- FNPolygonList temp; -- int w = _eraser_s; -- if (PENWIDTH_MAX / 2 < _pen.width()) { -- w = _eraser_l; -- } -- QRect r = QRect(0, 0, width(), height()); -- for (uint i = 0; i < _draws.count(); ++i) { -- FNPolygon* p = _draws.at(i); -- bool f = false; -- if (r.intersects(p->boundingRect())) { -- for (uint j = 0; j < _tracks.count(); ++j) { -- QPoint* pts = _tracks.at(j); -- QRect selected(pts->x() - w / 2, pts->y() - w / 2, w, w); -- for (uint k = 0; k < p->points().count(); ++k) { -- QPoint& pts2 = p->points().at(k); -- if (selected.contains(pts2)) { -- temp.append(p); -- f = true; -- break; -- } -- } -- if (f) { -- break; -- } -- } -- } -- } -- for (uint i = 0; i < temp.count(); ++i) { -- _draws.remove(temp.at(i)); -- _marks.append(temp.at(i)); -- } -- _tracks.clear(); -- redraw(); --} -- --void FNCanvas::setPensize(int sz) --{ -- _pen.setWidth(sz); --} -- --bool FNCanvas::exportPNG(const QFileInfo& info, QPixmap& buf) --{ -- if (0 == info.fileName().length()) { -- QMessageBox::warning(0,"FreeNoteQt", "file name is empty."); -- return false; -- } -- if (info.extension(false) != "png") { -- QMessageBox::warning(0,"FreeNoteQt", "extension '.png' expected."); -- return false; -- } -- -- bool ret = buf.save(info.absFilePath(), "PNG"); -- if (ret) { -- FNMessageBox::information(0,"FreeNoteQt", "export PNG complete."); -- } else { -- QMessageBox::warning(0,"FreeNoteQt", "could not export file."); -- } -- return ret; --} -- --QString FNCanvas::mkPDFscript(FNPolygon* elm) --{ -- QString s =""; -- char buf[1024]; -- -- float r = (float)elm->pen().color().red() / 255.0f; -- float g = (float)elm->pen().color().green() / 255.0f; -- float b = (float)elm->pen().color().blue() / 255.0f; -- s += "q\n"; -- sprintf(buf, "%f %f %f RG\n", r, g, b); -- s += buf; -- QPointArray points = elm->points().copy(); -- points.translate(_origin.x(), _origin.y()); -- if (elm->type() == FN_BEZIER) { -- sprintf(buf, "%d %d m\n", points[0].x(), points[0].y()); -- s += buf; -- for (uint j = 1; j < points.count(); j += 3) { -- sprintf(buf, "%d %d %d %d %d %d c\n", -- points[j].x(), points[j].y(), -- points[j + 1].x(), points[j + 1].y(), -- points[j + 2].x(), points[j + 2].y() -- ); -- s += buf; -- } -- } else if (elm->type() == FN_ELLIPSE) { -- int x = points[0].x(); -- int y = points[0].y(); -- int ex = points[1].x(); -- int ey = points[1].y(); -- int w = ex - x; -- int h = ey - y; -- int cx = x + w/2; -- int cy = y; -- int x1 = x + 3*w/4; -- int y1 = y; -- int x2 = x + w; -- int y2 = y + h/4; -- int x3 = x + w; -- int y3 = y + h/2; -- -- sprintf(buf, "%d %d m\n%d %d %d %d %d %d c\n", cx, cy, x1, y1, x2, y2, x3, y3); -- s += buf; -- x1 = x + w; -- y1 = y + 3 * h / 4; -- x2 = x + 3 * w / 4; -- y2 = y + h; -- x3 = x + w/2; -- y3 = y + h; -- sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3); -- s += buf; -- -- x1 = x + w / 4; -- y1 = y + h; -- x2 = x; -- y2 = y + 3 * h / 4; -- x3 = x; -- y3 = y + h / 2; -- sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3); -- s += buf; -- x1 = x; -- y1 = y + h / 4; -- x2 = x + w / 4; -- y2 = y; -- x3 = x + w / 2; -- y3 = y; -- sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3); -- s += buf; -- } else { -- sprintf(buf, "%d %d m\n", points[0].x(), points[0].y()); -- s += buf; -- for (uint j = 1; j < points.count(); ++j) { -- sprintf(buf, "%d %d l\n", points[j].x(), points[j].y()); -- s += buf; -- } -- } -- sprintf(buf, "%d w\n", elm->pen().width()); -- s += buf; -- s += "S\n"; -- s += "Q\n"; -- return s; --} -- --bool FNCanvas::exportPDF(const QFileInfo& info) --{ -- if (0 == info.fileName().length()) { -- QMessageBox::warning(0,"FreeNoteQt", "file name is empty."); -- return false; -- } -- if (info.extension(false) != "pdf") { -- QMessageBox::warning(0,"FreeNoteQt", "extension '.pdf' expected."); -- return false; -- } -- -- FILE* fp = NULL; -- if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) { -- QMessageBox::warning(0,"FreeNoteQt", "could not export file."); -- return false; -- } -- -- QPoint o = getTopLeft(); -- rebuild(); -- int wx = 595; -- int wy = 842; -- char buf[1024]; -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- FNPolygon* p = _draws.at(i); -- QRect r = p->boundingRect(); -- r.moveBy(_origin.x(), _origin.y()); -- if (wx < r.right()) { -- wx =r.right(); -- } -- if (wy < r.bottom()) { -- wy = r.bottom(); -- } -- } -- -- int len = 0; -- -- sprintf(buf, "1 0 0 -1 0 %d cm\n", wy); -- QString cm = buf; -- len += cm.length(); -- -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- QString s = mkPDFscript(_draws.at(i)); -- len += s.length(); -- } -- -- QString header = ""; -- header += "%PDF-1.3\n"; -- header += "1 0 obj\n"; -- header += "<<\n"; -- header += "/Type /Page\n"; -- header += "/Parent 3 0 R\n"; -- header += "/Resources\n"; -- header += "<<\n"; -- header += "/ProcSet [ /PDF ]\n"; -- header += ">>\n"; -- sprintf(buf, "/MediaBox [ 0 0 %010d %010d ]\n", wx, wy); -- header += buf; -- header += "/Contents 4 0 R\n"; -- header += ">>\n"; -- header += "endobj\n"; -- header += "2 0 obj\n"; -- header += "<<\n"; -- header += "/Type /Catalog\n"; -- header += "/Pages 3 0 R\n"; -- header += "/PageLayout /OneColumn\n"; -- header += "/OpenAction [1 0 R /XYZ null null 1 ]\n"; -- header += ">>\n"; -- header += "endobj\n"; -- header += "3 0 obj\n"; -- header += "<<\n"; -- header += "/Type /Pages\n"; -- header += "/Kids [ 1 0 R ]\n"; -- header += "/Count 1\n"; -- header += ">>\n"; -- header += "endobj\n"; -- header += "4 0 obj\n"; -- sprintf(buf, "<< /Length %010d >>\n", len); -- header += buf; -- header += "stream\n"; -- -- QString footer = ""; -- footer += "xref\n"; -- footer += "0 5\n"; -- footer += "0000000000 65535 f \n"; -- footer += "0000000009 00000 n \n"; -- footer += "0000000147 00000 n \n"; -- footer += "0000000257 00000 n \n"; -- footer += "0000000316 00000 n \n"; -- footer += "trailer\n"; -- footer += "<<\n"; -- footer += "/Size 5\n"; -- footer += "/Root 2 0 R\n"; -- footer += ">>\n"; -- footer += "startxref\n"; -- -- len = cm.length(); -- len += header.length(); -- fputs(header, fp); -- fputs(cm, fp); -- -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- QString s = mkPDFscript(_draws.at(i)); -- len += s.length(); -- fputs(s, fp); -- } -- QString streamfooter = "endstream\nendobj\n"; -- len += streamfooter.length(); -- fputs(streamfooter, fp); -- -- fputs(footer, fp); -- sprintf(buf, "%d\n", len); -- fputs(buf, fp); -- fputs("%%EOF\n", fp); -- fclose(fp); -- if (_isUseAllQuadrant) { -- setOrigin(-o.x(), -o.y()); -- } -- FNMessageBox::information(0,"FreeNoteQt", "export PDF complete."); -- return true; --} -- --bool FNCanvas::save(const QFileInfo& info) --{ -- if (0 == info.fileName().length()) { -- QMessageBox::warning(0,"FreeNoteQt", "file name is empty."); -- return false; -- } -- if (info.extension(false) != "free") { -- QMessageBox::warning(0,"FreeNoteQt", "extension '.free' expected."); -- return false; -- } -- FILE* fp = NULL; -- if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) { -- QMessageBox::warning(0,"FreeNoteQt", "could not save file."); -- return false; -- } -- QPoint o = getTopLeft(); -- rebuild(); -- fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", fp); -- fputs("<freenote version=\"2.0\">\n", fp); -- char buf[1024]; -- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -- FNPolygon p(*_draws.at(i)); -- p.translate(_origin.x(), _origin.y()); -- if (p.type() == FN_BEZIER) { -- sprintf(buf, "\t<bz color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width()); -- } else if (p.type() == FN_ELLIPSE) { -- sprintf(buf, "\t<el color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width()); -- } else { -- sprintf(buf, "\t<po color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width()); -- } -- fputs(buf, fp); -- QPointArray& points = p.points(); -- for (uint j = 0; j < points.count(); ++j) { -- QPoint point = points.point(j); -- sprintf(buf, "\t\t<p x=\"%d\" y=\"%d\"/>\n", point.x(), point.y()); -- fputs(buf, fp); -- } -- if (p.type() == FN_BEZIER) { -- fputs("\t</bz>\n", fp); -- } else if (p.type() == FN_ELLIPSE) { -- fputs("\t</el>\n", fp); -- } else { -- fputs("\t</po>\n", fp); -- } -- } -- fputs("</freenote>\n", fp); -- fclose(fp); -- if (_isUseAllQuadrant) { -- setOrigin(-o.x(), -o.y()); -- } -- FNMessageBox::information(0, "FreeNoteQt", "save complete."); -- return true; --} -- --bool FNCanvas::load(const QFileInfo& info) --{ -- if (0 == info.fileName().length()) { -- QMessageBox::warning(0,"FreeNoteQt", "file name is empty."); -- return false; -- } -- if (!info.exists()) { -- QMessageBox::warning(0,"FreeNoteQt", "file not exists."); -- return false; -- } -- FILE* fp = NULL; -- if (!(fp = fopen(info.absFilePath().utf8(), "rt"))) { -- QMessageBox::warning(0,"FreeNoteQt", "could not open file."); -- return false; -- } -- clear(); -- -- QString line; -- FNPointList points; -- points.setAutoDelete(true); -- int c; -- int w; -- QPen pen(Qt::black, 1); -- FNPolygon* polygon; -- -- char rdbuf[1024]; -- char buf[1024]; -- QString type = ""; -- while (!feof(fp)) { -- fgets(rdbuf, sizeof(rdbuf), fp); -- line = rdbuf; -- if (-1 != line.find("<fnpolygon ") || -- -1 != line.find("<po ") || -- -1 != line.find("<bz ") || -- -1 != line.find("<el ") -- ) { -- if (-1 != line.find("<el ")) { -- type = "Ellipse"; -- } else if (-1 != line.find("<bz ")) { -- type = "Bezier"; -- } else { -- type = "Polygon"; -- } -- points.clear(); -- int st = line.find("color") + 7; -- int ed = line.find("\"", st); -- strcpy(buf, line.mid(st, ed - st).utf8()); -- sscanf(buf, "%x", &c); -- st = line.find("width") + 7; -- ed = line.find("\"", st); -- strcpy(buf, line.mid(st, ed - st).utf8()); -- sscanf(buf, "%d", &w); -- } else if (-1 != line.find("<point ") || -- -1 != line.find("<p ") -- ) { -- int st = line.find("x=") + 3; -- int ed = line.find("\"", st); -- strcpy(buf, line.mid(st, ed - st).utf8()); -- int x; -- sscanf(buf, "%d", &x); -- -- st = line.find("y=") + 3; -- ed = line.find("\"", st); -- strcpy(buf, line.mid(st, ed - st).utf8()); -- int y; -- sscanf(buf, "%d", &y); -- points.append(createPts(x, y)); //バグ対策 -- } else if (-1 != line.find("</fnpolygon") || -- -1 != line.find("</bz") || -- -1 != line.find("</el") || -- -1 != line.find("</po")) { -- pen.setColor((QRgb)c); -- pen.setWidth(w); -- if (type == "Bezier") { -- _draws.append(polygon = createBezier(pen)); //バグ対策 -- } else if (type == "Ellipse") { -- _draws.append(polygon = createEllipse(pen)); //バグ対策 -- } else { -- _draws.append(polygon = createPolygon(pen)); //バグ対策 -- } -- polygon->setPoints(points); -- points.clear(); -- } -- } -- fclose(fp); -- int x = 0; -- int y = 0; -- for (uint i = 0; i < _draws.count(); ++i) { -- if (y > _draws.at(i)->boundingRect().top()) { -- y = _draws.at(i)->boundingRect().top(); -- } -- if (x > _draws.at(i)->boundingRect().left()) { -- x = _draws.at(i)->boundingRect().left(); -- } -- } -- for (uint i = 0; i < _draws.count(); ++i) { -- _draws.at(i)->translate(-x, -y); -- } -- redraw(); -- FNMessageBox::information(0,"FreeNoteQt", "load complete."); -- -- return true; --} -- --FNPolygon* FNCanvas::createPolygon(QPen& pen) --{ -- return new FNPolygon(pen); --} -- --FNPolygon* FNCanvas::createBezier(QPen& pen) --{ -- return new FNBezier(pen); --} -- -- --FNPolygon* FNCanvas::createEllipse(QPen& pen) --{ -- return new FNEllipse(pen); --} -- --QPoint* FNCanvas::createPts(int x, int y) --{ -- return new QPoint(x, y); --} -- --void FNCanvas::setGuide(bool f) --{ -- _isShowGuide = f; -- redraw(); --} -+/* FreeNote for Sharp SLA300, B500, C7x0 Linux PDA -+ Copyright (C) 2003 Joe Kanemori.<kanemori@ymg.urban.ne.jp> -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+*/ -+/* -+2003/12/23 ver 1.6.1 -+・保存情報のサイズ縮小 -+ -+2003/12/16-19 ver 1.5.5pre -+・ペンサイズの追加(1-8) -+・アンドゥ・リドゥの実装 -+ -+2003/12/14 ver 1.5.4pre -+・ペンサイズを選択可能に。 -+ -+2003/12/05 ver 1.5.3Apre -+・グリッドの色を修正 -+ -+2003/12/04 ver 1.5.3pre -+・グリッドの描画を一部修正 -+ -+2003/11/10 ver 1.5.1pre -+・曲線整形モード追加 -+ -+2003/11/09 ver 1.5.0pre -+・自動整形モード追加 -+ -+2003/09/03 ver 1.3.4pre -+・Use all quadrant OFF時に表示位置がリセットされる場合があるバグ対応。 -+ -+2003/09/01-03 ver 1.3.3pre -+・スクロールの改良 -+・Use all quadrant(全象限を使用する)メニューを追加 -+ -+2003/08/31 FreeNote 1.3.2pre -+・全方向スクロール -+ -+2003/08/23 FreeNote 1.3.0pre -+・CR動作の修正 -+ -+2003/08/15 FreeNote 1.2.1を公開 -+・保存時のバグ修正 -+・完了ダイアログの自動消去 -+・PNGファイルへの出力 -+ -+2003/08/15 FreeNote 1.2を公開 -+・オプション追加 -+・スクロールガイド -+・Freeファイル関連付け -+・アイコンの変更 -+ -+2003/08/05 FreeNote 1.1.1preを公開 -+・高速起動時に閉じた状態を保持 -+・描画モード切替え時に消しゴム表示 -+・保存時間短縮 -+・Viewモードの挙動を変更 -+・メニューの見た目を変更 -+*/ -+#include "fncanvas.h" -+#include <stdio.h> -+#include <qfile.h> -+#include <qmessagebox.h> -+#include <qtextstream.h> -+#include <qpen.h> -+#include <qcolor.h> -+#include <qpoint.h> -+#include <qthread.h> -+#include <qimage.h> -+#include <math.h> -+#include <stdlib.h> // abs -+#include "fnmessagebox.h" -+#include "fmtengine.h" -+ -+int snap(int v) { -+ int tv = abs(v); -+ tv = ((int)(tv + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE; -+ if (0 > v) { -+ return -tv; -+ } else { -+ return tv; -+ } -+} -+ -+FNCanvas::FNCanvas(QWidget* parent, const char* name, WFlags f ) -+ :QWidget(parent, name, f), -+ _pen(black, 1, SolidLine, RoundCap, RoundJoin), -+ _asMode(AS_NONE), -+ _drawMode(MODE_DRAW), -+ _disp_offset(0), -+ _eraser_l(50), -+ _eraser_s(10), -+ _h_step(100), -+ _v_step(100), -+ _margin(5), -+ _scrollTiming(800), -+ _viewMode(false), -+ _isWaiting(false), -+ _isDragging(false), -+ _isHeadingEnables(false), -+ _isShowGuide(false), -+ _isUseAllQuadrant(false), -+ _scale_x(1.0), -+ _scale_y(1.0) -+{ -+ _tracks.setAutoDelete(true); -+ this->setBackgroundMode(NoBackground); -+ _timer = new QTimer(this); -+ connect(_timer, SIGNAL(timeout()), this, SLOT(autoScroll())); -+} -+ -+FNCanvas::~FNCanvas() -+{ -+ _timer->stop(); -+ delete _timer; -+ -+ _tracks.clear(); -+ clearList(_draws); -+} -+ -+void FNCanvas::setScrollTiming(int v) -+{ -+ _scrollTiming = v; -+} -+ -+ -+void FNCanvas::setVStep(int v) -+{ -+ _v_step = v; -+} -+ -+void FNCanvas::setHStep(int v) -+{ -+ _h_step = v; -+} -+ -+void FNCanvas::setSEraser(int v) -+{ -+ _eraser_s = v; -+} -+ -+void FNCanvas::setLEraser(int v) -+{ -+ _eraser_l = v; -+} -+ -+ -+void FNCanvas::setMargin(int v) -+{ -+ if (v < 3) { -+ v = 3; -+ } -+ _margin = v; -+} -+ -+void FNCanvas::setScrollMode(int as) -+{ -+ _asMode = as; -+ redraw(); -+} -+ -+void FNCanvas::autoScroll() -+{ -+ if (AS_NONE == _asMode) { -+ if (MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode || MODE_SMOOTH == _drawMode) { -+ setOrigin(_origin.x(), _origin.y()); -+ } -+ return; -+ } -+ bool tmp = _isHeadingEnables; -+ int dx = 0; -+ int dy = 0; -+ if (AS_BOTH == _asMode || AS_HORIZONTAL == _asMode) { -+ if (_last.x() > width() * (_margin - 1) / _margin) { -+ dx = _h_step; -+ } else if (_last.x() < width() / _margin) { -+ dx = -_h_step; -+ } -+ } -+ if (AS_BOTH == _asMode || AS_VERTICAL == _asMode) { -+ if (_last.y() > height() * (_margin - 1) / _margin) { -+ dy = _v_step; -+ } else if (_last.y() < height() / _margin) { -+ dy = -_v_step; -+ } -+ } -+ setOrigin(_origin.x() + dx, _origin.y() + dy); -+ _isHeadingEnables = tmp; -+} -+ -+void FNCanvas::mousePressEvent(QMouseEvent* evt) -+{ -+ setFocus(); -+ _timer->stop(); -+ _tracks.clear(); -+ if (_viewMode) { -+ _isWaiting = true; -+ _viewMode = false; -+ setOrigin((int)((evt->x()) / _scale_x) - width() / 2, (int)((evt->y()) / _scale_y) - height() / 2); -+ redraw(); -+ emit resetViewMode(); -+ } else if (MODE_ERASE != _drawMode) { -+ _last = evt->pos(); -+ _tracks.append(new QPoint(_last)); -+ } else { -+ redraw(); -+ _last = evt->pos(); -+ _tracks.append(new QPoint(_last)); -+ -+ QPainter pbuf; -+ QPainter pwin; -+ pbuf.begin(&_buffer); -+ pwin.begin(this); -+ -+ int w = _eraser_s; -+ if (PENWIDTH_MAX / 2 < _pen.width()) { -+ w = _eraser_l; -+ } -+ pbuf.setRasterOp(XorROP); -+ pbuf.setPen(QPen(white, 1)); -+ pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -+ -+ pwin.setRasterOp(XorROP); -+ pwin.setPen(QPen(white, 1)); -+ pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -+ -+ pbuf.end(); -+ pwin.end(); -+ } -+ _isDragging = true; -+} -+ -+void FNCanvas::mouseMoveEvent(QMouseEvent* evt) -+{ -+ if (_isWaiting) { -+ return; -+ } -+ if (MODE_ERASE != _drawMode) { -+ QPainter pwin; -+ QPainter pbuf; -+ -+ pwin.begin(this); -+ pbuf.begin(&_buffer); -+ -+ pwin.setPen(_pen); -+ pbuf.setPen(_pen); -+ -+ pwin.drawLine(_last, evt->pos()); -+ pbuf.drawLine(_last, evt->pos()); -+ -+ pwin.end(); -+ pbuf.end(); -+ _last = evt->pos(); -+ _tracks.append(new QPoint(_last)); -+ } else { -+ //redraw(); -+ if (_last.x() == -1) { -+ return; -+ } -+ QPainter pbuf; -+ QPainter pwin; -+ -+ pbuf.begin(&_buffer); -+ pwin.begin(this); -+ -+ int w = _eraser_s; -+ if (PENWIDTH_MAX / 2 < _pen.width()) { -+ w = _eraser_l; -+ } -+ pbuf.setRasterOp(XorROP); -+ pwin.setRasterOp(XorROP); -+ pbuf.setPen(QPen(white, 1)); -+ pwin.setPen(QPen(white, 1)); -+ pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -+ pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -+ -+ _tracks.append(new QPoint(evt->pos())); -+ _last = evt->pos(); -+ -+ pbuf.setRasterOp(CopyROP); -+ pwin.setRasterOp(CopyROP); -+ QRect r = QRect(0, 0, width(), height()); -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ FNPolygon* p = _draws.at(i); -+ if (r.intersects(p->boundingRect())) { -+ bool f = false; -+ QRect selected(_last.x() - w / 2, _last.y() - w / 2, w, w); -+ for (uint j = 0; j < p->points().count(); ++j) { -+ QPoint& pts = p->points().at(j); -+ if (selected.contains(pts)) { -+ f = true; -+ break; -+ } -+ } -+ if (f) { -+ p->drawShape(pbuf, f); -+ p->drawShape(pwin, f); -+ } -+ } -+ } -+ pbuf.setRasterOp(XorROP); -+ pwin.setRasterOp(XorROP); -+ pbuf.setPen(QPen(white, 1)); -+ pwin.setPen(QPen(white, 1)); -+ pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -+ pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -+ pbuf.end(); -+ pwin.end(); -+ } -+} -+ -+void FNCanvas::mouseReleaseEvent(QMouseEvent* evt) -+{ -+ _isDragging = false; -+ if (_isWaiting) { -+ _isWaiting = false; -+ return; -+ } -+ _last = evt->pos(); -+ if (MODE_ERASE != _drawMode) { -+ if (1 < _tracks.count()) { -+ FNPolygon* p = NULL; -+ if (MODE_FORMAT == _drawMode) { -+ p = new FNPolygon(_pen); -+ _tracks = AutoFormat(_tracks); -+ } else if (MODE_CURVE == _drawMode) { -+ QPoint sp = SnapPoint(*_tracks.at(0)); -+ QPoint ep = SnapPoint(*_tracks.at(_tracks.count()-1)); -+ _tracks = AutoCurve(_tracks); -+ if (sp == ep) { -+ p = new FNEllipse(_pen); -+ } else if (2 < _tracks.count()) { -+ p = new FNBezier(_pen); -+ } else { -+ p = new FNPolygon(_pen); -+ } -+ } else if (MODE_SMOOTH == _drawMode) { -+ _tracks = Smoothing(_tracks); -+ if (2 < _tracks.count()) { -+ p = new FNBezier(_pen); -+ } else { -+ p = new FNPolygon(_pen); -+ } -+ } else { -+ _tracks = Reduce(_tracks); -+ p = new FNPolygon(_pen); -+ } -+ if (1 < _tracks.count()) { -+ p->setPoints(_tracks); -+ redobuf_flush(); -+ _draws.append(p); -+ } -+ } -+ _tracks.clear(); -+ _isHeadingEnables = true; -+ _timer->start(_scrollTiming, true); -+ } else { -+ _last = QPoint(-1, -1); -+ _tracks.append(new QPoint(evt->pos())); -+ redraw(); -+ } -+} -+ -+void FNCanvas::paintEvent(QPaintEvent* evt) -+{ -+ bitBlt(this, 0, 0, &_buffer); -+} -+ -+void FNCanvas::resizeEvent(QResizeEvent* evt) -+{ -+ QPixmap save(_buffer); -+ _buffer.resize(evt->size()); -+ _buffer.fill(white); -+ bitBlt(&_buffer, 0, 0, &save); -+ redraw(); -+} -+ -+void FNCanvas::setOrigin(QPoint& o) -+{ -+ this->setOrigin(o.x(), o.y()); -+} -+ -+QPoint FNCanvas::getTopLeft() -+{ -+ if (0 == _draws.count() || !_isUseAllQuadrant) { -+ return _origin; -+ } -+ -+ int dx = ((FNPolygon*)_draws.at(0))->boundingRect().x(); -+ int dy = ((FNPolygon*)_draws.at(0))->boundingRect().y(); -+ for (uint i = 1; i < _draws.count(); ++i) { -+ FNPolygon* p = _draws.at(i); -+ if (dx > p->boundingRect().x()) { -+ dx = p->boundingRect().x(); -+ } -+ if (dy > p->boundingRect().y()) { -+ dy = p->boundingRect().y(); -+ } -+ } -+ return QPoint(snap(dx), snap(dy)); -+} -+ -+ -+void FNCanvas::rebuild() -+{ -+ if (0 == _draws.count() || !_isUseAllQuadrant) { -+ return; -+ } -+ -+ QPoint d = getTopLeft(); -+ for (uint i = 0; i < _draws.count(); ++i) { -+ FNPolygon* p = _draws.at(i); -+ p->translate(-d.x(), -d.y()); -+ } -+ -+ _origin = QPoint(0, 0); -+} -+ -+ -+void FNCanvas::setOrigin(int ox, int oy) -+{ -+ ox = snap(ox); -+ oy = snap(oy); -+ _isHeadingEnables = false; -+ _timer->stop(); -+ -+ -+ int dx = 0; -+ int dy = 0; -+ if (!_isUseAllQuadrant) { -+ if (0 > ox) { -+ ox = 0; -+ } -+ if (0 > oy) { -+ oy = 0; -+ } -+ dx = _origin.x() - ox; -+ dy = _origin.y() - oy; -+ } else { -+ dx = _origin.x() - ox; -+ dy = _origin.y() - oy; -+ if (0 > ox) { -+ ox = 0; -+ } -+ if (0 > oy) { -+ oy = 0; -+ } -+ } -+ for (uint i = 0; i < _tracks.count(); ++i) { -+ QPoint* p = _tracks.at(i); -+ p->setX(p->x() + dx); -+ p->setY(p->y() + dy); -+ } -+ -+ for (uint i = 0; i < _draws.count(); ++i) { -+ FNPolygon* p = _draws.at(i); -+ p->translate(dx, dy); -+ } -+ _origin = QPoint(ox, oy); -+ emit originChanged(ox, oy); -+ redraw(); -+} -+ -+void FNCanvas::redraw() -+{ -+ if (!this->isVisible()) { -+ return; -+ } -+ _buffer.fill(white); -+ QPainter pbuf; -+ QRect r = QRect(0, 0, width(), height()); -+ pbuf.begin(&_buffer); -+ if (_viewMode) { -+ float wx = 0; -+ float wy = 0; -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ FNPolygon* p = _draws.at(i); -+ QRect r = p->boundingRect(); -+ if (wx < r.right()) { -+ wx = r.right(); -+ } -+ if (wy < r.bottom()) { -+ wy = r.bottom(); -+ } -+ } -+ wx += SNAP_SIZE; -+ wy += SNAP_SIZE; -+ wx = snap((int)wx); -+ wy = snap((int)wy); -+ wx = wx + _origin.x(); -+ wy = wy + _origin.y(); -+ _scale_x = (float)width() / wx; -+ _scale_y = (float)height() / wy; -+ if (1.0f < _scale_x) { -+ _scale_x = 1.0f; -+ } -+ if (1.0f < _scale_y) { -+ _scale_y = 1.0f; -+ } -+ if (_scale_x > _scale_y) { -+ _scale_x = _scale_y; -+ } else if (_scale_x < _scale_y) { -+ _scale_y = _scale_x; -+ } -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ FNPolygon* p = _draws.at(i); -+ FNPolygon* t = NULL; -+ if (p->type() == FN_BEZIER) { -+ t = new FNBezier(*(FNBezier*)p); -+ } else if (p->type() == FN_ELLIPSE) { -+ t = new FNEllipse(*(FNEllipse*)p); -+ } else { -+ t = new FNPolygon(*p); -+ } -+ t->translate(-_origin.x(), -_origin.y()); -+ for (uint j = 0; j < t->points().count(); ++j) { -+ QPoint& pts = t->points().at(j); -+ int x = (int)(pts.x() * _scale_x); -+ int y = (int)(pts.y() * _scale_y); -+ pts.setX(x); -+ pts.setY(y); -+ } -+ double pensize = t->pen().width(); -+ if (_scale_x > _scale_y) { -+ pensize = pensize * _scale_y; -+ } else { -+ pensize = pensize * _scale_x; -+ } -+ if (0 >= pensize) { -+ pensize = 1; -+ } -+ t->pen().setWidth(pensize); -+ t->drawShape(pbuf); -+ delete t; -+ } -+ } else if (MODE_ERASE != _drawMode) { -+ if (MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode) { -+ QPen pen1(QColor(0, 240, 240), 1); -+ QPen pen2(QColor(0, 0, 0), 1); -+ pbuf.setPen(QPen(QColor(0, 240, 240), 1)); -+ pbuf.setPen(pen1); -+ for (int x = 0; x < width() + SNAP_SIZE; x += SNAP_SIZE) { -+ pbuf.drawLine(x - SNAP_SIZE / 2, 0, x - SNAP_SIZE / 2, height()); -+ for (int y = 0; y < height() + SNAP_SIZE; y += SNAP_SIZE) { -+ pbuf.drawLine(0, y - SNAP_SIZE / 2, width(), y - SNAP_SIZE / 2); -+ pbuf.drawRect(x-1,y-1,2,2); -+ } -+ } -+ } -+ if (_isShowGuide) { -+ pbuf.setPen(QPen(cyan, 1, DashLine)); -+ if (AS_HORIZONTAL == _asMode || AS_BOTH == _asMode) { -+ if (0 != _origin.x() || _isUseAllQuadrant) { -+ pbuf.drawLine(width() / _margin, 0, width() / _margin, height()); -+ } -+ pbuf.drawLine(width() * (_margin - 1) / _margin, 0, width() * (_margin - 1) / _margin, height()); -+ } -+ -+ if (AS_VERTICAL == _asMode || AS_BOTH == _asMode) { -+ if (0 != _origin.y() || _isUseAllQuadrant) { -+ pbuf.drawLine(0, height() / _margin, width(), height() / _margin); -+ } -+ pbuf.drawLine(0, height() * (_margin - 1) / _margin, width(), height() * (_margin - 1) / _margin); -+ } -+ } -+ -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ FNPolygon* p = _draws.at(i); -+ if (r.intersects(p->boundingRect())) { -+ p->drawShape(pbuf); -+ } -+ } -+ } else { -+ int w = _eraser_s; -+ if (PENWIDTH_MAX / 2 < _pen.width()) { -+ w = _eraser_l; -+ } -+ FNPointList removes; -+ for (uint i = 0; i < _tracks.count(); ++i) { -+ removes.append(_tracks.at(i)); -+ } -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ FNPolygon* p = _draws.at(i); -+ if (r.intersects(p->boundingRect())) { -+ bool f = false; -+ for (uint j = 0; j < _tracks.count(); ++j) { -+ QPoint* pts = _tracks.at(j); -+ QRect selected(pts->x() - w / 2, pts->y() - w / 2, w, w); -+ for (uint k = 0; k < p->points().count(); ++k) { -+ QPoint& pts2 = p->points().at(k); -+ if (selected.contains(pts2)) { -+ f = true; -+ removes.remove(pts); -+ break; -+ } -+ } -+ if (f) { -+ break; -+ } -+ } -+ p->drawShape(pbuf, f); -+ } -+ } -+ for (uint i = 0; i < removes.count(); ++i) { -+ _tracks.remove(removes.at(i)); -+ } -+ /* -+ if (_isDragging) { -+ pbuf.setPen(QPen(black, 1)); -+ pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w); -+ } -+ */ -+ } -+ pbuf.end(); -+ repaint(); -+} -+ -+void FNCanvas::changeColor(QRgb c) -+{ -+ _pen.setColor(QColor(c)); -+} -+ -+void FNCanvas::undo() -+{ -+ if (MODE_ERASE != _drawMode) { -+ ++_disp_offset; -+ if (_disp_offset > _draws.count()) { -+ _disp_offset = _draws.count(); -+ } -+ } else { -+ _draws = _undobuf; -+ _marks.clear(); -+ } -+ redraw(); -+} -+ -+void FNCanvas::redo() -+{ -+ if (MODE_ERASE != _drawMode) { -+ if (0 < _disp_offset) { -+ --_disp_offset; -+ } -+ } -+ redraw(); -+} -+ -+void FNCanvas::clearList(FNPolygonList& list) -+{ -+ list.setAutoDelete(true); -+ list.clear(); -+ list.setAutoDelete(false); -+} -+ -+void FNCanvas::clear() -+{ -+ _disp_offset = 0; -+ clearList(_draws); -+ _undobuf.clear(); -+ setOrigin(0, 0); -+ redraw(); -+} -+ -+void FNCanvas::viewChanged(bool flg) -+{ -+ _tracks.clear(); -+ _viewMode = flg; -+ if (_viewMode) { -+ if (_isUseAllQuadrant) { -+ rebuild(); -+ } -+ setOrigin(0, 0); -+ } -+ redraw(); -+} -+ -+void FNCanvas::redobuf_flush() -+{ -+ for (uint i = 0; i < _disp_offset; ++i) { -+ FNPolygon* p = _draws.last(); -+ _draws.remove(p); -+ delete p; -+ } -+ _disp_offset = 0; -+} -+ -+void FNCanvas::modeChanged(int mode) -+{ -+ _tracks.clear(); -+ _drawMode = mode; -+ redobuf_flush(); -+ if (MODE_ERASE == _drawMode) { -+ _marks.clear(); -+ _undobuf = _draws; -+ } else { -+ if (_draws.count() != _undobuf.count()) { -+ for (uint i = 0; i < _marks.count(); ++i) { -+ FNPolygon* p = _marks.at(i); -+ _draws.remove(p); -+ } -+ clearList(_marks); -+ } -+ } -+ redraw(); -+} -+ -+QRect FNCanvas::getMatrix(const QRect& r) const -+{ -+ int ox = _origin.x(); -+ int oy = _origin.y(); -+ const int wide = 100; -+ -+ int left = r.left() + ox; -+ int top = r.top() + oy; -+ int right = r.right() + ox; -+ int bottom = r.bottom() + oy; -+ -+ left = (int)(left / wide) * wide; -+ top = (int)(top / wide) * wide; -+ right = (right % wide == 0 && left != right) ? right : (int)((right + wide) / wide) * wide; -+ bottom = (bottom % wide == 0 && top != bottom) ? bottom : (int)((bottom + wide) / wide) * wide; -+ -+ return QRect(left - ox, top - oy, right - left, bottom - top); -+} -+ -+void FNCanvas::CR() -+{ -+ if (MODE_ERASE == _drawMode) { -+ return; -+ } -+ if (_isHeadingEnables) { -+ //lastから、左方向に向けて探索する。 -+ QRect r = getMatrix(_draws.last()->boundingRect()); -+ bool isSearching = true; -+ r.moveBy(-100, 0); -+ while (isSearching) { -+ isSearching = false; -+ for (uint i = 0; i < _draws.count(); ++i) { -+ FNPolygon* p = _draws.at(i); -+ const QRect& r2 = p->boundingRect(); -+ if (r.intersects(r2)) { -+ if (r.left() + 100 > r2.left()) { -+ r = getMatrix(r2); -+ r.moveBy(-100, 0); -+ isSearching = true; -+ break; -+ } -+ } -+ } -+ } -+ r.moveBy(100, 0); -+ //lastが画面の4/5以下ならば、スクロールアップする。 -+ //そうでなければ、ヘッディングのみ。 -+ if (_last.y() > height() * 4 / 5) { -+ setOrigin(_origin.x() + r.x(), _origin.y() + 50); -+ } else { -+ setOrigin(_origin.x() + r.x(), _origin.y()); -+ } -+ _isHeadingEnables = false; -+ } else { -+ //lastの周囲に何も無い場合は、縦にスクロールする。 -+ setOrigin(_origin.x(), _origin.y() + 50); -+ } -+} -+ -+void FNCanvas::erase() -+{ -+ if (MODE_ERASE != _drawMode) { -+ return; -+ } -+ FNPolygonList temp; -+ int w = _eraser_s; -+ if (PENWIDTH_MAX / 2 < _pen.width()) { -+ w = _eraser_l; -+ } -+ QRect r = QRect(0, 0, width(), height()); -+ for (uint i = 0; i < _draws.count(); ++i) { -+ FNPolygon* p = _draws.at(i); -+ bool f = false; -+ if (r.intersects(p->boundingRect())) { -+ for (uint j = 0; j < _tracks.count(); ++j) { -+ QPoint* pts = _tracks.at(j); -+ QRect selected(pts->x() - w / 2, pts->y() - w / 2, w, w); -+ for (uint k = 0; k < p->points().count(); ++k) { -+ QPoint& pts2 = p->points().at(k); -+ if (selected.contains(pts2)) { -+ temp.append(p); -+ f = true; -+ break; -+ } -+ } -+ if (f) { -+ break; -+ } -+ } -+ } -+ } -+ for (uint i = 0; i < temp.count(); ++i) { -+ _draws.remove(temp.at(i)); -+ _marks.append(temp.at(i)); -+ } -+ _tracks.clear(); -+ redraw(); -+} -+ -+void FNCanvas::setPensize(int sz) -+{ -+ _pen.setWidth(sz); -+} -+ -+bool FNCanvas::exportPNG(const QFileInfo& info, QPixmap& buf) -+{ -+ if (0 == info.fileName().length()) { -+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty."); -+ return false; -+ } -+ if (info.extension(false) != "png") { -+ QMessageBox::warning(0,"FreeNoteQt", "extension '.png' expected."); -+ return false; -+ } -+ -+ bool ret = buf.save(info.absFilePath(), "PNG"); -+ if (ret) { -+ FNMessageBox::information(0,"FreeNoteQt", "export PNG complete."); -+ } else { -+ QMessageBox::warning(0,"FreeNoteQt", "could not export file."); -+ } -+ return ret; -+} -+ -+QString FNCanvas::mkPDFscript(FNPolygon* elm) -+{ -+ QString s =""; -+ char buf[1024]; -+ -+ float r = (float)elm->pen().color().red() / 255.0f; -+ float g = (float)elm->pen().color().green() / 255.0f; -+ float b = (float)elm->pen().color().blue() / 255.0f; -+ s += "q\n"; -+ sprintf(buf, "%f %f %f RG\n", r, g, b); -+ s += buf; -+ QPointArray points = elm->points().copy(); -+ points.translate(_origin.x(), _origin.y()); -+ if (elm->type() == FN_BEZIER) { -+ sprintf(buf, "%d %d m\n", points[0].x(), points[0].y()); -+ s += buf; -+ for (uint j = 1; j < points.count(); j += 3) { -+ sprintf(buf, "%d %d %d %d %d %d c\n", -+ points[j].x(), points[j].y(), -+ points[j + 1].x(), points[j + 1].y(), -+ points[j + 2].x(), points[j + 2].y() -+ ); -+ s += buf; -+ } -+ } else if (elm->type() == FN_ELLIPSE) { -+ int x = points[0].x(); -+ int y = points[0].y(); -+ int ex = points[1].x(); -+ int ey = points[1].y(); -+ int w = ex - x; -+ int h = ey - y; -+ int cx = x + w/2; -+ int cy = y; -+ int x1 = x + 3*w/4; -+ int y1 = y; -+ int x2 = x + w; -+ int y2 = y + h/4; -+ int x3 = x + w; -+ int y3 = y + h/2; -+ -+ sprintf(buf, "%d %d m\n%d %d %d %d %d %d c\n", cx, cy, x1, y1, x2, y2, x3, y3); -+ s += buf; -+ x1 = x + w; -+ y1 = y + 3 * h / 4; -+ x2 = x + 3 * w / 4; -+ y2 = y + h; -+ x3 = x + w/2; -+ y3 = y + h; -+ sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3); -+ s += buf; -+ -+ x1 = x + w / 4; -+ y1 = y + h; -+ x2 = x; -+ y2 = y + 3 * h / 4; -+ x3 = x; -+ y3 = y + h / 2; -+ sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3); -+ s += buf; -+ x1 = x; -+ y1 = y + h / 4; -+ x2 = x + w / 4; -+ y2 = y; -+ x3 = x + w / 2; -+ y3 = y; -+ sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3); -+ s += buf; -+ } else { -+ sprintf(buf, "%d %d m\n", points[0].x(), points[0].y()); -+ s += buf; -+ for (uint j = 1; j < points.count(); ++j) { -+ sprintf(buf, "%d %d l\n", points[j].x(), points[j].y()); -+ s += buf; -+ } -+ } -+ sprintf(buf, "%d w\n", elm->pen().width()); -+ s += buf; -+ s += "S\n"; -+ s += "Q\n"; -+ return s; -+} -+ -+bool FNCanvas::exportPDF(const QFileInfo& info) -+{ -+ if (0 == info.fileName().length()) { -+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty."); -+ return false; -+ } -+ if (info.extension(false) != "pdf") { -+ QMessageBox::warning(0,"FreeNoteQt", "extension '.pdf' expected."); -+ return false; -+ } -+ -+ FILE* fp = NULL; -+ if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) { -+ QMessageBox::warning(0,"FreeNoteQt", "could not export file."); -+ return false; -+ } -+ -+ QPoint o = getTopLeft(); -+ rebuild(); -+ int wx = 595; -+ int wy = 842; -+ char buf[1024]; -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ FNPolygon* p = _draws.at(i); -+ QRect r = p->boundingRect(); -+ r.moveBy(_origin.x(), _origin.y()); -+ if (wx < r.right()) { -+ wx =r.right(); -+ } -+ if (wy < r.bottom()) { -+ wy = r.bottom(); -+ } -+ } -+ -+ int len = 0; -+ -+ sprintf(buf, "1 0 0 -1 0 %d cm\n", wy); -+ QString cm = buf; -+ len += cm.length(); -+ -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ QString s = mkPDFscript(_draws.at(i)); -+ len += s.length(); -+ } -+ -+ QString header = ""; -+ header += "%PDF-1.3\n"; -+ header += "1 0 obj\n"; -+ header += "<<\n"; -+ header += "/Type /Page\n"; -+ header += "/Parent 3 0 R\n"; -+ header += "/Resources\n"; -+ header += "<<\n"; -+ header += "/ProcSet [ /PDF ]\n"; -+ header += ">>\n"; -+ sprintf(buf, "/MediaBox [ 0 0 %010d %010d ]\n", wx, wy); -+ header += buf; -+ header += "/Contents 4 0 R\n"; -+ header += ">>\n"; -+ header += "endobj\n"; -+ header += "2 0 obj\n"; -+ header += "<<\n"; -+ header += "/Type /Catalog\n"; -+ header += "/Pages 3 0 R\n"; -+ header += "/PageLayout /OneColumn\n"; -+ header += "/OpenAction [1 0 R /XYZ null null 1 ]\n"; -+ header += ">>\n"; -+ header += "endobj\n"; -+ header += "3 0 obj\n"; -+ header += "<<\n"; -+ header += "/Type /Pages\n"; -+ header += "/Kids [ 1 0 R ]\n"; -+ header += "/Count 1\n"; -+ header += ">>\n"; -+ header += "endobj\n"; -+ header += "4 0 obj\n"; -+ sprintf(buf, "<< /Length %010d >>\n", len); -+ header += buf; -+ header += "stream\n"; -+ -+ QString footer = ""; -+ footer += "xref\n"; -+ footer += "0 5\n"; -+ footer += "0000000000 65535 f \n"; -+ footer += "0000000009 00000 n \n"; -+ footer += "0000000147 00000 n \n"; -+ footer += "0000000257 00000 n \n"; -+ footer += "0000000316 00000 n \n"; -+ footer += "trailer\n"; -+ footer += "<<\n"; -+ footer += "/Size 5\n"; -+ footer += "/Root 2 0 R\n"; -+ footer += ">>\n"; -+ footer += "startxref\n"; -+ -+ len = cm.length(); -+ len += header.length(); -+ fputs(header, fp); -+ fputs(cm, fp); -+ -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ QString s = mkPDFscript(_draws.at(i)); -+ len += s.length(); -+ fputs(s, fp); -+ } -+ QString streamfooter = "endstream\nendobj\n"; -+ len += streamfooter.length(); -+ fputs(streamfooter, fp); -+ -+ fputs(footer, fp); -+ sprintf(buf, "%d\n", len); -+ fputs(buf, fp); -+ fputs("%%EOF\n", fp); -+ fclose(fp); -+ if (_isUseAllQuadrant) { -+ setOrigin(-o.x(), -o.y()); -+ } -+ FNMessageBox::information(0,"FreeNoteQt", "export PDF complete."); -+ return true; -+} -+ -+bool FNCanvas::save(const QFileInfo& info) -+{ -+ if (0 == info.fileName().length()) { -+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty."); -+ return false; -+ } -+ if (info.extension(false) != "free") { -+ QMessageBox::warning(0,"FreeNoteQt", "extension '.free' expected."); -+ return false; -+ } -+ FILE* fp = NULL; -+ if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) { -+ QMessageBox::warning(0,"FreeNoteQt", "could not save file."); -+ return false; -+ } -+ QPoint o = getTopLeft(); -+ rebuild(); -+ fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", fp); -+ fputs("<freenote version=\"2.0\">\n", fp); -+ char buf[1024]; -+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) { -+ FNPolygon p(*_draws.at(i)); -+ p.translate(_origin.x(), _origin.y()); -+ if (p.type() == FN_BEZIER) { -+ sprintf(buf, "\t<bz color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width()); -+ } else if (p.type() == FN_ELLIPSE) { -+ sprintf(buf, "\t<el color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width()); -+ } else { -+ sprintf(buf, "\t<po color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width()); -+ } -+ fputs(buf, fp); -+ QPointArray& points = p.points(); -+ for (uint j = 0; j < points.count(); ++j) { -+ QPoint point = points.point(j); -+ sprintf(buf, "\t\t<p x=\"%d\" y=\"%d\"/>\n", point.x(), point.y()); -+ fputs(buf, fp); -+ } -+ if (p.type() == FN_BEZIER) { -+ fputs("\t</bz>\n", fp); -+ } else if (p.type() == FN_ELLIPSE) { -+ fputs("\t</el>\n", fp); -+ } else { -+ fputs("\t</po>\n", fp); -+ } -+ } -+ fputs("</freenote>\n", fp); -+ fclose(fp); -+ if (_isUseAllQuadrant) { -+ setOrigin(-o.x(), -o.y()); -+ } -+ FNMessageBox::information(0, "FreeNoteQt", "save complete."); -+ return true; -+} -+ -+bool FNCanvas::load(const QFileInfo& info) -+{ -+ if (0 == info.fileName().length()) { -+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty."); -+ return false; -+ } -+ if (!info.exists()) { -+ QMessageBox::warning(0,"FreeNoteQt", "file not exists."); -+ return false; -+ } -+ FILE* fp = NULL; -+ if (!(fp = fopen(info.absFilePath().utf8(), "rt"))) { -+ QMessageBox::warning(0,"FreeNoteQt", "could not open file."); -+ return false; -+ } -+ clear(); -+ -+ QString line; -+ FNPointList points; -+ points.setAutoDelete(true); -+ int c; -+ int w; -+ QPen pen(Qt::black, 1); -+ FNPolygon* polygon; -+ -+ char rdbuf[1024]; -+ char buf[1024]; -+ QString type = ""; -+ while (!feof(fp)) { -+ fgets(rdbuf, sizeof(rdbuf), fp); -+ line = rdbuf; -+ if (-1 != line.find("<fnpolygon ") || -+ -1 != line.find("<po ") || -+ -1 != line.find("<bz ") || -+ -1 != line.find("<el ") -+ ) { -+ if (-1 != line.find("<el ")) { -+ type = "Ellipse"; -+ } else if (-1 != line.find("<bz ")) { -+ type = "Bezier"; -+ } else { -+ type = "Polygon"; -+ } -+ points.clear(); -+ int st = line.find("color") + 7; -+ int ed = line.find("\"", st); -+ strcpy(buf, line.mid(st, ed - st).utf8()); -+ sscanf(buf, "%x", &c); -+ st = line.find("width") + 7; -+ ed = line.find("\"", st); -+ strcpy(buf, line.mid(st, ed - st).utf8()); -+ sscanf(buf, "%d", &w); -+ } else if (-1 != line.find("<point ") || -+ -1 != line.find("<p ") -+ ) { -+ int st = line.find("x=") + 3; -+ int ed = line.find("\"", st); -+ strcpy(buf, line.mid(st, ed - st).utf8()); -+ int x; -+ sscanf(buf, "%d", &x); -+ -+ st = line.find("y=") + 3; -+ ed = line.find("\"", st); -+ strcpy(buf, line.mid(st, ed - st).utf8()); -+ int y; -+ sscanf(buf, "%d", &y); -+ points.append(createPts(x, y)); //バグ対策 -+ } else if (-1 != line.find("</fnpolygon") || -+ -1 != line.find("</bz") || -+ -1 != line.find("</el") || -+ -1 != line.find("</po")) { -+ pen.setColor((QRgb)c); -+ pen.setWidth(w); -+ if (type == "Bezier") { -+ _draws.append(polygon = createBezier(pen)); //バグ対策 -+ } else if (type == "Ellipse") { -+ _draws.append(polygon = createEllipse(pen)); //バグ対策 -+ } else { -+ _draws.append(polygon = createPolygon(pen)); //バグ対策 -+ } -+ polygon->setPoints(points); -+ points.clear(); -+ } -+ } -+ fclose(fp); -+ int x = 0; -+ int y = 0; -+ for (uint i = 0; i < _draws.count(); ++i) { -+ if (y > _draws.at(i)->boundingRect().top()) { -+ y = _draws.at(i)->boundingRect().top(); -+ } -+ if (x > _draws.at(i)->boundingRect().left()) { -+ x = _draws.at(i)->boundingRect().left(); -+ } -+ } -+ for (uint i = 0; i < _draws.count(); ++i) { -+ _draws.at(i)->translate(-x, -y); -+ } -+ redraw(); -+ FNMessageBox::information(0,"FreeNoteQt", "load complete."); -+ -+ return true; -+} -+ -+FNPolygon* FNCanvas::createPolygon(QPen& pen) -+{ -+ return new FNPolygon(pen); -+} -+ -+FNPolygon* FNCanvas::createBezier(QPen& pen) -+{ -+ return new FNBezier(pen); -+} -+ -+ -+FNPolygon* FNCanvas::createEllipse(QPen& pen) -+{ -+ return new FNEllipse(pen); -+} -+ -+QPoint* FNCanvas::createPts(int x, int y) -+{ -+ return new QPoint(x, y); -+} -+ -+void FNCanvas::setGuide(bool f) -+{ -+ _isShowGuide = f; -+ redraw(); -+} |