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
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: > > 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 > > Thanks, > --Michiel >
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
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 <ef...@ha...> wrote: > From: Eric Firing <ef...@ha...> > Subject: Re: [matplotlib-devel] graphics context: use alpha value from foreground color if present > To: mat...@li... > 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 10ドルK > 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 > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel >
On 08/26/2011 08:21 PM, Michiel de Hoon wrote: > 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 > > Thanks, > --Michiel > > --- On Fri, 8/26/11, Eric Firing<ef...@ha...> wrote: > >> From: Eric Firing<ef...@ha...> >> Subject: Re: [matplotlib-devel] graphics context: use alpha value from foreground color if present >> To: mat...@li... >> 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 10ドルK >> 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 >> Mat...@li... >> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel >> > > ------------------------------------------------------------------------------ > EMC VNX: the world's simplest storage, starting under 10ドルK > 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 > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel