c9cf8c62015e184b2ed1251561e06f2279d98bf7
[platform/upstream/libSkiaSharp.git] / include / c / sk_types.h
1 /*
2  * Copyright 2014 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 // EXPERIMENTAL EXPERIMENTAL EXPERIMENTAL EXPERIMENTAL
9 // DO NOT USE -- FOR INTERNAL TESTING ONLY
10
11 #ifndef sk_types_DEFINED
12 #define sk_types_DEFINED
13
14 #include <stdint.h>
15 #include <stddef.h>
16
17 #ifdef __cplusplus
18     #define SK_C_PLUS_PLUS_BEGIN_GUARD    extern "C" {
19     #define SK_C_PLUS_PLUS_END_GUARD      }
20 #else
21     #include <stdbool.h>
22     #define SK_C_PLUS_PLUS_BEGIN_GUARD
23     #define SK_C_PLUS_PLUS_END_GUARD
24 #endif
25
26 #ifndef SK_API
27 #define SK_API
28 #endif
29
30 ///////////////////////////////////////////////////////////////////////////////////////
31
32 SK_C_PLUS_PLUS_BEGIN_GUARD
33
34 typedef uint32_t sk_color_t;
35
36 /* This macro assumes all arguments are >=0 and <=255. */
37 #define sk_color_set_argb(a, r, g, b)   (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
38 #define sk_color_get_a(c)               (((c) >> 24) & 0xFF)
39 #define sk_color_get_r(c)               (((c) >> 16) & 0xFF)
40 #define sk_color_get_g(c)               (((c) >>  8) & 0xFF)
41 #define sk_color_get_b(c)               (((c) >>  0) & 0xFF)
42
43 typedef enum {
44     UNKNOWN_SK_COLORTYPE = 0,
45     ALPHA_8_SK_COLORTYPE,
46     RGB_565_SK_COLORTYPE,
47     ARGB_4444_SK_COLORTYPE,
48     RGBA_8888_SK_COLORTYPE,
49     BGRA_8888_SK_COLORTYPE,
50     Index_8_SK_COLORTYPE,
51     Gray_8_SK_COLORTYPE,
52     RGBA_F16_SK_COLORTYPE,
53 } sk_colortype_t;
54
55 typedef enum {
56     UNKNOWN_SK_ALPHATYPE,
57     OPAQUE_SK_ALPHATYPE,
58     PREMUL_SK_ALPHATYPE,
59     UNPREMUL_SK_ALPHATYPE,
60 } sk_alphatype_t;
61
62 typedef enum {
63     INTERSECT_SK_CLIPTYPE,
64     DIFFERENCE_SK_CLIPTYPE,
65 } sk_cliptype_t;
66
67 typedef enum {
68     UNKNOWN_SK_PIXELGEOMETRY,
69     RGB_H_SK_PIXELGEOMETRY,
70     BGR_H_SK_PIXELGEOMETRY,
71     RGB_V_SK_PIXELGEOMETRY,
72     BGR_V_SK_PIXELGEOMETRY,
73 } sk_pixelgeometry_t;
74
75 typedef struct {
76     int32_t         width;
77     int32_t         height;
78     sk_colortype_t  colorType;
79     sk_alphatype_t  alphaType;
80 } sk_imageinfo_t;
81
82 typedef struct {
83     sk_pixelgeometry_t pixelGeometry;
84 } sk_surfaceprops_t;
85
86 typedef struct {
87     float   x;
88     float   y;
89 } sk_point_t;
90
91 typedef struct {
92     int32_t left;
93     int32_t top;
94     int32_t right;
95     int32_t bottom;
96 } sk_irect_t;
97
98 typedef struct {
99     float   left;
100     float   top;
101     float   right;
102     float   bottom;
103 } sk_rect_t;
104
105 typedef struct {
106     float   mat[9];
107 } sk_matrix_t;
108
109 /**
110     A sk_canvas_t encapsulates all of the state about drawing into a
111     destination This includes a reference to the destination itself,
112     and a stack of matrix/clip values.
113 */
114 typedef struct sk_canvas_t sk_canvas_t;
115 /**
116     A sk_data_ holds an immutable data buffer.
117 */
118 typedef struct sk_data_t sk_data_t;
119 /**
120     A sk_image_t is an abstraction for drawing a rectagle of pixels.
121     The content of the image is always immutable, though the actual
122     storage may change, if for example that image can be re-created via
123     encoded data or other means.
124 */
125 typedef struct sk_image_t sk_image_t;
126 /**
127     A sk_maskfilter_t is an object that perform transformations on an
128     alpha-channel mask before drawing it; it may be installed into a
129     sk_paint_t.  Each time a primitive is drawn, it is first
130     scan-converted into a alpha mask, which os handed to the
131     maskfilter, which may create a new mask is to render into the
132     destination.
133  */
134 typedef struct sk_maskfilter_t sk_maskfilter_t;
135 /**
136     A sk_paint_t holds the style and color information about how to
137     draw geometries, text and bitmaps.
138 */
139 typedef struct sk_paint_t sk_paint_t;
140 /**
141     A sk_path_t encapsulates compound (multiple contour) geometric
142     paths consisting of straight line segments, quadratic curves, and
143     cubic curves.
144 */
145 typedef struct sk_path_t sk_path_t;
146 /**
147     A sk_picture_t holds recorded canvas drawing commands to be played
148     back at a later time.
149 */
150 typedef struct sk_picture_t sk_picture_t;
151 /**
152     A sk_picture_recorder_t holds a sk_canvas_t that records commands
153     to create a sk_picture_t.
154 */
155 typedef struct sk_picture_recorder_t sk_picture_recorder_t;
156 /**
157     A sk_shader_t specifies the source color(s) for what is being drawn. If a
158     paint has no shader, then the paint's color is used. If the paint
159     has a shader, then the shader's color(s) are use instead, but they
160     are modulated by the paint's alpha.
161 */
162 typedef struct sk_shader_t sk_shader_t;
163 /**
164     A sk_surface_t holds the destination for drawing to a canvas. For
165     raster drawing, the destination is an array of pixels in memory.
166     For GPU drawing, the destination is a texture or a framebuffer.
167 */
168 typedef struct sk_surface_t sk_surface_t;
169
170 typedef enum {
171     CLEAR_SK_XFERMODE_MODE,
172     SRC_SK_XFERMODE_MODE,
173     DST_SK_XFERMODE_MODE,
174     SRCOVER_SK_XFERMODE_MODE,
175     DSTOVER_SK_XFERMODE_MODE,
176     SRCIN_SK_XFERMODE_MODE,
177     DSTIN_SK_XFERMODE_MODE,
178     SRCOUT_SK_XFERMODE_MODE,
179     DSTOUT_SK_XFERMODE_MODE,
180     SRCATOP_SK_XFERMODE_MODE,
181     DSTATOP_SK_XFERMODE_MODE,
182     XOR_SK_XFERMODE_MODE,
183     PLUS_SK_XFERMODE_MODE,
184     MODULATE_SK_XFERMODE_MODE,
185     SCREEN_SK_XFERMODE_MODE,
186     OVERLAY_SK_XFERMODE_MODE,
187     DARKEN_SK_XFERMODE_MODE,
188     LIGHTEN_SK_XFERMODE_MODE,
189     COLORDODGE_SK_XFERMODE_MODE,
190     COLORBURN_SK_XFERMODE_MODE,
191     HARDLIGHT_SK_XFERMODE_MODE,
192     SOFTLIGHT_SK_XFERMODE_MODE,
193     DIFFERENCE_SK_XFERMODE_MODE,
194     EXCLUSION_SK_XFERMODE_MODE,
195     MULTIPLY_SK_XFERMODE_MODE,
196     HUE_SK_XFERMODE_MODE,
197     SATURATION_SK_XFERMODE_MODE,
198     COLOR_SK_XFERMODE_MODE,
199     LUMINOSITY_SK_XFERMODE_MODE,
200 } sk_xfermode_mode_t;
201
202 //////////////////////////////////////////////////////////////////////////////////////////
203
204 typedef struct {
205     float   x;
206     float   y;
207     float   z;
208 } sk_point3_t;
209
210 typedef struct {
211     float   x;
212     float   y;
213 } sk_ipoint_t;
214
215 typedef struct {
216     float   w;
217     float   h;
218 } sk_size_t;
219
220 typedef struct {
221     float   w;
222     float   h;
223 } sk_isize_t;
224
225 typedef struct {
226     uint32_t fFlags;            // Bit field to identify which values are unknown
227     float    fTop;              // The greatest distance above the baseline for any glyph (will be <= 0)
228     float    fAscent;           // The recommended distance above the baseline (will be <= 0)
229     float    fDescent;          // The recommended distance below the baseline (will be >= 0)
230     float    fBottom;           // The greatest distance below the baseline for any glyph (will be >= 0)
231     float    fLeading;          // The recommended distance to add between lines of text (will be >= 0)
232     float    fAvgCharWidth;     // the average character width (>= 0)
233     float    fMaxCharWidth;     // the max character width (>= 0)
234     float    fXMin;             // The minimum bounding box x value for all glyphs
235     float    fXMax;             // The maximum bounding box x value for all glyphs
236     float    fXHeight;          // The height of an 'x' in px, or 0 if no 'x' in face
237     float    fCapHeight;        // The cap height (> 0), or 0 if cannot be determined.
238     float    fUnderlineThickness; // underline thickness, or 0 if cannot be determined
239     float    fUnderlinePosition; // underline position, or 0 if cannot be determined
240 } sk_fontmetrics_t;
241
242 // Flags for fFlags member of sk_fontmetrics_t
243 #define FONTMETRICS_FLAGS_UNDERLINE_THICKNESS_IS_VALID (1U << 0)
244 #define FONTMETRICS_FLAGS_UNDERLINE_POSITION_IS_VALID (1U << 1)
245
246 /**
247     A lightweight managed string.
248 */
249 typedef struct sk_string_t sk_string_t;
250 /**
251
252     A sk_bitmap_t is an abstraction that specifies a raster bitmap.
253 */
254 typedef struct sk_bitmap_t sk_bitmap_t;
255 typedef struct sk_colorfilter_t sk_colorfilter_t;
256 typedef struct sk_imagefilter_t sk_imagefilter_t;
257 typedef struct sk_imagefilter_croprect_t sk_imagefilter_croprect_t;
258 /**
259    A sk_typeface_t pecifies the typeface and intrinsic style of a font.
260     This is used in the paint, along with optionally algorithmic settings like
261     textSize, textSkewX, textScaleX, kFakeBoldText_Mask, to specify
262     how text appears when drawn (and measured).
263
264     Typeface objects are immutable, and so they can be shared between threads.
265 */
266 typedef struct sk_typeface_t sk_typeface_t;
267 typedef uint32_t sk_font_table_tag_t;
268 /**
269  *  Abstraction layer directly on top of an image codec.
270  */
271 typedef struct sk_codec_t sk_codec_t;
272 typedef struct sk_colorspace_t sk_colorspace_t;
273 /**
274    Various stream types
275 */
276 typedef struct sk_stream_t sk_stream_t;
277 typedef struct sk_stream_filestream_t sk_stream_filestream_t;
278 typedef struct sk_stream_asset_t sk_stream_asset_t;
279 typedef struct sk_stream_memorystream_t sk_stream_memorystream_t;
280 typedef struct sk_stream_streamrewindable_t sk_stream_streamrewindable_t;
281 typedef struct sk_wstream_t sk_wstream_t;
282 typedef struct sk_wstream_filestream_t sk_wstream_filestream_t;
283 typedef struct sk_wstream_dynamicmemorystream_t sk_wstream_dynamicmemorystream_t;
284 /**
285    High-level API for creating a document-based canvas.
286 */
287 typedef struct sk_document_t sk_document_t;
288
289 typedef enum {
290     UTF8_ENCODING,
291     UTF16_ENCODING,
292     UTF32_ENCODING
293 } sk_encoding_t;
294
295 typedef enum {
296     POINTS_SK_POINT_MODE,
297     LINES_SK_POINT_MODE,
298     POLYGON_SK_POINT_MODE
299 } sk_point_mode_t;
300
301 typedef enum {
302     LEFT_SK_TEXT_ALIGN,
303     CENTER_SK_TEXT_ALIGN,
304     RIGHT_SK_TEXT_ALIGN
305 } sk_text_align_t;
306
307 typedef enum {
308     UTF8_SK_TEXT_ENCODING,
309     UTF16_SK_TEXT_ENCODING,
310     UTF32_SK_TEXT_ENCODING,
311     GLYPH_ID_SK_TEXT_ENCODING
312 } sk_text_encoding_t;
313
314 typedef enum {
315     WINDING_SK_PATH_FILLTYPE,
316     EVENODD_SK_PATH_FILLTYPE,
317     INVERSE_WINDING_SK_PATH_FILLTYPE,
318     INVERSE_EVENODD_SK_PATH_FILLTYPE,
319 } sk_path_filltype_t;
320
321 typedef enum {
322     NORMAL_TYPEFACE_STYLE      = 0,
323     BOLD_TYPEFACE_STYLE        = 0x01,
324     ITALIC_TYPEFACE_STYLE      = 0x02,
325     BOLD_ITALIC_TYPEFACE_STYLE = 0x03
326 } sk_typeface_style_t;
327
328 typedef enum {
329     UPRIGHT_SK_FONT_STYLE_SLANT = 0,
330     ITALIC_SK_FONT_STYLE_SLANT  = 1,
331     OBLIQUE_SK_FONT_STYLE_SLANT = 2,
332 } sk_font_style_slant_t;
333
334 typedef enum {
335     NONE_SK_FILTER_QUALITY,
336     LOW_SK_FILTER_QUALITY,
337     MEDIUM_SK_FILTER_QUALITY,
338     HIGH_SK_FILTER_QUALITY
339 } sk_filter_quality_t;
340
341 typedef enum {
342     HAS_LEFT_SK_CROP_RECT_FLAG   = 0x01,
343     HAS_TOP_SK_CROP_RECT_FLAG    = 0x02,
344     HAS_WIDTH_SK_CROP_RECT_FLAG  = 0x04,
345     HAS_HEIGHT_SK_CROP_RECT_FLAG = 0x08,
346     HAS_ALL_SK_CROP_RECT_FLAG    = 0x0F,
347 } sk_crop_rect_flags_t;
348
349 typedef enum {
350     DRAW_SHADOW_AND_FOREGROUND_SK_DROP_SHADOW_IMAGE_FILTER_SHADOW_MODE,
351     DRAW_SHADOW_ONLY_SK_DROP_SHADOW_IMAGE_FILTER_SHADOW_MODE,
352 } sk_drop_shadow_image_filter_shadow_mode_t;
353
354 typedef enum {
355     UNKNOWN_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
356     R_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
357     G_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
358     B_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
359     A_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
360 } sk_displacement_map_effect_channel_selector_type_t;
361
362 typedef enum {
363     UNKNOWN_SK_IMAGE_ENCODER_TYPE,
364     BMP_SK_IMAGE_ENCODER_TYPE,
365     GIF_SK_IMAGE_ENCODER_TYPE,
366     ICO_SK_IMAGE_ENCODER_TYPE,
367     JPEG_SK_IMAGE_ENCODER_TYPE,
368     PNG_SK_IMAGE_ENCODER_TYPE,
369     WBMP_SK_IMAGE_ENCODER_TYPE,
370     WEBP_SK_IMAGE_ENCODER_TYPE,
371     KTX_SK_IMAGE_ENCODER_TYPE,
372 } sk_image_encoder_t;
373
374 typedef enum {
375     CLAMP_SK_MATRIX_CONVOLUTION_TILEMODE,
376     REPEAT_SK_MATRIX_CONVOLUTION_TILEMODE,
377     CLAMP_TO_BLACK_SK_MATRIX_CONVOLUTION_TILEMODE,
378 } sk_matrix_convolution_tilemode_t;
379
380 /**
381     The logical operations that can be performed when combining two regions.
382 */
383 typedef enum {
384     DIFFERENCE_SK_REGION_OP,          //!< subtract the op region from the first region
385     INTERSECT_SK_REGION_OP,           //!< intersect the two regions
386     UNION_SK_REGION_OP,               //!< union (inclusive-or) the two regions
387     XOR_SK_REGION_OP,                 //!< exclusive-or the two regions
388     REVERSE_DIFFERENCE_SK_REGION_OP,  //!< subtract the first region from the op region
389     REPLACE_SK_REGION_OP,             //!< replace the dst region with the op region
390 } sk_region_op_t;
391
392 /**
393  *  Enum describing format of encoded data.
394  */
395 typedef enum {
396     UNKNOWN_SK_ENCODED_FORMAT,
397     BMP_SK_ENCODED_FORMAT,
398     GIF_SK_ENCODED_FORMAT,
399     ICO_SK_ENCODED_FORMAT,
400     JPEG_SK_ENCODED_FORMAT,
401     PNG_SK_ENCODED_FORMAT,
402     WBMP_SK_ENCODED_FORMAT,
403     WEBP_SK_ENCODED_FORMAT,
404     PKM_SK_ENCODED_FORMAT,
405     KTX_SK_ENCODED_FORMAT,
406     ASTC_SK_ENCODED_FORMAT,
407     DNG_SK_ENCODED_FORMAT
408 } sk_encoded_format_t;
409
410 typedef enum {
411     TOP_LEFT_SK_CODEC_ORIGIN     = 1, // Default
412     TOP_RIGHT_SK_CODEC_ORIGIN    = 2, // Reflected across y-axis
413     BOTTOM_RIGHT_SK_CODEC_ORIGIN = 3, // Rotated 180
414     BOTTOM_LEFT_SK_CODEC_ORIGIN  = 4, // Reflected across x-axis
415     LEFT_TOP_SK_CODEC_ORIGIN     = 5, // Reflected across x-axis, Rotated 90 CCW
416     RIGHT_TOP_SK_CODEC_ORIGIN    = 6, // Rotated 90 CW
417     RIGHT_BOTTOM_SK_CODEC_ORIGIN = 7, // Reflected across x-axis, Rotated 90 CW
418     LEFT_BOTTOM_SK_CODEC_ORIGIN  = 8, // Rotated 90 CCW
419 } sk_codec_origin_t;
420
421 typedef enum {
422     SUCCESS_SK_CODEC_RESULT,
423     INCOMPLETE_INPUT_SK_CODEC_RESULT,
424     INVALID_CONVERSION_SK_CODEC_RESULT,
425     INVALID_SCALE_SK_CODEC_RESULT,
426     INVALID_PARAMETERS_SK_CODEC_RESULT,
427     INVALID_INPUT_SK_CODEC_RESULT,
428     COULD_NOT_REWIND_SK_CODEC_RESULT,
429     UNIMPLEMENTED_SK_CODEC_RESULT,
430 } sk_codec_result_t;
431
432 typedef enum {
433     YES_SK_CODEC_ZERO_INITIALIZED,
434     NO_SK_CODEC_ZERO_INITIALIZED,
435 } sk_codec_zero_initialized_t;
436
437 typedef struct {
438     sk_codec_zero_initialized_t fZeroInitialized;
439     sk_irect_t fSubset;
440     bool fHasSubset;
441 } sk_codec_options_t;
442
443 // The verbs that can be foudn on a path
444 typedef enum {
445     MOVE_SK_PATH_VERB,
446     LINE_SK_PATH_VERB,
447     QUAD_SK_PATH_VERB,
448     CONIC_SK_PATH_VERB,
449     CUBIC_SK_PATH_VERB,
450     CLOSE_SK_PATH_VERB,
451     DONE_SK_PATH_VERB
452 } sk_path_verb_t;
453
454 typedef struct sk_path_iterator_t sk_path_iterator_t;
455 typedef struct sk_path_rawiterator_t sk_path_rawiterator_t;
456
457 typedef enum {
458     APPEND_SK_PATH_ADD_MODE,
459     EXTEND_SK_PATH_ADD_MODE,
460 } sk_path_add_mode_t;
461
462 typedef enum {
463     TRANSLATE_SK_PATH_EFFECT_1D_STYLE,
464     ROTATE_SK_PATH_EFFECT_1D_STYLE,
465     MORPH_SK_PATH_EFFECT_1D_STYLE,
466 } sk_path_effect_1d_style_t;
467
468 typedef struct sk_path_effect_t sk_path_effect_t;  
469
470 typedef enum {
471     BUTT_SK_STROKE_CAP,
472     ROUND_SK_STROKE_CAP,
473     SQUARE_SK_STROKE_CAP
474 } sk_stroke_cap_t;
475
476 typedef enum {
477     MITER_SK_STROKE_JOIN,
478     ROUND_SK_STROKE_JOIN,
479     BEVEL_SK_STROKE_JOIN
480 } sk_stroke_join_t;
481
482 typedef enum {
483     CLAMP_SK_SHADER_TILEMODE,
484     REPEAT_SK_SHADER_TILEMODE,
485     MIRROR_SK_SHADER_TILEMODE,
486 } sk_shader_tilemode_t;
487
488 typedef enum {
489     NORMAL_SK_BLUR_STYLE,   //!< fuzzy inside and outside
490     SOLID_SK_BLUR_STYLE,    //!< solid inside, fuzzy outside
491     OUTER_SK_BLUR_STYLE,    //!< nothing inside, fuzzy outside
492     INNER_SK_BLUR_STYLE,    //!< fuzzy inside, nothing outside
493 } sk_blurstyle_t;
494
495 typedef enum {
496     CW_SK_PATH_DIRECTION,
497     CCW_SK_PATH_DIRECTION,
498 } sk_path_direction_t;
499
500 typedef enum {
501     SMALL_SK_PATH_ARC_SIZE,
502     LARGE_SK_PATH_ARC_SIZE,
503 } sk_path_arc_size_t;
504
505 typedef struct sk_colortable_t sk_colortable_t;
506
507 typedef struct sk_pixelref_factory_t sk_pixelref_factory_t;
508
509 SK_C_PLUS_PLUS_END_GUARD
510
511 #endif