/platform/unix/scaffold/graphics.d

http://github.com/wilkie/djehuty · D · 531 lines · 397 code · 104 blank · 30 comment · 4 complexity · 4c55372f1e3cf12f264b906a01fd63e4 MD5 · raw file

  1. /*
  2. * graphics.d
  3. *
  4. * This Scaffold holds the Graphics implementations for the Linux platform
  5. *
  6. * Author: Dave Wilkinson
  7. *
  8. */
  9. module scaffold.graphics;
  10. import core.string;
  11. import core.color;
  12. import core.main;
  13. import core.definitions;
  14. import core.string;
  15. import graphics.view;
  16. import graphics.graphics;
  17. import platform.unix.common;
  18. import platform.unix.main;
  19. import platform.vars.view;
  20. import platform.vars.region;
  21. import platform.vars.brush;
  22. import platform.vars.pen;
  23. import platform.vars.font;
  24. import graphics.region;
  25. import math.common;
  26. // Shapes
  27. // Draw a line
  28. void drawLine(ViewPlatformVars* viewVars, int x, int y, int x2, int y2) {
  29. Cairo.cairo_set_source(viewVars.cr, viewVars.curPen.handle);
  30. Cairo.cairo_set_line_width(viewVars.cr, viewVars.curPen.width);
  31. Cairo.cairo_move_to(viewVars.cr, x, y);
  32. Cairo.cairo_line_to(viewVars.cr, x2, y2);
  33. Cairo.cairo_stroke(viewVars.cr);
  34. }
  35. // Draw a rectangle (filled with the current brush, outlined with current pen)
  36. void drawRect(ViewPlatformVars* viewVars, int x, int y, int width, int height) {
  37. width--;
  38. height--;
  39. Cairo.cairo_set_source(viewVars.cr, viewVars.curBrush.handle);
  40. Cairo.cairo_rectangle(viewVars.cr, x, y, width, height);
  41. Cairo.cairo_fill_preserve(viewVars.cr);
  42. Cairo.cairo_set_source(viewVars.cr, viewVars.curPen.handle);
  43. Cairo.cairo_set_line_width(viewVars.cr, viewVars.curPen.width);
  44. Cairo.cairo_stroke(viewVars.cr);
  45. }
  46. void fillRect(ViewPlatformVars* viewVars, int x, int y, int width, int height) {
  47. x++;
  48. width--;
  49. height--;
  50. Cairo.cairo_set_source(viewVars.cr, viewVars.curBrush.handle);
  51. Cairo.cairo_rectangle(viewVars.cr, x, y, width, height);
  52. Cairo.cairo_fill(viewVars.cr);
  53. }
  54. void strokeRect(ViewPlatformVars* viewVars, int x, int y, int width, int height) {
  55. width--;
  56. height--;
  57. Cairo.cairo_set_source(viewVars.cr, viewVars.curPen.handle);
  58. Cairo.cairo_rectangle(viewVars.cr, x, y, width, height);
  59. Cairo.cairo_set_line_width(viewVars.cr, viewVars.curPen.width);
  60. Cairo.cairo_stroke(viewVars.cr);
  61. }
  62. // Draw an ellipse (filled with current brush, outlined with current pen)
  63. void drawOval(ViewPlatformVars* viewVars, int x, int y, int width, int height) {
  64. width--;
  65. height--;
  66. Cairo.cairo_set_source(viewVars.cr, viewVars.curBrush.handle);
  67. Cairo.cairo_save(viewVars.cr);
  68. Cairo.cairo_new_path(viewVars.cr);
  69. double cx, cy;
  70. cx = cast(double)x + cast(double)(width) / 2.0;
  71. cy = cast(double)y + cast(double)(height) / 2.0;
  72. Cairo.cairo_translate(viewVars.cr, cx, cy);
  73. Cairo.cairo_scale(viewVars.cr, cast(double)(width)/2.0, cast(double)(height)/2.0);
  74. Cairo.cairo_arc(viewVars.cr, 0, 0, 1.0, 0, 2*3.14159265);
  75. Cairo.cairo_restore(viewVars.cr);
  76. Cairo.cairo_fill_preserve(viewVars.cr);
  77. Cairo.cairo_set_source(viewVars.cr, viewVars.curPen.handle);
  78. Cairo.cairo_set_line_width(viewVars.cr, viewVars.curPen.width);
  79. Cairo.cairo_stroke(viewVars.cr);
  80. }
  81. void fillOval(ViewPlatformVars* viewVars, int x, int y, int width, int height) {
  82. width--;
  83. height--;
  84. Cairo.cairo_set_source(viewVars.cr, viewVars.curBrush.handle);
  85. Cairo.cairo_save(viewVars.cr);
  86. Cairo.cairo_new_path(viewVars.cr);
  87. double cx, cy;
  88. cx = cast(double)x + cast(double)(width) / 2.0;
  89. cy = cast(double)y + cast(double)(height) / 2.0;
  90. Cairo.cairo_translate(viewVars.cr, cx, cy);
  91. Cairo.cairo_scale(viewVars.cr, cast(double)(width)/2.0, cast(double)(height)/2.0);
  92. Cairo.cairo_arc(viewVars.cr, 0, 0, 1.0, 0, 2*3.14159265);
  93. Cairo.cairo_restore(viewVars.cr);
  94. Cairo.cairo_fill(viewVars.cr);
  95. }
  96. void strokeOval(ViewPlatformVars* viewVars, int x, int y, int width, int height) {
  97. width--;
  98. height--;
  99. Cairo.cairo_save(viewVars.cr);
  100. Cairo.cairo_new_path(viewVars.cr);
  101. double cx, cy;
  102. cx = cast(double)x + cast(double)(width) / 2.0;
  103. cy = cast(double)y + cast(double)(height) / 2.0;
  104. Cairo.cairo_translate(viewVars.cr, cx, cy);
  105. Cairo.cairo_scale(viewVars.cr, cast(double)(width)/2.0, cast(double)(height)/2.0);
  106. Cairo.cairo_arc(viewVars.cr, 0, 0, 1.0, 0, 2*3.14159265);
  107. Cairo.cairo_restore(viewVars.cr);
  108. Cairo.cairo_set_source(viewVars.cr, viewVars.curPen.handle);
  109. Cairo.cairo_set_line_width(viewVars.cr, viewVars.curPen.width);
  110. Cairo.cairo_stroke(viewVars.cr);
  111. }
  112. void drawPie(ViewPlatformVars* viewVars, int x, int y, int width, int height, double startAngle, double sweepAngle) {
  113. width--;
  114. height--;
  115. Cairo.cairo_set_source(viewVars.cr, viewVars.curBrush.handle);
  116. Cairo.cairo_save(viewVars.cr);
  117. Cairo.cairo_new_path(viewVars.cr);
  118. double cx, cy;
  119. cx = cast(double)x + cast(double)(width) / 2.0;
  120. cy = cast(double)y + cast(double)(height) / 2.0;
  121. Cairo.cairo_translate(viewVars.cr, cx, cy);
  122. Cairo.cairo_scale(viewVars.cr, cast(double)(width)/2.0, cast(double)(height)/2.0);
  123. double sA, eA;
  124. sA = (startAngle*3.14159265)/180.0;
  125. eA = (sweepAngle*3.14159265)/180.0;
  126. eA += sA;
  127. Cairo.cairo_arc(viewVars.cr, 0, 0, 1.0, sA, eA);
  128. Cairo.cairo_restore(viewVars.cr);
  129. Cairo.cairo_line_to(viewVars.cr, cx, cy);
  130. Cairo.cairo_close_path(viewVars.cr);
  131. Cairo.cairo_fill_preserve(viewVars.cr);
  132. Cairo.cairo_set_source(viewVars.cr, viewVars.curPen.handle);
  133. Cairo.cairo_set_line_width(viewVars.cr, viewVars.curPen.width);
  134. Cairo.cairo_stroke(viewVars.cr);
  135. }
  136. void fillPie(ViewPlatformVars* viewVars, int x, int y, int width, int height, double startAngle, double sweepAngle) {
  137. width--;
  138. height--;
  139. Cairo.cairo_set_source(viewVars.cr, viewVars.curBrush.handle);
  140. Cairo.cairo_save(viewVars.cr);
  141. Cairo.cairo_new_path(viewVars.cr);
  142. double cx, cy;
  143. cx = cast(double)x + cast(double)(width) / 2.0;
  144. cy = cast(double)y + cast(double)(height) / 2.0;
  145. Cairo.cairo_translate(viewVars.cr, cx, cy);
  146. Cairo.cairo_scale(viewVars.cr, cast(double)(width)/2.0, cast(double)(height)/2.0);
  147. double sA, eA;
  148. sA = (startAngle*3.14159265)/180.0;
  149. eA = (sweepAngle*3.14159265)/180.0;
  150. eA += sA;
  151. Cairo.cairo_arc(viewVars.cr, 0, 0, 1.0, sA, eA);
  152. Cairo.cairo_restore(viewVars.cr);
  153. Cairo.cairo_line_to(viewVars.cr, cx, cy);
  154. Cairo.cairo_close_path(viewVars.cr);
  155. Cairo.cairo_fill(viewVars.cr);
  156. }
  157. void strokePie(ViewPlatformVars* viewVars, int x, int y, int width, int height, double startAngle, double sweepAngle) {
  158. width--;
  159. height--;
  160. Cairo.cairo_set_source(viewVars.cr, viewVars.curPen.handle);
  161. Cairo.cairo_save(viewVars.cr);
  162. Cairo.cairo_new_path(viewVars.cr);
  163. double cx, cy;
  164. cx = cast(double)x + cast(double)(width) / 2.0;
  165. cy = cast(double)y + cast(double)(height) / 2.0;
  166. Cairo.cairo_translate(viewVars.cr, cx, cy);
  167. Cairo.cairo_scale(viewVars.cr, cast(double)(width)/2.0, cast(double)(height)/2.0);
  168. double sA, eA;
  169. sA = (startAngle*3.14159265)/180.0;
  170. eA = (sweepAngle*3.14159265)/180.0;
  171. eA += sA;
  172. Cairo.cairo_arc(viewVars.cr, 0, 0, 1.0, sA, eA);
  173. Cairo.cairo_restore(viewVars.cr);
  174. Cairo.cairo_line_to(viewVars.cr, cx, cy);
  175. Cairo.cairo_close_path(viewVars.cr);
  176. Cairo.cairo_set_line_width(viewVars.cr, viewVars.curPen.width);
  177. Cairo.cairo_stroke(viewVars.cr);
  178. }
  179. // Fonts
  180. //void createFont(ViewPlatformVars* viewVars, out Font font, string fontname, int fontsize, int weight, bool italic, bool underline, bool strikethru)
  181. void createFont(FontPlatformVars* font, string fontname, int fontsize, int weight, bool italic, bool underline, bool strikethru) {
  182. font.pangoFont = Pango.pango_font_description_new();
  183. fontname = fontname.dup;
  184. fontname ~= '\0';
  185. Pango.pango_font_description_set_family(font.pangoFont, fontname.ptr);
  186. Pango.pango_font_description_set_size(font.pangoFont, fontsize * Pango.PANGO_SCALE);
  187. if (italic) {
  188. Pango.pango_font_description_set_style(font.pangoFont, Pango.PangoStyle.PANGO_STYLE_ITALIC);
  189. }
  190. else {
  191. Pango.pango_font_description_set_style(font.pangoFont, Pango.PangoStyle.PANGO_STYLE_NORMAL);
  192. }
  193. Pango.pango_font_description_set_weight(font.pangoFont, cast(Pango.PangoWeight)(weight));
  194. }
  195. void setFont(ViewPlatformVars* viewVars, FontPlatformVars* font) {
  196. Pango.pango_layout_set_font_description(viewVars.layout, font.pangoFont);
  197. }
  198. void destroyFont(FontPlatformVars* font) {
  199. Pango.pango_font_description_free(font.pangoFont);
  200. }
  201. // Text
  202. void drawText(ViewPlatformVars* viewVars, int x, int y, string str) {
  203. Pango.pango_layout_set_text(viewVars.layout, str.ptr, str.length);
  204. Cairo.cairo_set_source_rgb(viewVars.cr, viewVars.textclr_red, viewVars.textclr_green, viewVars.textclr_blue);
  205. Cairo.cairo_move_to(viewVars.cr, (x), (y));
  206. Pango.pango_cairo_show_layout(viewVars.cr, viewVars.layout);
  207. }
  208. void drawText(ViewPlatformVars* viewVars, int x, int y, string str, uint length) {
  209. Pango.pango_layout_set_text(viewVars.layout, str.ptr, length);
  210. Cairo.cairo_set_source_rgba(viewVars.cr, viewVars.textclr_red, viewVars.textclr_green, viewVars.textclr_blue, viewVars.textclr_alpha);
  211. Cairo.cairo_move_to(viewVars.cr, (x), (y));
  212. Pango.pango_cairo_show_layout(viewVars.cr, viewVars.layout);
  213. }
  214. // Clipped Text
  215. void drawClippedText(ViewPlatformVars* viewVars, int x, int y, Rect region, string str) {
  216. Pango.pango_layout_set_text(viewVars.layout, str.ptr, str.length);
  217. double xp1,yp1,xp2,yp2;
  218. xp1 = region.left;
  219. yp1 = region.top;
  220. xp2 = region.right;
  221. yp2 = region.bottom;
  222. Cairo.cairo_save(viewVars.cr);
  223. Cairo.cairo_rectangle(viewVars.cr, xp1, yp1, xp2, yp2);
  224. Cairo.cairo_clip(viewVars.cr);
  225. Cairo.cairo_set_source_rgba(viewVars.cr, viewVars.textclr_red, viewVars.textclr_green, viewVars.textclr_blue, viewVars.textclr_alpha);
  226. Cairo.cairo_move_to(viewVars.cr, (x), (y));
  227. Pango.pango_cairo_show_layout(viewVars.cr, viewVars.layout);
  228. Cairo.cairo_restore(viewVars.cr);
  229. }
  230. void drawClippedText(ViewPlatformVars* viewVars, int x, int y, Rect region, string str, uint length) {
  231. Pango.pango_layout_set_text(viewVars.layout, str.ptr, length);
  232. double xp1,yp1,xp2,yp2;
  233. xp1 = region.left;
  234. yp1 = region.top;
  235. xp2 = region.right;
  236. yp2 = region.bottom;
  237. Cairo.cairo_save(viewVars.cr);
  238. Cairo.cairo_rectangle(viewVars.cr, xp1, yp1, xp2, yp2);
  239. Cairo.cairo_clip(viewVars.cr);
  240. Cairo.cairo_set_source_rgba(viewVars.cr, viewVars.textclr_red, viewVars.textclr_green, viewVars.textclr_blue, viewVars.textclr_alpha);
  241. Cairo.cairo_move_to(viewVars.cr, (x), (y));
  242. Pango.pango_cairo_show_layout(viewVars.cr, viewVars.layout);
  243. Cairo.cairo_restore(viewVars.cr);
  244. }
  245. // Text Measurement
  246. void measureText(ViewPlatformVars* viewVars, string str, out Size sz) {
  247. Pango.pango_layout_set_text(viewVars.layout,
  248. str.ptr, str.length);
  249. Pango.pango_layout_get_size(viewVars.layout, cast(int*)&sz.x, cast(int*)&sz.y);
  250. sz.x /= Pango.PANGO_SCALE;
  251. sz.y /= Pango.PANGO_SCALE;
  252. }
  253. void measureText(ViewPlatformVars* viewVars, string str, uint length, out Size sz) {
  254. Pango.pango_layout_set_text(viewVars.layout,
  255. str.ptr, length);
  256. Pango.pango_layout_get_size(viewVars.layout, cast(int*)&sz.x, cast(int*)&sz.y);
  257. sz.x /= Pango.PANGO_SCALE;
  258. sz.y /= Pango.PANGO_SCALE;
  259. }
  260. // Text Colors
  261. void setTextBackgroundColor(ViewPlatformVars* viewVars, ref Color textColor) {
  262. // Color is an INT
  263. // divide
  264. int r, g, b, a;
  265. r = cast(int)(textColor.red * 0xffffp0);
  266. g = cast(int)(textColor.green * 0xffffp0);
  267. b = cast(int)(textColor.blue * 0xffffp0);
  268. a = cast(int)(textColor.alpha * 0xffffp0);
  269. viewVars.attr_bg = Pango.pango_attr_background_new(r, g, b);
  270. viewVars.attr_bg.start_index = 0;
  271. viewVars.attr_bg.end_index = -1;
  272. //Pango.pango_attr_list_insert(viewVars.attr_list_opaque, viewVars.attr_bg);
  273. Pango.pango_attr_list_change(viewVars.attr_list_opaque, viewVars.attr_bg);
  274. // Pango.pango_attribute_destroy(viewVars.attr_bg);
  275. }
  276. void setTextColor(ViewPlatformVars* viewVars, ref Color textColor) {
  277. // Color is an INT
  278. // divide
  279. double r, g, b, a;
  280. r = textColor.red;
  281. g = textColor.green;
  282. b = textColor.blue;
  283. a = textColor.alpha;
  284. viewVars.textclr_red = r;
  285. viewVars.textclr_green = g;
  286. viewVars.textclr_blue = b;
  287. viewVars.textclr_alpha = a;
  288. }
  289. // Text States
  290. void setTextModeTransparent(ViewPlatformVars* viewVars) {
  291. Pango.pango_layout_set_attributes(viewVars.layout, viewVars.attr_list_transparent);
  292. }
  293. void setTextModeOpaque(ViewPlatformVars* viewVars) {
  294. Pango.pango_layout_set_attributes(viewVars.layout, viewVars.attr_list_opaque);
  295. }
  296. // Graphics States
  297. void setAntialias(ViewPlatformVars* viewVars, bool value) {
  298. viewVars.aa = value;
  299. if (viewVars.aa) {
  300. Cairo.cairo_set_antialias(viewVars.cr, Cairo.cairo_antialias_t.CAIRO_ANTIALIAS_DEFAULT);
  301. }
  302. else {
  303. Cairo.cairo_set_antialias(viewVars.cr, Cairo.cairo_antialias_t.CAIRO_ANTIALIAS_NONE);
  304. }
  305. }
  306. // Brushes
  307. void createBrush(BrushPlatformVars* brush, in Color clr) {
  308. brush.handle = Cairo.cairo_pattern_create_rgba(clr.red,clr.green,clr.blue,clr.alpha);
  309. }
  310. void setBrush(ViewPlatformVars* viewVars, BrushPlatformVars* brush) {
  311. viewVars.curBrush = *brush;
  312. }
  313. void destroyBrush(BrushPlatformVars* brush) {
  314. Cairo.cairo_pattern_destroy(brush.handle);
  315. }
  316. // BitmapBrush
  317. void createBitmapBrush(BrushPlatformVars* brush, ref ViewPlatformVars viewVarsSrc) {
  318. brush.handle = Cairo.cairo_pattern_create_for_surface(viewVarsSrc.surface);
  319. Cairo.cairo_pattern_set_extend(brush.handle, Cairo.cairo_extend_t.CAIRO_EXTEND_REPEAT);
  320. }
  321. void createGradientBrush(BrushPlatformVars* brush, double origx, double origy, double[] points, Color[] clrs, double angle, double width) {
  322. double x0, y0, x1, y1;
  323. x0 = origx;
  324. y0 = origy;
  325. x1 = origx + (cos(angle) * width);
  326. y1 = origy + (sin(angle) * width);
  327. brush.handle = Cairo.cairo_pattern_create_linear(x0, y0, x1, y1);
  328. foreach(size_t i, point; points) {
  329. Cairo.cairo_pattern_add_color_stop_rgba(brush.handle, point,
  330. clrs[i].red, clrs[i].green, clrs[i].blue, clrs[i].alpha);
  331. }
  332. Cairo.cairo_pattern_set_extend(brush.handle, Cairo.cairo_extend_t.CAIRO_EXTEND_REPEAT);
  333. }
  334. // Pens
  335. void createPen(PenPlatformVars* pen, ref Color clr, double width) {
  336. pen.handle = Cairo.cairo_pattern_create_rgba(clr.red,clr.green,clr.blue,clr.alpha);
  337. pen.width = width;
  338. }
  339. void createPenWithBrush(PenPlatformVars* pen, ref BrushPlatformVars brush, double width) {
  340. pen.handle = Cairo.cairo_pattern_reference(brush.handle);
  341. pen.width = width;
  342. }
  343. void setPen(ViewPlatformVars* viewVars, PenPlatformVars* pen) {
  344. viewVars.curPen = *pen;
  345. }
  346. void destroyPen(PenPlatformVars* pen) {
  347. Cairo.cairo_pattern_destroy(pen.handle);
  348. }
  349. // View Interfacing
  350. void drawView(ref ViewPlatformVars* viewVars, ref View view, int x, int y, ref ViewPlatformVars* viewVarsSrc, ref View srcView) {
  351. Cairo.cairo_set_source_surface(viewVars.cr, viewVarsSrc.surface, x, y);
  352. Cairo.cairo_paint(viewVars.cr);
  353. }
  354. void drawView(ref ViewPlatformVars* viewVars, ref View view, int x, int y, ref ViewPlatformVars* viewVarsSrc, ref View srcView, int viewX, int viewY) {
  355. Cairo.cairo_save(viewVars.cr);
  356. Cairo.cairo_set_source_surface(viewVars.cr, viewVarsSrc.surface, x - viewX, y - viewY);
  357. double x1,y1,x2,y2;
  358. x1 = x;
  359. y1 = y;
  360. x2 = view.width() - viewX;
  361. y2 = view.height() - viewY;
  362. Cairo.cairo_rectangle(viewVars.cr, x1, y1, x2, y2);
  363. Cairo.cairo_restore(viewVars.cr);
  364. Cairo.cairo_fill(viewVars.cr);
  365. }
  366. void drawView(ref ViewPlatformVars* viewVars, ref View view, int x, int y, ref ViewPlatformVars* viewVarsSrc, ref View srcView, int viewX, int viewY, int viewWidth, int viewHeight) {
  367. Cairo.cairo_save(viewVars.cr);
  368. Cairo.cairo_set_source_surface(viewVars.cr, viewVarsSrc.surface, x - viewX, y - viewY);
  369. double x1,y1,x2,y2;
  370. x1 = x;
  371. y1 = y;
  372. x2 = viewWidth;
  373. y2 = viewHeight;
  374. Cairo.cairo_rectangle(viewVars.cr, x1, y1, x2, y2);
  375. Cairo.cairo_restore(viewVars.cr);
  376. Cairo.cairo_fill(viewVars.cr);
  377. }
  378. void drawView(ref ViewPlatformVars* viewVars, ref View view, int x, int y, ref ViewPlatformVars* viewVarsSrc, ref View srcView, double opacity) {
  379. Cairo.cairo_save(viewVars.cr);
  380. Cairo.cairo_set_source_surface(viewVars.cr, viewVarsSrc.surface, x, y);
  381. Cairo.cairo_paint_with_alpha(viewVars.cr, opacity);
  382. Cairo.cairo_restore(viewVars.cr);
  383. }
  384. void drawView(ref ViewPlatformVars* viewVars, ref View view, int x, int y, ref ViewPlatformVars* viewVarsSrc, ref View srcView, int viewX, int viewY, double opacity) {
  385. Cairo.cairo_set_source_surface(viewVars.cr, viewVarsSrc.surface, x - viewX, y - viewY);
  386. double x1,y1,x2,y2;
  387. x1 = x;
  388. y1 = y;
  389. x2 = view.width() - viewX;
  390. y2 = view.height() - viewY;
  391. Cairo.cairo_save(viewVars.cr);
  392. Cairo.cairo_rectangle(viewVars.cr, x1, y1, x2, y2);
  393. Cairo.cairo_clip(viewVars.cr);
  394. Cairo.cairo_paint_with_alpha(viewVars.cr, opacity);
  395. Cairo.cairo_restore(viewVars.cr);
  396. }
  397. void drawView(ref ViewPlatformVars* viewVars, ref View view, int x, int y, ref ViewPlatformVars* viewVarsSrc, ref View srcView, int viewX, int viewY, int viewWidth, int viewHeight, double opacity) {
  398. Cairo.cairo_set_source_surface(viewVars.cr, viewVarsSrc.surface, x - viewX, y - viewY);
  399. double x1,y1,x2,y2;
  400. x1 = x;
  401. y1 = y;
  402. x2 = viewWidth;
  403. y2 = viewHeight;
  404. Cairo.cairo_save(viewVars.cr);
  405. Cairo.cairo_rectangle(viewVars.cr, x1, y1, x2, y2);
  406. Cairo.cairo_clip(viewVars.cr);
  407. Cairo.cairo_paint_with_alpha(viewVars.cr, opacity);
  408. Cairo.cairo_restore(viewVars.cr);
  409. }
  410. void fillRegion(ViewPlatformVars* viewVars, RegionPlatformVars* rgnVars, bool rgnPlatformDirty, Region rgn, int x, int y) {
  411. }
  412. void strokeRegion(ViewPlatformVars* viewVars, RegionPlatformVars* rgnVars, bool rgnPlatformDirty, Region rgn, int x, int y) {
  413. }
  414. void drawRegion(ViewPlatformVars* viewVars, RegionPlatformVars* rgnVars, bool rgnPlatformDirty, Region rgn, int x, int y) {
  415. }
  416. void clipSave(ViewPlatformVars* viewVars)
  417. {
  418. }
  419. void clipRestore(ViewPlatformVars* viewVars)
  420. {
  421. }
  422. void clipRect(ViewPlatformVars* viewVars, int x, int y, int x2, int y2)
  423. {
  424. }
  425. void clipRegion(ViewPlatformVars* viewVars, Region region)
  426. {
  427. }