コード例 #1
0
    def get_thick_samples(self,
                          which: str,
                          thickness: int = -1) -> ThickSpline:
        """TODO: what is get_thick_samples doing?
        """
        logg = logging.getLogger(f"c.{__name__}.get_thick_samples")
        # logg.debug(f"Start get_thick_samples")
        valid_which = self.get_valid_type(which)

        if thickness == -1:
            thickness = self.thickness

        # compute the thick version when needed
        if valid_which not in self.spline_thick_samples:
            logg.debug(
                f"Loading thick spline: {valid_which}, thickness {thickness}")
            self.spline_thick_samples[valid_which] = compute_long_thick_spline(
                self.spline_seq[valid_which], thickness)
            # save the thickness of the loaded letter
            self.spline_loaded_thickness[valid_which] = thickness

        # reload the info if the thickness changed
        if self.spline_loaded_thickness[valid_which] != thickness:
            logg.debug(
                f"Reloading thick spline: {valid_which}, thickness {thickness}"
            )
            self.spline_thick_samples[valid_which] = compute_long_thick_spline(
                self.spline_seq[valid_which], thickness)
            # save the thickness of the loaded letter
            self.spline_loaded_thickness[valid_which] = thickness

        return self.spline_thick_samples[valid_which]
コード例 #2
0
def ex_long_spline(spline_sequence, thickness):
    """
    """
    fig, ax = plt.subplots()

    spline_samples = compute_long_thick_spline(spline_sequence, thickness)

    for glyph in spline_samples:
        for segment in glyph:
            ax.plot(*segment, color="k", marker=".", ls="")

    # plot everything
    plot_utils.plot_build(fig, ax)
コード例 #3
0
def fill_ligature_info(
    input_str: str,
    letters_info: Dict[str, Letter],
    x_stride: float,
    data_dir: Path,
    ligature_dir: Path,
    thickness: int,
) -> Tuple[Dict[str, LigatureInfo], Dict[str, ThickSpline]]:
    """TODO: what is fill_ligature_info doing?
    """
    logg = logging.getLogger(f"c.{__name__}.fill_ligature_info")
    logg.debug(f"Start fill_ligature_info")

    # where to keep the connection info
    ligature_info: Dict[str, LigatureInfo] = {}
    thick_con_info: Dict[str, ThickSpline] = {}

    for i in range(len(input_str) - 1):
        # get the current pair
        pair = input_str[i:i + 2]
        logg.debug(f"\nDoing pair: {pair}")

        # compute info for this pair if needed
        if pair not in ligature_info:
            f_let = letters_info[pair[0]]
            s_let = letters_info[pair[1]]
            ligature_info[pair] = compute_letter_alignement(
                f_let, s_let, x_stride, data_dir, ligature_dir)
        else:
            logg.debug(f"Pair already computed")

        # link all the spline info
        full_spline_con = [ligature_info[pair].f_gly_chop]
        full_spline_con.extend(ligature_info[pair].spline_seq_con)
        # shift the second glyph
        s_gly_chop = deepcopy(ligature_info[pair].s_gly_chop)
        shift = ligature_info[pair].shift
        translate_spline_sequence([s_gly_chop], shift, 0)
        full_spline_con.append(s_gly_chop)

        # precompute the full thick ligature information
        full_thick_con = compute_long_thick_spline(full_spline_con, thickness)
        thick_con_info[pair] = full_thick_con

    return ligature_info, thick_con_info
コード例 #4
0
def plot_letter(pf_input_spline, thickness, color="k"):
    """
    """
    logg = logging.getLogger(f"c.{__name__}.plot_letter")
    logg.debug(f"Starting plot_letter")

    spline_sequence = load_spline(pf_input_spline)
    # logg.debug(f"spline_sequence: {spline_sequence}")

    # inches to point
    ratio = 4 / 1000
    # find plot dimension
    xlim, ylim = find_spline_sequence_bbox(spline_sequence)
    wid = xlim[1] - xlim[0]
    hei = ylim[1] - ylim[0]
    fig_dims = (wid * ratio, hei * ratio)

    fig = plt.figure(figsize=fig_dims, frameon=False)
    fig.canvas.set_window_title(f"{pf_input_spline.stem}")
    ax = fig.add_axes((0, 0, 1, 1))
    ax.set_axis_off()

    spline_samples = compute_long_thick_spline(spline_sequence, thickness)

    colors = ["b", "g", "r", "c", "m", "y", "k"]

    i = 0

    for glyph in spline_samples:
        for segment in glyph:
            if color == "cycle":
                mod = i % len(colors)
                ax.plot(*segment, color=colors[mod], marker=".", ls="")
            elif color in colors:
                ax.plot(*segment, color=color, marker=".", ls="")
            else:
                ax.plot(*segment, color="k", marker=".", ls="")
        i += 1
