FREObject updateCameraFrame(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { gGrabber.update(); if( !gGrabber.isFrameNew() ) return NULL; FREObject as3Bitmap = argv[0]; FREBitmapData bitmapData; FREAcquireBitmapData(as3Bitmap, &bitmapData); // do something uint32_t r = rand() % 255; uint32_t g = rand() % 255; uint32_t b = rand() % 255; unsigned char *pixel = gGrabber.getPixels(); uint32_t* ptr = bitmapData.bits32; int offset = bitmapData.lineStride32 - bitmapData.width; int alpha = 255; for( uint32_t j = 0; j < bitmapData.height; j++ ){ ptr = bitmapData.bits32 + bitmapData.lineStride32*(bitmapData.height-j-1); for( uint32_t i = 0; i < bitmapData.width; i++ ){ r = *pixel++; g = *pixel++; b = *pixel++; *ptr++ = (alpha << 24) | (r << 16) | (g << 8) | b; } } FREInvalidateBitmapDataRect(as3Bitmap, 0, 0, bitmapData.width, bitmapData.height); FREReleaseBitmapData(as3Bitmap); return NULL; }
FREObject fillBitmapRandomColor(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { FREObject as3Bitmap = argv[0]; FREBitmapData bitmapData; FREAcquireBitmapData(as3Bitmap, &bitmapData); // do something uint32_t r = rand() % 255; uint32_t g = rand() % 255; uint32_t b = rand() % 255; uint32_t* ptr = bitmapData.bits32; int offset = bitmapData.lineStride32 - bitmapData.width; int alpha = 255; for( uint32_t j = 0; j < bitmapData.height; j++ ){ for( uint32_t i = 0; i < bitmapData.width; i++ ){ *ptr++ = (alpha << 24) | (r << 16) | (g << 8) | b; } ptr += offset; } FREInvalidateBitmapDataRect(as3Bitmap, 0, 0, bitmapData.width, bitmapData.height); FREReleaseBitmapData(as3Bitmap); return NULL; }
FREObject __cdecl AmbireCaptureCapture(FREContext ctx, void * functionData, uint32_t argc, FREObject argv[]) { bool success = false; POINT pt = { 0 }; FREBitmapData bd = { 0 }; FREResult result = FREAcquireBitmapData(argv[0], &bd); if(result == FRE_OK) { int width = bd.width; int height = bd.height; BITMAPINFOHEADER bmi = { 0 }; bmi.biSize = sizeof(bmi); bmi.biWidth = width; bmi.biHeight = height; bmi.biPlanes = 1; bmi.biBitCount = 24; int stride = ((width * 3 + 3) / 4) * 4; bmi.biSizeImage = stride * height; void * ppvBits = 0; HDC hdcDesktop = GetDC(0); if(hdcDesktop) { HDC hdcMem = CreateCompatibleDC(hdcDesktop); if(hdcMem) { HBITMAP hbm = CreateDIBSection(hdcMem, (const BITMAPINFO *)&bmi, 0, &ppvBits, 0, 0); if(hbm) { SelectObject(hdcMem, hbm); BitBlt(hdcMem, 0, 0, width, height, hdcDesktop, 0, 0, SRCCOPY); GdiFlush(); ReleaseDC(0, hdcDesktop); DeleteDC(hdcMem); GdiFlush(); for(int y = 0; y < height; ++y) { const unsigned char * p = reinterpret_cast<unsigned char *>(ppvBits) + y * stride; uint32_t * q = reinterpret_cast<uint32_t *>(bd.bits32) + y * bd.lineStride32; for(int x = 0; x < width; ++x, p += 3, ++q) { *q = 0xFF000000 | (p[2] << 16) | (p[1] << 8) | p[0]; } } success = true; DeleteObject(hbm); } else { DeleteDC(hdcMem); } } else { ReleaseDC(0, hdcDesktop); } } FREReleaseBitmapData(argv[0]); } FREObject rv = 0; FRENewObjectFromBool(success ? 1 : 0, &rv); return rv; }