hedgewars/uRenderUtils.pas
changeset 11836 1d41f297b3d3
parent 11821 d8844d4c67de
child 12098 966a9739812f
equal deleted inserted replaced
11835:8f7e28428f3e 11836:1d41f297b3d3
    49         SDL_FillRect(Surface, @r, 0);
    49         SDL_FillRect(Surface, @r, 0);
    50 
    50 
    51     BorderColor:= SDL_MapRGB(Surface^.format, BorderColor shr 16, BorderColor shr 8, BorderColor and $FF);
    51     BorderColor:= SDL_MapRGB(Surface^.format, BorderColor shr 16, BorderColor shr 8, BorderColor and $FF);
    52     FillColor:= SDL_MapRGB(Surface^.format, FillColor shr 16, FillColor shr 8, FillColor and $FF);
    52     FillColor:= SDL_MapRGB(Surface^.format, FillColor shr 16, FillColor shr 8, FillColor and $FF);
    53 
    53 
    54     r.y:= rect^.y + 1;
    54     r.y:= rect^.y + cFontBorder div 2;
    55     r.h:= rect^.h - 2;
    55     r.h:= rect^.h - cFontBorder;
    56     SDL_FillRect(Surface, @r, BorderColor);
    56     SDL_FillRect(Surface, @r, BorderColor);
    57     r.x:= rect^.x + 1;
    57     r.x:= rect^.x + cFontBorder div 2;
    58     r.w:= rect^.w - 2;
    58     r.w:= rect^.w - cFontBorder;
    59     r.y:= rect^.y;
    59     r.y:= rect^.y;
    60     r.h:= rect^.h;
    60     r.h:= rect^.h;
    61     SDL_FillRect(Surface, @r, BorderColor);
    61     SDL_FillRect(Surface, @r, BorderColor);
    62     r.x:= rect^.x + 2;
    62     r.x:= rect^.x + cFontBorder;
    63     r.y:= rect^.y + 1;
    63     r.y:= rect^.y + cFontBorder div 2;
    64     r.w:= rect^.w - 4;
    64     r.w:= rect^.w - cFontBorder * 2;
    65     r.h:= rect^.h - 2;
    65     r.h:= rect^.h - cFontBorder;
    66     SDL_FillRect(Surface, @r, FillColor);
    66     SDL_FillRect(Surface, @r, FillColor);
    67     r.x:= rect^.x + 1;
    67     r.x:= rect^.x + cFontBorder div 2;
    68     r.y:= rect^.y + 2;
    68     r.y:= rect^.y + cFontBorder;
    69     r.w:= rect^.w - 2;
    69     r.w:= rect^.w - cFontBorder;
    70     r.h:= rect^.h - 4;
    70     r.h:= rect^.h - cFontBorder * 2;
    71     SDL_FillRect(Surface, @r, FillColor);
    71     SDL_FillRect(Surface, @r, FillColor);
    72 end;
    72 end;
    73 (*
    73 (*
    74 function WriteInRoundRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: ansistring): TSDL_Rect;
    74 function WriteInRoundRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: ansistring): TSDL_Rect;
    75 begin
    75 begin
    81     tmpsurf: PSDL_Surface;
    81     tmpsurf: PSDL_Surface;
    82     clr: TSDL_Color;
    82     clr: TSDL_Color;
    83     finalRect, textRect: TSDL_Rect;
    83     finalRect, textRect: TSDL_Rect;
    84 begin
    84 begin
    85     TTF_SizeUTF8(Fontz[Font].Handle, PChar(s), @w, @h);
    85     TTF_SizeUTF8(Fontz[Font].Handle, PChar(s), @w, @h);
    86     if (maxLength > 0) and (w > maxLength) then w := maxLength;
    86     if (maxLength > 0) and (w > maxLength * HDPIScaleFactor) then w := maxLength * HDPIScaleFactor;
    87     finalRect.x:= X;
    87     finalRect.x:= X;
    88     finalRect.y:= Y;
    88     finalRect.y:= Y;
    89     finalRect.w:= w + cFontBorder * 2 + 4;
    89     finalRect.w:= w + cFontBorder * 2 + cFontPadding * 2;
    90     finalRect.h:= h + cFontBorder * 2;
    90     finalRect.h:= h + cFontBorder * 2;
    91     textRect.x:= X;
    91     textRect.x:= X;
    92     textRect.y:= Y;
    92     textRect.y:= Y;
    93     textRect.w:= w;
    93     textRect.w:= w;
    94     textRect.h:= h;
    94     textRect.h:= h;
    95     DrawRoundRect(@finalRect, cWhiteColor, cNearBlackColor, Surface, true);
    95     DrawRoundRect(@finalRect, cWhiteColor, cNearBlackColor, Surface, true);
    96     clr.r:= (Color shr 16) and $FF;
    96     clr.r:= (Color shr 16) and $FF;
    97     clr.g:= (Color shr 8) and $FF;
    97     clr.g:= (Color shr 8) and $FF;
    98     clr.b:= Color and $FF;
    98     clr.b:= Color and $FF;
    99     tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr);
    99     tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr);
   100     finalRect.x:= X + cFontBorder + 2;
   100     finalRect.x:= X + cFontBorder + cFontPadding;
   101     finalRect.y:= Y + cFontBorder;
   101     finalRect.y:= Y + cFontBorder;
   102     if SDLCheck(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true) then
   102     if SDLCheck(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true) then
   103         exit;
   103         exit;
   104     SDL_UpperBlit(tmpsurf, @textRect, Surface, @finalRect);
   104     SDL_UpperBlit(tmpsurf, @textRect, Surface, @finalRect);
   105     SDL_FreeSurface(tmpsurf);
   105     SDL_FreeSurface(tmpsurf);
   106     finalRect.x:= X;
   106     finalRect.x:= X;
   107     finalRect.y:= Y;
   107     finalRect.y:= Y;
   108     finalRect.w:= w + cFontBorder * 2 + 4;
   108     finalRect.w:= w + cFontBorder * 2 + cFontPadding * 2;
   109     finalRect.h:= h + cFontBorder * 2;
   109     finalRect.h:= h + cFontBorder * 2;
   110     WriteInRoundRect:= finalRect;
   110     WriteInRoundRect:= finalRect;
   111 end;
   111 end;
   112 
   112 
   113 procedure flipSurface(Surface: PSDL_Surface; Vertical: Boolean);
   113 procedure flipSurface(Surface: PSDL_Surface; Vertical: Boolean);
   288         begin
   288         begin
   289         if length(s) = 0 then s:= _S' ';
   289         if length(s) = 0 then s:= _S' ';
   290         font:= CheckCJKFont(s, font);
   290         font:= CheckCJKFont(s, font);
   291         w:= 0; h:= 0; // avoid compiler hints
   291         w:= 0; h:= 0; // avoid compiler hints
   292         TTF_SizeUTF8(Fontz[font].Handle, PChar(s), @w, @h);
   292         TTF_SizeUTF8(Fontz[font].Handle, PChar(s), @w, @h);
   293         if (maxLength > 0) and (w > maxLength) then w := maxLength;
   293         if (maxLength > 0) and (w > maxLength * HDPIScaleFactor) then w := maxLength * HDPIScaleFactor;
   294 
   294 
   295         finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w + cFontBorder * 2 + 4, h + cFontBorder * 2,
   295         finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w + cFontBorder*2 + cFontPadding*2, h + cFontBorder * 2,
   296                 32, RMask, GMask, BMask, AMask);
   296                 32, RMask, GMask, BMask, AMask);
   297 
   297 
   298         if checkFails(finalSurface <> nil, 'RenderString: fail to create surface', true) then
   298         if checkFails(finalSurface <> nil, 'RenderString: fail to create surface', true) then
   299             exit(nil);
   299             exit(nil);
   300 
   300