OBS1: como o nome do projeto diz, é somente para o compilador TCC
OBS2: os BITMAPS não está implementado "clipping" e por isso não se deve escrever fora do tamanho do BITMAP ...
Pelo que vi agora (2019/05/06 00:15), achei algumas coisas estranhas em sg.h.
• Linhas 4 e 6, bem como 5 e 7, são redefinições dos mesmos tipos.
• Se Uint16 e Uint32 são redefinições dos tipos padronizados uint16_t e uint32_t (que, por sua vez, são apelidos para tipos nativos), para que criar mais nomes para os mesmos tipos?
• Se você usou typedef para esses dois apelidos, por que usou macro para definir UCHAR? E por que a diferença de estilo entre os nomes (tudo maiúsculo × apena primeira letra maiúscula)?
• Cadê os cabeçalhos das funções definidas em sg.c?
• Não seria conveniente usar include guards para evitar problemas de reinclusão do mesmo cabeçalho?
• Por que redeifinir símbolos que estão em outras partes da biblioteca, em vez de usar os arquivos de cabeçalho que acompanham essas partes da biblioteca?
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)
Pelo que vi agora (2019/05/06 00:15), achei algumas coisas estranhas em sg.h.
• Linhas 4 e 6, bem como 5 e 7, são redefinições dos mesmos tipos.
• Se Uint16 e [/i]Uint32[/i] são redefinições dos tipos padronizados uint16_t e uint32_t (que, por sua vez, são apelidos para tipos nativos), para que criar mais nomes para os mesmos tipos?
• Se você usou typedef para esses dois apelidos, por que usou macro para definir UCHAR? E por que a diferença de estilo entre os nomes (tudo maiúsculo × apena primeira letra maiúscula)?
• Cadê os cabeçalhos das funções definidas em sg.c?
• Não seria conveniente usar include guards para evitar problemas de reinclusão do mesmo cabeçalho?
• Por que redeifinir símbolos que estão em outras partes da biblioteca, em vez de usar os arquivos de cabeçalho que acompanham essas partes da biblioteca?
RESPOSTAS:
a) • Se Uint16 e [/i]Uint32[/i] são redefinições dos tipos padronizados uint16_t e uint32_t (que, por sua vez, são apelidos para tipos nativos), para que criar mais nomes para os mesmos tipos?
Para mim esses tipos são novos ... por isso redefini, mas olhando o arquivo ( stddef.h ) vi que estavam definidos lá.
b) • Se você usou typedef para esses dois apelidos, por que usou macro para definir UCHAR? E por que a diferença de estilo entre os nomes (tudo maiúsculo × apena primeira letra maiúscula)?
Preferi definir UCHAR como um macro ... por isso "TODO MAIÚSCULO".
c) • Cadê os cabeçalhos das funções definidas em sg.c?
Fiz tudo nas pressas então fica no BETA ainda ... depois vou definir .
d) • Por que redeifinir símbolos que estão em outras partes da biblioteca, em vez de usar os arquivos de cabeçalho que acompanham essas partes da biblioteca?
Se você se refere a isso ?
---------------------------------------------------------------
int open (const char *path, int oflag, ...);
int close (int fd);
int ioctl (int fd, unsigned long request, ...);
void *mmap (void *addr, size_t length, int prot, int flags, int fd, int offset);
int munmap (void *addr, size_t len);
---------------------------------------------------------------
Se a resposta acima for sim então vai a info:
O compilador TCC não tem essas acima definidas ...
Se esqueci algo favor informar ...
OBS: já fiz as correções lá no projeto ...
Estou implementando para compilar com o GCC também ... quem quiser compilar usando o GCC basta incluir isso no arquivo ( sg.c ):
-----------------------------------------------------
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <time.h>
-----------------------------------------------------
E retirar as linhas com:
-----------------------------------------------------
#include <tcclib.h>
#include "sg.h"
-----------------------------------------------------
E modificar isso:
struct sg_var_screeninfo
struct sg_fix_screeninfo
Para isso:
struct fb_var_screeninfo
struct fb_fix_screeninfo
E obrigado "paulo1205" pela as observações ... fique a vontade para comentar ...
4. Re: Linux Frame Buffer para TCC
gokernelusa Linux Mint
Post recolhido
Enviado em 06/05/2019 - 11:50h
Pronto atualizado e testado mas BETA ainda ...
Vou implementar melhor ( sgBlit32() ) ... para uma melhor velocidade ...
5. Re: Linux Frame Buffer para TCC
gokernelusa Linux Mint
Post recolhido
Enviado em 06/05/2019 - 18:27h
Projeto atualizado e função( sgBlit32 ) melhor implementada !
O que fiz foi isso ... função de baixo melhor implementada:
//-------------------------------------------------------------------
// O BMP tem um tamanho de:
// 800 x 600
//
// entao o LOOP para copiar todos os bytes seria de:
//
// 600 * 800 * 4 = 1.920.000
//
// RESUMO:
// funcao lenta devido ao LOOP grande ...
//
//-------------------------------------------------------------------
//
void sgBlit32 (BMP *bmp) {
int i, y;
register UCHAR *data = bmp->data;
// loop 2: 800 * 4
for (i = 0; i < bmp->w * 4; i++) {
*p++ = *data++; // copia apenas 1 byte de cada vez ... PESSIMA IDEIA ;)
}
}
}
//-------------------------------------------------------------------
// O BMP tem um tamanho de:
// 800 x 600
//
// entao o LOOP para copiar todos os bytes seria de:
//
// 600 * 800 = 480.000
//
// RESUMO:
// funcao MELHORADA devido ao LOOP MENOR ...
//
// DETALHE:
// nessa funcao copia 4 bytes de uma vez ... na funcao acima copia apenas 1 byte ...
//
//-------------------------------------------------------------------
//
void sgBlit32 (BMP *bmp) {
int i, y;
register UCHAR *data = bmp->data;
// loop 2: 800
for (i = 0; i < bmp->w; i++) {
//
// ... copy 4 bytes ... ;)
//
*(unsigned int *)( p ) = *(unsigned int *)( data );
p += 4;
data += 4;
}
}
}
RESUMO:
O loop que era grande ( 1.920.000 ) ficou menor ( 480.000 )...
OBS:
Depois vou tentar melhorar mais a velocidade dessa função ... ;)
6. Re: Linux Frame Buffer para TCC
gokernelusa Linux Mint
Post recolhido
Enviado em 07/05/2019 - 18:56h
Olá pessoal !
Atualizei o projeto e fiz um test de FPS(Frames Por Segundos) ...
No meu Note Core i3 ficou assim os resultados:
-----------------------------------------------------------------
1: Com a implementação antiga de ( sgBlit32() ), o FPS ficou em media:
137 FPS.
2: Com a implementação melhorada de ( sgBlit32() ), o FPS ficou em media:
550 FPS.
-----------------------------------------------------------------
Projeto atualizado e Implementado desenho ( 16 e 32 BPP):
// 16/32 BPP:
LIBIMPORT void sgDrawRect (BMP *bmp, int x, int y, int w, int h, int color);
LIBIMPORT void sgDrawText (BMP *bmp, char *text, int x, int y, int color);