author  Wuzzy <Wuzzy2@mail.ru> 
Tue, 02 Apr 2019 22:40:46 +0200  
changeset 14745  7cc768094d66 
parent 14736  8563cc40fc1e 
child 14747  7dfc6ed13337 
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; 

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

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

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

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

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

6750  118 
SDL_UpperBlit(tmpsurf, @textRect, Surface, @finalRect); 
4380  119 
SDL_FreeSurface(tmpsurf); 
120 
finalRect.x:= X; 

121 
finalRect.y:= Y; 

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

126 

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

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

129 
tmpPixel: Longword; 

130 
pixels: PLongWordArray; 

131 
begin 

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

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

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

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

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

139 
begin 

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

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

142 
tmpPixel:= pixels^[i]; 

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

144 
pixels^[j]:= tmpPixel; 

145 
end 

146 
else 

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

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

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

152 
tmpPixel:= pixels^[i]; 

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

154 
pixels^[j]:= tmpPixel; 

155 
end; 

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

156 
SDL_UnlockSurface(Surface); 
4380  157 
end; 
158 

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

159 
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

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

161 
// copy from complete src 
7013  162 
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

163 
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

164 

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

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

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

172 

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

175 

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

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

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

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

179 

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

180 
// 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

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

182 
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

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

184 
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

185 

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

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

187 
for iY:= srcY to lY do 
4380  188 
begin 
12099  189 
// src pixel index 
190 
spi:= iY * src^.w + iX; 

191 
// dest pixel index 

192 
dpi:= (iY + dY) * dest^.w + (iX + dX); 

193 

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

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

196 

197 
// src pixel opaque? 

198 
if aT = 255 then 

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

202 
continue; 

4380  203 
end; 
12099  204 

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

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

207 

208 
// dest completely transparent? 

209 
if aD = 0 then 

210 
begin 

211 
// just copy src pixel 

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

213 
continue; 

214 
end; 

215 

216 
// looks like some blending is necessary 

217 

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

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

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

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

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

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

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

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

226 

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

227 
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

228 

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

230 

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

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

232 
SDL_UnlockSurface(dest); 
4380  233 
end; 
234 

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

235 
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

236 
begin 
12099  237 
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

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

239 

7013  240 
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

241 
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

242 
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

243 
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

244 
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

245 
col:= Frame div numFramesFirstCol; 
10015  246 

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

248 
col*SpritesData[sprite].Width, 

249 
row*SpritesData[sprite].Height, 

250 
SpritesData[sprite].Width, 

251 
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

252 
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

253 
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

254 

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 
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

256 
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

257 
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

258 
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

259 
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

260 
begin 
6992  261 
//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

262 
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

263 

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

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

265 

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

266 
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

267 

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 
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

269 
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

270 
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

271 
if y0 < y1 then sy:= 1 else sy:= 1; 
10015  272 
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

273 

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 
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

275 
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

276 
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

277 

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 
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

279 

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 
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

281 
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

282 
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

283 
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

284 
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

285 
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

286 

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 
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

288 
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

289 
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

290 
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

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

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

293 
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

294 
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

295 

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

298 
srcPixels, destPixels: PLongWordArray; 

299 
begin 

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

302 
if not allOK then exit; 

4380  303 

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

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

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

306 

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

309 

310 
j:= 0; 

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

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

313 
begin 

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

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

316 
inc(j) 

317 
end; 

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

318 

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

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

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

321 

4380  322 
end; 
323 

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

324 
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

325 
begin 
7013  326 
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

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

328 

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

10139  333 
if cOnlyStats then 
334 
begin 

335 
RenderStringTexLim:= nil; 

336 
end 

337 
else 

338 
begin 

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

340 
font:= CheckCJKFont(s, font); 

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

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

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

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

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

10139  350 

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

4380  352 

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

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

10139  357 
SDL_FreeSurface(finalSurface); 
358 
end; 

4380  359 
end; 
360 

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

361 
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

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

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

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

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

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

367 

10690  368 
substr:= ''; 
369 

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

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

