author  unc0rr 
Tue, 26 Jul 2022 12:37:17 +0200  
changeset 15852  c4561095666a 
parent 15753  72f735c03fec 
permissions  rwrr 
4976  1 
(* 
2 
* Hedgewars, a free turn based strategy game 

11046  3 
* Copyright (c) 20042015 Andrey Korotaev <unC0Rr@gmail.com> 
4976  4 
* 
5 
* This program is free software; you can redistribute it and/or modify 

6 
* it under the terms of the GNU General Public License as published by 

7 
* the Free Software Foundation; version 2 of the License 

8 
* 

9 
* This program is distributed in the hope that it will be useful, 

10 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 

11 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

12 
* GNU General Public License for more details. 

13 
* 

14 
* You should have received a copy of the GNU General Public License 

15 
* along with this program; if not, write to the Free Software 

10108
c68cf030eded
update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright  but I ain't gonna touch their copyright headers
sheepluva
parents:
10107
diff
changeset

16 
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 021101301 USA 
4976  17 
*) 
18 

4380  19 
{$INCLUDE "options.inc"} 
4976  20 

4380  21 
unit uRenderUtils; 
22 

23 
interface 

24 
uses SDLh, uTypes; 

25 

26 
procedure flipSurface(Surface: PSDL_Surface; Vertical: Boolean); 

6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

27 

4380  28 
procedure copyRotatedSurface(src, dest: PSDL_Surface); // this is necessary since width/height are read only in SDL 
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

29 
procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); inline; 
7013  30 
procedure copyToXYFromRect(src, dest: PSDL_Surface; srcX, srcY, srcW, srcH, destX, destY: LongInt); 
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

31 

409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

32 
procedure DrawSprite2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt); inline; 
7013  33 
procedure DrawSpriteFrame2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt; frame: LongInt); 
6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

34 
procedure DrawLine2Surf(dest: PSDL_Surface; x0,y0,x1,y1:LongInt; r,g,b: byte); 
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

35 
procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

36 

409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

37 
function RenderStringTex(s: ansistring; Color: Longword; font: THWFont): PTexture; 
7013  38 
function RenderStringTexLim(s: ansistring; Color: Longword; font: THWFont; maxLength: LongWord): PTexture; 
4380  39 
function RenderSpeechBubbleTex(s: ansistring; SpeechType: Longword; font: THWFont): PTexture; 
40 

14736
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

41 
function IsTooDarkToRead(TextColor: Longword): boolean; inline; 
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

42 

4380  43 
implementation 
11821  44 
uses uVariables, uConsts, uTextures, SysUtils, uUtils, uDebug; 
4380  45 

46 
procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); 

47 
var r: TSDL_Rect; 

48 
begin 

49 
r:= rect^; 

6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6286
diff
changeset

50 
if Clear then 
14634
b055360684bd
Remove black pixels at corners of DrawRoundRect rectangles
Wuzzy <Wuzzy2@mail.ru>
parents:
13489
diff
changeset

51 
SDL_FillRect(Surface, @r, SDL_MapRGBA(Surface^.format, 0, 0, 0, 0)); 
4380  52 

53 
BorderColor:= SDL_MapRGB(Surface^.format, BorderColor shr 16, BorderColor shr 8, BorderColor and $FF); 

54 
FillColor:= SDL_MapRGB(Surface^.format, FillColor shr 16, FillColor shr 8, FillColor and $FF); 

55 

11836  56 
r.y:= rect^.y + cFontBorder div 2; 
57 
r.h:= rect^.h  cFontBorder; 

4380  58 
SDL_FillRect(Surface, @r, BorderColor); 
11836  59 
r.x:= rect^.x + cFontBorder div 2; 
60 
r.w:= rect^.w  cFontBorder; 

4380  61 
r.y:= rect^.y; 
62 
r.h:= rect^.h; 

63 
SDL_FillRect(Surface, @r, BorderColor); 

11836  64 
r.x:= rect^.x + cFontBorder; 
65 
r.y:= rect^.y + cFontBorder div 2; 

66 
r.w:= rect^.w  cFontBorder * 2; 

67 
r.h:= rect^.h  cFontBorder; 

