1
0
mirror of https://github.com/azure-rtos/guix.git synced 2025-02-04 07:13:17 +08:00
guix/common/src/gx_display_driver_4bpp_mouse_capture.c
Bo Chen (from Dev Box) db360a10fa Update copyright.
2024-01-29 14:12:20 +08:00

193 lines
8.8 KiB
C

/***************************************************************************
* Copyright (c) 2024 Microsoft Corporation
*
* This program and the accompanying materials are made available under the
* terms of the MIT License which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** GUIX Component */
/** */
/** Dispaly Management (Dispaly) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_4bpp_mouse_capture PORTABLE C */
/* 6.1 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This service captures memory under mouse position. */
/* */
/* INPUT */
/* */
/* display Display control block */
/* */
/* OUTPUT */
/* */
/* CALLS */
/* */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
/* 09-30-2020 Kenneth Maxwell Modified comment(s), */
/* resulting in version 6.1 */
/* */
/**************************************************************************/
#if defined(GX_MOUSE_SUPPORT)
#if !defined(GX_HARDWARE_MOUSE_SUPPORT)
VOID _gx_display_driver_4bpp_mouse_capture(GX_DISPLAY *display)
{
INT width;
INT height;
INT row;
INT column;
GX_UBYTE *put;
GX_UBYTE *putrow;
GX_UBYTE *getrow;
GX_UBYTE *get;
GX_PIXELMAP *map;
GX_RESOURCE_ID image_id;
GX_RECTANGLE mouse_rect;
GX_UBYTE getmask;
GX_UBYTE putmask = 0xf0;
GX_UBYTE pixel;
GX_CANVAS *canvas;
if (display -> gx_display_mouse.gx_mouse_cursor_info)
{
if (display -> gx_display_mouse.gx_mouse_capture_memory)
{
canvas = display -> gx_display_mouse.gx_mouse_canvas;
image_id = display -> gx_display_mouse.gx_mouse_cursor_info -> gx_mouse_cursor_image_id;
if (image_id && image_id < display -> gx_display_pixelmap_table_size)
{
map = display -> gx_display_pixelmap_table[image_id];
mouse_rect.gx_rectangle_left = display -> gx_display_mouse.gx_mouse_position.gx_point_x;
mouse_rect.gx_rectangle_top = display -> gx_display_mouse.gx_mouse_position.gx_point_y;
mouse_rect.gx_rectangle_left = (GX_VALUE)(mouse_rect.gx_rectangle_left - display -> gx_display_mouse.gx_mouse_cursor_info -> gx_mouse_cursor_hotspot_x);
mouse_rect.gx_rectangle_top = (GX_VALUE)(mouse_rect.gx_rectangle_top - display -> gx_display_mouse.gx_mouse_cursor_info -> gx_mouse_cursor_hotspot_y);
mouse_rect.gx_rectangle_right = (GX_VALUE)(mouse_rect.gx_rectangle_left + map -> gx_pixelmap_width - 1);
mouse_rect.gx_rectangle_bottom = (GX_VALUE)(mouse_rect.gx_rectangle_top + map -> gx_pixelmap_height - 1);
if (mouse_rect.gx_rectangle_left < 0)
{
mouse_rect.gx_rectangle_left = 0;
}
if (mouse_rect.gx_rectangle_top < 0)
{
mouse_rect.gx_rectangle_top = 0;
}
if (mouse_rect.gx_rectangle_right >= canvas -> gx_canvas_x_resolution)
{
mouse_rect.gx_rectangle_right = (GX_VALUE)(canvas -> gx_canvas_x_resolution - 1);
}
if (mouse_rect.gx_rectangle_bottom >= canvas -> gx_canvas_y_resolution)
{
mouse_rect.gx_rectangle_bottom = (GX_VALUE)(canvas -> gx_canvas_y_resolution - 1);
}
width = mouse_rect.gx_rectangle_right - mouse_rect.gx_rectangle_left + 1;
height = mouse_rect.gx_rectangle_bottom - mouse_rect.gx_rectangle_top + 1;
}
else
{
width = height = 0;
}
if (width > 0 && height > 0)
{
display -> gx_display_mouse.gx_mouse_rect = mouse_rect;
getrow = (GX_UBYTE *)canvas -> gx_canvas_memory;
getrow += ((canvas -> gx_canvas_x_resolution + 1) >> 1) * mouse_rect.gx_rectangle_top;
getrow += mouse_rect.gx_rectangle_left >> 1;
putrow = (GX_UBYTE *)display -> gx_display_mouse.gx_mouse_capture_memory;
for (row = 0; row < height; row++)
{
if (mouse_rect.gx_rectangle_left & 1)
{
getmask = 0x0f;
}
else
{
getmask = 0xf0;
}
get = getrow;
put = putrow;
putmask = 0xf0;
for (column = 0; column < width; column++)
{
pixel = (*get) & getmask;
if (getmask == 0x0f)
{
get++;
getmask = 0xf0;
pixel |= (GX_UBYTE)(pixel << 4);
}
else
{
getmask = 0x0f;
pixel |= pixel >> 4;
}
*put &= (GX_UBYTE)(~putmask);
*put |= pixel & putmask;
putmask >>= 4;
if (putmask == 0)
{
putmask = 0xf0;
put++;
}
}
getrow += (canvas -> gx_canvas_x_resolution + 1) >> 1;
putrow += (width + 1) >> 1;
}
}
else
{
display -> gx_display_mouse.gx_mouse_rect.gx_rectangle_top = 0;
display -> gx_display_mouse.gx_mouse_rect.gx_rectangle_bottom = -1;
display -> gx_display_mouse.gx_mouse_rect.gx_rectangle_left = 0;
display -> gx_display_mouse.gx_mouse_rect.gx_rectangle_right = -1;
}
}
}
}
#endif
#endif