diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 0d27bd762d..b2b3214b2d 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -3402,9 +3402,9 @@ IPC * ebx = указатель на изображение * ecx = [размер по оси x]*65536 + [размер по оси y] * edx = [координата по оси x]*65536 + [координата по оси y] - * esi = число бит на пиксель, должно быть 8, 16, 24 или 32 + * esi = число бит на пиксель, должно быть 8, 15, 16, 24 или 32 * edi = указатель на палитру (256 цветов 0x00RRGGBB); - игнорируется при esi = 16, 24 и 32 + игнорируется при esi > 8 * ebp = смещение данных каждой следующей строки изображения относительно предыдущей Возвращаемое значение: @@ -3417,9 +3417,11 @@ IPC рассматривается как индекс в палитре. * Если изображение использует не все 256 цветов, а меньше, размер палитры может быть меньше 256. - * Формат изображения с 16 битами на пиксель: цвет каждого пикселя + * Формат изображения с 15 битами на пиксель: цвет каждого пикселя кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB - по 5 пикселей на каждый цвет. + * Формат изображения с 16 битами на пиксель: цвет каждого пикселя + кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5). * Формат изображения с 24 битами на пиксель: цвет каждого пикселя кодируется тремя байтами - последовательно синяя, зелёная, красная составляющие цвета. diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index d7878a78a3..c9620ba3f1 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -4213,6 +4213,12 @@ sys_putimage_palette: mov ebp, putimage_get8bpp mov esi, putimage_init8bpp jmp sys_putimage_bpp +@@: + cmp esi, 15 + jnz @f + mov ebp, putimage_get15bpp + mov esi, putimage_init15bpp + jmp sys_putimage_bpp @@: cmp esi, 16 jnz @f @@ -4260,10 +4266,10 @@ putimage_get32bpp: lodsd ret 4 -putimage_init16bpp: +putimage_init15bpp: add eax, eax ret -putimage_get16bpp: +putimage_get15bpp: ; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000 push ecx edx movzx eax, word [esi] @@ -4279,7 +4285,28 @@ putimage_get16bpp: or eax, ecx or eax, edx pop edx ecx + ret 4 + +putimage_init16bpp: + add eax, eax ret +putimage_get16bpp: +; RRRRRGGGGGGBBBBB -> 00000000RRRRR000GGGGGG00BBBBB000 + push ecx edx + movzx eax, word [esi] + add esi, 2 + mov ecx, eax + mov edx, eax + and eax, 0x1F + and ecx, 0x3F shl 5 + and edx, 0x1F shl 11 + shl eax, 3 + shl ecx, 5 + shl edx, 8 + or eax, ecx + or eax, edx + pop edx ecx + ret 4 ; eax x beginning ; ebx y beginning