1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/**
17* @file render_scanline.h
18* @brief Defines scanline renderer
19* @since 1.0
20* @version 1.0
21*/
22
23#ifndef GRAPHIC_LITE_RENDER_SCANLINE_H
24#define GRAPHIC_LITE_RENDER_SCANLINE_H
25
26#include <cstdlib>
27#include <cstring>
28#include <limits>
29#include "gfx_utils/color.h"
30#include "gfx_utils/diagram/spancolorfill/fill_base.h"
31#include "gfx_utils/diagram/scanline/geometry_scanline.h"
32#include "gfx_utils/diagram/rasterizer/rasterizer_scanline_antialias.h"
33#include "render/render_base.h"
34
35namespace OHOS {
36/**
37 * @brief Anti aliasing scanline for rendering solid lines.
38 * Via scanline Begin gets the first span, and + + span gets the next span.
39 * The corresponding function is called by renbase to draw the color to the
40 * canvas where the corresponding span is located.
41 * @param raster grating
42 * @param scanline Scan line
43 * @param renBase Renderer
44 * @param color colour
45 */
46void RenderScanlinesAntiAliasSolid(RasterizerScanlineAntialias& raster, GeometryScanline& scanline,
47                                   RenderBase& renBase, const Rgba8T& color);
48
49/**
50 * @brief Rendering anti aliased scanlines.
51 * Via scanline Begin gets the first span, and + + span gets the next span.
52 * Via allocat_ - > Resize (spanlen) allocates a color_type with the same length as span.
53 * Through segment generator spangenerate_ - > Generate(colors, x, y, len); Fill the color
54 * array to get the color array with values corresponding to the scan line span.
55 * Finally, through renbase_ Call the corresponding function to draw the color array
56 * to the canvas position of the corresponding span.
57 * @param raster grating
58 * @param scanline Scan line
59 * @param renBase Renderer
60 * @param alloc distributor
61 * @param spanGen Segment generator
62 */
63void RenderScanlinesAntiAlias(RasterizerScanlineAntialias& raster, GeometryScanline& scanline,
64                              RenderBase& renBase, FillBase& alloc, SpanBase& spanGen);
65
66void BlendScanLine(GlobalCompositeOperation op, RasterizerScanlineAntialias& raster1,
67                   RasterizerScanlineAntialias& raster2, GeometryScanline& sl1, GeometryScanline& sl2,
68                   RenderBase& renBase, FillBase& alloc, SpanBase& spanGen1, SpanBase& spanGen2);
69
70void CalcinterScanline(GeometryScanline& scanline3, int32_t x1, int32_t x2,
71                       GeometryScanline::ConstIterator span1, GeometryScanline::ConstIterator span2);
72
73void CalcOutScanlineRight(GeometryScanline& scanline, int32_t x1, int32_t x2,
74                          GeometryScanline::ConstIterator span1, GeometryScanline::ConstIterator span2);
75
76void CalcOutScanlineLeft(GeometryScanline& scanline, int32_t x1, int32_t x2,
77                         GeometryScanline::ConstIterator span1, GeometryScanline::ConstIterator span2);
78
79void CalcOutScanlineAll(GeometryScanline& scanline, int32_t x1, int32_t x2,
80                        GeometryScanline::ConstIterator span1, GeometryScanline::ConstIterator span2);
81
82void BlendSourceAtop(RasterizerScanlineAntialias& raster1, RasterizerScanlineAntialias& raster2,
83                     GeometryScanline& scanline1, GeometryScanline& scanline2, RenderBase& renBase,
84                     FillBase& alloc, SpanBase& spanGen1, SpanBase& spanGen2);
85
86
87void BlendSourceIn(RasterizerScanlineAntialias& raster1, RasterizerScanlineAntialias& raster2,
88                   GeometryScanline& scanline1, GeometryScanline& scanline2, RenderBase& renBase,
89                   FillBase& alloc, SpanBase& spanGen1);
90
91void BlendSourceInLoop(RasterizerScanlineAntialias& raster1, GeometryScanline& scanline1, GeometryScanline& scanline2,
92                       SpanBase& spanGen1, RenderBase& renBase, FillBase& alloc, int32_t& y1);
93
94void BlendSourceOut(RasterizerScanlineAntialias& raster1, RasterizerScanlineAntialias& raster2,
95                    GeometryScanline& scanline1, GeometryScanline& scanline2,
96                    RenderBase& renBase, FillBase& alloc, SpanBase& spanGen1);
97
98void BlendSourceOutWhile(int32_t y1, GeometryScanline& scanline1, RenderBase& renBase,
99                         FillBase& alloc, SpanBase& spanGen1);
100
101void BlendSourceOutDrawResetRaster(RasterizerScanlineAntialias& raster1, GeometryScanline& scanline1,
102                                   RenderBase& renBase, FillBase& alloc, SpanBase& spanGen1);
103
104void BlendSourceOver(RasterizerScanlineAntialias& raster1, RasterizerScanlineAntialias& raster2,
105                     GeometryScanline& scanline1, GeometryScanline& scanline2,
106                     RenderBase& renBase, FillBase& alloc, SpanBase& spanGen1, SpanBase& spanGen2);
107
108
109void BlendXOR(RasterizerScanlineAntialias& raster1, RasterizerScanlineAntialias& raster2,
110              GeometryScanline& scanline1, GeometryScanline& scanline2,
111              RenderBase& renBase, FillBase& alloc, SpanBase& spanGen1, SpanBase& spanGen2);
112
113void BlendXORDrawResetRaster(RasterizerScanlineAntialias& raster1, GeometryScanline& scanline1,
114                             RenderBase& renBase, FillBase& alloc, SpanBase& spanGen1);
115
116void BlendXORColorHspan(int32_t& y1, RasterizerScanlineAntialias& raster1, RasterizerScanlineAntialias& raster2,
117                        GeometryScanline& scanline1, RenderBase& renBase, FillBase& alloc, SpanBase& spanGen1);
118
119
120void BlendLIGHTER(RasterizerScanlineAntialias& raster1, RasterizerScanlineAntialias& raster2,
121                  GeometryScanline& scanline1, GeometryScanline& scanline2,
122                  RenderBase& renBase, FillBase& alloc, SpanBase& spanGen1, SpanBase& spanGen2);
123} // namespace OHOS
124#endif
125