graphics context: use alpha value from foreground color if present

Dear all,

I am currently modifying the MacOSX backend to make its interactive/non-interactive behavior consistent with the other backends in matplotlib.
When I was testing the backend, I found a new bug that seems to be related to a recent change in backend_bases.py:

https://github.com/matplotlib/matplotlib/commit/4c078ddf68cc0ecc1a5f36009a3e3a8b4921b037#lib/matplotlib/backend_bases.py

After this commit, GraphicsContextBase.set_alpha has no effect if alpha==None; previously it would set alpha to 1.0.

The bug appears here in Text.draw in text.py:

        gc = renderer.new_gc()
        gc.set_foreground(self.get_color())
        gc.set_alpha(self.get_alpha())

In this code, self is a Text object, which derives from the Artist class, which initializes its _alpha member to None. So self.get_alpha() returns None, and gc.set_alpha has no effect. The alpha value used then depends on whatever was present in the gc before the call to new_gc, which is backend-dependent; the MacOSX and cairo backends end up with an incorrect alpha value.

I guess the easiest solution is to initialize _alpha in the Artist class to 1.0 instead of to None.

Thanks,
--Michiel

Dear all,

I am currently modifying the MacOSX backend to make its interactive/non-interactive behavior consistent with the other backends in matplotlib.
When I was testing the backend, I found a new bug that seems to be related to a recent change in backend_bases.py:

https://github.com/matplotlib/matplotlib/commit/4c078ddf68cc0ecc1a5f36009a3e3a8b4921b037#lib/matplotlib/backend_bases.py

After this commit, GraphicsContextBase.set_alpha has no effect if alpha==None; previously it would set alpha to 1.0.

The bug appears here in Text.draw in text.py:

         gc = renderer.new_gc()
         gc.set_foreground(self.get_color())
         gc.set_alpha(self.get_alpha())

In this code, self is a Text object, which derives from the Artist class, which initializes its _alpha member to None. So self.get_alpha() returns None, and gc.set_alpha has no effect. The alpha value used then depends on whatever was present in the gc before the call to new_gc, which is backend-dependent; the MacOSX and cairo backends end up with an incorrect alpha value.

I guess the easiest solution is to initialize _alpha in the Artist class to 1.0 instead of to None.

No, I think this will foul up all sorts of thing. I will take a look at this today or tomorrow at the latest.

Eric

···

On 08/26/2011 06:23 AM, Michiel de Hoon wrote:

Thanks,
--Michiel

Dear all,

I am currently modifying the MacOSX backend to make its interactive/non-interactive behavior consistent with the other backends in matplotlib.
When I was testing the backend, I found a new bug that seems to be related to a recent change in backend_bases.py:

Michiel,

Thank you for doing this work on the MacOSX backend; sorry to have introduced a bug that you stumbled over.

https://github.com/matplotlib/matplotlib/commit/4c078ddf68cc0ecc1a5f36009a3e3a8b4921b037#lib/matplotlib/backend_bases.py

After this commit, GraphicsContextBase.set_alpha has no effect if alpha==None; previously it would set alpha to 1.0.

The bug appears here in Text.draw in text.py:

         gc = renderer.new_gc()
         gc.set_foreground(self.get_color())
         gc.set_alpha(self.get_alpha())

In this code, self is a Text object, which derives from the Artist class, which initializes its _alpha member to None. So self.get_alpha() returns None, and gc.set_alpha has no effect. The alpha value used then depends on whatever was present in the gc before the call to new_gc, which is backend-dependent; the MacOSX and cairo backends end up with an incorrect alpha value.

I guess the easiest solution is to initialize _alpha in the Artist class to 1.0 instead of to None.

See https://github.com/matplotlib/matplotlib/pull/437

The problem was occurring because the macosx and cairo backends were recycling their graphics context objects instead of making new instances, so they were not getting initialized. I made a local fix by initializing the _alpha attributes; it may be that other initialization is actually needed as well, and that the GraphicsContextBase.__init__ method should be called, but I have not looked into that. The small fix solves the immediate problem.

In addition, I realized that a small change in GraphicsContextBase was needed to properly support backends that have their own set_alpha and set_foreground methods in their gc class.

Eric

···

On 08/26/2011 06:23 AM, Michiel de Hoon wrote:

Thanks,
--Michiel

Thanks! That solves the problem for me.
Once these changes have made it into trunk, I can commit my changes to the MacOSX backend.

Thanks,
--Michiel

···

--- On Fri, 8/26/11, Eric Firing <efiring@...229...> wrote:

From: Eric Firing <efiring@...229...>
Subject: Re: [matplotlib-devel] graphics context: use alpha value from foreground color if present
To: matplotlib-devel@lists.sourceforge.net
Date: Friday, August 26, 2011, 10:20 PM
On 08/26/2011 06:23 AM, Michiel de > Hoon wrote:
> Dear all,
>
> I am currently modifying the MacOSX backend to make
its interactive/non-interactive behavior consistent with the
other backends in matplotlib.
> When I was testing the backend, I found a new bug that
seems to be related to a recent change in backend_bases.py:

