Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Поключение функции из C++ DLL в Delphi (DirectDraw Alpha Blendin)   Найти похожие ветки 

 
ПсихЪ_клон   (2004-05-22 16:02) [0]

Пишу графический движок на Delphi. Так как аппаратного AlphaBlending"а для DirectDraw нету, то пишу софтверную версию этой функции. но в Delphi это работало очень медленно, поэтому решил написать на C++ (MSVC++6.0) DLL"ьку с реализацией этой функции. Затем пытаюсь подключить всё это в Delphi, при при запуске приложения выскакивает ошибка:
"The procedure entry point TransAlphaFast could not be located in the dynamic link library AlphaDLL.dll."

Вот исходники:

////// AlphaDLL.cpp
#include "stdafx.h"
#include "AlphaDLL.h"
#include <windows.h>
#include <ddraw.h>

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
     )
{
   return TRUE;
}

ALPHADLL_API HRESULT nTransAlphaFast;

ALPHADLL_API HRESULT TransAlphaFast(LPDIRECTDRAWSURFACE src, LPDIRECTDRAWSURFACE dest,
       LONG lDestX, LONG lDestY, RECT srcRect, DWORD ColorKey, WORD BPP)
{
 ////// см. Приложение 1
}

////// StdAfx.cpp
#include "stdafx.h"

////// AlphaDLL.h
#ifdef ALPHADLL_EXPORTS
#define ALPHADLL_API __declspec(dllexport)
#else
#define ALPHADLL_API __declspec(dllimport)
#endif

#include <ddraw.h>

extern ALPHADLL_API HRESULT nTransAlphaFast;

extern ALPHADLL_API HRESULT TransAlphaFast(LPDIRECTDRAWSURFACE src, LPDIRECTDRAWSURFACE dest,
       LONG lDestX, LONG lDestY, RECT srcRect, DWORD ColorKey, WORD BPP);

////// StdAfx.h
#if !defined(AFX_STDAFX_H__4E21DA8A_9595_43D2_8B2D_AC11D1814171__INCLUDED_)
#define AFX_STDAFX_H__4E21DA8A_9595_43D2_8B2D_AC11D1814171__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// Insert your headers here
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers

#include <windows.h>

// TODO: reference additional headers your program requires here

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__4E21DA8A_9595_43D2_8B2D_AC11D1814171__INCLUDED_)

В Delphi функцию линкую так:
function TransAlphaFast( src, dest : PDirectDrawSurface; lDestX, lDestY : integer; srcRect : TRect; ColorKey : DWORD; BPP : DWORD ) : HRESULT; stdcall; external "AlphaDLL.dll"

