aboutsummaryrefslogtreecommitdiff
path: root/dw/outofflowmgr.cc
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2014-03-08 15:24:50 +0100
committerSebastian Geerken <devnull@localhost>2014-03-08 15:24:50 +0100
commitd3578b25dcb35e4be32e55fe5606306528e65a47 (patch)
treebaec46206528281dfa28a1072f78de2e9cbd8505 /dw/outofflowmgr.cc
parentd638722a010ba2709e989525f3e5bd78305a0931 (diff)
OOFM::(size|extremes): handle GB == CB in a special way.
Diffstat (limited to 'dw/outofflowmgr.cc')
-rw-r--r--dw/outofflowmgr.cc46
1 files changed, 31 insertions, 15 deletions
diff --git a/dw/outofflowmgr.cc b/dw/outofflowmgr.cc
index ab6c6314..eaec542d 100644
--- a/dw/outofflowmgr.cc
+++ b/dw/outofflowmgr.cc
@@ -1428,13 +1428,22 @@ void OutOfFlowMgr::getFloatsSize (Requisition *cbReq, Side side, int *width,
for (int i = 0; i < list->size(); i++) {
Float *vloat = list->get(i);
- if (wasAllocated (vloat->generatingBlock)) {
+ if (vloat->generatingBlock == containingBlock ||
+ wasAllocated (vloat->generatingBlock)) {
ensureFloatSize (vloat);
- Allocation *gba = getAllocation(vloat->generatingBlock);
- int x = calcFloatX (vloat, side,
- gba->x - containingBlockAllocation.x, gba->width,
- vloat->generatingBlock->getAvailWidth ());
- int y = gba->y - containingBlockAllocation.y + vloat->yReal;
+ int x, y;
+
+ if (vloat->generatingBlock == containingBlock) {
+ x = calcFloatX (vloat, side, 0, cbReq->width,
+ vloat->generatingBlock->getAvailWidth ());
+ y = vloat->yReal;
+ } else {
+ Allocation *gba = getAllocation(vloat->generatingBlock);
+ x = calcFloatX (vloat, side,
+ gba->x - containingBlockAllocation.x, gba->width,
+ vloat->generatingBlock->getAvailWidth ());
+ y = gba->y - containingBlockAllocation.y + vloat->yReal;
+ }
*width = max (*width, x + vloat->size.width);
*height = max (*height, y + vloat->size.ascent + vloat->size.descent);
@@ -1483,7 +1492,6 @@ void OutOfFlowMgr::getExtremes (Extremes *cbExtr, int *oofMinWidth,
void OutOfFlowMgr::getFloatsExtremes (Extremes *cbExtr, Side side,
int *minWidth, int *maxWidth)
{
- // Idea for a faster implementation: use incremental resizing?
*minWidth = *maxWidth = 0;
SortedFloatsVector *list = getFloatsListForTextblock (containingBlock, side);
@@ -1495,16 +1503,24 @@ void OutOfFlowMgr::getFloatsExtremes (Extremes *cbExtr, Side side,
for (int i = 0; i < list->size(); i++) {
Float *vloat = list->get(i);
- if (wasAllocated (vloat->generatingBlock)) {
+ if (vloat->generatingBlock == containingBlock ||
+ wasAllocated (vloat->generatingBlock)) {
Extremes extr;
vloat->getWidget()->getExtremes (&extr);
- Allocation *gba = getAllocation(vloat->generatingBlock);
- int leftDiff = gba->x - containingBlockAllocation.x
- + vloat->generatingBlock->getStyle()->boxOffsetX();
- int rightDiff =
- (containingBlockAllocation.x + containingBlockAllocation.width)
- - (gba->x - gba->width)
- + vloat->generatingBlock->getStyle()->boxRestWidth();
+ int leftDiff, rightDiff;
+
+ if (vloat->generatingBlock == containingBlock) {
+ leftDiff = vloat->generatingBlock->getStyle()->boxOffsetX();
+ rightDiff = vloat->generatingBlock->getStyle()->boxRestWidth();
+ } else {
+ Allocation *gba = getAllocation(vloat->generatingBlock);
+ leftDiff = gba->x - containingBlockAllocation.x
+ + vloat->generatingBlock->getStyle()->boxOffsetX();
+ rightDiff =
+ (containingBlockAllocation.x + containingBlockAllocation.width)
+ - (gba->x - gba->width)
+ + vloat->generatingBlock->getStyle()->boxRestWidth();
+ }
// TODO: Or zero (instead of rightDiff) for right floats?
*minWidth = max (*minWidth,