Skip to content

YGNodeSetMeasureFunc api error  #488

@anql

Description

@anql

Report

Issues and Steps to Reproduce

  1. Run the code below
  2. Uncomment the line of 'YGNodeSetMeasureFunc', run again.

Expected Behavior

Expected the child node's width should be 282.

{layout: {width: 282, height: 200, top: 0, left: 0}, flexDirection: 'column', alignItems: 'stretch', alignContent: 'stretch', flexGrow: 0, flexShrink: 0, flexBasis: nan%, overflow: 'hidden', width: nan%, height: 200pt, children: [
  {layout: {width: 282, height: 200, top: 0, left: 0}, flexDirection: 'column', alignItems: 'stretch', alignContent: 'stretch', alignSelf: 'stretch', flexGrow: 0, flexShrink: 0, flexBasis: nan%, overflow: 'hidden', padding: 100pt, width: nan%, height: nan%, },
]},

Actual Behavior

Get different calculation results while set 'YGNodeSetMeasureFunc' or not even if the function was never invoked actually both cases.

{layout: {width: 282, height: 200, top: 0, left: 0}, flexDirection: 'column', alignItems: 'stretch', alignContent: 'stretch', flexGrow: 0, flexShrink: 0, flexBasis: nan%, overflow: 'hidden', width: nan%, height: 200pt, children: [
  {layout: {width: 200, height: 200, top: 0, left: 0}, flexDirection: 'column', alignItems: 'stretch', alignContent: 'stretch', alignSelf: 'stretch', flexGrow: 0, flexShrink: 0, flexBasis: nan%, overflow: 'hidden', padding: 100pt, width: nan%, height: nan%, },
]},

Link to Code

#include <iostream>
#include "Yoga.h"
#include <stdlib.h>
#include <stdio.h>
#include <vector>


static YGSize YGMeasureFuncForLabel(YGNodeRef node,
                                    float width,
                                    YGMeasureMode widthMode,
                                    float height,
                                    YGMeasureMode heightMode) {
    // this function was never invoked.
    YGSize size;
    size.width = 8;
    size.height = 16;
    return size;
}

int main(int argc, const char * argv[]) {
    
    const YGNodeRef root = YGNodeNew();
    YGNodeStyleSetHeight(root, 200);
    YGNodeStyleSetFlexDirection(root, YGFlexDirectionColumn);
    YGNodeStyleSetAlignItems(root, YGAlignStretch);
    YGNodeStyleSetAlignContent(root, YGAlignStretch);
    YGNodeStyleSetFlexGrow(root, 0);
    YGNodeStyleSetOverflow(root, YGOverflowHidden);
    YGNodeStyleSetAlignSelf(root, YGAlignAuto);
    YGNodeStyleSetPositionType(root, YGPositionTypeRelative);
    YGNodeStyleSetJustifyContent(root, YGJustifyFlexStart);
    
    const YGNodeRef root_child0 = YGNodeNew();
    YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionColumn);
    YGNodeStyleSetAlignItems(root_child0, YGAlignStretch);
    YGNodeStyleSetAlignContent(root_child0, YGAlignStretch);
    YGNodeStyleSetAlignSelf(root_child0, YGAlignStretch);
    YGNodeStyleSetJustifyContent(root_child0, YGJustifyFlexStart);
    YGNodeStyleSetOverflow(root_child0, YGOverflowHidden);
    YGNodeStyleSetPadding(root_child0, YGEdgeLeft, 100);
    YGNodeStyleSetPadding(root_child0, YGEdgeTop, 100);
    YGNodeStyleSetPadding(root_child0, YGEdgeRight, 100);
    YGNodeStyleSetPadding(root_child0, YGEdgeBottom, 100);
    
    YGNodeInsertChild(root, root_child0, 0);

    //YGNodeSetMeasureFunc(root_child0, &YGMeasureFuncForLabel);
    YGNodeCalculateLayout(root, 282, YGUndefined, YGDirectionLTR);
    
    YGNodeFreeRecursive(root);
}

When applicable, use this fiddle to post a web repro.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions