mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-25 05:27:00 +03:00
Fix relative positioning to affect position of descendant floats which are in a block formatting context which is an ancestor of the relatively positioned box.
svn path=/trunk/netsurf/; revision=5390
This commit is contained in:
parent
dd1afc041d
commit
1850a494e7
@ -93,7 +93,8 @@ static void calculate_mbp_width(struct css_style *style, unsigned int side,
|
|||||||
int *fixed, float *frac);
|
int *fixed, float *frac);
|
||||||
static void layout_lists(struct box *box,
|
static void layout_lists(struct box *box,
|
||||||
const struct font_functions *font_func);
|
const struct font_functions *font_func);
|
||||||
static void layout_position_relative(struct box *root);
|
static void layout_position_relative(struct box *root, struct box *fp,
|
||||||
|
int fx, int fy);
|
||||||
static void layout_compute_relative_offset(struct box *box, int *x, int *y);
|
static void layout_compute_relative_offset(struct box *box, int *x, int *y);
|
||||||
static bool layout_position_absolute(struct box *box,
|
static bool layout_position_absolute(struct box *box,
|
||||||
struct box *containing_block,
|
struct box *containing_block,
|
||||||
@ -157,7 +158,7 @@ bool layout_document(struct content *content, int width, int height)
|
|||||||
|
|
||||||
layout_lists(doc, font_func);
|
layout_lists(doc, font_func);
|
||||||
layout_position_absolute(doc, doc, 0, 0, content);
|
layout_position_absolute(doc, doc, 0, 0, content);
|
||||||
layout_position_relative(doc);
|
layout_position_relative(doc, doc, 0, 0);
|
||||||
|
|
||||||
layout_calculate_descendant_bboxes(doc);
|
layout_calculate_descendant_bboxes(doc);
|
||||||
|
|
||||||
@ -2852,11 +2853,28 @@ void layout_lists(struct box *box,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Adjust positions of relatively positioned boxes.
|
* Adjust positions of relatively positioned boxes.
|
||||||
|
*
|
||||||
|
* \param root box to adjust the position of
|
||||||
|
* \param fp box which forms the block formatting context for children of
|
||||||
|
* "root" which are floats
|
||||||
|
* \param fx x offset due to intervening relatively positioned boxes
|
||||||
|
* between current box, "root", and the block formatting context
|
||||||
|
* box, "fp", for float children of "root"
|
||||||
|
* \param fy y offset due to intervening relatively positioned boxes
|
||||||
|
* between current box, "root", and the block formatting context
|
||||||
|
* box, "fp", for float children of "root"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void layout_position_relative(struct box *root)
|
void layout_position_relative(struct box *root, struct box *fp, int fx, int fy)
|
||||||
{
|
{
|
||||||
struct box *box;
|
struct box *box; /* for children of "root" */
|
||||||
|
struct box *fn; /* for block formatting context box for children of
|
||||||
|
* "box" */
|
||||||
|
struct box *fc; /* for float children of the block formatting context,
|
||||||
|
* "fp" */
|
||||||
|
int x, y; /* for the offsets resulting from any relative
|
||||||
|
* positioning on the current block */
|
||||||
|
int fnx, fny; /* for affsets which apply to flat children of "box" */
|
||||||
|
|
||||||
/**\todo ensure containing box is large enough after moving boxes */
|
/**\todo ensure containing box is large enough after moving boxes */
|
||||||
|
|
||||||
@ -2864,21 +2882,53 @@ void layout_position_relative(struct box *root)
|
|||||||
|
|
||||||
/* Normal children */
|
/* Normal children */
|
||||||
for (box = root->children; box; box = box->next) {
|
for (box = root->children; box; box = box->next) {
|
||||||
int x, y;
|
|
||||||
|
|
||||||
if (box->type == BOX_TEXT)
|
if (box->type == BOX_TEXT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* If relatively positioned, get offsets */
|
||||||
|
if (box->style && box->style->position == CSS_POSITION_RELATIVE)
|
||||||
|
layout_compute_relative_offset(box, &x, &y);
|
||||||
|
else
|
||||||
|
x = y = 0;
|
||||||
|
|
||||||
|
/* Adjust float coordinates.
|
||||||
|
* (note float x and y are relative to their block formatting
|
||||||
|
* context box and not their parent) */
|
||||||
|
if (box->style && (box->style->float_ == CSS_FLOAT_LEFT ||
|
||||||
|
box->style->float_ == CSS_FLOAT_RIGHT) &&
|
||||||
|
(fx != 0 || fy != 0)) {
|
||||||
|
/* box is a float and there is a float offset to
|
||||||
|
* apply */
|
||||||
|
for (fc = fp->float_children; fc; fc = fc->next_float) {
|
||||||
|
if (box == fc->children) {
|
||||||
|
/* Box is floated in the block
|
||||||
|
* formatting context block, fp.
|
||||||
|
* Apply float offsets. */
|
||||||
|
box->x += fx;
|
||||||
|
box->y += fy;
|
||||||
|
fx = fy = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (box->float_children) {
|
||||||
|
fn = box;
|
||||||
|
fnx = fny = 0;
|
||||||
|
} else {
|
||||||
|
fn = fp;
|
||||||
|
fnx = fx + x;
|
||||||
|
fny = fy + y;
|
||||||
|
}
|
||||||
|
|
||||||
/* recurse first */
|
/* recurse first */
|
||||||
layout_position_relative(box);
|
layout_position_relative(box, fn, fnx, fny);
|
||||||
|
|
||||||
/* Ignore things we're not interested in. */
|
/* Ignore things we're not interested in. */
|
||||||
if (!box->style || (box->style &&
|
if (!box->style || (box->style &&
|
||||||
box->style->position != CSS_POSITION_RELATIVE))
|
box->style->position != CSS_POSITION_RELATIVE))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
layout_compute_relative_offset(box, &x, &y);
|
|
||||||
|
|
||||||
box->x += x;
|
box->x += x;
|
||||||
box->y += y;
|
box->y += y;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user