4380  68 
SDL_FillRect(Surface, @r, FillColor); 
11836  69 
r.x:= rect^.x + cFontBorder div 2; 
70 
r.y:= rect^.y + cFontBorder; 

71 
r.w:= rect^.w  cFontBorder; 

72 
r.h:= rect^.h  cFontBorder * 2; 

8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

73 
SDL_FillRect(Surface, @r, FillColor); 
4380  74 
end; 
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

75 
(* 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

76 
function WriteInRoundRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: ansistring): TSDL_Rect; 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

77 
begin 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

78 
WriteInRoundRect:= WriteInRoundRect(Surface, X, Y, Color, Font, s, 0); 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

79 
end;*) 
4380  80 

14745
7cc768094d66
Refactor IsTooDarkToRead to fix pas2c crash
Wuzzy <Wuzzy2@mail.ru>
parents:
14736
diff
changeset

81 
function IsTooDarkToRead(TextColor: LongWord): boolean; inline; 
14736
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

82 
var clr: TSDL_Color; 
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

83 
begin 
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

84 
clr.r:= (TextColor shr 16) and $FF; 
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

85 
clr.g:= (TextColor shr 8) and $FF; 
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

86 
clr.b:= TextColor and $FF; 
14745
7cc768094d66
Refactor IsTooDarkToRead to fix pas2c crash
Wuzzy <Wuzzy2@mail.ru>
parents:
14736
diff
changeset

87 
IsTooDarkToRead:= not ((clr.r >= cInvertTextColorAt) or (clr.g >= cInvertTextColorAt) or (clr.b >= cInvertTextColorAt)); 
14736
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

88 
end; 
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

89 

6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

90 
function WriteInRoundRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: ansistring; maxLength: LongWord): TSDL_Rect; 
10494  91 
var w, h: Longword; 
4380  92 
tmpsurf: PSDL_Surface; 
14736
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

93 
finalRect, textRect: TSDL_Rect; 
4380  94 
clr: TSDL_Color; 
95 
begin 

10127  96 
TTF_SizeUTF8(Fontz[Font].Handle, PChar(s), @w, @h); 
11836  97 
if (maxLength > 0) and (w > maxLength * HDPIScaleFactor) then w := maxLength * HDPIScaleFactor; 
4380  98 
finalRect.x:= X; 
99 
finalRect.y:= Y; 

11836  100 
finalRect.w:= w + cFontBorder * 2 + cFontPadding * 2; 
6982  101 
finalRect.h:= h + cFontBorder * 2; 
6750  102 
textRect.x:= X; 
103 
textRect.y:= Y; 

104 
textRect.w:= w; 

105 
textRect.h:= h; 

4380  106 
clr.r:= (Color shr 16) and $FF; 
107 
clr.g:= (Color shr 8) and $FF; 

108 
clr.b:= Color and $FF; 

14747
7dfc6ed13337
Fix uninitialized alpha values of rendered text
Wuzzy <Wuzzy2@mail.ru>
parents:
14745
diff
changeset

109 
clr.a:= $FF; 
14745
7cc768094d66
Refactor IsTooDarkToRead to fix pas2c crash
Wuzzy <Wuzzy2@mail.ru>
parents:
14736
diff
changeset

110 
if (not IsTooDarkToRead(Color)) then 
14736
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

111 
DrawRoundRect(@finalRect, cWhiteColor, cNearBlackColor, Surface, true) 
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

112 
else 
8563cc40fc1e
Invert colors if clan color is very dark
Wuzzy <Wuzzy2@mail.ru>
parents:
14634
diff
changeset

113 
DrawRoundRect(@finalRect, cNearBlackColor, cWhiteColor, Surface, true); 
10127  114 
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr); 
11836  115 
finalRect.x:= X + cFontBorder + cFontPadding; 
6982  116 
finalRect.y:= Y + cFontBorder; 
11507  117 
if SDLCheck(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true) then 
15753  118 
exit(finalRect); 
6750  119 
SDL_UpperBlit(tmpsurf, @textRect, Surface, @finalRect); 
4380  120 
SDL_FreeSurface(tmpsurf); 
121 
finalRect.x:= X; 

122 
finalRect.y:= Y; 

11836  123 
finalRect.w:= w + cFontBorder * 2 + cFontPadding * 2; 
6982  124 
finalRect.h:= h + cFontBorder * 2; 
4380  125 
WriteInRoundRect:= finalRect; 
126 
end; 

