vii1 / DIV

Reconstrucción y posible fork de DIV Games Studio 2.0
GNU General Public License v3.0
48 stars 4 forks source link

Problemas con "div_text_out" (div.h) #56

Closed VisualStudioEX3 closed 2 years ago

VisualStudioEX3 commented 2 years ago

Estoy teniendo problemas con la funcion exportada div_text_out, en div.h, en algunos proyectos de DLLs que estoy desarrollando para DIV Games Studio 2 vanilla. Doy por sentado que este repositorio contiene la misma version de la funcion.

En algun caso esta funcion parece provocar algun memory leak y tumba el programa que usa la DLL, en la mayoria directamente la funcion no hace nada (no imprime texto en pantalla).

A falta de documentacion de div.h (que seria interesante documentar a detalle), entiendo que la funcion lo que hace es dibujar en la memoria de video el texto, y que no es necesario estar repintandola en cada frame ni mantener una variable string en el codigo del programa DIV (como usualmente requieren las funciones de texto de DIV). Igualmente he probado a llamar a la funcion dentro de un bucle y usando una cadena declarada en una variable en el codigo del programa de DIV.

Dejo esta DLL de ejemplo:

// PRINT.CPP

#define GLOBALS

#include "div.h"

#define getStringParm() (char*)&mem[text_offset + getparm()]

void print()
{
    int y = getparm();
    int x = getparm();
    char *str = getStringParm();

    div_text_out(str, x, y);

    retval(0);
}

void __export divlibrary(LIBRARY_PARAMS)
{
    COM_export("print", print, 3);
}

void __export divmain(COMMON_PARAMS)
{
    GLOBAL_IMPORT();
}

Y el programa de ejemplo en DIV:

program div_text_out_test;

import "print.dll";

const
    TEXT = "Hello, World!";

begin
    print("Hello, World!", 0, 0); // Using literal expression, and expected to keep in screen.

    loop
        print(TEXT, 0, 10); // Using in memory string constant in every frame.
        frame;
    end
end

Implementacion de div_text_out en el repositorio: https://github.com/vii1/DIV/blob/e427accfb82cc27ad0469529e06a6f734c71b351/src/div32run/s.cpp#L1662

VisualStudioEX3 commented 2 years ago

Un ejemplo de por que habria que documentar div.h.

Revisando el codigo de las DLLs de demostracion, veo que para usar div_text_out y otras funciones para manipular la memoria de video desde la DLL es necesario hacer que la DLL se autocargue, usando la macro Autoload, e implementar el punto de entrada post_process_buffer, desde donde div_text_out funciona sin problemas.

Dejo el codigo corregido y cierro issue.

// PRINT.CPP

#define GLOBALS
#include "div.h"
#define getStringParm() (char*)&mem[text_offset + getparm()]

char *text_buffer;

void post_process_buffer(void)
{
    div_text_out(text_buffer, 0, 0);
}

void print()
{
    text_buffer = getStringParm();

    retval(0);
}

void __export divlibrary(LIBRARY_PARAMS)
{
    COM_export("print", print, 1);
}

void __export divmain(COMMON_PARAMS)
{
    AutoLoad();
    GLOBAL_IMPORT();
    DIV_export("post_process_buffer", post_process_buffer);
}

Y el programa de ejemplo en DIV:

program div_text_out_test;

import "print.dll";

begin
    print("Hello, World!");

    loop
        frame;
    end
end