summaryrefslogtreecommitdiff
path: root/src/render/renderer_momo.c
blob: 02ccaee76c080f79c9a43b5f0d629dad0aa30fd4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#define AL_LOG_SECTION "renderer_momo"
#include <al/log.h>

#include "renderer_momo.h"
#include "queue_momo.h"

static void renderer_momo_resize(struct camu_renderer *renderer, u32 *width, u32 *height)
{
    struct camu_renderer_momo *mr = (struct camu_renderer_momo *)renderer;
    (void)mr;
    (void)width;
    (void)height;
}

static void renderer_momo_set(struct camu_renderer *renderer, u8 option, u8 value)
{
    struct camu_renderer_momo *mr = (struct camu_renderer_momo *)renderer;
    (void)mr;
    (void)option;
    (void)value;
}

static bool renderer_momo_create_renderer(struct camu_renderer *renderer, u32 *width, u32 *height,
#if defined STELA_API_OPENGL
#ifdef STELA_USE_EGL
    EGLDisplay display,
    EGLContext context,
#endif
    void (*get_gl_proc_address(char const *))(void),
    bool (*gl_load_loader)(void *),
    bool (*gl_make_current)(void *),
    void (*gl_release_current)(void *),
    void (*gl_swap_buffers)(void *),
#endif
    void *priv)
{
    struct camu_renderer_momo *mr = (struct camu_renderer_momo *)renderer;
    (void)width;
    (void)height;
#if defined STELA_API_OPENGL
#ifdef STELA_USE_EGL
    (void)display;
    (void)context;
#endif
    (void)get_gl_proc_address;
    (void)gl_load_loader;
    MOMO_Init(&mr->mmr, gl_make_current, gl_release_current, gl_swap_buffers, priv);
#endif
#ifdef CAMU_HAVE_SUBTITLES
    mr->ass = ass_library_init();
    // Just to keep these linked in the exe for platform testing.
    ASS_Renderer *ar = ass_renderer_init(mr->ass);
    ASS_Track *at = ass_new_track(mr->ass);
    u32 w = *width, h = *height;
    ass_set_frame_size(ar, w, h);
    ass_set_storage_size(ar, w, h);
    ass_set_fonts(ar, NULL, NULL, ASS_FONTPROVIDER_AUTODETECT, NULL, 0);
    ass_set_hinting(ar, ASS_HINTING_NONE);
    ass_free_track(at);
    ass_renderer_done(ar);
#endif
    return true;
}

static struct camu_frame_queue *renderer_momo_create_queue(struct camu_renderer *renderer)
{
    struct camu_renderer_momo *mr = (struct camu_renderer_momo *)renderer;
    struct camu_frame_queue *q = camu_frame_queue_momo_create();
    struct camu_frame_queue_momo *mq = (struct camu_frame_queue_momo *)q;
    (void)mr;
    (void)mq;
    return q;
}

static void renderer_momo_add_font(struct camu_renderer *renderer, struct camu_codec_stream *attachment)
{
    struct camu_renderer_momo *mr = (struct camu_renderer_momo *)renderer;
    (void)mr;
    (void)attachment;
}

static u32 renderer_momo_get_latency(struct camu_renderer *renderer)
{
    (void)renderer;
    return 0;
}

static bool renderer_momo_render(struct camu_renderer *renderer, struct camu_screen *scr, bool force)
{
    struct camu_renderer_momo *mr = (struct camu_renderer_momo *)renderer;
    (void)scr;
    (void)force;
    MOMO_Render(&mr->mmr);
    return true;
}

static void renderer_momo_free(struct camu_renderer **renderer)
{
    struct camu_renderer_momo *mr = (struct camu_renderer_momo *)*renderer;
#ifdef CAMU_HAVE_SUBTITLES
    if (mr->ass) ass_library_done(mr->ass);
#endif
    al_free(mr);
    *renderer = NULL;
}

struct camu_renderer *camu_renderer_momo_create(void)
{
    struct camu_renderer_momo *mr = al_alloc_object(struct camu_renderer_momo);
    mr->r.create_renderer = renderer_momo_create_renderer;
    mr->r.create_queue = renderer_momo_create_queue;
    mr->r.add_font = renderer_momo_add_font;
    mr->r.get_latency = renderer_momo_get_latency;
    mr->r.resize = renderer_momo_resize;
    mr->r.set = renderer_momo_set;
    mr->r.render = renderer_momo_render;
    mr->r.free = renderer_momo_free;
    return (struct camu_renderer *)mr;
}