All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fernice.flare.engine.kt Maven / Gradle / Ivy

/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package org.fernice.flare

import org.fernice.flare.dom.Device
import org.fernice.flare.dom.Element
import org.fernice.flare.dom.ElementStyles
import org.fernice.flare.font.FontMetricsProvider
import org.fernice.flare.style.ElementStyleResolver
import org.fernice.flare.style.MatchingResult
import org.fernice.flare.style.Stylist
import org.fernice.flare.style.context.StyleContext
import org.fernice.flare.style.QuirksMode

class Engine(
    val device: Device,
    val stylist: Stylist,
    private val fontMetricsProvider: FontMetricsProvider,
) {

    companion object {
        fun new(device: Device, fontMetricsProvider: FontMetricsProvider): Engine {
            return Engine(
                device,
                Stylist(device, QuirksMode.NoQuirks),
                fontMetricsProvider
            )
        }
    }

    fun createEngineInstance(deviceFactory: (Device) -> Device): EngineInstance {
        val derivedDevice = deviceFactory(device)
        return EngineInstance(
            derivedDevice,
            this,
        )
    }

    fun restyle(device: Device, element: Element) {
        val context = createEngineContext(device)

        restyle(element, context)
    }

    private fun restyle(element: Element, context: EngineContext) {
        style(element, context)

        for (child in element.children) {
            restyle(child, context)
        }
    }

    fun createEngineContext(device: Device): EngineContext {
        return EngineContextImpl(
            StyleContext(
                device,
                stylist,
                fontMetricsProvider
            )
        )
    }

    fun style(element: Element, context: EngineContext): ElementStyles {
        context.styleContext.prepare(element)

        val styleResolver = ElementStyleResolver(element, context.styleContext)
        val styles = styleResolver.resolveStyleWithDefaultParentStyles()

        val previousStyles = element.styles

        element.finishRestyle(context.styleContext, previousStyles, styles)

        return styles
    }

    fun matchStyle(device: Device, element: Element): MatchingResult {
        val context = createEngineContext(device)

        context.styleContext.prepare(element)

        val styleResolver = ElementStyleResolver(element, context.styleContext)

        return styleResolver.matchPrimaryStyle()
    }
}

class EngineInstance(
    val device: Device,
    private val engine: Engine,
) {

    fun restyle(element: Element) {
        engine.restyle(device, element)
    }

    fun createEngineContext(): EngineContext {
        return engine.createEngineContext(device)
    }

    fun style(element: Element, context: EngineContext): ElementStyles {
        return engine.style(element, context)
    }

    fun matchStyles(element: Element): MatchingResult {
        return engine.matchStyle(device, element)
    }
}

interface EngineContext {
    val styleContext: StyleContext
}

private class EngineContextImpl(
    override val styleContext: StyleContext,
) : EngineContext




© 2015 - 2025 Weber Informatics LLC | Privacy Policy