142 SDL_UnlockSurface(Surface); |
142 SDL_UnlockSurface(Surface); |
143 end; |
143 end; |
144 |
144 |
145 procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); inline; |
145 procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); inline; |
146 begin |
146 begin |
|
147 // copy from complete src |
147 copyToXYFromRect(src, dest, 0, 0, src^.w, src^.h, destX, destY); |
148 copyToXYFromRect(src, dest, 0, 0, src^.w, src^.h, destX, destY); |
148 end; |
149 end; |
149 |
150 |
150 procedure copyToXYFromRect(src, dest: PSDL_Surface; srcX, srcY, srcW, srcH, destX, destY: LongInt); |
151 procedure copyToXYFromRect(src, dest: PSDL_Surface; srcX, srcY, srcW, srcH, destX, destY: LongInt); |
151 var i, j, maxDest, maxSrc, iX, iY: LongInt; |
152 var i, j, iX, iY, dX, dY, lX, lY: LongInt; |
152 srcPixels, destPixels: PLongWordArray; |
153 srcPixels, destPixels: PLongWordArray; |
153 r0, g0, b0, a0, r1, g1, b1, a1: Byte; |
154 r0, g0, b0, a0, r1, g1, b1, a1: Byte; |
154 begin |
155 begin |
155 maxDest:= (dest^.pitch div 4) * dest^.h; |
|
156 maxSrc:= (src^.pitch div 4) * src^.h; |
|
157 |
|
158 SDL_LockSurface(src); |
156 SDL_LockSurface(src); |
159 SDL_LockSurface(dest); |
157 SDL_LockSurface(dest); |
160 |
158 |
161 srcPixels:= src^.pixels; |
159 srcPixels:= src^.pixels; |
162 destPixels:= dest^.pixels; |
160 destPixels:= dest^.pixels; |
163 |
161 |
164 for iX:= 0 to srcW - 1 do |
162 // what's the offset between src and dest coords? |
165 for iY:= 0 to srcH - 1 do |
163 dX:= destX - srcX; |
166 begin |
164 dY:= destY - srcY; |
167 i:= (destY + iY) * (dest^.pitch div 4) + (destX + iX); |
165 |
168 j:= (srcY + iY) * (src^.pitch div 4) + (srcX + iX); |
166 // let's figure out where the rectangle we can actually copy ends |
169 if (i < maxDest) and (j < maxSrc) and (srcPixels^[j] and AMask <> 0) then |
167 lX:= ( min( min(srcX + srcW, src^.w), min(destX + srcW + dx, dest^.w) - dx ) ) - 1; |
|
168 lY:= ( min( min(srcY + srcH, src^.h), min(destY + srcH + dy, dest^.h) - dY ) ) - 1; |
|
169 |
|
170 for iX:= srcX to lX do |
|
171 for iY:= srcY to lY do |
|
172 begin |
|
173 i:= (iY + dY) * dest^.w + (iX + dX); |
|
174 j:= iY * src^.w + iX; |
|
175 if srcPixels^[j] and AMask <> 0 then |
170 begin |
176 begin |
171 SDL_GetRGBA(destPixels^[i], dest^.format, @r0, @g0, @b0, @a0); |
177 SDL_GetRGBA(destPixels^[i], dest^.format, @r0, @g0, @b0, @a0); |
172 SDL_GetRGBA(srcPixels^[j], src^.format, @r1, @g1, @b1, @a1); |
178 SDL_GetRGBA(srcPixels^[j], src^.format, @r1, @g1, @b1, @a1); |
173 r0:= (r0 * (255 - LongInt(a1)) + r1 * LongInt(a1)) div 255; |
179 r0:= (r0 * (255 - LongInt(a1)) + r1 * LongInt(a1)) div 255; |
174 g0:= (g0 * (255 - LongInt(a1)) + g1 * LongInt(a1)) div 255; |
180 g0:= (g0 * (255 - LongInt(a1)) + g1 * LongInt(a1)) div 255; |