diff --git a/README.md b/README.md index c25daddd590a9e542a79162751eac768902eaf45..f6c301338df3804f7fe23d7958bb20724291d87f 100644 --- a/README.md +++ b/README.md @@ -1515,3 +1515,108 @@ int main() fprintf(stdout, "%d + %d : %d \n", ia, ib, ic); } ``` + +## **Lecture 11** + +### rgba.c 코드 +``` +#include <stdio.h> + +typedef unsigned int t_rgba; + +// input value must be 0~255 + +/* +방법 1. 함수 만들기 +unsigned int fromRGBA(int r, int g, int b, int a) +{ + + if (r > 255 || r < 0) + r = 0; + if (g > 255 || g < 0) + g = 0; + if (b > 255 || b < 0) + b = 0; + if (a > 255 || a < 0) + a = 0; + if문 성능 나빠짐 + + + // return r*256*256*256 + g*256*256 + b*256 + a*1; + // return ((r<<24)+(g<<16)+(b<<8)+a); + // return ((r<<(24+g))<<(16+b))<<(8+1); + // return (r<<24|g<<16|b<<8|a); + return ((r&0xff)<<24)|((g&0xff)<<16)|((b&0xff)<<8)|(a&0xff); +} +*/ + +// 방법 2. macro +#define fromRGBA(r,g,b,a) ((((r)&0xff)<<24)|(((g)&0xff)<<16)|(((b)&0xff)<<8)|((a)&0xff)) +#define F_NUM_1_255 (1.0f/255.0f) + +t_rgba mul_float(t_rgba c1, t_rgba c2){ + float r1, g1, b1, a1; + float r2, g2, b2, a2; + int ir, ig, ib, ia; + + r1 = (float) ((c1 >> 24) & 0xff) * F_NUM_1_255; + g1 = (float) ((c1 >> 16) & 0xff) * F_NUM_1_255; + b1 = (float) ((c1 >> 8) & 0xff) * F_NUM_1_255; + a1 = (float) ((c1 >> 0) & 0xff) * F_NUM_1_255; + + r2 = (float) ((c2 >> 24) & 0xff) * F_NUM_1_255; + g2 = (float) ((c2 >> 16) & 0xff) * F_NUM_1_255; + b2 = (float) ((c2 >> 8) & 0xff) * F_NUM_1_255; + a2 = (float) ((c2 >> 0) & 0xff) * F_NUM_1_255; + + ir = (int) ((r1 * r2) * 255.0f); + ig = (int) ((g1 * g2) * 255.0f); + ib = (int) ((b1 * b2) * 255.0f); + ia = (int) ((a1 * a2) * 255.0f); + + return fromRGBA(ir, ig, ib, ia); +} + +t_rgba mul_int(t_rgba c1, t_rgba c2) +{ + unsigned int r1, g1, b1, a1; + unsigned int r2, g2, b2, a2; + unsigned int r, g, b, a; + + r1 = c1 >> 24 ; r2 = c2 >> 24 ; + g1 = (c1 >> 16) & 0xff ; g2 = (c2 >> 16) & 0xff; + b1 = (c1 >> 16) & 0xff ; b2 = (c2 >> 8) & 0xff; + a1 = c1 & 0xff ; a2 = c2 & 0xff; + + r= (r1 * r2) / 255; + g= (g1 * g2) / 255; + b= (b1 * b2) / 255; + a= (a1 * a2) / 255; + + return fromRGBA(r,g,b,a); + +} + +int main() +{ + int red, green, blue, alpha; + t_rgba rgba_1, rgba_2, rgba_3; + // input value must be 0~255 : 0.0~1.0 + // rgba_1 [rrrrrrrr][gggggggg][bbbbbbbb][aaaaaaaa] + printf("input 4 values with 0~255 : "); + scanf("%d %d %d %d", &red, &green, &blue, &alpha); + rgba_1 = fromRGBA(red, green, blue, alpha); + printf("%d %d %d %d : %u 0x%08x\n", red, green, blue, alpha, rgba_1, rgba_1); + rgba_2 = mul_float(rgba_1, rgba_1); + printf("%d %d %d %d : %u 0x%08x\n", red, green, blue, alpha, rgba_2, rgba_2); + rgba_3 = mul_int(rgba_1, rgba_1); + printf("%d %d %d %d : %u 0x%08x\n", red, green, blue, alpha, rgba_3, rgba_3); +} +``` +출력 결과 +``` +input 4 values with 0~255 : 127 127 127 127 +127 127 127 127 : 2139062143 0x7f7f7f7f +127 127 127 127 : 1061109567 0x3f3f3f3f +127 127 127 127 : 1061109567 0x3f3f3f3f +```