Global Metrics
path: .metrics.halstead.estimated_program_length
old: 621.3669386801487
new: 3486.2192106242974
path: .metrics.halstead.N2
old: 466.0
new: 1001.0
path: .metrics.halstead.level
old: 0.01696300837931739
new: 0.01856679905460393
path: .metrics.halstead.effort
old: 478348.6700721294
new: 1160665.1222926783
path: .metrics.halstead.N1
old: 745.0
new: 1470.0
path: .metrics.halstead.length
old: 1211.0
new: 2471.0
path: .metrics.halstead.n1
old: 21.0
new: 41.0
path: .metrics.halstead.purity_ratio
old: 0.5131023440793961
new: 1.4108535858455271
path: .metrics.halstead.time
old: 26574.926115118305
new: 64481.39568292657
path: .metrics.halstead.volume
old: 8114.232498668862
new: 21549.836095295457
path: .metrics.halstead.n2
old: 83.0
new: 381.0
path: .metrics.halstead.bugs
old: 2.038802351636614
new: 3.681431308351549
path: .metrics.halstead.difficulty
old: 58.95180722891566
new: 53.85958005249344
path: .metrics.halstead.vocabulary
old: 104.0
new: 422.0
path: .metrics.nexits.average
old: 3.8
new: 2.5
path: .metrics.nexits.sum
old: 38.0
new: 25.0
path: .metrics.nargs.average
old: 3.4
new: 1.5
path: .metrics.nargs.sum
old: 34.0
new: 15.0
path: .metrics.loc.cloc
old: 37.0
new: 131.0
path: .metrics.loc.blank
old: 24.0
new: 85.0
path: .metrics.loc.ploc
old: 191.0
new: 477.0
path: .metrics.loc.lloc
old: 103.0
new: 242.0
path: .metrics.loc.sloc
old: 252.0
new: 693.0
path: .metrics.cyclomatic.sum
old: 57.0
new: 96.0
path: .metrics.cyclomatic.average
old: 5.181818181818182
new: 8.0
path: .metrics.cognitive.average
old: 5.0
new: 10.3
path: .metrics.cognitive.sum
old: 50.0
new: 103.0
path: .metrics.mi.mi_visual_studio
old: 12.57666626666203
new: 0.0
path: .metrics.mi.mi_sei
old: -10.902239345006183
new: -47.622227870180176
path: .metrics.mi.mi_original
old: 21.50609931599207
new: -8.930928133400755
Spaces Data
Minimal test - lines (102, 123)
path: .spaces[1].metrics.nexits.sum
old: 4.0
new: 3.0
path: .spaces[1].metrics.nexits.average
old: 4.0
new: 3.0
path: .spaces[1].metrics.mi.mi_visual_studio
old: 48.773261727539115
new: 50.20624035350515
path: .spaces[1].metrics.mi.mi_original
old: 83.4022775540919
new: 85.8526710044938
path: .spaces[1].metrics.mi.mi_sei
old: 66.34681668682296
new: 48.56565015085998
path: .spaces[1].metrics.halstead.n1
old: 18.0
new: 13.0
path: .spaces[1].metrics.halstead.difficulty
old: 17.64
new: 12.551724137931034
path: .spaces[1].metrics.halstead.n2
old: 25.0
new: 29.0
path: .spaces[1].metrics.halstead.purity_ratio
old: 1.415963368669109
new: 1.4317209484434377
path: .spaces[1].metrics.halstead.volume
old: 732.5457418847832
new: 711.7858998067965
path: .spaces[1].metrics.halstead.length
old: 135.0
new: 132.0
path: .spaces[1].metrics.halstead.estimated_program_length
old: 191.15505477032977
new: 188.98716519453376
path: .spaces[1].metrics.halstead.vocabulary
old: 43.0
new: 42.0
path: .spaces[1].metrics.halstead.bugs
old: 0.18355559687514555
new: 0.14352049474832962
path: .spaces[1].metrics.halstead.N1
old: 86.0
new: 76.0
path: .spaces[1].metrics.halstead.effort
old: 12922.106886847576
new: 8934.140259643927
path: .spaces[1].metrics.halstead.time
old: 717.8948270470876
new: 496.34112553577376
path: .spaces[1].metrics.halstead.N2
old: 49.0
new: 56.0
path: .spaces[1].metrics.halstead.level
old: 0.056689342403628114
new: 0.07967032967032968
path: .spaces[1].metrics.loc.sloc
old: 25.0
new: 22.0
path: .spaces[1].metrics.loc.cloc
old: 2.0
new: 0.0
path: .spaces[1].metrics.loc.blank
old: 3.0
new: 1.0
path: .spaces[1].metrics.loc.ploc
old: 20.0
new: 21.0
path: .spaces[1].metrics.cyclomatic.sum
old: 5.0
new: 4.0
path: .spaces[1].metrics.cyclomatic.average
old: 5.0
new: 4.0
path: .spaces[1].metrics.nargs.sum
old: 4.0
new: 3.0
path: .spaces[1].metrics.nargs.average
old: 4.0
new: 3.0
Code
LayoutDeviceIntRegion nsWindow::GetRegionToPaint(bool aForceFullRepaint,
PAINTSTRUCT ps, HDC aDC) {
if (aForceFullRepaint) {
RECT paintRect;
::GetClientRect(mWnd, &paintRect);
return LayoutDeviceIntRegion(WinUtils::ToIntRect(paintRect));
}
HRGN paintRgn = ::CreateRectRgn(0, 0, 0, 0);
if (paintRgn != nullptr) {
int result = GetRandomRgn(aDC, paintRgn, SYSRGN);
if (result == 1) {
POINT pt = {0, 0};
::MapWindowPoints(nullptr, mWnd, &pt, 1);
::OffsetRgn(paintRgn, pt.x, pt.y);
}
LayoutDeviceIntRegion rgn(WinUtils::ConvertHRGNToRegion(paintRgn));
::DeleteObject(paintRgn);
return rgn;
}
return LayoutDeviceIntRegion(WinUtils::ToIntRect(ps.rcPaint));
}
Minimal test - lines (130, 136)
path: .spaces[3].metrics.nexits.sum
old: 1.0
new: 0.0
path: .spaces[3].metrics.nexits.average
old: 1.0
new: 0.0
path: .spaces[3].metrics.cyclomatic.average
old: 1.0
new: 3.0
path: .spaces[3].metrics.cyclomatic.sum
old: 1.0
new: 3.0
path: .spaces[3].metrics.mi.mi_visual_studio
old: 63.20137188912845
new: 67.09175098253554
path: .spaces[3].metrics.mi.mi_original
old: 108.07434593040966
new: 114.7268941801358
path: .spaces[3].metrics.mi.mi_sei
old: 80.31929078851206
new: 90.1205288764754
path: .spaces[3].metrics.nargs.sum
old: 4.0
new: 0.0
path: .spaces[3].metrics.nargs.average
old: 4.0
new: 0.0
path: .spaces[3].metrics.loc.lloc
old: 5.0
new: 3.0
path: .spaces[3].metrics.loc.ploc
old: 8.0
new: 7.0
path: .spaces[3].metrics.loc.sloc
old: 8.0
new: 7.0
path: .spaces[3].metrics.halstead.level
old: 0.0979020979020979
new: 0.175
path: .spaces[3].metrics.halstead.n1
old: 11.0
new: 10.0
path: .spaces[3].metrics.halstead.vocabulary
old: 25.0
new: 17.0
path: .spaces[3].metrics.halstead.N2
old: 26.0
new: 8.0
path: .spaces[3].metrics.halstead.volume
old: 264.6998028171593
new: 102.18657103125848
path: .spaces[3].metrics.halstead.effort
old: 2703.7194144895557
new: 583.9232630357627
path: .spaces[3].metrics.halstead.N1
old: 31.0
new: 17.0
path: .spaces[3].metrics.halstead.length
old: 57.0
new: 25.0
path: .spaces[3].metrics.halstead.estimated_program_length
old: 91.35671671381672
new: 52.87076540327685
path: .spaces[3].metrics.halstead.bugs
old: 0.06469238438200615
new: 0.02328712799896892
path: .spaces[3].metrics.halstead.purity_ratio
old: 1.6027494160318725
new: 2.114830616131074
path: .spaces[3].metrics.halstead.time
old: 150.20663413830866
new: 32.440181279764595
path: .spaces[3].metrics.halstead.difficulty
old: 10.214285714285714
new: 5.714285714285714
path: .spaces[3].metrics.halstead.n2
old: 14.0
new: 7.0
path: .spaces[3].metrics.cognitive.sum
old: 0.0
new: 3.0
path: .spaces[3].metrics.cognitive.average
old: 0.0
new: 3.0
Code
void nsWindow::ForcePresent() {
if (mResizeState != RESIZING) {
if (CompositorBridgeChild* remoteRenderer = GetRemoteRenderer()) {
remoteRenderer->SendForcePresent();
}
}
}
Minimal test - lines (460, 468)
path: .spaces[6].metrics.mi.mi_sei
old: 111.64485993670849
new: 118.9527071187462
path: .spaces[6].metrics.mi.mi_original
old: 129.71699971644642
new: 111.66281041186656
path: .spaces[6].metrics.mi.mi_visual_studio
old: 75.8578945710213
new: 65.29988912974653
path: .spaces[6].metrics.nargs.average
old: 1.0
new: 0.0
path: .spaces[6].metrics.nargs.sum
old: 1.0
new: 0.0
path: .spaces[6].metrics.cognitive.average
old: 1.0
new: 2.0
path: .spaces[6].metrics.cognitive.sum
old: 1.0
new: 2.0
path: .spaces[6].metrics.loc.cloc
old: 0.0
new: 2.0
path: .spaces[6].metrics.loc.lloc
old: 1.0
new: 3.0
path: .spaces[6].metrics.loc.sloc
old: 3.0
new: 9.0
path: .spaces[6].metrics.loc.ploc
old: 3.0
new: 7.0
path: .spaces[6].metrics.halstead.level
old: 0.1388888888888889
new: 0.2222222222222222
path: .spaces[6].metrics.halstead.estimated_program_length
old: 40.13896548741762
new: 48.18080946738404
path: .spaces[6].metrics.halstead.bugs
old: 0.023793834650606825
new: 0.01797527469415136
path: .spaces[6].metrics.halstead.purity_ratio
old: 1.8244984312462555
new: 2.1900367939720016
path: .spaces[6].metrics.halstead.vocabulary
old: 14.0
new: 16.0
path: .spaces[6].metrics.halstead.N1
old: 14.0
new: 15.0
path: .spaces[6].metrics.halstead.n2
old: 5.0
new: 7.0
path: .spaces[6].metrics.halstead.time
old: 33.50472331410692
new: 22.0
path: .spaces[6].metrics.halstead.volume
old: 83.76180828526729
new: 88.0
path: .spaces[6].metrics.halstead.effort
old: 603.0850196539245
new: 396.0
path: .spaces[6].metrics.halstead.difficulty
old: 7.2
new: 4.5
path: .spaces[6].metrics.halstead.N2
old: 8.0
new: 7.0
path: .spaces[6].metrics.nexits.sum
old: 1.0
new: 0.0
path: .spaces[6].metrics.nexits.average
old: 1.0
new: 0.0
Code
void nsWindow::RequestFxrOutput() {
if (GetRemoteRenderer() != nullptr) {
MOZ_CRASH("RequestFxrOutput should happen before Compositor is created.");
} else {
// The compositor isn't ready, so indicate to make the IPC call when
// it is available.
mRequestFxrOutputPending = true;
}
}
Minimal test - lines (590, 617)
path: .spaces[9].metrics.mi.mi_sei
old: 80.31929078851206
new: 70.25200900507826
path: .spaces[9].metrics.mi.mi_original
old: 108.07434593040966
new: 81.58998358242185
path: .spaces[9].metrics.mi.mi_visual_studio
old: 63.20137188912845
new: 47.713440691474766
path: .spaces[9].metrics.cyclomatic.average
old: 1.0
new: 6.0
path: .spaces[9].metrics.cyclomatic.sum
old: 1.0
new: 6.0
path: .spaces[9].metrics.nargs.average
old: 4.0
new: 0.0
path: .spaces[9].metrics.nargs.sum
old: 4.0
new: 0.0
path: .spaces[9].metrics.halstead.difficulty
old: 10.214285714285714
new: 23.157894736842103
path: .spaces[9].metrics.halstead.vocabulary
old: 25.0
new: 39.0
path: .spaces[9].metrics.halstead.time
old: 150.20663413830866
new: 897.5911136594136
path: .spaces[9].metrics.halstead.effort
old: 2703.7194144895557
new: 16156.640045869444
path: .spaces[9].metrics.halstead.n2
old: 14.0
new: 19.0
path: .spaces[9].metrics.halstead.N2
old: 26.0
new: 44.0
path: .spaces[9].metrics.halstead.N1
old: 31.0
new: 88.0
path: .spaces[9].metrics.halstead.bugs
old: 0.06469238438200615
new: 0.21303262145085705
path: .spaces[9].metrics.halstead.estimated_program_length
old: 91.35671671381672
new: 167.14918465317538
path: .spaces[9].metrics.halstead.length
old: 57.0
new: 132.0
path: .spaces[9].metrics.halstead.n1
old: 11.0
new: 20.0
path: .spaces[9].metrics.halstead.level
old: 0.0979020979020979
new: 0.04318181818181818
path: .spaces[9].metrics.halstead.purity_ratio
old: 1.6027494160318725
new: 1.2662817019179953
path: .spaces[9].metrics.halstead.volume
old: 264.6998028171593
new: 697.6730928898169
path: .spaces[9].metrics.cognitive.average
old: 0.0
new: 10.0
path: .spaces[9].metrics.cognitive.sum
old: 0.0
new: 10.0
path: .spaces[9].metrics.loc.blank
old: 0.0
new: 4.0
path: .spaces[9].metrics.loc.ploc
old: 8.0
new: 20.0
path: .spaces[9].metrics.loc.sloc
old: 8.0
new: 28.0
path: .spaces[9].metrics.loc.cloc
old: 0.0
new: 4.0
path: .spaces[9].metrics.loc.lloc
old: 5.0
new: 11.0
path: .spaces[9].metrics.nexits.average
old: 1.0
new: 2.0
path: .spaces[9].metrics.nexits.sum
old: 1.0
new: 2.0
Code
uint8_t* nsWindowGfx::Data32BitTo1Bit(uint8_t* aImageData, uint32_t aWidth,
uint32_t aHeight) {
// We need (aWidth + 7) / 8 bytes plus zero-padding up to a multiple of
// 4 bytes for each row (HBITMAP requirement). Bug 353553.
uint32_t outBpr = ((aWidth + 31) / 8) & ~3;
// Allocate and clear mask buffer
uint8_t* outData = (uint8_t*)calloc(outBpr, aHeight);
if (!outData) return nullptr;
int32_t* imageRow = (int32_t*)aImageData;
for (uint32_t curRow = 0; curRow < aHeight; curRow++) {
uint8_t* outRow = outData + curRow * outBpr;
uint8_t mask = 0x80;
for (uint32_t curCol = 0; curCol < aWidth; curCol++) {
// Use sign bit to test for transparency, as alpha byte is highest byte
if (*imageRow++ < 0) *outRow |= mask;
mask >>= 1;
if (!mask) {
outRow++;
mask = 0x80;
}
}
}
return outData;
}
Minimal test - lines (138, 447)
path: .spaces[4].metrics.halstead.N1
old: 53.0
new: 653.0
path: .spaces[4].metrics.halstead.difficulty
old: 16.607142857142858
new: 34.91228070175438
path: .spaces[4].metrics.halstead.n1
old: 15.0
new: 30.0
path: .spaces[4].metrics.halstead.bugs
old: 0.1193709796408008
new: 1.4291576133153725
path: .spaces[4].metrics.halstead.N2
old: 31.0
new: 398.0
path: .spaces[4].metrics.halstead.n2
old: 14.0
new: 171.0
path: .spaces[4].metrics.halstead.estimated_program_length
old: 111.90632784293425
new: 1415.6594979137442
path: .spaces[4].metrics.halstead.time
old: 376.4935271223868
new: 15596.586843648942
path: .spaces[4].metrics.halstead.purity_ratio
old: 1.33221818860636
new: 1.3469643177105082
path: .spaces[4].metrics.halstead.volume
old: 408.070403590716
new: 8041.255327429053
path: .spaces[4].metrics.halstead.effort
old: 6776.883488202962
new: 280738.56318568095
path: .spaces[4].metrics.halstead.length
old: 84.0
new: 1051.0
path: .spaces[4].metrics.halstead.vocabulary
old: 29.0
new: 201.0
path: .spaces[4].metrics.halstead.level
old: 0.06021505376344086
new: 0.02864321608040201
path: .spaces[4].metrics.cognitive.sum
old: 3.0
new: 63.0
path: .spaces[4].metrics.cognitive.average
old: 3.0
new: 63.0
path: .spaces[4].metrics.loc.cloc
old: 0.0
new: 51.0
path: .spaces[4].metrics.loc.sloc
old: 14.0
new: 310.0
path: .spaces[4].metrics.loc.blank
old: 2.0
new: 38.0
path: .spaces[4].metrics.loc.lloc
old: 7.0
new: 124.0
path: .spaces[4].metrics.loc.ploc
old: 12.0
new: 221.0
path: .spaces[4].metrics.mi.mi_sei
old: 63.30294406487193
new: -13.332863539330276
path: .spaces[4].metrics.mi.mi_original
old: 96.0677847300744
new: 19.11735825760188
path: .spaces[4].metrics.mi.mi_visual_studio
old: 56.17999107021895
new: 11.17974167111221
path: .spaces[4].metrics.nargs.sum
old: 4.0
new: 2.0
path: .spaces[4].metrics.nargs.average
old: 4.0
new: 2.0
path: .spaces[4].metrics.cyclomatic.sum
old: 4.0
new: 53.0
path: .spaces[4].metrics.cyclomatic.average
old: 4.0
new: 53.0
path: .spaces[4].metrics.nexits.sum
old: 3.0
new: 10.0
path: .spaces[4].metrics.nexits.average
old: 3.0
new: 10.0
Code
bool nsWindow::OnPaint(HDC aDC, uint32_t aNestingLevel) {
// We never have reentrant paint events, except when we're running our RPC
// windows event spin loop. If we don't trap for this, we'll try to paint,
// but view manager will refuse to paint the surface, resulting is black
// flashes on the plugin rendering surface.
if (mozilla::ipc::MessageChannel::IsSpinLoopActive() && mPainting)
return false;
DeviceResetReason resetReason = DeviceResetReason::OK;
if (gfxWindowsPlatform::GetPlatform()->DidRenderingDeviceReset(
&resetReason)) {
gfxCriticalNote << "(nsWindow) Detected device reset: " << (int)resetReason;
gfxWindowsPlatform::GetPlatform()->UpdateRenderMode();
bool guilty;
switch (resetReason) {
case DeviceResetReason::HUNG:
case DeviceResetReason::RESET:
case DeviceResetReason::INVALID_CALL:
guilty = true;
break;
default:
guilty = false;
break;
}
GPUProcessManager::Get()->OnInProcessDeviceReset(guilty);
gfxCriticalNote << "(nsWindow) Finished device reset.";
return false;
}
// After we CallUpdateWindow to the child, occasionally a WM_PAINT message
// is posted to the parent event loop with an empty update rect. Do a
// dummy paint so that Windows stops dispatching WM_PAINT in an inifinite
// loop. See bug 543788.
if (IsPlugin()) {
RECT updateRect;
if (!GetUpdateRect(mWnd, &updateRect, FALSE) ||
(updateRect.left == updateRect.right &&
updateRect.top == updateRect.bottom)) {
PAINTSTRUCT ps;
BeginPaint(mWnd, &ps);
EndPaint(mWnd, &ps);
return true;
}
if (mWindowType == eWindowType_plugin_ipc_chrome) {
// Fire off an async request to the plugin to paint its window
mozilla::dom::ContentParent::SendAsyncUpdate(this);
ValidateRect(mWnd, nullptr);
return true;
}
PluginInstanceParent* instance = reinterpret_cast(
::GetPropW(mWnd, L"PluginInstanceParentProperty"));
if (instance) {
Unused << instance->CallUpdateWindow();
} else {
// We should never get here since in-process plugins should have
// subclassed our HWND and handled WM_PAINT, but in some cases that
// could fail. Return without asserting since it's not our fault.
NS_WARNING("Plugin failed to subclass our window");
}
ValidateRect(mWnd, nullptr);
return true;
}
PAINTSTRUCT ps;
// Avoid starting the GPU process for the initial navigator:blank window.
if (mIsEarlyBlankWindow) {
// Call BeginPaint/EndPaint or Windows will keep sending us messages.
::BeginPaint(mWnd, &ps);
::EndPaint(mWnd, &ps);
return true;
}
// Clear window by transparent black when compositor window is used in GPU
// process and non-client area rendering by DWM is enabled.
// It is for showing non-client area rendering. See nsWindow::UpdateGlass().
if (HasGlass() && GetLayerManager()->AsKnowsCompositor() &&
GetLayerManager()->AsKnowsCompositor()->GetUseCompositorWnd()) {
HDC hdc;
RECT rect;
hdc = ::GetWindowDC(mWnd);
::GetWindowRect(mWnd, &rect);
::MapWindowPoints(nullptr, mWnd, (LPPOINT)&rect, 2);
::FillRect(hdc, &rect,
reinterpret_cast(GetStockObject(BLACK_BRUSH)));
ReleaseDC(mWnd, hdc);
}
if (GetLayerManager()->AsKnowsCompositor() &&
!mBounds.IsEqualEdges(mLastPaintBounds)) {
// Do an early async composite so that we at least have something on the
// screen in the right place, even if the content is out of date.
GetLayerManager()->ScheduleComposite();
}
mLastPaintBounds = mBounds;
#ifdef MOZ_XUL
if (!aDC &&
(GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC) &&
(eTransparencyTransparent == mTransparencyMode)) {
// For layered translucent windows all drawing should go to memory DC and no
// WM_PAINT messages are normally generated. To support asynchronous
// painting we force generation of WM_PAINT messages by invalidating window
// areas with RedrawWindow, InvalidateRect or InvalidateRgn function calls.
// BeginPaint/EndPaint must be called to make Windows think that invalid
// area is painted. Otherwise it will continue sending the same message
// endlessly.
::BeginPaint(mWnd, &ps);
::EndPaint(mWnd, &ps);
// We're guaranteed to have a widget proxy since we called
// GetLayerManager().
aDC = mBasicLayersSurface->GetTransparentDC();
}
#endif
mPainting = true;
#ifdef WIDGET_DEBUG_OUTPUT
HRGN debugPaintFlashRegion = nullptr;
HDC debugPaintFlashDC = nullptr;
if (debug_WantPaintFlashing()) {
debugPaintFlashRegion = ::CreateRectRgn(0, 0, 0, 0);
::GetUpdateRgn(mWnd, debugPaintFlashRegion, TRUE);
debugPaintFlashDC = ::GetDC(mWnd);
}
#endif // WIDGET_DEBUG_OUTPUT
HDC hDC = aDC ? aDC : (::BeginPaint(mWnd, &ps));
mPaintDC = hDC;
#ifdef MOZ_XUL
bool forceRepaint = aDC || (eTransparencyTransparent == mTransparencyMode);
#else
bool forceRepaint = nullptr != aDC;
#endif
LayoutDeviceIntRegion region = GetRegionToPaint(forceRepaint, ps, hDC);
if (GetLayerManager()->AsKnowsCompositor()) {
// We need to paint to the screen even if nothing changed, since if we
// don't have a compositing window manager, our pixels could be stale.
GetLayerManager()->SetNeedsComposite(true);
GetLayerManager()->SendInvalidRegion(region.ToUnknownRegion());
}
RefPtr strongThis(this);
nsIWidgetListener* listener = GetPaintListener();
if (listener) {
listener->WillPaintWindow(this);
}
// Re-get the listener since the will paint notification may have killed it.
listener = GetPaintListener();
if (!listener) {
return false;
}
if (GetLayerManager()->AsKnowsCompositor() &&
GetLayerManager()->NeedsComposite()) {
GetLayerManager()->ScheduleComposite();
GetLayerManager()->SetNeedsComposite(false);
}
bool result = true;
if (!region.IsEmpty() && listener) {
// Should probably pass in a real region here, using GetRandomRgn
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/clipping_4q0e.asp
#ifdef WIDGET_DEBUG_OUTPUT
debug_DumpPaintEvent(stdout, this, region.ToUnknownRegion(), "noname",
(int32_t)mWnd);
#endif // WIDGET_DEBUG_OUTPUT
switch (GetLayerManager()->GetBackendType()) {
case LayersBackend::LAYERS_BASIC: {
RefPtr targetSurface;
#if defined(MOZ_XUL)
// don't support transparency for non-GDI rendering, for now
if (eTransparencyTransparent == mTransparencyMode) {
// This mutex needs to be held when EnsureTransparentSurface is
// called.
MutexAutoLock lock(mBasicLayersSurface->GetTransparentSurfaceLock());
targetSurface = mBasicLayersSurface->EnsureTransparentSurface();
}
#endif
RefPtr targetSurfaceWin;
if (!targetSurface) {
uint32_t flags = (mTransparencyMode == eTransparencyOpaque)
? 0
: gfxWindowsSurface::FLAG_IS_TRANSPARENT;
targetSurfaceWin = new gfxWindowsSurface(hDC, flags);
targetSurface = targetSurfaceWin;
}
if (!targetSurface) {
NS_ERROR("Invalid RenderMode!");
return false;
}
RECT paintRect;
::GetClientRect(mWnd, &paintRect);
RefPtr dt = gfxPlatform::CreateDrawTargetForSurface(
targetSurface, IntSize(paintRect.right - paintRect.left,
paintRect.bottom - paintRect.top));
if (!dt || !dt->IsValid()) {
gfxWarning()
<< "nsWindow::OnPaint failed in CreateDrawTargetForSurface";
return false;
}
// don't need to double buffer with anything but GDI
BufferMode doubleBuffering = mozilla::layers::BufferMode::BUFFER_NONE;
#ifdef MOZ_XUL
switch (mTransparencyMode) {
case eTransparencyGlass:
case eTransparencyBorderlessGlass:
default:
// If we're not doing translucency, then double buffer
doubleBuffering = mozilla::layers::BufferMode::BUFFERED;
break;
case eTransparencyTransparent:
// If we're rendering with translucency, we're going to be
// rendering the whole window; make sure we clear it first
dt->ClearRect(
Rect(0.f, 0.f, dt->GetSize().width, dt->GetSize().height));
break;
}
#else
doubleBuffering = mozilla::layers::BufferMode::BUFFERED;
#endif
RefPtr thebesContext = gfxContext::CreateOrNull(dt);
MOZ_ASSERT(thebesContext); // already checked draw target above
{
AutoLayerManagerSetup setupLayerManager(this, thebesContext,
doubleBuffering);
result = listener->PaintWindow(this, region);
}
#ifdef MOZ_XUL
if (eTransparencyTransparent == mTransparencyMode) {
// Data from offscreen drawing surface was copied to memory bitmap of
// transparent bitmap. Now it can be read from memory bitmap to apply
// alpha channel and after that displayed on the screen.
mBasicLayersSurface->RedrawTransparentWindow();
}
#endif
} break;
case LayersBackend::LAYERS_CLIENT:
case LayersBackend::LAYERS_WR: {
result = listener->PaintWindow(this, region);
if (!gfxEnv::DisableForcePresent() &&
gfxWindowsPlatform::GetPlatform()->DwmCompositionEnabled()) {
nsCOMPtr event = NewRunnableMethod(
"nsWindow::ForcePresent", this, &nsWindow::ForcePresent);
NS_DispatchToMainThread(event);
}
} break;
default:
NS_ERROR("Unknown layers backend used!");
break;
}
}
if (!aDC) {
::EndPaint(mWnd, &ps);
}
mPaintDC = nullptr;
mLastPaintEndTime = TimeStamp::Now();
#if defined(WIDGET_DEBUG_OUTPUT)
if (debug_WantPaintFlashing()) {
// Only flash paint events which have not ignored the paint message.
// Those that ignore the paint message aren't painting anything so there
// is only the overhead of the dispatching the paint event.
if (result) {
::InvertRgn(debugPaintFlashDC, debugPaintFlashRegion);
PR_Sleep(PR_MillisecondsToInterval(30));
::InvertRgn(debugPaintFlashDC, debugPaintFlashRegion);
PR_Sleep(PR_MillisecondsToInterval(30));
}
::ReleaseDC(mWnd, debugPaintFlashDC);
::DeleteObject(debugPaintFlashRegion);
}
#endif // WIDGET_DEBUG_OUTPUT
mPainting = false;
// Re-get the listener since painting may have killed it.
listener = GetPaintListener();
if (listener) listener->DidPaintWindow();
if (aNestingLevel == 0 && ::GetUpdateRect(mWnd, nullptr, false)) {
OnPaint(aDC, 1);
}
return result;
}
Minimal test - lines (481, 587)
path: .spaces[8].metrics.cyclomatic.average
old: 5.0
new: 15.0
path: .spaces[8].metrics.cyclomatic.sum
old: 5.0
new: 15.0
path: .spaces[8].metrics.halstead.purity_ratio
old: 1.0933117349053223
new: 1.1757320584948583
path: .spaces[8].metrics.halstead.vocabulary
old: 26.0
new: 112.0
path: .spaces[8].metrics.halstead.difficulty
old: 16.5
new: 37.03488372093023
path: .spaces[8].metrics.halstead.length
old: 88.0
new: 574.0
path: .spaces[8].metrics.halstead.N1
old: 55.0
new: 329.0
path: .spaces[8].metrics.halstead.estimated_program_length
old: 96.2114326716684
new: 674.8702015760488
path: .spaces[8].metrics.halstead.bugs
old: 0.1199357939509161
new: 0.9187829488841908
path: .spaces[8].metrics.halstead.n1
old: 13.0
new: 26.0
path: .spaces[8].metrics.halstead.time
old: 379.16880393004806
new: 8039.49495798223
path: .spaces[8].metrics.halstead.n2
old: 13.0
new: 86.0
path: .spaces[8].metrics.halstead.effort
old: 6825.038470740865
new: 144710.90924368013
path: .spaces[8].metrics.halstead.N2
old: 33.0
new: 245.0
path: .spaces[8].metrics.halstead.level
old: 0.06060606060606061
new: 0.027001569858712715
path: .spaces[8].metrics.halstead.volume
old: 413.63869519641605
new: 3907.4217252610647
path: .spaces[8].metrics.nexits.sum
old: 4.0
new: 5.0
path: .spaces[8].metrics.nexits.average
old: 4.0
new: 5.0
path: .spaces[8].metrics.nargs.sum
old: 4.0
new: 5.0
path: .spaces[8].metrics.nargs.average
old: 4.0
new: 5.0
path: .spaces[8].metrics.loc.cloc
old: 0.0
new: 10.0
path: .spaces[8].metrics.loc.blank
old: 3.0
new: 11.0
path: .spaces[8].metrics.loc.sloc
old: 19.0
new: 107.0
path: .spaces[8].metrics.loc.lloc
old: 10.0
new: 48.0
path: .spaces[8].metrics.loc.ploc
old: 16.0
new: 86.0
path: .spaces[8].metrics.mi.mi_original
old: 90.82012558298317
new: 48.842881124822526
path: .spaces[8].metrics.mi.mi_sei
old: 55.83399209649225
new: 19.096576665788835
path: .spaces[8].metrics.mi.mi_visual_studio
old: 53.11118455145213
new: 28.56308837708919
path: .spaces[8].metrics.cognitive.sum
old: 4.0
new: 15.0
path: .spaces[8].metrics.cognitive.average
old: 4.0
new: 15.0
Code
nsresult nsWindowGfx::CreateIcon(imgIContainer* aContainer, bool aIsCursor,
LayoutDeviceIntPoint aHotspot,
LayoutDeviceIntSize aScaledSize,
HICON* aIcon) {
MOZ_ASSERT(aHotspot.x >= 0 && aHotspot.y >= 0);
MOZ_ASSERT((aScaledSize.width > 0 && aScaledSize.height > 0) ||
(aScaledSize.width == 0 && aScaledSize.height == 0));
// Get the image data
RefPtr surface = aContainer->GetFrame(
imgIContainer::FRAME_CURRENT,
imgIContainer::FLAG_SYNC_DECODE | imgIContainer::FLAG_ASYNC_NOTIFY);
NS_ENSURE_TRUE(surface, NS_ERROR_NOT_AVAILABLE);
IntSize frameSize = surface->GetSize();
if (frameSize.IsEmpty()) {
return NS_ERROR_FAILURE;
}
IntSize iconSize(aScaledSize.width, aScaledSize.height);
if (iconSize == IntSize(0, 0)) { // use frame's intrinsic size
iconSize = frameSize;
}
RefPtr dataSurface;
bool mappedOK;
DataSourceSurface::MappedSurface map;
if (iconSize != frameSize) {
// Scale the surface
dataSurface =
Factory::CreateDataSourceSurface(iconSize, SurfaceFormat::B8G8R8A8);
NS_ENSURE_TRUE(dataSurface, NS_ERROR_FAILURE);
mappedOK = dataSurface->Map(DataSourceSurface::MapType::READ_WRITE, &map);
NS_ENSURE_TRUE(mappedOK, NS_ERROR_FAILURE);
RefPtr dt = Factory::CreateDrawTargetForData(
BackendType::CAIRO, map.mData, dataSurface->GetSize(), map.mStride,
SurfaceFormat::B8G8R8A8);
if (!dt) {
gfxWarning()
<< "nsWindowGfx::CreatesIcon failed in CreateDrawTargetForData";
return NS_ERROR_OUT_OF_MEMORY;
}
dt->DrawSurface(surface, Rect(0, 0, iconSize.width, iconSize.height),
Rect(0, 0, frameSize.width, frameSize.height),
DrawSurfaceOptions(),
DrawOptions(1.0f, CompositionOp::OP_SOURCE));
} else if (surface->GetFormat() != SurfaceFormat::B8G8R8A8) {
// Convert format to SurfaceFormat::B8G8R8A8
dataSurface = gfxUtils::CopySurfaceToDataSourceSurfaceWithFormat(
surface, SurfaceFormat::B8G8R8A8);
NS_ENSURE_TRUE(dataSurface, NS_ERROR_FAILURE);
mappedOK = dataSurface->Map(DataSourceSurface::MapType::READ, &map);
} else {
dataSurface = surface->GetDataSurface();
NS_ENSURE_TRUE(dataSurface, NS_ERROR_FAILURE);
mappedOK = dataSurface->Map(DataSourceSurface::MapType::READ, &map);
}
NS_ENSURE_TRUE(dataSurface && mappedOK, NS_ERROR_FAILURE);
MOZ_ASSERT(dataSurface->GetFormat() == SurfaceFormat::B8G8R8A8);
uint8_t* data = nullptr;
UniquePtr autoDeleteArray;
if (map.mStride == BytesPerPixel(dataSurface->GetFormat()) * iconSize.width) {
// Mapped data is already packed
data = map.mData;
} else {
// We can't use map.mData since the pixels are not packed (as required by
// CreateDIBitmap, which is called under the DataToBitmap call below).
//
// We must unmap before calling SurfaceToPackedBGRA because it needs access
// to the pixel data.
dataSurface->Unmap();
map.mData = nullptr;
autoDeleteArray = SurfaceToPackedBGRA(dataSurface);
data = autoDeleteArray.get();
NS_ENSURE_TRUE(data, NS_ERROR_FAILURE);
}
HBITMAP bmp = DataToBitmap(data, iconSize.width, -iconSize.height, 32);
uint8_t* a1data = Data32BitTo1Bit(data, iconSize.width, iconSize.height);
if (map.mData) {
dataSurface->Unmap();
}
if (!a1data) {
return NS_ERROR_FAILURE;
}
HBITMAP mbmp = DataToBitmap(a1data, iconSize.width, -iconSize.height, 1);
free(a1data);
ICONINFO info = {0};
info.fIcon = !aIsCursor;
info.xHotspot = aHotspot.x;
info.yHotspot = aHotspot.y;
info.hbmMask = mbmp;
info.hbmColor = bmp;
HCURSOR icon = ::CreateIconIndirect(&info);
::DeleteObject(mbmp);
::DeleteObject(bmp);
if (!icon) return NS_ERROR_FAILURE;
*aIcon = icon;
return NS_OK;
}
Minimal test - lines (452, 458)
path: .spaces[5].metrics.cyclomatic.average
old: 1.0
new: 2.0
path: .spaces[5].metrics.cyclomatic.sum
old: 1.0
new: 2.0
path: .spaces[5].metrics.loc.sloc
old: 8.0
new: 7.0
path: .spaces[5].metrics.loc.lloc
old: 5.0
new: 3.0
path: .spaces[5].metrics.loc.blank
old: 0.0
new: 1.0
path: .spaces[5].metrics.loc.ploc
old: 8.0
new: 6.0
path: .spaces[5].metrics.halstead.level
old: 0.0979020979020979
new: 0.22857142857142856
path: .spaces[5].metrics.halstead.n1
old: 11.0
new: 7.0
path: .spaces[5].metrics.halstead.vocabulary
old: 25.0
new: 11.0
path: .spaces[5].metrics.halstead.N2
old: 26.0
new: 5.0
path: .spaces[5].metrics.halstead.N1
old: 31.0
new: 14.0
path: .spaces[5].metrics.halstead.n2
old: 14.0
new: 4.0
path: .spaces[5].metrics.halstead.volume
old: 264.6998028171593
new: 65.72920075410865
path: .spaces[5].metrics.halstead.difficulty
old: 10.214285714285714
new: 4.375
path: .spaces[5].metrics.halstead.effort
old: 2703.7194144895557
new: 287.56525329922533
path: .spaces[5].metrics.halstead.purity_ratio
old: 1.6027494160318725
new: 1.455341287073854
path: .spaces[5].metrics.halstead.estimated_program_length
old: 91.35671671381672
new: 27.651484454403228
path: .spaces[5].metrics.halstead.bugs
old: 0.06469238438200615
new: 0.01452233166731256
path: .spaces[5].metrics.halstead.time
old: 150.20663413830866
new: 15.975847405512518
path: .spaces[5].metrics.halstead.length
old: 57.0
new: 19.0
path: .spaces[5].metrics.nexits.average
old: 1.0
new: 0.0
path: .spaces[5].metrics.nexits.sum
old: 1.0
new: 0.0
path: .spaces[5].metrics.cognitive.sum
old: 0.0
new: 1.0
path: .spaces[5].metrics.cognitive.average
old: 0.0
new: 1.0
path: .spaces[5].metrics.mi.mi_sei
old: 80.31929078851206
new: 93.66084506851593
path: .spaces[5].metrics.mi.mi_original
old: 108.07434593040966
new: 117.2514305154106
path: .spaces[5].metrics.mi.mi_visual_studio
old: 63.20137188912845
new: 68.56808802070795
path: .spaces[5].metrics.nargs.average
old: 4.0
new: 0.0
path: .spaces[5].metrics.nargs.sum
old: 4.0
new: 0.0
Code
void nsWindow::CreateCompositor() {
nsWindowBase::CreateCompositor();
if (mRequestFxrOutputPending) {
GetRemoteRenderer()->SendRequestFxrOutput();
}
}
Minimal test - lines (125, 128)
path: .spaces[2].metrics.cyclomatic.average
old: 29.0
new: 3.0
path: .spaces[2].metrics.cyclomatic.sum
old: 29.0
new: 3.0
path: .spaces[2].metrics.halstead.effort
old: 125414.10864546074
new: 389.71233691194976
path: .spaces[2].metrics.halstead.N1
old: 319.0
new: 12.0
path: .spaces[2].metrics.halstead.purity_ratio
old: 0.5478640629477401
new: 2.3178473693319868
path: .spaces[2].metrics.halstead.n2
old: 38.0
new: 6.0
path: .spaces[2].metrics.halstead.length
old: 501.0
new: 19.0
path: .spaces[2].metrics.halstead.level
old: 0.023199023199023196
new: 0.1904761904761905
path: .spaces[2].metrics.halstead.time
old: 6967.450480303374
new: 21.65068538399721
path: .spaces[2].metrics.halstead.volume
old: 2909.4848159508597
new: 74.23092131656186
path: .spaces[2].metrics.halstead.estimated_program_length
old: 274.4798955368178
new: 44.039100017307746
path: .spaces[2].metrics.halstead.difficulty
old: 43.10526315789474
new: 5.25
path: .spaces[2].metrics.halstead.n1
old: 18.0
new: 9.0
path: .spaces[2].metrics.halstead.N2
old: 182.0
new: 7.0
path: .spaces[2].metrics.halstead.bugs
old: 0.8351728014822635
new: 0.017784494061890636
path: .spaces[2].metrics.halstead.vocabulary
old: 56.0
new: 15.0
path: .spaces[2].metrics.nargs.sum
old: 4.0
new: 0.0
path: .spaces[2].metrics.nargs.average
old: 4.0
new: 0.0
path: .spaces[2].metrics.mi.mi_visual_studio
old: 28.123534993924594
new: 73.3653165074973
path: .spaces[2].metrics.mi.mi_sei
old: 23.01397192861325
new: 105.59746847683324
path: .spaces[2].metrics.mi.mi_original
old: 48.09124483961105
new: 125.45469122782038
path: .spaces[2].metrics.loc.cloc
old: 13.0
new: 0.0
path: .spaces[2].metrics.loc.blank
old: 12.0
new: 0.0
path: .spaces[2].metrics.loc.sloc
old: 101.0
new: 4.0
path: .spaces[2].metrics.loc.ploc
old: 76.0
new: 4.0
path: .spaces[2].metrics.loc.lloc
old: 44.0
new: 3.0
path: .spaces[2].metrics.nexits.sum
old: 17.0
new: 2.0
path: .spaces[2].metrics.nexits.average
old: 17.0
new: 2.0
path: .spaces[2].metrics.cognitive.sum
old: 32.0
new: 1.0
path: .spaces[2].metrics.cognitive.average
old: 32.0
new: 1.0
Code
nsIWidgetListener* nsWindow::GetPaintListener() {
if (mDestroyCalled) return nullptr;
return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
}
Minimal test - lines (470, 479)
path: .spaces[7].metrics.halstead.purity_ratio
old: 1.8244984312462555
new: 1.5711252818015184
path: .spaces[7].metrics.halstead.difficulty
old: 7.2
new: 14.083333333333334
path: .spaces[7].metrics.halstead.time
old: 33.50472331410692
new: 210.73647394524
path: .spaces[7].metrics.halstead.bugs
old: 0.023793834650606825
new: 0.08107498707437459
path: .spaces[7].metrics.halstead.length
old: 22.0
new: 58.0
path: .spaces[7].metrics.halstead.N2
old: 8.0
new: 26.0
path: .spaces[7].metrics.halstead.vocabulary
old: 14.0
new: 25.0
path: .spaces[7].metrics.halstead.N1
old: 14.0
new: 32.0
path: .spaces[7].metrics.halstead.estimated_program_length
old: 40.13896548741762
new: 91.12526634448808
path: .spaces[7].metrics.halstead.level
old: 0.1388888888888889
new: 0.07100591715976332
path: .spaces[7].metrics.halstead.volume
old: 83.76180828526729
new: 269.343659006934
path: .spaces[7].metrics.halstead.n2
old: 5.0
new: 12.0
path: .spaces[7].metrics.halstead.n1
old: 9.0
new: 13.0
path: .spaces[7].metrics.halstead.effort
old: 603.0850196539245
new: 3793.25653101432
path: .spaces[7].metrics.loc.lloc
old: 1.0
new: 3.0
path: .spaces[7].metrics.loc.ploc
old: 3.0
new: 8.0
path: .spaces[7].metrics.loc.sloc
old: 3.0
new: 10.0
path: .spaces[7].metrics.loc.blank
old: 0.0
new: 2.0
path: .spaces[7].metrics.cognitive.average
old: 1.0
new: 2.0
path: .spaces[7].metrics.cognitive.sum
old: 1.0
new: 2.0
path: .spaces[7].metrics.cyclomatic.average
old: 2.0
new: 3.0
path: .spaces[7].metrics.cyclomatic.sum
old: 2.0
new: 3.0
path: .spaces[7].metrics.mi.mi_original
old: 129.71699971644642
new: 103.90898333701774
path: .spaces[7].metrics.mi.mi_sei
old: 111.64485993670849
new: 74.51358255033007
path: .spaces[7].metrics.mi.mi_visual_studio
old: 75.8578945710213
new: 60.76548733158933
Code
LayoutDeviceIntSize nsWindowGfx::GetIconMetrics(IconSizeType aSizeType) {
int32_t width = ::GetSystemMetrics(sIconMetrics[aSizeType].xMetric);
int32_t height = ::GetSystemMetrics(sIconMetrics[aSizeType].yMetric);
if (width == 0 || height == 0) {
width = height = sIconMetrics[aSizeType].defaultSize;
}
return LayoutDeviceIntSize(width, height);
}
Minimal test - lines (79, 83)
path: .spaces[0].metrics.nexits.sum
old: 5.0
new: 0.0
path: .spaces[0].metrics.nexits.average
old: 5.0
new: null
path: .spaces[0].metrics.halstead.difficulty
old: 18.6
new: 1.5
path: .spaces[0].metrics.halstead.n1
old: 15.0
new: 3.0
path: .spaces[0].metrics.halstead.N2
old: 62.0
new: 4.0
path: .spaces[0].metrics.halstead.time
old: 951.3833457626976
new: 2.573408678552804
path: .spaces[0].metrics.halstead.volume
old: 920.6935604155136
new: 30.880904142633646
path: .spaces[0].metrics.halstead.N1
old: 111.0
new: 7.0
path: .spaces[0].metrics.halstead.effort
old: 17124.900223728557
new: 46.321356213950466
path: .spaces[0].metrics.halstead.level
old: 0.05376344086021505
new: 0.6666666666666666
path: .spaces[0].metrics.halstead.vocabulary
old: 40.0
new: 7.0
path: .spaces[0].metrics.halstead.estimated_program_length
old: 174.6997636784959
new: 12.754887502163468
path: .spaces[0].metrics.halstead.n2
old: 25.0
new: 4.0
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.0098252235751208
new: 1.1595352274694062
path: .spaces[0].metrics.halstead.bugs
old: 0.22146109613444465
new: 0.004299318203100795
path: .spaces[0].metrics.halstead.length
old: 173.0
new: 11.0
path: .spaces[0].metrics.mi.mi_original
old: 80.73678103930794
new: 126.86038819798438
path: .spaces[0].metrics.mi.mi_sei
old: 56.07587388114769
new: 107.42182080587256
path: .spaces[0].metrics.mi.mi_visual_studio
old: 47.2144918358526
new: 74.18736151928911
path: .spaces[0].metrics.cyclomatic.average
old: 6.0
new: 1.0
path: .spaces[0].metrics.cyclomatic.sum
old: 6.0
new: 1.0
path: .spaces[0].metrics.nargs.average
old: 4.0
new: null
path: .spaces[0].metrics.nargs.sum
old: 4.0
new: 0.0
path: .spaces[0].metrics.loc.ploc
old: 22.0
new: 5.0
path: .spaces[0].metrics.loc.lloc
old: 15.0
new: 0.0
path: .spaces[0].metrics.loc.sloc
old: 27.0
new: 5.0
path: .spaces[0].metrics.loc.blank
old: 4.0
new: 0.0
path: .spaces[0].metrics.loc.cloc
old: 1.0
new: 0.0
path: .spaces[0].metrics.cognitive.average
old: 5.0
new: null
path: .spaces[0].metrics.cognitive.sum
old: 5.0
new: 0.0
path: .spaces[0].metrics.nom.functions
old: 1.0
new: 0.0
path: .spaces[0].metrics.nom.total
old: 1.0
new: 0.0
Code
struct IconMetrics {
int32_t xMetric;
int32_t yMetric;
int32_t defaultSize;
};