mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-07-01 13:50:36 +00:00
Merge pull request #102 from mkilgore/undo-existing-libqb-separation
Undo existing libqb.cpp separation
This commit is contained in:
commit
244bd2dab9
|
@ -16,6 +16,6 @@ echo Extracting %MINGW% as C++ Compiler
|
|||
%MINGW% -y -o"./internal/c/c_compiler/"
|
||||
|
||||
echo Bootstrapping QB64
|
||||
internal\c\c_compiler\bin\mingw32-make.exe OS=win BUILD_QB64=y EXE=.\qb64_bootstrap.exe
|
||||
internal\c\c_compiler\bin\mingw32-make.exe -j8 OS=win BUILD_QB64=y EXE=.\qb64_bootstrap.exe
|
||||
IF ERRORLEVEL 1 exit /b 1
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
OS=$1
|
||||
|
||||
echo -n "Bootstrapping QB64..."
|
||||
make OS=$OS BUILD_QB64=y EXE=./qb64_bootstrap
|
||||
make -j8 OS=$OS BUILD_QB64=y EXE=./qb64_bootstrap
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "QB64 bootstrap failed"
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
os=$1
|
||||
|
||||
./qb64_bootstrap -x -w source/qb64.bas
|
||||
SUCCESS=$?
|
||||
|
||||
|
@ -11,6 +13,6 @@ rm internal/temp/qb64_bootstrap.sym
|
|||
|
||||
mv internal/temp/* internal/source/
|
||||
|
||||
make clean OS=lnx
|
||||
make clean OS=$os
|
||||
|
||||
exit $SUCCESS
|
||||
|
|
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -68,7 +68,7 @@ jobs:
|
|||
|
||||
- name: Compile Linux/OSX
|
||||
if: ${{ matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' }}
|
||||
run: .ci/compile.sh
|
||||
run: .ci/compile.sh ${{ matrix.prefix }}
|
||||
|
||||
- name: Compile Windows
|
||||
if: ${{ matrix.os == 'windows-latest' }}
|
||||
|
|
4
Makefile
4
Makefile
|
@ -161,7 +161,7 @@ include $(PATH_INTERNAL_C)/parts/video/font/ttf/build.mk
|
|||
|
||||
QBLIB_NAME := libqb_make_
|
||||
|
||||
CLEAN_LIST += $(wildcard $(PATH_INTERNAL_C)/libqb/$(QBLIB_NAME)*.o)
|
||||
CLEAN_LIST += $(wildcard $(PATH_INTERNAL_C)/$(QBLIB_NAME)*.o)
|
||||
|
||||
ifneq ($(filter y,$(DEP_GL)),)
|
||||
CXXFLAGS += -DDEPENDENCY_GL
|
||||
|
@ -314,7 +314,7 @@ ifneq ($(filter y,$(DEP_DATA)),)
|
|||
EXE_OBJS += $(PATH_INTERNAL_TEMP)/data.o
|
||||
endif
|
||||
|
||||
QBLIB := $(PATH_INTERNAL_C)/libqb/$(QBLIB_NAME).o
|
||||
QBLIB := $(PATH_INTERNAL_C)/$(QBLIB_NAME).o
|
||||
|
||||
ifneq ($(OS),osx)
|
||||
$(QBLIB): $(PATH_INTERNAL_C)/libqb.cpp
|
||||
|
|
2395
internal/c/libqb.cpp
2395
internal/c/libqb.cpp
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,274 +0,0 @@
|
|||
// Common
|
||||
int32 requestedKeyboardOverlayImage = 0;
|
||||
|
||||
#ifndef QB64_GUI // begin stubs
|
||||
|
||||
// STUB: simulate generating a hardware surface
|
||||
int32 new_hardware_img(int32 x, int32 y, uint32 *pixels, int32 flags) {
|
||||
// create hardware img
|
||||
int32 handle;
|
||||
hardware_img_struct *hardware_img;
|
||||
handle = list_add(hardware_img_handles);
|
||||
hardware_img = (hardware_img_struct *)list_get(hardware_img_handles, handle);
|
||||
hardware_img->w = x;
|
||||
hardware_img->h = y;
|
||||
hardware_img->dest_context_handle = 0;
|
||||
hardware_img->depthbuffer_handle = 0;
|
||||
hardware_img->pending_commands = 0;
|
||||
hardware_img->remove = 0;
|
||||
hardware_img->alpha_disabled = 0;
|
||||
hardware_img->depthbuffer_mode = DEPTHBUFFER_MODE__ON;
|
||||
hardware_img->valid = 1;
|
||||
hardware_img->source_state.PO2_fix = PO2_FIX__OFF;
|
||||
hardware_img->source_state.texture_wrap = TEXTURE_WRAP_MODE__UNKNOWN;
|
||||
hardware_img->source_state.smooth_stretched = SMOOTH_MODE__UNKNOWN;
|
||||
hardware_img->source_state.smooth_shrunk = SMOOTH_MODE__UNKNOWN;
|
||||
if (flags & NEW_HARDWARE_IMG__BUFFER_CONTENT) {
|
||||
hardware_img->texture_handle = 0;
|
||||
if (flags & NEW_HARDWARE_IMG__DUPLICATE_PROVIDED_BUFFER) {
|
||||
hardware_img->software_pixel_buffer = NULL;
|
||||
} else {
|
||||
free(pixels); // the buffer was meant to be consumed, so we just
|
||||
// free it immediately
|
||||
hardware_img->software_pixel_buffer = NULL;
|
||||
}
|
||||
}
|
||||
return handle;
|
||||
}
|
||||
|
||||
#else // end stubs
|
||||
|
||||
int32 force_NPO2_fix = 0; // This should only be set to 1 for debugging QB64
|
||||
|
||||
uint32 *NPO2_buffer = (uint32 *)malloc(4);
|
||||
int32 NPO2_buffer_size_in_pixels = 1;
|
||||
|
||||
uint32 *NPO2_texture_generate(int32 *px, int32 *py, uint32 *pixels) {
|
||||
int32 ox = *px;
|
||||
int32 oy = *py;
|
||||
int32 nx = 1;
|
||||
int32 ny = 1;
|
||||
|
||||
// assume not negative & not 0
|
||||
while ((ox & 1) == 0) {
|
||||
ox >>= 1;
|
||||
nx <<= 1;
|
||||
}
|
||||
if (ox != 1) { // x is not a power of 2
|
||||
while (ox != 0) {
|
||||
ox >>= 1;
|
||||
nx <<= 1;
|
||||
}
|
||||
nx << 1;
|
||||
}
|
||||
while ((oy & 1) == 0) {
|
||||
oy >>= 1;
|
||||
ny <<= 1;
|
||||
}
|
||||
if (oy != 1) { // y is not a power of 2
|
||||
while (oy != 0) {
|
||||
oy >>= 1;
|
||||
ny <<= 1;
|
||||
}
|
||||
ny << 1;
|
||||
}
|
||||
|
||||
// reset original values
|
||||
ox = *px;
|
||||
oy = *py;
|
||||
|
||||
if (nx == ox && ny == oy) { // no action required
|
||||
return pixels;
|
||||
}
|
||||
|
||||
int32 size_in_pixels = nx * ny;
|
||||
if (size_in_pixels > NPO2_buffer_size_in_pixels) {
|
||||
NPO2_buffer = (uint32 *)realloc(NPO2_buffer, size_in_pixels * 4);
|
||||
NPO2_buffer_size_in_pixels = size_in_pixels;
|
||||
}
|
||||
|
||||
// copy source NPO2 rectangle into destination PO2 rectangle
|
||||
if (nx == ox) { // can copy as a single block
|
||||
memcpy(NPO2_buffer, pixels, ox * oy * 4);
|
||||
} else {
|
||||
uint32 *dst_pixel_offset = NPO2_buffer;
|
||||
uint32 *src_pixel_offset = pixels;
|
||||
while (oy--) {
|
||||
memcpy(dst_pixel_offset, src_pixel_offset, ox * 4);
|
||||
dst_pixel_offset += nx;
|
||||
src_pixel_offset += ox;
|
||||
}
|
||||
oy = *py;
|
||||
}
|
||||
|
||||
// tidy edges - extend the right-most column and bottom-most row to avoid
|
||||
// pixel/color bleeding rhs column
|
||||
if (ox != nx) {
|
||||
for (int y = 0; y < oy; y++) {
|
||||
NPO2_buffer[ox + nx * y] = NPO2_buffer[ox + nx * y - 1];
|
||||
}
|
||||
}
|
||||
// bottom row + 1 pixel for corner
|
||||
if (oy != ny) {
|
||||
for (int x = 0; x < (ox + 1); x++) {
|
||||
NPO2_buffer[nx * oy + x] = NPO2_buffer[nx * oy + x - nx];
|
||||
}
|
||||
}
|
||||
|
||||
// int maxtexsize;
|
||||
// glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxtexsize);
|
||||
// alert(maxtexsize);
|
||||
|
||||
// alert(nx);
|
||||
// alert(ny);
|
||||
|
||||
*px = nx;
|
||||
*py = ny;
|
||||
|
||||
return NPO2_buffer;
|
||||
}
|
||||
|
||||
int32 new_texture_handle() {
|
||||
GLuint texture = 0;
|
||||
glGenTextures(1, &texture);
|
||||
return (int32)texture;
|
||||
}
|
||||
|
||||
int32 new_hardware_img(int32 x, int32 y, uint32 *pixels, int32 flags) {
|
||||
// note: non power-of-2 dimensioned textures are supported on modern 3D
|
||||
// cards and
|
||||
// even on some older cards, as long as mip-mapping is not being used
|
||||
// therefore, no attempt is made to convert the non-power-of-2 SCREEN
|
||||
// sizes via software to avoid the performance hit this would incur
|
||||
// create hardware img
|
||||
int32 handle;
|
||||
hardware_img_struct *hardware_img;
|
||||
handle = list_add(hardware_img_handles);
|
||||
hardware_img = (hardware_img_struct *)list_get(hardware_img_handles, handle);
|
||||
hardware_img->w = x;
|
||||
hardware_img->h = y;
|
||||
hardware_img->dest_context_handle = 0;
|
||||
hardware_img->depthbuffer_handle = 0;
|
||||
hardware_img->pending_commands = 0;
|
||||
hardware_img->remove = 0;
|
||||
hardware_img->alpha_disabled = 0;
|
||||
hardware_img->depthbuffer_mode = DEPTHBUFFER_MODE__ON;
|
||||
hardware_img->valid = 1;
|
||||
hardware_img->source_state.PO2_fix = PO2_FIX__OFF;
|
||||
hardware_img->source_state.texture_wrap = TEXTURE_WRAP_MODE__UNKNOWN;
|
||||
hardware_img->source_state.smooth_stretched = SMOOTH_MODE__UNKNOWN;
|
||||
hardware_img->source_state.smooth_shrunk = SMOOTH_MODE__UNKNOWN;
|
||||
|
||||
if (flags & NEW_HARDWARE_IMG__BUFFER_CONTENT) {
|
||||
hardware_img->texture_handle = 0;
|
||||
if (flags & NEW_HARDWARE_IMG__DUPLICATE_PROVIDED_BUFFER) {
|
||||
hardware_img->software_pixel_buffer = (uint32 *)malloc(x * y * 4);
|
||||
memcpy(hardware_img->software_pixel_buffer, pixels, x * y * 4);
|
||||
} else {
|
||||
hardware_img->software_pixel_buffer = pixels;
|
||||
}
|
||||
} else {
|
||||
hardware_img->software_pixel_buffer = NULL;
|
||||
hardware_img->texture_handle = new_texture_handle();
|
||||
glBindTexture(GL_TEXTURE_2D, hardware_img->texture_handle);
|
||||
// non-power of 2 dimensions fallback support
|
||||
static int glerrorcode;
|
||||
glerrorcode = glGetError(); // clear any previous errors
|
||||
if (force_NPO2_fix == 0)
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
|
||||
glerrorcode = glGetError();
|
||||
if (glerrorcode != 0 || force_NPO2_fix == 1) {
|
||||
int32 nx = x, ny = y;
|
||||
uint32 *npixels = NPO2_texture_generate(&nx, &ny, pixels);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nx, ny, 0, GL_BGRA, GL_UNSIGNED_BYTE, npixels);
|
||||
hardware_img->source_state.PO2_fix = PO2_FIX__EXPANDED;
|
||||
hardware_img->PO2_w = nx;
|
||||
hardware_img->PO2_h = ny;
|
||||
glerrorcode = glGetError();
|
||||
if (glerrorcode) {
|
||||
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, x, y, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
|
||||
glerrorcode = glGetError();
|
||||
if (glerrorcode) {
|
||||
alert("gluBuild2DMipmaps failed");
|
||||
alert(glerrorcode);
|
||||
}
|
||||
hardware_img->source_state.PO2_fix = PO2_FIX__MIPMAPPED;
|
||||
hardware_img->PO2_w = x;
|
||||
hardware_img->PO2_h = y;
|
||||
}
|
||||
}
|
||||
set_render_source(INVALID_HARDWARE_HANDLE);
|
||||
}
|
||||
return handle;
|
||||
}
|
||||
|
||||
void hardware_img_buffer_to_texture(int32 handle) {
|
||||
static hardware_img_struct *hardware_img;
|
||||
hardware_img = (hardware_img_struct *)list_get(hardware_img_handles, handle);
|
||||
if (hardware_img->texture_handle == 0) {
|
||||
hardware_img->texture_handle = new_texture_handle();
|
||||
glBindTexture(GL_TEXTURE_2D, hardware_img->texture_handle);
|
||||
// non-power of 2 dimensions fallback support
|
||||
static int glerrorcode;
|
||||
glerrorcode = glGetError(); // clear any previous errors
|
||||
if (force_NPO2_fix == 0)
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, hardware_img->w, hardware_img->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, hardware_img->software_pixel_buffer);
|
||||
glerrorcode = glGetError();
|
||||
if (glerrorcode != 0 || force_NPO2_fix == 1) {
|
||||
hardware_img->source_state.PO2_fix = PO2_FIX__EXPANDED;
|
||||
int32 x = hardware_img->w;
|
||||
int32 y = hardware_img->h;
|
||||
uint32 *pixels = NPO2_texture_generate(&x, &y, hardware_img->software_pixel_buffer);
|
||||
hardware_img->PO2_w = x;
|
||||
hardware_img->PO2_h = y;
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
|
||||
glerrorcode = glGetError();
|
||||
if (glerrorcode) {
|
||||
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, hardware_img->w, hardware_img->h, GL_BGRA, GL_UNSIGNED_BYTE, hardware_img->software_pixel_buffer);
|
||||
glerrorcode = glGetError();
|
||||
if (glerrorcode) {
|
||||
alert("gluBuild2DMipmaps failed");
|
||||
alert(glerrorcode);
|
||||
}
|
||||
hardware_img->source_state.PO2_fix = PO2_FIX__MIPMAPPED;
|
||||
hardware_img->PO2_w = hardware_img->w;
|
||||
hardware_img->PO2_h = hardware_img->h;
|
||||
}
|
||||
}
|
||||
free(hardware_img->software_pixel_buffer);
|
||||
hardware_img->software_pixel_buffer = NULL; // 2015 critical bug fix
|
||||
set_render_source(INVALID_HARDWARE_HANDLE);
|
||||
}
|
||||
}
|
||||
|
||||
void hardware_img_requires_depthbuffer(hardware_img_struct *hardware_img) {
|
||||
if (hardware_img->depthbuffer_handle == 0) {
|
||||
// inspiration...
|
||||
// http://www.opengl.org/wiki/Framebuffer_Object_Examples#Color_texture.2C_Depth_texture
|
||||
static GLuint depth_tex;
|
||||
# ifndef QB64_GLES
|
||||
glGenTextures(1, &depth_tex);
|
||||
glBindTexture(GL_TEXTURE_2D, depth_tex);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, hardware_img->w, hardware_img->h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, depth_tex, 0 /*mipmap level*/);
|
||||
# else
|
||||
glGenRenderbuffers(1, &depth_tex);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, depth_tex);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, hardware_img->w, hardware_img->h);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_tex);
|
||||
# endif
|
||||
// NULL means reserve texture memory, but texels are undefined
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
hardware_img->depthbuffer_handle = depth_tex;
|
||||
set_render_source(INVALID_HARDWARE_HANDLE);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,105 +0,0 @@
|
|||
#ifndef DEPENDENCY_PRINTER
|
||||
|
||||
// stubs
|
||||
void sub__printimage(int32 i) { return; }
|
||||
|
||||
#else
|
||||
|
||||
void sub__printimage(int32 i) {
|
||||
|
||||
# ifdef QB64_WINDOWS
|
||||
|
||||
static LPSTR szPrinterName = NULL;
|
||||
DWORD dwNameLen;
|
||||
HDC dc;
|
||||
DOCINFO di;
|
||||
uint32 w, h;
|
||||
int32 x, y;
|
||||
int32 i2;
|
||||
BITMAPFILEHEADER bmfHeader;
|
||||
BITMAPINFOHEADER bi;
|
||||
img_struct *s, *s2;
|
||||
|
||||
if (i >= 0) {
|
||||
validatepage(i);
|
||||
s = &img[page[i]];
|
||||
} else {
|
||||
x = -i;
|
||||
if (x >= nextimg) {
|
||||
error(258);
|
||||
return;
|
||||
}
|
||||
s = &img[x];
|
||||
if (!s->valid) {
|
||||
error(258);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!szPrinterName)
|
||||
szPrinterName = (LPSTR)malloc(65536);
|
||||
dwNameLen = 65536;
|
||||
GetDefaultPrinter(szPrinterName, &dwNameLen);
|
||||
if ((dc = CreateDC(TEXT("WINSPOOL"), szPrinterName, NULL, NULL)) == NULL)
|
||||
goto failed;
|
||||
ZeroMemory(&di, sizeof(DOCINFO));
|
||||
di.cbSize = sizeof(DOCINFO);
|
||||
di.lpszDocName = TEXT("Document");
|
||||
if (StartDoc(dc, &di) <= 0) {
|
||||
DeleteDC(dc);
|
||||
goto failed;
|
||||
}
|
||||
if (StartPage(dc) <= 0) {
|
||||
EndDoc(dc);
|
||||
DeleteDC(dc);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
w = GetDeviceCaps(dc, HORZRES);
|
||||
h = GetDeviceCaps(dc, VERTRES);
|
||||
|
||||
i2 = func__newimage(w, h, 32, 1);
|
||||
if (i2 == -1) {
|
||||
EndDoc(dc);
|
||||
DeleteDC(dc);
|
||||
goto failed;
|
||||
}
|
||||
s2 = &img[-i2];
|
||||
sub__dontblend(i2, 1);
|
||||
sub__putimage(NULL, NULL, NULL, NULL, i, i2, NULL, NULL, NULL, NULL, 8 + 32);
|
||||
|
||||
ZeroMemory(&bi, sizeof(BITMAPINFOHEADER));
|
||||
|
||||
bi.biSize = sizeof(BITMAPINFOHEADER);
|
||||
bi.biWidth = w;
|
||||
bi.biHeight = h;
|
||||
bi.biPlanes = 1;
|
||||
bi.biBitCount = 32;
|
||||
bi.biCompression = BI_RGB;
|
||||
bi.biSizeImage = 0;
|
||||
bi.biXPelsPerMeter = 0;
|
||||
bi.biYPelsPerMeter = 0;
|
||||
bi.biClrUsed = 0;
|
||||
bi.biClrImportant = 0;
|
||||
|
||||
for (y = 0; y < h; y++) {
|
||||
SetDIBitsToDevice(dc, 0, y, w, 1, 0, 0, 0, 1, s2->offset32 + (y * w), (BITMAPINFO *)&bi, DIB_RGB_COLORS);
|
||||
}
|
||||
|
||||
sub__freeimage(i2, 1);
|
||||
|
||||
if (EndPage(dc) <= 0) {
|
||||
EndDoc(dc);
|
||||
DeleteDC(dc);
|
||||
goto failed;
|
||||
}
|
||||
if (EndDoc(dc) <= 0) {
|
||||
DeleteDC(dc);
|
||||
goto failed;
|
||||
}
|
||||
DeleteDC(dc);
|
||||
failed:;
|
||||
# endif
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,2 +0,0 @@
|
|||
// forward references
|
||||
void sub__printimage(int32 i);
|
|
@ -1 +0,0 @@
|
|||
c_compiler\bin\g++ -s -Wfatal-errors -w -Wall qbx.cpp -lws2_32 -lwinspool parts\core\os\win\src.a -lopengl32 -lglu32 -lwinmm -lgdi32 -mwindows -static-libgcc -static-libstdc++ -D GLEW_STATIC -D FREEGLUT_STATIC -lksguid -lole32 -lwinmm -ldxguid -o ..\..\
|
Loading…
Reference in a new issue