/vendor/cegui-0.4.0-custom/src/CEGUIRenderableFrame.cpp

https://github.com/azboul/multitheftauto · C++ · 677 lines · 452 code · 135 blank · 90 comment · 92 complexity · a7839ee5347c099ab5de1739de6676f1 MD5 · raw file

  1. /************************************************************************
  2. filename: CEGUIRenderableFrame.cpp
  3. created: 14/4/2004
  4. author: Paul D Turner
  5. purpose: Implementation of RenderableFrame
  6. *************************************************************************/
  7. /*************************************************************************
  8. Crazy Eddie's GUI System (http://www.cegui.org.uk)
  9. Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk)
  10. This library is free software; you can redistribute it and/or
  11. modify it under the terms of the GNU Lesser General Public
  12. License as published by the Free Software Foundation; either
  13. version 2.1 of the License, or (at your option) any later version.
  14. This library is distributed in the hope that it will be useful,
  15. but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. Lesser General Public License for more details.
  18. You should have received a copy of the GNU Lesser General Public
  19. License along with this library; if not, write to the Free Software
  20. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. *************************************************************************/
  22. #include "StdInc.h"
  23. #include "CEGUIRenderableFrame.h"
  24. #include "CEGUIImage.h"
  25. #include "CEGUIExceptions.h"
  26. // Start of CEGUI namespace section
  27. namespace CEGUI
  28. {
  29. /*************************************************************************
  30. Default constructor for RenderableFrame
  31. *************************************************************************/
  32. RenderableFrame::RenderableFrame(void)
  33. {
  34. d_left = d_right = d_top = d_bottom = NULL;
  35. d_topleft = d_topright = d_bottomleft = d_bottomright = NULL;
  36. }
  37. /*************************************************************************
  38. Destructor for RenderableFrame
  39. *************************************************************************/
  40. RenderableFrame::~RenderableFrame(void)
  41. {
  42. }
  43. /*************************************************************************
  44. Set the images to use for the frame
  45. *************************************************************************/
  46. void RenderableFrame::setImages(const Image* topleft, const Image* topright, const Image* bottomleft, const Image* bottomright, const Image* left, const Image* top, const Image* right, const Image* bottom)
  47. {
  48. d_topleft = topleft;
  49. d_topright = topright;
  50. d_bottomleft = bottomleft;
  51. d_bottomright = bottomright;
  52. d_left = left;
  53. d_right = right;
  54. d_top = top;
  55. d_bottom = bottom;
  56. }
  57. /*************************************************************************
  58. Drawing method for the frame
  59. *************************************************************************/
  60. void RenderableFrame::draw_impl(const Vector3& position, const Rect& clip_rect) const
  61. {
  62. Vector3 final_pos(position);
  63. float org_width = d_area.getWidth(), org_height = d_area.getHeight();
  64. Size final_size;
  65. ColourRect final_colours(d_colours);
  66. bool calcColoursPerImage = !(d_useColoursPerImage || d_colours.isMonochromatic());
  67. float leftfactor, rightfactor, topfactor, bottomfactor;
  68. // calculate 'adjustments' required to accommodate corner pieces.
  69. float coord_adj, size_adj;
  70. // draw top-edge, if required
  71. if (d_top != NULL) {
  72. // calculate adjustments required if top-left corner will be rendered.
  73. if (d_topleft != NULL) {
  74. size_adj = (d_topleft->getWidth() - d_topleft->getOffsetX());
  75. coord_adj = d_topleft->getWidth();
  76. }
  77. else {
  78. coord_adj = 0;
  79. size_adj = 0;
  80. }
  81. // calculate adjustments required if top-right corner will be rendered.
  82. if (d_topright != NULL) {
  83. size_adj += (d_topright->getWidth() + d_topright->getOffsetX());
  84. }
  85. final_size.d_width = org_width - size_adj;
  86. final_size.d_height = d_top->getHeight();
  87. final_pos.d_x = position.d_x + coord_adj;
  88. final_pos.d_y = position.d_y;
  89. // calculate final colours that are to be used
  90. if (calcColoursPerImage)
  91. {
  92. leftfactor = (final_pos.d_x - position.d_x + d_top->getOffsetX()) / org_width;
  93. rightfactor = leftfactor + final_size.d_width / org_width;
  94. topfactor = (final_pos.d_y - position.d_y + d_top->getOffsetY()) / org_height;
  95. bottomfactor = topfactor + final_size.d_height / org_height;
  96. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  97. }
  98. d_top->draw(final_pos, final_size, clip_rect, final_colours);
  99. }
  100. // draw bottom-edge, if required
  101. if (d_bottom != NULL) {
  102. // calculate adjustments required if bottom-left corner will be rendered.
  103. if (d_bottomleft != NULL) {
  104. size_adj = (d_bottomleft->getWidth() - d_bottomleft->getOffsetX());
  105. coord_adj = d_bottomleft->getWidth();
  106. }
  107. else {
  108. coord_adj = 0;
  109. size_adj = 0;
  110. }
  111. // calculate adjustments required if bottom-right corner will be rendered.
  112. if (d_bottomright != NULL) {
  113. size_adj += (d_bottomright->getWidth() + d_bottomright->getOffsetX());
  114. }
  115. final_size.d_width = org_width - size_adj;
  116. final_size.d_height = d_bottom->getHeight();
  117. final_pos.d_x = position.d_x + coord_adj;
  118. final_pos.d_y = position.d_y + org_height - final_size.d_height;
  119. // calculate final colours that are to be used
  120. if (calcColoursPerImage)
  121. {
  122. leftfactor = (final_pos.d_x - position.d_x + d_bottom->getOffsetX()) / org_width;
  123. rightfactor = leftfactor + final_size.d_width / org_width;
  124. topfactor = (final_pos.d_y - position.d_y + d_bottom->getOffsetY()) / org_height;
  125. bottomfactor = topfactor + final_size.d_height / org_height;
  126. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  127. }
  128. d_bottom->draw(final_pos, final_size, clip_rect, final_colours);
  129. }
  130. // draw left-edge, if required
  131. if (d_left != NULL) {
  132. // calculate adjustments required if top-left corner will be rendered.
  133. if (d_topleft != NULL) {
  134. size_adj = (d_topleft->getHeight() - d_topleft->getOffsetY());
  135. coord_adj = d_topleft->getHeight();
  136. }
  137. else {
  138. coord_adj = 0;
  139. size_adj = 0;
  140. }
  141. // calculate adjustments required if bottom-left corner will be rendered.
  142. if (d_bottomleft != NULL) {
  143. size_adj += (d_bottomleft->getHeight() + d_bottomleft->getOffsetY());
  144. }
  145. final_size.d_height = org_height - size_adj;
  146. final_size.d_width = d_left->getWidth();
  147. final_pos.d_y = position.d_y + coord_adj;
  148. final_pos.d_x = position.d_x;
  149. // calculate final colours that are to be used
  150. if (calcColoursPerImage)
  151. {
  152. leftfactor = (final_pos.d_x - position.d_x + d_left->getOffsetX()) / org_width;
  153. rightfactor = leftfactor + final_size.d_width / org_width;
  154. topfactor = (final_pos.d_y - position.d_y + d_left->getOffsetY()) / org_height;
  155. bottomfactor = topfactor + final_size.d_height / org_height;
  156. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  157. }
  158. d_left->draw(final_pos, final_size, clip_rect, final_colours);
  159. }
  160. // draw right-edge, if required
  161. if (d_right != NULL) {
  162. // calculate adjustments required if top-left corner will be rendered.
  163. if (d_topright != NULL) {
  164. size_adj = (d_topright->getHeight() - d_topright->getOffsetY());
  165. coord_adj = d_topright->getHeight();
  166. }
  167. else {
  168. coord_adj = 0;
  169. size_adj = 0;
  170. }
  171. // calculate adjustments required if bottom-left corner will be rendered.
  172. if (d_bottomright != NULL) {
  173. size_adj += (d_bottomright->getHeight() + d_bottomright->getOffsetY());
  174. }
  175. final_size.d_height = org_height - size_adj;
  176. final_size.d_width = d_right->getWidth();
  177. final_pos.d_y = position.d_y + coord_adj;
  178. final_pos.d_x = position.d_x + org_width - final_size.d_width;
  179. // calculate final colours that are to be used
  180. if (calcColoursPerImage)
  181. {
  182. leftfactor = (final_pos.d_x - position.d_x + d_right->getOffsetX()) / org_width;
  183. rightfactor = leftfactor + final_size.d_width / org_width;
  184. topfactor = (final_pos.d_y - position.d_y + d_right->getOffsetY()) / org_height;
  185. bottomfactor = topfactor + final_size.d_height / org_height;
  186. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  187. }
  188. d_right->draw(final_pos, final_size, clip_rect, final_colours);
  189. }
  190. // draw required corner pieces...
  191. if (d_topleft != NULL) {
  192. // calculate final colours that are to be used
  193. if (calcColoursPerImage)
  194. {
  195. leftfactor = d_topleft->getOffsetX() / org_width;
  196. rightfactor = leftfactor + d_topleft->getWidth() / org_width;
  197. topfactor = d_topleft->getOffsetY() / org_height;
  198. bottomfactor = topfactor + d_topleft->getHeight() / org_height;
  199. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  200. }
  201. d_topleft->draw(position, clip_rect, final_colours);
  202. }
  203. if (d_topright != NULL) {
  204. final_pos.d_x = position.d_x + org_width - d_topright->getWidth();
  205. final_pos.d_y = position.d_y;
  206. // calculate final colours that are to be used
  207. if (calcColoursPerImage)
  208. {
  209. leftfactor = (final_pos.d_x - position.d_x + d_topright->getOffsetX()) / org_width;
  210. rightfactor = leftfactor + d_topright->getWidth() / org_width;
  211. topfactor = (final_pos.d_y - position.d_y + d_topright->getOffsetY()) / org_height;
  212. bottomfactor = topfactor + d_topright->getHeight() / org_height;
  213. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  214. }
  215. d_topright->draw(final_pos, clip_rect, final_colours);
  216. }
  217. if (d_bottomleft != NULL) {
  218. final_pos.d_x = position.d_x;
  219. final_pos.d_y = position.d_y + org_height - d_bottomleft->getHeight();
  220. // calculate final colours that are to be used
  221. if (calcColoursPerImage)
  222. {
  223. leftfactor = (final_pos.d_x - position.d_x + d_bottomleft->getOffsetX()) / org_width;
  224. rightfactor = leftfactor + d_bottomleft->getWidth() / org_width;
  225. topfactor = (final_pos.d_y - position.d_y + d_bottomleft->getOffsetY()) / org_height;
  226. bottomfactor = topfactor + d_bottomleft->getHeight() / org_height;
  227. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  228. }
  229. d_bottomleft->draw(final_pos, clip_rect, final_colours);
  230. }
  231. if (d_bottomright != NULL) {
  232. final_pos.d_x = position.d_x + org_width - d_bottomright->getWidth();
  233. final_pos.d_y = position.d_y + org_height - d_bottomright->getHeight();
  234. // calculate final colours that are to be used
  235. if (calcColoursPerImage)
  236. {
  237. leftfactor = (final_pos.d_x - position.d_x + d_bottomright->getOffsetX()) / org_width;
  238. rightfactor = leftfactor + d_bottomright->getWidth() / org_width;
  239. topfactor = (final_pos.d_y - position.d_y + d_bottomright->getOffsetY()) / org_height;
  240. bottomfactor = topfactor + d_bottomright->getHeight() / org_height;
  241. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  242. }
  243. d_bottomright->draw(final_pos, clip_rect, final_colours);
  244. }
  245. }
  246. /*************************************************************************
  247. Set the Image to use for the specified location of the frame.
  248. *************************************************************************/
  249. void RenderableFrame::setImageForLocation(FrameLocation location, const Image* image)
  250. {
  251. switch (location)
  252. {
  253. case TopLeftCorner:
  254. d_topleft = image;
  255. break;
  256. case TopRightCorner:
  257. d_topright = image;
  258. break;
  259. case BottomLeftCorner:
  260. d_bottomleft = image;
  261. break;
  262. case BottomRightCorner:
  263. d_bottomright = image;
  264. break;
  265. case LeftEdge:
  266. d_left = image;
  267. break;
  268. case RightEdge:
  269. d_right = image;
  270. break;
  271. case TopEdge:
  272. d_top = image;
  273. break;
  274. case BottomEdge:
  275. d_bottom = image;
  276. break;
  277. default:
  278. break;
  279. }
  280. }
  281. /*************************************************************************
  282. Return the Image being used for the specified location of the frame.
  283. *************************************************************************/
  284. const Image* RenderableFrame::getImageForLocation(FrameLocation location) const
  285. {
  286. switch (location)
  287. {
  288. case TopLeftCorner:
  289. return d_topleft;
  290. break;
  291. case TopRightCorner:
  292. return d_topright;
  293. break;
  294. case BottomLeftCorner:
  295. return d_bottomleft;
  296. break;
  297. case BottomRightCorner:
  298. return d_bottomright;
  299. break;
  300. case LeftEdge:
  301. return d_left;
  302. break;
  303. case RightEdge:
  304. return d_right;
  305. break;
  306. case TopEdge:
  307. return d_top;
  308. break;
  309. case BottomEdge:
  310. return d_bottom;
  311. break;
  312. default:
  313. return NULL;
  314. break;
  315. }
  316. }
  317. void RenderableFrame::draw_impl(RenderCache& renderCache) const
  318. {
  319. // TODO: This is a fairly substantial Cut, paste, and hack job.
  320. // TODO: There are probably a thousand ways that this should be improved!
  321. Rect destArea;
  322. Vector3 final_pos(0,0,0);
  323. float org_width = d_area.getWidth(), org_height = d_area.getHeight();
  324. Size final_size;
  325. ColourRect final_colours(d_colours);
  326. bool calcColoursPerImage = !(d_useColoursPerImage || d_colours.isMonochromatic());
  327. float leftfactor, rightfactor, topfactor, bottomfactor;
  328. // calculate 'adjustments' required to accommodate corner pieces.
  329. float coord_adj, size_adj;
  330. // draw top-edge, if required
  331. if (d_top != NULL) {
  332. // calculate adjustments required if top-left corner will be rendered.
  333. if (d_topleft != NULL) {
  334. size_adj = (d_topleft->getWidth() - d_topleft->getOffsetX());
  335. coord_adj = d_topleft->getWidth();
  336. }
  337. else {
  338. coord_adj = 0;
  339. size_adj = 0;
  340. }
  341. // calculate adjustments required if top-right corner will be rendered.
  342. if (d_topright != NULL) {
  343. size_adj += (d_topright->getWidth() + d_topright->getOffsetX());
  344. }
  345. final_size.d_width = org_width - size_adj;
  346. final_size.d_height = d_top->getHeight();
  347. final_pos.d_x = coord_adj;
  348. final_pos.d_y = 0;
  349. // calculate final colours that are to be used
  350. if (calcColoursPerImage)
  351. {
  352. leftfactor = (final_pos.d_x + d_top->getOffsetX()) / org_width;
  353. rightfactor = leftfactor + final_size.d_width / org_width;
  354. topfactor = (final_pos.d_y + d_top->getOffsetY()) / org_height;
  355. bottomfactor = topfactor + final_size.d_height / org_height;
  356. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  357. }
  358. destArea.d_left = final_pos.d_x;
  359. destArea.d_top = final_pos.d_y;
  360. destArea.d_right = final_pos.d_x + final_size.d_width;
  361. destArea.d_bottom = final_pos.d_y + final_size.d_height;
  362. renderCache.cacheImage(*d_top, destArea, 0, final_colours);
  363. }
  364. // draw bottom-edge, if required
  365. if (d_bottom != NULL) {
  366. // calculate adjustments required if bottom-left corner will be rendered.
  367. if (d_bottomleft != NULL) {
  368. size_adj = (d_bottomleft->getWidth() - d_bottomleft->getOffsetX());
  369. coord_adj = d_bottomleft->getWidth();
  370. }
  371. else {
  372. coord_adj = 0;
  373. size_adj = 0;
  374. }
  375. // calculate adjustments required if bottom-right corner will be rendered.
  376. if (d_bottomright != NULL) {
  377. size_adj += (d_bottomright->getWidth() + d_bottomright->getOffsetX());
  378. }
  379. final_size.d_width = org_width - size_adj;
  380. final_size.d_height = d_bottom->getHeight();
  381. final_pos.d_x = coord_adj;
  382. final_pos.d_y = org_height - final_size.d_height;
  383. // calculate final colours that are to be used
  384. if (calcColoursPerImage)
  385. {
  386. leftfactor = (final_pos.d_x + d_bottom->getOffsetX()) / org_width;
  387. rightfactor = leftfactor + final_size.d_width / org_width;
  388. topfactor = (final_pos.d_y + d_bottom->getOffsetY()) / org_height;
  389. bottomfactor = topfactor + final_size.d_height / org_height;
  390. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  391. }
  392. destArea.d_left = final_pos.d_x;
  393. destArea.d_top = final_pos.d_y;
  394. destArea.d_right = final_pos.d_x + final_size.d_width;
  395. destArea.d_bottom = final_pos.d_y + final_size.d_height;
  396. renderCache.cacheImage(*d_bottom, destArea, 0, final_colours);
  397. }
  398. // draw left-edge, if required
  399. if (d_left != NULL) {
  400. // calculate adjustments required if top-left corner will be rendered.
  401. if (d_topleft != NULL) {
  402. size_adj = (d_topleft->getHeight() - d_topleft->getOffsetY());
  403. coord_adj = d_topleft->getHeight();
  404. }
  405. else {
  406. coord_adj = 0;
  407. size_adj = 0;
  408. }
  409. // calculate adjustments required if bottom-left corner will be rendered.
  410. if (d_bottomleft != NULL) {
  411. size_adj += (d_bottomleft->getHeight() + d_bottomleft->getOffsetY());
  412. }
  413. final_size.d_height = org_height - size_adj;
  414. final_size.d_width = d_left->getWidth();
  415. final_pos.d_y = coord_adj;
  416. final_pos.d_x = 0;
  417. // calculate final colours that are to be used
  418. if (calcColoursPerImage)
  419. {
  420. leftfactor = (final_pos.d_x + d_left->getOffsetX()) / org_width;
  421. rightfactor = leftfactor + final_size.d_width / org_width;
  422. topfactor = (final_pos.d_y + d_left->getOffsetY()) / org_height;
  423. bottomfactor = topfactor + final_size.d_height / org_height;
  424. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  425. }
  426. destArea.d_left = final_pos.d_x;
  427. destArea.d_top = final_pos.d_y;
  428. destArea.d_right = final_pos.d_x + final_size.d_width;
  429. destArea.d_bottom = final_pos.d_y + final_size.d_height;
  430. renderCache.cacheImage(*d_left, destArea, 0, final_colours);
  431. }
  432. // draw right-edge, if required
  433. if (d_right != NULL) {
  434. // calculate adjustments required if top-left corner will be rendered.
  435. if (d_topright != NULL) {
  436. size_adj = (d_topright->getHeight() - d_topright->getOffsetY());
  437. coord_adj = d_topright->getHeight();
  438. }
  439. else {
  440. coord_adj = 0;
  441. size_adj = 0;
  442. }
  443. // calculate adjustments required if bottom-left corner will be rendered.
  444. if (d_bottomright != NULL) {
  445. size_adj += (d_bottomright->getHeight() + d_bottomright->getOffsetY());
  446. }
  447. final_size.d_height = org_height - size_adj;
  448. final_size.d_width = d_right->getWidth();
  449. final_pos.d_y = coord_adj;
  450. final_pos.d_x = org_width - final_size.d_width;
  451. // calculate final colours that are to be used
  452. if (calcColoursPerImage)
  453. {
  454. leftfactor = (final_pos.d_x + d_right->getOffsetX()) / org_width;
  455. rightfactor = leftfactor + final_size.d_width / org_width;
  456. topfactor = (final_pos.d_y + d_right->getOffsetY()) / org_height;
  457. bottomfactor = topfactor + final_size.d_height / org_height;
  458. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  459. }
  460. destArea.d_left = final_pos.d_x;
  461. destArea.d_top = final_pos.d_y;
  462. destArea.d_right = final_pos.d_x + final_size.d_width;
  463. destArea.d_bottom = final_pos.d_y + final_size.d_height;
  464. renderCache.cacheImage(*d_right, destArea, 0, final_colours);
  465. }
  466. // draw required corner pieces...
  467. if (d_topleft != NULL) {
  468. // calculate final colours that are to be used
  469. if (calcColoursPerImage)
  470. {
  471. leftfactor = d_topleft->getOffsetX() / org_width;
  472. rightfactor = leftfactor + d_topleft->getWidth() / org_width;
  473. topfactor = d_topleft->getOffsetY() / org_height;
  474. bottomfactor = topfactor + d_topleft->getHeight() / org_height;
  475. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  476. }
  477. destArea.d_left = 0;
  478. destArea.d_top = 0;
  479. destArea.d_right = d_topleft->getWidth();
  480. destArea.d_bottom = d_topleft->getHeight();
  481. renderCache.cacheImage(*d_topleft, destArea, 0, final_colours);
  482. }
  483. if (d_topright != NULL) {
  484. final_pos.d_x = org_width - d_topright->getWidth();
  485. final_pos.d_y = 0;
  486. // calculate final colours that are to be used
  487. if (calcColoursPerImage)
  488. {
  489. leftfactor = (final_pos.d_x + d_topright->getOffsetX()) / org_width;
  490. rightfactor = leftfactor + d_topright->getWidth() / org_width;
  491. topfactor = (final_pos.d_y + d_topright->getOffsetY()) / org_height;
  492. bottomfactor = topfactor + d_topright->getHeight() / org_height;
  493. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  494. }
  495. destArea.d_left = final_pos.d_x;
  496. destArea.d_top = final_pos.d_y;
  497. destArea.d_right = final_pos.d_x + d_topright->getWidth();
  498. destArea.d_bottom = final_pos.d_y + d_topright->getHeight();
  499. renderCache.cacheImage(*d_topright, destArea, 0, final_colours);
  500. }
  501. if (d_bottomleft != NULL) {
  502. final_pos.d_x = 0;
  503. final_pos.d_y = org_height - d_bottomleft->getHeight();
  504. // calculate final colours that are to be used
  505. if (calcColoursPerImage)
  506. {
  507. leftfactor = (final_pos.d_x + d_bottomleft->getOffsetX()) / org_width;
  508. rightfactor = leftfactor + d_bottomleft->getWidth() / org_width;
  509. topfactor = (final_pos.d_y + d_bottomleft->getOffsetY()) / org_height;
  510. bottomfactor = topfactor + d_bottomleft->getHeight() / org_height;
  511. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  512. }
  513. destArea.d_left = final_pos.d_x;
  514. destArea.d_top = final_pos.d_y;
  515. destArea.d_right = final_pos.d_x + d_bottomleft->getWidth();
  516. destArea.d_bottom = final_pos.d_y + d_bottomleft->getHeight();
  517. renderCache.cacheImage(*d_bottomleft, destArea, 0, final_colours);
  518. }
  519. if (d_bottomright != NULL) {
  520. final_pos.d_x = org_width - d_bottomright->getWidth();
  521. final_pos.d_y = org_height - d_bottomright->getHeight();
  522. // calculate final colours that are to be used
  523. if (calcColoursPerImage)
  524. {
  525. leftfactor = (final_pos.d_x + d_bottomright->getOffsetX()) / org_width;
  526. rightfactor = leftfactor + d_bottomright->getWidth() / org_width;
  527. topfactor = (final_pos.d_y + d_bottomright->getOffsetY()) / org_height;
  528. bottomfactor = topfactor + d_bottomright->getHeight() / org_height;
  529. final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor);
  530. }
  531. destArea.d_left = final_pos.d_x;
  532. destArea.d_top = final_pos.d_y;
  533. destArea.d_right = final_pos.d_x + d_bottomright->getWidth();
  534. destArea.d_bottom = final_pos.d_y + d_bottomright->getHeight();
  535. renderCache.cacheImage(*d_bottomright, destArea, 0, final_colours);
  536. }
  537. }
  538. } // End of CEGUI namespace section