127 

128 
procedure flipSurface(Surface: PSDL_Surface; Vertical: Boolean); 

129 
var y, x, i, j: LongInt; 

130 
tmpPixel: Longword; 

131 
pixels: PLongWordArray; 

132 
begin 

11532  133 
if checkFails(Surface^.format^.BytesPerPixel = 4, 'flipSurface failed, expecting 32 bit surface', true) then 
134 
exit; 

8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

135 
SDL_LockSurface(Surface); 
4380  136 
pixels:= Surface^.pixels; 
137 
if Vertical then 

138 
for y := 0 to (Surface^.h div 2)  1 do 

139 
for x := 0 to Surface^.w  1 do 

140 
begin 

141 
i:= y * Surface^.w + x; 

142 
j:= (Surface^.h  y  1) * Surface^.w + x; 

143 
tmpPixel:= pixels^[i]; 

144 
pixels^[i]:= pixels^[j]; 

145 
pixels^[j]:= tmpPixel; 

146 
end 

147 
else 

148 
for x := 0 to (Surface^.w div 2)  1 do 

11532  149 
for y := 0 to Surface^.h  1 do 
4380  150 
begin 
151 
i:= y*Surface^.w + x; 

152 
j:= y*Surface^.w + (Surface^.w  x  1); 

153 
tmpPixel:= pixels^[i]; 

154 
pixels^[i]:= pixels^[j]; 

155 
pixels^[j]:= tmpPixel; 

156 
end; 

8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

157 
SDL_UnlockSurface(Surface); 
4380  158 
end; 
159 

6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

160 
procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); inline; 
6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

161 
begin 
12098
966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

162 
// copy from complete src 
7013  163 
copyToXYFromRect(src, dest, 0, 0, src^.w, src^.h, destX, destY); 
6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

164 
end; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

165 

7013  166 
procedure copyToXYFromRect(src, dest: PSDL_Surface; srcX, srcY, srcW, srcH, destX, destY: LongInt); 
12099  167 
var spi, dpi, iX, iY, dX, dY, lX, lY, aT: LongInt; 
4380  168 
srcPixels, destPixels: PLongWordArray; 
12099  169 
rD, gD, bD, aD, rT, gT, bT: Byte; 
4380  170 
begin 
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

171 
SDL_LockSurface(src); 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

172 
SDL_LockSurface(dest); 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

173 

4380  174 
srcPixels:= src^.pixels; 
175 
destPixels:= dest^.pixels; 

176 

12098
966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

177 
// what's the offset between src and dest coords? 
966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

178 
dX:= destX  srcX; 
966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

179 
dY:= destY  srcY; 
966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

180 

966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

181 
// let's figure out where the rectangle we can actually copy ends 
12101
2e70ef81e281
copyToXYFromRect: simplify my math (so that it actually, you know, works...)
sheepluva
parents:
12099
diff
changeset

182 
lX:= min(srcX + srcW, src^.w)  1; 
2e70ef81e281
copyToXYFromRect: simplify my math (so that it actually, you know, works...)
sheepluva
parents:
12099
diff
changeset

183 
if lX + dx >= dest^.w then lX:= dest^.w  dx  1; 
2e70ef81e281
copyToXYFromRect: simplify my math (so that it actually, you know, works...)
sheepluva
parents:
12099
diff
changeset

184 
lY:= min(srcY + srcH, src^.h)  1; 
2e70ef81e281
copyToXYFromRect: simplify my math (so that it actually, you know, works...)
sheepluva
parents:
12099
diff
changeset

185 
if lY + dy >= dest^.h then lY:= dest^.h  dy  1; 
12098
966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

186 

966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

187 
for iX:= srcX to lX do 
966a9739812f
copyToXYFromRect: fix pixels overflowing pixel lines in dest
sheepluva
parents:
11836
diff
changeset

188 
for iY:= srcY to lY do 
4380  189 
begin 
12099  190 
// src pixel index 
15852
c4561095666a
Fix texture copying routine not taking pitch into account
unc0rr
parents:
15753
diff
changeset

