C++实现CSS布局管理器

/*
Yoga 是一个针对 Web 标准的嵌入式布局引擎。
https://www.yogalayout.dev/docs/styling/
https://www.yogalayout.dev/playground
其它类似:
https://github.com/Tencent/Taitank
*/
#include <yoga/Yoga.h>

void applyLayout(YGNodeRef node) {
    //if (!YGNodeHasNewLayout(node)) {
    //    return;
    //}
    if (!YGNodeIsDirty(node))
        return;

    // Reset the flag
    YGNodeSetHasNewLayout(node, false);

    // Do the real work

    for (size_t i = 0; i < YGNodeGetChildCount(node); i++) {
        applyLayout(YGNodeGetChild(node, i));
    }
}


static float _baselineFunc(
    YGNodeConstRef /*node*/,
    const float /*width*/,
    const float height) {
    return height / 2;
}

static float
_baseline(YGNodeConstRef node, const float /*width*/, const float /*height*/) {
    auto* baseline = (float*)YGNodeGetContext(node);
    return *baseline;
}

static YGSize _measure1(
    YGNodeConstRef /*node*/,
    float /*width*/,
    YGMeasureMode /*widthMode*/,
    float /*height*/,
    YGMeasureMode /*heightMode*/) {
    return YGSize{ 42, 50 };
}

static void _dirtied(YGNodeConstRef node) {
    int* dirtiedCount = (int*)YGNodeGetContext(node);
    (*dirtiedCount)++;
}

void test() {
    // 设置
    YGConfigRef config = YGConfigNew();
    YGConfigSetUseWebDefaults(config, true);
    // Setup config...
    YGConfigSetErrata(config, YGErrataClassic); // None,Classic,All
    YGConfigSetPointScaleFactor(config, 2.0f);    // 网格对齐,0禁用

    YGNodeRef root = YGNodeNewWithConfig(config);

    //YGNodeRef root = YGNodeNew();
    YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute);
    YGNodeStyleSetOverflow(root, YGOverflowHidden);
    YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
    YGNodeStyleSetJustifyContent(root, YGJustifyCenter);
    YGNodeStyleSetAlignItems(root, YGAlignCenter);
    YGNodeStyleSetAlignContent(root, YGAlignCenter);
    YGNodeStyleSetFlexWrap(root, YGWrapWrapReverse);
    YGNodeStyleSetFlexGrow(root, 1);
    YGNodeStyleSetFlexShrink(root, 1);
    YGNodeStyleSetFlexBasisPercent(root, 0);
    YGNodeStyleSetMargin(root, YGEdgeLeft, 10);
    YGNodeStyleSetPadding(root, YGEdgeTop, 10);
    YGNodeStyleSetPaddingPercent(root, YGEdgeLeft, 3);
    YGNodeStyleSetBorder(root, YGEdgeBottom, 10);
    YGNodeStyleSetGap(root, YGGutterRow, 10);
    //YGNodeStyleSetGapPercent(root, YGGutterRow, 10);
    YGNodeStyleSetWidth(root, 100.0f);
    YGNodeStyleSetHeight(root, 100.0f);
    YGNodeStyleSetMaxHeight(root, 500);
    YGNodeStyleSetMinHeight(root, 500);
    YGNodeStyleSetMinWidthPercent(root, 10);

    const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
    YGNodeRef child0 = YGNodeNew();
    YGNodeStyleSetPosition(child0, YGEdgeTop, 10);
    YGNodeStyleSetAlignSelf(child0, YGAlignCenter);
    YGNodeStyleSetPositionPercent(child0, YGEdgeTop, 50);
    YGNodeStyleSetWidthPercent(child0, 20);
    YGNodeStyleSetAspectRatio(child0, 1 / 1);    // 宽高比
    YGNodeStyleSetFlexGrow(child0, 1.0f);
    YGNodeStyleSetFlexBasis(child0, 50);
    YGNodeStyleSetMargin(child0, YGEdgeRight, 10.0f);
    YGNodeStyleSetDisplay(child0, YGDisplayNone);
    YGNodeStyleSetMarginAuto(child0, YGEdgeRight);
    YGNodeInsertChild(root, child0, 0.0f);

    float baselineValue = 10;
    YGNodeRef child1 = YGNodeNew();
    YGNodeCopyStyle(child0, child1);
    YGNodeSetContext(child1, &baselineValue);
    YGNodeStyleSetFlexGrow(child1, 1.0f);
    YGNodeSetIsReferenceBaseline(child1, true);
    YGNodeSetBaselineFunc(child1, _baselineFunc);
    YGNodeSetBaselineFunc(child1, _baseline);
    YGNodeSetMeasureFunc(child1, _measure1);
    int dirtiedCount = 0;
    YGNodeSetContext(root, &dirtiedCount);
    YGNodeSetDirtiedFunc(root, _dirtied);
    YGNodeInsertChild(root, child1, 1.0f);

    // 层级单独创建
    YGNodeRef const root_child0 = YGNodeNew();
    YGNodeRef const root_child1 = YGNodeNew();
    YGNodeRef children[] = { root_child0, root_child1 };
    YGNodeSetChildren(root, children, 2);
    root = YGNodeGetOwner(root_child0);

    // 布局
    YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);

    // 获取 margin, border, and padding
    float left = YGNodeLayoutGetLeft(child0);
    float height = YGNodeLayoutGetHeight(child0);

    // 设置测量函数  MeasureMode  Exactly(stretch-fit)  Undefined(max-content)  AtMost(fit-content)
    // 通过测量函数委托给不同的布局系统,比如文本排版
    //Widget widget{}; 
    //YGNodeSetContext(node, &w);
    //YGNodeSetMeasureFunc(node, &measureWidget);

    // 添加脏区
    //YGNodeMarkDirty(child1);

    // 设置行flex行间距
    // YGNodeStyleSetGap(node, YGGutterRow, amount);

    // 设置布局后偏移
    // YGNodeStyleSetPosition(node, edge, position);

      // ceil/floor flags
    //ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(6.01, 2.0, false, false));

    //YGNodeFree(child0);
    //YGNodeFree(child1);
    //YGNodeRemoveAllChildren(root);
    YGNodeFreeRecursive(root);
    YGConfigFree(config);
}
 


