]> git.lizzy.rs Git - irrlicht.git/blobdiff - source/Irrlicht/CBlit.h
Avoid undefined arithmetic on nullptr in buffer_offset function
[irrlicht.git] / source / Irrlicht / CBlit.h
index c2fcf77592b3eff7c96dba4457fc63f0ad81c513..d20ca416332d87d9aa7209249535080113c015ea 100644 (file)
@@ -85,96 +85,6 @@ inline u32 GetClipCode( const AbsRectangle &r, const core::position2d<s32> &p )
        return code;\r
 }\r
 \r
-\r
-/*!\r
-       Cohen Sutherland clipping\r
-       @return: 1 if valid\r
-*/\r
-\r
-static int ClipLine(const AbsRectangle &clipping,\r
-                       core::position2d<s32> &p0,\r
-                       core::position2d<s32> &p1,\r
-                       const core::position2d<s32>& p0_in,\r
-                       const core::position2d<s32>& p1_in)\r
-{\r
-       u32 code0;\r
-       u32 code1;\r
-       u32 code;\r
-\r
-       p0 = p0_in;\r
-       p1 = p1_in;\r
-\r
-       code0 = GetClipCode( clipping, p0 );\r
-       code1 = GetClipCode( clipping, p1 );\r
-\r
-       // trivial accepted\r
-       while ( code0 | code1 )\r
-       {\r
-               s32 x=0;\r
-               s32 y=0;\r
-\r
-               // trivial reject\r
-               if ( code0 & code1 )\r
-                       return 0;\r
-\r
-               if ( code0 )\r
-               {\r
-                       // clip first point\r
-                       code = code0;\r
-               }\r
-               else\r
-               {\r
-                       // clip last point\r
-                       code = code1;\r
-               }\r
-\r
-               if ( (code & CLIPCODE_BOTTOM) == CLIPCODE_BOTTOM )\r
-               {\r
-                       // clip bottom viewport\r
-                       y = clipping.y1;\r
-                       x = p0.X + ( p1.X - p0.X ) * ( y - p0.Y ) / ( p1.Y - p0.Y );\r
-               }\r
-               else\r
-               if ( (code & CLIPCODE_TOP) == CLIPCODE_TOP )\r
-               {\r
-                       // clip to viewport\r
-                       y = clipping.y0;\r
-                       x = p0.X + ( p1.X - p0.X ) * ( y - p0.Y ) / ( p1.Y - p0.Y );\r
-               }\r
-               else\r
-               if ( (code & CLIPCODE_RIGHT) == CLIPCODE_RIGHT )\r
-               {\r
-                       // clip right viewport\r
-                       x = clipping.x1;\r
-                       y = p0.Y + ( p1.Y - p0.Y ) * ( x - p0.X ) / ( p1.X - p0.X );\r
-               }\r
-               else\r
-               if ( (code & CLIPCODE_LEFT) == CLIPCODE_LEFT )\r
-               {\r
-                       // clip left viewport\r
-                       x = clipping.x0;\r
-                       y = p0.Y + ( p1.Y - p0.Y ) * ( x - p0.X ) / ( p1.X - p0.X );\r
-               }\r
-\r
-               if ( code == code0 )\r
-               {\r
-                       // modify first point\r
-                       p0.X = x;\r
-                       p0.Y = y;\r
-                       code0 = GetClipCode( clipping, p0 );\r
-               }\r
-               else\r
-               {\r
-                       // modify second point\r
-                       p1.X = x;\r
-                       p1.Y = y;\r
-                       code1 = GetClipCode( clipping, p1 );\r
-               }\r
-       }\r
-\r
-       return 1;\r
-}\r
-\r
 /*\r
 */\r
 inline void GetClip(AbsRectangle &clipping, video::IImage * t)\r
@@ -226,263 +136,6 @@ inline u32 PixelLerp32(const u32 source, const u32 value)
 }\r
 \r
 \r
