Add more alpha gradient test cases

* Add a vertical linear gradient. This bypasses AGG and uses a faster
code path, which works.
* Add gradients drawn in a ClipToPicture() context. This uses an
* unpacked scanline rasterizer, which works.

This hints to the problem being the use of a packed scanline rasterizer,
with agg gradients touching the alpha channel.
This commit is contained in:
Adrien Destugues
2014-07-24 12:01:50 +02:00
parent 5f22a181ec
commit a694f30d6c
+41 -3
View File
@@ -17,6 +17,7 @@
#include <LayoutBuilder.h>
#include <List.h>
#include <Message.h>
#include <Picture.h>
#include <PopUpMenu.h>
#include <Roster.h>
#include <ScrollView.h>
@@ -74,7 +75,7 @@ class AlphaGradientTest : public Test {
public:
AlphaGradientTest()
:
Test("Alpha gradient")
Test("Alpha gradients")
{
}
@@ -92,7 +93,7 @@ public:
g.AddColor((rgb_color){ 0, 255, 0, 0 }, 255.0);
view->FillEllipse(center, radius, radius, g);
// Linear gradient
// Linear gradient - Horizontal
BPoint from(100, 0);
BPoint to(200, 0);
BGradientLinear l(from, to);
@@ -100,6 +101,15 @@ public:
l.AddColor((rgb_color){ 0, 255, 0, 255 }, 255.0);
view->FillRect(BRect(100, 0, 200, 100), l);
// Linear gradient - Vertical
// (this uses a different code path in app_server)
BPoint top(0, 0);
BPoint bot(0, 100);
BGradientLinear v(top, bot);
v.AddColor((rgb_color){ 255, 0, 0, 0 }, 0.0);
v.AddColor((rgb_color){ 0, 255, 0, 255 }, 255.0);
view->FillRect(BRect(200, 0, 300, 100), v);
// These draw as opaque or almost opaque
view->SetOrigin(BPoint(0, 100));
@@ -110,11 +120,39 @@ public:
go.AddColor((rgb_color){ 0, 255, 0, 255 }, 255.0);
view->FillEllipse(center, radius, radius, go);
// Linear gradient
// Linear gradient - Horizontal
BGradientLinear lo(from, to);
lo.AddColor((rgb_color){ 255, 0, 0, 255 }, 0.0);
lo.AddColor((rgb_color){ 0, 255, 0, 0 }, 255.0);
view->FillRect(BRect(100, 0, 200, 100), lo);
// Linear gradient - Vertical
// (this uses a different code path in app_server)
BGradientLinear vo(top, bot);
vo.AddColor((rgb_color){ 255, 0, 0, 255 }, 0.0);
vo.AddColor((rgb_color){ 0, 255, 0, 0 }, 255.0);
view->FillRect(BRect(200, 0, 300, 100), vo);
// Finally, do the same using ClipToPicture. This forces using an
// unpacked scanline rasterizer, and it works.
view->SetOrigin(BPoint(0, 0));
view->SetDrawingMode(B_OP_COPY);
BPicture picture;
view->BeginPicture(&picture);
view->SetHighColor(make_color(0,0,0,255));
view->FillRect(BRect(0, 200, 300, 300));
view->EndPicture();
view->ClipToPicture(&picture);
view->SetOrigin(BPoint(0, 200));
view->SetDrawingMode(B_OP_ALPHA);
view->FillEllipse(center, radius, radius, g);
view->FillRect(BRect(100, 0, 200, 100), l);
view->FillRect(BRect(200, 0, 300, 100), v);
}
};