X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCGraphics.cpp;h=cde769d75013d580142c4fbc4c02c69087018fbc;hb=0e7253d9244ce174a12fbed7bf907a916f0d68dc;hp=353a837febd36331bb01bf4c5bd3e319fc8e614b;hpb=877c46f3f824fabf9f9b28988f0cbb36de4b193d;p=quix0rs-blobwars.git diff --git a/src/CGraphics.cpp b/src/CGraphics.cpp index 353a837..cde769d 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,10 +160,11 @@ Sprite *Graphics::getSpriteHead() void Graphics::setTransparent(SDL_Surface *sprite) { - SDL_SetColorKey(sprite, (SDL_SRCCOLORKEY|SDL_RLEACCEL), SDL_MapRGB(sprite->format, 0, 0, 0)); + if (sprite) + SDL_SetColorKey(sprite, SDL_TRUE, SDL_MapRGB(sprite->format, 0, 0, 0)); } -bool Graphics::canShowMedalMessage() +bool Graphics::canShowMedalMessage() const { return (medalMessageTimer <= 0); } @@ -187,8 +192,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 +208,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 +230,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 +244,7 @@ void Graphics::delay(int time) engine->getInput(); /* - if (engine->keyState[SDLK_ESCAPE]) + if (engine->keyState[SDL_SCANCODE_ESCAPE]) { break; } @@ -356,9 +362,9 @@ SDL_Surface *Graphics::loadImage(const char *filename, bool srcalpha) #endif if (!image) - showErrorAndExit(ERR_FILE, filename); + return showErrorAndExit(ERR_FILE, filename), image; - newImage = SDL_DisplayFormat(image); + newImage = SDL_ConvertSurface(image, screen->format, 0); if (newImage) { @@ -371,7 +377,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); @@ -391,7 +397,7 @@ SDL_Surface *Graphics::loadImage(const char *filename, int hue, int sat, int val #endif if (!image) - showErrorAndExit(ERR_FILE, filename); + return showErrorAndExit(ERR_FILE, filename), image; if ((hue != 0) || (sat != 0) || (value != 0)) { @@ -431,7 +437,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 +464,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 +474,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++; @@ -516,11 +522,14 @@ void Graphics::loadMapTiles(const char *baseDir) { tile[i] = loadImage(filename); + if (!tile[i]) + abort(); + if (autoAlpha) { if ((i < MAP_EXITSIGN) || (i >= MAP_WATERANIM)) { - SDL_SetAlpha(tile[i], SDL_SRCALPHA|SDL_RLEACCEL, 130); + SDL_SetAlpha(tile[i], 130); } } else @@ -534,17 +543,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,71 +553,27 @@ 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 + (void)filename; + char tempPath[PATH_MAX]; + snprintf(tempPath, sizeof tempPath, "%sfont.ttf", engine->userHomeDirectory); + font[i] = TTF_OpenFont(tempPath, pointSize); + #else + font[i] = TTF_OpenFont(filename, 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) { Sprite *sprite = new Sprite; - strncpy(sprite->name, name, sizeof sprite->name); + strlcpy(sprite->name, name, sizeof sprite->name); spriteList.add(sprite); @@ -662,17 +619,17 @@ void Graphics::animateSprites() } } -int Graphics::getWaterAnim() +int Graphics::getWaterAnim() const { return waterAnim; } -int Graphics::getSlimeAnim() +int Graphics::getSlimeAnim() const { return slimeAnim; } -int Graphics::getLavaAnim() +int Graphics::getLavaAnim() const { return lavaAnim; } @@ -793,7 +750,7 @@ void Graphics::blit(SDL_Surface *image, int x, int y, SDL_Surface *dest, bool ce { if (!image) { - showErrorAndExit("graphics::blit() - NULL pointer", SDL_GetError()); + return showErrorAndExit("graphics::blit() - NULL pointer", SDL_GetError()); } if ((x < -image->w) || (x > 640 + image->w)) @@ -863,8 +820,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 +837,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); @@ -946,8 +907,8 @@ void Graphics::clearChatString() void Graphics::createChatString(const char *in) { - strncat(chatString, " ", sizeof chatString); - strncat(chatString, in, sizeof chatString); + strlcat(chatString, " ", sizeof chatString); + strlcat(chatString, in, sizeof chatString); } void Graphics::drawChatString(SDL_Surface *surface, int y) @@ -1067,7 +1028,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 +1041,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 +1052,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 +1092,9 @@ 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); + #else + (void)amount; + (void)max; #endif } @@ -1156,7 +1118,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 +1165,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 +1194,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); }