Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use framebuffer pitch instead of width where necessary #161

Merged
merged 11 commits into from
Dec 2, 2024
Merged
6 changes: 6 additions & 0 deletions build/sync.sh
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ else
sudo modprobe nbd
[ ! -d $TMPMOUNT ] && mkdir $TMPMOUNT
case $1 in
flush)
mount_vdisk
sudo blockdev --flushbufs /dev/nbd0
sudo dosfsck -w -r -l -v -t /dev/nbd0
umount_vdisk
;;
diff)
mount_vdisk
diff -x *.MAP --color=always -r ../src/ $TMPMOUNT/ | less -R -p "diff -x.*|Only in.*"
Expand Down
2 changes: 1 addition & 1 deletion src/Demo/Graphics/32BitColor.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

I0 DrawPixel(I64 x, I64 y, CBGR24 color)
{
text.fb_alias[x + y * GR_WIDTH] = color;
text.fb_alias[x + y * sys_framebuffer_width] = color;
}

I0 Color32Demo()
Expand Down
10 changes: 5 additions & 5 deletions src/Demo/Graphics/32BitPaint.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@ U0 PaintGlobalsInit()

I0 DrawImagePixel(I64 x, I64 y, CBGR24 color)
{
paint.fb[x + y * GR_WIDTH] = color;
paint.fb[x + y * sys_framebuffer_width] = color;
}

I0 DrawScreenPixel(I64 x, I64 y, CBGR24 color)
{
text.fb_alias[x + y * GR_WIDTH] = color;
text.fb_alias[x + y * sys_framebuffer_width] = color;
}

I0 DrawScreenChar(I64 x, I64 y, I64 char)
Expand Down Expand Up @@ -136,7 +136,7 @@ U0 PaintLoadImage()

U32 PaintImagePeek(I64 x, I64 y)
{
return paint.fb[x + y * GR_WIDTH];
return paint.fb[x + y * sys_framebuffer_width];
}

I0 Paint32()
Expand Down Expand Up @@ -176,7 +176,7 @@ I0 Paint32()
// draw the image where the brush was last covering it
for (i = paint.last_x; i < paint.last_x + paint.last_thick; i++)
for (j = paint.last_y; j < paint.last_y + paint.last_thick; j++)
DrawScreenPixel(i, j, paint.fb[i + j * GR_WIDTH]);
DrawScreenPixel(i, j, paint.fb[i + j * sys_framebuffer_width]);

// draw the brush on the screen
DrawScreenBrush(mouse.pos.x, mouse.pos.y, paint.color, paint.thick);
Expand All @@ -193,7 +193,7 @@ I0 Paint32()
// draw the image where the color strings where covering it
for (i = 0; i < 3 * FONT_HEIGHT; i++)
for (j = 0; j < 12 * FONT_WIDTH; j++)
DrawScreenPixel(j, i, paint.fb[j + i * GR_WIDTH]);
DrawScreenPixel(j, i, paint.fb[j + i * sys_framebuffer_width]);

// draw the color strings on screen
DrawScreenStr(0, 0 * FONT_HEIGHT, str_r);
Expand Down
10 changes: 5 additions & 5 deletions src/Kernel/Display.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,17 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$().
{//Scroll screen down

MemCopy(text.fb_alias,
text.fb_alias + sys_framebuffer_width * FONT_HEIGHT,
(text.screen_size - sys_framebuffer_width * FONT_HEIGHT) * sizeof(U32));
text.fb_alias + sys_framebuffer_pidth * FONT_HEIGHT,
(text.screen_size - sys_framebuffer_pidth * FONT_HEIGHT) * sizeof(U32));

MemSetU32(text.fb_alias + text.screen_size - sys_framebuffer_width * FONT_HEIGHT, BLACK32, sys_framebuffer_width * FONT_HEIGHT);
MemSetU32(text.fb_alias + text.screen_size - sys_framebuffer_pidth * FONT_HEIGHT, BLACK32, sys_framebuffer_pidth * FONT_HEIGHT);
text.raw_col -= text.cols ;
row = text.rows - 1;
}
x = col * FONT_WIDTH;
y = row * FONT_HEIGHT;
ch_bitmap = text.font[ch & 0xFF];
framebuffer = text.fb_alias + sys_framebuffer_width * y + x;
framebuffer = text.fb_alias + sys_framebuffer_pidth * y + x;

