|  | @@ -413,8 +413,26 @@ void CairoImage::loadFromMemory(const char* const rdata, const Size<uint>& s, co | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | case kImageFormatBGRA: |  |  | case kImageFormatBGRA: | 
														
													
														
															
																|  |  | // RGB8 to CAIRO_FORMAT_ARGB32 |  |  |  | 
														
													
														
															
																|  |  | // TODO |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // BGRA8 to CAIRO_FORMAT_ARGB32 | 
														
													
														
															
																|  |  |  |  |  | // FIXME something is wrong here... | 
														
													
														
															
																|  |  |  |  |  | for (uint h = 0, t; h < height; ++h) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | for (uint w = 0; w < width; ++w) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | if ((t = rdata[h*width*4+w*4+3]) != 0) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | newdata[h*width*4+w*4+0] = rdata[h*width*4+w*4+0]; | 
														
													
														
															
																|  |  |  |  |  | newdata[h*width*4+w*4+1] = rdata[h*width*4+w*4+1]; | 
														
													
														
															
																|  |  |  |  |  | newdata[h*width*4+w*4+2] = rdata[h*width*4+w*4+2]; | 
														
													
														
															
																|  |  |  |  |  | newdata[h*width*4+w*4+3] = t; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | else | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | // make all pixels zero, cairo does not render full transparency otherwise | 
														
													
														
															
																|  |  |  |  |  | memset(&newdata[h*width*4+w*4], 0, 4); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | case kImageFormatRGB: |  |  | case kImageFormatRGB: | 
														
													
														
															
																|  |  | // RGB8 to CAIRO_FORMAT_RGB24 |  |  | // RGB8 to CAIRO_FORMAT_RGB24 | 
														
													
												
													
														
															
																|  | @@ -564,14 +582,13 @@ template class ImageBaseButton<CairoImage>; | 
														
													
														
															
																|  |  | template <> |  |  | template <> | 
														
													
														
															
																|  |  | void ImageBaseKnob<CairoImage>::PrivateData::init() |  |  | void ImageBaseKnob<CairoImage>::PrivateData::init() | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | // new (&cairoDisplayImage) CairoImage(); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | alwaysRepaint = true; | 
														
													
														
															
																|  |  | cairoSurface = nullptr; |  |  | cairoSurface = nullptr; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | template <> |  |  | template <> | 
														
													
														
															
																|  |  | void ImageBaseKnob<CairoImage>::PrivateData::cleanup() |  |  | void ImageBaseKnob<CairoImage>::PrivateData::cleanup() | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | // cairoDisplayImage.~CairoImage(); |  |  |  | 
														
													
														
															
																|  |  | cairo_surface_destroy((cairo_surface_t*)cairoSurface); |  |  | cairo_surface_destroy((cairo_surface_t*)cairoSurface); | 
														
													
														
															
																|  |  | cairoSurface = nullptr; |  |  | cairoSurface = nullptr; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -644,24 +661,25 @@ void ImageBaseKnob<CairoImage>::onDisplay() | 
														
													
														
															
																|  |  | const uint layerX = pData->isImgVertical ? 0 : layerNum * layerW; |  |  | const uint layerX = pData->isImgVertical ? 0 : layerNum * layerW; | 
														
													
														
															
																|  |  | const uint layerY = !pData->isImgVertical ? 0 : layerNum * layerH; |  |  | const uint layerY = !pData->isImgVertical ? 0 : layerNum * layerH; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | cairo_surface_t* const newsurface = getRegion(pData->image.getSurface(), layerX, layerY, layerW, layerH); |  |  |  | 
														
													
														
															
																|  |  | DISTRHO_SAFE_ASSERT_RETURN(newsurface != nullptr,); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | cairo_surface_t* newsurface; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (pData->rotationAngle != 0) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (pData->rotationAngle == 0) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | newsurface = getRegion(pData->image.getSurface(), layerX, layerY, layerW, layerH); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | else | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | // TODO |  |  |  | 
														
													
														
															
																|  |  | /* |  |  |  | 
														
													
														
															
																|  |  | CairoImage rotated(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, layerW, layerH), false); |  |  |  | 
														
													
														
															
																|  |  | cairo_t* cr = cairo_create(rotated.getSurface()); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | newsurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, layerW, layerH); | 
														
													
														
															
																|  |  |  |  |  | cairo_t* const cr = cairo_create(newsurface); | 
														
													
														
															
																|  |  | cairo_translate(cr, 0.5 * layerW, 0.5 * layerH); |  |  | cairo_translate(cr, 0.5 * layerW, 0.5 * layerH); | 
														
													
														
															
																|  |  | cairo_rotate(cr, normValue * angle * (float)(M_PI / 180)); |  |  |  | 
														
													
														
															
																|  |  | cairo_set_source_surface(cr, displayImage.getSurface(), -0.5f * layerW, -0.5f * layerH); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | cairo_rotate(cr, normValue * pData->rotationAngle * (float)(M_PI / 180)); | 
														
													
														
															
																|  |  |  |  |  | cairo_set_source_surface(cr, pData->image.getSurface(), -0.5f * layerW, -0.5f * layerH); | 
														
													
														
															
																|  |  | cairo_paint(cr); |  |  | cairo_paint(cr); | 
														
													
														
															
																|  |  | cairo_destroy(cr); |  |  | cairo_destroy(cr); | 
														
													
														
															
																|  |  | pData->cairoDisplayImage = rotated; |  |  |  | 
														
													
														
															
																|  |  | */ |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | DISTRHO_SAFE_ASSERT_RETURN(newsurface != nullptr,); | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | cairo_surface_destroy(surface); |  |  | cairo_surface_destroy(surface); | 
														
													
														
															
																|  |  | pData->cairoSurface = surface = newsurface; |  |  | pData->cairoSurface = surface = newsurface; | 
														
													
														
															
																|  |  | pData->isReady = true; |  |  | pData->isReady = true; | 
														
													
												
													
														
															
																|  | 
 |