创作不易,小小的支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702466.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渣土车上路识别报警摄像机

随着城市建设的不断推进&#xff0c;渣土车在城市道路上的数量也逐渐增加。然而&#xff0c;一些不法渣土车司机往往会超载、超速行驶或者闯红灯&#xff0c;给道路交通安全和城市环境带来了一定的隐患。为了有效监管渣土车上路行驶的情况&#xff0c;渣土车上路识别报警摄像机…

unity制作app(7)--panel control

根据用户的状态&#xff0c;在界面中显示不同的panel 1.新建一个脚本PanelControl&#xff0c;控制各个脚本的显示与隐藏 2.实现第一个逻辑判断功能&#xff1a;如果没有登记过信息&#xff0c;就直接跳转到登记界面&#xff0c;如果登记过&#xff0c;跳转到住界面。许多需要…

【C++小语法技巧】缺省参数和函数重载

在使用C语言编程过程中&#xff0c;C语言的要求之严格&#xff0c;编程过程之繁琐&#xff0c;大同小异的重复性工作&#xff0c;令C之父使用C语言编程时也深受其扰&#xff0c;于是乎C兼容C小语法诞生了 一、缺省参数 在C中&#xff0c;缺省参数&#xff08;也称为默认参数&a…

Windows server 2012 R2添加桌面图标

1、鼠标放到Window图标——右键——搜索 2、输icon——搜索 3、选择显示或隐藏桌面上的的通用图标 4、勾选需要添加到桌面的图标——确定

TimesFM: 预训练的时间序列基础模型

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果…

【全开源】房屋出租出售预约系统支持微信小程序+H5+APP

一款基于FastAdminThinkPHPUniapp开发的房屋出租出售预约系统&#xff0c;支持小程序、H5、APP&#xff1b;包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、小区找房&#xff0c;地铁找房等方式。 特色功能&#…

基于物联网的智能病房设计-设计说明书

设计摘要&#xff1a; 本设计是基于物联网的智能病房设计&#xff0c;旨在提供更加智能化和便捷的监测和管理病人的环境和生理状态。通过集成多种传感器和通信模块&#xff0c;实现了温度、尿床和点滴异常的监测和提醒功能。具体而言&#xff0c;设计中采用了OLED显示屏来显示…

Python从0到100(二十二):用Python读写CSV文件

一、CSV文件概述 CSV&#xff0c;即逗号分隔值&#xff08;Comma Separated Values&#xff09;&#xff0c;是一种以纯文本形式存储表格数据的通用格式。它因其简洁和易于使用而广泛应用于数据交换&#xff0c;如在数据库、电子表格等应用程序中导入和导出数据。CSV文件的纯文…

Linux线程(四) 生产者消费者模型

目录 一、什么是生产者消费者模型 基本概念 优点以及应用场景 二、 基于阻塞队列的生产者消费者模型 三、POSIX信号量 四、基于环形队列的生产消费模型 一、什么是生产者消费者模型 Linux下的生产者消费者模型是一种经典的多线程或多进程编程设计模式&#xff0c;它用于解…

分体工业读写器的适用场景有哪些?

工业读写器根据设计方式不同&#xff0c;可分为一体式读写器和分体式读写器&#xff0c;不同读写器特点不同&#xff0c;适用场景也不同&#xff0c;下面我们就一起来了解一下超高频分体读写器适用场景有哪些。 超高频分体读写器介绍 超高频分体读写器是一种射频识别(RFID)设…

【ARM】解决Keil MDK报错提示找不到编译器路径的问题

问题场景&#xff1a; 在打开MDK的时候&#xff0c;会跳出提示 Warning: Registered ARM Compiler Version not found in path: ARMCLANG!”&#xff08;如图1&#xff09;这样的提示信息。提示无法找到编译器的路径&#xff0c;这样的问题经常出现在添加旧版本编译器过程中操…

消防物资存储|基于SSM+vue的消防物资存储系统的设计与实现(源码+数据库+文档)

消防物资存储系统 目录 基于SSM&#xff0b;vue的消防物资存储系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…