191 
spi:= iY * src^.pitch div 4 + iX; 
12099  192 
// dest pixel index 
15852
c4561095666a
Fix texture copying routine not taking pitch into account
unc0rr
parents:
15753
diff
changeset

193 
dpi:= (iY + dY) * dest^.pitch div 4 + (iX + dX); 
12099  194 

195 
// get src alpha (and set it as target alpha for now) 

196 
aT:= (srcPixels^[spi] and AMask) shr AShift; 

197 

198 
// src pixel opaque? 

199 
if aT = 255 then 

4380  200 
begin 
12099  201 
// just copy full pixel 
202 
destPixels^[dpi]:= srcPixels^[spi]; 

203 
continue; 

4380  204 
end; 
12099  205 

206 
// get dst alpha (without shift for now) 

207 
aD:= (destPixels^[dpi] and AMask) shr AShift; 

208 

209 
// dest completely transparent? 

210 
if aD = 0 then 

211 
begin 

212 
// just copy src pixel 

213 
destPixels^[dpi]:= srcPixels^[spi]; 

214 
continue; 

215 
end; 

216 

217 
// looks like some blending is necessary 

218 

219 
// set color of target RGB to src for now 

220 
SDL_GetRGB(srcPixels^[spi], src^.format, @rT, @gT, @bT); 

221 
SDL_GetRGB(destPixels^[dpi], dest^.format, @rD, @gD, @bD); 

222 
// note: this is not how to correctly blend RGB, just sayin' (R,G,B are not linear...) 

223 
rT:= (rD * (255  aT) + rT * aT) div 255; 

224 
gT:= (gD * (255  aT) + gT * aT) div 255; 

225 
bT:= (bD * (255  aT) + bT * aT) div 255; 

226 
aT:= aD + ((255  LongInt(aD)) * aT div 255); 

227 

12102
51596d30a724
fix chat SDL surfaces being in wrong color format (didn't play well with copyToXY's new quick pixel copies)
sheepluva
parents:
12101
diff
changeset

228 
destPixels^[dpi]:= SDL_MapRGBA(dest^.format, rT, gT, bT, Byte(aT)); 
51596d30a724
fix chat SDL surfaces being in wrong color format (didn't play well with copyToXY's new quick pixel copies)
sheepluva
parents:
12101
diff
changeset

229 

4380  230 
end; 
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

231 

4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

232 
SDL_UnlockSurface(src); 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

233 
SDL_UnlockSurface(dest); 
4380  234 
end; 
235 

6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

236 
procedure DrawSprite2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt); inline; 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

237 
begin 
12099  238 
DrawSpriteFrame2Surf(sprite, dest, x, y, 0); 
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

239 
end; 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

240 

7013  241 
procedure DrawSpriteFrame2Surf(sprite: TSprite; dest: PSDL_Surface; x,y,frame: LongInt); 
6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

242 
var numFramesFirstCol, row, col: LongInt; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

243 
begin 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

244 
numFramesFirstCol:= SpritesData[sprite].imageHeight div SpritesData[sprite].Height; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

245 
row:= Frame mod numFramesFirstCol; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

246 
col:= Frame div numFramesFirstCol; 
10015  247 

248 
copyToXYFromRect(SpritesData[sprite].Surface, dest, 

249 
col*SpritesData[sprite].Width, 

250 
row*SpritesData[sprite].Height, 

251 
SpritesData[sprite].Width, 

252 
spritesData[sprite].Height, 

6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

253 
x,y); 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

254 
end; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

255 

b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

256 
procedure DrawLine2Surf(dest: PSDL_Surface; x0, y0,x1,y1: LongInt; r,g,b: byte); 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

257 
var 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

258 
dx,dy,err,e2,sx,sy: LongInt; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

259 
yMax: LongInt; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

260 
destPixels: PLongwordArray; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

261 
begin 
6992  262 
//max:= (dest^.pitch div 4) * dest^.h; 
6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

263 
yMax:= dest^.pitch div 4; 
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

264 

4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

265 
SDL_LockSurface(dest); 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

266 

6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

267 
destPixels:= dest^.pixels; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

268 

b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

269 
dx:= abs(x1x0); 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

270 
dy:= abs(y1y0); 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

271 
if x0 < x1 then sx:= 1 else sx:= 1; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

