mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			228 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
| #ifndef _DRAWTEXT_H_
 | |
| #define _DRAWTEXT_H_
 | |
| 
 | |
| #define _DRAWTEXT_GRID_X 14.0
 | |
| #define _DRAWTEXT_GRID_Y 7.0
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| //                                                                                                   //
 | |
| //  DrawText.fxh by kingreic1992   ( update: Sep.28.2019 )                                           //
 | |
| //                                                                                                   //
 | |
| //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
 | |
| //                                                                                                   //
 | |
| //  Available functions:                                                                             //
 | |
| //      DrawText_String( offset, text size, xy ratio, input coord, string array, array size, output) //
 | |
| //          float2 offset       = top left corner of string, screen hight pixel unit.                //
 | |
| //          float  text size    = text size, screen hight pixel unit.                                //
 | |
| //          float  xy ratio     = xy ratio of text.                                                  //
 | |
| //          float2 input coord  = current texture coord.                                             //
 | |
| //          int    string array = string data in float2 array format, ex: "Demo Text"                //
 | |
| //              int String0[9] = { __D, __e, __m, __o, __Space, __T, __e, __x, __t};                 //
 | |
| //          int    string size  = size of the string array.                                          //
 | |
| //          float  output       = output.                                                            //
 | |
| //                                                                                                   //
 | |
| //      DrawText_Digit( offset, text size, xy ratio, input coord, precision after dot, data, output) //
 | |
| //          float2 offset       = same as DrawText_String.                                           //
 | |
| //          float  text size    = same as DrawText_String.                                           //
 | |
| //          float  xy ratio     = same as DrawText_String.                                           //
 | |
| //          float2 input coord  = same as DrawText_String.                                           //
 | |
| //          int    precision    = digits after dot.                                                  //
 | |
| //          float  data         = input float.                                                       //
 | |
| //          float  output       = output.                                                            //
 | |
| //                                                                                                   //
 | |
| //      float2 DrawText_Shift(offset, shift, text size, xy ratio)                                    //
 | |
| //          float2 offset       = same as DrawText_String.                                           //
 | |
| //          float2 shift        = shift line(y) and column.                                          //
 | |
| //          float text size     = same as DrawText_String.                                           //
 | |
| //          float xy ratio      = same as DrawText_String.                                           //
 | |
| //                                                                                                   //
 | |
| ///////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| 
 | |
| //Sample Usage
 | |
| 
 | |
| /*
 | |
| 
 | |
| #include "DrawText.fxh"
 | |
| 
 | |
| float4 main_fragment( float4 position : POSITION,
 | |
|                       float2 txcoord  : TEXCOORD) : COLOR {
 | |
|     float res = 0.0;
 | |
| 
 | |
|     int line0[9]  = { __D, __e, __m, __o, __Space, __T, __e, __x, __t };   //Demo Text
 | |
|     int line1[15] = { __b, __y, __Space, __k, __i, __n, __g, __e, __r, __i, __c, __1, __9, __9, __2 }; //by kingeric1992
 | |
|     int line2[6]  = { __S, __i, __z, __e, __Colon, __Space }; // Size: %d.
 | |
| 
 | |
|     DrawText_String(float2(100.0 , 100.0), 32, 1, txcoord,  line0, 9, res);
 | |
|     DrawText_String(float2(100.0 , 134.0), textSize, 1, txcoord,  line1, 15, res);
 | |
|     DrawText_String(DrawText_Shift(float2(100.0 , 134.0), int2(0, 1), textSize, 1), 18, 1, txcoord,  line2, 6, res);
 | |
|     DrawText_Digit(DrawText_Shift(DrawText_Shift(float2(100.0 , 134.0), int2(0, 1), textSize, 1), int2(8, 0), 18, 1),
 | |
|                     18, 1, txcoord,  0, textSize, res);
 | |
|     return res;
 | |
| }
 | |
| */
 | |
| 
 | |
| //Text display
 | |
| //Character indexing
 | |
| #define __Space       0 //  (space)
 | |
| #define __Exclam      1 //  !
 | |
| #define __Quote       2 //  "
 | |
| #define __Pound       3 //  #
 | |
| #define __Dollar      4 //  $
 | |
| #define __Percent     5 //  %
 | |
| #define __And         6 //  &
 | |
| #define __sQuote      7 //  '
 | |
| #define __rBrac_O     8 //  (
 | |
| #define __rBrac_C     9 //  )
 | |
| #define __Asterisk   10 //  *
 | |
| #define __Plus       11 //  +
 | |
| #define __Comma      12 //  ,
 | |
| #define __Minus      13 //  -
 | |
| 
 | |
| #define __Dot        14 //  .
 | |
| #define __Slash      15 //  /
 | |
| #define __0          16 //  0
 | |
| #define __1          17 //  1
 | |
| #define __2          18 //  2
 | |
| #define __3          19 //  3
 | |
| #define __4          20 //  4
 | |
| #define __5          21 //  5
 | |
| #define __6          22 //  6
 | |
| #define __7          23 //  7
 | |
| #define __8          24 //  8
 | |
| #define __9          25 //  9
 | |
| #define __Colon      26 //  :
 | |
| #define __sColon     27 //  ;
 | |
| 
 | |
| #define __Less       28 //  <
 | |
| #define __Equals     29 //  =
 | |
| #define __Greater    30 //  >
 | |
| #define __Question   31 //  ?
 | |
| #define __at         32 //  @
 | |
| #define __A          33 //  A
 | |
| #define __B          34 //  B
 | |
| #define __C          35 //  C
 | |
| #define __D          36 //  D
 | |
| #define __E          37 //  E
 | |
| #define __F          38 //  F
 | |
| #define __G          39 //  G
 | |
