X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fpath.cpp;h=251de1eeb21f450c833ea3ce156a5113440f5dc0;hp=589c5099606f128089c610125034495682b26158;hb=58a6719da2337b3e6e20b581885f170bbe5fc480;hpb=dfba002efc3b5f126ddb69e63b9a7dafdd9eacda diff --git a/src/path.cpp b/src/path.cpp index 589c509..251de1e 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -5,7 +5,7 @@ using namespace std; namespace IPDF { -Path::Path(const Objects & objects, unsigned start, unsigned end, const Colour & fill, const Colour & stroke) +Path::Path(Objects & objects, unsigned start, unsigned end, const Colour & fill, const Colour & stroke) : m_start(start), m_end(end), m_fill(fill), m_stroke(stroke) { Real xmin = 0; Real ymin = 0; @@ -14,13 +14,15 @@ Path::Path(const Objects & objects, unsigned start, unsigned end, const Colour & // Find the bounds coordinates // and identify the top left and bottom right objects - unsigned left; - unsigned right; - unsigned top; - unsigned bottom; + unsigned left = m_start; + unsigned right = m_start; + unsigned top = m_start; + unsigned bottom = m_start; for (unsigned i = m_start; i <= m_end; ++i) { + if (i >= objects.bounds.size()) + break; const Rect & objb = objects.bounds[i]; if (i == m_start || objb.x < xmin) @@ -51,6 +53,21 @@ Path::Path(const Objects & objects, unsigned start, unsigned end, const Colour & m_bottom = objects.beziers[objects.data_indices[bottom]].ToAbsolute(objects.bounds[bottom]).GetBottom(); m_left = objects.beziers[objects.data_indices[left]].ToAbsolute(objects.bounds[left]).GetLeft(); m_right = objects.beziers[objects.data_indices[right]].ToAbsolute(objects.bounds[right]).GetRight(); + + #ifdef TRANSFORM_BEZIERS_TO_PATH + x = m_left.x; + y = m_top.y; + w = m_right.x - m_left.x; + h = m_bottom.y - m_top.y; + + Rect bounds = SolveBounds(objects); + for (unsigned i = m_start; i <= m_end; ++i) + { + //Debug("Transform %s -> %s", objects.bounds[i].Str().c_str(), bounds.Str().c_str()); + objects.bounds[i] = TransformRectCoordinates(bounds, objects.bounds[i]); + //Debug("-> %s", objects.bounds[i].Str().c_str()); + } + #endif } @@ -179,9 +196,21 @@ vector & Path::FillPoints(const Objects & objects, const View & view) return m_fill_points; } -Rect Path::SolveBounds(const Objects & objects) const +Rect Path::SolveBounds(const Objects & objects) { + #ifdef TRANSFORM_BEZIERS_TO_PATH + return Rect(Real(x.ToDouble()), Real(y.ToDouble()), Real(w.ToDouble()), Real(h.ToDouble())); + #else return Rect(m_left.x, m_top.y, m_right.x-m_left.x, m_bottom.y-m_top.y); + #endif +} + +Rect & Path::GetBounds(Objects & objects) +{ + #ifdef TRANSFORM_BEZIERS_TO_PATH + objects.bounds[m_index] = Rect(Real(x.ToDouble()), Real(y.ToDouble()), Real(w.ToDouble()), Real(h.ToDouble())); + #endif + return objects.bounds[m_index]; } }