Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Rasterizer.h « subtitles « src - github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 6a261fbb68bb07ef98e8c8b69d837047780ce60a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/* 
 *	Copyright (C) 2003-2006 Gabest
 *	http://www.gabest.org
 *
 *  This Program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *   
 *  This Program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *   
 *  You should have received a copy of the GNU General Public License
 *  along with GNU Make; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 *  http://www.gnu.org/copyleft/gpl.html
 *
 */

#pragma once

#include <vector>
#include "../SubPic/ISubPic.h"
#ifdef _VSMOD // patch m004. gradient colors
#include "STS.h" 
#endif

#ifdef _VSMOD // patch m006. moveable vector clip
class MOD_MOVEVC
{
public:
	// movevc
	bool enable;
	CSize size;
	CPoint pos;
	
	//CSize canvas;	// canvas size
	CSize spd;		// output canvas size
	CPoint curpos;  // output origin point
	int hfull;		// full height
	byte* alphamask;

	MOD_MOVEVC();

	byte GetAlphaValue(int wx,int wy);
	void clear();
};
#endif

#define PT_MOVETONC 0xfe
#define PT_BSPLINETO 0xfc
#define PT_BSPLINEPATCHTO 0xfa 

class RasterizerNfo
{
public:
	int w;
	int h;
	int spdw;
	int overlayp;
	int pitch;
	DWORD color;

	int xo;
	int yo;

	const DWORD* sw;
	byte* s;
	byte* src;
	DWORD* dst;

#ifdef _VSMOD
	int typ;
	MOD_GRADIENT mod_grad;
	MOD_MOVEVC mod_vc;
#else
	byte* am;
#endif

	RasterizerNfo();
};

class Rasterizer
{
	bool fFirstSet;
	CPoint firstp, lastp;

protected:
	BYTE* mpPathTypes;
	POINT* mpPathPoints;
	size_t mPathPoints;

private:
	int mWidth, mHeight;

	typedef std::pair<unsigned __int64, unsigned __int64> tSpan;
	typedef std::vector<tSpan> tSpanBuffer;

	tSpanBuffer mOutline;
	tSpanBuffer mWideOutline;
	int mWideBorder;

	struct Edge {
		int next;
		int posandflag;
	} *mpEdgeBuffer;
	size_t mEdgeHeapSize;
	size_t mEdgeNext;

	size_t* mpScanBuffer;

	typedef unsigned char byte;

protected:
	int mPathOffsetX, mPathOffsetY;
	int mOffsetX, mOffsetY;
	int mOverlayWidth, mOverlayHeight;
	byte *mpOverlayBuffer;

private:
	void _TrashPath();
	void _TrashOverlay();
	void _ReallocEdgeBuffer(int edges);
	void _EvaluateBezier(int ptbase, bool fBSpline);
	void _EvaluateLine(int pt1idx, int pt2idx);
	void _EvaluateLine(int x0, int y0, int x1, int y1);
	static void _OverlapRegion(tSpanBuffer& dst, tSpanBuffer& src, int dx, int dy);
	// helpers
	void Draw_noAlpha_spFF_Body_0(RasterizerNfo& rnfo);
	void Draw_noAlpha_spFF_noBody_0(RasterizerNfo& rnfo);
	void Draw_noAlpha_sp_Body_0(RasterizerNfo& rnfo);
	void Draw_noAlpha_sp_noBody_0(RasterizerNfo& rnfo);
	void Draw_noAlpha_spFF_Body_sse2(RasterizerNfo& rnfo);
	void Draw_noAlpha_spFF_noBody_sse2(RasterizerNfo& rnfo);
	void Draw_noAlpha_sp_Body_sse2(RasterizerNfo& rnfo);
	void Draw_noAlpha_sp_noBody_sse2(RasterizerNfo& rnfo);
	void Draw_Alpha_spFF_Body_0(RasterizerNfo& rnfo);
	void Draw_Alpha_spFF_noBody_0(RasterizerNfo& rnfo);
	void Draw_Alpha_sp_Body_0(RasterizerNfo& rnfo);
	void Draw_Alpha_sp_noBody_0(RasterizerNfo& rnfo);
	void Draw_Alpha_spFF_Body_sse2(RasterizerNfo& rnfo);
	void Draw_Alpha_spFF_noBody_sse2(RasterizerNfo& rnfo);
	void Draw_Alpha_sp_Body_sse2(RasterizerNfo& rnfo);
	void Draw_Alpha_sp_noBody_sse2(RasterizerNfo& rnfo);

#ifdef _VSMOD // patch m004. gradient colors
	void Draw_Grad_noAlpha_spFF_Body_0(RasterizerNfo& rnfo);
	void Draw_Grad_noAlpha_spFF_noBody_0(RasterizerNfo& rnfo);
	void Draw_Grad_noAlpha_sp_Body_0(RasterizerNfo& rnfo);
	void Draw_Grad_noAlpha_sp_noBody_0(RasterizerNfo& rnfo);
	void Draw_Grad_Alpha_spFF_Body_0(RasterizerNfo& rnfo);
	void Draw_Grad_Alpha_spFF_noBody_0(RasterizerNfo& rnfo);
	void Draw_Grad_Alpha_sp_Body_0(RasterizerNfo& rnfo); 
	void Draw_Grad_Alpha_sp_noBody_0(RasterizerNfo& rnfo);
	void Draw_Grad_noAlpha_spFF_Body_sse2(RasterizerNfo& rnfo);
	void Draw_Grad_noAlpha_spFF_noBody_sse2(RasterizerNfo& rnfo);
	void Draw_Grad_noAlpha_sp_Body_sse2(RasterizerNfo& rnfo);
	void Draw_Grad_noAlpha_sp_noBody_sse2(RasterizerNfo& rnfo);
	void Draw_Grad_Alpha_spFF_Body_sse2(RasterizerNfo& rnfo);
	void Draw_Grad_Alpha_spFF_noBody_sse2(RasterizerNfo& rnfo);
	void Draw_Grad_Alpha_sp_Body_sse2(RasterizerNfo& rnfo);
	void Draw_Grad_Alpha_sp_noBody_sse2(RasterizerNfo& rnfo);
#endif
public:
	Rasterizer();
	virtual ~Rasterizer();

	bool BeginPath(HDC hdc);
	bool EndPath(HDC hdc);
	bool PartialBeginPath(HDC hdc, bool bClearPath);
	bool PartialEndPath(HDC hdc, long dx, long dy);
	bool ScanConvert();
	bool CreateWidenedRegion(int borderX, int borderY);
	void DeleteOutlines();
	bool Rasterize(int xsub, int ysub, int fBlur, double fGaussianBlur);
	int getOverlayWidth();
#ifdef _VSMOD // patch m004. gradient colors
	CRect Draw(SubPicDesc& spd, CRect& clipRect, byte* pAlphaMask, int xsub, int ysub, const DWORD* switchpts, bool fBody, bool fBorder, int typ, MOD_GRADIENT& mod_grad, MOD_MOVEVC& mod_vc);
#else
	CRect Draw(SubPicDesc& spd, CRect& clipRect, byte* pAlphaMask, int xsub, int ysub, const DWORD* switchpts, bool fBody, bool fBorder);
#endif
	void FillSolidRect(SubPicDesc& spd, int x, int y, int nWidth, int nHeight, DWORD lColor);
};