| #define __H          40 //  H
 | |
| #define __I          41 //  I
 | |
| 
 | |
| #define __J          42 //  J
 | |
| #define __K          43 //  K
 | |
| #define __L          44 //  L
 | |
| #define __M          45 //  M
 | |
| #define __N          46 //  N
 | |
| #define __O          47 //  O
 | |
| #define __P          48 //  P
 | |
| #define __Q          49 //  Q
 | |
| #define __R          50 //  R
 | |
| #define __S          51 //  S
 | |
| #define __T          52 //  T
 | |
| #define __U          53 //  U
 | |
| #define __V          54 //  V
 | |
| #define __W          55 //  W
 | |
| 
 | |
| #define __X          56 //  X
 | |
| #define __Y          57 //  Y
 | |
| #define __Z          58 //  Z
 | |
| #define __sBrac_O    59 //  [
 | |
| #define __Backslash  60 //  \..
 | |
| #define __sBrac_C    61 //  ]
 | |
| #define __Caret      62 //  ^
 | |
| #define __Underscore 63 //  _
 | |
| #define __Punc       64 //  `
 | |
| #define __a          65 //  a
 | |
| #define __b          66 //  b
 | |
| #define __c          67 //  c
 | |
| #define __d          68 //  d
 | |
| #define __e          69 //  e
 | |
| 
 | |
| #define __f          70 //  f
 | |
| #define __g          71 //  g
 | |
| #define __h          72 //  h
 | |
| #define __i          73 //  i
 | |
| #define __j          74 //  j
 | |
| #define __k          75 //  k
 | |
| #define __l          76 //  l
 | |
| #define __m          77 //  m
 | |
| #define __n          78 //  n
 | |
| #define __o          79 //  o
 | |
| #define __p          80 //  p
 | |
| #define __q          81 //  q
 | |
| #define __r          82 //  r
 | |
| #define __s          83 //  s
 | |
| 
 | |
| #define __t          84 //  t
 | |
| #define __u          85 //  u
 | |
| #define __v          86 //  v
 | |
| #define __w          87 //  w
 | |
| #define __x          88 //  x
 | |
| #define __y          89 //  y
 | |
| #define __z          90 //  z
 | |
| #define __cBrac_O    91 //  {
 | |
| #define __vBar       92 //  |
 | |
| #define __cBrac_C    93 //  }
 | |
| #define __Tilde      94 //  ~
 | |
| #define __tridot     95 // (...)
 | |
| #define __empty0     96 // (null)
 | |
| #define __empty1     97 // (null)
 | |
| //Character indexing ends
 | |
| 
 | |
| texture Texttex < source = "FontAtlas.png"; > {
 | |
|     Width  = 512;
 | |
|     Height = 512;
 | |
| };
 | |
| 
 | |
| sampler samplerText {
 | |
|     Texture = Texttex;
 | |
| };
 | |
| 
 | |
| //accomodate for undef array size.
 | |
| #define DrawText_String(  pos, size, ratio, tex, array, arrSize, output ) \
 | |
|     {   float  text = 0.0; \
 | |
|         float2 uv = (tex * float2(BUFFER_WIDTH, BUFFER_HEIGHT) - pos) / size; \
 | |
|         uv.y      = saturate(uv.y); \
 | |
|         uv.x     *= ratio * 2.0; \
 | |
|         float  id = array[int(trunc(uv.x))]; \
 | |
|         if(uv.x  <= arrSize && uv.x >= 0.0) \
 | |
|             text  = tex2D(samplerText, (frac(uv) + float2( id % 14.0, trunc(id / 14.0))) \
 | |
|             / float2( _DRAWTEXT_GRID_X, _DRAWTEXT_GRID_Y) ).x; \
 | |
|         output += text;  }
 | |
| 
 | |
| float2 DrawText_Shift( float2 pos, int2 shift, float size, float ratio ) {
 | |
|     return pos + size * shift * float2(0.5, 1.0) / ratio;
 | |
| }
 | |
| 
 | |
| void DrawText_Digit( float2 pos, float size, float ratio, float2 tex, int digit, float data, inout float res) {
 | |
|     int digits[13] = {
 | |
|         __0, __1, __2, __3, __4, __5, __6, __7, __8, __9, __Minus, __Space, __Dot
 | |
|     };
 | |
| 
 | |
|     float2 uv = (tex * float2(BUFFER_WIDTH, BUFFER_HEIGHT) - pos) / size;
 | |
|     uv.y      = saturate(uv.y);
 | |
|     uv.x     *= ratio * 2.0;
 | |
| 
 | |
|     float  t  = abs(data);
 | |
|     int radix = floor(t)? ceil(log2(t)/3.32192809):0;
 | |
| 
 | |
|     //early exit:
 | |
|     if(uv.x > digit+1 || -uv.x > radix+1) return;
 | |
| 
 | |
|     float index = t;
 | |
|     if(floor(uv.x) > 0)
 | |
|         for(int i = ceil(-uv.x); i<0; i++) index *= 10.;
 | |
|     else
 | |
|         for(int i = ceil(uv.x); i<0; i++) index /= 10.;
 | |
| 
 | |
|     index = (uv.x >= -radix-!radix)? index%10 : (10+step(0, data)); //adding sign
 | |
|     index = (uv.x > 0 && uv.x < 1)? 12:index; //adding dot
 | |
|     index = digits[(uint)index];
 | |
| 
 | |
|     res  += tex2D(samplerText, (frac(uv) + float2( index % 14.0, trunc(index / 14.0))) /
 | |
|                 float2( _DRAWTEXT_GRID_X, _DRAWTEXT_GRID_Y)).x;
 | |
| }
 | |
| 
 | |
| #endif | 
