/* * PROJECT: Win32 subsystem * LICENSE: See COPYING in the top level directory * FILE: win32ss/gdi/dib/i386/dib32bpp_colorfill.s * PURPOSE: ASM optimised 32bpp ColorFill * PROGRAMMERS: Magnus Olsen * Timo Kreuzer (timo.kreuzer@reactos.org) */ #include .code /* * BOOLEAN * _cdecl * DIB_32BPP_ColorFill(SURFOBJ* pso, RECTL* prcl, ULONG iColor); */ PUBLIC _DIB_32BPP_ColorFill _DIB_32BPP_ColorFill: push ebp mov ebp, esp push ebx push esi push edi sub esp, 4 /* Space for lDelta */ mov edx, [ebp+12] /* edx = prcl */ mov ecx, [ebp+8] /* ecx = pso */ mov ebx, [ecx+36] /* ebx = pso->lDelta; */ mov [esp], ebx /* lDelta = pso->lDelta; */ mov edi, [edx+4] /* edi = prcl->top; */ mov eax, edi /* eax = prcl->top; */ imul eax, ebx /* eax = prcl->top * pso->lDelta; */ add eax, [ecx+32] /* eax += pso->pvScan0; */ mov ebx, [edx] /* ebx = prcl->left; */ lea esi, [eax+ebx*4] /* esi = pvLine0 = eax + 4 * prcl->left; */ mov ebx, [edx+8] /* ebx = prcl->right; */ sub ebx, [edx] /* ebx = prcl->right - prcl->left; */ jle .end /* if (ebx <= 0) goto end; */ mov edx, [edx+12] /* edx = prcl->bottom; */ sub edx, edi /* edx -= prcl->top; */ jle .end /* if (eax <= 0) goto end; */ mov eax, [ebp+16] /* eax = iColor; */ cld for_loop: /* do { */ mov edi, esi /* edi = pvLine0; */ mov ecx, ebx /* ecx = cx; */ rep stosd /* memset(pvLine0, iColor, cx); */ add esi, [esp] /* pvLine0 += lDelta; */ dec edx /* cy--; */ jnz for_loop /* } while (cy > 0); */ .end: mov eax, 1 add esp, 4 pop edi pop esi pop ebx pop ebp ret END