From 822fd240a4272d1ad0e8dc1a87683293287a1f85 Mon Sep 17 00:00:00 2001 From: xy Date: Tue, 12 Jun 2012 21:21:22 +0800 Subject: [PATCH] Rafactoring CClipper. --- src/subtitles/RTS.cpp | 69 ++++++++++++++++++++++++++++++++++++++------ src/subtitles/RTS.h | 13 +++++---- src/subtitles/Rasterizer.cpp | 6 +++- 3 files changed, 72 insertions(+), 16 deletions(-) diff --git a/src/subtitles/RTS.cpp b/src/subtitles/RTS.cpp index 962cc97..c924547 100644 --- a/src/subtitles/RTS.cpp +++ b/src/subtitles/RTS.cpp @@ -1160,9 +1160,53 @@ CClipper::~CClipper() { } -GrayImage2* CClipper::PaintBaseClipper() +GrayImage2* CClipper::PaintSimpleClipper() { GrayImage2* result = NULL; + if(m_size.cx < 0 || m_size.cy < 0) + return result; + + OverlayList overlay_list; + CWord::Paint( m_polygon, CPoint(0, 0), CPoint(0, 0), &overlay_list ); + int w = overlay_list.overlay->mOverlayWidth, h = overlay_list.overlay->mOverlayHeight; + int x = (overlay_list.overlay->mOffsetX+4)>>3, y = (overlay_list.overlay->mOffsetY+4)>>3; + int xo = 0, yo = 0; + if(x < 0) {xo = -x; w -= -x; x = 0;} + if(y < 0) {yo = -y; h -= -y; y = 0;} + if(x+w > m_size.cx) w = m_size.cx-x; + if(y+h > m_size.cy) h = m_size.cy-y; + if(w <= 0 || h <= 0) return result; + + result = new GrayImage2(); + if( !result ) + return result; + result->data.reset(new BYTE[w*h]); + result->pitch = w; + result->size.SetSize(w, h); + result->left_top.SetPoint(x, y); + + //fix me: unnecessary copy + BYTE * result_data = result->data.get(); + if(!result_data) + { + delete result; + return NULL; + } + const BYTE* src = overlay_list.overlay->mpOverlayBuffer.body + (overlay_list.overlay->mOverlayPitch * yo + xo); + while(h--) + { + //for(int wt=0; wtmOverlayPitch; + result_data += w; + } + return result; +} + +GrayImage2* CClipper::PaintBaseClipper() +{ + GrayImage2* result = NULL; //m_pAlphaMask = NULL; if(m_size.cx < 0 || m_size.cy < 0) return result; @@ -1292,8 +1336,15 @@ GrayImage2* CClipper::Paint() GrayImage2* result = NULL; switch(m_effectType) { - case -1: - result = PaintBaseClipper(); + case -1: + if (!m_inverse) + { + result = PaintSimpleClipper(); + } + else + { + result = PaintBaseClipper(); + } break; case EF_BANNER: result = PaintBannerClipper(); @@ -1310,7 +1361,7 @@ void CClipper::SetEffect( const Effect& effect, int effectType ) m_effectType = effectType; m_effect = effect; } - + SharedPtrGrayImage2 CClipper::GetAlphaMask( const SharedPtrCClipper& clipper ) { if (clipper!=NULL) @@ -1335,7 +1386,7 @@ SharedPtrGrayImage2 CClipper::GetAlphaMask( const SharedPtrCClipper& clipper ) { SharedPtrGrayImage2 result; return result; - } + } } // CLine @@ -3578,13 +3629,13 @@ void CRenderedTextSubtitle::Draw( SubPicDesc& spd, CompositeDrawItemListList& dr } } } - -CRect CRenderedTextSubtitle::DryDraw( SubPicDesc& spd, DrawItem& draw_item ) + +CRect CRenderedTextSubtitle::DryDraw( SubPicDesc& spd, DrawItem& draw_item ) { return Rasterizer::DryDraw(spd, draw_item.overlay, draw_item.clip_rect, NULL, draw_item.xsub, draw_item.ysub, draw_item.switchpts, draw_item.fBody, draw_item.fBorder); } - + CRect CRenderedTextSubtitle::Draw( SubPicDesc& spd, DrawItem& draw_item ) { CRect result; @@ -3592,7 +3643,7 @@ CRect CRenderedTextSubtitle::Draw( SubPicDesc& spd, DrawItem& draw_item ) const SharedPtrByte& alpha = Rasterizer::CompositeAlphaMask(spd, draw_item.overlay, draw_item.clip_rect, alpha_mask.get(), draw_item.xsub, draw_item.ysub, draw_item.switchpts, draw_item.fBody, draw_item.fBorder, &result); - Rasterizer::Draw(spd, draw_item.overlay, draw_item.clip_rect, alpha.get(), + Rasterizer::Draw(spd, draw_item.overlay, result, alpha.get(), draw_item.xsub, draw_item.ysub, draw_item.switchpts, draw_item.fBody, draw_item.fBorder); return result; } diff --git a/src/subtitles/RTS.h b/src/subtitles/RTS.h index 1077a33..1d41406 100644 --- a/src/subtitles/RTS.h +++ b/src/subtitles/RTS.h @@ -235,18 +235,19 @@ private: int m_effectType; bool m_painted; - + + GrayImage2* PaintSimpleClipper(); GrayImage2* PaintBaseClipper(); GrayImage2* PaintBannerClipper(); - GrayImage2* PaintScrollClipper(); - + GrayImage2* PaintScrollClipper(); + GrayImage2* Paint(); public: CClipper(CStringW str, CSize size, double scalex, double scaley, bool inverse); void SetEffect(const Effect& effect, int effectType); virtual ~CClipper(); - static SharedPtrGrayImage2 GetAlphaMask(const SharedPtrCClipper& clipper); + static SharedPtrGrayImage2 GetAlphaMask(const SharedPtrCClipper& clipper); friend class ClipperAlphaMaskCacheKey; friend class ClipperAlphaMaskCacheKeyTraits; @@ -457,9 +458,9 @@ private: void Draw(SubPicDesc& spd, CompositeDrawItemListList& drawItemListList); CSubtitle* GetSubtitle(int entry); -public: +public: static CRect DryDraw(SubPicDesc& spd, DrawItem& draw_item); - static CRect Draw( SubPicDesc& spd, DrawItem& draw_item ); + static CRect Draw( SubPicDesc& spd, DrawItem& draw_item ); static DrawItem* CreateDrawItem(SubPicDesc& spd, const SharedPtrOverlay& overlay, diff --git a/src/subtitles/Rasterizer.cpp b/src/subtitles/Rasterizer.cpp index d35ecbc..347d127 100644 --- a/src/subtitles/Rasterizer.cpp +++ b/src/subtitles/Rasterizer.cpp @@ -1080,6 +1080,11 @@ SharedPtrByte Rasterizer::CompositeAlphaMask(SubPicDesc& spd, const SharedPtrOve // Limit drawn area to intersection of rendering surface and rectangular clip area CRect r(0, 0, spd.w, spd.h); r &= clipRect; + if (alpha_mask!=NULL) + { + r &= CRect(alpha_mask->left_top, alpha_mask->size); + } + // Remember that all subtitle coordinates are specified in 1/8 pixels // (x+4)>>3 rounds to nearest whole pixel. // ??? What is xsub, ysub, mOffsetX and mOffsetY ? @@ -1096,7 +1101,6 @@ SharedPtrByte Rasterizer::CompositeAlphaMask(SubPicDesc& spd, const SharedPtrOve // Check if there's actually anything to render if(w <= 0 || h <= 0) return(result); outputDirtyRect->SetRect(x, y, x+w, y+h); - *outputDirtyRect &= CRect(0, 0, spd.w, spd.h); bool fSingleColor = (switchpts[1]==0xffffffff); -- 2.11.4.GIT