diff --git a/DesktopEditor/graphics/Graphics.cpp b/DesktopEditor/graphics/Graphics.cpp index 41eeaa238a..a5dbcbb860 100644 --- a/DesktopEditor/graphics/Graphics.cpp +++ b/DesktopEditor/graphics/Graphics.cpp @@ -888,9 +888,9 @@ namespace Aggplus trans_type* ptrans = NULL; agg::trans_affine* paffine = NULL; - if (!m_bIntegerGrid) + if (!m_bIntegerGrid) ptrans = new trans_type(p2, m_oFullTransform.m_internal->m_agg_mtx); - else + else { paffine = new agg::trans_affine(); ptrans = new trans_type(p2, *paffine); @@ -1223,6 +1223,22 @@ namespace Aggplus } } + template + void CGraphics::render_scanlines_alpha(Renderer& ren, BYTE Alpha) + { + double dAlpha = m_dGlobalAlpha * Alpha / 255.0; + if (fabs(dAlpha - 1.0) < FLT_EPSILON) + { + render_scanlines(ren); + } + else + { + m_rasterizer.gamma_multi(dAlpha); + render_scanlines(ren); + m_rasterizer.gamma(1.0); + } + } + template void CGraphics::render_scanlines(Rasterizer& ras, Renderer& ren) { @@ -1560,108 +1576,108 @@ namespace Aggplus void CGraphics::DoFillPathTextureClampSz2(const CMatrix &mImgMtx, const void *pImgBuff, DWORD dwImgWidth, DWORD dwImgHeight, int nImgStride, BYTE Alpha) { + span_alloc_type span_allocator; + agg::trans_affine mtx_Work(mImgMtx.m_internal->m_agg_mtx); + mtx_Work.invert(); + interpolator_type_linear interpolator(mtx_Work); + + agg::rendering_buffer PatRendBuff; + + if (nImgStride < 0) + { + BYTE* pBuffer = (BYTE*)pImgBuff + (dwImgHeight - 1) * nImgStride; + PatRendBuff.attach(pBuffer, dwImgWidth, dwImgHeight, nImgStride); + } + else + { + PatRendBuff.attach((BYTE*)pImgBuff, dwImgWidth, dwImgHeight, nImgStride); + } + + int nCurrentMode = 0; if (!m_bSwapRGB) { - span_alloc_type span_allocator; // Span Allocator - typedef agg::pixfmt_bgra32 pixfmt; typedef agg::image_accessor_clip img_source_type; - typedef agg::span_image_filter_rgba_nn span_gen_type; - typedef agg::renderer_scanline_aa renderer_type; - //double dScaleX = 270.0 / dwImgWidth; - //double dScaleY = 190.0 / dwImgHeight; + pixfmt img_pixf(PatRendBuff); + img_source_type img_src(img_pixf, agg::rgba(0, 0, 0, 0)); - agg::trans_affine mtx_Work(mImgMtx.m_internal->m_agg_mtx); - //mtx_Work.scale(dScaleX, dScaleY); - - //mtx_Work.multiply(m_oFullTransform.m_agg_mtx); - mtx_Work.invert(); - interpolator_type_linear interpolator(mtx_Work); + switch (nCurrentMode) { - //agg::rendering_buffer PatRendBuff((BYTE *)pImgBuff, dwImgWidth, dwImgHeight, nImgStride); - - agg::rendering_buffer PatRendBuff; - - if (nImgStride < 0) + case 0: { - BYTE* pBuffer = (BYTE*)pImgBuff + (dwImgHeight - 1) * nImgStride; - PatRendBuff.attach(pBuffer, dwImgWidth, dwImgHeight, nImgStride); + typedef agg::span_image_filter_rgba_nn span_gen_type; + typedef agg::renderer_scanline_aa renderer_type; + span_gen_type sg(img_src, interpolator); + renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); + render_scanlines_alpha(ri, Alpha); + break; } - else + case 1: { - PatRendBuff.attach((BYTE*)pImgBuff, dwImgWidth, dwImgHeight, nImgStride); + typedef agg::span_image_filter_rgba_bilinear span_gen_type; + typedef agg::renderer_scanline_aa renderer_type; + span_gen_type sg(img_src, interpolator); + renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); + render_scanlines_alpha(ri, Alpha); + break; } - - pixfmt img_pixf(PatRendBuff); - img_source_type img_src(img_pixf, agg::rgba(0, 0, 0, 0)); - span_gen_type sg(img_src, interpolator); - renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); - //agg::render_scanlines(m_rasterizer.get_rasterizer(), m_rasterizer.get_scanline(), ri); - - double dAlpha = m_dGlobalAlpha * Alpha / 255.0; - if (fabs(dAlpha - 1.0) < FLT_EPSILON) + /*case 2: { - render_scanlines(ri); - } - else - { - m_rasterizer.gamma_multi(dAlpha); - render_scanlines(ri); - m_rasterizer.gamma(1.0); - } + typedef agg::span_image_filter span_gen_type; + typedef agg::renderer_scanline_aa renderer_type; + agg::image_filter_lut filter; + filter.calculate(agg::image_filter_bicubic(), false); + span_gen_type sg(img_src, interpolator, &filter); + renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); + render_scanlines_alpha(ri, Alpha); + break; + }*/ + default: + break; } } else { - span_alloc_type span_allocator; // Span Allocator - typedef agg::pixfmt_rgba32 pixfmt; typedef agg::image_accessor_clip img_source_type; - typedef agg::span_image_filter_rgba_nn span_gen_type; - typedef agg::renderer_scanline_aa renderer_type; - //double dScaleX = 270.0 / dwImgWidth; - //double dScaleY = 190.0 / dwImgHeight; + pixfmt img_pixf(PatRendBuff); + img_source_type img_src(img_pixf, agg::rgba(0, 0, 0, 0)); - agg::trans_affine mtx_Work(mImgMtx.m_internal->m_agg_mtx); - //mtx_Work.scale(dScaleX, dScaleY); - - //mtx_Work.multiply(m_oFullTransform.m_agg_mtx); - mtx_Work.invert(); - interpolator_type_linear interpolator(mtx_Work); + switch (nCurrentMode) { - //agg::rendering_buffer PatRendBuff((BYTE *)pImgBuff, dwImgWidth, dwImgHeight, nImgStride); - - agg::rendering_buffer PatRendBuff; - - if (nImgStride < 0) + case 0: { - BYTE* pBuffer = (BYTE*)pImgBuff + (dwImgHeight - 1) * nImgStride; - PatRendBuff.attach(pBuffer, dwImgWidth, dwImgHeight, nImgStride); + typedef agg::span_image_filter_rgba_nn span_gen_type; + typedef agg::renderer_scanline_aa renderer_type; + span_gen_type sg(img_src, interpolator); + renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); + render_scanlines_alpha(ri, Alpha); + break; } - else + case 1: { - PatRendBuff.attach((BYTE*)pImgBuff, dwImgWidth, dwImgHeight, nImgStride); + typedef agg::span_image_filter_rgba_bilinear span_gen_type; + typedef agg::renderer_scanline_aa renderer_type; + span_gen_type sg(img_src, interpolator); + renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); + render_scanlines_alpha(ri, Alpha); + break; } - - pixfmt img_pixf(PatRendBuff); - img_source_type img_src(img_pixf, agg::rgba(0, 0, 0, 0)); - span_gen_type sg(img_src, interpolator); - renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); - //agg::render_scanlines(m_rasterizer.get_rasterizer(), m_rasterizer.get_scanline(), ri); - - double dAlpha = m_dGlobalAlpha * Alpha / 255.0; - if (fabs(dAlpha - 1.0) < FLT_EPSILON) + /*case 2: { - render_scanlines(ri); - } - else - { - m_rasterizer.gamma_multi(dAlpha); - render_scanlines(ri); - m_rasterizer.gamma(1.0); - } + typedef agg::span_image_filter span_gen_type; + typedef agg::renderer_scanline_aa renderer_type; + agg::image_filter_lut filter; + filter.calculate(agg::image_filter_bicubic(), false); + span_gen_type sg(img_src, interpolator, &filter); + renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); + render_scanlines_alpha(ri, Alpha); + break; + }*/ + default: + break; } } } diff --git a/DesktopEditor/graphics/Graphics.h b/DesktopEditor/graphics/Graphics.h index 357d03b8a5..241dec9555 100644 --- a/DesktopEditor/graphics/Graphics.h +++ b/DesktopEditor/graphics/Graphics.h @@ -134,6 +134,7 @@ typedef agg::renderer_base base_renderer_type; typedef agg::scanline_u8 scanline_type; typedef agg::span_interpolator_linear<> interpolator_type_linear; + typedef agg::span_allocator span_alloc_type; #define def_flag_G_ExtBuffer 0x0001 @@ -402,6 +403,8 @@ protected: void render_scanlines(Renderer& ren); template void render_scanlines(Rasterizer& ras, Renderer& ren); + template + void render_scanlines_alpha(Renderer& ren, BYTE Alpha); void DoFillPathSolid(CColor dwColor); void DoFillPathGradient(CBrushLinearGradient *pBrush); diff --git a/PdfReader/test/mainwindow.ui b/PdfReader/test/mainwindow.ui index 235473a7a7..563ae4f558 100644 --- a/PdfReader/test/mainwindow.ui +++ b/PdfReader/test/mainwindow.ui @@ -179,7 +179,7 @@ 0 0 851 - 20 + 17 @@ -189,7 +189,6 @@ -