-/*\r
-*/\r
-static void RenderLine32_Decal(video::IImage *t,\r
-                               const core::position2d<s32> &p0,\r
-                               const core::position2d<s32> &p1,\r
-                               u32 argb )\r
-{\r
-       s32 dx = p1.X - p0.X;\r
-       s32 dy = p1.Y - p0.Y;\r
-\r
-       s32 c;\r
-       s32 m;\r
-       s32 d = 0;\r
-       s32 run;\r
-\r
-       s32 xInc = 4;\r
-       s32 yInc = (s32) t->getPitch();\r
-\r
-       if ( dx < 0 )\r
-       {\r
-               xInc = -xInc;\r
-               dx = -dx;\r
-       }\r
-\r
-       if ( dy < 0 )\r
-       {\r
-               yInc = -yInc;\r
-               dy = -dy;\r
-       }\r
-\r
-       u32 *dst;\r
-       dst = (u32*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 4 ) );\r
-\r
-       if ( dy > dx )\r
-       {\r
-               s32 tmp;\r
-               tmp = dx;\r
-               dx = dy;\r
-               dy = tmp;\r
-               tmp = xInc;\r
-               xInc = yInc;\r
-               yInc = tmp;\r
-       }\r
-\r
-       c = dx << 1;\r
-       m = dy << 1;\r
-\r
-       run = dx;\r
-       do\r
-       {\r
-               *dst = argb;\r
-\r
-               dst = (u32*) ( (u8*) dst + xInc );      // x += xInc\r
-               d += m;\r
-               if ( d > dx )\r
-               {\r
-                       dst = (u32*) ( (u8*) dst + yInc );      // y += yInc\r
-                       d -= c;\r
-               }\r
-               run -= 1;\r
-       } while (run>=0);\r
-}\r
-\r
-\r
-/*\r
-*/\r
-static void RenderLine32_Blend(video::IImage *t,\r
-                               const core::position2d<s32> &p0,\r
-                               const core::position2d<s32> &p1,\r
-                               u32 argb, u32 alpha)\r
-{\r
-       s32 dx = p1.X - p0.X;\r
-       s32 dy = p1.Y - p0.Y;\r
-\r
-       s32 c;\r
-       s32 m;\r
-       s32 d = 0;\r
-       s32 run;\r
-\r
-       s32 xInc = 4;\r
-       s32 yInc = (s32) t->getPitch();\r
-\r
-       if ( dx < 0 )\r
-       {\r
-               xInc = -xInc;\r
-               dx = -dx;\r
-       }\r
-\r
-       if ( dy < 0 )\r
-       {\r
-               yInc = -yInc;\r
-               dy = -dy;\r
-       }\r
-\r
-       u32 *dst;\r
-       dst = (u32*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 4 ) );\r
-\r
-       if ( dy > dx )\r
-       {\r
-               s32 tmp;\r
-               tmp = dx;\r
-               dx = dy;\r
-               dy = tmp;\r
-               tmp = xInc;\r
-               xInc = yInc;\r
-               yInc = tmp;\r
-       }\r
-\r
-       c = dx << 1;\r
-       m = dy << 1;\r
-\r
-       run = dx;\r
-       const u32 packA = packAlpha ( alpha );\r
-       do\r
-       {\r
-               *dst = packA | PixelBlend32( *dst, argb, alpha );\r
-\r
-               dst = (u32*) ( (u8*) dst + xInc );      // x += xInc\r
-               d += m;\r
-               if ( d > dx )\r
-               {\r
-                       dst = (u32*) ( (u8*) dst + yInc );      // y += yInc\r
-                       d -= c;\r
-               }\r
-               run -= 1;\r
-       } while (run>=0);\r
-}\r
-\r
-/*\r
-*/\r
-static void RenderLine16_Decal(video::IImage *t,\r
-                               const core::position2d<s32> &p0,\r
-                               const core::position2d<s32> &p1,\r
-                               u32 argb )\r
-{\r
-       s32 dx = p1.X - p0.X;\r
-       s32 dy = p1.Y - p0.Y;\r
-\r
-       s32 c;\r
-       s32 m;\r
-       s32 d = 0;\r
-       s32 run;\r
-\r
-       s32 xInc = 2;\r
-       s32 yInc = (s32) t->getPitch();\r
-\r
-       if ( dx < 0 )\r
-       {\r
-               xInc = -xInc;\r
-               dx = -dx;\r
-       }\r
-\r
-       if ( dy < 0 )\r
-       {\r
-               yInc = -yInc;\r
-               dy = -dy;\r
-       }\r
-\r
-       u16 *dst;\r
-       dst = (u16*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 2 ) );\r
-\r
-       if ( dy > dx )\r
-       {\r
-               s32 tmp;\r
-               tmp = dx;\r
-               dx = dy;\r
-               dy = tmp;\r
-               tmp = xInc;\r
-               xInc = yInc;\r
-               yInc = tmp;\r
-       }\r
-\r
-       c = dx << 1;\r
-       m = dy << 1;\r
-\r
-       run = dx;\r
-       do\r
-       {\r
-               *dst = (u16)argb;\r
-\r
-               dst = (u16*) ( (u8*) dst + xInc );      // x += xInc\r
-               d += m;\r
-               if ( d > dx )\r
-               {\r
-                       dst = (u16*) ( (u8*) dst + yInc );      // y += yInc\r
-                       d -= c;\r
-               }\r
-               run -= 1;\r
-       } while (run>=0);\r
-}\r
-\r
-/*\r
-*/\r
-static void RenderLine16_Blend(video::IImage *t,\r
-                               const core::position2d<s32> &p0,\r
-                               const core::position2d<s32> &p1,\r
-                               u16 argb,\r
-                               u16 alpha)\r
-{\r
-       s32 dx = p1.X - p0.X;\r
-       s32 dy = p1.Y - p0.Y;\r
-\r
-       s32 c;\r
-       s32 m;\r
-       s32 d = 0;\r
-       s32 run;\r
-\r
-       s32 xInc = 2;\r
-       s32 yInc = (s32) t->getPitch();\r
-\r
-       if ( dx < 0 )\r
-       {\r
-               xInc = -xInc;\r
-               dx = -dx;\r
-       }\r
-\r
-       if ( dy < 0 )\r
-       {\r
-               yInc = -yInc;\r
-               dy = -dy;\r
-       }\r
-\r
-       u16 *dst;\r
-       dst = (u16*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 2 ) );\r
-\r
-       if ( dy > dx )\r
-       {\r
-               s32 tmp;\r
-               tmp = dx;\r
-               dx = dy;\r
-               dy = tmp;\r
-               tmp = xInc;\r
-               xInc = yInc;\r
-               yInc = tmp;\r
-       }\r
-\r
-       c = dx << 1;\r
-       m = dy << 1;\r
-\r
-       run = dx;\r
-       const u16 packA = alpha ? 0x8000 : 0;\r
-       do\r
-       {\r
-               *dst = packA | PixelBlend16( *dst, argb, alpha );\r
-\r
-               dst = (u16*) ( (u8*) dst + xInc );      // x += xInc\r
-               d += m;\r
-               if ( d > dx )\r
-               {\r
-                       dst = (u16*) ( (u8*) dst + yInc );      // y += yInc\r
-                       d -= c;\r
-               }\r
-               run -= 1;\r
-       } while (run>=0);\r
-}\r
-\r
-\r
 /*!\r
 */\r
 static void executeBlit_TextureCopy_x_to_x( const SBlitJob * job )\r
