path.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. // Copyright (C) 2004-2021 Artifex Software, Inc.
  2. //
  3. // This file is part of MuPDF.
  4. //
  5. // MuPDF is free software: you can redistribute it and/or modify it under the
  6. // terms of the GNU Affero General Public License as published by the Free
  7. // Software Foundation, either version 3 of the License, or (at your option)
  8. // any later version.
  9. //
  10. // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
  11. // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  12. // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  13. // details.
  14. //
  15. // You should have received a copy of the GNU Affero General Public License
  16. // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
  17. //
  18. // Alternative licensing terms are available from the licensor.
  19. // For commercial licensing, see <https://www.artifex.com/> or contact
  20. // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
  21. // CA 94129, USA, for further information.
  22. /* Path interface */
  23. JNIEXPORT void JNICALL
  24. FUN(Path_finalize)(JNIEnv *env, jobject self)
  25. {
  26. fz_context *ctx = get_context(env);
  27. fz_path *path = from_Path_safe(env, self);
  28. if (!ctx || !path) return;
  29. (*env)->SetLongField(env, self, fid_Path_pointer, 0);
  30. fz_drop_path(ctx, path);
  31. }
  32. JNIEXPORT jlong JNICALL
  33. FUN(Path_newNative)(JNIEnv *env, jobject self)
  34. {
  35. fz_context *ctx = get_context(env);
  36. fz_path *path = NULL;
  37. if (!ctx) return 0;
  38. fz_try(ctx)
  39. path = fz_new_path(ctx);
  40. fz_catch(ctx)
  41. jni_rethrow(env, ctx);
  42. return jlong_cast(path);
  43. }
  44. JNIEXPORT jobject JNICALL
  45. FUN(Path_currentPoint)(JNIEnv *env, jobject self)
  46. {
  47. fz_context *ctx = get_context(env);
  48. fz_path *path = from_Path(env, self);
  49. fz_point point;
  50. if (!ctx || !path) return NULL;
  51. fz_try(ctx)
  52. point = fz_currentpoint(ctx, path);
  53. fz_catch(ctx)
  54. jni_rethrow(env, ctx);
  55. return to_Point_safe(ctx, env, point);
  56. }
  57. JNIEXPORT void JNICALL
  58. FUN(Path_moveTo)(JNIEnv *env, jobject self, jfloat x, jfloat y)
  59. {
  60. fz_context *ctx = get_context(env);
  61. fz_path *path = from_Path(env, self);
  62. if (!ctx || !path) return;
  63. fz_try(ctx)
  64. fz_moveto(ctx, path, x, y);
  65. fz_catch(ctx)
  66. jni_rethrow_void(env, ctx);
  67. }
  68. JNIEXPORT void JNICALL
  69. FUN(Path_lineTo)(JNIEnv *env, jobject self, jfloat x, jfloat y)
  70. {
  71. fz_context *ctx = get_context(env);
  72. fz_path *path = from_Path(env, self);
  73. if (!ctx || !path) return;
  74. fz_try(ctx)
  75. fz_lineto(ctx, path, x, y);
  76. fz_catch(ctx)
  77. jni_rethrow_void(env, ctx);
  78. }
  79. JNIEXPORT void JNICALL
  80. FUN(Path_curveTo)(JNIEnv *env, jobject self, jfloat cx1, jfloat cy1, jfloat cx2, jfloat cy2, jfloat ex, jfloat ey)
  81. {
  82. fz_context *ctx = get_context(env);
  83. fz_path *path = from_Path(env, self);
  84. if (!ctx || !path) return;
  85. fz_try(ctx)
  86. fz_curveto(ctx, path, cx1, cy1, cx2, cy2, ex, ey);
  87. fz_catch(ctx)
  88. jni_rethrow_void(env, ctx);
  89. }
  90. JNIEXPORT void JNICALL
  91. FUN(Path_curveToV)(JNIEnv *env, jobject self, jfloat cx, jfloat cy, jfloat ex, jfloat ey)
  92. {
  93. fz_context *ctx = get_context(env);
  94. fz_path *path = from_Path(env, self);
  95. if (!ctx || !path) return;
  96. fz_try(ctx)
  97. fz_curvetov(ctx, path, cx, cy, ex, ey);
  98. fz_catch(ctx)
  99. jni_rethrow_void(env, ctx);
  100. }
  101. JNIEXPORT void JNICALL
  102. FUN(Path_curveToY)(JNIEnv *env, jobject self, jfloat cx, jfloat cy, jfloat ex, jfloat ey)
  103. {
  104. fz_context *ctx = get_context(env);
  105. fz_path *path = from_Path(env, self);
  106. if (!ctx || !path) return;
  107. fz_try(ctx)
  108. fz_curvetoy(ctx, path, cx, cy, ex, ey);
  109. fz_catch(ctx)
  110. jni_rethrow_void(env, ctx);
  111. }
  112. JNIEXPORT void JNICALL
  113. FUN(Path_rect)(JNIEnv *env, jobject self, jint x1, jint y1, jint x2, jint y2)
  114. {
  115. fz_context *ctx = get_context(env);
  116. fz_path *path = from_Path(env, self);
  117. if (!ctx || !path) return;
  118. fz_try(ctx)
  119. fz_rectto(ctx, path, x1, y1, x2, y2);
  120. fz_catch(ctx)
  121. jni_rethrow_void(env, ctx);
  122. }
  123. JNIEXPORT void JNICALL
  124. FUN(Path_closePath)(JNIEnv *env, jobject self)
  125. {
  126. fz_context *ctx = get_context(env);
  127. fz_path *path = from_Path(env, self);
  128. if (!ctx || !path) return;
  129. fz_try(ctx)
  130. fz_closepath(ctx, path);
  131. fz_catch(ctx)
  132. jni_rethrow_void(env, ctx);
  133. }
  134. JNIEXPORT void JNICALL
  135. FUN(Path_transform)(JNIEnv *env, jobject self, jobject jctm)
  136. {
  137. fz_context *ctx = get_context(env);
  138. fz_path *path = from_Path(env, self);
  139. fz_matrix ctm = from_Matrix(env, jctm);
  140. if (!ctx || !path) return;
  141. fz_try(ctx)
  142. fz_transform_path(ctx, path, ctm);
  143. fz_catch(ctx)
  144. jni_rethrow_void(env, ctx);
  145. }
  146. JNIEXPORT jlong JNICALL
  147. FUN(Path_cloneNative)(JNIEnv *env, jobject self)
  148. {
  149. fz_context *ctx = get_context(env);
  150. fz_path *old_path = from_Path(env, self);
  151. fz_path *new_path = NULL;
  152. if (!ctx || !old_path) return 0;
  153. fz_try(ctx)
  154. new_path = fz_clone_path(ctx, old_path);
  155. fz_catch(ctx)
  156. jni_rethrow(env, ctx);
  157. return jlong_cast(new_path);
  158. }
  159. JNIEXPORT jobject JNICALL
  160. FUN(Path_getBounds)(JNIEnv *env, jobject self, jobject jstroke, jobject jctm)
  161. {
  162. fz_context *ctx = get_context(env);
  163. fz_path *path = from_Path(env, self);
  164. fz_stroke_state *stroke = from_StrokeState(env, jstroke);
  165. fz_matrix ctm = from_Matrix(env, jctm);
  166. fz_rect rect;
  167. if (!ctx || !path) return NULL;
  168. if (!stroke) jni_throw_arg(env, "stroke must not be null");
  169. fz_try(ctx)
  170. rect = fz_bound_path(ctx, path, stroke, ctm);
  171. fz_catch(ctx)
  172. jni_rethrow(env, ctx);
  173. return to_Rect_safe(ctx, env, rect);
  174. }
  175. typedef struct
  176. {
  177. JNIEnv *env;
  178. jobject obj;
  179. } path_walker_state;
  180. static void
  181. pathWalkMoveTo(fz_context *ctx, void *arg, float x, float y)
  182. {
  183. path_walker_state *state = (path_walker_state *)arg;
  184. JNIEnv *env = state->env;
  185. (*env)->CallVoidMethod(env, state->obj, mid_PathWalker_moveTo, x, y);
  186. if ((*env)->ExceptionCheck(env))
  187. fz_throw_java(ctx, env);
  188. }
  189. static void
  190. pathWalkLineTo(fz_context *ctx, void *arg, float x, float y)
  191. {
  192. path_walker_state *state = (path_walker_state *)arg;
  193. JNIEnv *env = state->env;
  194. (*env)->CallVoidMethod(env, state->obj, mid_PathWalker_lineTo, x, y);
  195. if ((*env)->ExceptionCheck(env))
  196. fz_throw_java(ctx, env);
  197. }
  198. static void
  199. pathWalkCurveTo(fz_context *ctx, void *arg, float x1, float y1, float x2, float y2, float x3, float y3)
  200. {
  201. path_walker_state *state = (path_walker_state *)arg;
  202. JNIEnv *env = state->env;
  203. (*env)->CallVoidMethod(env, state->obj, mid_PathWalker_curveTo, x1, y1, x2, y2, x3, y3);
  204. if ((*env)->ExceptionCheck(env))
  205. fz_throw_java(ctx, env);
  206. }
  207. static void
  208. pathWalkClosePath(fz_context *ctx, void *arg)
  209. {
  210. path_walker_state *state = (path_walker_state *) arg;
  211. JNIEnv *env = state->env;
  212. (*env)->CallVoidMethod(env, state->obj, mid_PathWalker_closePath);
  213. if ((*env)->ExceptionCheck(env))
  214. fz_throw_java(ctx, env);
  215. }
  216. static const fz_path_walker java_path_walker =
  217. {
  218. pathWalkMoveTo,
  219. pathWalkLineTo,
  220. pathWalkCurveTo,
  221. pathWalkClosePath,
  222. NULL,
  223. NULL,
  224. NULL,
  225. NULL
  226. };
  227. JNIEXPORT void JNICALL
  228. FUN(Path_walk)(JNIEnv *env, jobject self, jobject obj)
  229. {
  230. fz_context *ctx = get_context(env);
  231. fz_path *path = from_Path(env, self);
  232. path_walker_state state;
  233. if (!ctx || !path) return;
  234. if (!obj) jni_throw_arg_void(env, "object must not be null");
  235. state.env = env;
  236. state.obj = obj;
  237. fz_try(ctx)
  238. fz_walk_path(ctx, path, &java_path_walker, &state);
  239. fz_catch(ctx)
  240. jni_rethrow_void(env, ctx);
  241. }