272 
if y0 < y1 then sy:= 1 else sy:= 1; 
10015  273 
err:= dxdy; 
6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

274 

b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

275 
while(true) do 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

276 
begin 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

277 
destPixels^[(y0 * yMax) + x0]:= SDL_MapRGB(dest^.format, r,g,b); //But will it blend? no 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

278 

b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

279 
if (x0 = x1) and (y0 = y1) then break; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

280 

b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

281 
e2:= 2*err; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

282 
if e2 > dy then 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

283 
begin 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

284 
err:= err  dy; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

285 
x0 := x0 + sx; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

286 
end; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

287 

b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

288 
if e2 < dx then 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

289 
begin 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

290 
err:= err + dx; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

291 
y0:=y0+sy 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

292 
end; 
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

293 
end; 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

294 
SDL_UnlockSurface(dest); 
6620
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

295 
end; 
b211d0b690de
Expanded copyToXY, it doesn't copy the whole src sprite, srcX/Y to srcW/h, added DrawSprite2Surf and DrawLine2Surf
Xeli
parents:
6580
diff
changeset

296 

4380  297 
procedure copyRotatedSurface(src, dest: PSDL_Surface); // this is necessary since width/height are read only in SDL, apparently 
298 
var y, x, i, j: LongInt; 

299 
srcPixels, destPixels: PLongWordArray; 

300 
begin 

11532  301 
checkFails(src^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true); 
302 
checkFails(dest^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true); 

303 
if not allOK then exit; 

4380  304 

8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

305 
SDL_LockSurface(src); 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

306 
SDL_LockSurface(dest); 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

307 

4380  308 
srcPixels:= src^.pixels; 
309 
destPixels:= dest^.pixels; 

310 

311 
j:= 0; 

312 
for x := 0 to src^.w  1 do 

313 
for y := 0 to src^.h  1 do 

314 
begin 

315 
i:= (src^.h  1  y) * (src^.pitch div 4) + x; 

316 
destPixels^[j]:= srcPixels^[i]; 

317 
inc(j) 

318 
end; 

8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

319 

4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

320 
SDL_UnlockSurface(src); 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

321 
SDL_UnlockSurface(dest); 
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

322 

4380  323 
end; 
324 

6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

325 
function RenderStringTex(s: ansistring; Color: Longword; font: THWFont): PTexture; 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

326 
begin 
7013  327 
RenderStringTex:= RenderStringTexLim(s, Color, font, 0); 
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

328 
end; 
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6982
diff
changeset

329 

7013  330 
function RenderStringTexLim(s: ansistring; Color: Longword; font: THWFont; maxLength: LongWord): PTexture; 
10494  331 
var w, h: Longword; 
4380  332 
finalSurface: PSDL_Surface; 
333 
begin 

10139  334 
if cOnlyStats then 
335 
begin 

336 
RenderStringTexLim:= nil; 

337 
end 

338 
else 

339 
begin 

340 
if length(s) = 0 then s:= _S' '; 

341 
font:= CheckCJKFont(s, font); 

342 
w:= 0; h:= 0; // avoid compiler hints 

343 
TTF_SizeUTF8(Fontz[font].Handle, PChar(s), @w, @h); 

11836  344 
if (maxLength > 0) and (w > maxLength * HDPIScaleFactor) then w := maxLength * HDPIScaleFactor; 
4380  345 

11836  346 
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w + cFontBorder*2 + cFontPadding*2, h + cFontBorder * 2, 
10139  347 
32, RMask, GMask, BMask, AMask); 
4380  348 

11532  349 
if checkFails(finalSurface <> nil, 'RenderString: fail to create surface', true) then 
350 
exit(nil); 

10139  351 

352 
WriteInRoundRect(finalSurface, 0, 0, Color, font, s, maxLength); 

4380  353 

12591  354 
checkFails(SDL_SetColorKey(finalSurface, SDL_TRUE, 0) = 0, errmsgTransparentSet, false); 
4380  355 

10139  356 
RenderStringTexLim:= Surface2Tex(finalSurface, false); 
4380  357 

10139  358 
SDL_FreeSurface(finalSurface); 
359 
end; 

4380  360 
end; 
361 

10689
692649e341fc
change string types of speech bubbles fix to work with pas2c
sheepluva
parents:
10687
diff
changeset

