2 * Copyright 2014 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 // EXPERIMENTAL EXPERIMENTAL EXPERIMENTAL EXPERIMENTAL
9 // DO NOT USE -- FOR INTERNAL TESTING ONLY
11 #ifndef sk_types_DEFINED
12 #define sk_types_DEFINED
18 #define SK_C_PLUS_PLUS_BEGIN_GUARD extern "C" {
19 #define SK_C_PLUS_PLUS_END_GUARD }
22 #define SK_C_PLUS_PLUS_BEGIN_GUARD
23 #define SK_C_PLUS_PLUS_END_GUARD
29 #if SKIA_IMPLEMENTATION
30 #define SK_API __declspec(dllexport)
32 #define SK_API __declspec(dllimport)
35 #define SK_API __attribute__((visibility("default")))
42 ///////////////////////////////////////////////////////////////////////////////////////
44 SK_C_PLUS_PLUS_BEGIN_GUARD
46 typedef uint32_t sk_color_t;
48 /* This macro assumes all arguments are >=0 and <=255. */
49 #define sk_color_set_argb(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
50 #define sk_color_get_a(c) (((c) >> 24) & 0xFF)
51 #define sk_color_get_r(c) (((c) >> 16) & 0xFF)
52 #define sk_color_get_g(c) (((c) >> 8) & 0xFF)
53 #define sk_color_get_b(c) (((c) >> 0) & 0xFF)
56 UNKNOWN_SK_COLORTYPE = 0,
59 ARGB_4444_SK_COLORTYPE,
60 RGBA_8888_SK_COLORTYPE,
61 BGRA_8888_SK_COLORTYPE,
64 RGBA_F16_SK_COLORTYPE,
71 UNPREMUL_SK_ALPHATYPE,
75 UNKNOWN_SK_PIXELGEOMETRY,
76 RGB_H_SK_PIXELGEOMETRY,
77 BGR_H_SK_PIXELGEOMETRY,
78 RGB_V_SK_PIXELGEOMETRY,
79 BGR_V_SK_PIXELGEOMETRY,
85 sk_colortype_t colorType;
86 sk_alphatype_t alphaType;
90 USE_DEVICE_INDEPENDENT_FONTS_GR_SURFACE_PROPS_FLAGS = 1 << 0,
91 } sk_surfaceprops_flags_t;
94 sk_pixelgeometry_t pixelGeometry;
95 sk_surfaceprops_flags_t flags;
103 typedef sk_point_t sk_vector_t;
124 A sk_canvas_t encapsulates all of the state about drawing into a
125 destination This includes a reference to the destination itself,
126 and a stack of matrix/clip values.
128 typedef struct sk_canvas_t sk_canvas_t;
130 A sk_data_ holds an immutable data buffer.
132 typedef struct sk_data_t sk_data_t;
134 A sk_image_t is an abstraction for drawing a rectagle of pixels.
135 The content of the image is always immutable, though the actual
136 storage may change, if for example that image can be re-created via
137 encoded data or other means.
139 typedef struct sk_image_t sk_image_t;
141 A sk_maskfilter_t is an object that perform transformations on an
142 alpha-channel mask before drawing it; it may be installed into a
143 sk_paint_t. Each time a primitive is drawn, it is first
144 scan-converted into a alpha mask, which os handed to the
145 maskfilter, which may create a new mask is to render into the
148 typedef struct sk_maskfilter_t sk_maskfilter_t;
150 A sk_paint_t holds the style and color information about how to
151 draw geometries, text and bitmaps.
153 typedef struct sk_paint_t sk_paint_t;
155 A sk_path_t encapsulates compound (multiple contour) geometric
156 paths consisting of straight line segments, quadratic curves, and
159 typedef struct sk_path_t sk_path_t;
161 A sk_picture_t holds recorded canvas drawing commands to be played
162 back at a later time.
164 typedef struct sk_picture_t sk_picture_t;
166 A sk_picture_recorder_t holds a sk_canvas_t that records commands
167 to create a sk_picture_t.
169 typedef struct sk_picture_recorder_t sk_picture_recorder_t;
171 A sk_shader_t specifies the source color(s) for what is being drawn. If a
172 paint has no shader, then the paint's color is used. If the paint
173 has a shader, then the shader's color(s) are use instead, but they
174 are modulated by the paint's alpha.
176 typedef struct sk_shader_t sk_shader_t;
178 A sk_surface_t holds the destination for drawing to a canvas. For
179 raster drawing, the destination is an array of pixels in memory.
180 For GPU drawing, the destination is a texture or a framebuffer.
182 typedef struct sk_surface_t sk_surface_t;
184 The sk_region encapsulates the geometric region used to specify
185 clipping areas for drawing.
187 typedef struct sk_region_t sk_region_t;
193 SRCOVER_SK_BLENDMODE,
194 DSTOVER_SK_BLENDMODE,
199 SRCATOP_SK_BLENDMODE,
200 DSTATOP_SK_BLENDMODE,
203 MODULATE_SK_BLENDMODE,
205 OVERLAY_SK_BLENDMODE,
207 LIGHTEN_SK_BLENDMODE,
208 COLORDODGE_SK_BLENDMODE,
209 COLORBURN_SK_BLENDMODE,
210 HARDLIGHT_SK_BLENDMODE,
211 SOFTLIGHT_SK_BLENDMODE,
212 DIFFERENCE_SK_BLENDMODE,
213 EXCLUSION_SK_BLENDMODE,
214 MULTIPLY_SK_BLENDMODE,
216 SATURATION_SK_BLENDMODE,
218 LUMINOSITY_SK_BLENDMODE,
221 //////////////////////////////////////////////////////////////////////////////////////////
245 uint32_t fFlags; // Bit field to identify which values are unknown
246 float fTop; // The greatest distance above the baseline for any glyph (will be <= 0)
247 float fAscent; // The recommended distance above the baseline (will be <= 0)
248 float fDescent; // The recommended distance below the baseline (will be >= 0)
249 float fBottom; // The greatest distance below the baseline for any glyph (will be >= 0)
250 float fLeading; // The recommended distance to add between lines of text (will be >= 0)
251 float fAvgCharWidth; // the average character width (>= 0)
252 float fMaxCharWidth; // the max character width (>= 0)
253 float fXMin; // The minimum bounding box x value for all glyphs
254 float fXMax; // The maximum bounding box x value for all glyphs
255 float fXHeight; // The height of an 'x' in px, or 0 if no 'x' in face
256 float fCapHeight; // The cap height (> 0), or 0 if cannot be determined.
257 float fUnderlineThickness; // underline thickness, or 0 if cannot be determined
258 float fUnderlinePosition; // underline position, or 0 if cannot be determined
261 // Flags for fFlags member of sk_fontmetrics_t
262 #define FONTMETRICS_FLAGS_UNDERLINE_THICKNESS_IS_VALID (1U << 0)
263 #define FONTMETRICS_FLAGS_UNDERLINE_POSITION_IS_VALID (1U << 1)
266 A lightweight managed string.
268 typedef struct sk_string_t sk_string_t;
271 A sk_bitmap_t is an abstraction that specifies a raster bitmap.
273 typedef struct sk_bitmap_t sk_bitmap_t;
274 typedef struct sk_colorfilter_t sk_colorfilter_t;
275 typedef struct sk_imagefilter_t sk_imagefilter_t;
276 typedef struct sk_imagefilter_croprect_t sk_imagefilter_croprect_t;
278 A sk_typeface_t pecifies the typeface and intrinsic style of a font.
279 This is used in the paint, along with optionally algorithmic settings like
280 textSize, textSkewX, textScaleX, kFakeBoldText_Mask, to specify
281 how text appears when drawn (and measured).
283 Typeface objects are immutable, and so they can be shared between threads.
285 typedef struct sk_typeface_t sk_typeface_t;
286 typedef uint32_t sk_font_table_tag_t;
288 * Abstraction layer directly on top of an image codec.
290 typedef struct sk_codec_t sk_codec_t;
291 typedef struct sk_colorspace_t sk_colorspace_t;
295 typedef struct sk_stream_t sk_stream_t;
296 typedef struct sk_stream_filestream_t sk_stream_filestream_t;
297 typedef struct sk_stream_asset_t sk_stream_asset_t;
298 typedef struct sk_stream_memorystream_t sk_stream_memorystream_t;
299 typedef struct sk_stream_streamrewindable_t sk_stream_streamrewindable_t;
300 typedef struct sk_wstream_t sk_wstream_t;
301 typedef struct sk_wstream_filestream_t sk_wstream_filestream_t;
302 typedef struct sk_wstream_dynamicmemorystream_t sk_wstream_dynamicmemorystream_t;
304 High-level API for creating a document-based canvas.
306 typedef struct sk_document_t sk_document_t;
315 POINTS_SK_POINT_MODE,
317 POLYGON_SK_POINT_MODE
322 CENTER_SK_TEXT_ALIGN,
327 UTF8_SK_TEXT_ENCODING,
328 UTF16_SK_TEXT_ENCODING,
329 UTF32_SK_TEXT_ENCODING,
330 GLYPH_ID_SK_TEXT_ENCODING
331 } sk_text_encoding_t;
334 WINDING_SK_PATH_FILLTYPE,
335 EVENODD_SK_PATH_FILLTYPE,
336 INVERSE_WINDING_SK_PATH_FILLTYPE,
337 INVERSE_EVENODD_SK_PATH_FILLTYPE,
338 } sk_path_filltype_t;
341 NORMAL_TYPEFACE_STYLE = 0,
342 BOLD_TYPEFACE_STYLE = 0x01,
343 ITALIC_TYPEFACE_STYLE = 0x02,
344 BOLD_ITALIC_TYPEFACE_STYLE = 0x03
345 } sk_typeface_style_t;
348 UPRIGHT_SK_FONT_STYLE_SLANT = 0,
349 ITALIC_SK_FONT_STYLE_SLANT = 1,
350 OBLIQUE_SK_FONT_STYLE_SLANT = 2,
351 } sk_font_style_slant_t;
354 NONE_SK_FILTER_QUALITY,
355 LOW_SK_FILTER_QUALITY,
356 MEDIUM_SK_FILTER_QUALITY,
357 HIGH_SK_FILTER_QUALITY
358 } sk_filter_quality_t;
361 HAS_LEFT_SK_CROP_RECT_FLAG = 0x01,
362 HAS_TOP_SK_CROP_RECT_FLAG = 0x02,
363 HAS_WIDTH_SK_CROP_RECT_FLAG = 0x04,
364 HAS_HEIGHT_SK_CROP_RECT_FLAG = 0x08,
365 HAS_ALL_SK_CROP_RECT_FLAG = 0x0F,
366 } sk_crop_rect_flags_t;
369 DRAW_SHADOW_AND_FOREGROUND_SK_DROP_SHADOW_IMAGE_FILTER_SHADOW_MODE,
370 DRAW_SHADOW_ONLY_SK_DROP_SHADOW_IMAGE_FILTER_SHADOW_MODE,
371 } sk_drop_shadow_image_filter_shadow_mode_t;
374 UNKNOWN_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
375 R_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
376 G_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
377 B_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
378 A_SK_DISPLACEMENT_MAP_EFFECT_CHANNEL_SELECTOR_TYPE,
379 } sk_displacement_map_effect_channel_selector_type_t;
382 UNKNOWN_SK_IMAGE_ENCODER_TYPE,
383 BMP_SK_IMAGE_ENCODER_TYPE,
384 GIF_SK_IMAGE_ENCODER_TYPE,
385 ICO_SK_IMAGE_ENCODER_TYPE,
386 JPEG_SK_IMAGE_ENCODER_TYPE,
387 PNG_SK_IMAGE_ENCODER_TYPE,
388 WBMP_SK_IMAGE_ENCODER_TYPE,
389 WEBP_SK_IMAGE_ENCODER_TYPE,
390 KTX_SK_IMAGE_ENCODER_TYPE,
391 } sk_image_encoder_t;
394 CLAMP_SK_MATRIX_CONVOLUTION_TILEMODE,
395 REPEAT_SK_MATRIX_CONVOLUTION_TILEMODE,
396 CLAMP_TO_BLACK_SK_MATRIX_CONVOLUTION_TILEMODE,
397 } sk_matrix_convolution_tilemode_t;
400 The logical operations that can be performed when combining two regions.
403 DIFFERENCE_SK_REGION_OP, //!< subtract the op region from the first region
404 INTERSECT_SK_REGION_OP, //!< intersect the two regions
405 UNION_SK_REGION_OP, //!< union (inclusive-or) the two regions
406 XOR_SK_REGION_OP, //!< exclusive-or the two regions
407 REVERSE_DIFFERENCE_SK_REGION_OP, //!< subtract the first region from the op region
408 REPLACE_SK_REGION_OP, //!< replace the dst region with the op region
412 DIFFERENCE_SK_CLIPOP,
417 * Enum describing format of encoded data.
420 UNKNOWN_SK_ENCODED_FORMAT,
421 BMP_SK_ENCODED_FORMAT,
422 GIF_SK_ENCODED_FORMAT,
423 ICO_SK_ENCODED_FORMAT,
424 JPEG_SK_ENCODED_FORMAT,
425 PNG_SK_ENCODED_FORMAT,
426 WBMP_SK_ENCODED_FORMAT,
427 WEBP_SK_ENCODED_FORMAT,
428 PKM_SK_ENCODED_FORMAT,
429 KTX_SK_ENCODED_FORMAT,
430 ASTC_SK_ENCODED_FORMAT,
431 DNG_SK_ENCODED_FORMAT
432 } sk_encoded_format_t;
435 TOP_LEFT_SK_CODEC_ORIGIN = 1, // Default
436 TOP_RIGHT_SK_CODEC_ORIGIN = 2, // Reflected across y-axis
437 BOTTOM_RIGHT_SK_CODEC_ORIGIN = 3, // Rotated 180
438 BOTTOM_LEFT_SK_CODEC_ORIGIN = 4, // Reflected across x-axis
439 LEFT_TOP_SK_CODEC_ORIGIN = 5, // Reflected across x-axis, Rotated 90 CCW
440 RIGHT_TOP_SK_CODEC_ORIGIN = 6, // Rotated 90 CW
441 RIGHT_BOTTOM_SK_CODEC_ORIGIN = 7, // Reflected across x-axis, Rotated 90 CW
442 LEFT_BOTTOM_SK_CODEC_ORIGIN = 8, // Rotated 90 CCW
446 SUCCESS_SK_CODEC_RESULT,
447 INCOMPLETE_INPUT_SK_CODEC_RESULT,
448 INVALID_CONVERSION_SK_CODEC_RESULT,
449 INVALID_SCALE_SK_CODEC_RESULT,
450 INVALID_PARAMETERS_SK_CODEC_RESULT,
451 INVALID_INPUT_SK_CODEC_RESULT,
452 COULD_NOT_REWIND_SK_CODEC_RESULT,
453 UNIMPLEMENTED_SK_CODEC_RESULT,
457 YES_SK_CODEC_ZERO_INITIALIZED,
458 NO_SK_CODEC_ZERO_INITIALIZED,
459 } sk_codec_zero_initialized_t;
462 sk_codec_zero_initialized_t fZeroInitialized;
466 } sk_codec_options_t;
468 // The verbs that can be foudn on a path
479 typedef struct sk_path_iterator_t sk_path_iterator_t;
480 typedef struct sk_path_rawiterator_t sk_path_rawiterator_t;
483 APPEND_SK_PATH_ADD_MODE,
484 EXTEND_SK_PATH_ADD_MODE,
485 } sk_path_add_mode_t;
488 TRANSLATE_SK_PATH_EFFECT_1D_STYLE,
489 ROTATE_SK_PATH_EFFECT_1D_STYLE,
490 MORPH_SK_PATH_EFFECT_1D_STYLE,
491 } sk_path_effect_1d_style_t;
493 typedef struct sk_path_effect_t sk_path_effect_t;
502 MITER_SK_STROKE_JOIN,
503 ROUND_SK_STROKE_JOIN,
508 CLAMP_SK_SHADER_TILEMODE,
509 REPEAT_SK_SHADER_TILEMODE,
510 MIRROR_SK_SHADER_TILEMODE,
511 } sk_shader_tilemode_t;
514 NORMAL_SK_BLUR_STYLE, //!< fuzzy inside and outside
515 SOLID_SK_BLUR_STYLE, //!< solid inside, fuzzy outside
516 OUTER_SK_BLUR_STYLE, //!< nothing inside, fuzzy outside
517 INNER_SK_BLUR_STYLE, //!< fuzzy inside, nothing outside
521 CW_SK_PATH_DIRECTION,
522 CCW_SK_PATH_DIRECTION,
523 } sk_path_direction_t;
526 SMALL_SK_PATH_ARC_SIZE,
527 LARGE_SK_PATH_ARC_SIZE,
528 } sk_path_arc_size_t;
532 STROKE_SK_PAINT_STYLE,
533 STROKE_AND_FILL_SK_PAINT_STYLE,
537 NO_HINTING_SK_PAINT_HINTING,
538 SLIGHT_HINTING_SK_PAINT_HINTING,
539 NORMAL_HINTING_SK_PAINT_HINTING,
540 FULL_HINTING_SK_PAINT_HINTING,
541 } sk_paint_hinting_t;
543 typedef struct sk_colortable_t sk_colortable_t;
545 typedef struct sk_pixelref_factory_t sk_pixelref_factory_t;
548 TOP_LEFT_GR_SURFACE_ORIGIN = 1,
549 BOTTOM_LEFT_GR_SURFACE_ORIGIN,
550 } gr_surfaceorigin_t;
553 UNKNOWN_GR_PIXEL_CONFIG,
554 ALPHA_8_GR_PIXEL_CONFIG,
555 INDEX_8_GR_PIXEL_CONFIG,
556 RGB_565_GR_PIXEL_CONFIG,
557 RGBA_4444_GR_PIXEL_CONFIG,
558 RGBA_8888_GR_PIXEL_CONFIG,
559 BGRA_8888_GR_PIXEL_CONFIG,
560 SRGBA_8888_GR_PIXEL_CONFIG,
561 SBGRA_8888_GR_PIXEL_CONFIG,
562 RGBA_8888_SINT_GR_PIXEL_CONFIG,
563 ETC1_GR_PIXEL_CONFIG,
564 LATC_GR_PIXEL_CONFIG,
565 R11_EAC_GR_PIXEL_CONFIG,
566 ASTC_12X12_GR_PIXEL_CONFIG,
567 RGBA_FLOAT_GR_PIXEL_CONFIG,
568 ALPHA_HALF_GR_PIXEL_CONFIG,
569 RGBA_HALF_GR_PIXEL_CONFIG,
573 NONE_GR_CONTEXT_FLUSHBITS = 0,
574 DISCARD_GR_CONTEXT_FLUSHBITS = 0x2,
575 } gr_context_flushbits_t;
577 typedef intptr_t gr_backendobject_t;
582 gr_pixelconfig_t fConfig;
583 gr_surfaceorigin_t fOrigin;
586 gr_backendobject_t fRenderTargetHandle;
587 } gr_backend_rendertarget_desc_t;
590 NONE_GR_BACKEND_TEXTURE_FLAGS = 0,
591 RENDER_TARGET_GR_BACKEND_TEXTURE_FLAGS = 1,
592 } gr_backendtexture_flags_t;
595 gr_backendtexture_flags_t fFlags;
596 gr_surfaceorigin_t fOrigin;
599 gr_pixelconfig_t fConfig;
601 gr_backendobject_t fTextureHandle;
602 } gr_backend_texture_desc_t;
604 typedef struct gr_context_t gr_context_t;
607 bool fSuppressPrints;
608 int fMaxTextureSizeOverride;
609 int fMaxTileSizeOverride;
610 bool fSuppressDualSourceBlending;
611 int fBufferMapThreshold;
612 bool fUseDrawInsteadOfPartialRenderTargetWrite;
614 bool fClipBatchToBounds;
615 bool fDrawBatchBounds;
616 int fMaxBatchLookback;
617 int fMaxBatchLookahead;
618 bool fUseShaderSwizzling;
619 bool fDoManualMipmapping;
620 } gr_context_options_t;
627 typedef intptr_t gr_backendcontext_t;
629 typedef struct gr_glinterface_t gr_glinterface_t;
631 typedef void (*gr_gl_func_ptr)();
632 typedef gr_gl_func_ptr (*gr_gl_get_proc)(void* ctx, const char* name);
635 DIFFERENCE_SK_PATHOP,
639 REVERSE_DIFFERENCE_SK_PATHOP,
642 typedef struct sk_opbuilder_t sk_opbuilder_t;
645 UNKNOWN_SK_PATH_CONVEXITY,
646 CONVEX_SK_PATH_CONVEXITY,
647 CONCAVE_SK_PATH_CONVEXITY,
648 } sk_path_convexity_t;
651 DEFAULT_SK_LATTICE_FLAGS,
652 TRANSPARENT_SK_LATTICE_FLAGS = 1 << 0,
653 } sk_lattice_flags_t;
658 const sk_lattice_flags_t* fFlags;
661 const sk_irect_t* fBounds;
664 typedef struct sk_pathmeasure_t sk_pathmeasure_t;
667 GET_POSITION_SK_PATHMEASURE_MATRIXFLAGS = 0x01,
668 GET_TANGENT_SK_PATHMEASURE_MATRIXFLAGS = 0x02,
669 GET_POS_AND_TAN_SK_PATHMEASURE_MATRIXFLAGS = GET_POSITION_SK_PATHMEASURE_MATRIXFLAGS | GET_TANGENT_SK_PATHMEASURE_MATRIXFLAGS,
670 } sk_pathmeasure_matrixflags_t;
672 typedef void (*sk_bitmap_release_proc)(void* addr, void* context);
674 SK_C_PLUS_PLUS_END_GUARD