Advertisement
Guest User

pZombie

a guest
Jun 22nd, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "c:\users\fire\ScreenshotMaker.h"
  3. #include "jni.h"
  4. #include "stdio.h"
  5. #include <d3d9.h>
  6. #include <d3dx9.h>
  7. #include <stdio.h>
  8. #include <malloc.h>
  9. #include <iostream>
  10.  
  11.  
  12. #pragma once
  13. #pragma comment (lib, "d3d9.lib")
  14. #pragma comment (lib, "d3dx9.lib")
  15.  
  16.  
  17. LPDIRECT3DSURFACE9 pSurface;
  18. D3DLOCKED_RECT lockedRect;
  19. LPDIRECT3DDEVICE9 pD3DDevice = NULL;
  20. LPDIRECT3D9 pD3D = NULL;
  21. HRESULT result;
  22. HWND hWnd;
  23.  
  24. void *pBits;
  25. void *yuvBits;
  26.  
  27. BYTE* rgbByte;
  28. BYTE* yuvByte;
  29.  
  30. BOOL done=false;
  31.  
  32.  
  33.  
  34. #define RGBTOY(Y,R,G,B) Y=(30*R + 59*G + 11*B)/100
  35. #define RGBTOYUV(Y,U,V,R,G,B) \
  36. RGBTOY(Y,R,G,B); \
  37. U=(-17*R - 33*G + 50*B + 12800)/100; \
  38. V=(50*R - 42*G - 8*B + 12800)/100
  39.  
  40.  
  41. enum {
  42.  
  43. frameWidth=1680,
  44. frameHeight=1050,
  45. planeSize=frameWidth * frameHeight,
  46.  
  47. };
  48.  
  49.  
  50.  
  51. void A8R8G8B8toYUV420P(const BYTE *rgb, BYTE *yuv) {
  52. BYTE *y=yuv;
  53. BYTE *u=yuv + planeSize;
  54. BYTE *v=yuv + planeSize + planeSize/4;
  55. unsigned fx,fy;
  56.  
  57.  
  58.  
  59. for (fy=0; fy<frameHeight; fy++) {
  60. if (fy % 2) {
  61. u -= frameWidth/2;
  62. v -= frameWidth/2;
  63. }
  64.  
  65. for (fx=0; fx<frameWidth/2; fx++) {
  66. RGBTOY(*y++, rgb[2], rgb[1], rgb[0]);
  67. RGBTOYUV(*y++, *u++, *v++, rgb[6], rgb[5], rgb[4]);
  68. rgb+=8;
  69. }
  70. }
  71. }
  72.  
  73.  
  74.  
  75.  
  76.  
  77. BOOL APIENTRY DllMain( HANDLE hModule,
  78. DWORD ul_reason_for_call,
  79. LPVOID lpReserved
  80. )
  81. {
  82. return TRUE;
  83. }
  84.  
  85.  
  86.  
  87. JNIEXPORT jint JNICALL
  88. Java_ScreenshotMaker_init(JNIEnv *env, jobject obj)
  89. {
  90.  
  91. if (!done) {
  92.  
  93. hWnd = GetDesktopWindow();
  94. printf("%d",hWnd);
  95. if (pD3D)
  96. pD3D->Release();
  97.  
  98. if(FAILED (pD3D = Direct3DCreate9(D3D_SDK_VERSION) )){
  99.  
  100. printf("something bad happened when creating pD3D");
  101. return (jint)1;
  102. }
  103. Sleep(100);
  104.  
  105.  
  106. D3DPRESENT_PARAMETERS D3DPP = { 0 };
  107.  
  108. D3DPP.Windowed = TRUE;
  109. D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
  110. D3DPP.BackBufferFormat = D3DFMT_UNKNOWN;
  111.  
  112. if (pD3DDevice)
  113. pD3DDevice->Release();
  114. Sleep(100);
  115.  
  116. if ( (result = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  117. D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPP, &pD3DDevice) != D3D_OK)) {
  118.  
  119. printf("something bad happened when creating pD3DDevice \n");
  120. std::cout << result ;
  121. return (jint) 1;
  122. }
  123.  
  124.  
  125. Sleep(100);
  126.  
  127. if (pSurface)
  128. pSurface->Release();
  129.  
  130. if (FAILED (pD3DDevice->CreateOffscreenPlainSurface(1680, 1050, D3DFMT_A8R8G8B8 ,
  131. D3DPOOL_SCRATCH , &pSurface, NULL))){
  132.  
  133. printf("something bad happened when creating pSurface");
  134. return (jint)1;
  135. }
  136.  
  137.  
  138. pBits = malloc (1680*1050*32/8);
  139. yuvBits = malloc(1680*1050*24/8);
  140.  
  141. rgbByte = (BYTE*)pBits ;
  142. yuvByte = (BYTE*)yuvBits;
  143. }
  144. return (jint)0;
  145. }
  146.  
  147. JNIEXPORT jobject JNICALL
  148. Java_ScreenshotMaker_makeMeScreenshotPuta(JNIEnv *env, jobject obj)
  149. {
  150.  
  151. pD3DDevice->GetFrontBufferData(0, pSurface);
  152.  
  153. // D3DXSaveSurfaceToFile("d:\\BMP.bmp", D3DXIFF_BMP, pSurface, NULL, NULL);
  154.  
  155. pSurface->LockRect(&lockedRect,NULL,
  156. D3DLOCK_NO_DIRTY_UPDATE|
  157. D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
  158.  
  159.  
  160. // flipped image
  161. /*for( int i=0 ; i < 1050 ; i++) {
  162. memcpy((BYTE*) pBits +( 1050 - i - 1) * 1680 * 32/8 ,
  163. (BYTE*) lockedRect.pBits + i* lockedRect.Pitch ,
  164. 1680 * 32/8);
  165. }*/
  166.  
  167.  
  168. for( int i=0 ; i < 1050 ; i++) {
  169. memcpy( (BYTE*) pBits + i * 1680 * 32 / 8 ,
  170. (BYTE*) lockedRect.pBits + i* lockedRect.Pitch ,
  171. 1680 * 32 / 8);
  172. }
  173.  
  174. pSurface->UnlockRect();
  175.  
  176. A8R8G8B8toYUV420P(rgbByte, yuvByte);
  177. jobject buffer = env->NewDirectByteBuffer(yuvBits,1680*1050*32/8);
  178.  
  179. // Pass A8R8G8B8 ByteBuffer instead of YUV420P - 500 fps on a i7-950@4ghz
  180. // jobject buffer = env->NewDirectByteBuffer(pBits,1680*1050*32/8);
  181.  
  182.  
  183. return buffer;
  184.  
  185. }
  186.  
  187. JNIEXPORT void JNICALL
  188. Java_ScreenshotMaker_close(JNIEnv *env, jobject obj)
  189. {
  190.  
  191.  
  192. if (pSurface)
  193. pSurface->Release();
  194. if (pD3DDevice)
  195. pD3DDevice->Release();
  196. if (pD3D)
  197. pD3D->Release();
  198. free (yuvBits);
  199. free (pBits);
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement