diff --git a/server/Mac/mf_info.c b/server/Mac/mf_info.c index 2cd1b203f..18dd9a907 100644 --- a/server/Mac/mf_info.c +++ b/server/Mac/mf_info.c @@ -277,11 +277,13 @@ BOOL mf_info_have_invalid_region(mfInfo* mfi) void mf_info_getScreenData(mfInfo* mfi, long* width, long* height, BYTE** pBits, int* pitch) { - *width = mfi->invalid.width / 2; - *height = mfi->invalid.height / 2; - *pitch = 2880 * 4; + *width = mfi->invalid.width / mfi->scale; + *height = mfi->invalid.height / mfi->scale; + *pitch = mfi->servscreen_width * mfi->scale * 4; - mf_mlion_get_pixelData(mfi->invalid.x / 2, mfi->invalid.y / 2, *width, *height, pBits); + mf_mlion_get_pixelData(mfi->invalid.x / mfi->scale, mfi->invalid.y / mfi->scale, *width, *height, pBits); + + *pBits = *pBits + (mfi->invalid.x * 4) + (*pitch * mfi->invalid.y); } diff --git a/server/Mac/mf_interface.h b/server/Mac/mf_interface.h index 618249597..58aa379ab 100644 --- a/server/Mac/mf_interface.h +++ b/server/Mac/mf_interface.h @@ -93,6 +93,7 @@ struct mf_info freerdp_peer** peers; //BOOL mirrorDriverActive; unsigned int framesWaiting; + int scale; //HANDLE snd_mutex; //BOOL snd_stop; diff --git a/server/Mac/mf_mountain_lion.c b/server/Mac/mf_mountain_lion.c index 2ab530770..d8f700c62 100644 --- a/server/Mac/mf_mountain_lion.c +++ b/server/Mac/mf_mountain_lion.c @@ -49,33 +49,41 @@ void (^streamHandler)(CGDisplayStreamFrameStatus, uint64_t, IOSurfaceRef, CGDisp dispatch_semaphore_wait(region_sem, DISPATCH_TIME_FOREVER); //may need to move this down - if(ready == TRUE); + if(ready == TRUE) { + RFX_RECT rect; unsigned long offset_beg; - unsigned long offset_end; + unsigned long surflen; + unsigned long stride; rect.x = 0; rect.y = 0; - rect.width = 2880; - rect.height = 1800; - //mf_mlion_peek_dirty_region(&rect); + rect.width = 0; + rect.height = 0; + mf_mlion_peek_dirty_region(&rect); - //offset_beg = ((rect.width * 4) * rect.y) + rect.x * 4; - //offset_end = //lock surface IOSurfaceLock(frameSurface, kIOSurfaceLockReadOnly, NULL); //get pointer void* baseAddress = IOSurfaceGetBaseAddress(frameSurface); //copy region - - //offset_beg = - - memcpy(localBuf, baseAddress, rect.width * rect.height * 4); + + stride = IOSurfaceGetBytesPerRow(frameSurface); + //memcpy(localBuf, baseAddress + offset_beg, surflen); + for(int i = 0; i < rect.height; i++) + { + offset_beg = (stride * (rect.y + i) + (rect.x * 4)); + memcpy(localBuf + offset_beg, + baseAddress + offset_beg, + rect.width * 4); + } //unlock surface IOSurfaceUnlock(frameSurface, kIOSurfaceLockReadOnly, NULL); + + ready = FALSE; dispatch_semaphore_signal(data_sem); } @@ -219,9 +227,9 @@ int mf_mlion_get_dirty_region(RFX_RECT* invalid) { mf_mlion_peek_dirty_region(invalid); - CFRelease(lastUpdate); + //CFRelease(lastUpdate); - lastUpdate = NULL; + //lastUpdate = NULL; } @@ -269,21 +277,23 @@ int mf_mlion_clear_dirty_region() dispatch_semaphore_signal(region_sem); */ + + CFRelease(lastUpdate); + lastUpdate = NULL; + + return 0; } int mf_mlion_get_pixelData(long x, long y, long width, long height, BYTE** pxData) { - printf("waiting for region semaphore...\n"); dispatch_semaphore_wait(region_sem, DISPATCH_TIME_FOREVER); ready = TRUE; - printf("waiting for data semaphore...\n"); dispatch_semaphore_wait(data_sem, DISPATCH_TIME_FOREVER); dispatch_semaphore_signal(region_sem); //this second wait allows us to block until data is copied... more on this later dispatch_semaphore_wait(data_sem, DISPATCH_TIME_FOREVER); - printf("got it\n"); *pxData = localBuf; dispatch_semaphore_signal(data_sem); diff --git a/server/Mac/mf_peer.c b/server/Mac/mf_peer.c index 5ef61a697..2e737ec60 100644 --- a/server/Mac/mf_peer.c +++ b/server/Mac/mf_peer.c @@ -120,6 +120,8 @@ void mf_peer_rfx_update(freerdp_peer* client) mf_info_getScreenData(mfi, &width, &height, &dataBits, &pitch); + mf_info_clear_invalid_region(mfi); + //encode STREAM* s; @@ -137,6 +139,8 @@ void mf_peer_rfx_update(freerdp_peer* client) stream_clear(s); stream_set_pos(s, 0); + UINT32 x = mfi->invalid.x / mfi->scale; + UINT32 y = mfi->invalid.y / mfi->scale; rect.x = 0; rect.y = 0; @@ -146,9 +150,6 @@ void mf_peer_rfx_update(freerdp_peer* client) rfx_compose_message(mfp->rfx_context, s, &rect, 1, (BYTE*) dataBits, rect.width, rect.height, pitch); - UINT32 x = mfi->invalid.x / 2; - UINT32 y = mfi->invalid.y / 2; - cmd->destLeft = x; cmd->destTop = y; cmd->destRight = x + rect.width; @@ -169,7 +170,6 @@ void mf_peer_rfx_update(freerdp_peer* client) //clean up - mf_info_clear_invalid_region(mfi); // note: need to stop getting new dirty rects until here @@ -191,10 +191,10 @@ void mf_peer_context_new(freerdp_peer* client, mfPeerContext* context) context->rfx_context->mode = RLGR3; context->rfx_context->width = client->settings->DesktopWidth; context->rfx_context->height = client->settings->DesktopHeight; - rfx_context_set_pixel_format(context->rfx_context, RDP_PIXEL_FORMAT_R8G8B8A8); + rfx_context_set_pixel_format(context->rfx_context, RDP_PIXEL_FORMAT_B8G8R8A8); context->nsc_context = nsc_context_new(); - nsc_context_set_pixel_format(context->nsc_context, RDP_PIXEL_FORMAT_R8G8B8A8); + nsc_context_set_pixel_format(context->nsc_context, RDP_PIXEL_FORMAT_B8G8R8A8); context->s = stream_new(0xFFFF); @@ -280,19 +280,21 @@ BOOL mf_peer_post_connect(freerdp_peer* client) } printf("\n"); + mfInfo* mfi = mf_info_get_instance(); + mfi->scale = 1; - UINT32 servscreen_width = 2880 / 2; - UINT32 servscreen_height = 1800 / 2; + mfi->servscreen_width = 2880 / mfi->scale; + mfi->servscreen_height = 1800 / mfi->scale; UINT32 bitsPerPixel = 32; - if ((settings->DesktopWidth != servscreen_width) || (settings->DesktopHeight != servscreen_height)) + if ((settings->DesktopWidth != mfi->servscreen_width) || (settings->DesktopHeight != mfi->servscreen_height)) { printf("Client requested resolution %dx%d, but will resize to %dx%d\n", - settings->DesktopWidth, settings->DesktopHeight, servscreen_width, servscreen_height); + settings->DesktopWidth, settings->DesktopHeight, mfi->servscreen_width, mfi->servscreen_height); } - settings->DesktopWidth = servscreen_width; - settings->DesktopHeight = servscreen_height; + settings->DesktopWidth = mfi->servscreen_width; + settings->DesktopHeight = mfi->servscreen_height; settings->ColorDepth = bitsPerPixel; client->update->DesktopResize(client->update->context);