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: c324a4ecd2b5c591d880f49ac28964732eafb291 (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
/*
 * $Id$
 *
 * (C) 2003-2006 Gabest
 * (C) 2006-2012 see Authors.txt
 *
 * This file is part of MPC-HC.
 *
 * MPC-HC 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 3 of the License, or
 * (at your option) any later version.
 *
 * MPC-HC 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#pragma once

#include <vector>
#include "../SubPic/ISubPic.h"

#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;

    byte* am;

    RasterizerNfo();
};

class Rasterizer
{
    bool fFirstSet;
    CPoint firstp, lastp;

protected:
    BYTE* mpPathTypes;
    POINT* mpPathPoints;
    int 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;
    unsigned int mEdgeHeapSize;
    unsigned int mEdgeNext;

    unsigned int* 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);

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();

    CRect Draw(SubPicDesc& spd, CRect& clipRect, byte* pAlphaMask, int xsub, int ysub, const DWORD* switchpts, bool fBody, bool fBorder);
    void FillSolidRect(SubPicDesc& spd, int x, int y, int nWidth, int nHeight, DWORD lColor);
};