Skip to content

Commit

Permalink
Use SizeConstriants instead of MeasureSpecs in RenderCore
Browse files Browse the repository at this point in the history
Summary: This diff replaces the usages of MeasureSpecs in RenderCore with SizeConstraints.

Reviewed By: adityasharat

Differential Revision: D51492208

fbshipit-source-id: b34cbed7f4e801d700f9d7696dcb8deb3ce4260b
  • Loading branch information
zielinskimz authored and facebook-github-bot committed Nov 28, 2023
1 parent 4d380a0 commit 3a6e5e0
Show file tree
Hide file tree
Showing 15 changed files with 177 additions and 170 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.facebook.rendercore.RenderState
import com.facebook.rendercore.RenderTree
import com.facebook.rendercore.RenderTreeNode
import com.facebook.rendercore.RootHostView
import com.facebook.rendercore.SizeConstraints
import com.facebook.rendercore.extensions.ExtensionState
import com.facebook.rendercore.extensions.RenderCoreExtension
import com.facebook.rendercore.incrementalmount.IncrementalMountExtension.IncrementalMountExtensionState
Expand Down Expand Up @@ -415,8 +416,7 @@ class IncrementalMountExtensionTest {
RenderTree(
hostRenderTreeNode,
flatList,
View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY),
SizeConstraints.exact(100, 100),
RenderState.NO_ID,
null,
null)
Expand Down Expand Up @@ -456,8 +456,7 @@ class IncrementalMountExtensionTest {
RenderTree(
hostRenderTreeNode,
flatList,
View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY),
SizeConstraints.exact(100, 100),
RenderState.NO_ID,
null,
null)
Expand All @@ -482,8 +481,7 @@ class IncrementalMountExtensionTest {
RenderTree(
hostRenderTreeNode,
flatListReparented,
View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY),
SizeConstraints.exact(100, 100),
RenderState.NO_ID,
null,
null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,22 +28,20 @@ class LayoutFuture<State, RenderContext>(
val version: Int,
previousResult: RenderResult<State, RenderContext>?,
extensions: Array<RenderCoreExtension<*, *>>?,
val widthSpec: Int,
val heightSpec: Int
val sizeConstraints: SizeConstraints
) :
ThreadInheritingPriorityFuture<RenderResult<State, RenderContext>?>(
Callable {
if (previousResult != null &&
RenderResult.shouldReuseResult(tree, widthSpec, heightSpec, previousResult)) {
RenderResult.shouldReuseResult(tree, sizeConstraints, previousResult)) {
RenderResult(previousResult.renderTree, tree, previousResult.layoutCacheData, state)
} else {
RenderResult.layout(
RenderResult.createLayoutContext(
previousResult, renderContext, context, version, extensions),
tree,
state,
widthSpec,
heightSpec)
sizeConstraints)
}
},
"LayoutFuture")
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package com.facebook.rendercore
import android.content.Context
import androidx.annotation.VisibleForTesting
import com.facebook.rendercore.extensions.RenderCoreExtension
import com.facebook.rendercore.utils.MeasureSpecUtils

