| Deutsch English Français Italiano |
|
<d0fcbe9e7b29ce6f9a0604058475b0aa9a23d5cb.camel@gmail.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: wij <wyniijj5@gmail.com>
Newsgroups: comp.lang.c
Subject: Can 'graphics' be a file descriptor?
Date: Wed, 01 Jan 2025 15:48:32 +0800
Organization: A noiseless patient Spider
Lines: 206
Message-ID: <d0fcbe9e7b29ce6f9a0604058475b0aa9a23d5cb.camel@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Injection-Date: Wed, 01 Jan 2025 08:48:33 +0100 (CET)
Injection-Info: dont-email.me; posting-host="07e9084d35e98e2c9c23b4b63e81553f";
logging-data="2825580"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18KgTc9rHURl1U6KOdhCfV2"
User-Agent: Evolution 3.54.2 (3.54.2-1.fc41)
Cancel-Lock: sha1:YhzIHBRaljeF6JsmrVXmzufbw8o=
Bytes: 6278
In recent revision of libwy (a C++ library that wraps Clib functions), I fe=
el
the so called 'graphics' can be a file descriptor.
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D q_mand2.cpp
/* Copyright is licensed by GNU LGPL, see file COPYING. by I.J.Wang 2=
024
=20
Draw image of Mandelbrot set (can zoom-in, one thread, slower)
Build: make q_mand2
*/
#include <Wy.stdio.h>
#include <Wy.complex.h>
#include <CSCall/Face.h>
#include <CSCall/Array2D.h>
using namespace Wy;
//--------- Drawing --------
typedef Face::RGB32_Pixel Pixel;
constexpr Pixel White=3DFace::RGB32_White;
constexpr Pixel Black=3DFace::RGB32_Black;
const char GrSvr[]=3D"../face/face"; // see ../face/README
typedef long double MandFType;
constexpr int MaxItrNum=3D255;
// [Ret] Conversion table from itrnum to Pixel
Array<Pixel> itrnum_pixel() {
Array<Pixel> tab;
for(int n=3D0; n<=3DMaxItrNum; ++n) {
// transform $itrnum to approximate temperature color=20
Pixel pix(Black);
pix[2]=3D (n&7)<<5;
pix[1]=3D ((n>>3)&7)<<5;
pix[0]=3D ((n>>6)&3)<<6;
tab << pix;
}
return tab;
};
const Array<Pixel> ctab( itrnum_pixel() );
constexpr unsigned int Dim=3D800;
MandFType dist_pd=3D(4.0/(Dim-1)); // mand distance per dot distance
MandFType mand_lft=3D-3.0;
MandFType mand_top=3D2.0;
Array2D<Pixel> mand_img(Dim,Dim);
// [Syn] Draw Mand. image in line range [lbgn,lend)
//
void draw_mand(const Hdr2D<Pixel>& hdr, int lbgn, int lend) {
for(int y=3Dlbgn; y<lend; ++y) {
for(int x=3D0; x<static_cast<int>(hdr.width()); ++x) {
const Complex<MandFType> c( x*dist_pd +mand_lft, mand_top -y*dist_pd )=
;
const MandFType MaxValue=3D2.0*abs(c);
Complex<MandFType> z;
int itrnum;
for(itrnum=3D0; itrnum<MaxItrNum; ++itrnum) {
z=3D(z*z)+c;
if(abs(z)>MaxValue) {
break;
} =20
}; =20
hdr.write_point(x,y,ctab[itrnum]);
};
};
};
//--------------- Process mouse events
FifoFile frd,fwr;
class StrmRcvr : public Face::Receiver {
int m_px,m_py;
public:
StrmRcvr() : Face::Receiver() {};
StrmRcvr(RdBuf& strm) : Face::Receiver(strm) {};
Errno cb_headpkt(const char*) override { return Ok; };
Errno cb_MO(Wy::WeeStr mtype, int x, int y, unsigned int butt) override=
{
Errno r;
if(mtype=3D=3D"press") {
if(butt&Face::LeftButton) {
m_px=3Dx;
m_py=3Dy;
}
} else if(mtype=3D=3D"release") {
if(butt&Face::LeftButton) {
int dx,dy; // process the zoom-in box
if(x>=3Dm_px) {
dx=3Dx-m_px;
} else {
dx=3Dm_px;
m_px=3Dx;
x=3Ddx;
dx-=3Dm_px;
}
if(y>=3Dm_py) {
dy=3Dy-m_py;
} else {
dy=3Dm_py;
m_py=3Dy;
y=3Ddy;
dy-=3Dm_py;
}
if((dx<10)||(dy<10)) {
return Ok; // not to zoom-in
}
MandFType mand_rit=3D mand_lft+x*dist_pd;
MandFType mand_btm=3D mand_top-y*dist_pd;
mand_lft+=3D m_px*dist_pd;
mand_top-=3D m_py*dist_pd;
if(dx>=3Ddy) {
dist_pd=3D (mand_rit-mand_lft)/Dim;
} else {
dist_pd=3D (mand_top-mand_btm)/Dim;
}
if(dx>10) {
draw_mand(mand_img.header(),0,mand_img.height()-1);
if((r=3DFace::put_image(fwr, mand_img.header()))!=3DOk) {
WY_THROW(r);
}
}
}
} else {
}
return Ok;
};
Wy::Errno cb_error(Wy::Errno err, int id) override {
cerr << "q_mand2: " << Wy::wrd(err) << ", id=3D" << id << WY_ENDL;
return err;
};
};
int main(int argc, char *argv[]) try {
Errno r;
ProcessID cpid;
draw_mand(mand_img.header(),0,mand_img.height()-1);
if((r=3Dpopen(GrSvr,cpid,frd,fwr))!=3DOk) {
WY_THROW(r);
}
if((r=3DFace::put_image(fwr, mand_img._data(),Dim,Dim))!=3DOk) {
WY_THROW(r);
}
RdBuf strm(frd);
StrmRcvr rcvr(strm);
if((r=3Drcvr.pkt_dispatch())!=3DOk) {
WY_THROW(r);
}
WaitStat wstt;
if((r=3Dwaitpid(cpid,&wstt,0))!=3DOk) {
WY_THROW(r);
}
cout << "Child exit " << wstt.exit_status() << WY_ENDL;
cout << "OK" WY_ENDL;
return 0;
}
catch(const Errno& e) {
cerr << wrd(e) << WY_ENDL;
return -1; // e.c_errno();
}
catch(...) {
cerr << "main() caught(...)" WY_ENDL;
throw;
};
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D end of q_mand2.cp=
p
We open 'graphics' with a pathname GrSvr (whatever) and get a file descript=
or (fwr=20
and frd can be the same file descriptor if supported):
========== REMAINDER OF ARTICLE TRUNCATED ==========