diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-06-29 18:10:42 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-06-29 18:10:42 +0300 |
commit | 58d6cbba6da31db8dc8a2b42d528b9a353081904 (patch) | |
tree | 04b57a2f809c6f08d84a082edf061f3ece631860 /intern/cycles/render/image.cpp | |
parent | 94549adec4b6857fb6ec4cf77606da51ff7c26b7 (diff) | |
parent | 295d0c52a26730edc6d4ed1276e4051cce006be5 (diff) |
Merge branch 'master' into temp-ghash-setopstemp-ghash-setops
Diffstat (limited to 'intern/cycles/render/image.cpp')
-rw-r--r-- | intern/cycles/render/image.cpp | 60 |
1 files changed, 46 insertions, 14 deletions
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index 61a0a81d51d..c62afcd7719 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -407,7 +407,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) int scanlinesize = width*components*sizeof(uchar); in->read_image(TypeDesc::UINT8, - (uchar*)pixels + (height-1)*scanlinesize, + (uchar*)pixels + (((size_t)height)-1)*scanlinesize, AutoStride, -scanlinesize, AutoStride); @@ -425,9 +425,10 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) builtin_image_pixels_cb(img->filename, img->builtin_data, pixels); } + size_t num_pixels = ((size_t)width) * height * depth; if(cmyk) { /* CMYK */ - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+2] = (pixels[i*4+2]*pixels[i*4+3])/255; pixels[i*4+1] = (pixels[i*4+1]*pixels[i*4+3])/255; pixels[i*4+0] = (pixels[i*4+0]*pixels[i*4+3])/255; @@ -436,7 +437,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) } else if(components == 2) { /* grayscale + alpha */ - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = pixels[i*2+1]; pixels[i*4+2] = pixels[i*2+0]; pixels[i*4+1] = pixels[i*2+0]; @@ -445,7 +446,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) } else if(components == 3) { /* RGB */ - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = 255; pixels[i*4+2] = pixels[i*3+2]; pixels[i*4+1] = pixels[i*3+1]; @@ -454,7 +455,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) } else if(components == 1) { /* grayscale */ - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = 255; pixels[i*4+2] = pixels[i]; pixels[i*4+1] = pixels[i]; @@ -463,7 +464,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) } if(img->use_alpha == false) { - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = 255; } } @@ -529,7 +530,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ vector<float> tmppixels; if(components > 4) { - tmppixels.resize(width*height*components); + tmppixels.resize(((size_t)width)*height*components); readpixels = &tmppixels[0]; } @@ -547,7 +548,8 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ } if(components > 4) { - for(int i = width*height-1; i >= 0; i--) { + size_t dimensions = ((size_t)width)*height; + for(size_t i = dimensions-1, pixel = 0; pixel < dimensions; pixel++, i--) { pixels[i*4+3] = tmppixels[i*components+3]; pixels[i*4+2] = tmppixels[i*components+2]; pixels[i*4+1] = tmppixels[i*components+1]; @@ -566,9 +568,10 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ builtin_image_float_pixels_cb(img->filename, img->builtin_data, pixels); } + size_t num_pixels = ((size_t)width) * height * depth; if(cmyk) { /* CMYK */ - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = 255; pixels[i*4+2] = (pixels[i*4+2]*pixels[i*4+3])/255; pixels[i*4+1] = (pixels[i*4+1]*pixels[i*4+3])/255; @@ -577,7 +580,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ } else if(components == 2) { /* grayscale + alpha */ - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = pixels[i*2+1]; pixels[i*4+2] = pixels[i*2+0]; pixels[i*4+1] = pixels[i*2+0]; @@ -586,7 +589,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ } else if(components == 3) { /* RGB */ - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = 1.0f; pixels[i*4+2] = pixels[i*3+2]; pixels[i*4+1] = pixels[i*3+1]; @@ -595,7 +598,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ } else if(components == 1) { /* grayscale */ - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = 1.0f; pixels[i*4+2] = pixels[i]; pixels[i*4+1] = pixels[i]; @@ -604,7 +607,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ } if(img->use_alpha == false) { - for(int i = width*height*depth-1; i >= 0; i--) { + for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) { pixels[i*4+3] = 1.0f; } } @@ -791,7 +794,36 @@ void ImageManager::device_update(Device *device, DeviceScene *dscene, Progress& need_update = false; } -void ImageManager::device_pack_images(Device *device, DeviceScene *dscene, Progress& progess) +void ImageManager::device_update_slot(Device *device, + DeviceScene *dscene, + int slot, + Progress *progress) +{ + Image *image; + if(slot >= tex_image_byte_start) { + int byte_slot = slot - tex_image_byte_start; + assert(images[byte_slot] != NULL); + image = images[byte_slot]; + } + else { + assert(float_images[slot] != NULL); + image = float_images[slot]; + } + if(image->users == 0) { + device_free_image(device, dscene, slot); + } + else if(image->need_load) { + if(!osl_texture_system || float_images[slot]->builtin_data) + device_load_image(device, + dscene, + slot, + progress); + } +} + +void ImageManager::device_pack_images(Device *device, + DeviceScene *dscene, + Progress& /*progess*/) { /* for OpenCL, we pack all image textures inside a single big texture, and * will do our own interpolation in the kernel */ |