Mercurial > dillo
changeset 4651:072f0c158c66
Reverse commit 4647:8c6b1b79d329.
author | Sebastian Geerken |
---|---|
date | So, 17 Jul 2016 12:04:52 +0200 |
parents | da460fb294e3 |
children | 72c9d5f9372b |
files | dw/ooffloatsmgr.cc dw/ooffloatsmgr.hh |
diffstat | 2 files changed, 30 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- a/dw/ooffloatsmgr.cc So Jul 17 11:43:09 2016 +0200 +++ b/dw/ooffloatsmgr.cc So Jul 17 12:04:52 2016 +0200 @@ -338,8 +338,8 @@ leftFloatsMark = rightFloatsMark = 0; lastLeftTBIndex = lastRightTBIndex = 0; - SizeChanged = true; - DBG_OBJ_SET_BOOL ("SizeChanged", SizeChanged); + floatRef = -1; + DBG_OBJ_SET_NUM ("floatRef", floatRef); containerAllocation = *(container->getAllocation()); @@ -630,51 +630,43 @@ return vloat; } -/* - * Currently this is a compound recursion for textblocks: - * markSizeChange -> updateReference -> queueResize -> markSizeChange - * One way to see it is as a widget tree coverage problem. i.e. to cover all - * the nodes that need a resize when a float changes its size. - * The coverage logic of it is shared between resize code and mark code (here). - * - * This implementation works for all the test cases so far. It relies on the - * fact that Widget::queueResize should be called whenever a widget changes its - * size. When "SizeChanged" is true, we notify the parent, when not, just the - * following textblocks. - */ void OOFFloatsMgr::markSizeChange (int ref) { DBG_OBJ_ENTER ("resize.oofm", 0, "markSizeChange", "%d", ref); - // When "SizeChanged" is true, we know this float changed its size. - // This helps to prune redundant passes. - // "SizeChanged" is set by getSize(), which is called by sizeRequest(). - - SortedFloatsVector *list; - list = isSubRefLeftFloat(ref) ? leftFloats : rightFloats; - Float *vloat = list->get (getFloatIndexFromSubRef (ref)); + // We implement "incremental resizing" (kind of), by remembering the largest + // value for "ref", in "floatRef". It is reset again in getSize(), which is + // called by sizeRequest(). + if (floatRef == -1 || ref > floatRef) { + Float *vloat; - vloat->dirty = true; - DBG_OBJ_SET_BOOL_O (vloat->getWidget (), "<Float>.dirty", vloat->dirty); - - assert (vloat->getWidget()->getWidgetReference() != NULL); + if (isSubRefLeftFloat (ref)) + vloat = leftFloats->get (getFloatIndexFromSubRef (ref)); + else if (isSubRefRightFloat (ref)) + vloat = rightFloats->get (getFloatIndexFromSubRef (ref)); + else { + assertNotReached(); + vloat = NULL; // compiler happiness + } - int first = getOOFAwareWidget(vloat->generator)->index; - DBG_OBJ_MSGF ("resize.oofm", 1, "updating from %d", first); + vloat->dirty = true; + DBG_OBJ_SET_BOOL_O (vloat->getWidget (), "<Float>.dirty", vloat->dirty); - //printf("IN markSizeChange %p ref %d SzCh=%d\n", this, ref, - // (int)SizeChanged); - - if (SizeChanged) + assert (vloat->getWidget()->getWidgetReference() != NULL); + + int first = getOOFAwareWidget(vloat->generator)->index; + DBG_OBJ_MSGF ("resize.oofm", 1, "updating from %d", first); + tbInfos->get(first)->getOOFAwareWidget() ->updateReference (vloat->getWidget()->getWidgetReference() ->parentRef); + + for (int i = first + 1; i < tbInfos->size(); i++) + tbInfos->get(i)->getOOFAwareWidget()->updateReference(0); - for (int i = first + 1; i < tbInfos->size(); i++) - tbInfos->get(i)->getOOFAwareWidget()->updateReference(0); - - SizeChanged = false; // Done. - DBG_OBJ_SET_BOOL ("SizeChanged", SizeChanged); + floatRef = ref; + DBG_OBJ_SET_NUM ("floatRef", floatRef); + } DBG_OBJ_LEAVE (); } @@ -929,7 +921,7 @@ *oofHeight = max (oofHeightLeft, oofHeightRight) + container->boxRestHeight (); - SizeChanged = true; + floatRef = -1; DBG_OBJ_SET_NUM ("floatRef", floatRef); DBG_OBJ_MSGF ("resize.oofm", 1,
--- a/dw/ooffloatsmgr.hh So Jul 17 11:43:09 2016 +0200 +++ b/dw/ooffloatsmgr.hh So Jul 17 12:04:52 2016 +0200 @@ -165,7 +165,7 @@ TBInfo> *tbInfosByOOFAwareWidget; int lastLeftTBIndex, lastRightTBIndex, leftFloatsMark, rightFloatsMark; - bool SizeChanged; + int floatRef; void moveExternalIndices (lout::container::typed::Vector<Float> *list, int oldStartIndex, int diff);