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

io.github.humbleui.skija.TextBlobBuilder Maven / Gradle / Ivy

package io.github.humbleui.skija;

import java.lang.ref.*;
import org.jetbrains.annotations.*;
import io.github.humbleui.skija.impl.*;
import io.github.humbleui.types.*;

public class TextBlobBuilder extends Managed {
    static { Library.staticLoad(); }
    
    @ApiStatus.Internal
    public TextBlobBuilder(long ptr) {
        super(ptr, _FinalizerHolder.PTR);
    }

    /**
     * Constructs empty TextBlobBuilder. By default, TextBlobBuilder has no runs.
     *
     * @see https://fiddle.skia.org/c/@TextBlobBuilder_empty_constructor
     */
    public TextBlobBuilder() {
        this(_nMake());
        Stats.onNativeCall();
    }

    /** 
     * 

Returns TextBlob built from runs of glyphs added by builder. Returned * TextBlob is immutable; it may be copied, but its contents may not be altered. * Returns null if no runs of glyphs were added by builder.

* *

Resets TextBlobBuilder to its initial empty state, allowing it to be * reused to build a new set of runs.

* * @return SkTextBlob or null * * @see https://fiddle.skia.org/c/@TextBlobBuilder_make */ @Nullable public TextBlob build() { try { Stats.onNativeCall(); long ptr = _nBuild(_ptr); return ptr == 0 ? null : new TextBlob(ptr); } finally { Reference.reachabilityFence(this); } } /** * Glyphs are positioned on a baseline at (x, y), using font metrics to * determine their relative placement. * * @param font Font used for this run * @param text Text to append in this run * @param x horizontal offset within the blob * @param y vertical offset within the blob * @return this */ public TextBlobBuilder appendRun(Font font, String text, float x, float y) { return appendRun(font, font.getStringGlyphs(text), x, y, null); } /** *

Glyphs are positioned on a baseline at (x, y), using font metrics to * determine their relative placement.

* *

bounds defines an optional bounding box, used to suppress drawing when TextBlob * bounds does not intersect Surface bounds. If bounds is null, TextBlob bounds * is computed from (x, y) and glyphs metrics.

* * @param font Font used for this run * @param text Text to append in this run * @param x horizontal offset within the blob * @param y vertical offset within the blob * @param bounds optional run bounding box * @return this */ public TextBlobBuilder appendRun(Font font, String text, float x, float y, @Nullable Rect bounds) { return appendRun(font, font.getStringGlyphs(text), x, y, bounds); } /** *

Glyphs are positioned on a baseline at (x, y), using font metrics to * determine their relative placement.

* *

bounds defines an optional bounding box, used to suppress drawing when TextBlob * bounds does not intersect Surface bounds. If bounds is null, TextBlob bounds * is computed from (x, y) and glyphs metrics.

* * @param font Font used for this run * @param glyphs glyphs in this run * @param x horizontal offset within the blob * @param y vertical offset within the blob * @param bounds optional run bounding box * @return this */ public TextBlobBuilder appendRun(Font font, short[] glyphs, float x, float y, @Nullable Rect bounds) { try { Stats.onNativeCall(); _nAppendRun(_ptr, Native.getPtr(font), glyphs, x, y, bounds); return this; } finally { Reference.reachabilityFence(font); } } /** *

Glyphs are positioned on a baseline at y, using x-axis positions from xs.

* * @param font Font used for this run * @param glyphs glyphs in this run * @param xs horizontal positions on glyphs within the blob * @param y vertical offset within the blob * @return this */ public TextBlobBuilder appendRunPosH(Font font, short[] glyphs, float[] xs, float y) { return appendRunPosH(font, glyphs, xs, y, null); } /** *

Glyphs are positioned on a baseline at y, using x-axis positions from xs.

* *

bounds defines an optional bounding box, used to suppress drawing when TextBlob * bounds does not intersect Surface bounds. If bounds is null, TextBlob bounds * is computed from (x, y) and glyphs metrics.

* * @param font Font used for this run * @param glyphs glyphs in this run * @param xs horizontal positions of glyphs within the blob * @param y vertical offset within the blob * @param bounds optional run bounding box * @return this */ public TextBlobBuilder appendRunPosH(Font font, short[] glyphs, float[] xs, float y, @Nullable Rect bounds) { try { assert glyphs.length == xs.length : "glyphs.length " + glyphs.length + " != xs.length " + xs.length; Stats.onNativeCall(); _nAppendRunPosH(_ptr, Native.getPtr(font), glyphs, xs, y, bounds); return this; } finally { Reference.reachabilityFence(font); } } /** *

Glyphs are positioned at positions from pos.

* * @param font Font used for this run * @param glyphs glyphs in this run * @param pos positions of glyphs within the blob * @return this */ public TextBlobBuilder appendRunPos(Font font, short[] glyphs, Point[] pos) { return appendRunPos(font, glyphs, pos, null); } /** *

Glyphs are positioned at positions from pos.

* *

bounds defines an optional bounding box, used to suppress drawing when TextBlob * bounds does not intersect Surface bounds. If bounds is null, TextBlob bounds * is computed from (x, y) and glyphs metrics.

* * @param font Font used for this run * @param glyphs glyphs in this run * @param pos positions of glyphs within the blob * @param bounds optional run bounding box * @return this */ public TextBlobBuilder appendRunPos(Font font, short[] glyphs, Point[] pos, @Nullable Rect bounds) { try { assert glyphs.length == pos.length : "glyphs.length " + glyphs.length + " != pos.length " + pos.length; float[] floatPos = new float[pos.length * 2]; for (int i = 0; i < pos.length; ++i) { floatPos[i * 2] = pos[i]._x; floatPos[i * 2 + 1] = pos[i]._y; } Stats.onNativeCall(); _nAppendRunPos(_ptr, Native.getPtr(font), glyphs, floatPos, bounds); return this; } finally { Reference.reachabilityFence(font); } } public TextBlobBuilder appendRunRSXform(Font font, short[] glyphs, RSXform[] xform) { try { assert glyphs.length == xform.length : "glyphs.length " + glyphs.length + " != xform.length " + xform.length; float[] floatXform = new float[xform.length * 4]; for (int i = 0; i < xform.length; ++i) { floatXform[i * 4] = xform[i]._scos; floatXform[i * 4 + 1] = xform[i]._ssin; floatXform[i * 4 + 2] = xform[i]._tx; floatXform[i * 4 + 3] = xform[i]._ty; } Stats.onNativeCall(); _nAppendRunRSXform(_ptr, Native.getPtr(font), glyphs, floatXform); return this; } finally { Reference.reachabilityFence(font); } } @ApiStatus.Internal public static class _FinalizerHolder { public static final long PTR = _nGetFinalizer(); } @ApiStatus.Internal public static native long _nGetFinalizer(); @ApiStatus.Internal public static native long _nMake(); @ApiStatus.Internal public static native long _nBuild(long ptr); @ApiStatus.Internal public static native void _nAppendRun(long ptr, long fontPtr, short[] glyphs, float x, float y, Rect bounds); @ApiStatus.Internal public static native void _nAppendRunPosH(long ptr, long fontPtr, short[] glyphs, float[] xs, float y, Rect bounds); @ApiStatus.Internal public static native void _nAppendRunPos(long ptr, long fontPtr, short[] glyphs, float[] pos, Rect bounds); @ApiStatus.Internal public static native void _nAppendRunRSXform(long ptr, long fontPtr, short[] glyphs, float[] xform); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy