// VirtualDub - Video processing and capture application // Graphics support library // Copyright (C) 1998-2009 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include #include #include #include #include void VDPixmapBltAlphaConst8(uint8 *dst, ptrdiff_t dstpitch, const uint8 *src, ptrdiff_t srcpitch, uint32 w, uint32 h, uint32 ialpha); bool VDPixmapBltAlphaConst(const VDPixmap& dst, const VDPixmap& src, float alpha) { if (!(alpha >= 0.0f)) alpha = 0.0f; else if (!(alpha <= 1.0f)) alpha = 1.0f; uint32 ialpha = VDRoundToInt32(alpha * 256.0f); // format check if (dst.format != src.format || !src.format) return false; // degenerate case check if (!dst.w || !dst.h) return false; // size check if (src.w != dst.w || src.h != dst.h) return false; // check for formats that are not 8bpp switch(src.format) { case nsVDPixmap::kPixFormat_Pal1: case nsVDPixmap::kPixFormat_Pal2: case nsVDPixmap::kPixFormat_Pal4: case nsVDPixmap::kPixFormat_Pal8: case nsVDPixmap::kPixFormat_RGB565: case nsVDPixmap::kPixFormat_XRGB1555: return false; } const VDPixmapFormatInfo& formatInfo = VDPixmapGetInfo(src.format); const int qw = -(-dst.w >> formatInfo.qwbits); const int qh = -(-dst.h >> formatInfo.qhbits); const int auxw = -(-dst.w >> formatInfo.auxwbits); const int auxh = -(-dst.h >> formatInfo.auxhbits); switch(formatInfo.auxbufs) { case 2: VDPixmapBltAlphaConst8((uint8 *)dst.data3, dst.pitch3, (const uint8 *)src.data3, src.pitch3, auxw, auxh, ialpha); case 1: VDPixmapBltAlphaConst8((uint8 *)dst.data2, dst.pitch2, (const uint8 *)src.data2, src.pitch2, auxw, auxh, ialpha); case 0: VDPixmapBltAlphaConst8((uint8 *)dst.data, dst.pitch, (const uint8 *)src.data, src.pitch, formatInfo.qsize * qw, qh, ialpha); } return true; } void VDPixmapBltAlphaConst8(uint8 *dst, ptrdiff_t dstpitch, const uint8 *src, ptrdiff_t srcpitch, uint32 w, uint32 h, uint32 ialpha) { dstpitch -= w; srcpitch -= w; do { uint32 w2 = w; do { sint32 sc = *src; sint32 dc = *dst; *dst = dc + (((sc-dc)*ialpha + 128) >> 8); ++src; ++dst; } while(--w2); src += srcpitch; dst += dstpitch; } while(--h); }