В чём ошибка? По мимо того, что в генах... (:


 
ПсихЪ_клон   (2004-05-22 16:11) [1]

/////// Приложение 1

 int i,j; //register
int height,width;
 BYTE* lpSprite;
 BYTE* lpDest;
 LONG dPitch, SpritePitch;
 DWORD sColorKey;
 DWORD sTemp,dTemp;
 WORD sbuf,dbuf;
 DWORD Result;
BOOL oddWidth = FALSE;
DDSURFACEDESC srcDDSD, destDDSD;

 // Set height and width of SPRITE
 height = srcRect.bottom - srcRect.top;
 width  = srcRect.right - srcRect.left;

   // Lock down both surfaces for read and write
ZeroMemory(&srcDDSD, sizeof(srcDDSD));
srcDDSD.dwSize = sizeof(srcDDSD);
src->Lock(NULL, &srcDDSD, DDLOCK_WAIT, NULL);
   
ZeroMemory(&destDDSD, sizeof(destDDSD));
destDDSD.dwSize = sizeof(destDDSD);
dest->Lock(NULL, &destDDSD, DDLOCK_WAIT, NULL);

 // Set the pitch for both surfaces
 SpritePitch = srcDDSD.lPitch;
 dPitch      = destDDSD.lPitch;

 // Initialize the pointers to the upper left hand corner of the surface
 lpSprite = (BYTE*)srcDDSD.lpSurface;
 lpDest   = (BYTE*)destDDSD.lpSurface;

// Get the color key for sprite surface
sColorKey = ColorKey;

// Start RGB Format switch statement
switch(BPP)
{
case 8:
 // IMHO paletized modes are a thing of the past please feel free to
 // implement this if you so desire.
 break;

case 15:  ////////////////////////////////////////////////////////////////////////
       //
       //  WARNING!!!: I do not have a video card that uses the 5-5-5 format
       //              this barnch of code has not be tested.
       //
       ////////////////////////////////////////////////////////////////////////

 // Initialize the pointers to the first pixel in the rectangle
 lpSprite += (srcRect.top * SpritePitch) + (srcRect.left * 2);
 lpDest   += (lDestY * dPitch) + (lDestX * 2);

 // Set the horizontal padding
 sbuf = (WORD)(SpritePitch - (2 * width));
 dbuf = (WORD)(dPitch - (2 * width));

 // Is the Sprite width odd or even?
 if (width % 2 == 1)
 {
  oddWidth = TRUE;
  width = (width - 1) / 2; //div by 2, processing 2 pixels at a time.
 }
 else
  width = width / 2;  //div by 2, processing 2 pixels at a time.

 i = height;
 do
 {
  if (oddWidth)
  {
   sTemp = *((WORD*)lpSprite);

   if (sTemp != sColorKey)
   {
    dTemp = *((WORD*)lpDest);
    *((WORD*)lpDest) = (WORD)(((sTemp & 0x7BDE) >> 1) + ((dTemp & 0x7BDE) >> 1));
   }

   lpDest   += 2;
   lpSprite += 2;
  }

  j = width;
  do
  {
   sTemp  = *((DWORD*)lpSprite);
   dTemp  = *((DWORD*)lpDest);
   Result = dTemp;

   if ((sTemp & 0xFFFF) != sColorKey)
   {
    Result &= 0xFFFF0000;
    Result |= ((sTemp & 0x7BDE) >> 1) + ((dTemp & 0x7BDE) >> 1);
   }
   if ((sTemp >> 16) != sColorKey)
   {
    Result &= 0xFFFF;
    Result |= ((sTemp & 0x7BDE0000) >> 1) + ((dTemp & 0x7BDE0000) >> 1);
   }

   *((DWORD*)lpDest) = Result;
   lpDest   += 4;
   lpSprite += 4;
  }while (--j > 0);
  lpDest   += dbuf;
  lpSprite += sbuf;

 }while (--i > 0);

 break;

case 16:

 // Initialize the pointers to the first pixel in the rectangle
 lpSprite += (srcRect.top * SpritePitch) + (srcRect.left * 2);
 lpDest   += (lDestY * dPitch) + (lDestX * 2);

 // Set the horizontal padding
 sbuf = (WORD)(SpritePitch - (2 * width));
 dbuf = (WORD)(dPitch - (2 * width));

 // Is the Sprite width odd or even?
 if (width % 2 == 1)
 {
  oddWidth = TRUE;
  width = (width - 1) / 2; //div by 2, processing 2 pixels at a time.
 }
 else
  width = width / 2;  //div by 2, processing 2 pixels at a time.

 i = height;
 do
 {
  if (oddWidth)
  {
   sTemp = *((WORD*)lpSprite);

   if (sTemp != sColorKey)
   {
    dTemp = *((WORD*)lpDest);
    *((WORD*)lpDest) = (WORD)(((sTemp & 0xF7DE) >> 1) + ((dTemp & 0xF7DE) >> 1));
   }

   lpDest   += 2;
   lpSprite += 2;
  }

  j = width;
  do
  {
   sTemp  = *((DWORD*)lpSprite);
   dTemp  = *((DWORD*)lpDest);
   Result = dTemp;

   if ((sTemp & 0xFFFF) != sColorKey)
   {
    Result &= 0xFFFF0000;
    Result |= ((sTemp & 0xF7DE) >> 1) + ((dTemp & 0xF7DE) >> 1);
   }
   if ((sTemp >> 16) != sColorKey)
   {
    Result &= 0xFFFF;
    Result |= ((sTemp & 0xF7DE0000) >> 1) + ((dTemp & 0xF7DE0000) >> 1);
   }

   *((DWORD*)lpDest) = Result;
   lpDest   += 4;
   lpSprite += 4;

  }while (--j > 0);
  lpDest += dbuf;
  lpSprite += sbuf;

 }while (--i > 0);
 break;

case 24:  ////////////////////////////////////////////////////////////////////////
       //
       //  WARNING!!!: I do not have a video card capable of 24bit rendering
       //              this barnch of code has not be tested.
       //
       ////////////////////////////////////////////////////////////////////////

 // Initialize the pointers to the first pixel in the rectangle
 lpSprite += (srcRect.top * SpritePitch) + (srcRect.left * 3);
 lpDest   += (lDestY * dPitch) + (lDestX * 3);

 // Set the horizontal padding
 sbuf = (WORD)(SpritePitch - (3 * width));
 dbuf = (WORD)(dPitch - (3 * width));

 i = height;
 do
 {
  j = width;
  do
  {
   sTemp = *((DWORD*)lpSprite);

   if ((sTemp &= 0xFFFFFF) != sColorKey)
   {
    dTemp  = *((DWORD*)lpDest);
    Result = ((sTemp & 0xFEFEFE) >> 1) + ((dTemp & 0xFEFEFE) >> 1);

    *((WORD*)lpDest) = (WORD)(Result & 0xFFFF);
    lpDest += 2;
    *lpDest = (BYTE)(Result >> 16);
    lpDest++;
   }
   else
   {
    lpDest += 3;
   }

   lpSprite += 3;

  }while (--j > 0);
  lpDest += dbuf;
  lpSprite += sbuf;

 }while (--i > 0);
 break;

case 32:
 // Initialize the pointers to the first pixel in the rectangle
 lpSprite += (srcRect.top * SpritePitch) + (srcRect.left * 4);
 lpDest   += (lDestY * dPitch) + (lDestX * 4);

 // Set the horizontal padding
 sbuf = (WORD)(SpritePitch - (4 * width));
 dbuf = (WORD)(dPitch - (4 * width));

 i = height;
 do
 {
  j = width;
  do
  {
   sTemp = *((DWORD*)lpSprite);

   if ((sTemp &= 0xFFFFFF) != sColorKey)
   {
    dTemp  = *((DWORD*)lpDest);
    Result = ((sTemp & 0xFEFEFE) >> 1) + ((dTemp & 0xFEFEFE) >> 1);

    *((WORD*)lpDest) = (WORD)(Result & 0xFFFF);
    lpDest += 2;
    *lpDest = (BYTE)(Result >> 16);
    lpDest += 2;
   }
   else
   {
    lpDest += 4;
   }

   lpSprite += 4;

  }while (--j > 0);
  lpDest += dbuf;
  lpSprite += sbuf;

 }while (--i > 0);
 break;
} // End RGB Format switch statement

   src->Unlock(NULL);
   dest->Unlock(NULL);

 nTransAlphaFast = DD_OK;
return DD_OK;


 
cyborg   (2004-05-22 19:20) [2]

Дааааа....... вот это вот быстро? :) Нашёл себе проблему на голову.
Для быстро ММХ используй прямо в своём проекте.


 
ПсихЪ_клон   (2004-05-23 00:05) [3]

MMX я использую. Но вдруг он не подерживается? К тому же MMX только для глубины цвета 16. В либе будет 4 функции реализации прозрачности. Выбирай какую хочешь.

С ddl"кой я разобрался. Всё написал. Качать отсюда: http://stalker2010.front.ru/down/AlphaDLLSetup.exe



Страницы: 1 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
3-1089764331
Poluprovodnik
2004-07-14 04:18
2004.08.08
полоса прокрутки в dbgrid


1-1090474546
wild_arg
2004-07-22 09:35
2004.08.08
Спрятать форму


4-1088340452
pantel
2004-06-27 16:47
2004.08.08
Поименованные трубы (named pipes)


3-1089874541
Орехов Д.В.
2004-07-15 10:55
2004.08.08
Глюк с параметром запроса в Interbase


14-1090392311
Slider007
2004-07-21 10:45
2004.08.08
Kaspersky Antivirus 5.0.142 обновление баз





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский