author  sheepluva 
Wed, 17 Dec 2014 19:23:57 +0100  
changeset 10690  c3b73dc33294 
parent 10689  692649e341fc 
child 10691  97f45f1374be 
permissions  rwrr 
4976  1 
(* 
2 
* Hedgewars, a free turn based strategy game 

9998  3 
* Copyright (c) 20042014 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; 
10116
dd27562b6f21
rolling back my PChar stuff, because unC0Rr improves string handling pas2c instead <3
sheepluva
parents:
10108
diff
changeset

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

41 
implementation 

7063  42 
uses uUtils, uVariables, uConsts, uTextures, SysUtils, uDebug; 
4380  43 

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

45 
var r: TSDL_Rect; 

46 
begin 

47 
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

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

49 
SDL_FillRect(Surface, @r, 0); 
4380  50 

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

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

53 

54 
r.y:= rect^.y + 1; 

55 
r.h:= rect^.h  2; 

56 
SDL_FillRect(Surface, @r, BorderColor); 

57 
r.x:= rect^.x + 1; 

58 
r.w:= rect^.w  2; 

59 
r.y:= rect^.y; 

60 
r.h:= rect^.h; 

61 
SDL_FillRect(Surface, @r, BorderColor); 

62 
r.x:= rect^.x + 2; 

63 
r.y:= rect^.y + 1; 

64 
r.w:= rect^.w  4; 

65 
r.h:= rect^.h  2; 

66 
SDL_FillRect(Surface, @r, FillColor); 

67 
r.x:= rect^.x + 1; 

68 
r.y:= rect^.y + 2; 

69 
r.w:= rect^.w  2; 

70 
r.h:= rect^.h  4; 

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

71 
SDL_FillRect(Surface, @r, FillColor); 
4380  72 
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

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

74 
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

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

76 
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

77 
end;*) 
4380  78 

10116
dd27562b6f21
rolling back my PChar stuff, because unC0Rr improves string handling pas2c instead <3
sheepluva
parents:
10108
diff
changeset

79 
function WriteInRoundRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: ansistring; maxLength: LongWord): TSDL_Rect; 
10494  80 
var w, h: Longword; 
4380  81 
tmpsurf: PSDL_Surface; 
82 
clr: TSDL_Color; 

6750  83 
finalRect, textRect: TSDL_Rect; 
4380  84 
begin 
10127  85 
TTF_SizeUTF8(Fontz[Font].Handle, PChar(s), @w, @h); 
10494  86 
if (maxLength > 0) and (w > maxLength) then w := maxLength; 
4380  87 
finalRect.x:= X; 
88 
finalRect.y:= Y; 

6982  89 
finalRect.w:= w + cFontBorder * 2 + 4; 
90 
finalRect.h:= h + cFontBorder * 2; 

6750  91 
textRect.x:= X; 
92 
textRect.y:= Y; 

93 
textRect.w:= w; 

94 
textRect.h:= h; 

7546
b50556f2a0e8
This union hasn't been needed for 5 years, and makes using other headers harder.
nemo
parents:
7069
diff
changeset

95 
DrawRoundRect(@finalRect, cWhiteColor, cNearBlackColor, Surface, true); 
4380  96 
clr.r:= (Color shr 16) and $FF; 
97 
clr.g:= (Color shr 8) and $FF; 

98 
clr.b:= Color and $FF; 

10127  99 
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr); 
6982  100 
finalRect.x:= X + cFontBorder + 2; 
101 
finalRect.y:= Y + cFontBorder; 

4380  102 
SDLTry(tmpsurf <> nil, true); 
6750  103 
SDL_UpperBlit(tmpsurf, @textRect, Surface, @finalRect); 
4380  104 
SDL_FreeSurface(tmpsurf); 
105 
finalRect.x:= X; 

106 
finalRect.y:= Y; 

6982  107 
finalRect.w:= w + cFontBorder * 2 + 4; 
108 
finalRect.h:= h + cFontBorder * 2; 

4380  109 
WriteInRoundRect:= finalRect; 
110 
end; 

111 

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

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

114 
tmpPixel: Longword; 

115 
pixels: PLongWordArray; 

116 
begin 

117 
TryDo(Surface^.format^.BytesPerPixel = 4, 'flipSurface failed, expecting 32 bit surface', true); 

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

118 
SDL_LockSurface(Surface); 
4380  119 
pixels:= Surface^.pixels; 
120 
if Vertical then 

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

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

123 
begin 

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

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

126 
tmpPixel:= pixels^[i]; 

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

128 
pixels^[j]:= tmpPixel; 

129 
end 

130 
else 

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

132 
for y := 0 to Surface^.h 1 do 

133 
begin 

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

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

136 
tmpPixel:= pixels^[i]; 

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

138 
pixels^[j]:= tmpPixel; 

139 
end; 

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

140 
SDL_UnlockSurface(Surface); 
4380  141 
end; 
142 

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

143 
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

144 
begin 
7013  145 
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

146 
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

147 

