void RfbClient::onMouseEvent(UINT16 x, UINT16 y, UINT8 buttonMask) { PixelFormat pfStub; Dimension fbDim; m_desktop->getFrameBufferProperties(&fbDim, &pfStub); Rect vp; bool shareApp; Region sharedRegion; getViewPortInfo(&fbDim, &vp, &shareApp, &sharedRegion); if (!shareApp) { sharedRegion.clear(); sharedRegion.addRect(&vp); } bool pointInside = sharedRegion.isPointInside(x + vp.left, y + vp.top); if (pointInside) { m_updateSender->blockCursorPosSending(); m_desktop->setMouseEvent(x + vp.left, y + vp.top, buttonMask); } }
bool GoverningDecider::update_policy(Region &curr_region, Policy &curr_policy) { bool is_updated = false; bool is_greater = false; bool is_less = false; if (curr_region.num_sample(0, GEOPM_SAMPLE_TYPE_RUNTIME) > m_num_sample) { const int num_domain = curr_policy.num_domain(); const uint64_t region_id = curr_region.identifier(); std::vector<double> limit(num_domain); std::vector<double> target(num_domain); curr_policy.target(GEOPM_REGION_ID_EPOCH, limit); curr_policy.target(region_id, target); for (int domain_idx = 0; domain_idx < num_domain; ++domain_idx) { double pkg_power = curr_region.derivative(domain_idx, GEOPM_TELEMETRY_TYPE_PKG_ENERGY); double dram_power = curr_region.derivative(domain_idx, GEOPM_TELEMETRY_TYPE_DRAM_ENERGY); double total_power = pkg_power + dram_power; is_greater = total_power > limit[domain_idx] * (1 + m_guard_band); is_less = total_power < limit[domain_idx] * (1 - m_guard_band); if (is_greater || is_less) { double overage = total_power - limit[domain_idx]; target[domain_idx] = limit[domain_idx] - (overage > dram_power ? overage : dram_power); is_updated = true; } } if (is_updated && curr_policy.is_converged(region_id)) { ++m_num_out_of_range; if (m_num_out_of_range < m_min_num_converged) { is_updated = false; } } if (is_updated && curr_policy.is_converged(region_id)) { curr_policy.update(region_id, target); if (is_greater) { auto it = m_num_converged.lower_bound(region_id); if (it != m_num_converged.end() && (*it).first == region_id) { (*it).second = 0; } else { it = m_num_converged.insert(it, std::pair<uint64_t, unsigned>(region_id, 0)); } curr_policy.is_converged(region_id, false); curr_region.clear(); m_num_sample = 0; m_num_out_of_range = 0; } } if (!is_updated || is_less) { if (curr_policy.is_converged(region_id)) { m_num_out_of_range = 0; } auto it = m_num_converged.lower_bound(region_id); if (it != m_num_converged.end() && (*it).first == region_id) { ++(*it).second; } else { it = m_num_converged.insert(it, std::pair<uint64_t, unsigned>(region_id, 1)); } if ((*it).second >= m_min_num_converged) { curr_policy.is_converged(region_id, true); } } } return is_updated; }
void ToolLoopManager::calculateDirtyArea(ToolLoop* loop, const Points& points, Region& dirty_area) { dirty_area.clear(); if (points.size() > 0) { Point minpt, maxpt; calculateMinMax(points, minpt, maxpt); // Expand the dirty-area with the pen width Rect r1, r2; loop->getPointShape()->getModifiedArea(loop, minpt.x, minpt.y, r1); loop->getPointShape()->getModifiedArea(loop, maxpt.x, maxpt.y, r2); dirty_area.createUnion(dirty_area, Region(r1.createUnion(r2))); } // Apply offset mode Point offset(loop->getOffset()); dirty_area.offset(-offset); // Apply tiled mode TiledMode tiledMode = loop->getDocumentSettings()->getTiledMode(); if (tiledMode != TILED_NONE) { int w = loop->sprite()->width(); int h = loop->sprite()->height(); Region sprite_area(Rect(0, 0, w, h)); Region outside; outside.createSubtraction(dirty_area, sprite_area); switch (tiledMode) { case TILED_X_AXIS: outside.createIntersection(outside, Region(Rect(-w*10000, 0, w*20000, h))); break; case TILED_Y_AXIS: outside.createIntersection(outside, Region(Rect(0, -h*10000, w, h*20000))); break; } Rect outsideBounds = outside.getBounds(); if (outsideBounds.x < 0) outside.offset(w * (1+((-outsideBounds.x) / w)), 0); if (outsideBounds.y < 0) outside.offset(0, h * (1+((-outsideBounds.y) / h))); int x1 = outside.getBounds().x; while (true) { Region in_sprite; in_sprite.createIntersection(outside, sprite_area); outside.createSubtraction(outside, in_sprite); dirty_area.createUnion(dirty_area, in_sprite); outsideBounds = outside.getBounds(); if (outsideBounds.isEmpty()) break; else if (outsideBounds.x+outsideBounds.w > w) outside.offset(-w, 0); else if (outsideBounds.y+outsideBounds.h > h) outside.offset(x1-outsideBounds.x, -h); else break; } } }
/******************* FUNCTION *********************/ TEST(Region, constructor) { Region region; region.clear(); EXPECT_TRUE(region.isEmpty()); }