Mercurial > octave
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 } |