371 

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

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

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

374 

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

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

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

377 

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

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

379 

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

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

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

382 

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

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

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

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

386 

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

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

388 
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

389 

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

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

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

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

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

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

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

396 

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

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

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

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

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

401 

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

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

403 

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

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

405 

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

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

407 

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

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

409 
end; 
4380  410 

411 
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

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

10127  415 
{$IFNDEF PAS2C} 
4611  416 
chars: set of char = [#9,' ',';',':','?','!',',']; 
10127  417 
{$ENDIF} 
10689
692649e341fc
change string types of speech bubbles fix to work with pas2c
sheepluva
parents:
10687
diff
changeset

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

10139  421 
if cOnlyStats then exit(nil); 
422 

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

427 
tail:= sprSpeechTail; 

428 
end; 

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

432 
tail:= sprThoughtTail; 

433 
end; 

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

437 
tail:= sprShoutTail; 

10142  438 
end 
439 
else 

440 
exit(nil) 

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

443 
edgeWidth:= SpritesData[edge].Width; 

444 
cornerWidth:= SpritesData[corner].Width; 

445 
cornerHeight:= SpritesData[corner].Height; 

446 
// This one screws up WrapText 

447 
//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...'; 

448 
// This one does not 

449 
//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... '; 

450 

451 
numLines:= 0; 

452 

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

453 
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

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

10127  457 
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

458 
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

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

462 
begin 

463 
w:= 0; 

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

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

468 
pos:= 1; line:= 0; 
4380  469 
// 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

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

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

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

474 
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

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

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

479 
else numLines := 1; 

480 

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

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

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

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

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

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

486 

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

489 

490 
textHeight:=max(textHeight,edgeWidth); 

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

492 
rect.x:= 0; 

493 
rect.y:= 0; 

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

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

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

497 

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

499 

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

4380  502 

503 
//////////////////////////////// CORNERS /////////////////////////////// 

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

505 

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

507 
x:= 0; 

508 
y:= textHeight + cornerHeight 1; 

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

510 

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

512 
x:= rect.wcornerWidth1; 

513 
y:= textHeight + cornerHeight 1; 

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

515 

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

517 
x:= rect.wcornerWidth1; 

518 
y:= 0; 

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

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

521 
//////////////////////////////// END CORNERS /////////////////////////////// 

522 

523 
//////////////////////////////// EDGES ////////////////////////////////////// 

524 
x:= cornerWidth; 

525 
y:= 0; 

526 
while x < rect.wcornerWidth1 do 

527 
begin 

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

529 
inc(x,edgeWidth); 

530 
end; 

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

532 
x:= cornerWidth; 

533 
y:= textHeight + cornerHeight*2  edgeHeight1; 

534 
while x < rect.wcornerWidth1 do 

535 
begin 

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

537 
inc(x,edgeWidth); 

538 
end; 

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

540 

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

542 
x:= rect.w  edgeHeight  1; 

543 
y:= cornerHeight; 

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

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

546 
while y < textHeight + cornerHeight do 

547 
begin 

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

549 
inc(y,edgeWidth); 

550 
end; 

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

552 
x:= 0; 

553 
y:= cornerHeight; 

554 
while y < textHeight + cornerHeight do 

555 
begin 

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

557 
inc(y,edgeWidth); 

558 
end; 

559 
//////////////////////////////// END EDGES ////////////////////////////////////// 

560 

561 
x:= cornerWidth; 

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

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

564 

565 
rect.x:= edgeHeight; 

566 
rect.y:= edgeHeight; 

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

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

569 
i:= rect.w; 

570 
j:= rect.h; 

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

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

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

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

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

576 
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

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

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

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

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

583 
SDL_FreeSurface(tmpsurf); 

584 
end; 

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

585 
inc(line); 
4380  586 
end; 
587 

588 
RenderSpeechBubbleTex:= Surface2Tex(finalSurface, true); 

589 

590 
SDL_FreeSurface(rotatedEdge); 

591 
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

592 

4380  593 
end; 
594 

4611  595 
end. 