Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Portions of this file are copyright Rebirth contributors and licensed as
  3.  * described in COPYING.txt.
  4.  * Portions of this file are copyright Parallax Software and licensed
  5.  * according to the Parallax license below.
  6.  * See COPYING.txt for license details.
  7.  
  8. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  9. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  10. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  11. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  12. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  13. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  14. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  15. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  16. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  17. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  18. */
  19.  
  20. /*
  21.  *
  22.  * Fonts for the game.
  23.  *
  24.  */
  25.  
  26. #include <stdlib.h>
  27. #include <stdio.h>
  28.  
  29. #include "gr.h"
  30. #include "dxxerror.h"
  31. #include <string.h>
  32. #include "strutil.h"
  33. #include "args.h"
  34. #include "physfsx.h"
  35. #include "gamefont.h"
  36. #include "mission.h"
  37. #include "config.h"
  38.  
  39. #include "compiler-range_for.h"
  40. #include "d_enumerate.h"
  41.  
  42. const std::array<char[16], 5> Gamefont_filenames_l{{
  43.         "font1-1.fnt", // Font 0
  44.         "font2-1.fnt", // Font 1
  45.         "font2-2.fnt", // Font 2
  46.         "font2-3.fnt", // Font 3
  47.         "font3-1.fnt"  // Font 4
  48. }};
  49.  
  50. const std::array<char[16], 5> Gamefont_filenames_h{{
  51.         "font1-1h.fnt", // Font 0
  52.         "font2-1h.fnt", // Font 1
  53.         "font2-2h.fnt", // Font 2
  54.         "font2-3h.fnt", // Font 3
  55.         "font3-1h.fnt"  // Font 4
  56. }};
  57.  
  58. std::array<grs_font_ptr, MAX_FONTS> Gamefonts;
  59.  
  60. static int Gamefont_installed;
  61. font_x_scale_proportion FNTScaleX(1);
  62. font_y_scale_proportion FNTScaleY(1);
  63.  
  64. //code to allow variable GAME_FONT, added 10/7/99 Matt Mueller - updated 11/18/99 to handle all fonts, not just GFONT_SMALL
  65. //      take scry into account? how/when?
  66. struct a_gamefont_conf
  67. {
  68.         int x;
  69.         int y;
  70.         union{
  71.                 char name[64];//hrm.
  72.         } f;
  73. };
  74.  
  75. struct gamefont_conf
  76. {
  77.         int num,cur;
  78.         std::array<a_gamefont_conf, 10> font;
  79. };
  80.  
  81. static std::array<gamefont_conf, MAX_FONTS> font_conf;
  82.  
  83. static void gamefont_unloadfont(int gf)
  84. {
  85.         if (Gamefonts[gf]){
  86.                 font_conf[gf].cur=-1;
  87.                 Gamefonts[gf].reset();
  88.         }
  89. }
  90.  
  91. static void gamefont_loadfont(int gf,int fi)
  92. {
  93.         if (PHYSFSX_exists(font_conf[gf].font[fi].f.name,1)){
  94.                 gamefont_unloadfont(gf);
  95.                 Gamefonts[gf] = gr_init_font(*grd_curcanv, font_conf[gf].font[fi].f.name);
  96.         }else {
  97.                 if (!Gamefonts[gf]){
  98.                         font_conf[gf].cur=-1;
  99.                         Gamefonts[gf] = gr_init_font(*grd_curcanv, Gamefont_filenames_l[gf]);
  100.                 }
  101.                 return;
  102.         }
  103.         font_conf[gf].cur=fi;
  104. }
  105.  
  106. void gamefont_choose_game_font(int scrx,int scry){
  107.         int close=-1,m=-1;
  108.         if (!Gamefont_installed) return;
  109.  
  110.         range_for (const auto &&efc, enumerate(font_conf))
  111.         {
  112.                 const auto gf = efc.idx;
  113.                 auto &fc = efc.value;
  114.                 for (int i = 0; i < fc.num; ++i)
  115.                         if ((scrx >= fc.font[i].x && close < fc.font[i].x) && (scry >= fc.font[i].y && close < fc.font[i].y))
  116.                         {
  117.                                 close = fc.font[i].x;
  118.                                 m=i;
  119.                         }
  120.                 if (m<0)
  121.                         Error("no gamefont found for %ix%i\n",scrx,scry);
  122.  
  123. #if DXX_USE_OGL
  124.         if (!CGameArg.OglFixedFont)
  125.         {
  126.                 // if there's no texture filtering, scale by int
  127.                 auto &f = fc.font[m];
  128.                 if (!CGameCfg.TexFilt)
  129.                 {
  130.                         FNTScaleX.reset(scrx / f.x);
  131.                         FNTScaleY.reset(scry / f.y);
  132.                 }
  133.                 else
  134.                 {
  135.                         FNTScaleX.reset(static_cast<float>(scrx) / f.x);
  136.                         FNTScaleY.reset(static_cast<float>(scry) / f.y);
  137.                 }
  138.  
  139.                 // keep proportions
  140. #if defined(DXX_BUILD_DESCENT_I)
  141. #define DXX_FONT_SCALE_MULTIPLIER       1
  142. #elif defined(DXX_BUILD_DESCENT_II)
  143. #define DXX_FONT_SCALE_MULTIPLIER       100
  144. #endif
  145.                 if (FNTScaleY*DXX_FONT_SCALE_MULTIPLIER < FNTScaleX*DXX_FONT_SCALE_MULTIPLIER)
  146.                         FNTScaleX.reset(FNTScaleY.operator float());
  147.                 else if (FNTScaleX*DXX_FONT_SCALE_MULTIPLIER < FNTScaleY*DXX_FONT_SCALE_MULTIPLIER)
  148.                         FNTScaleY.reset(FNTScaleX.operator float());
  149.         }
  150. #endif
  151.                 gamefont_loadfont(gf,m);
  152.         }
  153. }
  154.  
  155. static void addfontconf(int gf, int x, int y, const char *const fn)
  156. {
  157.         if (!PHYSFSX_exists(fn,1))
  158.                 return;
  159.  
  160.         for (int i=0;i<font_conf[gf].num;i++){
  161.                 if (font_conf[gf].font[i].x==x && font_conf[gf].font[i].y==y){
  162.                         if (i==font_conf[gf].cur)
  163.                                 gamefont_unloadfont(gf);
  164.                         strcpy(font_conf[gf].font[i].f.name,fn);
  165.                         if (i==font_conf[gf].cur)
  166.                                 gamefont_loadfont(gf,i);
  167.                         return;
  168.                 }
  169.         }
  170.         font_conf[gf].font[font_conf[gf].num].x=x;
  171.         font_conf[gf].font[font_conf[gf].num].y=y;
  172.         strcpy(font_conf[gf].font[font_conf[gf].num].f.name,fn);
  173.         font_conf[gf].num++;
  174. }
  175.  
  176. namespace dsx {
  177. void gamefont_init()
  178. {
  179.         if (Gamefont_installed)
  180.                 return;
  181.  
  182.         Gamefont_installed = 1;
  183.  
  184.         range_for (auto &&egf, enumerate(Gamefonts))
  185.         {
  186.                 const auto i = egf.idx;
  187.                 auto &gf = egf.value;
  188.                 gf = nullptr;
  189.  
  190.                 if (!CGameArg.GfxSkipHiresFNT)
  191.                         addfontconf(i,640,480,Gamefont_filenames_h[i]); // ZICO - addition to use D2 fonts if available
  192. #if defined(DXX_BUILD_DESCENT_I)
  193.                 if (MacHog && (i != 0))
  194.                         addfontconf(i,640,480,Gamefont_filenames_l[i]); // Mac fonts are hires (except for the "big" one)
  195.                 else
  196. #endif
  197.                         addfontconf(i,320,200,Gamefont_filenames_l[i]);
  198.         }
  199.  
  200.         gamefont_choose_game_font(grd_curscreen->sc_canvas.cv_bitmap.bm_w,grd_curscreen->sc_canvas.cv_bitmap.bm_h);
  201. }
  202. }
  203.  
  204.  
  205. void gamefont_close()
  206. {
  207.         if (!Gamefont_installed) return;
  208.         Gamefont_installed = 0;
  209.  
  210.         range_for (auto &&egf, enumerate(Gamefonts))
  211.         {
  212.                 gamefont_unloadfont(egf.idx);
  213.         }
  214.  
  215. }
  216.