18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci *  linux/drivers/video/mfb.c -- Low level frame buffer operations for
38c2ecf20Sopenharmony_ci *				 monochrome
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *	Created 5 Apr 1997 by Geert Uytterhoeven
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci *  This file is subject to the terms and conditions of the GNU General Public
88c2ecf20Sopenharmony_ci *  License.  See the file COPYING in the main directory of this archive for
98c2ecf20Sopenharmony_ci *  more details.
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/string.h>
138c2ecf20Sopenharmony_ci#include <linux/fb.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include "atafb.h"
168c2ecf20Sopenharmony_ci#include "atafb_utils.h"
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci    /*
208c2ecf20Sopenharmony_ci     *  Monochrome
218c2ecf20Sopenharmony_ci     */
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_civoid atafb_mfb_copyarea(struct fb_info *info, u_long next_line,
248c2ecf20Sopenharmony_ci			int sy, int sx, int dy, int dx,
258c2ecf20Sopenharmony_ci			int height, int width)
268c2ecf20Sopenharmony_ci{
278c2ecf20Sopenharmony_ci	u8 *src, *dest;
288c2ecf20Sopenharmony_ci	u_int rows;
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	if (sx == 0 && dx == 0 && width == next_line) {
318c2ecf20Sopenharmony_ci		src = (u8 *)info->screen_base + sy * (width >> 3);
328c2ecf20Sopenharmony_ci		dest = (u8 *)info->screen_base + dy * (width >> 3);
338c2ecf20Sopenharmony_ci		fb_memmove(dest, src, height * (width >> 3));
348c2ecf20Sopenharmony_ci	} else if (dy <= sy) {
358c2ecf20Sopenharmony_ci		src = (u8 *)info->screen_base + sy * next_line + (sx >> 3);
368c2ecf20Sopenharmony_ci		dest = (u8 *)info->screen_base + dy * next_line + (dx >> 3);
378c2ecf20Sopenharmony_ci		for (rows = height; rows--;) {
388c2ecf20Sopenharmony_ci			fb_memmove(dest, src, width >> 3);
398c2ecf20Sopenharmony_ci			src += next_line;
408c2ecf20Sopenharmony_ci			dest += next_line;
418c2ecf20Sopenharmony_ci		}
428c2ecf20Sopenharmony_ci	} else {
438c2ecf20Sopenharmony_ci		src = (u8 *)info->screen_base + (sy + height - 1) * next_line + (sx >> 3);
448c2ecf20Sopenharmony_ci		dest = (u8 *)info->screen_base + (dy + height - 1) * next_line + (dx >> 3);
458c2ecf20Sopenharmony_ci		for (rows = height; rows--;) {
468c2ecf20Sopenharmony_ci			fb_memmove(dest, src, width >> 3);
478c2ecf20Sopenharmony_ci			src -= next_line;
488c2ecf20Sopenharmony_ci			dest -= next_line;
498c2ecf20Sopenharmony_ci		}
508c2ecf20Sopenharmony_ci	}
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_civoid atafb_mfb_fillrect(struct fb_info *info, u_long next_line, u32 color,
548c2ecf20Sopenharmony_ci			int sy, int sx, int height, int width)
558c2ecf20Sopenharmony_ci{
568c2ecf20Sopenharmony_ci	u8 *dest;
578c2ecf20Sopenharmony_ci	u_int rows;
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	dest = (u8 *)info->screen_base + sy * next_line + (sx >> 3);
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	if (sx == 0 && width == next_line) {
628c2ecf20Sopenharmony_ci		if (color)
638c2ecf20Sopenharmony_ci			fb_memset255(dest, height * (width >> 3));
648c2ecf20Sopenharmony_ci		else
658c2ecf20Sopenharmony_ci			fb_memclear(dest, height * (width >> 3));
668c2ecf20Sopenharmony_ci	} else {
678c2ecf20Sopenharmony_ci		for (rows = height; rows--; dest += next_line) {
688c2ecf20Sopenharmony_ci			if (color)
698c2ecf20Sopenharmony_ci				fb_memset255(dest, width >> 3);
708c2ecf20Sopenharmony_ci			else
718c2ecf20Sopenharmony_ci				fb_memclear_small(dest, width >> 3);
728c2ecf20Sopenharmony_ci		}
738c2ecf20Sopenharmony_ci	}
748c2ecf20Sopenharmony_ci}
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_civoid atafb_mfb_linefill(struct fb_info *info, u_long next_line,
778c2ecf20Sopenharmony_ci			int dy, int dx, u32 width,
788c2ecf20Sopenharmony_ci			const u8 *data, u32 bgcolor, u32 fgcolor)
798c2ecf20Sopenharmony_ci{
808c2ecf20Sopenharmony_ci	u8 *dest;
818c2ecf20Sopenharmony_ci	u_int rows;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	dest = (u8 *)info->screen_base + dy * next_line + (dx >> 3);
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci	for (rows = width / 8; rows--; /* check margins */ ) {
868c2ecf20Sopenharmony_ci		// use fast_memmove or fb_memmove
878c2ecf20Sopenharmony_ci		*dest++ = *data++;
888c2ecf20Sopenharmony_ci	}
898c2ecf20Sopenharmony_ci}
90