Á¦¸ñ : Ç㸣¹Ì ÇÑ±Û ¶óÀ̺귯¸® 2.0 [5] ¾È³çÇϼ¼¿ä.Ç㸣¹Ó´Ï´Ù.¿À´ÃÀº À©µµ¿ì ·çƾÀ» ¸¸µé±â À§ÇÑ ±â º» ·çƾµéÀ» ¸¸µé¾î º¸µµ·Ï ÇÏÁÒ. À½..À©µµ¿ì ·çƾÀ̶ó¸é ¹«¾ùÀÌ ÀÖÀ» ±î¿ä.. °¡Àå ±âº»ÀûÀÎ °ÍÀ¸·Î È­¸é (x1,y1)~(x2,y2) ¿¡ ÀÏÁ¤ Title °ú »öÀ» °¡Áö°í ¹Ú½º¸¦ ¿­¾îÁÖ´Â °ÍÀÌ ÀÖÀ» ¼ö ÀÖ°ÚÁÒ. ÀÌ À©µµ¿ìÀÇ µðÀÚ ÀÎÀº Windows 3.0 À̳ª GeoWorks °°Àº ÇÁ·Î±×·¥À» º¸¸é Âü ½Å°æÀ» ½á ¼­ ÀÔüÀûÀ¸·Î Àß µÇ¾î ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖ¾î¿ä. Àú´Â GeoWorks ¸¦ Á¶ ±Ý Âü°íÇؼ­ ³ª¸§´ë·Î µðÀÚÀÎ ÇØ º¸¾Ò´Âµ¥ Àß µÇ¾ú´ÂÁö´Â...ÂÁ..Àß ¸ð ¸£°Ú¾î¿ä.. ¾î¶µç ´Ü¼øÇÑ ¹Ú½º¸¦ ±×¸®´Â Àϸ¸ Çصµ ±×Àú ¾î¶² »öÀ¸·Î ³×¸ð¸¦ ±×¸®¸é ÀÔü°¨ÀÌ ³ªÁö ¾ÊÁö¿ä.. º¸Åë ¾ç°¢,À½°¢À¸·Î ±¸ºÐÇÒ ¼ö Àִµ¥ ÀÌ°ÍÀ» Àß ¼¯¾î¼­ ¾²¸é µÇ´Â °ÅÁÒ. ¾ç°¢Àº »ç°¢ÇüÀÇ ¿ÞÂÊ°ú À§ ¸¦ ¹àÀº»ö(Èò»ö) À¸·Î ÇÏ°í ³ª¸ÓÁö¸¦ °ËÀº»öÀ¸·Î ÇÏ°í ±× ¾ÈÀ» Áß°£»ö À¸·Î ä¿ì¸é µË´Ï´Ù. À½°¢Àº Áß°£»öÀº ±×´ë·Î°í ³ª¸ÓÁöºÎºÐÀÇ »öÀ» ¼­ ·Î ¹Ù²Ù¸é µË´Ï´Ù. Å׵θ®ÀÇ ±½±â¿¡ µû¶ó ÀÔü°¨ÀÇ Â÷ÀÌ°¡ ³ªÅ¸³³´Ï ´Ù. Àú °°Àº °æ¿ì¿¡´Â ¹öÆ°°ú °°Àº °ÍÀº Å׵θ®¸¦ 2~3 ÁÙ Á¤µµ »ç¿ëÇÏ °í ³ª¸ÓÁö´Â 1 ÁÙÀ» ¾²°í ÀÖÁÒ. ¾î¶µç ÀÌ·¯ÇÑ °ÍÀ» ±¸ÇöÇϱâ À§Çؼ­ ´Â Low Level ºÎÅÍÀÇ ·çƾÀÌ Áö¿øµÇ¾î¾ß ÇÏ´Â °ÍÀº »ç½ÇÀÔ´Ï´Ù. ´çÀå ÇÊ¿äÇÑ ·çƾÀÌ ¼±±ß±â,¹Ú½ºÄ¥Çϱâ ÀÔ´Ï´Ù. ¹°·Ð ¸ðµÎ µµÆ®´ÜÀ§·Î Áö¿ø ÀÌ µÇ¾î¾ß °ÚÁÒ. ±×·³ ¼±±ß±â¿¡ ´ëÇؼ­ ¸ÕÀú ¾Ë¾Æº¸°ÚÀ¾´Ï´Ù. ¼±À» ±ß ´Â ¹æ¹ýÁß ºü¸¥ ¾Ë°í¸®ÁòÀº Bresenham's Algorithm À̶ó´Â °ÍÀÌ ¾Ë·Á Á® ÀÖÀ¾´Ï´Ù. ±×·¯³ª.. À©µµ¿ì ·çƾ¿¡¼­´Â °¡·Î¼±°ú ¼¼·Î¼±¸¸ ÀÖÀ¸¸é µË´Ï´Ù.. µû¶ó¼­ º¸´Ù Ư¼öÇÑ Ã³¸®¿¡ ÀÇÇؼ­ ¼ÓµµÀÇ Çâ»óÀÌ °¡´ÉÇØ Áý ´Ï´Ù. Bresenham's Algorithm Àº Á¡À» ÇϳªÇϳª Âï¾î¾ß Çϱ⠶§¹®¿¡ ¾Ë°í¸®Áò ÀÚü°¡ ºü¸£´Ù ÇÒ Áö¶óµµ ´À¸±¼ö ¹Û¿¡ ¾ø°Åµç¿ä. ¹°·Ð ÀÌ ¾Ë °í¸®ÁòÀ» ÀÌ¿ëÇÑ ¼±±×¸®±â ·çƾµµ ÈÄ¿¡ Á¦°øÇÒ °ÍÀÔ´Ï´Ù. ±×·³ °¡·Î¼± ±ß±â¿Í ¼¼·Î¼±±ß±â·çƾÀ» Á¦ÀÛÇØ º¾½Ã´Ù. ¿ì¼± ¼¼·Î¼± ±ß±â.. ¼¼·Î¼± ±ß±â´Â ¹«Ã´ °£´ÜÇÕ´Ï´Ù. ¼¼·Î¸¦ µµÆ®´ÜÀ§·Î ¸¸µå´Â °ÍÀº ±×¸® ¾î·ÆÁö ¾Ê±â ¶§¹®ÀÌÁÒ. »ý°¢ÇØ º¼ ÇϳªÀÇ ¹®Á¦¶ó¸é °¡·Î°¡ µµÆ®´ÜÀ§À̹ǷΠ8 ºñÆ®¸¦ ÇÑ ¹­À½À¸·Î ÇÏ´Â ¹ÙÀÌÆ® À§Ä¡ÀÇ ¾î´À°÷À» 1 ·Î ÇØ¾ß ÇÏ´Â °¡ ÀÇ °áÁ¤ÀÔ´Ï´Ù. ¾Æ·¡ÀÇ ÇÔ¼ö¸¦ º¾½Ã´Ù. unsigned char get_vmask(int x) { unsigned char mask=0x80; int r=x%8; mask>>=r; return mask; } ÀÌ ÇÔ¼ö°¡ ÇÏ´Â ÀÏÀº µµÆ®ÁÂÇ¥·Î Ç¥½ÃµÈ x ¿¡ ÀÇÇؼ­ ¹ÙÀÌÆ®À§Ä¡ÀÇ x À§Ä¡¸¦ ¾Ë·ÁÁÖ´Â mask ¸¦ ¸®ÅÏÇØ ÁÝ´Ï´Ù. °è»ê½ÄÀº 0x80 À̶ó´Â ºñÆ® ¸Ê½ºÆ®¸µÀ» x ¸¦ 8 ·Î ³ª´« ³ª¸ÓÁö¸¸Å­ ¿À¸¥ÂÊ ½¬ÇÁÆ® ÇÏ°í ÀÖÀ¾´Ï´Ù. º°´Ù¸¥ Å×Å©´ÐÀº ¾Æ´ÏÁö¸¸ ¶óÀ̺귯¸®¿¡¼­ »ó´çÈ÷ ¸¹ÀÌ ¾²ÀÌ´Â ÇÔ¼öÀÌ ¹Ç·Î ±â¾ïÇØ µÎ¼¼¿ä. ±×·³ ¼¼·Î·Î ¼±À» ±ß´Â ÇÔ¼öÀÇ Çü½ÄÀ» º¾½Ã´Ù. void vvertline(int x,int y1,int y2,char color,unsigned char mask) x ´Â Çϳª·Î Á¤ÇØÁ® ÀÖ°í y1,y2 ±îÁö¸¦ color ·Î.. ´Ü mask ´Â ¹Ì¸® °è»êÇÏ¿© ÁÖ¾î¾ß ÇÕ´Ï´Ù. ¹°·Ð »ç¿ëÀÚ°¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀº ¾Æ ´ÏÁÒ. »ç¿ëÀÚ´Â ´ÙÀ½ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. void hgVvline(int x,int y1,int y2,char color) { vvertline(x>>3,y1,y2,color,get_vmask(x)); } ±×·³ ³²Àº °ÍÀº vvertline ÀÇ ¼³°èÀε¥.. ±×¸® ¾î·ÆÁö ¾ÊÀ¸¹Ç·Î °ð¹Ù ·Î ¼Ò½º»ó¿¡¼­ ¼³¸íÀ» Çϵµ·Ï ÇÏ°ÚÀ¾´Ï´Ù. void vvertline(int x,int y1,int y2,char color,unsigned char mask) { _CX=y2-y1+1; asm mov bx,80 asm mov ax,WORD PTR y1 asm mul bx /* y1*80 asm add ax,WORD PTR x /* +x asm mov di,ax /* di = offset asm mov ax,0a000h asm mov es,ax asm mov dx,03ceh asm mov ax,0205h /* ¾²±â ¸ðµå 2 asm out dx,ax asm mov al,8 asm mov ah,BYTE PTR mask /* Bitmask asm out dx,ax asm mov ah,BYTE PTR color /* color vloop: asm mov al,es:[di] /* ·¡Ä¡ÀоîµéÀÓ asm mov es:[di],ah /* ¾´´Ù. asm add di,80 /* ¿É¼ÂÁ¶Á¤.(ÇÑÄ­ ³»¸²) asm loop vloop asm mov ax,0005h /* initializing asm out dx,ax asm mov ax,0ff08h asm out dx,ax } ±×·¯¸é °¡·Î¼±À» »ìÆ캸µµ·Ï ÇÏ°ÚÀ¾´Ï´Ù.. °¡·Î¼±À» ±×À»¶§ÀÇ ¹®Á¦¶ó ¸é ¼±À» ±ß´Â ÀÛ¾÷À» µÎ¹ø ÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¿Ö³ÄÇϸé x1,y1~x2,y1 À̶ó°í ÇÒ¶§ x1~x2 »çÀÌ¿¡´Â 8 bit °¡ 1 ·Î °¡µæÂù ºÎºÐ µµ ÀÖ°ÚÁö¸¸ ÃÖ¼ÒÇÑ ¾ç³¡Àº masking ÀÛ¾÷ÀÌ ÀÌ·ç¾î Á®¾ß ÇÒ °ÍÀÔ´Ï´Ù. µû¶ó¼­ ¾ç³¡À» Á¦¿ÜÇÑ ³ª¸ÓÁö¸¦ ¸ÕÀú ¹ÙÀÌÆ® ´ÜÀ§ÀÇ ¶óÀα׸®±â ·çƾ À¸·Î ä¿îÈÄ ¾ç³¡¸¸À» Masking ÇÏ¸é µÇ´Â °ÅÁÒ. ¸ÕÀú »ç¿ëÀÚ°¡ È£ÃâÇÏ ´Â ÇÔ¼ö¸¦ º¾½Ã´Ù. void hgVhline(int x1,int x2,int y,char color) { int xs; int xe; x2++; xs=x1/8+1; xe=x2/8-1; vbyteline(xs,xe,y,color); vsideline(xs-1,y,color,get_mask(x1)); vsideline(xe+1,y,color,~get_mask(x2)); } xs ¿Í xe ´Â ¹ÙÀÌÆ® ´ÜÀ§·Î Ä¥ÇÒ ºÎºÐÀÇ ÁÂÇ¥ÀÔ´Ï´Ù. xs-1 °ú xs+1 Àº masking À» ÇÏ°Ô µÇÁÒ. ÀÏ´Ü ¹ÙÀÌÆ® ´ÜÀ§·Î Ä¥ÇÏ´Â vbyteline ÀÇ ¼Ò½º ¸¦ º¾½Ã´Ù. void vbyteline(int x1,int x2,int y,char color) { _CX=x2-x1+1; asm mov bx,80 asm mov ax,WORD PTR y asm mul bx asm add ax,WORD PTR x1 asm mov di,ax /* di=offset.. y*80+x1 asm mov ax,0a000h asm mov es,ax asm mov dx,03ceh asm mov ax,0205h /* ¾²±â¸ðµå 2 */ asm out dx,ax asm mov ax,0ff08h /* mask=0xff */ asm out dx,ax asm mov ah,BYTE PTR color bfill: asm mov al,es:[di] asm mov es:[di],ah asm inc di /* offset++ */ asm loop bfill asm mov ax,0005h asm out dx,ax } ±×·¯¸é ¾ç³¡ÀÇ mask ¸¦ °è»êÇØ¾ß °ÚÁÒ. unsigned char get_mask(int x) { unsigned char mask=0xff; int r=x%8; mask>>=r; return mask; } À§ÀÇ ÇÔ¼ö´Â x ¿¡ ´ëÇؼ­ line ÀÇ ¾ç³¡¿¡ ÇØ´çÇÏ´Â mask ¸¦ ¸®ÅÏÇØ ÁÝ ´Ï´Ù. ´Ü line À¸·Î ¿¹¸¦ µç´Ù¸é ¹ÙÀÌÆ® °ªÁß ¿À¸¥ÂÊ ºÎºÐÀÌ 1 ·Î µÇ ¹Ç·Î Á¤È®ÇÏ°Ô ¸»ÇÑ´Ù¸é line ÀÇ ¿ÞÂÊ ºÎºÐ Mask °¡ µÇµ¹¾Æ ¿Â´Ù°í ÇÒ ¼ö ÀÖÀ¾´Ï´Ù. ¿À¸¥ÂÊ ºÎºÐÀ» ¿øÇÑ´Ù¸é µ¹¾Æ¿Â Mask ¸¦ Not ÇÏ¸é µË´Ï ´Ù. ±×·³ °è»êµÈ Mask ¸¸Å­¸¸ Ç¥½ÃÇØ ÁÖ´Â vsideline ÀÇ ¼Ò½º¸¦ º¾½Ã ´Ù. void vsideline(int x,int y,char color,unsigned char mask) { asm mov bx,80 asm mov ax,WORD PTR y asm mul bx asm add ax,WORD PTR x asm mov di,ax /* offset=y*80+x */ asm mov ax,0a000h asm mov es,ax asm mov dx,03ceh asm mov ax,0205h asm out dx,ax asm mov al,8 asm mov ah,BYTE PTR mask /* bitmask=mask */ asm out dx,ax asm mov ah,BYTE PTR color asm mov al,es:[di] /* Latch load */ asm mov es:[di],ah /* writing */ asm mov ax,0005h asm out dx,ax asm mov ax,0ff08h asm out dx,ax } ÇÏ´Â ÀÏ¿¡ ºñÇØ ¼Ò½º°¡ Á¶±Ý ±ä ÆíÀÔ´Ï´Ù.. ÂÁÂÁ.. ÀÌÁ¦ °¡·Î¼±°ú ¼¼ ·Î¼±ÀÌ ´Ù ±×·ÁÁ³À¸´Ï Boxfill À» º¸¾Æ¾ß °ÚÁÒ.. ±×·³ °è¼ÓÇؼ­ Boxfill À» ¾Ë¾Æº¾½Ã´Ù. ´«Ä¡ ºü¸¥ ºÐÀº Boxfill ÀÇ ±¸ÇöÀ» ¾î¶»°Ô Á¦°¡ ÇÒ °ÍÀÎÁö¸¦ ¹ú½á ¾Ë ¾ÆÂ÷¸®¼ÌÀ» °Ì´Ï´Ù. Boxfill À̶õ »ç½Ç ¼ö¸¹Àº °¡·Î¼±,ȤÀº ¼¼·Î¼±ÀÌ ÁÒ.±×·¸´Ù°í ±âÁ¸ÀÇ ÇÔ¼ö¸¦ ¹«Åδë°í ÀÌ¿ëÇÏ¸é ¼Óµµ»ó ¹®Á¦°¡ ÀÖ°í.. Çؼ­ ºñ½ÁÇÑ ¿ø¸®·Î »õ·Î¿î ÇÔ¼ö¸¦ ¼³°èÇØ º¾½Ã´Ù. void hgVBoxFill(int x1,int y1,int x2,int y2,int color) { int xs=x1/8+1; int xe=x2/8-1; unsigned char rmask=~get_mask(x2+1); if (!rmask) rmask=0xff; vgafill(xs,y1,xe,y2,color); vsidefill(xs-1,y1,y2,color,get_mask(x1)); vsidefill(xe+1,y1,y2,color,rmask); } ÀÌ°ÍÀÌ »ç¿ëÀÚ°¡ È£ÃâÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ¸ÕÀúÀÇ °¡·Î¼± ±ß±â¿Í »ó´çÈ÷ ºñ½ÁÇÑ ¸éÀÌ ÀÖÀ¾´Ï´Ù. À̰͵µ ¿ª½Ã ¹ÙÀÌÆ® ºÎºÐÀ¸·Î Ä¥Çصµ µÉ ºÎºÐ Àº ºü¸¥ ¹ÙÀÌÆ® ´ÜÀ§ ¸ðµâ·Î Ä¥ÇÏ°í..¾ç ¿·ºÎºÐÀº ³ªÁß¿¡ µû·Î Ä¥ÇÕ´Ï ´Ù. ±×·¯¸é ÀÏ´Ü ¹ÙÀÌÆ® ´ÜÀ§·Î Ä¥ÇÏ´Â ÇÔ¼ö¸¦ º¸°ÚÀ¾´Ï´Ù. ÀÌ°ÍÀº »ç ½Ç ¿¹Àü¿¡ ¼Ò°³Çß´ø ( ver 1.0 ¿¡¼­ ) ¸ðµâ°ú º°´Ù¸¦ ¹Ù°¡ ¾øÀ¾´Ï´Ù. void vgafill(int x1,int y1,int x2,int y2,int color) { unsigned x_width=x2-x1+1; unsigned y_width=y2-y1+1; unsigned max=80; asm push ds asm push es asm mov ax,0a000h asm mov ds,ax asm mov es,ax asm mov dx,3ceh asm mov ax,0205h /* ¾²±â ¸ðµå 2 */ asm out dx,ax asm mov ax,0ff08h /* mask = 0xff */ asm out dx,ax asm mov cx,y_width asm mov ax,y1 asm mov bx,max asm mul bx asm mov bx,ax /* bx is offset.. y1*max */ asm mov al,BYTE PTR color boxlp1: asm push cx asm mov cx,x_width asm mov di,bx asm add di,x1 /* di is bx+x1.. = y1*max+x1 */ boxlp2: asm REP stosb /* Block Storing */ asm add bx,max /* offset resetting */ asm pop cx asm loop boxlp1 asm mov dx,3ceh /* initializing */ asm mov ax,5 asm out dx,ax asm pop es asm pop ds } ±×·³ ÀÌÁ¦ Á¤ÇØÁø mask ¿¡ ÀÇÇؼ­ (x,y1)~(x,y2) »çÀ̸¦ Ä¥ÇØÁÙ ÇÔ¼ö ¸¸ ÀÖÀ¸¸é µË´Ï´Ù. ÀÌ ÇÔ¼ö ¿ª½Ã À§ÀÇ °¡·Î¼± ±×¸®´Â Å×Å©´ÐÀ» ¾´ °Í À̹ǷΠÁ÷Á¢ ¼Ò½º ¼³¸í¿¡ µé¾î°¡°ÚÀ¾´Ï´Ù. void vsidefill(int x,int y1,int y2,unsigned char color,unsigned char mask) { _CX=y2-y1+1; /* ¹Ýº¹ Ƚ¼ö */ asm mov bx,80 asm mov ax,WORD PTR y1 asm mul bx asm add ax,WORD PTR x asm mov di,ax /* di=y1*80+x = offset */ asm mov ax,0a000h asm mov es,ax asm mov dx,03ceh asm mov ax,0205h asm out dx,ax asm mov al,8 asm mov ah,BYTE PTR mask /* bit masking */ asm out dx,ax asm mov ah,BYTE PTR color sfill: asm mov al,es:[di] /* first,latch. */ asm mov es:[di],ah /* writing */ asm add di,80 /* ¼¼·Î·Î ÇÑÄ­ ³»¸² */ asm loop sfill asm mov ax,0005h asm out dx,ax asm mov ax,0ff08h asm out dx,ax } ÀÚ..±×·³ °¡·Î,¼¼·Î¼± ±ß±â¿Í ¹Ú½º Fill ÇÔ¼ö°¡ ¿Ï¼ºµÇ¾úÀ¸´Ï.. ´ÙÀ½ ¹ø °­Á¿¡¼­ µµÆ®´ÜÀ§ ½ºÅ©·Ñ ¾÷/´Ù¿î ¸ðµâÀ» °£´ÜÈ÷ ¼Ò°³ÇÑÈÄ C++ ÀÇ Å¬·¡½º ±â´ÉÀ» ÀÌ¿ëÇÏ¿© ¼³°èÇÑ Hurumi's Window Routine À» ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇսôÙ. ±â´ëÇØ ÁÖ¼¼¿ë. !Ç㸣¹Ì!