Michiel,

Thank you for doing this work on the MacOSX backend; sorry
to have
introduced a bug that you stumbled over.

>
> https://github.com/matplotlib/matplotlib/commit/4c078ddf68cc0ecc1a5f36009a3e3a8b4921b037#lib/matplotlib/backend_bases.py
>
> After this commit, GraphicsContextBase.set_alpha has
no effect if alpha==None; previously it would set alpha to
1.0.
>
> The bug appears here in Text.draw in text.py:
>
> gc =
renderer.new_gc()
>
gc.set_foreground(self.get_color())
>
gc.set_alpha(self.get_alpha())
>
> In this code, self is a Text object, which derives
from the Artist class, which initializes its _alpha member
to None. So self.get_alpha() returns None, and gc.set_alpha
has no effect. The alpha value used then depends on whatever
was present in the gc before the call to new_gc, which is
backend-dependent; the MacOSX and cairo backends end up with
an incorrect alpha value.
>
> I guess the easiest solution is to initialize _alpha
in the Artist class to 1.0 instead of to None.

See https://github.com/matplotlib/matplotlib/pull/437

The problem was occurring because the macosx and cairo
backends were
recycling their graphics context objects instead of making
new
instances, so they were not getting initialized. I
made a local fix by
initializing the _alpha attributes; it may be that other
initialization
is actually needed as well, and that the
GraphicsContextBase.__init__
method should be called, but I have not looked into
that. The small fix
solves the immediate problem.

In addition, I realized that a small change in
GraphicsContextBase was
needed to properly support backends that have their own
set_alpha and
set_foreground methods in their gc class.

Eric

>
> Thanks,
> --Michiel

------------------------------------------------------------------------------
EMC VNX: the world's simplest storage, starting under $10K
The only unified storage solution that offers unified
management
Up to 160% more powerful than alternatives and 25% more
efficient.
Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Thanks! That solves the problem for me.
Once these changes have made it into trunk, I can commit my changes to the MacOSX backend.

Done--I hit the merge button.

Eric

···

On 08/26/2011 08:21 PM, Michiel de Hoon wrote:

Thanks,
--Michiel

--- On Fri, 8/26/11, Eric Firing<efiring@...229...> wrote:

From: Eric Firing<efiring@...229...>
Subject: Re: [matplotlib-devel] graphics context: use alpha value from foreground color if present
To: matplotlib-devel@lists.sourceforge.net
Date: Friday, August 26, 2011, 10:20 PM
On 08/26/2011 06:23 AM, Michiel de >> Hoon wrote:

Dear all,

I am currently modifying the MacOSX backend to make

its interactive/non-interactive behavior consistent with the
other backends in matplotlib.

When I was testing the backend, I found a new bug that

seems to be related to a recent change in backend_bases.py:

Michiel,

Thank you for doing this work on the MacOSX backend; sorry
to have
introduced a bug that you stumbled over.

https://github.com/matplotlib/matplotlib/commit/4c078ddf68cc0ecc1a5f36009a3e3a8b4921b037#lib/matplotlib/backend_bases.py

After this commit, GraphicsContextBase.set_alpha has

no effect if alpha==None; previously it would set alpha to
1.0.

The bug appears here in Text.draw in text.py:

           gc =

renderer.new_gc()

gc.set_foreground(self.get_color())

gc.set_alpha(self.get_alpha())

In this code, self is a Text object, which derives

from the Artist class, which initializes its _alpha member
to None. So self.get_alpha() returns None, and gc.set_alpha
has no effect. The alpha value used then depends on whatever
was present in the gc before the call to new_gc, which is
backend-dependent; the MacOSX and cairo backends end up with
an incorrect alpha value.

I guess the easiest solution is to initialize _alpha

in the Artist class to 1.0 instead of to None.

See https://github.com/matplotlib/matplotlib/pull/437

The problem was occurring because the macosx and cairo
backends were
recycling their graphics context objects instead of making
new
instances, so they were not getting initialized. I
made a local fix by
initializing the _alpha attributes; it may be that other
initialization
is actually needed as well, and that the
GraphicsContextBase.__init__
method should be called, but I have not looked into
that. The small fix
solves the immediate problem.

In addition, I realized that a small change in
GraphicsContextBase was
needed to properly support backends that have their own
set_alpha and
set_foreground methods in their gc class.

Eric

Thanks,
--Michiel

------------------------------------------------------------------------------
EMC VNX: the world's simplest storage, starting under $10K
The only unified storage solution that offers unified
management
Up to 160% more powerful than alternatives and 25% more
efficient.
Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

------------------------------------------------------------------------------
EMC VNX: the world's simplest storage, starting under $10K
The only unified storage solution that offers unified management
Up to 160% more powerful than alternatives and 25% more efficient.
Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel