From owner-dev-commits-src-all@freebsd.org  Sat Mar  6 10:24:26 2021
Return-Path: <owner-dev-commits-src-all@freebsd.org>
Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1])
 by mailman.nyi.freebsd.org (Postfix) with ESMTP id 8770B560A85;
 Sat,  6 Mar 2021 10:24:26 +0000 (UTC) (envelope-from git@FreeBSD.org)
Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org
 [IPv6:2610:1c1:1:606c::19:3])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256
 client-signature RSA-PSS (4096 bits) client-digest SHA256)
 (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK))
 by mx1.freebsd.org (Postfix) with ESMTPS id 4Dt11Q3Bpsz3RKm;
 Sat,  6 Mar 2021 10:24:26 +0000 (UTC) (envelope-from git@FreeBSD.org)
Received: from gitrepo.freebsd.org (gitrepo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:5])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (Client did not present a certificate)
 by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 55C5321E90;
 Sat,  6 Mar 2021 10:24:26 +0000 (UTC) (envelope-from git@FreeBSD.org)
Received: from gitrepo.freebsd.org ([127.0.1.44])
 by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 126AOQw6081237;
 Sat, 6 Mar 2021 10:24:26 GMT (envelope-from git@gitrepo.freebsd.org)
Received: (from git@localhost)
 by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 126AOQIX081236;
 Sat, 6 Mar 2021 10:24:26 GMT (envelope-from git)
Date: Sat, 6 Mar 2021 10:24:26 GMT
Message-Id: <202103061024.126AOQIX081236@gitrepo.freebsd.org>
To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org,
 dev-commits-src-main@FreeBSD.org
From: Toomas Soome <tsoome@FreeBSD.org>
Subject: git: d708f23ebb06 - main - loader: cursor off should restore display
 content
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Git-Committer: tsoome
X-Git-Repository: src
X-Git-Refname: refs/heads/main
X-Git-Reftype: branch
X-Git-Commit: d708f23ebb06cfc9cf8f96f17a43eb63653b818a
Auto-Submitted: auto-generated
X-BeenThere: dev-commits-src-all@freebsd.org
X-Mailman-Version: 2.1.34
Precedence: list
List-Id: Commit messages for all branches of the src repository
 <dev-commits-src-all.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/dev-commits-src-all>, 
 <mailto:dev-commits-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/dev-commits-src-all/>
List-Post: <mailto:dev-commits-src-all@freebsd.org>
List-Help: <mailto:dev-commits-src-all-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all>, 
 <mailto:dev-commits-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 06 Mar 2021 10:24:26 -0000

The branch main has been updated by tsoome:

URL: https://cgit.FreeBSD.org/src/commit/?id=d708f23ebb06cfc9cf8f96f17a43eb63653b818a

commit d708f23ebb06cfc9cf8f96f17a43eb63653b818a
Author:     Toomas Soome <tsoome@FreeBSD.org>
AuthorDate: 2021-03-06 10:19:43 +0000
Commit:     Toomas Soome <tsoome@FreeBSD.org>
CommitDate: 2021-03-06 10:23:54 +0000

    loader: cursor off should restore display content
    
    When drawing cursor, we should store original display
    content because there may be image data we would like to restore
    when the cursor is removed.
    
    PR:             254054
    Reported by:    Jose Luis Duran
    MFC after:      3 days
---
 stand/common/gfx_fb.c | 38 ++++++++++++++++++++++++++++++++++++++
 stand/common/gfx_fb.h |  2 ++
 2 files changed, 40 insertions(+)

diff --git a/stand/common/gfx_fb.c b/stand/common/gfx_fb.c
index 77cf1d39854f..3eae0a3a859e 100644
--- a/stand/common/gfx_fb.c
+++ b/stand/common/gfx_fb.c
@@ -978,6 +978,7 @@ gfx_fb_fill(void *arg, const teken_rect_t *r, teken_char_t c,
 static void
 gfx_fb_cursor_draw(teken_gfx_t *state, const teken_pos_t *p, bool on)
 {
+	unsigned x, y, width, height;
 	const uint8_t *glyph;
 	int idx;
 
@@ -985,10 +986,47 @@ gfx_fb_cursor_draw(teken_gfx_t *state, const teken_pos_t *p, bool on)
 	if (idx >= state->tg_tp.tp_col * state->tg_tp.tp_row)
 		return;
 
+	width = state->tg_font.vf_width;
+	height = state->tg_font.vf_height;
+	x = state->tg_origin.tp_col + p->tp_col * width;
+	y = state->tg_origin.tp_row + p->tp_row * height;
+
+	/*
+	 * Save original display content to preserve image data.
+	 */
+	if (on) {
+		if (state->tg_cursor_image == NULL ||
+		    state->tg_cursor_size != width * height * 4) {
+			free(state->tg_cursor_image);
+			state->tg_cursor_size = width * height * 4;
+			state->tg_cursor_image = malloc(state->tg_cursor_size);
+		}
+		if (state->tg_cursor_image != NULL) {
+			if (gfxfb_blt(state->tg_cursor_image,
+			    GfxFbBltVideoToBltBuffer, x, y, 0, 0,
+			    width, height, 0) != 0) {
+				free(state->tg_cursor_image);
+				state->tg_cursor_image = NULL;
+			}
+		}
+	} else {
+		/*
+		 * Restore display from tg_cursor_image.
+		 * If there is no image, restore char from screen_buffer.
+		 */
+		if (state->tg_cursor_image != NULL &&
+		    gfxfb_blt(state->tg_cursor_image, GfxFbBltBufferToVideo,
+		    0, 0, x, y, width, height, 0) == 0) {
+			state->tg_cursor = *p;
+			return;
+		}
+	}
+
 	glyph = font_lookup(&state->tg_font, screen_buffer[idx].c,
 	    &screen_buffer[idx].a);
 	gfx_bitblt_bitmap(state, glyph, &screen_buffer[idx].a, 0xff, on);
 	gfx_fb_printchar(state, p);
+
 	state->tg_cursor = *p;
 }
 
diff --git a/stand/common/gfx_fb.h b/stand/common/gfx_fb.h
index ac63d7939cef..89b060a02cf9 100644
--- a/stand/common/gfx_fb.h
+++ b/stand/common/gfx_fb.h
@@ -210,6 +210,8 @@ typedef struct teken_gfx {
 	teken_t		tg_teken;		/* Teken core */
 	teken_pos_t	tg_cursor;		/* Where cursor was drawn */
 	bool		tg_cursor_visible;
+	uint8_t		*tg_cursor_image;	/* Memory for cursor */
+	size_t		tg_cursor_size;
 	teken_pos_t	tg_tp;			/* Terminal dimensions */
 	teken_pos_t	tg_origin;		/* Point of origin in pixels */
 	uint8_t		*tg_glyph;		/* Memory for glyph */