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:
parent
a01eaea74b
commit
a2f075eb42
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user