diff options
Diffstat (limited to 'libs/freeimage/src/main.cpp')
-rw-r--r-- | libs/freeimage/src/main.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/libs/freeimage/src/main.cpp b/libs/freeimage/src/main.cpp new file mode 100644 index 0000000000..7c44439554 --- /dev/null +++ b/libs/freeimage/src/main.cpp @@ -0,0 +1,171 @@ +/* +Plugin of Miranda IM for reading/writing PNG images. +Copyright (c) 2004-06 George Hazan (ghazan@postman.ru) + +Portions of this code are gotten from the libpng codebase. +Copyright 2000, Willem van Schaik. For conditions of distribution and +use, see the copyright/license/disclaimer notice in png.h + +Miranda IM: the free icq client for MS Windows +Copyright (C) 2000-2002 Richard Hughes, Roland Rabien & Tristan Van de Vreede + +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "stdafx.h" + +/* +* freeimage helper functions +*/ + +// Correct alpha from bitmaps loaded without it (it cames with 0 and should be 255) +// originally in loadavatars... + +EXTERN_C DLL_API void DLL_CALLCONV FreeImage_CorrectBitmap32Alpha(HBITMAP hBitmap, BOOL force) +{ + BITMAP bmp; + DWORD dwLen; + BYTE *p; + int x, y; + BOOL fixIt; + + GetObject(hBitmap, sizeof(bmp), &bmp); + + if (bmp.bmBitsPixel != 32) + return; + + dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8); + p = (BYTE *)malloc(dwLen); + if (p == nullptr) + return; + memset(p, 0, dwLen); + + GetBitmapBits(hBitmap, dwLen, p); + + fixIt = TRUE; + for (y = 0; fixIt && y < bmp.bmHeight; ++y) { + BYTE *px = p + bmp.bmWidth * 4 * y; + + for (x = 0; fixIt && x < bmp.bmWidth; ++x) + { + if (px[3] != 0 && !force) + { + fixIt = FALSE; + } + else + { + px[3] = 255; + } + + px += 4; + } + } + + if (fixIt) + SetBitmapBits(hBitmap, dwLen, p); + + free(p); +} + +/* +* needed for per pixel transparent images. Such images should then be rendered by +* using AlphaBlend() with AC_SRC_ALPHA +* dwFlags will be set to AVS_PREMULTIPLIED +* return TRUE if the image has at least one pixel with transparency +*/ + +EXTERN_C DLL_API BOOL DLL_CALLCONV FreeImage_Premultiply(HBITMAP hBitmap) +{ + BOOL transp = FALSE; + + BITMAP bmp; + GetObject(hBitmap, sizeof(bmp), &bmp); + if (bmp.bmBitsPixel == 32) { + int width = bmp.bmWidth; + int height = bmp.bmHeight; + int dwLen = width * height * 4; + BYTE *p = (BYTE *)malloc(dwLen); + if (p != nullptr) { + GetBitmapBits(hBitmap, dwLen, p); + + for (int y = 0; y < height; ++y) { + BYTE *px = p + width * 4 * y; + for (int x = 0; x < width; ++x) { + BYTE alpha = px[3]; + if (alpha < 255) { + transp = TRUE; + + px[0] = px[0] * alpha/255; + px[1] = px[1] * alpha/255; + px[2] = px[2] * alpha/255; + } + + px += 4; + } + } + + if (transp) + dwLen = SetBitmapBits(hBitmap, dwLen, p); + free(p); + } + } + + return transp; +} + +EXTERN_C DLL_API HBITMAP DLL_CALLCONV FreeImage_CreateHBITMAPFromDIB(FIBITMAP *in) +{ + FIBITMAP *dib = nullptr; + int bpp = FreeImage_GetBPP(in); + + if (bpp == 48) + dib = FreeImage_ConvertTo24Bits(in); + else if (FreeImage_GetBPP(in) > 32) + dib = FreeImage_ConvertTo32Bits(in); + else + dib = in; + + BYTE *ptPixels; + BITMAPINFO *info = FreeImage_GetInfo(dib); + HBITMAP hBmp = CreateDIBSection(nullptr, info, DIB_RGB_COLORS, (void **)&ptPixels, nullptr, 0); + if (ptPixels != nullptr) + memmove(ptPixels, FreeImage_GetBits(dib), FreeImage_GetPitch(dib) * FreeImage_GetHeight(dib)); + + if (dib != in) + FreeImage_Unload(dib); + + return hBmp; +} + +EXTERN_C DLL_API FIBITMAP* DLL_CALLCONV FreeImage_CreateDIBFromHBITMAP(HBITMAP hBmp) +{ + if (!hBmp) + return nullptr; + + BITMAP bm; + GetObject(hBmp, sizeof(BITMAP), (LPSTR) &bm); + FIBITMAP *dib = FreeImage_Allocate(bm.bmWidth, bm.bmHeight, bm.bmBitsPixel,0,0,0); + // The GetDIBits function clears the biClrUsed and biClrImportant BITMAPINFO members (dont't know why) + // So we save these infos below. This is needed for palettized images only. + int nColors = FreeImage_GetColorsUsed(dib); + HDC dc = GetDC(nullptr); + int Success = GetDIBits(dc, hBmp, 0, FreeImage_GetHeight(dib), + FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS); + ReleaseDC(nullptr, dc); + // restore BITMAPINFO members + FreeImage_GetInfoHeader(dib)->biClrUsed = nColors; + FreeImage_GetInfoHeader(dib)->biClrImportant = nColors; + return dib; +} |