コード例 #5
0
def ex_align_letters_2(pf_spline_left, pf_spline_right, thickness):
    """TODO: what is ex_align_letters_2 doing?
    """
    logg = logging.getLogger(f"c.{__name__}.ex_align_letters_2")
    logg.debug(f"\nStart ex_align_letters_2")

    spline_sequence_l = load_spline(pf_spline_left)
    spline_sequence_r = load_spline(pf_spline_right)

    # find a proper x_stride for this pair of files
    x_stride = find_align_stride((*spline_sequence_l, *spline_sequence_r))

    t_align2_start = timer()
    spline_sequence_con, r_x_shift_al, con_line_coeff = align_letter_2(
        spline_sequence_l, spline_sequence_r, x_stride
    )
    t_align2_end = timer()
    logg.debug(f"Time to align_letter_2: {t_align2_end - t_align2_start:.6f}")

    # translate the right spline along x axis
    translate_spline_sequence(spline_sequence_r, r_x_shift_al, 0)

    # compute the thick spline
    spline_samples_con = compute_long_thick_spline(spline_sequence_con, thickness)
    spline_samples_l = compute_long_thick_spline(spline_sequence_l, thickness)
    spline_samples_r = compute_long_thick_spline(spline_sequence_r, thickness)

    # find dimension of the plot
    xlim, ylim = find_spline_sequence_bbox(spline_sequence_l)
    xlim, ylim = find_spline_sequence_bbox(spline_sequence_r, xlim, ylim)
    # inches to point
    ratio = 6 / 1000
    wid = xlim[1] - xlim[0]
    hei = ylim[1] - ylim[0]
    fig_dims = (wid * ratio, hei * ratio)

    # create plot
    fig = plt.figure(figsize=fig_dims, frameon=False)
    ax = fig.add_axes((0, 0, 1, 1))
    fig.canvas.set_window_title(f"A2 {pf_spline_left.stem} - {pf_spline_right.stem}")
    ax.set_axis_off()

    # colors = False
    colors = True

    if colors:
        col_list = ["g", "r", "y"]
    else:
        col_list = ["k", "k", "k"]

    for i, spline in enumerate(
        [spline_samples_r, spline_samples_con, spline_samples_l]
    ):
        style = {"color": f"{col_list[i]}", "marker": ".", "ls": ""}
        # logg.debug(f"style: {style}")
        for glyph in spline:
            for segment in glyph:
                ax.plot(*segment, **style)

    # plot the line used
    left_last_op = spline_sequence_l[-1][0]
    right_first_op = spline_sequence_r[0][-1]
    l_line_x_sample = np.linspace(left_last_op.x, right_first_op.x)
    l_line_y_a_sample = poly_model(l_line_x_sample, con_line_coeff, flip_coeff=True)
    ax.plot(l_line_x_sample, l_line_y_a_sample, color="c", ls=":", marker="")
コード例 #6
0
def ex_align_letters_1(pf_spline_left, pf_spline_right, thickness):
    """TODO: what is ex_align_letters_1 doing?

    Align letters
        * high_up/high_up: vi
        * high_up/high_down: vm
        * low_up/low_up: mi
    """
    logg = logging.getLogger(f"c.{__name__}.ex_align_letters_1")
    logg.debug(f"\nStart ex_align_letters_1")
    recap = f"pf_spline_left.stem: {pf_spline_left.stem}"
    recap += f" pf_spline_right.stem {pf_spline_right.stem}"
    logg.debug(recap)

    # load the points in the splines
    spline_sequence_l = load_spline(pf_spline_left)
    spline_sequence_r = load_spline(pf_spline_right)

    # find a proper x_stride for this pair of files
    x_stride = find_align_stride((*spline_sequence_l, *spline_sequence_r))

    t_align1_start = timer()
    spline_sequence_con, gly_chop_l, gly_chop_r, best_shift = align_letter_1(
        spline_sequence_l, spline_sequence_r, x_stride
    )
    t_align1_end = timer()
    logg.debug(f"Time to align_letter_1: {t_align1_end - t_align1_start:.6f}")

    # translate the right spline along x axis
    translate_spline_sequence(spline_sequence_r, best_shift, 0)

    # change the last/first glyphs of the splines
    spline_sequence_l[-1] = gly_chop_l
    spline_sequence_r[0] = gly_chop_r

    # compute the thick spline
    spline_samples_con = compute_long_thick_spline(spline_sequence_con, thickness)
    spline_samples_l = compute_long_thick_spline(spline_sequence_l, thickness)
    spline_samples_r = compute_long_thick_spline(spline_sequence_r, thickness)

    # find dimension of the plot
    xlim, ylim = find_spline_sequence_bbox(spline_sequence_l)
    xlim, ylim = find_spline_sequence_bbox(spline_sequence_r, xlim, ylim)
    # inches to point
    ratio = 6 / 1000
    wid = xlim[1] - xlim[0]
    hei = ylim[1] - ylim[0]
    fig_dims = (wid * ratio, hei * ratio)

    # create plot
    fig = plt.figure(figsize=fig_dims, frameon=False)
    ax = fig.add_axes((0, 0, 1, 1))
    fig.canvas.set_window_title(f"A1 {pf_spline_left.stem} - {pf_spline_right.stem}")
    ax.set_axis_off()

    # colors = False
    colors = True

    if colors:
        col_list = ["g", "r", "y"]
    else:
        col_list = ["k", "k", "k"]

    for i, spline in enumerate(
        [spline_samples_r, spline_samples_con, spline_samples_l]
    ):
        style = {"color": f"{col_list[i]}", "marker": ".", "ls": ""}
        # logg.debug(f"style: {style}")
        for glyph in spline:
            for segment in glyph:
                ax.plot(*segment, **style)