|
Joined: Feb 2014
Posts: 1,135 Likes: 198
Very Senior Member
|
Very Senior Member
Joined: Feb 2014
Posts: 1,135 Likes: 198 |
I wanted to be able to scale the bitmap so I could save a scaled version. This would be useful to double the pixels vertically so 120x72 would be 120x144 which would look more "square". So why not expose a copyrozbitmap function to lua so I could experiment/test with it?
void mycopyroz(bitmap_rgb32& dest, bitmap_rgb32& src, int srcx, int srcy, int destx, int desty, int width, int height, double scalex, double scaley) {
copyrozbitmap(dest, rectangle(destx,destx+width*scalex-1,desty,desty+height*scaley-1), src,
((srcx+0.01) * 1.0 - destx * (1.0/scalex) ) * 0x10000,
((srcy+0.01) * 1.0 - desty * (1.0/scaley) ) * 0x10000,
0x10000 * (1.0/scalex), 0, 0,
0x10000 * (1.0/scaley), false);
}
and then I can do stuff like:
lp0 = manager:machine().lp[1]
lp0:clearpage(0,0xffffff)
lp0:clearpage(-1,0x808080)
function drawx(x1,y1,size)
local y2 = y1+size-1 local x2 = x1+size-1
for i=0,size-1 do
lp0:drawpixel(x1+i,y1) lp0:drawpixel(x1+i,y2) lp0:drawpixel(x1,y1+i) lp0:drawpixel(x2,y1+i) lp0:drawpixel(x1+i,y1+i) lp0:drawpixel(x2-i,y1+i)
end
end
drawx(0,0,20)
lp0:savepagescale(0,2.0,4.0) -- save page 0 at magnification 2.0 horiz and 4.0 vertically
for i = 0,20 do lp0:mycopyroz(lp0.m_lp_bitmap,lp0.m_lp_bitmap,0,792,70+40*i,792,20,20,2,2) end
xpos = 0
for i = 1,10 do
mag = i size = 20 * mag lp0:mycopyroz(lp0.m_lp_bitmap,lp0.m_lp_bitmap,0,792+0,xpos,792-100,size/mag,size/mag,mag,mag)
xpos = xpos + size
end
lp0:setheadpos(0,20)
lp0:saveall()
![[Linked Image from i.imgur.com]](https://i.imgur.com/godnfWH.png)
|
|
|
|
Joined: Feb 2014
Posts: 1,135 Likes: 198
Very Senior Member
|
Very Senior Member
Joined: Feb 2014
Posts: 1,135 Likes: 198 |
![[Linked Image from i.imgur.com]](https://i.imgur.com/WpR0oA6.png) Experimenting with making a half-inch green bar paper background. or a non-0xffffff background: ![[Linked Image from i.imgur.com]](https://i.imgur.com/8jjqlfU.png)
|
|
|
|
Joined: Feb 2014
Posts: 1,135 Likes: 198
Very Senior Member
|
Very Senior Member
Joined: Feb 2014
Posts: 1,135 Likes: 198 |
And why not add the ability to draw lines into our bitmap too: ![[Linked Image from i.imgur.com]](https://i.imgur.com/PZrMrkE.png) Use a drawline routine from the hp9845 driver and make some changes: //void hp9845ct_base_state::draw_line(unsigned x0 , unsigned y0 , unsigned x1 , unsigned y1)
void drawline(int x0 , int y0 , int x1 , int y1, u32 pixelval)
{
int dx, dy, sx, sy, x, y, err, e2;
// draw line, vector generator uses Bresenham's algorithm
x = x0;
y = y0;
dx = abs((int) (x1 - x));
sx = x < x1 ? 1 : -1; // actually always 1 because of normalization
dy = abs((int) (y1 - y));
sy = y < y1 ? 1 : -1;
err = (dx > dy ? dx : -dy) / 2;
for(;;){
// plot(x, y, BIT(m_gv_line_type_mask, 15));
// update_line_pattern();
if (!((x<0) || (x >= m_lp_bitmap->width()) || (y<0) || (y >= m_lp_bitmap->height())))
m_lp_bitmap->pix32(y,x) = pixelval;
if (x == x1 && y == y1) break;
e2 = err;
if (e2 > -dx) {
err -= dy;
x += sx;
}
if (e2 < dy) {
err += dx;
y += sy;
}
}
}
and make some spokes:
function drawcirclespokes(cx,cy,size,step,color)
for i=0,360,step do
manager:machine().lp[1]:drawline(math.floor(cx),math.floor(cy),math.floor(cx+size*math.cos(i/360*2*math.pi)),math.floor(cy+size*math.sin(i/360*2*math.pi)),color)
manager:machine().lp[1]:drawline(math.floor(cx+size*math.cos(i/360*2*math.pi)),math.floor(cy+size*math.sin(i/360*2*math.pi)),
math.floor(cx+size*math.cos((i+step)/360*2*math.pi)),math.floor(cy+size*math.sin((i+step)/360*2*math.pi)),color)
end
end
drawcirclespokes(200,792,150,360/36,0)
drawcirclespokes(0,0,360,360/36,0)
drawcirclespokes(8.5*120,0,360,360/36,0)
drawcirclespokes(9.0*120,792,360,360/36,0)
|
|
|
|
Joined: Feb 2014
Posts: 1,135 Likes: 198
Very Senior Member
|
Very Senior Member
Joined: Feb 2014
Posts: 1,135 Likes: 198 |
Some more experiments: I made an array of bitmap_rgb32 and a readpngtobitmap routine and exposed them to lua:
bitmap_rgb32 bitmaparray[10];
bitmap_rgb32 * getbitmaparrayitem(int item) { return &(bitmaparray[item]); }
void bitmapalloc(bitmap_rgb32& bitmap, int width, int height){ bitmap.allocate(width,height); }
int readpngtobitmap(bitmap_rgb32& bitmap, std::string filename){
emu_file file("",OPEN_FLAG_READ);;
osd_file::error const filerr = file.open(filename);
if (filerr != osd_file::error::NONE)
{printf("no file!\n"); return 0;}
// read the PNG data
png_info png;
png_error const result = png.read_file(file);
file.close();
if (result != PNGERR_NONE)
{
osd_printf_error("%s: Error reading PNG file\n", filename);
return 0;
}
bool hasalpha=false;
png_error result2 = png.copy_to_bitmap( *((bitmap_argb32 * ) &bitmap), hasalpha);
if (PNGERR_NONE != result2)
{
osd_printf_error("%s: Error copying PNG bitmap to MAME bitmap\n", filename);
osd_printf_error("Error result = %d\n", result);
return false;
}
printf("bitmap size %d %d\n",bitmap.width(),bitmap.height());
return 1;
}
which allows me to load various bitmap fonts as pngs so I can use those fonts: Opening ubuntu's character map on Noto Mono 22: ![[Linked Image from i.imgur.com]](https://i.imgur.com/mbP8sLj.png) Taking a screencap and figuring out the grid size in Gimp: ![[Linked Image from i.imgur.com]](https://i.imgur.com/ZWyrGOv.png) and a test of what the font would look like (scaling the font to 66% to make it fit 80 columns wide): ![[Linked Image from i.imgur.com]](https://i.imgur.com/D4hvCg8.png)
manager:machine().lp[1]:readpngtobitmap(manager:machine().lp[1]:getbitmaparrayitem(4),"grid.png")
function drawstringscaleoffset(x,y,str,bitmap,xsize,ysize,rowsize,spacing,scale,offsetx,offsety,offsetsizex,offsetsizey,linegap,rtmar)
xpos = x ypos = y
for i=1,str:len() do c = str:byte(i) if c>=32 and c<=127 then cpos = c - 32 colpos = cpos % rowsize rowpos = math.floor(cpos/rowsize) lp0:mycopyroz(lp0.m_lp_bitmap, bitmap, math.floor(colpos*xsize+offsetx),math.floor(rowpos*ysize+offsety) , xpos,ypos+792, offsetsizex, offsetsizey, scale, scale)
xpos = xpos + spacing end if xpos > rtmar or c==10 then xpos = x ypos=ypos+offsetsizey+linegap end
end
end
drawstringscaleoffset(20,-792+100,zstring,lp0:getbitmaparrayitem(4),65.75,61,16,12,0.66,25,16,20,35,-14,120*8+20) and an experiment with a spectrum zx 8x8 font (from DamienG's ZX Origins webpage): (I couldn't figure out why the png wouldn't load and then I realized it was an 8-bit indexed png. After converting the file to rgb with gimp and exporting it worked fine.) ![[Linked Image from i.imgur.com]](https://i.imgur.com/qXRB5Qr.png)
|
|
|
|
Joined: Feb 2014
Posts: 1,135 Likes: 198
Very Senior Member
|
Very Senior Member
Joined: Feb 2014
Posts: 1,135 Likes: 198 |
One of the things I would do back in the day was to turn off and on the printer to clear the internal buffer, especially on a runaway print job, so how to do it on the Ap2000? You can reset the maincpu and that won't quite do it. You can also send an NMI interrupt, and that won't quite do it. After some experimentation, it seems that you have to do both. You have to reset the maincpu and then send an NMI interrupt a short while later (minimum 0.9 seconds later).
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Reset Printer") PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, epson_lx810l_device, reset_printer, 0)
INPUT_CHANGED_MEMBER(epson_lx810l_device::reset_printer)
{
if (newval)
{
m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); // reset cpu
m_e05a30->reset(); // this will generate an NMI interrupt when the e05a30 is ready (minimum 0.9 seconds after reset)
}
}
and then it's not too hard to hook up the centronics init signal to a routine that will pulse the reset line and reset the e05a30 too. I found a neat little DOS program that would allow init testing: Parallel Port Debug Tool Version 2.0 ![[Linked Image from i.imgur.com]](https://i.imgur.com/HCG81WL.png) ![[Linked Image from i.imgur.com]](https://i.imgur.com/iXgLaSJ.png)
|
|
|
1 members (1 invisible),
57
guests, and
2
robots. |
Key:
Admin,
Global Mod,
Mod
|
|
Forums9
Topics9,331
Posts122,197
Members5,077
|
Most Online1,283 Dec 21st, 2022
|
|
These forums are sponsored by Superior Solitaire, an ad-free card game collection for macOS and iOS. Download it today!
|
|
|
|