1  /*
2   * Copyright (c) 2021 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   * @addtogroup Display
18   * @{
19   *
20   * @brief Defines driver functions of the display module.
21   *
22   * This module provides driver functions for the graphics subsystem, including graphics layer management,
23   * device control, graphics hardware acceleration, display memory management, and callbacks.
24   *
25   * @since 3.0
26   */
27  
28  /* *
29   * @file display_vgu.h
30   *
31   * @brief Declares the driver functions for implementing 2D vector hardware acceleration.
32   *
33   * @since 3.0
34   */
35  
36  #ifndef DISPLAY_VGU_H
37  #define DISPLAY_VGU_H
38  #include "display_type.h"
39  
40  #ifdef __cplusplus
41  extern "C" {
42  #endif
43  
44  #undef HDI_VGU_SCALAR_IS_FLOAT
45  #define HDI_VGU_SCALAR_IS_FLOAT 1
46  
47  #ifdef HDI_VGU_SCALAR_IS_FLOAT
48  typedef float VGUScalar;
49  #else
50  typedef int32_t VGUScalar;
51  #endif
52  
53  typedef PixelFormat VGUPixelFormat;     /* < Pixel formats */
54  typedef BlendType VGUBlendType;         /* < Blend types supported by hardware acceleration */
55  
56  /* *
57   * @brief Enumerates data types of paths.
58   *
59   */
60  typedef enum {
61      VGU_DATA_TYPE_S16 = 0,  /* < Integer (2 bytes) */
62      VGU_DATA_TYPE_S32,      /* < Integer (4 bytes) */
63      VGU_DATA_TYPE_F32       /* < Floating point number (4 bytes) */
64  } VGUPathDataType;
65  
66  /* *
67   * @brief Enumerates supported hardware acceleration capabilities.
68   *
69   */
70  typedef enum {
71      VGU_CAP_BLIT = (1 << 0),        /* < Bit blit */
72      VGU_CAP_BLIT_NUM = (1 << 1),    /* < Maximum number of images that can be combined during bit blit */
73      VGU_CAP_PATH = (1 << 2),        /* < Path filling and stroking */
74      VGU_CAP_FILTER_BLUR = (1 << 3), /* < Blur filter */
75  } VGUCapability;
76  
77  /* *
78   * @brief Enumerates result codes that may return.
79   *
80   */
81  typedef enum {
82      VGU_SUCCESS = 0,            /* < The operation is successful. */
83      VGU_NO_SUPPORT = -1,        /* < This feature is not supported. */
84      VGU_OPERATION_FAILED = -2,   /* < The operation failed. */
85      VGU_OUT_OF_MEMORY = -3,     /* < The operation ran out of memory. */
86      VGU_TIMEOUT = -4,           /* < The operation times out. */
87      VGU_INVALID_PARAMETER = -5, /* < One or more parameters are invalid. */
88      VGU_BUSY = -6,              /* < The device is busy. */
89      VGU_NO_CONTEXT = -7,        /* < There is no context specified. */
90  } VGUResult;
91  
92  /* *
93   * @brief Enumerates styles for the endpoints of a stroked line.
94   *
95   */
96  typedef enum {
97      VGU_LINECAP_BUTT = 0,   /* < A line with a squared-off end (default value) */
98      VGU_LINECAP_ROUND,      /* < A line with a rounded end */
99      VGU_LINECAP_SQUARE      /* < A line with a squared-off end */
100  } VGULineCap;
101  
102  /* *
103   * @brief Enumerates join types for stroked lines.
104   *
105   */
106  typedef enum {
107      VGU_LINE_JOIN_MITER = 0,    /* < A join with a sharp corner (default value) */
108      VGU_LINE_JOIN_ROUND,        /* < A join with a rounded end */
109      VGU_LINE_JOIN_BEVEL,        /* < A join with a squared-off end */
110      VGU_LINE_JOIN_BUTT          /* < Invalid definition */
111  } VGUJointType;
112  
113  /* *
114   * @brief Defines the coordinates of a point.
115   *
116   */
117  typedef struct {
118      VGUScalar x;    /* < Horizontal coordinate of the point */
119      VGUScalar y;    /* < Vertical coordinate of the point */
120  } VGUPoint;
121  
122  /* *
123   * @brief Defines a rectangle.
124   *
125   */
126  typedef struct {
127      VGUScalar x; /* < Horizontal coordinate of the start point of the rectangle */
128      VGUScalar y; /* < Vertical coordinate of the start point of the rectangle */
129      VGUScalar w; /* < Width of the rectangle */
130      VGUScalar h; /* < Height of the rectangle */
131  } VGURect;
132  
133  /* *
134   * @brief Enumerates filter types for rendering an image.
135   *
136   */
137  typedef enum {
138      VGU_FILTER_BILINEAR = 0,    /* < Bilinear interpolation filter (default value) */
139      VGU_FILTER_NEAREST,         /* < No interpolation filter */
140      VGU_FILTER_LINEAR,          /* < Linear interpolation filter */
141      VGU_FILTER_BUTT             /* < Invalid definition */
142  } VGUFilter;
143  
144  /* *
145   * @brief Enumerates fill rules for graphics.
146   *
147   */
148  typedef enum {
149      VGU_RULE_WINDING = 0,   /* < Non-zero winding rule (default value) */
150      VGU_RULE_EVEN_ODD,      /* < Even-odd rule */
151      VGU_RULE_BUTT           /* < Invalid definition */
152  } VGUFillRule;
153  
154  /* *
155   * @brief Enumerates fill types of the outside of the gradient area.
156   *
157   */
158  typedef enum {
159      VGU_SPREAD_PAD = 0,     /* < The area is filled with the closest gradient stop color. (Default value) */
160      VGU_SPREAD_REFLECT,     /* < The gradient is reflected outside the area. */
161      VGU_SPREAD_REPEAT,      /* < The gradient is repeated outside the area. */
162      VGU_SPREAD_BUTT         /* < Invalid definition */
163  } VGUFillSpread;
164  
165  /* *
166   * @brief Enumerates wrap types of a pattern.
167   *
168   */
169  typedef enum {
170      VGU_WRAP_REFLECT = 0,   /* < The pattern is reflected. */
171      VGU_WRAP_REPEAT,        /* < The pattern is repeated. */
172      VGU_WRAP_BUTT           /* < Invalid definition */
173  } VGUWrapType;
174  
175  /* *
176   * @brief Enumerates commands for drawing a path.
177   *
178   */
179  typedef enum {
180      VGU_PATH_CMD_CLOSE = 0,     /* < Close the current subpath (coordinates: none). */
181      VGU_PATH_CMD_MOVE,          /* < Move to the specified point (coordinates: x0, y0). */
182      VGU_PATH_CMD_LINE,          /* < Draw a line (coordinates: x0, y0). */
183      VGU_PATH_CMD_HLINE,         /* < Draw a horizontal line (coordinates: x0). */
184      VGU_PATH_CMD_VLINE,         /* < Draw a vertical line (coordinates: y0). */
185      VGU_PATH_CMD_QUAD,          /* < Draw a quadratic Bezier curve (coordinates: x0, y0, x1, y1). */
186      VGU_PATH_CMD_CUBIC,         /* < Draw a cubic Bezier curve (coordinates: x0, y0, x1, y1, x2, y2). */
187      VGU_PATH_CMD_SQUAD,         /* < Draw a smooth quadratic Bezier curve (coordinates: x1, y1). */
188      VGU_PATH_CMD_SCUBIC,        /* < Draw a smooth cubic Bezier curve (coordinates: x1, y1, x2, y2). */
189      VGU_PATH_CMD_BUTT,          /* < Invalid definition */
190  } VGUPathCmd;
191  
192  /* *
193   * @brief Defines a path object, which stores path-related commands and coordinates.
194   *
195   */
196  typedef struct {
197      uint8_t *segment;       /* < Pointer to the path command data */
198      int32_t numSegments;    /* < Total number of path commands */
199      uint8_t *data;          /* < Pointer to the coordinates used in the path commands */
200      VGUPathDataType type;   /* < Data type of the path */
201      bool enAlias;           /* < Whether to enable anti-aliasing */
202      VGURect boundBox;       /* < Bounding box of the path */
203  } VGUPath;
204  
205  /* *
206   * @brief Enumerates transform types.
207   *
208   */
209  typedef enum {
210      VGU_TRANSFORM_TRANSLATE = (1 << 0),     /* < Translate */
211      VGU_TRANSFORM_SCALE = (1 << 1),         /* < Scale */
212      VGU_TRANSFORM_ROTATE_90 = (1 << 2),     /* < Rotate by 90 degrees */
213      VGU_TRANSFORM_ROTATE_180 = (1 << 3),    /* < Rotate by 180 degrees */
214      VGU_TRANSFORM_ROTATE_270 = (1 << 4),    /* < Rotate by 270 degrees */
215      VGU_TRANSFORM_OTHER = (1 << 16)         /* < Other transform type */
216  } VGUTransformType;
217  
218  /* *
219   * @brief Defines a transformation matrix.
220   *
221   */
222  typedef struct {
223      float m[3][3];    /* < 3x3 transformation matrix */
224      uint32_t type;    /* < Transform type, which can be scale, translate, or rotate by 90 x <i>N</i> degrees */
225  } VGUMatrix3;
226  
227  /* *
228   * @brief Stores bitmap information for hardware acceleration.
229   *
230   */
231  typedef struct {
232      VGUPixelFormat pixelFormat;  /* < Pixel format */
233      uint32_t width;             /* < Bitmap width */
234      uint32_t height;            /* < Bitmap height */
235      uint32_t stride;            /* < Bitmap stride */
236      void *virAddr;              /* < Virtual address of the requested memory */
237      uint64_t phyAddr;           /* < Physical memory address */
238  } VGUBuffer;
239  
240  /* *
241   * @brief Enumerates clip types of a surface.
242   *
243   */
244  typedef enum {
245      VGU_CLIP_RECT = 0,  /* < Rectangle clip (default value) */
246      VGU_CLIP_PATH,      /* < Path clip */
247      VGU_CLIP_BUTT       /* < Invalid definition */
248  } VGUClipType;
249  
250  /* *
251   * @brief Defines a mask layer.
252   *
253   */
254  typedef struct {
255      VGUBuffer *buffer;  /* < Pointer to the buffer for the mask */
256      VGURect *rect;      /* < Pointer to the rectangle for the mask */
257  } VGUMaskLayer;
258  
259  /* *
260   * @brief Stores surface information for 2D hardware acceleration.
261   *
262   */
263  typedef struct {
264      VGUBuffer *buffer;      /* < Bitmap buffer */
265      union {
266          VGURect *clipRect;  /* < Pointer to the clip rectangle. If it is null, the entire surface will be rendered. */
267          VGUPath *clipPath;  /* < Pointer to the clip path. If it is null, the entire surface will be rendered. */
268      };
269      VGUClipType clipType;   /* < Clip type of the surface */
270      VGUMaskLayer *mask;     /* < Mask layer, which can be null */
271      VGUBlendType blend;     /* < Blend type, specifying how a new image is drawn onto an existing surface */
272      VGUFilter filter;       /* < Filter type */
273  } VGUSurface;
274  
275  /* *
276   * @brief Defines how the colors are distributed along the gradient.
277   *
278   */
279  typedef struct {
280      float stop;     /* < Stop position. The value ranges from 0.0 to 1.0. */
281      uint32_t color; /* < Color of the stop */
282  } VGUColorStop;
283  
284  /* *
285   * @brief Defines a linear gradient.
286   *
287   */
288  typedef struct {
289      VGUScalar x1; /* < Horizontal coordinate of the start point of the linear gradient */
290      VGUScalar y1; /* < Vertical coordinate of the start point of the linear gradient */
291      VGUScalar x2; /* < Horizontal coordinate of the end point of the linear gradient */
292      VGUScalar y2; /* < Vertical coordinate of the end point of the linear gradient */
293  } VGULinear;
294  
295  /* *
296   * @brief Defines a radial gradient.
297   *
298   */
299  typedef struct {
300      VGUScalar x0; /* < Horizontal coordinate of the center of the inner circle */
301      VGUScalar y0; /* < Vertical coordinate of the center of the inner circle */
302      VGUScalar r0; /* < Radius of the inner circle */
303      VGUScalar x1; /* < Horizontal coordinate of the center of the outer circle */
304      VGUScalar y1; /* < Vertical coordinate of the center of the outer circle */
305      VGUScalar r1; /* < Radius of the outer circle */
306  } VGURadial;
307  
308  /* *
309   * @brief Defines a conic gradient.
310   *
311   */
312  typedef struct {
313      VGUScalar cx; /* < Horizontal coordinate of the center of the circle */
314      VGUScalar cy; /* < Vertical coordinate of the center of the circle */
315  } VGUConic;
316  
317  /* *
318   * @brief Defines an image.
319   *
320   */
321  typedef struct {
322      VGUBuffer *buffer;  /* < Image buffer */
323      VGUMatrix3 *matrix; /* < Pointer to the transformation matrix. If it is null, the identity matrix is used. */
324      VGURect *rect;      /* < Pointer to the rectangle of the image. If it is null, the entire buffer data is used. */
325      uint8_t opacity;    /* < Opacity. The value ranges from 0 to 255. */
326  } VGUImage;
327  
328  /* *
329   * @brief Defines an image pattern.
330   *
331   */
332  typedef struct {
333      VGUImage *image;    /* < Pointer to the image object */
334      VGUWrapType wrapx;  /* < Wrap the image horizontally. */
335      VGUWrapType wrapy;  /* < Wrap the image vertically. */
336  } VGUPattern;
337  
338  /* *
339   * @brief Enumerates gradient types.
340   *
341   */
342  typedef enum {
343      VGU_GRADIENT_LINEAR = 0,    /* < Linear gradient */
344      VGU_GRADIENT_RADIAL,        /* < Radial gradient */
345      VGU_GRADIENT_CONIC,         /* < Conic gradient */
346      VGU_GRADIENT_BUTT           /* < Invalid definition */
347  } VGUGradientType;
348  
349  /* *
350   * @brief Defines a gradient object.
351   *
352   */
353  typedef struct {
354      VGUMatrix3 *matrix;         /* < Pointer to the transformation matrix of the gradient object */
355      VGUColorStop *colorStops;   /* < Pointer to the gradient stop color array */
356      uint16_t stopCount;         /* < Number of stop colors */
357      union {
358          VGULinear linear;       /* < Linear gradient object */
359          VGURadial radial;       /* < Radial gradient object */
360          VGUConic conic;         /* < Conic gradient object */
361      };
362      VGUGradientType type;       /* < Gradient type */
363      VGUFillSpread spread;       /* < Gradient spread mode */
364      uint8_t opacity;            /* < Opacity. The value ranges from 0 to 255. */
365  } VGUGradient;
366  
367  /* *
368   * @brief Defines a solid color.
369   *
370   */
371  typedef struct {
372      uint32_t color;     /* < Solid color */
373      uint8_t opacity;    /* < Opacity. The value ranges from 0 to 255. */
374  } VGUSolid;
375  
376  /* *
377   * @brief Enumerates paint types.
378   *
379   */
380  typedef enum {
381      VGU_PAINT_SOLID = 0,    /* < Paint a solid color. */
382      VGU_PAINT_GRADIENT,     /* < Paint a gradient object. */
383      VGU_PAINT_PATTERN,      /* < Paint a pattern. */
384      VGU_PAINT_BUTT          /* < Invalid operation */
385  } VGUPaintType;
386  
387  /* *
388   * @brief Defines the paint style when filling or stroking a path.
389   *
390   */
391  typedef struct {
392      union {
393          VGUGradient *gradient;  /* < Pointer to the gradient object */
394          VGUPattern *pattern;    /* < Pointer to the pattern object */
395          VGUSolid *solid;        /* < Pointer to the solid color object */
396      };
397      VGUPaintType type;          /* < Paint type */
398  } VGUPaintStyle;
399  
400  /* *
401   * @brief Defines path filling attributes.
402   *
403   */
404  typedef struct {
405      VGUFillRule rule; /* < Fill rule */
406  } VGUFillAttr;
407  
408  /* *
409   * @brief Defines path stroking attributes.
410   *
411   */
412  typedef struct {
413      VGULineCap cap;     /* < Line cap style */
414      VGUJointType join;  /* < Join type */
415      float miterLimit;   /* < Miter limit */
416      float width;        /* < Line width */
417  } VGUStrokeAttr;
418  
419  /* *
420   * @brief Defines driver functions for 2D hardware acceleration.
421   */
422  typedef struct {
423      /* *
424       * @brief Initializes hardware acceleration.
425       *
426       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
427       * {@link VGUResult} otherwise.
428       * @see DeinitVgu
429       * @since 3.0
430       */
431      VGUResult (*InitVgu)(void);
432  
433      /* *
434       * @brief Deinitializes hardware acceleration.
435       *
436       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
437       * {@link VGUResult} otherwise.
438       * @see InitVgu
439       * @since 3.0
440       */
441      VGUResult (*DeinitVgu)(void);
442  
443      /* *
444       * @brief Queries hardware acceleration capabilities.
445       *
446       * @param cap Indicates the capabilities to query, which are defined by <b>VGUCapability</b>.
447       *
448       * @return Returns a value greater than or equal to 0 if the operation is successful; returns an error code defined
449       * in {@link VGUResult} otherwise.
450       * @since 3.0
451       */
452      int32_t (*QueryCapability)(uint32_t cap);
453  
454      /* *
455       * @brief Fills the given path with a specified paint style.
456       *
457       * @param target Indicates the pointer to the target surface.
458       * @param path Indicates the pointer to the path object.
459       * @param matrix Indicates the pointer to the transformation matrix object. If this parameter is null,
460       * the identity matrix is used by default.
461       * @param attr Indicates the pointer to the path filling attributes.
462       * @param style Indicates the pointer to the paint style to use.
463       *
464       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
465       * {@link VGUResult} otherwise.
466       * @since 3.0
467       */
468      VGUResult (*RenderFill)(VGUSurface *target, const VGUPath *path, const VGUMatrix3 *matrix, const VGUFillAttr *attr,
469          const VGUPaintStyle *style);
470  
471      /* *
472       * @brief Strokes the given path with a specified paint style.
473       *
474       * @param target Indicates the pointer to the target surface.
475       * @param path Indicates the pointer to the path object.
476       * @param matrix Indicates the pointer to the transformation matrix object. If this parameter is null,
477       * the identity matrix is used by default.
478       * @param attr Indicates the pointer to the path stroking attributes.
479       * @param style Indicates the pointer to the paint style to use.
480       *
481       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
482       * {@link VGUResult} otherwise.
483       * @since 3.0
484       */
485      VGUResult (*RenderStroke)(VGUSurface *target, const VGUPath *path, const VGUMatrix3 *matrix,
486          const VGUStrokeAttr *attr, const VGUPaintStyle *style);
487  
488      /* *
489       * @brief Blurs a specified surface.
490       *
491       * @param target Indicates the pointer to the target surface.
492       * @param blur Indicates the blur radius.
493       *
494       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
495       * {@link VGUResult} otherwise.
496       * @since 3.0
497       */
498      VGUResult (*RenderBlur)(VGUSurface *target, uint16_t blur);
499  
500      /* *
501       * @brief Blits an image to the target surface.
502       *
503       * During bit blit, color space conversion (CSC) and transformation can be implemented.
504       *
505       * @param target Indicates the pointer to the target surface.
506       * @param src Indicates the pointer to the source image.
507       * @param color Indicates the color for blending. If this parameter is <b>0</b>, color blending is not performed.
508       *
509       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
510       * {@link VGUResult} otherwise.
511       * @since 3.0
512       */
513      VGUResult (*RenderBlit)(VGUSurface *target, const VGUImage *src, uint32_t color);
514  
515      /* *
516       * @brief Blits multiple images to the target surface.
517       *
518       * During bit blit, color space conversion (CSC) and transformation can be implemented. You can use this
519       * function to combine multiple source images to the target surface.
520       * To query the maximum number of source images allowed, call the <b>QueryCapability<b/> function.
521       *
522       * @param target Indicates the pointer to the target surface.
523       * @param src Indicates the pointer to the array of source images.
524       * @param count Indicates the number of source images.
525       * @param color Indicates the color for blending. If this parameter is <b>0</b>, color blending is not performed.
526       *
527       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
528       * {@link VGUResult} otherwise.
529       * @since 3.0
530       */
531      VGUResult (*RenderBlitN)(VGUSurface *target, const VGUImage *src, uint16_t count, uint32_t color);
532  
533      /* *
534       * @brief Clears a rectangle with a given color on the target surface.
535       *
536       * @param target Indicates the pointer to the target surface.
537       * @param rect Indicates the pointer to the rectangle to clear. If this parameter is null, the entire surface
538       * will be cleared.
539       * @param color Indicates the color to fill.
540       * @param opacity Indicates the opacity to set.
541       *
542       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
543       * {@link VGUResult} otherwise.
544       * @since 3.0
545       */
546      VGUResult (*RenderClearRect)(VGUSurface *target, const VGURect *rect, uint32_t color, uint8_t opacity);
547  
548      /* *
549       * @brief Disables hardware acceleration for rendering.
550       *
551       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
552       * {@link VGUResult} otherwise.
553       * @since 3.0
554       */
555      VGUResult (*RenderCancel)();
556  
557      /* *
558       * @brief Synchronizes hardware acceleration when it is used to draw and blit bitmaps.
559       *
560       * This function blocks the process until hardware acceleration is complete.
561       *
562       * @param timeOut Indicates the timeout duration for hardware acceleration synchronization.
563       * The value <b>0</b> indicates no timeout, so the process keeps waiting until hardware acceleration is complete.
564       *
565       * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
566       * {@link VGUResult} otherwise.
567       * @since 3.0
568       */
569      VGUResult (*RenderSync)(int32_t timeOut);
570  } VGUFuncs;
571  
572  /* *
573   * @brief Initializes a path object.
574   *
575   * @param path Indicates the pointer to the path object.
576   * @param type Indicates the data type of the path.
577   * @param segments Indicates the pointer to the path commands.
578   * @param numSegments Indicates the total number of path commands.
579   * @param data Indicates the pointer to the coordinate data used in the path commands.
580   * @param enAlias Specifies whether to enable anti-aliasing.
581   * @param boundBox Indicates the bounding box of the path.
582   *
583   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
584   * {@link VGUResult} otherwise.
585   * @since 3.0
586   */
587  VGUResult VGUPathInit(VGUPath *path, VGUPathDataType type, const uint8_t* segments, int numSegments,
588      const uint8_t *data, bool enAlias, VGURect boundBox);
589  
590  /* *
591   * @brief Adds a subpath to a specified path.
592   *
593   * @param path Indicates the pointer to the path object.
594   * @param subpath Indicates the pointer to the subpath object.
595   *
596   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
597   * {@link VGUResult} otherwise.
598   * @since 3.0
599   */
600  VGUResult VGUPathAppend(VGUPath *path, const VGUPath *subpath);
601  
602  /* *
603   * @brief Clears the memory of a specified path object.
604   *
605   * @param path Indicates the pointer to the path object.
606   *
607   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
608   * {@link VGUResult} otherwise.
609   * @since 3.0
610   */
611  VGUResult VGUPathClear(VGUPath *path);
612  
613  /* *
614   * @brief Loads an identity matrix into a specified matrix object.
615   *
616   * @param matrix Indicates the pointer to the transformation matrix object.
617   *
618   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
619   * {@link VGUResult} otherwise.
620   * @since 3.0
621   */
622  VGUResult VGUMatrixIdentity(VGUMatrix3 *matrix);
623  
624  /* *
625   * @brief Scales a specified transformation matrix.
626   *
627   * @param matrix Indicates the pointer to the transformation matrix object.
628   * @param xScale Indicates how much you want to scale the horizontal coordinate by.
629   * @param yScale Indicates how much you want to scale the vertical coordinate by.
630   *
631   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
632   * {@link VGUResult} otherwise.
633   * @since 3.0
634   */
635  VGUResult VGUMatrixScale(VGUMatrix3 *matrix, float xScale, float yScale);
636  
637  /* *
638   * @brief Rotates a specified transformation matrix.
639   *
640   * @param matrix Indicates the pointer to the transformation matrix object.
641   * @param degree Indicates the number of degrees to rotate.
642   *
643   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
644   * {@link VGUResult} otherwise.
645   * @since 3.0
646   */
647  VGUResult VGUMatrixRotate(VGUMatrix3 *matrix, float degree);
648  
649  /* *
650   * @brief Translates a specified transformation matrix.
651   *
652   * @param matrix Indicates the pointer to the transformation matrix object.
653   * @param x Indicates how much you want to translate the horizontal coordinate by.
654   * @param y Indicates how much you want to translate the vertical coordinate by.
655   *
656   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
657   * {@link VGUResult} otherwise.
658   * @since 3.0
659   */
660  VGUResult VGUMatrixTranslate(VGUMatrix3 *matrix, float x, float y);
661  
662  /* *
663   * @brief Adds color stops to a specified gradient.
664   *
665   * @param gradient Indicates the pointer to the gradient object.
666   * @param colorStop Indicates the pointer to the color stop array.
667   * @param count Indicates the total number of color stops.
668   *
669   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
670   * {@link VGUResult} otherwise.
671   * @since 3.0
672   */
673  VGUResult VGUGradientColorStop(VGUGradient *gradient, const VGUColorStop *colorStop, uint32_t count);
674  
675  /* *
676   * @brief Clears color stops of a specified gradient.
677   *
678   * @param gradient Indicates the pointer to the gradient object.
679   *
680   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
681   * {@link VGUResult} otherwise.
682   * @since 3.0
683   */
684  VGUResult VGUGradientClearStop(VGUGradient *gradient);
685  
686  /* *
687   * @brief Sets a transformation matrix for a specified gradient.
688   *
689   * @param gradient Indicates the pointer to the gradient object.
690   * @param matrix Indicates the pointer to the transformation matrix object to set.
691   *
692   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
693   * {@link VGUResult} otherwise.
694   * @since 3.0
695   */
696  VGUResult VGUGradientMatrix(VGUGradient *gradient, const VGUMatrix3 *matrix);
697  
698  /* *
699   * @brief Creates a linear gradient object.
700   *
701   * @param gradient Indicates the pointer to the gradient object.
702   * @param p1 Indicates the pointer to the coordinates of the start point.
703   * @param p2 Indicates the pointer to the coordinates of the end point.
704   *
705   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
706   * {@link VGUResult} otherwise.
707   * @since 3.0
708   */
709  VGUResult VGUGradientLinear(VGUGradient *gradient, const VGUPoint *p1, const VGUPoint *p2);
710  
711  /* *
712   * @brief Creates a radial gradient object.
713   *
714   * @param gradient Indicates the pointer to the gradient object.
715   * @param p1 Indicates the pointer to the center point coordinates of the inner circle.
716   * @param r1 Indicates the radius of the inner circle.
717   * @param p2 Indicates the pointer to the center point coordinates of the outer circle.
718   * @param r2 Indicates the radius of the outer circle.
719   *
720   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
721   * {@link VGUResult} otherwise.
722   * @since 3.0
723   */
724  VGUResult VGUGradientRadial(VGUGradient *gradient, const VGUPoint *p1, VGUScalar r1, const VGUPoint *p2, VGUScalar r2);
725  
726  /* *
727   * @brief Creates a conic gradient object.
728   *
729   * @param gradient Indicates the pointer to the gradient object.
730   * @param cx Indicates the horizontal coordinate of the center point of the gradient.
731   * @param cy Indicates the vertical coordinate of the center point of the gradient.
732   *
733   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
734   * {@link VGUResult} otherwise.
735   * @since 3.0
736   */
737  VGUResult VGUGradientConic(VGUGradient *gradient, VGUScalar cx, VGUScalar cy);
738  
739  /* *
740   * @brief Initializes the hardware acceleration module to obtain the pointer to functions for
741   * hardware acceleration operations.
742   *
743   * @param funcs Indicates the double pointer to the functions for hardware acceleration operations.
744   * Memory is allocated automatically when you initiate the hardware acceleration module, so you can simply use
745   * the pointer to gain access to the functions.
746   *
747   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
748   * {@link VGUResult} otherwise.
749   *
750   * @since 3.0
751   */
752  VGUResult VGUInitialize(VGUFuncs **funcs);
753  
754  /* *
755   * @brief Deinitializes the hardware acceleration module to release the pointer to functions
756   * for hardware acceleration operations.
757   *
758   * @param funcs Indicates the pointer to the functions for hardware acceleration operations.
759   *
760   * @return Returns <b>VGU_SUCCESS</b> if the operation is successful; returns an error code defined in
761   * {@link VGUResult} otherwise.
762   * @since 3.0
763   */
764  VGUResult VGUUninitialize(VGUFuncs *funcs);
765  
766  #ifdef __cplusplus
767  }
768  #endif
769  #endif
770