]> 4ch.mooo.com Git - 16.git/blobdiff - 16/x_/mxcg.asm
refresh wwww
[16.git] / 16 / x_ / mxcg.asm
diff --git a/16/x_/mxcg.asm b/16/x_/mxcg.asm
new file mode 100755 (executable)
index 0000000..42163d7
--- /dev/null
@@ -0,0 +1,69 @@
+;-----------------------------------------------------------\r
+;\r
+; MXCG.ASM - Color to gray conversion\r
+; Copyright (c) 1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN    PRO\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC  mxColorToGray\r
+\r
+MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
+                ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Converts RGB colors to gray shades.\r
+;\r
+; Input:\r
+;       CPal    = pointer to color palette\r
+;       GPal    = pointer to destination (gray) palette\r
+;       Count   = number of colors to convert\r
+; Output:\r
+;       none\r
+;\r
+; Note: CPal and GPal may point to the same buffer.\r
+;\r
+mxColorToGray   PROC    FAR\r
+        ARG     Count:WORD,     \\r
+                DPal:DWORD,     \\r
+                SPal:DWORD      = ARG_SIZE\r
+        ASSUME  ds:NOTHING\r
+        .enter  0\r
+        .push   ds, si, es, di\r
+\r
+        mov     cx, [Count]\r
+        jcxz    @@Exit\r
+        lds     si, [SPal]\r
+        les     di, [DPal]\r
+        cld\r
+; We use the standard formula\r
+;       gray=(red*30 + green*59 + blue*11)/100\r
+; in the equivalent form\r
+;       gray=(red*77 + green*151 + blue*28)/256\r
+; which doesn't need the last divide.\r
+        mov     bx, 77 SHL 8 + 151\r
+@@Loop:\r
+        lodsb                           ; Red\r
+        mul     bh\r
+        mov     dx, ax\r
+        lodsb                           ; Green\r
+        mul     bl\r
+        add     dx, ax\r
+        lodsb                           ; Blue\r
+        mov     ah, 28\r
+        mul     ah\r
+        add     ax, dx\r
+        mov     al, ah\r
+        stosw                           ; Save new RGB\r
+        stosb\r
+        loop    @@Loop\r
+\r
+@@Exit:\r
+        .pop    ds, si, es, di\r
+        .leave  ARG_SIZE\r
+mxColorToGray   ENDP\r
+\r
+MX_TEXT         ENDS\r
+END\r