Esempio n. 1
0
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);
  }
}
Esempio n. 2
0
    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;
    }
Esempio n. 3
0
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());
}