class LazyMeasureHostView(context: Context) : HostView(context), RenderCoreExtensionHost {

Expand All @@ -30,8 +29,7 @@ class LazyMeasureHostView(context: Context) : HostView(context), RenderCoreExten

fun interface LazyRenderTreeProvider<RenderContext> {
fun getRenderTreeForSize(
widthSpec: Int,
heightSpec: Int,
sizeConstraints: SizeConstraints,
previousRenderResult: RenderResult<*, RenderContext>?
): RenderResult<*, RenderContext>
}
Expand All @@ -43,9 +41,8 @@ class LazyMeasureHostView(context: Context) : HostView(context), RenderCoreExten
currentRenderResult = null
return
}
val renderResult =
renderTreeProvider.getRenderTreeForSize(
widthMeasureSpec, heightMeasureSpec, currentRenderResult)
val sizeConstraints = SizeConstraints.fromMeasureSpecs(widthMeasureSpec, heightMeasureSpec)
val renderResult = renderTreeProvider.getRenderTreeForSize(sizeConstraints, currentRenderResult)
setMeasuredDimension(renderResult.renderTree.width, renderResult.renderTree.height)
currentRenderResult = renderResult
}
Expand All @@ -71,9 +68,7 @@ class LazyMeasureHostView(context: Context) : HostView(context), RenderCoreExten
lazyRenderTreeProvider = renderTreeProvider
val renderResult =
lazyRenderTreeProvider.getRenderTreeForSize(
MeasureSpecUtils.exactly(r - l),
MeasureSpecUtils.exactly(b - t),
currentRenderResult)
SizeConstraints.exact(r - l, b - t), currentRenderResult)
mountState.mount(renderResult.renderTree)
currentRenderResult = renderResult
retries++
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,7 @@ object Reducer {
fun getReducedTree(
context: Context,
layoutResult: LayoutResult,
widthSpec: Int,
heightSpec: Int,
sizeConstraints: SizeConstraints,
renderStateId: Int,
extensions: Array<RenderCoreExtension<*, *>>?
): RenderTree {
Expand All @@ -151,7 +150,7 @@ object Reducer {
if (BuildConfig.DEBUG) {
debugData = layoutResult
}
return RenderTree(root, nodesArray, widthSpec, heightSpec, renderStateId, results, debugData)
return RenderTree(root, nodesArray, sizeConstraints, renderStateId, results, debugData)
}

@JvmStatic
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package com.facebook.rendercore
import android.content.Context
import androidx.annotation.VisibleForTesting
import com.facebook.rendercore.extensions.RenderCoreExtension
import com.facebook.rendercore.utils.MeasureSpecUtils

/**
* Result from laying out and reducing a [ResolveResult]. A [RenderResult] from a previous
Expand All @@ -36,6 +35,7 @@ internal constructor(

companion object {

@Deprecated(message = "Use the render variant that accepts SizeConstraints")
@JvmStatic
fun <State, RenderContext> render(
context: Context,
Expand All @@ -46,11 +46,31 @@ internal constructor(
layoutVersion: Int,
widthSpec: Int,
heightSpec: Int
): RenderResult<State, RenderContext> {
return render(
context,
result,
renderContext,
extensions,
previousResult,
layoutVersion,
SizeConstraints.fromMeasureSpecs(widthSpec, heightSpec))
}

@JvmStatic
fun <State, RenderContext> render(
context: Context,
result: ResolveResult<Node<RenderContext>, State>,
renderContext: RenderContext?,
extensions: Array<RenderCoreExtension<*, *>>?,
previousResult: RenderResult<State, RenderContext>?,
layoutVersion: Int,
sizeConstraints: SizeConstraints
): RenderResult<State, RenderContext> {
RenderCoreSystrace.beginSection("RC Create Tree")
val renderResult: RenderResult<State, RenderContext> =
if (previousResult != null &&
shouldReuseResult(result.resolvedNode, widthSpec, heightSpec, previousResult)) {
shouldReuseResult(result.resolvedNode, sizeConstraints, previousResult)) {
RenderResult(
previousResult.renderTree,
result.resolvedNode,
Expand All @@ -60,7 +80,7 @@ internal constructor(
val layoutContext: LayoutContext<RenderContext> =
createLayoutContext(
previousResult, renderContext, context, layoutVersion, extensions)
layout(layoutContext, result.resolvedNode, result.resolvedState, widthSpec, heightSpec)
layout(layoutContext, result.resolvedNode, result.resolvedState, sizeConstraints)
}
RenderCoreSystrace.endSection()
return renderResult
Expand All @@ -79,25 +99,38 @@ internal constructor(
context, renderContext, layoutVersion, layoutCache, extensions)
}

@Deprecated(message = "Use layout function that accepts SizeConstraints")
@JvmStatic
fun <State, RenderContext> layout(
layoutContext: LayoutContext<RenderContext>,
node: Node<RenderContext>,
state: State?,
widthSpec: Int,
heightSpec: Int
): RenderResult<State, RenderContext> {
return layout(
layoutContext, node, state, SizeConstraints.fromMeasureSpecs(widthSpec, heightSpec))
}

@JvmStatic
fun <State, RenderContext> layout(
layoutContext: LayoutContext<RenderContext>,
node: Node<RenderContext>,
state: State?,
sizeConstraints: SizeConstraints
): RenderResult<State, RenderContext> {
RenderCoreSystrace.beginSection("RC Layout")
val layoutResult = node.calculateLayout(layoutContext, widthSpec, heightSpec)
val layoutResult = node.calculateLayout(layoutContext, sizeConstraints)
RenderCoreSystrace.endSection()
RenderCoreSystrace.beginSection("RC Reduce")
val renderResult: RenderResult<State, RenderContext> =
create(layoutContext, node, layoutResult, widthSpec, heightSpec, state)
create(layoutContext, node, layoutResult, sizeConstraints, state)
RenderCoreSystrace.endSection()
layoutContext.clearCache()
return renderResult
}

@Deprecated(message = "Use create function that accepts SizeConstraints")
@JvmStatic
fun <State, RenderContext> create(
c: LayoutContext<RenderContext>,
Expand All @@ -106,13 +139,24 @@ internal constructor(
widthSpec: Int,
heightSpec: Int,
state: State?
): RenderResult<State, RenderContext> {
return create(
c, node, layoutResult, SizeConstraints.fromMeasureSpecs(widthSpec, heightSpec), state)
}

@JvmStatic
fun <State, RenderContext> create(
c: LayoutContext<RenderContext>,
node: Node<RenderContext>,
layoutResult: LayoutResult,
sizeConstraints: SizeConstraints,
state: State?
): RenderResult<State, RenderContext> {
return RenderResult(
Reducer.getReducedTree(
c.androidContext,
layoutResult,
widthSpec,
heightSpec,
sizeConstraints,
RenderState.NO_ID, // TODO: Get render state id from layout context
c.extensions),
node,
Expand All @@ -123,19 +167,16 @@ internal constructor(
@JvmStatic
fun <State, RenderContext> shouldReuseResult(
node: Node<RenderContext>,
widthSpec: Int,
heightSpec: Int,
sizeConstraints: SizeConstraints,
previousResult: RenderResult<State, RenderContext>?
): Boolean {
if (previousResult == null) {
return false
}
val prevRenderTree = previousResult.renderTree
return (node === previousResult.nodeTree &&
MeasureSpecUtils.isMeasureSpecCompatible(
prevRenderTree.widthSpec, widthSpec, prevRenderTree.width) &&
MeasureSpecUtils.isMeasureSpecCompatible(
prevRenderTree.heightSpec, heightSpec, prevRenderTree.height))
sizeConstraints.areCompatible(
prevRenderTree.sizeConstraints, Size(prevRenderTree.width, prevRenderTree.height)))
}

@VisibleForTesting
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ import java.util.concurrent.Callable
class RenderResultFuture<State, RenderContext>(
private val previousResult: RenderResult<State, RenderContext>?,
val setRootId: Int,
val widthSpec: Int,
val heightSpec: Int,
val sizeConstraints: SizeConstraints,
callable: Callable<RenderResult<State, RenderContext>?>
) :
ThreadInheritingPriorityFuture<RenderResult<State, RenderContext>?>(
callable, "RenderResultFuture") {

@Deprecated(message = "Use the constructor that accepts SizeConstraints")
constructor(
context: Context,
resolveResult: ResolveResult<Node<RenderContext>, State>,
Expand All @@ -38,11 +39,27 @@ class RenderResultFuture<State, RenderContext>(
setRootId: Int,
widthSpec: Int,
heightSpec: Int
) : this(
context,
resolveResult,
renderContext,
extensions,
previousResult,
setRootId,
SizeConstraints.fromMeasureSpecs(widthSpec, heightSpec))

constructor(
context: Context,
resolveResult: ResolveResult<Node<RenderContext>, State>,
renderContext: RenderContext?,
extensions: Array<RenderCoreExtension<*, *>>?,
previousResult: RenderResult<State, RenderContext>?,
setRootId: Int,
sizeConstraints: SizeConstraints
) : this(
previousResult,
setRootId,
widthSpec,
heightSpec,
sizeConstraints,
Callable<RenderResult<State, RenderContext>?> {
RenderResult.render<State, RenderContext>(
context,
Expand All @@ -51,8 +68,7 @@ class RenderResultFuture<State, RenderContext>(
extensions,
previousResult,
setRootId,
widthSpec,
heightSpec)
sizeConstraints)
})

val latestAvailableRenderResult: RenderResult<State, RenderContext>?
Expand Down
Loading

0 comments on commit 3a6e5e0

Please sign in to comment.