362 
function GetNextSpeechLine(s: ansistring; ldelim: char; var startFrom: LongInt; out substr: ansistring): boolean; 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

363 
var p, l, m, r: Integer; 
10691
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

364 
newl, skip: boolean; 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

365 
c : char; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

366 
begin 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

367 
m:= Length(s); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

368 

10690  369 
substr:= ''; 
370 

10689
692649e341fc
change string types of speech bubbles fix to work with pas2c
sheepluva
parents:
10687
diff
changeset

371 
SetLengthA(substr, m); 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

372 

2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

373 
// number of chars read 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

374 
r:= 0; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

375 

2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

376 
// number of chars to be written 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

377 
l:= 0; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

378 

2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

379 
newl:= true; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

380 

2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

381 
for p:= max(1, startFrom) to m do 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

382 
begin 
10691
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

383 

10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

384 
inc(r); 
10691
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

385 
// read char from source string 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

386 
c:= s[p]; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

387 

2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

388 
// strip empty lines, spaces and newlines on beginnings of line 
10691
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

389 
skip:= ((newl or (p = m)) and ((c = ' ') or (c = ldelim))); 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

390 

10691
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

391 
if (not skip) then 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

392 
begin 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

393 
newl:= (c = ldelim); 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

394 
// stop if we went past the end of the line 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

395 
if newl then 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

396 
break; 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

397 

10691
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

398 
// copy current char to output substring 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

399 
inc(l); 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

400 
substr[l]:= c; 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

