实现java.awt.Graphics类

时间:2017-01-15 04:56:47

标签: java graphics

我目前正在为液晶显示器编写一个库。我选择在Java中扩展#include<iostream> #include<fstream> #include<omp.h> using namespace std; class RW { string text,dsp,path; fstream f,r; public: RW(string p) { path=p; } public: void reader() { //cout<<"in reader\n"; { r.open(path.c_str(),ios::in); r>>dsp; cout<<dsp<<endl; r.close(); } } public: void writer() { f.open(path.c_str(),ios::out); cout<<"Enter text to be written: "; cin>>text; cout<<endl; f<<text; //cout<<"end -- write \n"; f.close(); } }; int main() { omp_lock_t lk; omp_init_lock(&lk); int flag[10]; RW rw("a.txt"); string dsp; int th_no,no_th; int wn,rn; cout<<"Enter no of writer threads: "; cin>>wn; cout<<"\nEnter no of reader threads: "; cin>>rn; for(int i=0;i<10;i++){flag[i]=0;} //omp_set_nested(1); for(int i=0;i<wn;i++) { cout<<i<<": loop"<<endl; #pragma omp parallel default(shared) private(th_no) num_threads(wn+rn) { th_no = omp_get_thread_num(); cout<<omp_get_thread_num()<<endl; #pragma omp barrier if(th_no<wn && flag[th_no]==0) { #pragma omp sections { #pragma omp section { cout<<"thread no: "<<omp_get_thread_num()<<endl; omp_set_lock(&lk); rw.writer(); flag[omp_get_thread_num()]=1; omp_unset_lock(&lk); } } } #pragma omp barrier if(omp_get_thread_num()>=wn) { omp_set_lock(&lk); cout<<"thread no:"<<omp_get_thread_num()<<endl; rw.reader(); omp_unset_lock(&lk); } #pragma omp barrier #pragma omp flush th_no=0; } } return 0; 类,以便用户可以更方便地绘制到LCD。

然而,编写/覆盖这些方法是非常精细的工作。我刚刚使用Bresenham的线算法成功实现了Graphics,并使用黑白填充了像素drawLine()。但它似乎几乎杀了我。

我已经使用Graphics类查看了original implementation: 嗯,这是抽象的。没有任何东西可以通过XD实现

Swing也没有希望。实现似乎与平台有关。

是否有任何使用Graphics类的资源,以便我可以查看实现?

或者这真的是一项愚蠢的工作?

3 个答案:

答案 0 :(得分:0)

您将在完整的OpenJDK Java源代码树中找到Graphics类的各种实现,这些实现可以从官方的openjdk站点获得。请查看Java 8 Source Code下载页面。

无论你怎么做,实现一个新的Graphics课程都会有很多工作要做。但我并不准备说这是一个&#34;愚蠢的&#34;要做的事。这取决于你为什么这样做;即努力是否会花费很多&#34;。只有你可以拨打电话。

答案 1 :(得分:0)

这是一项非常愚蠢的工作。

  • 已经完成。

  • 如果您逐个像素地工作,那么您的工作处于错误的水平。

  • 出于性能原因,这应该是通过硬件加速完成的,尽可能使用openGL。

  • 即使没有,也应该通过下拉到C并直接​​访问VRAM来完成,而不是在Java级别。将屏幕设置为黑色将成为对memset的1次调用。

答案 2 :(得分:0)

我会在Graphics类的实现中放置一个Image。并使用getGraphics()获取Graphics并将方法挂钩到它

public SampleGraphics extends Graphics2D{

    private final Graphics2D g2d;

    private final BufferedImage buffImg;

    public SampleGraphics(String someargs){
        //Perform things...
        buffImg = .....
        g2d = buffImg.getGraphics();
    }

    @Override
    public Graphics create(){
        return g2d.create();
    }

    //...each method identical to the Graphics2D g2d
}