@@ -1404,123 +1057,6 @@ static s32 Blit(eBlitter operation,
        return 1;\r
 }\r
 \r
-#if defined(SOFTWARE_DRIVER_2_2D_AS_2D)\r
-static s32 StretchBlit(eBlitter operation,\r
-               video::IImage* dest, const core::rect<s32>* destClipping,const core::rect<s32> *destRect,\r
-               video::IImage* const source,const core::rect<s32> *srcRect, const core::dimension2d<u32>* source_org,\r
-               u32 argb)\r
-{\r
-       tExecuteBlit blitter = getBlitter2( operation, dest, source );\r
-       if ( 0 == blitter )\r
-       {\r
-               return 0;\r
-       }\r
-\r
-       SBlitJob job;\r
-\r
-       AbsRectangle destClip;\r
-       AbsRectangle v;\r
-       setClip(destClip, destClipping, dest, 0, 0);\r
-       setClip(v, destRect, 0, 1, 0);\r
-       if (!intersect(job.Dest, destClip, v))\r
-               return 0;\r
-\r
-       // Clipping\r
-       setClip ( job.Source, srcRect, source, 1, source_org);\r
-\r
-       job.width = job.Dest.x1-job.Dest.x0;\r
-       job.height = job.Dest.y1-job.Dest.y0;\r
-\r
-       job.argb = argb;\r
-\r
-       // use original dest size, despite any clipping\r
-       const int dst_w = v.x1 - v.x0; // destRect->getWidth();\r
-       const int dst_h = v.y1 - v.y0; // destRect->getHeight();\r
-       const int src_w = job.Source.x1 - job.Source.x0;\r
-       const int src_h = job.Source.y1 - job.Source.y0;\r
-\r
-       job.stretch = dst_w != src_w || dst_h != src_h;\r
-       job.x_stretch = dst_w ? (float)src_w / (float)dst_w : 1.f;\r
-       job.y_stretch = dst_h ? (float)src_h / (float)dst_h : 1.f;\r
-\r
-\r
-       if ( source )\r
-       {\r
-               job.srcPitch = source->getPitch();\r
-               job.srcPixelMul = source->getBytesPerPixel();\r
-\r
-               //dest-clippling. advance source. loosing subpixel precision\r
-               job.Source.x0 += (s32)floorf(job.x_stretch * (job.Dest.x0 - v.x0));\r
-               job.Source.y0 += (s32)floorf(job.y_stretch * (job.Dest.y0 - v.y0));\r
-\r
-               job.src = (void*) ( (u8*) source->getData() + ( job.Source.y0 * job.srcPitch ) + ( job.Source.x0 * job.srcPixelMul ) );\r
-       }\r
-       else\r
-       {\r
-               // use srcPitch for color operation on dest\r
-               job.srcPitch = job.width * dest->getBytesPerPixel();\r
-       }\r
-\r
-       job.dstPitch = dest->getPitch();\r
-       job.dstPixelMul = dest->getBytesPerPixel();\r
-       job.dst = (void*) ( (u8*) dest->getData() + ( job.Dest.y0 * job.dstPitch ) + ( job.Dest.x0 * job.dstPixelMul ) );\r
-\r
-       blitter( &job );\r
-\r
-       return 1;\r
-}\r
-#endif\r
-\r
-// Methods for Software drivers\r
-//! draws a rectangle\r
-static void drawRectangle(video::IImage* img, const core::rect<s32>& rect, const video::SColor &color)\r
-{\r
-       Blit(color.getAlpha() == 0xFF ? BLITTER_COLOR : BLITTER_COLOR_ALPHA,\r
-                       img, 0, &rect.UpperLeftCorner, 0, &rect, color.color);\r
-}\r
-\r
-\r
-//! draws a line from to with color\r
-static void drawLine(video::IImage* img, const core::position2d<s32>& from,\r
-                                       const core::position2d<s32>& to, const video::SColor &color)\r
-{\r
-       AbsRectangle clip;\r
-       GetClip(clip, img);\r
-\r
-       core::position2d<s32> p[2];\r
-       if (ClipLine( clip, p[0], p[1], from, to))\r
-       {\r
-               u32 alpha = extractAlpha(color.color);\r
-\r
-               switch(img->getColorFormat())\r
-               {\r
-               case video::ECF_A1R5G5B5:\r
-                               if (alpha == 256)\r
-                               {\r
-                                       RenderLine16_Decal(img, p[0], p[1], video::A8R8G8B8toA1R5G5B5(color.color));\r
-                               }\r
-                               else\r
-                               {\r
-                                       RenderLine16_Blend(img, p[0], p[1], video::A8R8G8B8toA1R5G5B5(color.color), alpha >> 3);\r
-                               }\r
-                               break;\r
-               case video::ECF_A8R8G8B8:\r
-                               if (alpha == 256)\r
-                               {\r
-                                       RenderLine32_Decal(img, p[0], p[1], color.color);\r
-                               }\r
-                               else\r
-                               {\r
-                                       RenderLine32_Blend(img, p[0], p[1], color.color, alpha);\r
-                               }\r
-                               break;\r
-               default:\r
-                               break;\r
-               }\r
-       }\r
-}\r
-\r
-\r
 }\r
 \r
 #endif\r