From 2cec804e02eca375250dcd9689a31ab91e4505d9 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Mon, 17 Sep 2012 18:08:53 -0500 Subject: Implement framework for raster operations --- tdegtk/tqtcairopainter.cpp | 180 ++++++++++++++++++++++++++++++--------------- tdegtk/tqtcairopainter.h | 1 + 2 files changed, 122 insertions(+), 59 deletions(-) (limited to 'tdegtk') diff --git a/tdegtk/tqtcairopainter.cpp b/tdegtk/tqtcairopainter.cpp index 95c86c4..f45bce2 100644 --- a/tdegtk/tqtcairopainter.cpp +++ b/tdegtk/tqtcairopainter.cpp @@ -36,6 +36,12 @@ #define SET_BIT(x, y) (x |= 1 << y) #define TEST_BIT(x, y) ((x & (1 << y)) >> y) +// Little endian +#define ARGB_A_BYTE_NUMBER 3 +#define ARGB_R_BYTE_NUMBER 2 +#define ARGB_G_BYTE_NUMBER 1 +#define ARGB_B_BYTE_NUMBER 0 + cairo_surface_t* TQImageToCairoSurface(TQImage origimg) { cairo_surface_t* ret; @@ -98,24 +104,135 @@ void TQt3CairoPaintDevice::resetIntermediateSurface() { m_intermediateSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); } +inline void standardAlphaToPremultipliedAlpha(unsigned char *a, unsigned char *r, unsigned char *g, unsigned char *b) { + register double alpha_adjust; + + alpha_adjust = (*a / 255.0); + *r = char( *r * alpha_adjust ); + *g = char( *g * alpha_adjust ); + *b = char( *b * alpha_adjust ); + *a = char( *a * 1.0 ); +} + +inline void premultipliedAlphaToStandardAlpha(unsigned char *a, unsigned char *r, unsigned char *g, unsigned char *b) { + register double alpha_adjust; + + alpha_adjust = (*a / 255.0); + *r = char( *r / alpha_adjust ); + *g = char( *g / alpha_adjust ); + *b = char( *b / alpha_adjust ); + *a = char( *a / 1.0 ); +} + void TQt3CairoPaintDevice::transferIntermediateSurface() { + bool overlayMerge = true; cairo_surface_flush(m_intermediateSurface); + + if (m_rop != TQPainter::CopyROP) { + overlayMerge = false; + cairo_surface_flush(m_surface); + cairo_surface_flush(m_intermediateSurface); + register int height = cairo_image_surface_get_height(m_surface); + register int width = cairo_image_surface_get_width(m_surface); + register int stride = cairo_format_stride_for_width(cairo_image_surface_get_format(m_surface), width); + cairo_surface_t *usableDeviceSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + cairo_t *copyPainter = cairo_create(usableDeviceSurface); + cairo_set_source_surface(copyPainter, m_surface, 0, 0); + cairo_set_operator(copyPainter, CAIRO_OPERATOR_SOURCE); + cairo_paint(copyPainter); + cairo_surface_flush(usableDeviceSurface); + cairo_destroy(copyPainter); + unsigned char* device_surface_data = cairo_image_surface_get_data(usableDeviceSurface); + unsigned char* intermediate_surface_data = cairo_image_surface_get_data(m_intermediateSurface); + register int x; + register int y; + register long long offset; + register unsigned char devicePixel_a; + register unsigned char devicePixel_r; + register unsigned char devicePixel_g; + register unsigned char devicePixel_b; + register unsigned char intermediatePixel_a; + register unsigned char intermediatePixel_r; + register unsigned char intermediatePixel_g; + register unsigned char intermediatePixel_b; + register unsigned char combinedPixel_a; + register unsigned char combinedPixel_r; + register unsigned char combinedPixel_g; + register unsigned char combinedPixel_b; + // Execute the desired raster operation + // WARNING + // This is VERY SLOW + for (y=0; y