Hippy项目源码分析Week8

2021SC@SDUSC

layout/engine

Hippy.h

预定义了若干函数,引用了HPNode.h,被Hippy.cpp引用,将其中预定义的函数进行实现
具体代码不再列出

Hippy.cpp

实现了Node的各项参数的settergetter方法,具体代码不再列出

HPLayoutCache.h

定义了一个结构体MeasureResult,一个常量MAX_MEASURES_COUNT = 6,一个类HPLayoutCache,其中预定义了一些函数由HPLayoutCache.cpp引用并实现

HPLayoutCache.cpp

引用了HPLayoutCache.hHPUtil.h,对其中预定义的一些内容进行了实现,大致是实现一些判断参数是否未定义,是否可以使用之类的功能,以及一些getter方法和初始化方法

HPNode.h

引用了Flex.hFlexLine.hHPLayoutCache.hHPStyle.hHPUtil.h
通过引用这些头文件中定义的一些函数和参数来预定义了一个HPNode
HPNode.cpp引用

HPNode.cpp

本cpp文件的代码量有1500行,只截取其中部分进行分析,整体上是对Flex布局中的Node的复现

void HPNode::resetLayoutRecursive(bool isDisplayNone) {
  if (inInitailState && isDisplayNone) {
    return;
  }
  initLayoutResult();
  if (!isDisplayNone) {  // see HPNode::removeChild
    // set result as undefined.see HPNodeChildTest.cpp
    // 将结果设置为 undefined.see 在HPNodeChildTest.cpp可查
    // in tests/folder
    result.dim[DimWidth] = VALUE_UNDEFINED;
    result.dim[DimHeight] = VALUE_UNDEFINED;
  } else {
    inInitailState = true;  
    // prevent resetLayoutRecursive run many times in recursive
    // 防止 resetLayoutRecursive 在递归中运行多次
    // in DisplayNone state, set hasNewLayout as true;
    // 在 DisplayNone 状态下,将 hasNewLayout 设置为 true;
    // set dirty false;
    // 把dirty设置为false;
    setHasNewLayout(true);
    setDirty(false);
  }
  // if just because parent's display type change,
  // 如果只是因为父母的显示类型改变,
  // not to clear child layout cache, can be reused.
  // 不清除子布局缓存,可以重复使用。
  layoutCache.clearCache();
  for (size_t i = 0; i < children.size(); i++) {
    HPNodeRef item = children[i];
    item->resetLayoutRecursive(isDisplayNone);
  }
}
void HPNode::setDirty(bool dirtyOrNot) {
  if (isDirty == dirtyOrNot) {
    return;
  }
  isDirty = dirtyOrNot;
  if (isDirty) {
    // reset layout direction to initial state
    // 将布局方向重置为初始状态
    // need to calculated again
    // 需要重新计算
    setLayoutDirection(DirectionInherit);
    // if is dirty, reset frozen.
    // 如果是dirty的,重置冻结。
    isFrozen = false;
    // if is dirty, layout cache muse be in clear state.
    // 如果是dirty的,布局缓存必须处于clear状态。
    layoutCache.clearCache();
    if (dirtiedFunc != nullptr) {
      dirtiedFunc(this);
    }
  }
}
// calculate main axis by refer this node's flex direction
// 参照该节点的弯曲方向计算主轴
// and layout direction which resolved in resolveDirection.
// 和在 resolveDirection 中解析的布局方向。
FlexDirection HPNode::resolveMainAxis() {
  FlexDirection mainAxis = style.flexDirection;
  HPDirection direction = getLayoutDirection();
  if (direction == DirectionRTL) {
    if (mainAxis == FLexDirectionRow) {
      return FLexDirectionRowReverse;
    } else if (mainAxis == FLexDirectionRowReverse) {
      return FLexDirectionRow;
    }
  }
  return mainAxis;
}

HPNode.cpp的剩余部分留待以后解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值