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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions