out of day already, damn
This commit is contained in:
		
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@ -34,6 +34,19 @@ namespace ams
 | 
				
			|||||||
        const uint8_t& operator[](const int ind) const;
 | 
					        const uint8_t& operator[](const int ind) const;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //a floating point pixel, normalized so that RGBA is
 | 
				
			||||||
 | 
					    // between 0 and 1
 | 
				
			||||||
 | 
					    struct amsfloatpixel
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					        float R,G,B,A;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        amspixel();
 | 
				
			||||||
 | 
					        amspixel(float _R ,float _G, float _B, float _A);
 | 
				
			||||||
 | 
					        uint8_t& operator[](const int ind);
 | 
				
			||||||
 | 
					        const uint8_t& operator[](const int ind) const;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class amsimage
 | 
					    class amsimage
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public:
 | 
					        public:
 | 
				
			||||||
@ -79,13 +92,15 @@ namespace ams
 | 
				
			|||||||
        //todo
 | 
					        //todo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //applies image with alpha blending
 | 
					        //applies image with alpha blending
 | 
				
			||||||
        int apply_image(int I0, int J0, amsimage *img);
 | 
					        int apply_image(int x0, int y0, const amsimage *img);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //applied color to any pixels where the bitplane's value is >= thresh
 | 
					        //applied color to any pixels where the bitplane's value is >= thresh
 | 
				
			||||||
        int apply_bitplane_nz(int I0, int J0, amsbitplane* bp, amspixel color, uint8_t thresh);
 | 
					        int apply_bitplane_mask(int x0, int y0, const amsbitplane* bp, amspixel color, uint8_t thresh);
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
 | 
					        amsfloatpixel interpolate(float x, float y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //rescales the image with linear interpolation
 | 
					        //rescales the image with linear interpolation
 | 
				
			||||||
        int rescale(int nnx, int nny);
 | 
					        amsimage rescale(int nnx, int nny);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int read_image(const char *fname, amsimage* image);
 | 
					    int read_image(const char *fname, amsimage* image);
 | 
				
			||||||
@ -129,7 +144,7 @@ namespace ams
 | 
				
			|||||||
        void setall(uint8_t val);
 | 
					        void setall(uint8_t val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //rescales the image with linear interpolation
 | 
					        //rescales the image with linear interpolation
 | 
				
			||||||
        int rescale(int _Nx, int _Ny); //todo
 | 
					        amsbitplane rescale(int _Nx, int _Ny); //todo
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -632,4 +632,191 @@ namespace ams
 | 
				
			|||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void amsimage_apply_image_tf(
 | 
				
			||||||
 | 
					        int threadnum,
 | 
				
			||||||
 | 
					        int nthreads,
 | 
				
			||||||
 | 
					        amsimage *imgto,
 | 
				
			||||||
 | 
					        const amsimage *imgfrom,
 | 
				
			||||||
 | 
					        int x0, int y0
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int dx,dy;
 | 
				
			||||||
 | 
					        int64_t N;
 | 
				
			||||||
 | 
					        int64_t I,I0,I1,Is,Ix,Iy,Ia,Ib;
 | 
				
			||||||
 | 
					        double r1,g1,b1,a1;
 | 
				
			||||||
 | 
					        double r2,g2,b2,a2;
 | 
				
			||||||
 | 
					        double r3,g3,b3,a3;
 | 
				
			||||||
 | 
					        int r3i,g3i,b3i,a3i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dx = (imgfrom->Nx < (imgto->Nx-x0)) ? imgfrom->Nx : imgto->Nx-x0;
 | 
				
			||||||
 | 
					        dx = (dx<0) ? 0 : dx;
 | 
				
			||||||
 | 
					        dy = (imgfrom->Ny < (imgto->Ny-y0)) ? imgfrom->Ny : imgto->Ny-y0;
 | 
				
			||||||
 | 
					        dy = (dy<0) ? 0 : dy;
 | 
				
			||||||
 | 
					        N = dx*dy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Is = N/nthreads;
 | 
				
			||||||
 | 
					        I0 = threadnum*Is;
 | 
				
			||||||
 | 
					        I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for(I=I0;I<I1;I++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Ix = I%dx;
 | 
				
			||||||
 | 
					            Iy = I/dx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Ia = (Ix + x0) + (Iy + y0)*imgto->Ny;
 | 
				
			||||||
 | 
					            Ib = Ix + Iy*imgfrom->Ny;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            r1 = imgto->data[0 + 4*Ia]/255.0;
 | 
				
			||||||
 | 
					            g1 = imgto->data[1 + 4*Ia]/255.0;
 | 
				
			||||||
 | 
					            b1 = imgto->data[2 + 4*Ia]/255.0;
 | 
				
			||||||
 | 
					            a1 = imgto->data[3 + 4*Ia]/255.0;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            r2 = imgfrom->data[0 + 4*Ib]/255.0;
 | 
				
			||||||
 | 
					            g2 = imgfrom->data[1 + 4*Ib]/255.0;
 | 
				
			||||||
 | 
					            b2 = imgfrom->data[2 + 4*Ib]/255.0;
 | 
				
			||||||
 | 
					            a2 = imgfrom->data[3 + 4*Ib]/255.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            r3 = r1 + r2*(1.0-a2);
 | 
				
			||||||
 | 
					            g3 = g1 + g2*(1.0-a2);
 | 
				
			||||||
 | 
					            b3 = b1 + b2*(1.0-a2);
 | 
				
			||||||
 | 
					            a3 = 1.0-(1.0-a1)*(1.0-a2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            r3i = (int)(r3*255.0);
 | 
				
			||||||
 | 
					            g3i = (int)(g3*255.0);
 | 
				
			||||||
 | 
					            b3i = (int)(b3*255.0);
 | 
				
			||||||
 | 
					            a3i = (int)(a3*255.0);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            r3i = (r3i>255) ? 255 : r3i;
 | 
				
			||||||
 | 
					            g3i = (g3i>255) ? 255 : g3i;
 | 
				
			||||||
 | 
					            b3i = (b3i>255) ? 255 : b3i;
 | 
				
			||||||
 | 
					            a3i = (a3i>255) ? 255 : a3i;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            imgto->data[0 + 4*Ia] = r3i;
 | 
				
			||||||
 | 
					            imgto->data[1 + 4*Ia] = g3i;
 | 
				
			||||||
 | 
					            imgto->data[2 + 4*Ia] = b3i;
 | 
				
			||||||
 | 
					            imgto->data[3 + 4*Ia] = a3i;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int amsimage::apply_image(int x0, int y0, const amsimage *img)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int ret = amsimage_success;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int dx,dy;
 | 
				
			||||||
 | 
					        int64_t N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(img==NULL)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ret = amsimage_failure;
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dx = (img->Nx < (this->Nx-x0)) ? img->Nx : this->Nx-x0;
 | 
				
			||||||
 | 
					        dx = (dx<0) ? 0 : dx;
 | 
				
			||||||
 | 
					        dy = (img->Ny < (this->Ny-y0)) ? img->Ny : this->Ny-y0;
 | 
				
			||||||
 | 
					        dy = (dy<0) ? 0 : dy;
 | 
				
			||||||
 | 
					        N = dx*dy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        imglib4::threaded_execute(
 | 
				
			||||||
 | 
					            amsimage_apply_image_tf, N,
 | 
				
			||||||
 | 
					            this,img,x0,y0
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void amsimage_apply_bitplanemask_tf(
 | 
				
			||||||
 | 
					        int threadnum,
 | 
				
			||||||
 | 
					        int nthreads,
 | 
				
			||||||
 | 
					        amsimage *imgto,
 | 
				
			||||||
 | 
					        const amsbitplane *bpfrom,
 | 
				
			||||||
 | 
					        amspixel color,
 | 
				
			||||||
 | 
					        int x0, int y0,
 | 
				
			||||||
 | 
					        uint8_t thresh
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int dx,dy;
 | 
				
			||||||
 | 
					        int64_t N;
 | 
				
			||||||
 | 
					        int64_t I,I0,I1,Is,Ix,Iy,Ia,Ib;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dx = (bpfrom->Nx < (imgto->Nx-x0)) ? bpfrom->Nx : imgto->Nx-x0;
 | 
				
			||||||
 | 
					        dx = (dx<0) ? 0 : dx;
 | 
				
			||||||
 | 
					        dy = (bpfrom->Ny < (imgto->Ny-y0)) ? bpfrom->Ny : imgto->Ny-y0;
 | 
				
			||||||
 | 
					        dy = (dy<0) ? 0 : dy;
 | 
				
			||||||
 | 
					        N = dx*dy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Is = N/nthreads;
 | 
				
			||||||
 | 
					        I0 = threadnum*Is;
 | 
				
			||||||
 | 
					        I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for(I=I0;I<I1;I++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Ix = I%dx;
 | 
				
			||||||
 | 
					            Iy = I/dx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Ia = (Ix+x0) + imgto->Nx*(Iy+y0);
 | 
				
			||||||
 | 
					            Ib = Ix + bpfrom->Nx*Iy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(bpfrom->data[Ib]>=thresh)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                imgto->data[0 + 4*Ia] = color.R;
 | 
				
			||||||
 | 
					                imgto->data[1 + 4*Ia] = color.G;
 | 
				
			||||||
 | 
					                imgto->data[2 + 4*Ia] = color.B;
 | 
				
			||||||
 | 
					                imgto->data[3 + 4*Ia] = color.A;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //applied color to any pixels where the bitplane's value is >= thresh
 | 
				
			||||||
 | 
					    int amsimage::apply_bitplane_mask(int x0, int y0, const amsbitplane* bp, amspixel color, uint8_t thresh)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int ret = amsimage_success;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int dx,dy;
 | 
				
			||||||
 | 
					        int64_t N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(bp==NULL)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ret = amsimage_failure;
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dx = (bp->Nx < (this->Nx-x0)) ? bp->Nx : this->Nx-x0;
 | 
				
			||||||
 | 
					        dx = (dx<0) ? 0 : dx;
 | 
				
			||||||
 | 
					        dy = (bp->Ny < (this->Ny-y0)) ? bp->Ny : this->Ny-y0;
 | 
				
			||||||
 | 
					        dy = (dy<0) ? 0 : dy;
 | 
				
			||||||
 | 
					        N = dx*dy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        imglib4::threaded_execute(
 | 
				
			||||||
 | 
					            amsimage_apply_bitplanemask_tf, N,
 | 
				
			||||||
 | 
					            this,bp,color,x0,y0,thresh
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    amsfloatpixel amsimage::interpolate(float x, float y)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void amsimage_rescale_tf(
 | 
				
			||||||
 | 
					        int threadnum,
 | 
				
			||||||
 | 
					        int nthreads,
 | 
				
			||||||
 | 
					        amsimage *imgto,
 | 
				
			||||||
 | 
					        const amsimage *imgfrom
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    amsimage amsimage::rescale(int nnx, int nny)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
		Reference in New Issue
	
	Block a user