PUSHFD
CLI
Expand All @@ -81,7 +81,7 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$().
else
*framebuffer++ = BLACK32;
if (i & (FONT_WIDTH - 1) == FONT_WIDTH - 1)
framebuffer += sys_framebuffer_width - FONT_WIDTH;
framebuffer += sys_framebuffer_pidth - FONT_WIDTH;
ch_bitmap >>= 1;
}
POPFD
Expand Down
2 changes: 1 addition & 1 deletion src/Kernel/KGlobals.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed
CDate local_time_offset;
F64 *pow10_I64,
sys_os_version = 2.03;
U64 sys_os_version_sub = 118;
U64 sys_os_version_sub = 119;
U8 *sys_os_version_str;
U8 *sys_os_version_full;
U8 *sys_os_version_nice;
Expand Down
3 changes: 2 additions & 1 deletion src/Kernel/KMain.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ U0 SysGrInit()
text.cols = sys_framebuffer_width / FONT_WIDTH;
text.rows = sys_framebuffer_height / FONT_HEIGHT;

text.screen_size = sys_framebuffer_width * sys_framebuffer_height;
sys_framebuffer_pidth = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8);
text.screen_size = sys_framebuffer_pidth * sys_framebuffer_height;
text.buffer_size = text.screen_size * 4; //buffer for 32-bit, but only 16 colors now.
text.raw_screen = CAlloc(text.buffer_size);
text.fb_alias = sys_framebuffer_addr;
Expand Down
2 changes: 1 addition & 1 deletion src/Kernel/KernelA.HH
Original file line number Diff line number Diff line change
Expand Up @@ -1272,7 +1272,7 @@ public class CDocBin
#assert !($$ & 7)
};

#define DOC_SCROLL_SPEED 8
#define DOC_SCROLL_SPEED 6

#define DOCSS_NORMAL 0
#define DOCSS_SINGLE_QUOTE 1
Expand Down
2 changes: 1 addition & 1 deletion src/Kernel/KernelB.HH
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ public _extern SYS_FRAMEBUFFER_WIDTH U64 sys_framebuffer_width;
public _extern SYS_FRAMEBUFFER_HEIGHT U64 sys_framebuffer_height;
public _extern SYS_FRAMEBUFFER_PITCH U64 sys_framebuffer_pitch;
public _extern SYS_FRAMEBUFFER_BPP U8 sys_framebuffer_bpp;

public U64 sys_framebuffer_pidth;
_extern SYS_FRAMEBUFFER_LIST CVideoInfo sys_framebuffer_list[VBE_MODES_NUM];

#help_index "Processor/SMBIOS"
Expand Down
3 changes: 2 additions & 1 deletion src/System/Gr/GrDC.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,8 @@ public CDC *DCNew(I64 width, I64 height, CTask *task=NULL, Bool null_bitmap=FALS
res->win_task = task;
res->mem_task = task;
res->width = width;
res->width_internal = (width + 7) & ~7;
// res->width_internal = (width + 7) & ~7;
res->width_internal = width & ~7;
res->height = height;
if (null_bitmap)
res->flags |= DCF_DONT_DRAW;
Expand Down
4 changes: 3 additions & 1 deletion src/System/Gr/GrGlobals.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public CBGR24 gr_palette[COLORS_NUM];
//See $LK,"SysGrInit",A="MN:SysGrInit"$()
//Allows consts to be used instead of variables.
HashPublic("GR_WIDTH", HTT_DEFINE_STR);;
DefinePrint("GR_WIDTH", "%d", sys_framebuffer_width);
DefinePrint("GR_WIDTH", "%d", sys_framebuffer_width & ~7);
HashPublic("GR_HEIGHT", HTT_DEFINE_STR);;
DefinePrint("GR_HEIGHT", "%d", sys_framebuffer_height);

Expand All @@ -56,3 +56,5 @@ DefinePrint("TEXT_ROWS", "%d", text.rows);;
HashPublic("TEXT_ROWS", HTT_DEFINE_STR);;
DefinePrint("TEXT_COLS", "%d", text.cols);;
HashPublic("TEXT_COLS", HTT_DEFINE_STR);;

sys_framebuffer_pidth = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8);
49 changes: 30 additions & 19 deletions src/System/Gr/GrScreen.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,8 @@ public U0 GrScaleZoom(F64 scale)
mouse.offset.x = mouse.pos.x - (mouse.pos.x - mouse.offset.x) * s;
mouse.offset.y = mouse.pos.y - (mouse.pos.y - mouse.offset.y) * s;
mouse.offset.z = mouse.pos.z - (mouse.pos.z - mouse.offset.z) * s;
gr.sx = mouse.pos.x - gr.zoomed_dc->width >> 1 / gr.screen_zoom;
gr.sy = mouse.pos.y - gr.zoomed_dc->height >> 1 / gr.screen_zoom;
gr.sx = mouse.pos.x - GR_WIDTH >> 1 / gr.screen_zoom;
gr.sy = mouse.pos.y - GR_HEIGHT >> 1 / gr.screen_zoom;
GrFixZoomScale;
}

Expand All @@ -154,7 +154,7 @@ U0 GrZoomInScreen()

GrFixZoomScale;

src = gr.dc2->body + gr.sx + gr.sy * gr.dc2->width_internal;
src = gr.dc2->body + gr.sx + gr.sy * GR_WIDTH;
dst = gr.zoomed_dc->body;

for (i = 0; i < GR_HEIGHT / gr.screen_zoom; i++)
Expand Down Expand Up @@ -359,42 +359,53 @@ U0 DCBlotColor8(CDC *dc, CDC *img)

U0 GrCalcScreenUpdates()
{
U16 *screen, *last_screen = gr.screen_cache;
U64 i, *src = text.raw_screen, *dst = text.fb_alias, diffs_size = GR_WIDTH * GR_HEIGHT / 2;
U8 *screen, reg RCX *last_screen = gr.screen_cache;
U32 *src = text.raw_screen, *dst = text.fb_alias;
U64 i, j, x, y, yi;

if (gr.screen_zoom == 1)
screen = gr.dc2->body;
else
screen = gr.zoomed_dc->body;

for (i = 0; i < diffs_size; i++)
for (y = yi = 0; y < GR_HEIGHT; yi = ++y * GR_WIDTH)
{
if (screen[i] != last_screen[i])
dst[i] = src[i];
for (x = 0; x < GR_WIDTH; x++)
{
i = x + yi;
j = x + y * sys_framebuffer_pidth;
if (screen[i] != last_screen[i])
{
dst = text.fb_alias + j;
src = text.raw_screen + j;
*dst = *src;
}
}
}
MemCopy(gr.screen_cache, screen, diffs_size * 2);
MemCopy(gr.screen_cache, screen, GR_WIDTH * GR_HEIGHT);
}

U0 GrUpdateScreen32()
{
U64 size, *dst;
U64 x, y, j, i;
U32 *dst;
U8 *src;

if (gr.screen_zoom == 1)
{
src = gr.dc2->body;
size = src + gr.dc2->height * gr.dc2->width_internal;
}
else
{
GrZoomInScreen;
src = gr.zoomed_dc->body;
size = src + gr.zoomed_dc->height * gr.zoomed_dc->width_internal;
}
dst = text.raw_screen;
while (src < size) //draw 2 pixels at a time
*dst++ = gr_palette[*src++ & 0xFF] | gr_palette[*src++ & 0xFF] << 32;

for (y = j = i = 0; y < GR_HEIGHT; j = ++y * sys_framebuffer_pidth, i = y * GR_WIDTH)
{
for (x = 0; x < GR_WIDTH; x++)
{
dst = text.raw_screen + x + j;
*dst = gr_palette[src[x + i] & 0xFF];
}
}

GrCalcScreenUpdates;

Expand All @@ -420,6 +431,6 @@ U0 GrUpdateScreen()
(*gr.fp_final_screen_update)(dc);
DCDel(dc);

DCBlotColor4(gr.dc1->body, gr.dc2->body, gr.dc_cache->body, gr.dc2->height * gr.dc2->width_internal >> 3);
DCBlotColor4(gr.dc1->body, gr.dc2->body, gr.dc_cache->body, GR_HEIGHT * GR_WIDTH >> 3);
GrUpdateScreen32;
}