X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCGraphics.cpp;h=7dd4201200769e5deae1518016d03fd3ea9aaecf;hb=150bfd36d71cafa0213f083a333fd686d844966f;hp=8e21f97e0d56acef2bdcb9e9f1c9d65394c54350;hpb=b3b9b7dbb136994892bc7dc0bb0cfd57472c7421;p=quix0rs-blobwars.git diff --git a/src/CGraphics.cpp b/src/CGraphics.cpp index 8e21f97..7dd4201 100644 --- a/src/CGraphics.cpp +++ b/src/CGraphics.cpp @@ -1,5 +1,6 @@ /* -Copyright (C) 2004 Parallel Realities +Copyright (C) 2004-2011 Parallel Realities +Copyright (C) 2011-2015 Perpendicular Dimensions This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -20,6 +21,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "headers.h" +void SDL_SetAlpha(SDL_Surface *surface, uint8_t value) { + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND); + SDL_SetSurfaceAlphaMod(surface, value); +} + Graphics::Graphics() { for (int i = 0 ; i < MAX_TILES ; i++) @@ -140,8 +146,6 @@ void Graphics::mapColors() fontForeground.r = fontForeground.g = fontForeground.b = 0xff; fontBackground.r = fontBackground.g = fontBackground.b = 0x00; - fontForeground.unused = fontBackground.unused = 0; - fadeBlack = alphaRect(640, 480, 0x00, 0x00, 0x00); infoBar = alphaRect(640, 25, 0x00, 0x00, 0x00); @@ -156,7 +160,7 @@ Sprite *Graphics::getSpriteHead() void Graphics::setTransparent(SDL_Surface *sprite) { - SDL_SetColorKey(sprite, (SDL_SRCCOLORKEY|SDL_RLEACCEL), SDL_MapRGB(sprite->format, 0, 0, 0)); + SDL_SetColorKey(sprite, SDL_TRUE, SDL_MapRGB(sprite->format, 0, 0, 0)); } bool Graphics::canShowMedalMessage() const @@ -187,8 +191,9 @@ void Graphics::updateScreen() } } - SDL_Flip(screen); - SDL_Delay(1); + SDL_UpdateTexture(texture, NULL, screen->pixels, screen->w * 4); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); if (takeRandomScreenShots) { @@ -202,21 +207,21 @@ void Graphics::updateScreen() SDL_Delay(16); } - if (engine->keyState[SDLK_F12]) + if (engine->keyState[SDL_SCANCODE_F12]) { snprintf(screenshot, sizeof screenshot, "screenshots/screenshot%.3d.bmp", screenShotNumber); SDL_SaveBMP(screen, screenshot); screenShotNumber++; - engine->keyState[SDLK_F12] = 0; + engine->keyState[SDL_SCANCODE_F12] = 0; } - if ((engine->keyState[SDLK_F10]) || ((engine->keyState[SDLK_RETURN]) && (engine->keyState[SDLK_LALT]))) + if ((engine->keyState[SDL_SCANCODE_F10]) || ((engine->keyState[SDL_SCANCODE_RETURN]) && (engine->keyState[SDL_SCANCODE_LALT]))) { - SDL_WM_ToggleFullScreen(screen); engine->fullScreen = !engine->fullScreen; + SDL_SetWindowFullscreen(window, engine->fullScreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); - engine->keyState[SDLK_F10] = engine->keyState[SDLK_LALT] = engine->keyState[SDLK_RETURN] = 0; + engine->keyState[SDL_SCANCODE_F10] = engine->keyState[SDL_SCANCODE_LALT] = engine->keyState[SDL_SCANCODE_RETURN] = 0; } } @@ -224,7 +229,7 @@ void Graphics::delay(int time) { unsigned long then = SDL_GetTicks(); - engine->keyState[SDLK_ESCAPE] = 0; + engine->keyState[SDL_SCANCODE_ESCAPE] = 0; while (true) { @@ -238,7 +243,7 @@ void Graphics::delay(int time) engine->getInput(); /* - if (engine->keyState[SDLK_ESCAPE]) + if (engine->keyState[SDL_SCANCODE_ESCAPE]) { break; } @@ -358,7 +363,7 @@ SDL_Surface *Graphics::loadImage(const char *filename, bool srcalpha) if (!image) showErrorAndExit(ERR_FILE, filename); - newImage = SDL_DisplayFormat(image); + newImage = SDL_ConvertSurface(image, screen->format, 0); if (newImage) { @@ -371,7 +376,7 @@ SDL_Surface *Graphics::loadImage(const char *filename, bool srcalpha) } if(srcalpha) - SDL_SetAlpha(newImage, SDL_SRCALPHA, 255); + SDL_SetAlpha(newImage, 255); else setTransparent(newImage); @@ -431,7 +436,7 @@ SDL_Surface *Graphics::loadImage(const char *filename, int hue, int sat, int val } } - newImage = SDL_DisplayFormat(image); + newImage = SDL_ConvertSurface(image, screen->format, 0); if (newImage) { @@ -458,7 +463,7 @@ SDL_Surface *Graphics::quickSprite(const char *name, SDL_Surface *image) void Graphics::fade(int amount) { - SDL_SetAlpha(fadeBlack, SDL_SRCALPHA|SDL_RLEACCEL, amount); + SDL_SetAlpha(fadeBlack, amount); blit(fadeBlack, 0, 0, screen, false); } @@ -468,7 +473,7 @@ void Graphics::fadeToBlack() while (start < 50) { - SDL_SetAlpha(fadeBlack, SDL_SRCALPHA|SDL_RLEACCEL, start); + SDL_SetAlpha(fadeBlack, start); blit(fadeBlack, 0, 0, screen, false); delay(60); start++; @@ -520,7 +525,7 @@ void Graphics::loadMapTiles(const char *baseDir) { if ((i < MAP_EXITSIGN) || (i >= MAP_WATERANIM)) { - SDL_SetAlpha(tile[i], SDL_SRCALPHA|SDL_RLEACCEL, 130); + SDL_SetAlpha(tile[i], 130); } } else @@ -534,17 +539,9 @@ void Graphics::loadMapTiles(const char *baseDir) } } -/* -Note : We need to search for the right >>> PIXEL SIZE <<< and NOT point size!! -If a user has a resolution other than approximately 72dpi then -they will get a small or larger font and this won't work. This might look -weird since we'll load and delete multiple fonts, but it works... -*/ -void Graphics::loadFont(int i, const char *filename, int pixelSize) +void Graphics::loadFont(int i, const char *filename, int pointSize) { - int minx, maxx, miny, maxy, advance; - - debug(("Attempting to load a font with pixel size of %d...\n", pixelSize)); + debug(("Attempting to load font %s with point size of %d...\n", filename, pointSize)); if (font[i]) { @@ -552,65 +549,20 @@ void Graphics::loadFont(int i, const char *filename, int pixelSize) TTF_CloseFont(font[i]); } - char tempPath[PATH_MAX]; - - snprintf(tempPath, sizeof tempPath, "%sfont.ttf", engine->userHomeDirectory); + #if USEPAK + char tempPath[PATH_MAX]; + snprintf(tempPath, sizeof tempPath, "%sfont.ttf", engine->userHomeDirectory); + font[i] = TTF_OpenFont(tempPath, pointSize); + #else + font[i] = TTF_OpenFont("data/vera.ttf", pointSize); + #endif - bool found = false; - int size = 0; - - while (!found) + if (!font[i]) { - if (font[i]) - { - TTF_CloseFont(font[i]); - } - - #if USEPAK - font[i] = TTF_OpenFont(tempPath, ++size); - #else - font[i] = TTF_OpenFont("data/vera.ttf", ++size); - #endif - - if (!font[i]) - { - engine->reportFontFailure(); - } - - TTF_GlyphMetrics(font[i], '8', &minx, &maxx, &miny, &maxy, &advance); - - // great! we have an exact match - if (maxx == pixelSize) - { - break; - } - - // we've overshot, so we'll use the previous size! - if (maxx > pixelSize) - { - TTF_CloseFont(font[i]); - - #if USEPAK - font[i] = TTF_OpenFont(tempPath, size - 1); - #else - font[i] = TTF_OpenFont("data/vera.ttf", size - 1); - #endif - - TTF_GlyphMetrics(font[i], '8', &minx, &maxx, &miny, &maxy, &advance); - - break; - } - - if (size >= 100) - { - debug(("Pixel size has exceeded 99 pixels! I'm giving up!\n")); - engine->reportFontFailure(); - } + engine->reportFontFailure(); } TTF_SetFontStyle(font[i], TTF_STYLE_NORMAL); - - debug(("Got a match for font size %d - Nearest = %d\n", pixelSize, maxx)); } Sprite *Graphics::addSprite(const char *name) @@ -863,8 +815,6 @@ void Graphics::setFontColor(int red, int green, int blue, int red2, int green2, fontBackground.r = red2; fontBackground.g = green2; fontBackground.b = blue2; - - fontForeground.unused = fontBackground.unused = 0; } void Graphics::setFontSize(int size) @@ -882,6 +832,12 @@ SDL_Surface *Graphics::getString(const char *in, bool transparent) text = TTF_RenderUTF8_Shaded(font[fontSize], "FONT_ERROR", fontForeground, fontBackground); } + if (!text) + { + fprintf(stderr, "Unable to render text: %s\n", SDL_GetError()); + abort(); + } + if (transparent) setTransparent(text); @@ -1067,7 +1023,7 @@ SDL_Surface *Graphics::createSurface(int width, int height) if (surface == NULL) showErrorAndExit("CreateRGBSurface failed: %s\n", SDL_GetError()); - newImage = SDL_DisplayFormat(surface); + newImage = SDL_ConvertSurface(surface, screen->format, 0); SDL_FreeSurface(surface); @@ -1080,7 +1036,7 @@ SDL_Surface *Graphics::alphaRect(int width, int height, Uint8 red, Uint8 green, SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, red, green, blue)); - SDL_SetAlpha(surface, SDL_SRCALPHA|SDL_RLEACCEL, 130); + SDL_SetAlpha(surface, 130); return surface; } @@ -1091,7 +1047,7 @@ void Graphics::colorize(SDL_Surface *image, int red, int green, int blue) blit(alpha, 0, 0, image, false); - SDL_SetColorKey(image, (SDL_SRCCOLORKEY|SDL_RLEACCEL), SDL_MapRGB(image->format, red / 2, green / 2, blue / 2)); + SDL_SetColorKey(image, SDL_TRUE, SDL_MapRGB(image->format, red / 2, green / 2, blue / 2)); } void Graphics::lock(SDL_Surface *surface) @@ -1131,8 +1087,6 @@ void Graphics::showLoading(int amount, int max) drawRect(120, 420, 400, 10, black, white, screen); drawRect(121, 421, currentLoading, 8, red, screen); - - SDL_UpdateRect(screen, 120, 420, 400, 10); #endif } @@ -1156,7 +1110,7 @@ void Graphics::showLicenseErrorAndExit() { updateScreen(); engine->getInput(); - if (engine->keyState[SDLK_ESCAPE]) + if (engine->keyState[SDL_SCANCODE_ESCAPE]) exit(1); SDL_Delay(16); } @@ -1203,7 +1157,7 @@ void Graphics::showErrorAndExit(const char *error, const char *param) { updateScreen(); engine->getInput(); - if (engine->keyState[SDLK_ESCAPE]) + if (engine->keyState[SDL_SCANCODE_ESCAPE]) { exit(1); } @@ -1232,11 +1186,11 @@ void Graphics::showRootWarning() updateScreen(); engine->getInput(); - if (engine->keyState[SDLK_ESCAPE]) + if (engine->keyState[SDL_SCANCODE_ESCAPE]) { return; } - else if (engine->keyState[SDLK_SPACE]) + else if (engine->keyState[SDL_SCANCODE_SPACE]) { exit(0); }