2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите преобразовать код из VC++ в Delphi
Сообщение03.12.2009, 13:51 


09/09/08
30
Россия
в интернете нашел код на VC++, но язык я не очень хорошо знаю могли бы помочь преобразовать в Delphi
Код:
#ifndef GRAPHICS_H
#define GRAPHICS_H

//LOWORD(wParam): event ID, HIWORD(wParam): reserved, lParam: LPON_event_name_PARAMS
#define WM_GRAPHICSEVENT      WM_USER + 0xFF

#define EVENT_ON_PROGRESS      0x10

typedef struct tagONPROGRESSPARAMS
{
   DWORD dwPercents;
} ONPROGRESSPARAMS, *LPONPROGRESSPARAMS;

BOOL Blur(HDC hDC, ULONG lLevel, LPRECT pRC, HWND hWndCallback = NULL);
#define R_BGR(Color)         ((BYTE)((Color) >> 16))
#define G_BGR(Color)         ((BYTE)(((WORD)(Color)) >> 8))
#define B_BGR(Color)         ((BYTE)(Color))

#define BGR(B, G, R)         (((BYTE)B) | ((BYTE)G << 8) | ((BYTE)R << 16))

#define GP_INVALIDPIXEL         0xFFFFFFFF

static COLORREF GetPixel(LPBYTE pPixels, LPBITMAPINFO pBMI, LONG x, LONG y);
static void SetPixel(LPBYTE pPixels, LPBITMAPINFO pBMI, LONG x, LONG y, COLORREF crValue);
static void ReverseBytes(LPBYTE pData, DWORD dwDataSize);
template <class T>
   static T CheckBounds(T tValue, T tMin, T tMax);
template <class T>
   static void SortArray_Shell(T *pArr, const int intArrSize);

#endif

и
Код:
#include <windows.h>
#include <math.h>

#include "graphics.h"

//-----------------------------------------------------------------------------------------
//Графические эффекты (фильтры)

//Фильтр "Пятно"
//Матрица:
//   n  n  n  n  n
//   n  1  1  1  n
//   n  1  1  1  n
//   n  1  1  1  n
//   n  n  n  n  n / 1
//Параметры:
//   hDC            DC назначения
//   lLevel         Радиус размывания
//   pRC            Указатель на структуру RECT, определяющую область изображения для изменения
//Возвращаемое значение: TRUE в случае успеха, FALSE в случае ошибки
BOOL Blur(HDC hDC, ULONG lLevel, LPRECT pRC, HWND hWndCallback)
{
   BITMAPINFO BMI = { 0 };
   HDC hTmpDC;
   HBITMAP hOldBitmap, hTmpBitmap;
   ULONG lBytesCnt;
   LPBYTE pPixels1, pPixels2;
   LONG x, x1, x2, x3;
   LONG y, y1, y2, y3;
   LONG lColor, lR, lG, lB, lPixels;

   //Параметры событий
   volatile ONPROGRESSPARAMS ONPP = { 0 };

   USHORT BPP = GetDeviceCaps(hDC, BITSPIXEL);

   //Не работаем с изображениями ниже 24 bpp (TrueColor)
   if ((BPP != 24) && (BPP != 32)) return FALSE;
   //Работаем только с обычным контекстом устройства, так как контекст устройства в памяти
   //на вызов GetDeviceCaps(hDC, ...RES) возвращает не свое разрешение, а разрешение связанного
   //с ним контекста устройства
   if (GetObjectType(hDC) != OBJ_DC) return FALSE;

   LONG W = GetDeviceCaps(hDC, HORZRES);
   LONG H = GetDeviceCaps(hDC, VERTRES);

   switch (BPP)
   {
      case 24:
         lBytesCnt = (((BPP / 8) * W + 3) / 4) * 4;
         lBytesCnt += ((lBytesCnt * H + 3) / 4) * 4;
         break;
      case 32:
         lBytesCnt = W * H * (BPP / 8);
         break;
   }

   pPixels1 = new BYTE[lBytesCnt];
   pPixels2 = new BYTE[lBytesCnt];

    hTmpDC = CreateCompatibleDC(hDC);
    hTmpBitmap = CreateCompatibleBitmap(hDC, W, H);
    hOldBitmap = (HBITMAP)SelectObject(hTmpDC, hTmpBitmap);
   BitBlt(hTmpDC, 0, 0, W, H, hDC, 0, 0, SRCCOPY);

    BMI.bmiHeader.biSize = sizeof(BMI.bmiHeader);
    BMI.bmiHeader.biWidth = W;
    BMI.bmiHeader.biHeight = H;
    BMI.bmiHeader.biPlanes = 1;
    BMI.bmiHeader.biBitCount = BPP;
    BMI.bmiHeader.biCompression = BI_RGB;
   GetDIBits(hTmpDC, hTmpBitmap, 0, H, pPixels1, &BMI, DIB_RGB_COLORS);
   GetDIBits(hTmpDC, hTmpBitmap, 0, H, pPixels2, &BMI, DIB_RGB_COLORS);

   y = pRC->top;
   while (y < pRC->bottom)
   {
      y1 = y - (lLevel / 2);
      if (y1 < pRC->top) y1 = pRC->top;
      y2 = y + (lLevel / 2);
      if (y2 > (pRC->bottom - 1)) y2 = (pRC->bottom - 1);
      x = pRC->left;
      while (x < pRC->right)
      {
         x1 = x - (lLevel / 2);
         if (x1 < pRC->left) x1 = pRC->left;
         x2 = x + (lLevel / 2);
         if (x2 > (pRC->right - 1)) x2 = (pRC->right - 1);
         lR = 0;
         lG = 0;
         lB = 0;
         for (x3 = x1; x3 <= x2; x3++)
         {
            for (y3 = y1; y3 <= y2; y3++)
            {
               lColor = GetPixel(pPixels2, &BMI, x3, y3);
               lR += R_BGR(lColor);
               lG += G_BGR(lColor);
               lB += B_BGR(lColor);
            }
         }
         lPixels = (x2 - x1 + 1) * (y2 - y1 + 1);
         lR /= lPixels;
         lG /= lPixels;
         lB /= lPixels;
         SetPixel(pPixels1, &BMI, x, y, BGR(lB, lG, lR));
         x++;
      }
      if (hWndCallback)
      {
         ONPP.dwPercents = (DWORD)(((double)y / (double)pRC->bottom) * 100);
         SendMessage(hWndCallback, WM_GRAPHICSEVENT, MAKEWPARAM(EVENT_ON_PROGRESS, 0),
            (LPARAM)&ONPP);
      }
      y++;
   }

   StretchDIBits(hDC, 0, 0, W, H, 0, 0, W, H, pPixels1, &BMI,
      DIB_RGB_COLORS, SRCCOPY);

   SelectObject(hTmpDC, hOldBitmap);
    DeleteObject(hTmpBitmap);
    DeleteDC(hTmpDC);
   delete[] pPixels1;
   delete[] pPixels2;
   return TRUE;
}

 Профиль  
                  
 
 Re: Помогите преобразовать код из VC++ в Delphi
Сообщение03.12.2009, 19:45 
Заслуженный участник
Аватара пользователя


01/08/06
3059
Уфа
Можно примерно так:

{ ... } => begin ... end;
#define a b => const a = b;
#define a(b) XXXX => оформляется как функция a(b)
LONG => LongInt
ULONG => LongWord
DWORD => DWORD
LPBYTE => PByteArray
BOOL => LongBool
SHORT => SmallInt
USHORT => WORD
BYTE => Byte
0xXXXX => $XXXX
TYPEXXXX YYYY; => var YYYY: TYPEXXXX; или просто YYYY: TYPEXXXX (в параметрах функции)
TYPEXXXX YYYY = { ... } => var YYYY: TYPEXXXX = ( ... );
(TYPEXXXX) Y => TYPEXXXX(Y)
TYPEXXXX YYYY(ZZZZ) => function YYYY(ZZZZ): TYPEXXXX;
void YYYY(ZZZZ) => procedure YYYY(ZZZZ);
new TYPEXXX[N] => AllocMem(N*SizeOf(TYPEXXX));
delete [] P => ReallocMem(P, 0);
typedef struct tagXXXX {....} XXXX, *LPXXXX; => type XXXX = record ... end; LPXXXX = ^XXXX;
= => :=
== => =
* => ^, но не везде, а только там, где не означает умножения :)
& => @
-> => ^.
/ => div для целочисл., / для веществ.
A >> B => A shr B
A << B => A shl B
XXXX++ => Inc(XXXX)
XXXX += YYYY => Inc(XXXX, YYYY)
XXXX /= YYYY => XXXX := XXXX div YYYY;
static => игнорируется
volatile => игнорируется
for(XXXX = AAAA; XXXX <= BBBB; XXXX++) {...} => for XXXX := AAAA to BBBB do begin ... end;
switch(XXX) { case A: ... break; case B: ... break; .... default: ... } => case XXX of A: ...; B: ...; .... else ... end;
template <XXXX> YYYY => надо апгрейдиться до D2009 или D2010 и курить гугель на тему Delphi Generics, иначе epic fail :)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group