Initial. Don't... just don't ask.
This commit is contained in:
commit
00bae13bba
586 changed files with 129057 additions and 0 deletions
186
gl/cbitmap.c
Normal file
186
gl/cbitmap.c
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
/* Framebuffer Graphics Libary for Linux, Copyright 1993 Harm Hanemaayer */
|
||||
/* cbitmap.c Compiled bitmaps */
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <vga.h>
|
||||
#include "inlstring.h" /* include inline string operations */
|
||||
|
||||
#include "vgagl.h"
|
||||
#include "def.h"
|
||||
|
||||
|
||||
|
||||
void gl_compileboxmask(int w, int h, void *_dp1, void *_dp2)
|
||||
{
|
||||
/* Compiled format: <bytes_to_skip (0-254)><number_of_pixels (0-255)> */
|
||||
/* <pixel_data>[<end_of_line(255)>]... */
|
||||
uchar *dp1 = _dp1;
|
||||
uchar *dp2 = _dp2;
|
||||
int i;
|
||||
for (i = 0; i < h; i++) {
|
||||
int x = 0;
|
||||
while (x < w) {
|
||||
int count;
|
||||
/* count zeroes */
|
||||
count = 0;
|
||||
while (x < w && *(dp1 + count) == 0 && count < 254) {
|
||||
count++;
|
||||
x++;
|
||||
}
|
||||
dp1 += count;
|
||||
if (x < w) {
|
||||
*dp2++ = count;
|
||||
/* count nonzeroes */
|
||||
count = 0;
|
||||
while (x < w && *(dp1 + count) != 0 && count < 255) {
|
||||
*(dp2 + count + 1) = *(dp1 + count);
|
||||
count++;
|
||||
x++;
|
||||
}
|
||||
*dp2 = count;
|
||||
dp2 += count + 1;
|
||||
dp1 += count;
|
||||
}
|
||||
}
|
||||
*dp2++ = 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
int gl_compiledboxmasksize(int w, int h, void *_dp1)
|
||||
{
|
||||
/* Compiled format: <bytes_to_skip (0-254)><number_of_pixels (0-255)> */
|
||||
/* <pixel_data>[<end_of_line(255)>]... */
|
||||
uchar *dp1 = _dp1;
|
||||
int size = 0;
|
||||
int i;
|
||||
for (i = 0; i < h; i++) {
|
||||
int x = 0;
|
||||
while (x < w) {
|
||||
int count;
|
||||
/* count zeroes */
|
||||
count = 0;
|
||||
while (x < w && *(dp1 + count) == 0 && count < 254) {
|
||||
count++;
|
||||
x++;
|
||||
}
|
||||
size++;
|
||||
dp1 += count;
|
||||
/* count nonzeroes */
|
||||
if (x < w) {
|
||||
count = 0;
|
||||
while (x < w && *(dp1 + count) != 0 && count < 255) {
|
||||
count++;
|
||||
x++;
|
||||
}
|
||||
size += count + 1;
|
||||
dp1 += count;
|
||||
}
|
||||
}
|
||||
size++;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
static void gl_putboxmaskcompiledclip(int nx, int ny, int nw, int nh, int _x,
|
||||
int _y, int w, int h, void *_dp)
|
||||
{
|
||||
/* Special case costly clipping */
|
||||
uchar *dp = _dp;
|
||||
uchar *vp, *vpline;
|
||||
int y;
|
||||
vpline = VBUF + _y * BYTEWIDTH + _x;
|
||||
for (y = _y; y < ny + nh; y++) {
|
||||
int x = _x;
|
||||
vp = vpline;
|
||||
for (;;) {
|
||||
int count = *dp++;
|
||||
if (count == 0xff)
|
||||
break; /* end of line */
|
||||
vp += count;
|
||||
x += count;
|
||||
count = *dp++;
|
||||
/* __memcpy gives severe bug here */
|
||||
if (y >= ny) {
|
||||
if (x >= nx)
|
||||
if (x + count > __clipx2 + 1) {
|
||||
if (x <= __clipx2)
|
||||
__memcpyb(vp, dp, __clipx2 - x + 1);
|
||||
} else
|
||||
__memcpyb(vp, dp, count);
|
||||
else if (x + count > __clipx1) {
|
||||
if (x + count > __clipx2 + 1)
|
||||
__memcpyb(vp + __clipx1 - x,
|
||||
dp + __clipx1 - x,
|
||||
__clipx2 - __clipx1 + 1);
|
||||
else
|
||||
__memcpy(vp + __clipx1 - x,
|
||||
dp + __clipx1 - x,
|
||||
count - __clipx1 + x);
|
||||
};
|
||||
};
|
||||
x += count;
|
||||
vp += count;
|
||||
dp += count;
|
||||
}
|
||||
vpline += BYTEWIDTH;
|
||||
}
|
||||
}
|
||||
|
||||
#define ADJUSTBITMAPBOX() \
|
||||
nw = w; nh = h; nx = x; ny = y; \
|
||||
if (nx + nw < __clipx1 || nx > __clipx2) \
|
||||
return; \
|
||||
if (ny + nh < __clipy1 || ny > __clipy2) \
|
||||
return; \
|
||||
if (nx < __clipx1) { /* left adjust */ \
|
||||
nw += nx - __clipx1; \
|
||||
nx = __clipx1; \
|
||||
} \
|
||||
if (ny < __clipy1) { /* top adjust */ \
|
||||
nh += ny - __clipy1; \
|
||||
ny = __clipy1; \
|
||||
} \
|
||||
if (nx + nw > __clipx2) /* right adjust */ \
|
||||
nw = __clipx2 - nx + 1; \
|
||||
if (ny + nh > __clipy2) /* bottom adjust */ \
|
||||
nh = __clipy2 - ny + 1; \
|
||||
|
||||
|
||||
void gl_putboxmaskcompiled(int x, int y, int w, int h, void *_dp)
|
||||
{
|
||||
/* no clipping */
|
||||
uchar *dp = _dp;
|
||||
uchar *vp, *vpline;
|
||||
int i;
|
||||
if (MODETYPE != CONTEXT_LINEAR && MODETYPE != CONTEXT_VIRTUAL) {
|
||||
printf("vgagl: putboxmaskcompiled only supported in linear framebuffer\n");
|
||||
return;
|
||||
}
|
||||
if (__clip) {
|
||||
int nx, ny, nw, nh;
|
||||
ADJUSTBITMAPBOX();
|
||||
if (nw != w || nh != h) {
|
||||
gl_putboxmaskcompiledclip(nx, ny, nw, nh, x, y, w, h,
|
||||
dp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
vpline = VBUF + y * BYTEWIDTH + x;
|
||||
for (i = 0; i < h; i++) {
|
||||
vp = vpline;
|
||||
for (;;) {
|
||||
int count = *dp++;
|
||||
if (count == 0xff)
|
||||
break; /* end of line */
|
||||
vp += count;
|
||||
count = *dp++;
|
||||
/* __memcpy gives severe bug here */
|
||||
__memcpyb(vp, dp, count);
|
||||
vp += count;
|
||||
dp += count;
|
||||
}
|
||||
vpline += BYTEWIDTH;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue