Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include "c:\users\fire\ScreenshotMaker.h"
- #include "jni.h"
- #include "stdio.h"
- #include <d3d9.h>
- #include <d3dx9.h>
- #include <stdio.h>
- #include <malloc.h>
- #include <iostream>
- #pragma once
- #pragma comment (lib, "d3d9.lib")
- #pragma comment (lib, "d3dx9.lib")
- LPDIRECT3DSURFACE9 pSurface;
- D3DLOCKED_RECT lockedRect;
- LPDIRECT3DDEVICE9 pD3DDevice = NULL;
- LPDIRECT3D9 pD3D = NULL;
- HRESULT result;
- HWND hWnd;
- void *pBits;
- void *yuvBits;
- BYTE* rgbByte;
- BYTE* yuvByte;
- BOOL done=false;
- #define RGBTOY(Y,R,G,B) Y=(30*R + 59*G + 11*B)/100
- #define RGBTOYUV(Y,U,V,R,G,B) \
- RGBTOY(Y,R,G,B); \
- U=(-17*R - 33*G + 50*B + 12800)/100; \
- V=(50*R - 42*G - 8*B + 12800)/100
- enum {
- frameWidth=1680,
- frameHeight=1050,
- planeSize=frameWidth * frameHeight,
- };
- void A8R8G8B8toYUV420P(const BYTE *rgb, BYTE *yuv) {
- BYTE *y=yuv;
- BYTE *u=yuv + planeSize;
- BYTE *v=yuv + planeSize + planeSize/4;
- unsigned fx,fy;
- for (fy=0; fy<frameHeight; fy++) {
- if (fy % 2) {
- u -= frameWidth/2;
- v -= frameWidth/2;
- }
- for (fx=0; fx<frameWidth/2; fx++) {
- RGBTOY(*y++, rgb[2], rgb[1], rgb[0]);
- RGBTOYUV(*y++, *u++, *v++, rgb[6], rgb[5], rgb[4]);
- rgb+=8;
- }
- }
- }
- BOOL APIENTRY DllMain( HANDLE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- return TRUE;
- }
- JNIEXPORT jint JNICALL
- Java_ScreenshotMaker_init(JNIEnv *env, jobject obj)
- {
- if (!done) {
- hWnd = GetDesktopWindow();
- printf("%d",hWnd);
- if (pD3D)
- pD3D->Release();
- if(FAILED (pD3D = Direct3DCreate9(D3D_SDK_VERSION) )){
- printf("something bad happened when creating pD3D");
- return (jint)1;
- }
- Sleep(100);
- D3DPRESENT_PARAMETERS D3DPP = { 0 };
- D3DPP.Windowed = TRUE;
- D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
- D3DPP.BackBufferFormat = D3DFMT_UNKNOWN;
- if (pD3DDevice)
- pD3DDevice->Release();
- Sleep(100);
- if ( (result = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPP, &pD3DDevice) != D3D_OK)) {
- printf("something bad happened when creating pD3DDevice \n");
- std::cout << result ;
- return (jint) 1;
- }
- Sleep(100);
- if (pSurface)
- pSurface->Release();
- if (FAILED (pD3DDevice->CreateOffscreenPlainSurface(1680, 1050, D3DFMT_A8R8G8B8 ,
- D3DPOOL_SCRATCH , &pSurface, NULL))){
- printf("something bad happened when creating pSurface");
- return (jint)1;
- }
- pBits = malloc (1680*1050*32/8);
- yuvBits = malloc(1680*1050*24/8);
- rgbByte = (BYTE*)pBits ;
- yuvByte = (BYTE*)yuvBits;
- }
- return (jint)0;
- }
- JNIEXPORT jobject JNICALL
- Java_ScreenshotMaker_makeMeScreenshotPuta(JNIEnv *env, jobject obj)
- {
- pD3DDevice->GetFrontBufferData(0, pSurface);
- // D3DXSaveSurfaceToFile("d:\\BMP.bmp", D3DXIFF_BMP, pSurface, NULL, NULL);
- pSurface->LockRect(&lockedRect,NULL,
- D3DLOCK_NO_DIRTY_UPDATE|
- D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
- // flipped image
- /*for( int i=0 ; i < 1050 ; i++) {
- memcpy((BYTE*) pBits +( 1050 - i - 1) * 1680 * 32/8 ,
- (BYTE*) lockedRect.pBits + i* lockedRect.Pitch ,
- 1680 * 32/8);
- }*/
- for( int i=0 ; i < 1050 ; i++) {
- memcpy( (BYTE*) pBits + i * 1680 * 32 / 8 ,
- (BYTE*) lockedRect.pBits + i* lockedRect.Pitch ,
- 1680 * 32 / 8);
- }
- pSurface->UnlockRect();
- A8R8G8B8toYUV420P(rgbByte, yuvByte);
- jobject buffer = env->NewDirectByteBuffer(yuvBits,1680*1050*32/8);
- // Pass A8R8G8B8 ByteBuffer instead of YUV420P - 500 fps on a i7-950@4ghz
- // jobject buffer = env->NewDirectByteBuffer(pBits,1680*1050*32/8);
- return buffer;
- }
- JNIEXPORT void JNICALL
- Java_ScreenshotMaker_close(JNIEnv *env, jobject obj)
- {
- if (pSurface)
- pSurface->Release();
- if (pD3DDevice)
- pD3DDevice->Release();
- if (pD3D)
- pD3D->Release();
- free (yuvBits);
- free (pBits);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement