Gabz

RGSS Bitmap Manipulation In C++

Jul 29th, 2014
550
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.56 KB | None | 0 0
  1. #include <windows.h>
  2. #define DLLIMPORT extern "C" __declspec( dllexport )
  3.  
  4. typedef struct PixelStruct {
  5.     unsigned char blue;
  6.     unsigned char green;
  7.     unsigned char red; 
  8.     unsigned char alpha;
  9. } *PIXEL;
  10.  
  11. typedef struct {
  12.     //-------------------------------------
  13.     // STRUCT 1 - RGSSBITMAP
  14.     //-------------------------------------
  15.     char DearCompilerIReallyDontWantThis[16];
  16.     //DWORD flags;          // char flags[4];
  17.     //DWORD klass;          // char klass[4];
  18.     //void (*dmark)(void*); // char dmark[4];
  19.     //void (*dfree)(void*); // char dfree[4];
  20.    
  21.     //-------------------------------------
  22.     // STRUCT 2 - BITMAPSTRUCT
  23.     //-------------------------------------
  24.     struct {
  25.         char FuckThisShit[8];
  26.         // DWORD unk1; // char unk1[4];
  27.         // DWORD unk2; // char unk2[4];
  28.    
  29.     //-------------------------------------
  30.     // STRUCT 3 - RGSSBMINFO
  31.     //-------------------------------------
  32.         struct {
  33.             char ReallyDontNeedThis[8];
  34.             //DWORD unk1; // char unk1[4];
  35.             //DWORD unk2; // char unk2[4];
  36.  
  37.     //-------------------------------------
  38.     // STRUCT 4 - BITMAPINFOHEADER
  39.     //-------------------------------------
  40.             struct {
  41.                 char PLEASEJustLetMeWork[4];
  42.                 // DWORD biSize; // char biSize[4];
  43.                 long width;
  44.                 long height;
  45.                 char COMPILER_I_WILL_NOT_SAY_ANYTHING_MORE___YOU_IDIOT[28];
  46.                 // WORD       biPlanes;        // char biPlanes[2];
  47.                 // WORD       biBitCount;      // char biBitCount[2];
  48.                 // DWORD      biCompression;   // char biCompression[4];
  49.                 // DWORD      biSizeImage;     // char biSizeImage[4];
  50.                 // LONG       biXPelsPerMeter; // char biXPelsPerMeter[4];
  51.                 // LONG       biYPelsPerMeter; // char biYPelsPerMeter[4];
  52.                 // DWORD      biClrUsed;       // char biClrUsed[4];
  53.                 // DWORD      biClrImportant;  // char biClrImportant[4];
  54.             } *C;
  55.     //-------------------------------------
  56.     // STRUCT 5 - RGBQUAD
  57.     //-------------------------------------
  58.             PIXEL FirstRow;
  59.            
  60.     //-------------------------------------
  61.     // STRUCT 5 - RGBQUAD
  62.     //-------------------------------------
  63.             PIXEL LastRow;
  64.         } *B;
  65.     } *A;
  66. } RGSSBITMAP;
  67.  
  68. #define BitmapData(b) ((b)->A->B->FirstRow)
  69. #define BitmapInfo(b) ((b)->A->B->C)
  70.  
  71. // Pega o ponteiro para o pixel em x,y no bitmap
  72. // Entrada : Bitmap, posição x, posição y
  73. // Saída   : Se for uma posição válida, ponteiro para o pixel, caso contrário, NULL.
  74. PIXEL GetPixelPointer(RGSSBITMAP *bitmap, unsigned int x, unsigned int y){
  75.     // Checa X e Y
  76.     if (
  77.         (x < 0) or
  78.         (x >= BitmapInfo(bitmap)->width) or
  79.         (y < 0) or
  80.         (y >= BitmapInfo(bitmap)->height)
  81.     ) return NULL;
  82.    
  83.     // Posiciona "cursor" no primeiro pixel (0,0)
  84.     PIXEL data = (PIXEL)BitmapData(bitmap);
  85.    
  86.     // Move até a linha y
  87.     data += y * BitmapInfo(bitmap)->width;
  88.    
  89.     // Move até a coluna x
  90.     data += x;
  91.    
  92.     // Retorna
  93.     return data;
  94. }
  95.  
  96. // Equivalente a Bitmap#get_pixel, do RGSS
  97. // Entrada : Bitmap, posição x, posição y, estrutura de saída do pixel
  98. // Saída   : 0 = Falha | 1 = Sucesso
  99. DLLIMPORT int BitmapGetPixel(RGSSBITMAP *bitmap, unsigned int x, unsigned int y, PIXEL out){
  100.     PIXEL data = GetPixelPointer(bitmap, x, y);
  101.     if (data) {
  102.         memcpy(out, data, sizeof(PIXEL));
  103.         return TRUE;
  104.     } else {
  105.         return FALSE;
  106.     }
  107. }
  108.  
  109. // Equivalente a Bitmap#set_pixel, do RGSS
  110. // Entrada : Bitmap, posição x, posição y, estrutura com pixel de entrada
  111. // Saída   : 0 = Falha | 1 = Sucesso
  112. DLLIMPORT int BitmapSetPixel(RGSSBITMAP *bitmap, unsigned int x, unsigned int y, PIXEL in) {
  113.     PIXEL data = GetPixelPointer(bitmap, x, y);
  114.     if (data) {
  115.         memcpy(data, in, sizeof(PIXEL));
  116.         return TRUE;
  117.     } else {
  118.         return FALSE;
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment