Á¦¸ñ : Ç㸣¹Ì ÇÑ±Û ¶óÀ̺귯¸® 2.0 [7] ¾È³çÇϼ¼¿ä Ç㸣¹ÌÀÔ´Ï´Ù. À̹ø °­Á¿¡¼­´Â µµÆ®´ÜÀ§ ÀÌ ¹ÌÁö ÀúÀå/º¹±Í·çƾÀ» ¸¸µé¾î º¸µµ·Ï ÇÏ°ÚÀ¾´Ï´Ù. À½ ¸»ÇÏÀÚ¸é putimage/getimage ·çƾÀ» ¸¸µå´Â °ÍÀε¥ ±×µ¿¾È ¼Ò°³µÇ¾ú´ø °¡ ·Î¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î Á¦ÇÑÇÑ ·çƾ°ú´Â Á» ´Ù¸¨´Ï´Ù. °¡·Î¸¦ ¹ÙÀÌ Æ® ´ÜÀ§·Î Á¦ÇÑÇÑ´Ù¸é ¼Óµµ´Â ¾öû³ª°Ô ºü¸£°Ô ÇÒ ¼ö ÀÖÁö¸¸ µµ Æ® ´ÜÀ§ ¶óÀ̺귯¸®¿¡´Â ¸ÂÁö ¾ÊÀ» »Ó ¾Æ´Ï¶ó ±×·¡ÇÈ µî°ú È¥¿ë ÇÒ¶§ µðÀÚÀÎÀÇ ¹®Á¦°¡ Å®´Ï´Ù. µû¶ó¼­ °á±¹ °¡·Î¸¦ µµÆ®´ÜÀ§·Î Áö¿øÇ쵂 ºü¸¥ ¼Óµµ ( È­¸é¿¡ º¹±ÍµÇ´Â °úÁ¤ÀÌ º°·Î Ƽ°¡ ¾È ³¯ Á¤µµ..) ¸¦ Á¦°øÇÏ´Â °ÍÀÌ ÇÊ¿äÇÕ´Ï´Ù. BGI ¸¦ »ý°¢ÇØ º¾½Ã´Ù. getimage/putimage ´Â °¡·Î/¼¼·Î¸¦ ¸ðµÎ µµÆ®´ÜÀ§·Î Çϸ鼭 putimage ¿¡¼­ XOR_PUT µî ´Ù¾çÇÑ ¼Ó¼ºÀ» Á¦°øÇÏ´Â µî ±×¾ß¸»·Î super ÇÔ¼öÀÇ ±â´ÉÀ» °¡Áö°í ÀÖÀ¾´Ï´Ù. ÇÏÁö¸¸ °íÁúÀûÀÎ ´À¸° ¼Ó µµ¶§¹®¿¡ putimage ¸¦ À̹ÌÁö Ãâ·ÂÀ̳ª À©µµ¿ì ºÎºÐÀÇ ÀúÀå/º¹±Í ¿¡ ÀÌ¿ëÇÒ ¼ö´Â ¾ø´Â °ÍÀÌ »ç½ÇÀÔ´Ï´Ù. ±×·³ Áö±Ý±îÁöÀÇ ³»¿ëÀ» Á¤¸®ÇØ º¸¸é... 1. °¡·Î/¼¼·Î¸¦ ¸ðµÎ µµÆ®´ÜÀ§·Î Áö¿øÇ쵂 2. ±âÁ¸ÀÇ putimage/getimage º¸´Ù ¼ÓµµÇâ»ó ¸ðµÎµé ¾Æ½Ã°ÚÁö¸¸ BGI ¸¦ ¼³°èÇÑ Borland »ç´Â Á¤¸» ´ë´ÜÇÑ È¸ »çÀÔ´Ï´Ù. BGI ´Â ¸Å¿ì ¸¹Àº ºñµð¿À Ä«µå¸¦ Áö¿øÇϱâ À§Çؼ­ ´Ù ¼ÒÀÇ ¼ÓµµÈñ»ýÀ» Ä¡¸£°í ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í »ó´çÇÑ ¼Óµµ¸¦ Á¦°ø ÇØ ÁÝ´Ï´Ù. »ç½Ç Á¦°¡ putimage/getimage ´ë¿ë ÇÔ¼ö¸¦ ¸¸µé¾î º¸ ¾ÒÁö¸¸ ±âÁ¸ÀÇ ÇÔ¼ö¿Í ºñ½ÁÇÑ ¼Óµµ Á¤µµ ¹Û¿¡´Â ³¾ ¼ö ¾ø¾úÀ¾´Ï ´Ù. COPY_PUT ¸¸ Áö¿øÇÑ´Ù°í Çϸé Á¶±Ý ´õ »¡¶óÁö°ÚÁö¸¸ ¿ª½Ã »ç ¿ëÇϱ⿡´Â ´À¸³´Ï´Ù. ±×·¸´Ù¸é ¿Ö ±×·¸°Ô putimage/getimage ÇÔ ¼ö´Â ´À·Á¾ß ÇÏ´Â °ÍÀÎÁö¸¦ »ìÆ캾½Ã´Ù. ¿ì¼± getimage ¸¦ »ìÆ캾½Ã´Ù. getimage ´Â »ç½Ç º°·Î ½Ã°£ÀÌ °É¸®Áö ¾Ê½À´Ï´Ù. ¿Ö³ÄÇÏ¸é ±¸Å¿© µµÆ®´ÜÀ§¶ó´Â °ÍÀ» »ý °¢Áö ¾Ê¾Æµµ µÇ±â ¶§¹®ÀÌÁÒ. ±×´ë·Î ¹ÙÀÌÆ®ÇüÀÇ ÀڷḦ ¹öÆÛ¿¡ ÀúÀåÇϹǷΠÇÊ¿äÇÑ ³»¿ëÀº ½ÇÁ¦ x ÀÇ ¹üÀ§¿Í ¹ÙÀÌÆ® ÇüÀÇ ÀÚ·áµé ÀÔ´Ï´Ù. ±×·¯³ª putimage ¸¦ »ý°¢ÇØ º¸¸é ÀÌ ¹ÙÀÌÆ® ÇüÀÇ ÀڷḦ ´Ù½Ã »õ·Î¿î µµÆ® ÁÂÇ¥¿¡ Ç¥½ÃÇϱâ À§Çؼ­ bit ´ÜÀ§ÀÇ shift °¡ ÇÊ¿äÇÕ´Ï´Ù. À̶§ Carry °¡ µÇ´Â ºÎºÐÀº ´ÙÀ½ ¹ÙÀÌÆ®·Î °è½ÂµÇ´Â °úÁ¤À» °¢ ¹ÙÀÌÆ® ¸¶´Ù ¹Ýº¹ÇÏ¿©¾ß ÇÕ´Ï´Ù. µû¶ó¼­ putimage ´Â ´À¸±¼ö ¹Û¿¡ ¾ø´Â °ÍÀÔ´Ï´Ù. Àú´Â ¿©±â¼­ ÇϳªÀÇ Á¦¾àÁ¶°ÇÀ» ¼³ Á¤ÇÔÀ¸·Î½á ¼Óµµ¿Í ±â´ÉÀ̶ó´Â µÎ°¡Áö Ãø¸éÀ» ÇØ°áÇØ º¸·Á°í ÇÕ ´Ï´Ù. ÀÌ Á¦¾à Á¶°ÇÀ̶ó´Â °ÍÀº °£´ÜÇÕ´Ï´Ù. Áï hgGetImage ÇÔ¼ö ·Î ¹öÆÛ¿¡ ÀúÀåÇÑ ºÎºÐÀ» hgPutImage ÇÔ¼ö·Î º¹±ÍÇÒ¶§´Â °¡·Î,¼¼ ·Î ¸ðµÎ µµÆ®´ÜÀ§Áö¿øÀÌ °¡´ÉÇÏÁö¸¸ ¼­·ÎÀÇ ÁÂÇ¥´Â °°¾Æ¾ß ÇÑ´Ù ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é hgGetImage(x1,y1,x2,y2,buff); . . . hgPutImage(x1,y1,x2,y2,buff); free(buff); ó·³ ¹Ýµå½Ã ½ÖÀ» ÀÌ·ç¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. º¸Åë ÀÌ·¯ÇÑ ÀÌ¹Ì Áö ÀúÀå/º¹±Í ·çƾÀº ¾î¶² ¿µ¿ªÀ» ÀúÀåÇß´Ù°¡ ±× À§¿¡ ¹«¾ùÀΰ¡ ¸¦ ¾²°í ´Ù½Ã ¿ø·¡ÀÇ ¸ð½ÀÀ¸·Î º¹±Í½Ãų¶§ »ç¿ëÇϹǷΠ»ç½Ç hgGetImage ¿Í hgPutImage ÀÇ Àμö°¡ °°¾Æ¾ß ÇÑ´Ù´Â °ÍÀº Ưº°ÇÑ °æ¿ì°¡ ¾Æ´Ï°í´Â ±×¸® ºÎ´ãÀÌ µÇ¸®¶ó°í »ý°¢Áö´Â ¾Ê½À´Ï´Ù. Àû¾î µµ Ç®´Ù¿î ¸Þ´º³ª °£´ÜÇÑ À©µµ¿ì ·çƾµîÀ» ¼³°èÇÏ´Â µ¥´Â ¹®Á¦°¡ ¾øÀ¾´Ï´Ù. ÀÌ Á¦¾à Á¶°ÇÀº hgPutImage ÀÇ ÀÛ¿ëÀ» °£´ÜÈ÷ ÇØÁÝ´Ï´Ù. Áï bit ´ÜÀ§ÀÇ shift ³ª rotate °¡ ÇÊ¿ä¾ø°Ô µÇ¹Ç·Î ¹ÙÀÌÆ®³ª ¿öµå´ÜÀ§ ÀÇ Àü¼ÛÀÌ °¡´ÉÇÏ°Ô µÇ´Â °ÍÀÌÁÒ. ´ë½Å ¾ç³¡Àº µµÆ®´ÜÀ§·Î ±¸Çö ÇÏ·Á¸é mask ¸¦ Æ÷ÇÔÇؼ­ ÀúÀåÇØ¾ß ÇÕ´Ï´Ù. ¾Æ·¡ÀÇ ºÎºÐ¼Ò½º¸¦ º¾½Ã´Ù. void hgVGetImage(int x1,int y1,int x2,int y2,char *buff) { int xs=x1/8+1; int xe=x2/8-1; unsigned offset; buff[0]=get_mask(x1); buff[1]=~get_mask(x2+1); if (!buff[1]) buff[1]=0xff; vgagetimage(xs,y1,xe,y2,&buff[2]); offset=(y2-y1+1)*(xe-xs+1)*4+2; vgagetimage(xs-1,y1,xs-1,y2,&buff[offset]); offset+=(y2-y1+1)*4; vgagetimage(xe+1,y1,xe+1,y2,&buff[offset]); } vga ÀÇ °æ¿ì¿¡ x1,y1~x2,y2 ¸¦ buff ¿¡ ´ã´Â ÇÔ¼öÀÔ´Ï´Ù. Çü½ÄÀº Àͼ÷ÇϽǰÍÀ¸·Î »ý°¢µË´Ï´Ù. get_mask ÇÔ¼ö´Â Àü°­Á¿¡¼­ ¼Ò°³µÇ ¾ú´ø °Í°ú °°½À´Ï´Ù. Áï buff ÀÇ 0 ¹ø°¿Í 1 ¹ø°´Â °¢°¢ ¿ÞÂÊ, ¿À¸¥ÂÊ mask ¸¦ ÀúÀåÇÕ´Ï´Ù. ±×´ÙÀ½ºÎÅÍ°¡ ¹®Á¦Àε¥ &buff[2] ºÎ ÅÍ vgagetimage(xs,y1,xe,y2,~~); ¶ó´Â ¹®ÀåÀÌ º¸ÀÔ´Ï´Ù. xs ¿Í xe ´Â x1,x2 ÀÇ ¹ÙÀÌÆ®·Î truncate ÇÑ ÁÂÇ¥À̹ǷΠ¾ç ³¡ µµÆ®´Ü À§·Î À߸®´Â ºÎºÐÀ» Á¦¿ÜÇÏ°í ¹ÙÀÌÆ® ´ÜÀ§·Î ÀúÀåÇصµ µÇ´Â ºÎºÐ À» ¸»ÇÕ´Ï´Ù. ÀÌ ºÎºÐÀ» ÀÏ´Ü buff[2] ÀÌÈĺÎÅÍ ÀúÀåÇÕ´Ï´Ù. ±× ´ÙÀ½Àº ¿ª½Ã ¹ÙÀÌÆ® ´ÜÀ§·Î ¹öÆÛ¿¡ ´ã´Â ÇÔ¼öÀÎ vgagetimage ÇÔ ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¿ÞÂÊ ³¡,¿À¸¥ÂÊ ³¡À» ¹öÆÛ¿¡ ÀúÀåÇÕ´Ï´Ù. ±×·±µ¥ ¿©±â¼­ Àá±ñ »ìÆ캼°ÍÀº ÁÂÇ¥¿Í È®º¸µÇ¾î¾ß ÇÒ Å©±âÀÇ °ü°èÀÔ´Ï ´Ù. ¾Æ·¡ÀÇ ÇÔ¼ö¸¦ º¸°ÚÀ¾´Ï´Ù. unsigned hgImgSize(int x1,int y1,int x2,int y2) { unsigned size; int xs=x1/8+1; int xe=x2/8-1; size=(xe-xs+1)*(y2-y1+1)*4; size+=((y2-y1+1)*2*4); /* for side */ size+=2; /* for two masks */ return size; } side ¿Í two mask ÀÇ ÀÚ¸®¸¦ °í·ÁÇÏ¿© °è»êÇÏ°í ÀÖÀ¾´Ï´Ù. À̹ø ¹öÁ¯¿¡¼­´Â ¹Ýµå½Ã ÀÌ ÇÔ¼ö¸¦ ½á¾ß ¿Ã¹Ù·Î ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù.´ÙÀ½ Àº hgVPutImage ÀÔ´Ï´Ù. void hgVPutImage(int x1,int y1,int x2,int y2,char *buff) { int xs=x1/8+1; int xe=x2/8-1; unsigned offset; unsigned char lmask,rmask; lmask=buff[0]; rmask=buff[1]; vgaputimage(xs,y1,xe,y2,&buff[2]); offset=(y2-y1+1)*(xe-xs+1)*4+2; outportb(0x3ce,8); outportb(0x3cf,lmask); vgaputimage(xs-1,y1,xs-1,y2,&buff[offset]); offset+=(y2-y1+1)*4; outportb(0x3ce,8); outportb(0x3cf,rmask); vgaputimage(xe+1,y1,xe+1,y2,&buff[offset]); outport(0x3ce,0x0ff08); } Á¶±Ý º¹ÀâÇÕ´Ï´Ù. ÀÏ´Ü buff[0] °ú buff[1] ÀÇ lmask,rmask ¸¦ °¡Á®¿É´Ï´Ù. vgaputimage ´Â x1,y1~x2,y2 ¿¡ ( ¹ÙÀÌÆ® ´ÜÀ§ÁÂÇ¥ ) buff ¸¦ º¹±ÍÇÏ´Â ±â´ÉÀ» °¡Áý´Ï´Ù. ÇÏÁö¸¸ ¿¹ÀüÀÇ Ç㸣¹Ì 1.0 ¿¡¼­ ÀÖ¾ú´ø ÇÔ¼ö¿Í´Â °áÁ¤ÀûÀÎ Â÷ÀÌ°¡ Àִµ¥ ÇÔ¼ö ³»¿¡¼­ bit mask ¸¦ ÃʱâÈ­ ÇÏ´Â ºÎºÐÀÌ ¾øÀ¾´Ï´Ù. Áï 8 ¹øÀÇ ºñÆ® ¸¶½ºÅ©¸¦ °Çµå¸®Áö ¾ÊÀ½À¸·Î½á ¿ÜºÎ¿¡¼­ À̸¦ Á¦¾îÇÔ¿¡ µû¶ó ´Ù¸£°Ô ÀÛµ¿ ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. óÀ½¿¡´Â ¹ÙÀÌÆ® ´ÜÀ§·Î Ãâ·ÂÇØ¾ß ÇϹǷΠ±×³É Ãâ·ÂÇÏ°í ¹öÆÛ»ó¿¡¼­ÀÇ offset À» ÀüÁø½ÃŲÈÄ lmask ·Î ºñÆ® ¸¶ ½ºÅ©¸¦ ¼¼Æ®ÇÏ°í vgaputimage ÇÔ¼ö·Î ¿ÞÂÊ side ¸¦ Ãâ·ÂÇÏ °í,rmask ·Î ºñÆ®¸¶½ºÅ©¸¦ ¼¼Æ®ÇÏ°í vgaputimage ÇÔ¼ö·Î ¿À¸¥ÂÊ side ¸¦ Ãâ·ÂÇÏ¸é º¹±Í°¡ ¿Ï°áµË´Ï´Ù. ¸¶Áö¸·¿¡ ºñÆ®¸¶½ºÅ©¸¦ 0xff ·Î ÃʱâÈ­ ÇÔÀ» ÀØÁö ¸»¾Æ¾ß ÇÕ´Ï´Ù. ÀÌ hgVPutImage ÇÔ¼ö ´Â ¾à°£ÀÇ Æ®¸¯À» ½á¼­ µµÆ®´ÜÀ§ º¹±Í ¸ðµâÀ» ±¸ÇöÇÏ°í Àִµ¥ ´ë½Å ÃÖ´ëÇÑ ¹ÙÀÌÆ® ´ÜÀ§ º¹±Í ¸ðµâÀ» ÀÌ¿ëÇϹǷΠ¾ç³¡À» Á¦¿ÜÇÏ ¸é ¿ø·¡ÀÇ ¹ÙÀÌÆ® ´ÜÀ§ º¹±Í ¸ðµâ°ú °ÅÀÇ °°Àº ¼Óµµ¸¦ ³¾ ¼ö ÀÖ ´Â ÀåÁ¡ÀÌ ÀÖÀ¾´Ï´Ù. ¶ÇÇÑ º¸Åë ÀúÀåÇØ ³õÀº ºÎºÐÀ» ±×ÀÚ¸®¿¡ º¹ ±ÍÇÏ´Â °æ¿ì°¡ ´ëºÎºÐÀ̹ǷΠÀÌ °æ¿ì¿¡´Â ºÒÆí ¾øÀÌ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ±×·¯³ª MOVE ¸¦ À§Çؼ­´Â ÀÌ ·çƾÀ» ÀÌ¿ëÇÒ ¼ö ¾ø´Âµ¥ ±×¸¦ À§Çؼ­´Â º°µµÀÇ ·çƾÀ̳ª BGI ÀÇ getimage / putimage ¸¦ ÀÌ¿ëÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù. Á¦°¡ ÀÌ°ÍÀ» ÀÌ¿ëÇؼ­ Ç®´Ù ¿î ¸Þ´º¸¦ ¸¸µé¾î º» °á°ú´Â ´ëü·Î ¸¸Á·½º·¯¿üÀ¾´Ï´Ù. ¼Óµµµµ ¾µ¸¸ÇÏ°í ¹«¾ùº¸´Ù È­¸é µðÀÚÀÎÀ» ¸¶À½´ë·Î ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ ÁÁ¾ÒÀ¾´Ï´Ù. ±×·³ vgagetimage ÇÔ¼ö¿Í vgaputimage ÇÔ¼ö¸¦ ¼Ò°³ Çϸ鼭 À̹ø °­Á¸¦ ¸¶Ä¡°ÚÀ¾´Ï´Ù. Àú¹ø 1.0 ÀÇ ÇÔ¼öµé°ú °ÅÀÇ ¼³¸íÀÌ °°À¸¹Ç·Î º°µµÀÇ ¼³¸íÀº ÇÏÁö ¾Ê°ÚÀ¾´Ï´Ù. ´ÙÀ½ °­Á´ À©µµ¿ì Ŭ·¡½º Á¤ÀÇ..°¡ µÇ°ÚÀ¾´Ï´Ù. void vgagetimage(int x1,int y1,int x2,int y2,char *buff) { int y_width=y2-y1+1; int x_width=x2-x1+1; unsigned max=80; asm push ds _BX=y1*max; _ES=FP_SEG(buff); _DI=FP_OFF(buff); asm mov ax,0a000h asm mov ds,ax _CX=y_width; asm mov dx,3ceh asm add bx,x1 get_loop1: asm push cx asm mov ah,3 get_loop2: asm mov al,4 asm out dx,ax asm mov si,bx _CX=x_width; asm cld asm REP movsb asm dec ah asm jns get_loop2 asm add bx,max asm pop cx asm loop get_loop1 asm mov al,4 asm mov ah,0fh asm out dx,ax asm pop ds } void vgaputimage(int x1,int y1,int x2,int y2,char *buff) { int x_width=x2-x1+1; int y_width=y2-y1+1; unsigned max=80; asm mov dx,03ceh asm mov ax,5 asm out dx,ax asm push ds _BX=y1*max; _DS=FP_SEG(buff); _SI=FP_OFF(buff); asm mov ax,0a000h asm mov es,ax asm mov dx,3c4h asm add bx,x1 _CX=y_width; put_loop1: asm mov ah,8 asm push cx put_loop2: asm mov al,2 asm out dx,ax asm mov cx,x_width; asm mov di,bx asm cld put_loop3: asm mov al,es:[di] asm movsb asm loop put_loop3 asm shr ah,1 asm jnc put_loop2 asm add bx,max asm pop cx asm loop put_loop1 asm mov ax,0f02h asm out dx,ax asm pop ds } ±×·³..Ç㸣¹Ì! ¿©·¯ºÐ.. ¸Þ¸® Å©¸®½º¸¶½º..±×¸®°í ÁÁÀº »õÇØ µÇ½Ã ±â¸¦ ºô¾î¿ä...