22#ifndef GRAPHICS_BLIT_H
23#define GRAPHICS_BLIT_H
25#include "graphics/pixelformat.h"
26#include "graphics/transform_struct.h"
32class BlendBlitUnfilteredTestSuite;
45struct TransformStruct;
48inline static void convertPaletteToMap(uint32 *dst,
const byte *src, uint colors,
const Graphics::PixelFormat &format) {
49 while (colors-- > 0) {
50 *dst++ = format.RGBToColor(src[0], src[1], src[2]);
70 const uint dstPitch,
const uint srcPitch,
71 const uint w,
const uint h,
72 const uint bytesPerPixel);
87 const uint dstPitch,
const uint srcPitch,
88 const uint w,
const uint h,
89 const uint bytesPerPixel,
const uint32 key);
108bool maskBlit(
byte *dst,
const byte *src,
const byte *mask,
109 const uint dstPitch,
const uint srcPitch,
const uint maskPitch,
110 const uint w,
const uint h,
111 const uint bytesPerPixel);
135 const uint dstPitch,
const uint srcPitch,
136 const uint w,
const uint h,
162 const uint dstPitch,
const uint srcPitch,
163 const uint w,
const uint h,
194 const uint dstPitch,
const uint srcPitch,
const uint maskPitch,
195 const uint w,
const uint h,
198bool crossBlitMap(
byte *dst,
const byte *src,
199 const uint dstPitch,
const uint srcPitch,
200 const uint w,
const uint h,
201 const uint bytesPerPixel,
const uint32 *map);
203bool crossKeyBlitMap(
byte *dst,
const byte *src,
204 const uint dstPitch,
const uint srcPitch,
205 const uint w,
const uint h,
206 const uint bytesPerPixel,
const uint32 *map,
const uint32 key);
208bool crossMaskBlitMap(
byte *dst,
const byte *src,
const byte *mask,
209 const uint dstPitch,
const uint srcPitch,
const uint maskPitch,
210 const uint w,
const uint h,
211 const uint bytesPerPixel,
const uint32 *map);
213bool alphaBlit(
byte *dst,
const byte *src,
214 const uint dstPitch,
const uint srcPitch,
215 const uint w,
const uint h,
217 const byte flip,
const byte aMod);
219bool alphaKeyBlit(
byte *dst,
const byte *src,
220 const uint dstPitch,
const uint srcPitch,
221 const uint w,
const uint h,
223 const uint32 key,
const byte flip,
const byte aMod);
225bool alphaMaskBlit(
byte *dst,
const byte *src,
const byte *mask,
226 const uint dstPitch,
const uint srcPitch,
const uint maskPitch,
227 const uint w,
const uint h,
229 const byte flip,
const byte aMod);
231bool alphaBlitMap(
byte *dst,
const byte *src,
232 const uint dstPitch,
const uint srcPitch,
233 const uint w,
const uint h,
235 const byte flip,
const byte aMod);
237bool alphaKeyBlitMap(
byte *dst,
const byte *src,
238 const uint dstPitch,
const uint srcPitch,
239 const uint w,
const uint h,
241 const uint32 key,
const byte flip,
const byte aMod);
243bool alphaMaskBlitMap(
byte *dst,
const byte *src,
const byte *mask,
244 const uint dstPitch,
const uint srcPitch,
const uint maskPitch,
245 const uint w,
const uint h,
247 const byte flip,
const byte aMod);
249typedef void (*FastBlitFunc)(
byte *,
const byte *,
const uint,
const uint,
const uint,
const uint);
253void fastBlitNEON_XRGB1555_RGB565(
byte *,
const byte *,
const uint,
const uint,
const uint,
const uint);
277bool scaleBlit(
byte *dst,
const byte *src,
278 const uint dstPitch,
const uint srcPitch,
279 const uint dstW,
const uint dstH,
280 const uint srcW,
const uint srcH,
282 const byte flip = 0);
284bool scaleBlitBilinear(
byte *dst,
const byte *src,
285 const uint dstPitch,
const uint srcPitch,
286 const uint dstW,
const uint dstH,
287 const uint srcW,
const uint srcH,
289 const byte flip = 0);
291bool rotoscaleBlit(
byte *dst,
const byte *src,
292 const uint dstPitch,
const uint srcPitch,
293 const uint dstW,
const uint dstH,
294 const uint srcW,
const uint srcH,
299bool rotoscaleBlitBilinear(
byte *dst,
const byte *src,
300 const uint dstPitch,
const uint srcPitch,
301 const uint dstW,
const uint dstH,
302 const uint srcW,
const uint srcH,
307bool applyColorKey(
byte *dst,
const byte *src,
308 const uint dstPitch,
const uint srcPitch,
309 const uint w,
const uint h,
311 const uint8 rKey,
const uint8 gKey,
const uint8 bKey,
312 const uint8 rNew,
const uint8 gNew,
const uint8 bNew);
314bool setAlpha(
byte *dst,
const byte *src,
315 const uint dstPitch,
const uint srcPitch,
316 const uint w,
const uint h,
318 const bool skipTransparent,
const uint8 alpha);
324 bool rgbmod, alphamod;
330 int scaleX, scaleY, scaleXoff, scaleYoff;
336 Args(
byte *dst,
const byte *src,
337 const uint dstPitch,
const uint srcPitch,
338 const int posX,
const int posY,
339 const uint width,
const uint height,
340 const int scaleX,
const int scaleY,
341 const int scaleXsrcOff,
const int scaleYsrcOff,
342 const uint32 colorMod,
const uint flipping);
346 static void blitNEON(Args &args,
const TSpriteBlendMode &blendMode,
const AlphaType &alphaType);
349 static void blitSSE2(Args &args,
const TSpriteBlendMode &blendMode,
const AlphaType &alphaType);
352 static void blitAVX2(Args &args,
const TSpriteBlendMode &blendMode,
const AlphaType &alphaType);
354 static void blitGeneric(Args &args,
const TSpriteBlendMode &blendMode,
const AlphaType &alphaType);
356 static void blitT(Args &args,
const TSpriteBlendMode &blendMode,
const AlphaType &alphaType);
358 typedef void(*BlitFunc)(Args &,
const TSpriteBlendMode &,
const AlphaType &);
359 static BlitFunc blitFunc;
361 static void fillGeneric(Args &args,
const TSpriteBlendMode &blendMode);
363 static void fillT(Args &args,
const TSpriteBlendMode &blendMode);
365 typedef void(*FillFunc)(Args &,
const TSpriteBlendMode &);
366 static FillFunc fillFunc;
368 friend class ::BlendBlitUnfilteredTestSuite;
369 friend class BlendBlitImpl_Default;
370 friend class BlendBlitImpl_NEON;
371 friend class BlendBlitImpl_SSE2;
372 friend class BlendBlitImpl_AVX2;
375 static const int SCALE_THRESHOLD = 0x100;
376 static const int kBModShift = 8;
377 static const int kGModShift = 16;
378 static const int kRModShift = 24;
379 static const int kAModShift = 0;
381 static const uint32 kBModMask = 0x0000ff00;
382 static const uint32 kGModMask = 0x00ff0000;
383 static const uint32 kRModMask = 0xff000000;
384 static const uint32 kAModMask = 0x000000ff;
385 static const uint32 kRGBModMask = (kRModMask | kGModMask | kBModMask);
387#ifdef SCUMM_LITTLE_ENDIAN
388 static const int kAIndex = 0;
389 static const int kBIndex = 1;
390 static const int kGIndex = 2;
391 static const int kRIndex = 3;
393 static const int kAIndex = 3;
394 static const int kBIndex = 2;
395 static const int kGIndex = 1;
396 static const int kRIndex = 0;
399 static inline int getScaleFactor(
int srcSize,
int dstSize) {
400 return SCALE_THRESHOLD * srcSize / dstSize;
437 static void blit(
byte *dst,
const byte *src,
438 const uint dstPitch,
const uint srcPitch,
439 const int posX,
const int posY,
440 const uint width,
const uint height,
441 const int scaleX,
const int scaleY,
442 const int scaleXsrcOff,
const int scaleYsrcOff,
443 const uint32 colorMod,
const uint flipping,
444 const TSpriteBlendMode blendMode,
445 const AlphaType alphaType);
457 static void fill(
byte *dst,
const uint dstPitch,
458 const uint width,
const uint height,
459 const uint32 colorMod,
460 const TSpriteBlendMode blendMode);
static void blit(byte *dst, const byte *src, const uint dstPitch, const uint srcPitch, const int posX, const int posY, const uint width, const uint height, const int scaleX, const int scaleY, const int scaleXsrcOff, const int scaleYsrcOff, const uint32 colorMod, const uint flipping, const TSpriteBlendMode blendMode, const AlphaType alphaType)
static void fill(byte *dst, const uint dstPitch, const uint width, const uint height, const uint32 colorMod, const TSpriteBlendMode blendMode)
static PixelFormat getSupportedPixelFormat()
Definition: blit.h:411
bool crossMaskBlit(byte *dst, const byte *src, const byte *mask, const uint dstPitch, const uint srcPitch, const uint maskPitch, const uint w, const uint h, const Graphics::PixelFormat &dstFmt, const Graphics::PixelFormat &srcFmt)
bool crossBlit(byte *dst, const byte *src, const uint dstPitch, const uint srcPitch, const uint w, const uint h, const Graphics::PixelFormat &dstFmt, const Graphics::PixelFormat &srcFmt)
bool keyBlit(byte *dst, const byte *src, const uint dstPitch, const uint srcPitch, const uint w, const uint h, const uint bytesPerPixel, const uint32 key)
bool crossKeyBlit(byte *dst, const byte *src, const uint dstPitch, const uint srcPitch, const uint w, const uint h, const Graphics::PixelFormat &dstFmt, const Graphics::PixelFormat &srcFmt, const uint32 key)
void copyBlit(byte *dst, const byte *src, const uint dstPitch, const uint srcPitch, const uint w, const uint h, const uint bytesPerPixel)
FastBlitFunc getFastBlitFunc(const PixelFormat &dstFmt, const PixelFormat &srcFmt)
bool maskBlit(byte *dst, const byte *src, const byte *mask, const uint dstPitch, const uint srcPitch, const uint maskPitch, const uint w, const uint h, const uint bytesPerPixel)
Definition: algorithm.h:29
Definition: formatinfo.h:28
Definition: display_client.h:58