7013  148 
procedure copyToXYFromRect(src, dest: PSDL_Surface; srcX, srcY, srcW, srcH, destX, destY: 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

149 
var i, j, maxDest, maxSrc, iX, iY: LongInt; 
4380  150 
srcPixels, destPixels: PLongWordArray; 
151 
r0, g0, b0, a0, r1, g1, b1, a1: Byte; 

152 
begin 

153 
maxDest:= (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

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

155 

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

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

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

158 

4380  159 
srcPixels:= src^.pixels; 
160 
destPixels:= dest^.pixels; 

161 

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

162 
for iX:= 0 to srcW  1 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

163 
for iY:= 0 to srcH  1 do 
4380  164 
begin 
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

165 
i:= (destY + iY) * (dest^.pitch div 4) + (destX + iX); 
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

166 
j:= (srcY + iY) * (src^.pitch div 4) + (srcX + iX); 
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

167 
if (i < maxDest) and (j < maxSrc) and (srcPixels^[j] and AMask <> 0) then 
4380  168 
begin 
169 
SDL_GetRGBA(destPixels^[i], dest^.format, @r0, @g0, @b0, @a0); 

170 
SDL_GetRGBA(srcPixels^[j], src^.format, @r1, @g1, @b1, @a1); 

171 
r0:= (r0 * (255  LongInt(a1)) + r1 * LongInt(a1)) div 255; 

172 
g0:= (g0 * (255  LongInt(a1)) + g1 * LongInt(a1)) div 255; 

173 
b0:= (b0 * (255  LongInt(a1)) + b1 * LongInt(a1)) div 255; 

174 
a0:= (a0 * (255  LongInt(a1)) + a1 * LongInt(a1)) div 255; 

175 
destPixels^[i]:= SDL_MapRGBA(dest^.format, r0, g0, b0, a0); 

176 
end; 

177 
end; 

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

178 

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

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

180 
SDL_UnlockSurface(dest); 
4380  181 
end; 
182 

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

183 
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

184 
begin 
7013  185 
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

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

187 

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

189 
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

190 
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

191 
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

192 
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

193 
col:= Frame div numFramesFirstCol; 
10015  194 

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

196 
col*SpritesData[sprite].Width, 

197 
row*SpritesData[sprite].Height, 

198 
SpritesData[sprite].Width, 

199 
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

200 
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

201 
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

202 

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

203 
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

204 
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

205 
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

206 
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

207 
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

208 
begin 
6992  209 
//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

210 
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

211 

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

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

213 

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

214 
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

215 

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

216 
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

217 
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

218 
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

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

221 

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

222 
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

223 
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

224 
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

225 

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

226 
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

227 

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

228 
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

229 
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

230 
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

231 
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

232 
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

233 
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

234 

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

235 
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

236 
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

237 
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

238 
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

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

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

241 
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

242 
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

243 

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

246 
srcPixels, destPixels: PLongWordArray; 

247 
begin 

248 
TryDo(src^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true); 

249 
TryDo(dest^.format^.BytesPerPixel = 4, 'rotateSurface failed, expecting 32 bit surface', true); 

250 

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

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

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

253 

4380  254 
srcPixels:= src^.pixels; 
255 
destPixels:= dest^.pixels; 

256 

257 
j:= 0; 

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

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

260 
begin 

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

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

263 
inc(j) 

264 
end; 

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

265 

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

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

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

268 

4380  269 
end; 
270 

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

271 
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

272 
begin 
10116
dd27562b6f21
rolling back my PChar stuff, because unC0Rr improves string handling pas2c instead <3
sheepluva
parents:
10108
diff
changeset

273 
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

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

275 

10116
dd27562b6f21
rolling back my PChar stuff, because unC0Rr improves string handling pas2c instead <3
sheepluva
parents:
10108
diff
changeset

276 
function RenderStringTexLim(s: ansistring; Color: Longword; font: THWFont; maxLength: LongWord): PTexture; 
10494  277 
var w, h: Longword; 
4380  278 
finalSurface: PSDL_Surface; 
279 
begin 

10139  280 
if cOnlyStats then 
281 
begin 

282 
RenderStringTexLim:= nil; 

283 
end 

284 
else 

285 
begin 

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

287 
font:= CheckCJKFont(s, font); 

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

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

10494  290 
if (maxLength > 0) and (w > maxLength) then w := maxLength; 
4380  291 

10139  292 
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w + cFontBorder * 2 + 4, h + cFontBorder * 2, 
293 
32, RMask, GMask, BMask, AMask); 

4380  294 

10139  295 
TryDo(finalSurface <> nil, 'RenderString: fail to create surface', true); 
296 

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

4380  298 

10139  299 
TryDo(SDL_SetColorKey(finalSurface, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); 
4380  300 

10139  301 
RenderStringTexLim:= Surface2Tex(finalSurface, false); 
4380  302 

10139  303 
SDL_FreeSurface(finalSurface); 
304 
end; 

4380  305 
end; 
306 

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

307 
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

308 
var p, l, m, r: Integer; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

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

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

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

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

313 

10690  314 
substr:= ''; 
315 

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

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

317 

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

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

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

320 

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

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

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

323 

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

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

325 

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

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

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

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

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

330 

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

331 
// strip empty lines, spaces and newlines on beginnings of line 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

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

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

334 

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

335 
newl:= (c = ldelim); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

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

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

338 

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

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

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

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

342 

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

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

344 

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

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

346 

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

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

348 
end; 
4380  349 

350 
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

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

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

357 
substr: ansistring; 
4380  358 
edge, corner, tail: TSPrite; 
359 
begin 

10139  360 
if cOnlyStats then exit(nil); 
361 

362 
case SpeechType of 

10142  363 
1: begin 
10139  364 
edge:= sprSpeechEdge; 
365 
corner:= sprSpeechCorner; 

366 
tail:= sprSpeechTail; 

367 
end; 

10142  368 
2: begin 
10139  369 
edge:= sprThoughtEdge; 
370 
corner:= sprThoughtCorner; 

371 
tail:= sprThoughtTail; 

372 
end; 

10142  373 
3: begin 
10139  374 
edge:= sprShoutEdge; 
375 
corner:= sprShoutCorner; 

376 
tail:= sprShoutTail; 

10142  377 
end 
378 
else 

379 
exit(nil) 

4380  380 
end; 
381 
edgeHeight:= SpritesData[edge].Height; 

382 
edgeWidth:= SpritesData[edge].Width; 

383 
cornerWidth:= SpritesData[corner].Width; 

384 
cornerHeight:= SpritesData[corner].Height; 

385 
// This one screws up WrapText 

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

387 
// This one does not 

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

389 

390 
numLines:= 0; 

391 

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

392 
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

393 
s:= '...'; 
10116
dd27562b6f21
rolling back my PChar stuff, because unC0Rr improves string handling pas2c instead <3
sheepluva
parents:
10108
diff
changeset

394 
font:= CheckCJKFont(s, font); 
4380  395 
w:= 0; h:= 0; // avoid compiler hints 
10127  396 
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

397 
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

398 
w:= 8; 
4380  399 
j:= 0; 
400 
if (length(s) > 20) then 

401 
begin 

402 
w:= 0; 

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

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

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

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

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

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

413 
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

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

415 
w:= i; 
4380  416 
end; 
417 
end 

418 
else numLines := 1; 

419 

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

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

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

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

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

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

425 

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

428 

429 
textHeight:=max(textHeight,edgeWidth); 

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

431 
rect.x:= 0; 

432 
rect.y:= 0; 

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

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

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

436 

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

438 

439 
TryDo(finalSurface <> nil, 'RenderString: fail to create surface', true); 

440 

441 
//////////////////////////////// CORNERS /////////////////////////////// 

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

443 

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

445 
x:= 0; 

446 
y:= textHeight + cornerHeight 1; 

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

448 

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

450 
x:= rect.wcornerWidth1; 

451 
y:= textHeight + cornerHeight 1; 

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

453 

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

455 
x:= rect.wcornerWidth1; 

456 
y:= 0; 

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

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

459 
//////////////////////////////// END CORNERS /////////////////////////////// 

460 

461 
//////////////////////////////// EDGES ////////////////////////////////////// 

462 
x:= cornerWidth; 

463 
y:= 0; 

464 
while x < rect.wcornerWidth1 do 

465 
begin 

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

467 
inc(x,edgeWidth); 

468 
end; 

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

470 
x:= cornerWidth; 

471 
y:= textHeight + cornerHeight*2  edgeHeight1; 

472 
while x < rect.wcornerWidth1 do 

473 
begin 

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

475 
inc(x,edgeWidth); 

476 
end; 

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

478 

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

480 
x:= rect.w  edgeHeight  1; 

481 
y:= cornerHeight; 

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

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

484 
while y < textHeight + cornerHeight do 

485 
begin 

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

487 
inc(y,edgeWidth); 

488 
end; 

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

490 
x:= 0; 

491 
y:= cornerHeight; 

492 
while y < textHeight + cornerHeight do 

493 
begin 

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

495 
inc(y,edgeWidth); 

496 
end; 

497 
//////////////////////////////// END EDGES ////////////////////////////////////// 

498 

499 
x:= cornerWidth; 

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

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

502 

503 
rect.x:= edgeHeight; 

504 
rect.y:= edgeHeight; 

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

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

507 
i:= rect.w; 

508 
j:= rect.h; 

509 
SDL_FillRect(finalSurface, @rect, cWhiteColor); 

510 

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

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

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

514 
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

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

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

517 
rect.y:= edgeHeight + ((j(numLines*h)) div 2) + line * h; 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

518 
SDLTry(tmpsurf <> nil, true); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

519 
SDL_UpperBlit(tmpsurf, nil, finalSurface, @rect); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

520 
SDL_FreeSurface(tmpsurf); 
2e921409b5b1
cleanup speech bubble code a little. this fixes issue 719
sheepluva
parents:
10494
diff
changeset

521 
inc(line); 
4380  522 
end; 
523 

524 
RenderSpeechBubbleTex:= Surface2Tex(finalSurface, true); 

525 

526 
SDL_FreeSurface(rotatedEdge); 

527 
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

528 

4380  529 
end; 
530 

4611  531 
end. 