Ola gostaria de saber em que classe encontro a implementação do drawLine pois no src do java que eu tenho instalado so tem a classe abstrata com a assinatura do drawLine… e preciso do algoritimo usado por ele… desde o que coloca pixel a pixel ate o que faz o traçado aonde encontro esta implementação?
A rigor, o drawLine é implementado (se a linha vai ser desenhada no vídeo ou na impressora) principalmente pelo driver do sistema operacional. Entretanto, pode haver implementações de java.awt.Graphics2D em memória, e nesse caso o drawLine é implementado em:
java\awt\Graphics.java: public abstract void drawLine(int x1, int y1, int x2, int y2);
javax\swing\DebugGraphics.java: public void drawLine(int x1, int y1, int x2, int y2) {
javax\swing\plaf\synth\SynthGraphicsUtils.java: public void drawLine(SynthContext context, Object paintKey,
javax\swing\plaf\synth\SynthGraphicsUtils.java: public void drawLine(SynthContext context, Object paintKey,
javax\swing\SystemEventQueueUtilities.java: public void drawLine(int x1, int y1, int x2, int y2) {}
sun\java2d\loops\GeneralRenderer.java: public void drawLine(int x0, int y0, int x1, int y1) {
sun\java2d\loops\ProcessPath.java: public abstract void drawLine(int x0, int y0, int x1, int y1);
sun\java2d\loops\RenderLoops.java: public DrawLine drawLineLoop;
sun\java2d\opengl\OGLRenderer.java: public void drawLine(SunGraphics2D sg2d,
sun\java2d\pipe\BufferedRenderPipe.java: public void drawLine(SunGraphics2D sg2d,
sun\java2d\pipe\BufferedRenderPipe.java: public void drawLine(int x1, int y1, int x2, int y2) {
sun\java2d\pipe\LoopPipe.java: public void drawLine(SunGraphics2D sg2d,
sun\java2d\pipe\NullPipe.java: public void drawLine(SunGraphics2D sg,
sun\java2d\pipe\PixelDrawPipe.java: public void drawLine(SunGraphics2D sg,
sun\java2d\pipe\PixelToParallelogramConverter.java: public void drawLine(SunGraphics2D sg2d,
sun\java2d\pipe\PixelToShapeConverter.java: public void drawLine(SunGraphics2D sg,
sun\java2d\pipe\ValidatePipe.java: public void drawLine(SunGraphics2D sg,
sun\java2d\SunGraphics2D.java: public void drawLine(int x1, int y1, int x2, int y2) {
sun\print\PathGraphics.java: public void drawLine(int x1, int y1, int x2, int y2) {
sun\print\PeekGraphics.java: public void drawLine(int x1, int y1, int x2, int y2) {
sun\print\ProxyGraphics.java: public void drawLine(int x1, int y1, int x2, int y2) {
sun\print\ProxyGraphics2D.java: public void drawLine(int x1, int y1, int x2, int y2) {
(Para obter essa lista, baixei o fonte completo do JDK, que pode ser baixado no mesmo lugar onde você baixa o JDK instalável, e fui até o diretório src\j2se\src\share\classes. Aí procurei tudo que fosse ‘public drawLine’.
Veja qual desses arquivos contém a implementação do desenho de linhas que faz tudo em memória; alguns desses “drawLines” que você vê aí simplesmente chamam código nativo (APIs do sistema operacional).
ta mas qual dessas inumeras classes implementam o simples algoritimo de traçado de retas na tela?
Cara, é questão de você procurar. Baixe os fontes do JDK em:
http://download.java.net/jdk6/source/
O arquivo, atualmente, deve ser este aqui:
http://www.java.net/download/jdk6/6u18/promoted/b03/jdk-6u18-ea-src-b03-jrl-07_oct_2009.jar
Esse “jar” deve ser executado com “java -jar jdk-6u18-ea-src-b03-jrl-07_oct_2009.jar” para você poder extrair os fontes.
De qualquer maneira, provavelmente é uma implementação do famoso algoritmo de Bresenham, que você deve ter visto na faculdade. Talvez haja alguma alteração no Bresenham para ser mais rápido ou então para implementar aqueles detalhezinhos como extremidades arredondadas das linhas.
Eu dei uma procurada na classe graphics e Graphics2D e vi que as duas são abstratas e não implementam esse método.
Agora fiquei curioso onde está a implementação que é retornada pelo paintComponent de Components
[quote=Mark_Ameba]Eu dei uma procurada na classe graphics e Graphics2D e vi que as duas são abstratas e não implementam esse método.
Agora fiquei curioso onde está a implementação que é retornada pelo paintComponent de Components[/quote]
Não e so estas 2… tem um monte abstrata… este metodo tem em uma porrada de classes e a grande maioria e abstrato e não tem a implementação… ainda não achei a maledeta implementação dele…
A implementação do drawLine, por incrível que pareça, é “dependente de plataforma”. Uma vez fui atrás disso e vi que ele mapeava para uma chamada no OpenGL.