Guest User

Untitled

a guest
Jan 6th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <limits> // std::numeric_limits<>
  3. #include <cmath> // round()
  4. using namespace std;
  5.  
  6. #ifdef __linux
  7. #include <SDL/SDL.h>
  8. #else
  9. #include <SDL.h>
  10. #endif
  11.  
  12. #if __cplusplus < 201103L
  13. #error "Wymagany C++11!"
  14. #endif // __cplusplus
  15.  
  16.  
  17. SDL_Surface* screen;
  18. const int width = 900, height = 600;
  19. const char* title = "*insertlennyface*";
  20.  
  21.  
  22. /** Reguly oceniania:
  23. - Za bycie Ÿród³em plagiatu -0,5 punkta. Proszê swoje rozwi¹zanie zlikwidowaæ z komputera
  24. (najlepiej z maszymy wirtualnej wys³aæ sobie na maila, gdy¿ bêdzie potrzebne na nastêpny raz).
  25. - Za plagiat przyznaje za zadanie 0 punktow!!! Dodam, ze mam program antyplagiatowy.
  26. - Za niewpisanie w pliku z kodem swojego Nazwiska i Imienia powyzej [-0.1 punkta]
  27. - Za wrzucenie mi na pendrive/wyslanie na maila/za³adowanie na moodle wiecej niz jednego pliku zrodlowego (*.cpp) [-0.1 punkta]
  28. - Za nienazwanie pliku zrodlowego NazwiskoImie.cpp, gdzie Nazwisko i Imie zastepujemy odpowiednio swoim nazwiskiem i imieniem, zadnych podkreslen, spacji i numeru grupy [-0.1 punkta]
  29.  
  30. ***************************************** zajecia 6: 8 -bit color
  31. Naszym dzisiejszym zadaniem bêdzie zapisywanie koloru 256*256*256 na palecie 256 kolorów.
  32. W tym celu nasze sk³adowe R, G, B z których ka¿da mieœci siê na 8 bitach bêdziemy zapisywaæ odpowiednio na (3, 3, 2) bitach.
  33. Zadanie 1: Zaimplementowanie Funkcja1(), aby stosuj¹c przesuniêcie bitowe zapisywa³a kolory na mniejszej liczbie bitów.
  34. Proszê aby ekran by³ podzielony w nastêpuj¹cy sposób:
  35. - lewy górny prostok¹cik: oryginalny obrazek RGB
  36. - prawy górny: obrazek RGB, ale odtworzony ze sk³adowych z mniejszej iloœci bitów (na oko bêdzie bardziej pikselasty)
  37. - lewy i prawy dolny: mog¹ Pañstwo u¿yæ do zapamiêtywania pewnych informacji -ich nie sprawdzam
  38. [0.5 punkta].
  39. Zadanie 2: Zaimplementowanie Funkcja2(), podobnie jak Funkcja1(), ale stosujemy zaokr¹glanie do najbli¿szego koloru
  40. [0.5 punkta].
  41. Zadanie 3: Zaimplementowanie Funkcja3(), stosuj¹c algorytm Floyda-Steinberga dla obrazu 2-kolorowego.
  42. Algorytm proszê zastosowaæ tylko dla dwóch kolorów (jeœli jedna sk³adowa RGB>128 wstaw Bia³y, w przeciwnym razie Czarny).
  43. - lewy górny prostok¹cik: oryginalny obrazek RGB
  44. - prawy górny prostok¹cik: tylko sk³adowa R
  45. - lewy dolny prostok¹cik: tylko sk³adowa G
  46. - prawy dolny prostok¹cik: tylko sk³adowa B
  47. oczywiœcie jeœli ktoœ chce sobie utrudniæ ¿ycie i implementowaæ dla (R, G, B) to te¿ mo¿e.
  48. [1 punkt].
  49.  
  50. UWAGA: Proszê przynieœæ na nastêpny raz skoñczon¹ implementacjê -bêdzie potrzebna.
  51. Przypominam, ¿eby dopilnowaæ, aby nie dzieliæ siê swoim zadaniem bo wtedy -0,5 punkta.
  52.  
  53. Dodatkowo: Za ladny, czytelny, czysty, KONSEKWENTNY kod implementowanych funkcji, zaimplementowanych w 100% [+0.5 punkta].
  54. **/
  55.  
  56.  
  57. /// SDL_Color operators:
  58. ostream& operator<<(ostream& os, const SDL_Color color)
  59. {
  60. return os << "(" << (int)color.r << ", " << (int)color.g << ", " << (int)color.b << ")";
  61. }
  62.  
  63. inline bool operator==(const SDL_Color lhs, const SDL_Color rhs)
  64. {
  65. return lhs.r == rhs.r && lhs.g == rhs.g && lhs.b == rhs.b;
  66. }
  67.  
  68.  
  69. void Funkcja1(); // TODO: implement body
  70. void Funkcja2(); // TODO: implement body
  71. void Funkcja3(); // TODO: implement body
  72.  
  73. /// maybe next time:
  74. void Funkcja4();
  75. void Funkcja5();
  76. void Funkcja6();
  77. void Funkcja7();
  78. void Funkcja8();
  79. void Funkcja9();
  80.  
  81.  
  82. int initSdl();
  83.  
  84. void loadBMP(const char* nazwa, int x, int y);
  85.  
  86. void clearScreen(Uint8 R = 0, Uint8 G = 0, Uint8 B = 0);
  87.  
  88.  
  89. int main(int argc, char** argv)
  90. {
  91. if (initSdl())
  92. {
  93. return -1;
  94. }
  95.  
  96. pair<int, int> mousePosition{ 0, 0 };
  97. // program main loop
  98. bool done = false;
  99. while (!done)
  100. {
  101. // message processing loop
  102. SDL_Event event;
  103. while (SDL_PollEvent(&event))
  104. {
  105. if (SDL_QUIT == event.type)
  106. {
  107. done = true;
  108. }
  109. else if (SDL_KEYDOWN == event.type)
  110. {
  111. switch (event.key.keysym.sym)
  112. {
  113. case SDLK_ESCAPE:
  114. done = true;
  115. break;
  116. case SDLK_a:
  117. loadBMP("obrazek1.bmp", 0, 0);
  118. break;
  119. case SDLK_s:
  120. loadBMP("obrazek2.bmp", 0, 0);
  121. break;
  122. case SDLK_d:
  123. loadBMP("obrazek3.bmp", 0, 0);
  124. break;
  125. case SDLK_f: // zrodlo ponizszych obrazkow: https://pl.wikipedia.org/wiki/Algorytm_Floyda-Steinberga
  126. loadBMP("obrazek4.bmp", 0, 0);
  127. break;
  128. case SDLK_g:
  129. loadBMP("obrazek5.bmp", 0, 0);
  130. break;
  131.  
  132. case SDLK_b:
  133. clearScreen(0, 0, 0);
  134. break;
  135.  
  136. case SDLK_1:
  137. Funkcja1();
  138. break;
  139. case SDLK_2:
  140. Funkcja2();
  141. break;
  142. case SDLK_3:
  143. Funkcja3();
  144. break;
  145. case SDLK_4:
  146. Funkcja4();
  147. break;
  148. case SDLK_5:
  149. Funkcja5();
  150. break;
  151. case SDLK_6:
  152. Funkcja6();
  153. break;
  154. case SDLK_7:
  155. Funkcja7();
  156. break;
  157. case SDLK_8:
  158. Funkcja8();
  159. break;
  160. case SDLK_9:
  161. Funkcja9();
  162. break;
  163. }
  164. }
  165. if (SDL_MOUSEMOTION == event.type)
  166. {
  167. mousePosition = make_pair(event.motion.x, event.motion.y);
  168. }
  169. if (SDL_MOUSEBUTTONDOWN == event.type)
  170. {
  171. cout << "Kliknieto: (" << mousePosition.first << ", " << mousePosition.second << ")\n";
  172. }
  173. } // end of message processing
  174. } // end main loop
  175. return 0;
  176. }
  177.  
  178. #ifdef _WIN32
  179. // to solve problem: https://stackoverflow.com/questions/5259714/undefined-reference-to-winmain16
  180. int WinMain()
  181. {
  182. return main(1, NULL);
  183. }
  184. #endif // _WIN32
  185.  
  186. int initSdl()
  187. {
  188. if (SDL_Init(SDL_INIT_VIDEO) < 0)
  189. {
  190. printf("Unable to init SDL: %s\n", SDL_GetError());
  191. return 1;
  192. }
  193.  
  194. atexit(SDL_Quit);
  195.  
  196. const int bitDepth = 32;
  197.  
  198. /// create a new window
  199. screen = SDL_SetVideoMode(width, height, bitDepth, SDL_HWSURFACE | SDL_DOUBLEBUF);
  200. if (!screen)
  201. {
  202. printf("Unable to set video: %s\n", SDL_GetError());
  203. return 1;
  204. }
  205.  
  206. SDL_WM_SetCaption(title, NULL);
  207.  
  208. return 0;
  209. }
  210.  
  211. void loadBMP(char const* nazwa, int x, int y)
  212. {
  213. SDL_Surface* bmp = SDL_LoadBMP(nazwa);
  214. if (!bmp)
  215. {
  216. printf("Unable to load bitmap: %s\n", SDL_GetError());
  217. }
  218. else
  219. {
  220. SDL_Rect dstrect;
  221. dstrect.x = x;
  222. dstrect.y = y;
  223. SDL_BlitSurface(bmp, 0, screen, &dstrect);
  224. SDL_Flip(screen);
  225. SDL_FreeSurface(bmp);
  226. }
  227. }
  228.  
  229. void clearScreen(Uint8 R, Uint8 G, Uint8 B)
  230. {
  231. SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, R, G, B));
  232. SDL_Flip(screen);
  233. }
  234.  
  235. inline bool inScreen(int x, int y)
  236. {
  237. return x >= 0 && x < screen->w && y >= 0 && y < screen->h;
  238. }
  239.  
  240. Uint8* getPixelAddress(int x, int y)
  241. {
  242. if (inScreen(x, y))
  243. {
  244. /* Pobieramy informacji ile bajtów zajmuje jeden pixel */
  245. const int bpp = screen->format->BytesPerPixel;
  246.  
  247. /* Obliczamy adres pixela */
  248. return (Uint8*)screen->pixels + y * screen->pitch + x * bpp;
  249. }
  250. return NULL;
  251. }
  252.  
  253. SDL_Color getColor(int x, int y)
  254. {
  255. Uint8* pixelAddress = getPixelAddress(x, y);
  256.  
  257. SDL_Color color = {};
  258. if (pixelAddress)
  259. {
  260. Uint32 col = 0;
  261.  
  262. memcpy(&col, pixelAddress, screen->format->BytesPerPixel);
  263. SDL_GetRGB(col, screen->format, &color.r, &color.g, &color.b);
  264. }
  265.  
  266. return color;
  267. }
  268.  
  269. void setColor(int x, int y, Uint8 R, Uint8 G, Uint8 B)
  270. {
  271. Uint8* pixelAddress = getPixelAddress(x, y);
  272. if (pixelAddress)
  273. {
  274. Uint32 pixel = SDL_MapRGB(screen->format, R, G, B);
  275.  
  276. switch (screen->format->BytesPerPixel)
  277. {
  278. case 1: //8-bit
  279. *pixelAddress = pixel;
  280. break;
  281.  
  282. case 2: //16-bit
  283. *(Uint16*)pixelAddress = pixel;
  284. break;
  285.  
  286. case 3: //24-bit
  287. if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
  288. {
  289. pixelAddress[0] = (pixel >> 16) & 0xff;
  290. pixelAddress[1] = (pixel >> 8) & 0xff;
  291. pixelAddress[2] = pixel & 0xff;
  292. }
  293. else
  294. {
  295. pixelAddress[0] = pixel & 0xff;
  296. pixelAddress[1] = (pixel >> 8) & 0xff;
  297. pixelAddress[2] = (pixel >> 16) & 0xff;
  298. }
  299. break;
  300. case 4: //32-bit
  301. *(Uint32*)pixelAddress = pixel;
  302. break;
  303. }
  304. }
  305. /* update the screen (aka double buffering) */
  306. }
  307.  
  308. void setColor(int x, int y, SDL_Color color)
  309. {
  310. setColor(x, y, color.r, color.g, color.b);
  311. }
  312.  
  313. ////////////////////////////////////////////////////////////////////////////////////////////////////////////// TODO:
  314. void Funkcja1()
  315. {
  316. constexpr auto halveW = width / 2;
  317. constexpr auto halveH = height / 2;
  318.  
  319. for (int x = 0; x < halveW; ++x)
  320. for (int y = 0; y < halveH; ++y)
  321. {
  322. const SDL_Color currentColor = getColor(x, y);
  323. int red = (currentColor.r >> 6) << 6;
  324. int green = (currentColor.g >> 5) << 5;
  325. int blue = (currentColor.b >> 6) << 6;
  326. setColor(halveW + x, y, red, green, blue);
  327. }
  328.  
  329. SDL_Flip(screen);
  330. }
  331.  
  332. void Funkcja2()
  333. {
  334. constexpr auto halveW = width / 2;
  335. constexpr auto halveH = height / 2;
  336.  
  337. for (int x = 0; x < halveW; ++x)
  338. for (int y = 0; y < halveH; ++y)
  339. {
  340. const SDL_Color currentColor = getColor(x, y);
  341. int red = round(currentColor.r * 7 / 255);
  342. int green = round(currentColor.g * 7 / 255);
  343. int blue = round(currentColor.b * 3 / 255);
  344. setColor(halveW + x, y, red << 5, green << 5, blue << 6);
  345. }
  346.  
  347. SDL_Flip(screen);
  348. }
  349.  
  350. void Funkcja3()
  351. {
  352. constexpr auto halveW = width / 2;
  353. constexpr auto halveH = height / 2;
  354.  
  355. int e_tab[halveW + 2][halveH + 2] = { 0 };
  356. int e;
  357.  
  358. for (int x = 0; x < halveW; ++x)
  359. for (int y = 0; y < halveH; ++y)
  360. {
  361. const SDL_Color currentColor = getColor(x, y);
  362. if (128 > e_tab[x][y] + currentColor.g) {
  363. setColor(halveW + x, y, 0, 0, 0);
  364. e = currentColor.g + e_tab[x][y];
  365. }
  366. else {
  367. setColor(halveW + x, y, 255, 255, 255);
  368. e = currentColor.g + e_tab[x][y] - 255;
  369. }
  370. e_tab[x][y + 1] = e_tab[x][y + 1] + 7 * e / 16;
  371. e_tab[x + 1][y - 1] = e_tab[x + 1][y - 1] + 3 * e / 16;
  372. e_tab[x + 1][y] = e_tab[x + 1][y] + 5 * e / 16;
  373. e_tab[x + 1][y + 1] = e_tab[x + 1][y + 1] + e / 16;
  374. }
  375.  
  376. SDL_Flip(screen);
  377. }
  378.  
  379.  
  380. void Funkcja4()
  381. {
  382. // TODO maybe next time: but without plagiarism!
  383.  
  384. SDL_Flip(screen);
  385. }
  386.  
  387. void Funkcja5()
  388. {
  389. // TODO maybe next time: but without plagiarism!
  390.  
  391. SDL_Flip(screen);
  392. }
  393.  
  394. void Funkcja6()
  395. {
  396. // TODO maybe next time: but without plagiarism!
  397.  
  398. SDL_Flip(screen);
  399. }
  400.  
  401. void Funkcja7()
  402. {
  403. // TODO maybe next time: but without plagiarism!
  404.  
  405. SDL_Flip(screen);
  406. }
  407.  
  408.  
  409. void Funkcja8()
  410. {
  411. // TODO maybe next time: but without plagiarism!
  412.  
  413. SDL_Flip(screen);
  414. }
  415.  
  416. void Funkcja9()
  417. {
  418. // TODO maybe next time: but without plagiarism!
  419.  
  420. SDL_Flip(screen);
  421. }
Advertisement
Add Comment
Please, Sign In to add comment