comparison libgui/graphics/QtHandlesUtils.cc @ 28229:f3f29e1801fc

When clipping CDATA for icons take data from center of image (bug #58144). * QtHandlesUtils.cc (makeImageFromCData): Rename x_off, yoff to x_img_off, y_img_off. Add new variables x_cdat_off, y_cdat_off. When there is a size mismatch between the source CDATA and the destination QImage, take data from center of CDATA by using x_cdat_off, y_cdat_off offsets and place in center of QImage by using x_img_off, y_img_off.
author Rik <rik@octave.org>
date Sat, 18 Apr 2020 17:25:55 -0700
parents bd51beb6205e
children 0c6dcf803529
comparison
equal deleted inserted replaced
28227:a56ee7986ea4 28229:f3f29e1801fc
286 if (dv.ndims () == 3 && dv(2) == 3) 286 if (dv.ndims () == 3 && dv(2) == 3)
287 { 287 {
288 int w = qMin (dv(1), static_cast<octave_idx_type> (width)); 288 int w = qMin (dv(1), static_cast<octave_idx_type> (width));
289 int h = qMin (dv(0), static_cast<octave_idx_type> (height)); 289 int h = qMin (dv(0), static_cast<octave_idx_type> (height));
290 290
291 int x_off = (w < width ? (width - w) / 2 : 0); 291 // If size mismatch, take data from center of CDATA and
292 int y_off = (h < height ? (height - h) / 2 : 0); 292 // place in in center of QImage.
293 int x_img_off = (w < width ? (width - w) / 2 : 0);
294 int y_img_off = (h < height ? (height - h) / 2 : 0);
295 int x_cdat_off = (dv(1) > w ? (dv(1) - w) / 2 : 0);
296 int y_cdat_off = (dv(0) > h ? (dv(0) - h) / 2 : 0);
293 297
294 QImage img (width, height, QImage::Format_ARGB32); 298 QImage img (width, height, QImage::Format_ARGB32);
295 img.fill (qRgba (0, 0, 0, 0)); 299 img.fill (qRgba (0, 0, 0, 0));
296 300
297 if (v.is_uint8_type ()) 301 if (v.is_uint8_type ())
298 { 302 {
299 uint8NDArray d = v.uint8_array_value (); 303 uint8NDArray d = v.uint8_array_value ();
300 304
301 for (int i = 0; i < w; i++) 305 for (int i = x_cdat_off; i < w + x_cdat_off; i++)
302 for (int j = 0; j < h; j++) 306 for (int j = y_cdat_off; j < h + y_cdat_off; j++)
303 { 307 {
304 int r = d(j, i, 0); 308 int r = d(j, i, 0);
305 int g = d(j, i, 1); 309 int g = d(j, i, 1);
306 int b = d(j, i, 2); 310 int b = d(j, i, 2);
307 int a = 255; 311 int a = 255;
308 312
309 img.setPixel (x_off + i, y_off + j, qRgba (r, g, b, a)); 313 img.setPixel (x_img_off + i - x_cdat_off,
314 y_img_off + j - y_cdat_off,
315 qRgba (r, g, b, a));
310 } 316 }
311 } 317 }
312 else if (v.is_single_type ()) 318 else if (v.is_single_type ())
313 { 319 {
314 FloatNDArray f = v.float_array_value (); 320 FloatNDArray f = v.float_array_value ();
315 321
316 for (int i = 0; i < w; i++) 322 for (int i = x_cdat_off; i < w + x_cdat_off; i++)
317 for (int j = 0; j < h; j++) 323 for (int j = y_cdat_off; j < h + y_cdat_off; j++)
318 { 324 {
319 float r = f(j, i, 0); 325 float r = f(j, i, 0);
320 float g = f(j, i, 1); 326 float g = f(j, i, 1);
321 float b = f(j, i, 2); 327 float b = f(j, i, 2);
322 int a = (octave::math::isnan (r) || octave::math::isnan (g) 328 int a = (octave::math::isnan (r) || octave::math::isnan (g)
323 || octave::math::isnan (b) ? 0 : 255); 329 || octave::math::isnan (b) ? 0 : 255);
324 330
325 img.setPixel (x_off + i, y_off + j, 331 img.setPixel (x_img_off + i - x_cdat_off,
332 y_img_off + j - y_cdat_off,
326 qRgba (octave::math::round (r * 255), 333 qRgba (octave::math::round (r * 255),
327 octave::math::round (g * 255), 334 octave::math::round (g * 255),
328 octave::math::round (b * 255), 335 octave::math::round (b * 255),
329 a)); 336 a));
330 } 337 }
331 } 338 }
332 else if (v.isreal ()) 339 else if (v.isreal ())
333 { 340 {
334 NDArray d = v.array_value (); 341 NDArray d = v.array_value ();
335 342
336 for (int i = 0; i < w; i++) 343 for (int i = x_cdat_off; i < w + x_cdat_off; i++)
337 for (int j = 0; j < h; j++) 344 for (int j = y_cdat_off; j < h + y_cdat_off; j++)
338 { 345 {
339 double r = d(j, i, 0); 346 double r = d(j, i, 0);
340 double g = d(j, i, 1); 347 double g = d(j, i, 1);
341 double b = d(j, i, 2); 348 double b = d(j, i, 2);
342 int a = (octave::math::isnan (r) || octave::math::isnan (g) 349 int a = (octave::math::isnan (r) || octave::math::isnan (g)
343 || octave::math::isnan (b) ? 0 : 255); 350 || octave::math::isnan (b) ? 0 : 255);
344 351
345 img.setPixel (x_off + i, y_off + j, 352 img.setPixel (x_img_off + i - x_cdat_off,
353 y_img_off + j - y_cdat_off,
346 qRgba (octave::math::round (r * 255), 354 qRgba (octave::math::round (r * 255),
347 octave::math::round (g * 255), 355 octave::math::round (g * 255),
348 octave::math::round (b * 255), 356 octave::math::round (b * 255),
349 a)); 357 a));
350 } 358 }