app_server: Support alpha masks for text rendering...

... both vector and bitmap based. Sub-pixel text rendering not yet handled,
I think the scanline is used differently in this case, in that three times the
horizontal resolution is used, while the alpha map doesn't match this
increase.
This commit is contained in:
Stephan Aßmus
2014-01-28 22:35:36 +01:00
parent a01eaea74b
commit a2f075eb42
3 changed files with 39 additions and 20 deletions
@@ -33,7 +33,8 @@ AGGTextRenderer::AGGTextRenderer(renderer_subpix_type& subpixRenderer,
renderer_type& solidRenderer, renderer_bin_type& binRenderer,
scanline_unpacked_type& scanline,
scanline_unpacked_subpix_type& subpixScanline,
rasterizer_subpix_type& subpixRasterizer)
rasterizer_subpix_type& subpixRasterizer,
scanline_unpacked_masked_type*& maskedScanline)
:
fPathAdaptor(),
fGray8Adaptor(),
@@ -51,6 +52,8 @@ AGGTextRenderer::AGGTextRenderer(renderer_subpix_type& subpixRenderer,
fScanline(scanline),
fSubpixScanline(subpixScanline),
fSubpixRasterizer(subpixRasterizer),
fMaskedScanline(maskedScanline),
fRasterizer(),
fHinted(true),
@@ -150,7 +153,10 @@ public:
void Finish(double x, double y)
{
if (fVector) {
if (fSubpixelAntiAliased) {
if (fRenderer.fMaskedScanline != NULL) {
agg::render_scanlines(fRenderer.fRasterizer,
*fRenderer.fMaskedScanline, fRenderer.fSolidRenderer);
} else if (fSubpixelAntiAliased) {
agg::render_scanlines(fRenderer.fSubpixRasterizer,
fRenderer.fSubpixScanline, fRenderer.fSubpixRenderer);
} else {
@@ -234,11 +240,19 @@ public:
break;
case glyph_data_gray8:
agg::render_scanlines(fRenderer.fGray8Adaptor,
fRenderer.fGray8Scanline, fRenderer.fSolidRenderer);
if (fRenderer.fMaskedScanline != NULL) {
agg::render_scanlines(fRenderer.fGray8Adaptor,
*fRenderer.fMaskedScanline,
fRenderer.fSolidRenderer);
} else {
agg::render_scanlines(fRenderer.fGray8Adaptor,
fRenderer.fGray8Scanline,
fRenderer.fSolidRenderer);
}
break;
case glyph_data_subpix:
// TODO: Handle alpha mask (fRenderer.fMaskedScanline)
agg::render_scanlines(fRenderer.fGray8Adaptor,
fRenderer.fGray8Scanline,
fRenderer.fSubpixRenderer);
@@ -27,8 +27,11 @@ public:
renderer_type& solidRenderer,
renderer_bin_type& binRenderer,
scanline_unpacked_type& scanline,
scanline_unpacked_subpix_type& subpixScanline,
rasterizer_subpix_type& subpixRasterizer);
scanline_unpacked_subpix_type&
subpixScanline,
rasterizer_subpix_type& subpixRasterizer,
scanline_unpacked_masked_type*&
maskedScanline);
virtual ~AGGTextRenderer();
void SetFont(const ServerFont &font);
@@ -82,6 +85,8 @@ private:
scanline_unpacked_type& fScanline;
scanline_unpacked_subpix_type& fSubpixScanline;
rasterizer_subpix_type& fSubpixRasterizer;
scanline_unpacked_masked_type*& fMaskedScanline;
rasterizer_type fRasterizer;
// NOTE: the object has it's own rasterizer object
// since it might be using a different gamma setting
+14 -14
View File
@@ -201,7 +201,7 @@ Painter::Painter()
fPatternHandler(),
fTextRenderer(fSubpixRenderer, fRenderer, fRendererBin, fUnpackedScanline,
fSubpixUnpackedScanline, fSubpixRasterizer)
fSubpixUnpackedScanline, fSubpixRasterizer, fMaskedUnpackedScanline)
{
fPixelFormat.SetDrawingMode(fDrawingMode, fAlphaSrcMode, fAlphaFncMode,
false);
@@ -2910,18 +2910,18 @@ Painter::_StrokePath(VertexSource& path) const
stroke.line_join(agg_line_join_mode_for(fLineJoinMode));
stroke.miter_limit(fMiterLimit);
if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset();
fSubpixRasterizer.add_path(stroke);
agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer);
} else if(fMaskedUnpackedScanline != NULL) {
if (fMaskedUnpackedScanline != NULL) {
// TODO: we can't do both alpha-masking and subpixel AA.
fRasterizer.reset();
fRasterizer.add_path(path);
agg::render_scanlines(fRasterizer, *fMaskedUnpackedScanline,
fRenderer);
} else if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset();
fSubpixRasterizer.add_path(stroke);
agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer);
} else {
fRasterizer.reset();
fRasterizer.add_path(stroke);
@@ -2942,17 +2942,17 @@ template<class VertexSource>
BRect
Painter::_FillPath(VertexSource& path) const
{
if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset();
fSubpixRasterizer.add_path(path);
agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer);
} else if(fMaskedUnpackedScanline != NULL) {
if (fMaskedUnpackedScanline != NULL) {
// TODO: we can't do both alpha-masking and subpixel AA.
fRasterizer.reset();
fRasterizer.add_path(path);
agg::render_scanlines(fRasterizer, *fMaskedUnpackedScanline,
fRenderer);
} else if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset();
fSubpixRasterizer.add_path(path);
agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer);
} else {
fRasterizer.reset();
fRasterizer.add_path(path);