void IconDes::RightDown(Point p, dword flags) { p = GetPos(p); if(!InImage(p)) return; if(tool == &IconDes::HotSpotTool) { if(p != Current().image.Get2ndSpot()) { ImageBuffer ib(Current().image); ib.Set2ndSpot(p); Current().image = ib; Refresh(); } return; } RGBA ic = CurrentImage()[p.y][p.x]; RGBA c = CurrentColor(); if(flags & K_ALT) { c.a = ic.a; ic = c; } if(flags & K_CTRL) ic.a = c.a; rgbactrl.Set(ic); ColorChanged(); }
void CImageEx::SetRectValue(CImage *pImg,int x,int y,int Dx,int Dy,BYTE *buf ) { IMAGEPARAMENT P; BYTE *lp; int i,dw,dh,x1,y1,alpha,delta,Dxb,dwb; GetImageParament(pImg,&P); if (P.nBitCount<8) return; x1=x; y1=y; alpha=delta=0; if (x<0) { alpha=-x; x1=0; } if (y<0) { delta=-y; y1=0; } if (!InImage(pImg,x1,y1)) return; dw=min(Dx,(int) P.nWidth-x1); dh=min(Dy,(int) P.nHeight-y1); dw -= alpha; dh -= delta; Dxb = Dx*P.nBytesPerPixel; dwb = dw*P.nBytesPerPixel; lp = (BYTE*) pImg->GetPixelAddress(x1,y1); buf += (delta*Dx+alpha)*P.nBytesPerPixel; for (i=0;i<dh;i++) { memcpy(lp,buf,dwb); buf += Dxb; lp -= P.nBytesPerLine; } }
void IconDes::Set(Point p, RGBA rgba, dword flags) { if(!IsCurrent()) return; if(InImage(p)) { ImageBuffer ib(CurrentImage()); RGBA& t = ib[p.y][p.x]; if(t != rgba && (doselection || Current().selection[p.y][p.x].r)) { if(flags & K_ALT) t.a = rgba.a; else if(flags & K_CTRL) { rgba.a = t.a; t = rgba; } else t = rgba; RefreshPixel(p); } CurrentImage() = ib; } }
void IMGPRED_Decompress( uint8_t *out, uint8_t *img, int w, int h ) { uint8_t zero[] = {0,0,0,0}; uint8_t *o = out; for (int y=0; y<h; y++) { for (int x=0; x<w; x++) { uint8_t *NW = InImage(x-1,y-1) ? &out[((y-1)*w+(x-1))*4] : zero; uint8_t *W = InImage(x-1,y) ? &out[((y)*w+(x-1))*4] : zero; uint8_t *N = InImage(x,y-1) ? &out[((y-1)*w+(x))*4] : zero; uint8_t *C = InImage(x-1,y-1) ? &img[((y-1)*w+(x-1))*4] : zero; uint8_t *A = InImage(x-1,y) ? &img[((y)*w+(x-1))*4] : zero; uint8_t *B = InImage(x,y-1) ? &img[((y-1)*w+(x))*4] : zero; uint8_t *V = &img[((y)*w+(x))*4]; for (int c=0; c<4; c++) { int32_t grad = (int32_t)N[c] + (int32_t)W[c] - (int32_t)NW[c]; int32_t avg = ((int32_t)N[c] + (int32_t)W[c]) / 2; int32_t pred = (avg + grad) >> 1; if ( C[c] > Max(A[c], B[c]) ) { pred = Min(A[c],B[c]); } else if ( C[c] < Min(A[c], B[c]) ) { pred = Max(A[c],B[c]); } else { pred = (int32_t)A[c] + (int32_t)B[c] - (int32_t)C[c]; } int32_t diff = (int32_t)V[c];// - pred; if ( diff & 1 ) { diff &= (~1); diff = -diff; } *o++ = pred + diff; } } } }