sk_paint.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /*
  2. * Copyright 2015 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. #include "include/core/SkBlendMode.h"
  8. #include "include/core/SkMaskFilter.h"
  9. #include "include/core/SkPaint.h"
  10. #include "include/core/SkShader.h"
  11. #include "include/c/sk_paint.h"
  12. #include "src/c/sk_types_priv.h"
  13. #define MAKE_FROM_TO_NAME(FROM) g_ ## FROM ## _map
  14. const struct {
  15. sk_stroke_cap_t fC;
  16. SkPaint::Cap fSK;
  17. } MAKE_FROM_TO_NAME(sk_stroke_cap_t)[] = {
  18. { BUTT_SK_STROKE_CAP, SkPaint::kButt_Cap },
  19. { ROUND_SK_STROKE_CAP, SkPaint::kRound_Cap },
  20. { SQUARE_SK_STROKE_CAP, SkPaint::kSquare_Cap },
  21. };
  22. const struct {
  23. sk_stroke_join_t fC;
  24. SkPaint::Join fSK;
  25. } MAKE_FROM_TO_NAME(sk_stroke_join_t)[] = {
  26. { MITER_SK_STROKE_JOIN, SkPaint::kMiter_Join },
  27. { ROUND_SK_STROKE_JOIN, SkPaint::kRound_Join },
  28. { BEVEL_SK_STROKE_JOIN, SkPaint::kBevel_Join },
  29. };
  30. #define CType sk_stroke_cap_t
  31. #define SKType SkPaint::Cap
  32. #define CTypeSkTypeMap MAKE_FROM_TO_NAME(sk_stroke_cap_t)
  33. #include "src/c/sk_c_from_to.h"
  34. #define CType sk_stroke_join_t
  35. #define SKType SkPaint::Join
  36. #define CTypeSkTypeMap MAKE_FROM_TO_NAME(sk_stroke_join_t)
  37. #include "src/c/sk_c_from_to.h"
  38. //////////////////////////////////////////////////////////////////////////////////////////////////
  39. sk_paint_t* sk_paint_new() { return (sk_paint_t*)new SkPaint; }
  40. void sk_paint_delete(sk_paint_t* cpaint) { delete AsPaint(cpaint); }
  41. bool sk_paint_is_antialias(const sk_paint_t* cpaint) {
  42. return AsPaint(*cpaint).isAntiAlias();
  43. }
  44. void sk_paint_set_antialias(sk_paint_t* cpaint, bool aa) {
  45. AsPaint(cpaint)->setAntiAlias(aa);
  46. }
  47. sk_color_t sk_paint_get_color(const sk_paint_t* cpaint) {
  48. return AsPaint(*cpaint).getColor();
  49. }
  50. void sk_paint_set_color(sk_paint_t* cpaint, sk_color_t c) {
  51. AsPaint(cpaint)->setColor(c);
  52. }
  53. void sk_paint_set_shader(sk_paint_t* cpaint, sk_shader_t* cshader) {
  54. AsPaint(cpaint)->setShader(sk_ref_sp(AsShader(cshader)));
  55. }
  56. void sk_paint_set_maskfilter(sk_paint_t* cpaint, sk_maskfilter_t* cfilter) {
  57. AsPaint(cpaint)->setMaskFilter(sk_ref_sp(AsMaskFilter(cfilter)));
  58. }
  59. bool sk_paint_is_stroke(const sk_paint_t* cpaint) {
  60. return AsPaint(*cpaint).getStyle() != SkPaint::kFill_Style;
  61. }
  62. void sk_paint_set_stroke(sk_paint_t* cpaint, bool doStroke) {
  63. AsPaint(cpaint)->setStyle(doStroke ? SkPaint::kStroke_Style : SkPaint::kFill_Style);
  64. }
  65. float sk_paint_get_stroke_width(const sk_paint_t* cpaint) {
  66. return AsPaint(*cpaint).getStrokeWidth();
  67. }
  68. void sk_paint_set_stroke_width(sk_paint_t* cpaint, float width) {
  69. AsPaint(cpaint)->setStrokeWidth(width);
  70. }
  71. float sk_paint_get_stroke_miter(const sk_paint_t* cpaint) {
  72. return AsPaint(*cpaint).getStrokeMiter();
  73. }
  74. void sk_paint_set_stroke_miter(sk_paint_t* cpaint, float miter) {
  75. AsPaint(cpaint)->setStrokeMiter(miter);
  76. }
  77. sk_stroke_cap_t sk_paint_get_stroke_cap(const sk_paint_t* cpaint) {
  78. sk_stroke_cap_t ccap;
  79. if (find_c(AsPaint(*cpaint).getStrokeCap(), &ccap)) {
  80. ccap = BUTT_SK_STROKE_CAP;
  81. }
  82. return ccap;
  83. }
  84. void sk_paint_set_stroke_cap(sk_paint_t* cpaint, sk_stroke_cap_t ccap) {
  85. SkPaint::Cap skcap;
  86. if (find_sk(ccap, &skcap)) {
  87. AsPaint(cpaint)->setStrokeCap(skcap);
  88. } else {
  89. // unknown ccap
  90. }
  91. }
  92. sk_stroke_join_t sk_paint_get_stroke_join(const sk_paint_t* cpaint) {
  93. sk_stroke_join_t cjoin;
  94. if (find_c(AsPaint(*cpaint).getStrokeJoin(), &cjoin)) {
  95. cjoin = MITER_SK_STROKE_JOIN;
  96. }
  97. return cjoin;
  98. }
  99. void sk_paint_set_stroke_join(sk_paint_t* cpaint, sk_stroke_join_t cjoin) {
  100. SkPaint::Join skjoin;
  101. if (find_sk(cjoin, &skjoin)) {
  102. AsPaint(cpaint)->setStrokeJoin(skjoin);
  103. } else {
  104. // unknown cjoin
  105. }
  106. }
  107. void sk_paint_set_xfermode_mode(sk_paint_t* paint, sk_xfermode_mode_t mode) {
  108. SkASSERT(paint);
  109. SkBlendMode skmode;
  110. switch (mode) {
  111. #define MAP(X, Y) case (X): skmode = (Y); break
  112. MAP( CLEAR_SK_XFERMODE_MODE, SkBlendMode::kClear );
  113. MAP( SRC_SK_XFERMODE_MODE, SkBlendMode::kSrc );
  114. MAP( DST_SK_XFERMODE_MODE, SkBlendMode::kDst );
  115. MAP( SRCOVER_SK_XFERMODE_MODE, SkBlendMode::kSrcOver );
  116. MAP( DSTOVER_SK_XFERMODE_MODE, SkBlendMode::kDstOver );
  117. MAP( SRCIN_SK_XFERMODE_MODE, SkBlendMode::kSrcIn );
  118. MAP( DSTIN_SK_XFERMODE_MODE, SkBlendMode::kDstIn );
  119. MAP( SRCOUT_SK_XFERMODE_MODE, SkBlendMode::kSrcOut );
  120. MAP( DSTOUT_SK_XFERMODE_MODE, SkBlendMode::kDstOut );
  121. MAP( SRCATOP_SK_XFERMODE_MODE, SkBlendMode::kSrcATop );
  122. MAP( DSTATOP_SK_XFERMODE_MODE, SkBlendMode::kDstATop );
  123. MAP( XOR_SK_XFERMODE_MODE, SkBlendMode::kXor );
  124. MAP( PLUS_SK_XFERMODE_MODE, SkBlendMode::kPlus );
  125. MAP( MODULATE_SK_XFERMODE_MODE, SkBlendMode::kModulate );
  126. MAP( SCREEN_SK_XFERMODE_MODE, SkBlendMode::kScreen );
  127. MAP( OVERLAY_SK_XFERMODE_MODE, SkBlendMode::kOverlay );
  128. MAP( DARKEN_SK_XFERMODE_MODE, SkBlendMode::kDarken );
  129. MAP( LIGHTEN_SK_XFERMODE_MODE, SkBlendMode::kLighten );
  130. MAP( COLORDODGE_SK_XFERMODE_MODE, SkBlendMode::kColorDodge );
  131. MAP( COLORBURN_SK_XFERMODE_MODE, SkBlendMode::kColorBurn );
  132. MAP( HARDLIGHT_SK_XFERMODE_MODE, SkBlendMode::kHardLight );
  133. MAP( SOFTLIGHT_SK_XFERMODE_MODE, SkBlendMode::kSoftLight );
  134. MAP( DIFFERENCE_SK_XFERMODE_MODE, SkBlendMode::kDifference );
  135. MAP( EXCLUSION_SK_XFERMODE_MODE, SkBlendMode::kExclusion );
  136. MAP( MULTIPLY_SK_XFERMODE_MODE, SkBlendMode::kMultiply );
  137. MAP( HUE_SK_XFERMODE_MODE, SkBlendMode::kHue );
  138. MAP( SATURATION_SK_XFERMODE_MODE, SkBlendMode::kSaturation );
  139. MAP( COLOR_SK_XFERMODE_MODE, SkBlendMode::kColor );
  140. MAP( LUMINOSITY_SK_XFERMODE_MODE, SkBlendMode::kLuminosity );
  141. #undef MAP
  142. default:
  143. return;
  144. }
  145. AsPaint(paint)->setBlendMode(skmode);
  146. }