📄 areaindex.cpp
字号:
#include "stdafx.h"
#include "AreaIndex.h"
// 计算查找表
void CAreaIndex::Calculate(SHSVRGB::INCISECOLOR ic)
{
SHSVRGB::HSV hsv;
if (ic.low.H <= ic.top.H)
{ // 夹角未包含0弧度
for (unsigned int i= 0; i <= MAX_COLOR; i++)
{
SHSVRGB::RGB2HSVEx(i, hsv);
if (((hsv.H >= ic.low.H) && (hsv.H <= ic.top.H)) &&
((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
{
m_Index[i]= 1;
}
else
{
m_Index[i]= 0;
}
}
}
else
{ // 夹角包含0弧度
for (unsigned int i= 0; i <= MAX_COLOR; i++)
{
SHSVRGB::RGB2HSVEx(i, hsv);
if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
{
m_Index[i]= 1;
}
else
{
m_Index[i]= 0;
}
}
}
}
// 计算查找表,加速,不包含0弧度
void CAreaIndex::Calculate4Speed(SHSVRGB::INCISECOLOR ic)
{
unsigned char cMaxV= ic.top.V * 255;
unsigned char cMinV= ic.low.V * 255;
SHSVRGB::HSV hsv;
// 危险的汇编加速--在循环外部进行寄存器迭代
unsigned char *pc= this->m_Index;
__asm
{
mov edi, pc;
add edi, MAX_COLOR;
inc edi;
}
__asm
{
loop_begin:
mov esi, MAX_COLOR;
inc esi;
}
__asm
{
loop_again:
dec esi;
jz loop_end;
}
{
// 迭代指针
__asm
{
dec edi;
}
// RGB2SHSVRGB::HSV
// 分解颜色
unsigned char r, g, b;
__asm
{
mov eax, esi;
mov b, al;
shr eax, 8;
mov g, al;
shr eax, 8;
mov r, al;
}
// 找出最大最小值
unsigned char cmax, cmin;
__asm
{ // al ah bl = r g b
//mov al, r;
mov ah, g;
mov bl, b;
}
__asm
{
// cl ch = cmin cmax
mov ch, al;
max_cmp_g:
cmp ch, ah;
ja max_cmp_b;
mov ch, ah; // (r <= g)
max_cmp_b:
cmp ch, bl;
ja max_cmp_end;
mov ch, bl; // (r <= b)
max_cmp_end:
mov cmax, ch;
}
__asm
{
mov cl, al;
min_cmp_g:
cmp cl, ah;
jb min_cmp_b;
mov cl, ah; // (r >= g)
min_cmp_b:
cmp cl, bl;
jb min_cmp_end;
mov cl, bl; // (r >= b)
min_cmp_end:
mov cmin, cl;
}
unsigned char submaxmin;
__asm
{
sub ch, cl;
mov submaxmin, ch;
}
if ((cmax < cMinV) || (cmax > cMaxV))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
hsv.S= (float) submaxmin / cmax;
if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
if (r == cmax)
hsv.H = (float)( g - b) / submaxmin;
else if (g == cmax)
hsv.H = 2 + (float)( b - r) / submaxmin;
else if (b == cmax)
hsv.H = 4 + (float)( r - g)/ submaxmin;
hsv.H *= 60;
if (hsv.H <= 0)
hsv.H+= 360;
if ((hsv.H < ic.low.H) || (hsv.H > ic.top.H))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
//m_Index[i]= 1;
__asm
{
mov [edi], 1;
jmp loop_again;
}
}
__asm
{
loop_end:
}
// 特殊点0x00000000计算
hsv.H= 0;hsv.S= 0;hsv.V= 0;
if (((hsv.H >= ic.low.H) && (hsv.H <= ic.top.H)) &&
((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
{
m_Index[0]= 1;
}
else
{
m_Index[0]= 0;
}
}
// 计算查找表,加速,包含0弧度
void CAreaIndex::Calculate4SpeedEx(SHSVRGB::INCISECOLOR ic)
{
unsigned char cMaxV= ic.top.V * 255;
unsigned char cMinV= ic.low.V * 255;
SHSVRGB::HSV hsv;
// 危险的汇编加速--在循环外部进行寄存器迭代
unsigned char *pc= this->m_Index;
__asm
{
mov edi, pc;
add edi, MAX_COLOR;
inc edi;
}
__asm
{
loop_begin:
mov esi, MAX_COLOR;
inc esi;
}
__asm
{
loop_again:
dec esi;
jz loop_end;
}
{
// 迭代指针
__asm
{
dec edi;
}
// RGB2SHSVRGB::HSV
// 分解颜色
unsigned char r, g, b;
__asm
{
mov eax, esi;
mov b, al;
shr eax, 8;
mov g, al;
shr eax, 8;
mov r, al;
}
// 找出最大最小值
unsigned char cmax, cmin;
__asm
{ // al ah bl = r g b
//mov al, r;
mov ah, g;
mov bl, b;
}
__asm
{
// cl ch = cmin cmax
mov ch, al;
max_cmp_g:
cmp ch, ah;
ja max_cmp_b;
mov ch, ah; // (r <= g)
max_cmp_b:
cmp ch, bl;
ja max_cmp_end;
mov ch, bl; // (r <= b)
max_cmp_end:
mov cmax, ch;
}
__asm
{
mov cl, al;
min_cmp_g:
cmp cl, ah;
jb min_cmp_b;
mov cl, ah; // (r >= g)
min_cmp_b:
cmp cl, bl;
jb min_cmp_end;
mov cl, bl; // (r >= b)
min_cmp_end:
mov cmin, cl;
}
unsigned char submaxmin;
__asm
{
sub ch, cl;
mov submaxmin, ch;
}
if ((cmax < cMinV) || (cmax > cMaxV))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
hsv.S= (float) submaxmin / cmax;
if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
if (r == cmax)
hsv.H = (float)( g - b) / submaxmin;
else if (g == cmax)
hsv.H = 2 + (float)( b - r) / submaxmin;
else if (b == cmax)
hsv.H = 4 + (float)( r - g)/ submaxmin;
hsv.H *= 60;
if (hsv.H <= 0)
hsv.H+= 360;
if ((hsv.H < ic.low.H) && (hsv.H > ic.top.H))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
//m_Index[i]= 1;
__asm
{
mov [edi], 1;
jmp loop_again;
}
}
__asm
{
loop_end:
}
// 特殊点0x00000000计算
hsv.H= 0;hsv.S= 0;hsv.V= 0;
if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
{
m_Index[0]= 1;
}
else
{
m_Index[0]= 0;
}
}
// *************************************************************************
// 计算查找表
void CAreaIndex555::Calculate(SHSVRGB::INCISECOLOR ic)
{
SHSVRGB::HSV hsv;
if (ic.low.H <= ic.top.H)
{ // 夹角未包含0弧度
for (unsigned int i= 0; i <= MAX_COLOR_555; i++)
{
unsigned int c= 0;
unsigned int r, g, b;
r= (i & 0x7C00)>>(10-3);
g= (i & 0x3E0)>>(5-3);
b= (i & 0x1F)<<3;
c= (r<<16) | (g<<8) | b;
SHSVRGB::RGB2HSVEx(c, hsv);
if (((hsv.H >= ic.low.H) && (hsv.H <= ic.top.H)) &&
((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
{
m_Index[i]= 1;
}
else
{
m_Index[i]= 0;
}
}
}
else
{ // 夹角包含0弧度
for (unsigned int i= 0; i <= MAX_COLOR_555; i++)
{
unsigned int c= 0;
unsigned int r, g, b;
r= (i & 0x7C00)>>(10-3);
g= (i & 0x3E0)>>(5-3);
b= (i & 0x1F)<<3;
c= (r<<16) | (g<<8) | b;
SHSVRGB::RGB2HSVEx(c, hsv);
if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
{
m_Index[i]= 1;
}
else
{
m_Index[i]= 0;
}
}
}
}
// 计算查找表,加速,不包含0弧度
void CAreaIndex555::Calculate4Speed(SHSVRGB::INCISECOLOR ic)
{
unsigned char cMaxV= ic.top.V * 255;
unsigned char cMinV= ic.low.V * 255;
SHSVRGB::HSV hsv;
// 危险的汇编加速--在循环外部进行寄存器迭代
unsigned char *pc= this->m_Index;
__asm
{
mov edi, pc;
add edi, MAX_COLOR_555;
inc edi;
}
__asm
{
loop_begin:
mov esi, MAX_COLOR_555;
inc esi;
}
__asm
{
loop_again:
dec esi;
jz loop_end;
}
{
// 迭代指针
__asm
{
dec edi;
}
// RGB2SHSVRGB::HSV
// 分解颜色
unsigned char r, g, b;
__asm
{
mov eax, esi;
shl eax, 3;
mov b, al;
shr eax, 8;
shl eax, 3;
mov g, al;
shr eax, 8;
shl eax, 3;
mov r, al;
}
// 找出最大最小值
unsigned char cmax, cmin;
__asm
{ // al ah bl = r g b
//mov al, r;
mov ah, g;
mov bl, b;
}
__asm
{
// cl ch = cmin cmax
mov ch, al;
max_cmp_g:
cmp ch, ah;
ja max_cmp_b;
mov ch, ah; // (r <= g)
max_cmp_b:
cmp ch, bl;
ja max_cmp_end;
mov ch, bl; // (r <= b)
max_cmp_end:
mov cmax, ch;
}
__asm
{
mov cl, al;
min_cmp_g:
cmp cl, ah;
jb min_cmp_b;
mov cl, ah; // (r >= g)
min_cmp_b:
cmp cl, bl;
jb min_cmp_end;
mov cl, bl; // (r >= b)
min_cmp_end:
mov cmin, cl;
}
unsigned char submaxmin;
__asm
{
sub ch, cl;
mov submaxmin, ch;
}
if ((cmax < cMinV) || (cmax > cMaxV))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
hsv.S= (float) submaxmin / cmax;
if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
if (r == cmax)
hsv.H = (float)( g - b) / submaxmin;
else if (g == cmax)
hsv.H = 2 + (float)( b - r) / submaxmin;
else if (b == cmax)
hsv.H = 4 + (float)( r - g)/ submaxmin;
hsv.H *= 60;
if (hsv.H <= 0)
hsv.H+= 360;
if ((hsv.H < ic.low.H) || (hsv.H > ic.top.H))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
//m_Index[i]= 1;
__asm
{
mov [edi], 1;
jmp loop_again;
}
}
__asm
{
loop_end:
}
// 特殊点0x00000000计算
hsv.H= 0;hsv.S= 0;hsv.V= 0;
if (((hsv.H >= ic.low.H) && (hsv.H <= ic.top.H)) &&
((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
{
m_Index[0]= 1;
}
else
{
m_Index[0]= 0;
}
}
// 计算查找表,加速,包含0弧度
void CAreaIndex555::Calculate4SpeedEx(SHSVRGB::INCISECOLOR ic)
{
unsigned char cMaxV= ic.top.V * 255;
unsigned char cMinV= ic.low.V * 255;
SHSVRGB::HSV hsv;
// 危险的汇编加速--在循环外部进行寄存器迭代
unsigned char *pc= this->m_Index;
__asm
{
mov edi, pc;
add edi, MAX_COLOR_555;
inc edi;
}
__asm
{
loop_begin:
mov esi, MAX_COLOR_555;
inc esi;
}
__asm
{
loop_again:
dec esi;
jz loop_end;
}
{
// 迭代指针
__asm
{
dec edi;
}
// RGB2SHSVRGB::HSV
// 分解颜色,将555分解为888
unsigned char r, g, b;
__asm
{
mov eax, esi;
shl eax, 3;
mov b, al;
shr eax, 8;
shl eax, 3;
mov g, al;
shr eax, 8;
shl eax, 3;
mov r, al;
}
// 找出最大最小值
unsigned char cmax, cmin;
__asm
{ // al ah bl = r g b
//mov al, r;
mov ah, g;
mov bl, b;
}
__asm
{
// cl ch = cmin cmax
mov ch, al;
max_cmp_g:
cmp ch, ah;
ja max_cmp_b;
mov ch, ah; // (r <= g)
max_cmp_b:
cmp ch, bl;
ja max_cmp_end;
mov ch, bl; // (r <= b)
max_cmp_end:
mov cmax, ch;
}
__asm
{
mov cl, al;
min_cmp_g:
cmp cl, ah;
jb min_cmp_b;
mov cl, ah; // (r >= g)
min_cmp_b:
cmp cl, bl;
jb min_cmp_end;
mov cl, bl; // (r >= b)
min_cmp_end:
mov cmin, cl;
}
unsigned char submaxmin;
__asm
{
sub ch, cl;
mov submaxmin, ch;
}
if ((cmax < cMinV) || (cmax > cMaxV))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
hsv.S= (float) submaxmin / cmax;
if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
if (r == cmax)
hsv.H = (float)( g - b) / submaxmin;
else if (g == cmax)
hsv.H = 2 + (float)( b - r) / submaxmin;
else if (b == cmax)
hsv.H = 4 + (float)( r - g)/ submaxmin;
hsv.H *= 60;
if (hsv.H <= 0)
hsv.H+= 360;
if ((hsv.H < ic.low.H) && (hsv.H > ic.top.H))
{
//m_Index[i]= 0;
__asm
{
mov [edi], 0;
jmp loop_again;
}
//continue;
}
//m_Index[i]= 1;
__asm
{
mov [edi], 1;
jmp loop_again;
}
}
__asm
{
loop_end:
}
// 特殊点0x00000000计算
hsv.H= 0;hsv.S= 0;hsv.V= 0;
if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
{
m_Index[0]= 1;
}
else
{
m_Index[0]= 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -