void SImage::initData() { setBitMasks(); BitsPerPixel = getBitsPerPixelFromFormat(Format); BytesPerPixel = BitsPerPixel / 8; // Pitch should be aligned... Pitch = BytesPerPixel * Size.Width; if (!Data) Data = new s8[Size.Height * Pitch]; }
//! copies this surface into another, scaling it to the target image size // note: this is very very slow. void CImage::copyToScaling(void* target, u32 width, u32 height, ECOLOR_FORMAT format, u32 pitch) { if (!target || !width || !height) return; const u32 bpp=getBitsPerPixelFromFormat(format)/8; if (0==pitch) pitch = width*bpp; if (Format==format && Size.Width==width && Size.Height==height) { if (pitch==Pitch) { memcpy(target, Data, height*pitch); return; } else { u8* tgtpos = (u8*) target; u8* srcpos = Data; const u32 bwidth = width*bpp; const u32 rest = pitch-bwidth; for (u32 y=0; y<height; ++y) { // copy scanline memcpy(tgtpos, srcpos, bwidth); // clear pitch memset(tgtpos+bwidth, 0, rest); tgtpos += pitch; srcpos += Pitch; } return; } } const f32 sourceXStep = (f32)Size.Width / (f32)width; const f32 sourceYStep = (f32)Size.Height / (f32)height; s32 yval=0, syval=0; f32 sy = 0.0f; for (u32 y=0; y<height; ++y) { f32 sx = 0.0f; for (u32 x=0; x<width; ++x) { CColorConverter::convert_viaFormat(Data+ syval + ((s32)sx)*BytesPerPixel, Format, 1, ((u8*)target)+ yval + (x*bpp), format); sx+=sourceXStep; } sy+=sourceYStep; syval=((s32)sy)*Pitch; yval+=pitch; } }
//! Returns bits per pixel. UINT32 CImage::getBitsPerPixel() const { return getBitsPerPixelFromFormat(Format); }