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 |