bool LockPixels(MCRegionRef p_area, MCGRaster& r_raster) { if (m_bitmap == nil || m_locked) return false; MCRectangle t_bounds = MCRegionGetBoundingBox(m_region); MCRectangle t_actual_area; t_actual_area = MCU_intersect_rect(MCRegionGetBoundingBox(p_area), t_bounds); if (MCU_empty_rect(t_actual_area)) return false; /* UNCHECKED */ MCRegionIncludeRect(m_redraw_region, t_actual_area); uint8_t *t_bits = (uint8_t*)m_raster.pixels + (t_actual_area.y - t_bounds.y) * m_raster.stride + (t_actual_area.x - t_bounds.x) * sizeof(uint32_t); m_locked_area = t_actual_area; r_raster . format = kMCGRasterFormat_ARGB; r_raster . width = t_actual_area . width; r_raster . height = t_actual_area . height; r_raster . stride = m_raster.stride; r_raster . pixels = t_bits; m_locked = true; return true; }
bool MCRegionTransformCallback(void *p_context, const MCRectangle &p_rect) { MCRegionTransformContext *t_context; t_context = static_cast<MCRegionTransformContext*>(p_context); MCRectangle t_transformed_rect; t_transformed_rect = MCRectangleGetTransformedBounds(p_rect, t_context->transform); return MCRegionIncludeRect(t_context->region, t_transformed_rect); }
bool LockPixels(MCRegionRef p_area, MCGRaster &r_raster) { m_locked_bits = m_raster.pixels; m_locked_stride = m_raster.stride; m_locked_area = MCRegionGetBoundingBox(p_area); // restrict locked area to intersection with raster m_locked_area = MCU_intersect_rect(m_locked_area, MCU_make_rect(0, 0, m_raster.width, m_raster.height)); /* UNCHECKED */ MCRegionIncludeRect(m_redraw_region, m_locked_area); r_raster.width = m_locked_area.width; r_raster.height = m_locked_area.height; r_raster.pixels = (uint8_t *)m_locked_bits + m_locked_area . y * m_locked_stride + m_locked_area . x * sizeof(uint32_t); r_raster.stride = m_locked_stride; r_raster.format = m_raster.format; return true; }
// IM-2013-10-14: [[ FullscreenMode ]] Move update region tracking into view abstraction void MCStack::view_dirty_rect(const MCRectangle &p_rect) { MCRectangle t_visible_rect = MCRectangleGetTransformedBounds(view_getstackvisiblerect(), view_getviewtransform()); MCRectangle t_dirty_rect = MCU_intersect_rect(p_rect, t_visible_rect); if (t_dirty_rect.width == 0 || t_dirty_rect.height == 0) return; // If there is no region yet, make one. if (m_view_update_region == nil) /* UNCHECKED */ MCRegionCreate(m_view_update_region); MCRegionIncludeRect(m_view_update_region, t_dirty_rect); // Mark the stack as needing a redraw and schedule an update. m_view_need_redraw = true; MCRedrawScheduleUpdateForStack(this); }