401 
end; 
97f45f1374be
change speechfix implementation (no "continue" anymore
sheepluva
parents:
10690
diff
changeset

402 

10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

403 
end; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

404 

2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

405 
inc(startFrom, r); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

406 

10689
692649e341fc
change string types of speech bubbles fix to work with pas2c
sheepluva
parents:
10687
diff
changeset

407 
SetLengthA(substr, l); 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

408 

2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

409 
GetNextSpeechLine:= (l > 0); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

410 
end; 
4380  411 

412 
function RenderSpeechBubbleTex(s: ansistring; SpeechType: Longword; font: THWFont): PTexture; 

10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

413 
var textWidth, textHeight, x, y, w, h, i, j, pos, line, numLines, edgeWidth, edgeHeight, cornerWidth, cornerHeight: LongInt; 
4380  414 
finalSurface, tmpsurf, rotatedEdge: PSDL_Surface; 
415 
rect: TSDL_Rect; 

10127  416 
{$IFNDEF PAS2C} 
15092
ba9d54d1c25d
Speech bubbles: Fix wordwrapping being used between interpunction
Wuzzy <Wuzzy2@mail.ru>
parents:
14747
diff
changeset

417 
breakChars: set of char = [#9,' ','']; 
10127  418 
{$ENDIF} 
10689
692649e341fc
change string types of speech bubbles fix to work with pas2c
sheepluva
parents:
10687
diff
changeset

419 
substr: ansistring; 
4380  420 
edge, corner, tail: TSPrite; 
421 
begin 

10139  422 
if cOnlyStats then exit(nil); 
423 

4380  424 
case SpeechType of 
10142  425 
1: begin 
10139  426 
edge:= sprSpeechEdge; 
427 
corner:= sprSpeechCorner; 

428 
tail:= sprSpeechTail; 

429 
end; 

10142  430 
2: begin 
10139  431 
edge:= sprThoughtEdge; 
432 
corner:= sprThoughtCorner; 

433 
tail:= sprThoughtTail; 

434 
end; 

10142  435 
3: begin 
10139  436 
edge:= sprShoutEdge; 
437 
corner:= sprShoutCorner; 

438 
tail:= sprShoutTail; 

10142  439 
end 
440 
else 

441 
exit(nil) 

4380  442 
end; 
443 
edgeHeight:= SpritesData[edge].Height; 

444 
edgeWidth:= SpritesData[edge].Width; 

445 
cornerWidth:= SpritesData[corner].Width; 

446 
cornerHeight:= SpritesData[corner].Height; 

447 
// This one screws up WrapText 

448 
//s:= 'This is the song that never ends. ''cause it goes on and on my friends. Some people, started singing it not knowing what it was. And they''ll just go on singing it forever just because... This is the song that never ends...'; 

449 
// This one does not 

450 
//s:= 'This is the song that never ends. cause it goes on and on my friends. Some people, started singing it not knowing what it was. And they will go on singing it forever just because... This is the song that never ends... '; 

451 

452 
numLines:= 0; 

453 

6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6286
diff
changeset

454 
if length(s) = 0 then 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6286
diff
changeset

455 
s:= '...'; 
4380  456 
font:= CheckCJKFont(s, font); 
457 
w:= 0; h:= 0; // avoid compiler hints 

10127  458 
TTF_SizeUTF8(Fontz[font].Handle, PChar(s), @w, @h); 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6286
diff
changeset

459 
if w<8 then 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6286
diff
changeset

460 
w:= 8; 
4380  461 
j:= 0; 
462 
if (length(s) > 20) then 

463 
begin 

464 
w:= 0; 

465 
i:= round(Sqrt(length(s)) * 2); 

10127  466 
{$IFNDEF PAS2C} 
15092
ba9d54d1c25d
Speech bubbles: Fix wordwrapping being used between interpunction
Wuzzy <Wuzzy2@mail.ru>
parents:
14747
diff
changeset

467 
s:= WrapText(s, #1, breakChars, i); 
10127  468 
{$ENDIF} 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

469 
pos:= 1; line:= 0; 
4380  470 
// Find the longest line for the purposes of centring the text. Font dependant. 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

471 
while GetNextSpeechLine(s, #1, pos, substr) do 
4380  472 
begin 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

473 
inc(numLines); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

474 
i:= 0; j:= 0; 
10689
692649e341fc
change string types of speech bubbles fix to work with pas2c
sheepluva
parents:
10687
diff
changeset

475 
TTF_SizeUTF8(Fontz[font].Handle, PChar(substr), @i, @j); 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

476 
if i > w then 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

477 
w:= i; 
4380  478 
end; 
479 
end 

480 
else numLines := 1; 

481 

10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

482 
if numLines < 1 then 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

483 
begin 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

484 
s:= '...'; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

485 
numLines:= 1; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

486 
end; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

487 

4380  488 
textWidth:=((w(cornerWidthedgeWidth)*2) div edgeWidth)*edgeWidth+edgeWidth; 
489 
textHeight:=(((numlines * h + 2)((cornerHeightedgeWidth)*2)) div edgeWidth)*edgeWidth; 

490 

491 
textHeight:=max(textHeight,edgeWidth); 

492 
//textWidth:=max(textWidth,SpritesData[tail].Width); 

493 
rect.x:= 0; 

494 
rect.y:= 0; 

495 
rect.w:= textWidth + (cornerWidth * 2); 

496 
rect.h:= textHeight + cornerHeight*2  edgeHeight + SpritesData[tail].Height; 

497 
//s:= inttostr(w) + ' ' + inttostr(numlines) + ' ' + inttostr(rect.x) + ' '+inttostr(rect.y) + ' ' + inttostr(rect.w) + ' ' + inttostr(rect.h); 

498 

499 
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, rect.w, rect.h, 32, RMask, GMask, BMask, AMask); 

500 

11532  501 
if checkFails(finalSurface <> nil, 'RenderString: fail to create surface', true) then 
502 
exit(nil); 

4380  503 

504 
//////////////////////////////// CORNERS /////////////////////////////// 

505 
copyToXY(SpritesData[corner].Surface, finalSurface, 0, 0); /////////////////// NW 

506 

507 
flipSurface(SpritesData[corner].Surface, true); // store all 4 versions in memory to avoid repeated flips? 

508 
x:= 0; 

509 
y:= textHeight + cornerHeight 1; 

510 
copyToXY(SpritesData[corner].Surface, finalSurface, x, y); /////////////////// SW 

511 

512 
flipSurface(SpritesData[corner].Surface, false); 

513 
x:= rect.wcornerWidth1; 

514 
y:= textHeight + cornerHeight 1; 

515 
copyToXY(SpritesData[corner].Surface, finalSurface, x, y); /////////////////// SE 

516 

517 
flipSurface(SpritesData[corner].Surface, true); 

518 
x:= rect.wcornerWidth1; 

519 
y:= 0; 

520 
copyToXY(SpritesData[corner].Surface, finalSurface, x, y); /////////////////// NE 

521 
flipSurface(SpritesData[corner].Surface, false); // restore original position 

522 
//////////////////////////////// END CORNERS /////////////////////////////// 

523 

524 
//////////////////////////////// EDGES ////////////////////////////////////// 

525 
x:= cornerWidth; 

526 
y:= 0; 

527 
while x < rect.wcornerWidth1 do 

528 
begin 

529 
copyToXY(SpritesData[edge].Surface, finalSurface, x, y); ///////////////// top edge 

530 
inc(x,edgeWidth); 

531 
end; 

532 
flipSurface(SpritesData[edge].Surface, true); 

533 
x:= cornerWidth; 

534 
y:= textHeight + cornerHeight*2  edgeHeight1; 

535 
while x < rect.wcornerWidth1 do 

536 
begin 

537 
copyToXY(SpritesData[edge].Surface, finalSurface, x, y); ///////////////// bottom edge 

538 
inc(x,edgeWidth); 

539 
end; 

540 
flipSurface(SpritesData[edge].Surface, true); // restore original position 

541 

542 
rotatedEdge:= SDL_CreateRGBSurface(SDL_SWSURFACE, edgeHeight, edgeWidth, 32, RMask, GMask, BMask, AMask); 

543 
x:= rect.w  edgeHeight  1; 

544 
y:= cornerHeight; 

545 
//// initially was going to rotate in place, but the SDL spec claims width/height are read only 

546 
copyRotatedSurface(SpritesData[edge].Surface,rotatedEdge); 

547 
while y < textHeight + cornerHeight do 

548 
begin 

549 
copyToXY(rotatedEdge, finalSurface, x, y); 

550 
inc(y,edgeWidth); 

551 
end; 

552 
flipSurface(rotatedEdge, false); // restore original position 

553 
x:= 0; 

554 
y:= cornerHeight; 

555 
while y < textHeight + cornerHeight do 

556 
begin 

557 
copyToXY(rotatedEdge, finalSurface, x, y); 

558 
inc(y,edgeWidth); 

559 
end; 

560 
//////////////////////////////// END EDGES ////////////////////////////////////// 

561 

562 
x:= cornerWidth; 

563 
y:= textHeight + cornerHeight * 2  edgeHeight  1; 

564 
copyToXY(SpritesData[tail].Surface, finalSurface, x, y); 

565 

566 
rect.x:= edgeHeight; 

567 
rect.y:= edgeHeight; 

568 
rect.w:= rect.w  edgeHeight * 2; 

569 
rect.h:= textHeight + cornerHeight * 2  edgeHeight * 2; 

570 
i:= rect.w; 

571 
j:= rect.h; 

13489
8935dcc0e130
Always use SDL_Map(A)RGB in SDL_FillRect for color
Wuzzy <Wuzzy2@mail.ru>
parents:
12591
diff
changeset

572 
SDL_FillRect(finalSurface, @rect, SDL_MapRGB(finalSurface^.format, cWhiteColor shr 16, cWhiteColor shr 8, cWhiteColor and $FF)); 
4380  573 

10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

574 
pos:= 1; line:= 0; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

575 
while GetNextSpeechLine(s, #1, pos, substr) do 
4380  576 
begin 
10689
692649e341fc
change string types of speech bubbles fix to work with pas2c
sheepluva
parents:
10687
diff
changeset

577 
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(substr), cNearBlackColorChannels); 
10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

578 
rect.x:= edgeHeight + 1 + ((i  w) div 2); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

579 
// trying to more evenly position the text, vertically 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

580 
rect.y:= edgeHeight + ((j(numLines*h)) div 2) + line * h; 
11507  581 
if not SDLCheck(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true) then 
582 
begin 

583 
SDL_UpperBlit(tmpsurf, nil, finalSurface, @rect); 

584 
SDL_FreeSurface(tmpsurf); 

585 
end; 

10687
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

586 
inc(line); 
4380  587 
end; 
588 

589 
RenderSpeechBubbleTex:= Surface2Tex(finalSurface, true); 

590 

591 
SDL_FreeSurface(rotatedEdge); 

592 
SDL_FreeSurface(finalSurface); 

8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7546
diff
changeset

593 

4380  594 
end; 
595 

4611  596 
end. 