From b6858cef5694f3c2aa9a9899d2516ef07ea7d85c Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Fri, 16 Mar 2018 17:39:16 +0000 Subject: Android: added function to optimize complex regions git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12760 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- .../Android/Fl_Android_Graphics_Clipping.cxx | 52 +++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) (limited to 'src/drivers/Android/Fl_Android_Graphics_Clipping.cxx') diff --git a/src/drivers/Android/Fl_Android_Graphics_Clipping.cxx b/src/drivers/Android/Fl_Android_Graphics_Clipping.cxx index 000ef929f..022acea86 100644 --- a/src/drivers/Android/Fl_Android_Graphics_Clipping.cxx +++ b/src/drivers/Android/Fl_Android_Graphics_Clipping.cxx @@ -167,6 +167,17 @@ int Fl_Rect_Region::intersect_with(const Fl_Rect_Region &r) return LESS; } +/** + * Use rectangle as a bounding box and add the outline of another rect. + */ +void Fl_Rect_Region::add_to_bbox(const Fl_Rect_Region &r) +{ + if (r.pLeftpRight) pRight = r.pRight; + if (r.pBottom>pBottom) pBottom = r.pBottom; +} + /** * Print the coordinates of the rect to the log. * @param label some text that is logged with this message. @@ -237,8 +248,8 @@ void Fl_Complex_Region::print_data(int indent) const */ void Fl_Complex_Region::set(const Fl_Rect_Region &r) { - delete pSubregion; pSubregion = 0; Fl_Rect_Region::set(r); + delete pSubregion; pSubregion = 0; } /** @@ -307,9 +318,48 @@ int Fl_Complex_Region::subtract(const Fl_Rect_Region &r) pNext->subtract(r); } } + compress(); return 0; } +/** + * Compress the subregion of this region if possible and update the bounding + * box of this region. + * + * Does not recurse down the tree! + */ +void Fl_Complex_Region::compress() +{ + // Can't compress anything that does not have a subregion + if (!pSubregion) return; + + // remove all empty regions, because the really don't add anything (literally) + Fl_Complex_Region *rgn = pSubregion, **rgnPtr = &pSubregion; + while (rgn) { + if (rgn->is_empty()) { + *rgnPtr = rgn->pNext; + delete rgn; + } + rgnPtr = &rgn->pNext; + rgn = *rgnPtr; + } + if (!pSubregion) return; + + // find rectangles that can be merged into a single new rectangle + + // if there is only a single subregion left, merge it into this region + if (pSubregion->pNext==nullptr) { + set((Fl_Rect_Region&)*pSubregion); // deletes subregion for us + } + if (!pSubregion) return; + + // finally, update the boudning box + Fl_Rect_Region::set((Fl_Rect_Region&)*pSubregion); + for (rgn=pSubregion->pNext; rgn; rgn=rgn->pNext) { + add_to_bbox(*rgn); + } +} + /** * Subtract a rect from another rect, potentially creating four new rectangles. * This assumes that the calling region is NOT complex. -- cgit v1.2.3