void BitmapImage::checkForSolidColor() { m_isSolidColor = false; m_checkedForSolidColor = true; if (frameCount() > 1) return; cairo_surface_t* frameSurface = frameAtIndex(0); if (!frameSurface) return; ASSERT(cairo_surface_get_type(frameSurface) == CAIRO_SURFACE_TYPE_IMAGE); int width = cairo_image_surface_get_width(frameSurface); int height = cairo_image_surface_get_height(frameSurface); if (width != 1 || height != 1) return; unsigned* pixelColor = reinterpret_cast<unsigned*>(cairo_image_surface_get_data(frameSurface)); m_solidColor = colorFromPremultipliedARGB(*pixelColor); m_isSolidColor = true; }
void BitmapImage::checkForSolidColor() { m_isSolidColor = false; m_checkedForSolidColor = true; if (frameCount() > 1) return; RefPtr<cairo_surface_t> surface = frameAtIndex(m_currentFrame); if (!surface) // If it's too early we won't have an image yet. return; if (cairo_surface_get_type(surface.get()) != CAIRO_SURFACE_TYPE_IMAGE) return; IntSize size = cairoSurfaceSize(surface.get()); if (size.width() != 1 || size.height() != 1) return; unsigned* pixelColor = reinterpret_cast_ptr<unsigned*>(cairo_image_surface_get_data(surface.get())); m_solidColor = colorFromPremultipliedARGB(*pixelColor); m_isSolidColor = true; }
void BitmapImage::checkForSolidColor() { m_isSolidColor = false; m_checkedForSolidColor = true; if (frameCount() > 1) return; NativeImageCairo* nativeImage = frameAtIndex(m_currentFrame); if (!nativeImage) // If it's too early we won't have an image yet. return; cairo_surface_t* surface = nativeImage->surface(); ASSERT(cairo_surface_get_type(surface) == CAIRO_SURFACE_TYPE_IMAGE); int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); if (width != 1 || height != 1) return; unsigned* pixelColor = reinterpret_cast<unsigned*>(cairo_image_surface_get_data(surface)); m_solidColor = colorFromPremultipliedARGB(*pixelColor); m_isSolidColor = true; }
PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& data, const IntSize& size) { ASSERT(cairo_surface_get_type(data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height()); unsigned char* dataSrc = cairo_image_surface_get_data(data.m_surface); unsigned char* dataDst = result->data()->data()->data(); if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > size.width() || (rect.y() + rect.height()) > size.height()) memset(dataDst, 0, result->data()->length()); int originx = rect.x(); int destx = 0; if (originx < 0) { destx = -originx; originx = 0; } int endx = rect.x() + rect.width(); if (endx > size.width()) endx = size.width(); int numColumns = endx - originx; int originy = rect.y(); int desty = 0; if (originy < 0) { desty = -originy; originy = 0; } int endy = rect.y() + rect.height(); if (endy > size.height()) endy = size.height(); int numRows = endy - originy; int stride = cairo_image_surface_get_stride(data.m_surface); unsigned destBytesPerRow = 4 * rect.width(); unsigned char* destRows = dataDst + desty * destBytesPerRow + destx * 4; for (int y = 0; y < numRows; ++y) { unsigned* row = reinterpret_cast<unsigned*>(dataSrc + stride * (y + originy)); for (int x = 0; x < numColumns; x++) { int basex = x * 4; unsigned* pixel = row + x + originx; Color pixelColor; if (multiplied == Unmultiplied) pixelColor = colorFromPremultipliedARGB(*pixel); else pixelColor = Color(*pixel); destRows[basex] = pixelColor.red(); destRows[basex + 1] = pixelColor.green(); destRows[basex + 2] = pixelColor.blue(); destRows[basex + 3] = pixelColor.alpha(); } destRows += destBytesPerRow; } return result; }
Color nativeImageSinglePixelSolidColor(const NativeImagePtr& image) { if (!image || nativeImageSize(image) != IntSize(1, 1)) return Color(); if (cairo_surface_get_type(image.get()) != CAIRO_SURFACE_TYPE_IMAGE) return Color(); RGBA32* pixel = reinterpret_cast_ptr<RGBA32*>(cairo_image_surface_get_data(image.get())); return colorFromPremultipliedARGB(*pixel); }
Color singlePixelSolidColor(const RefPtr<cairo_surface_t>& image) { ASSERT(image); if (NativeImage::size(image) != IntSize(1, 1)) return Color(); if (cairo_surface_get_type(image.get()) != CAIRO_SURFACE_TYPE_IMAGE) return Color(); RGBA32* pixel = reinterpret_cast_ptr<RGBA32*>(cairo_image_surface_get_data(image.get())); return colorFromPremultipliedARGB(*pixel); }
void BitmapImage::checkForSolidColor() { m_isSolidColor = false; m_checkedForSolidColor = true; if (frameCount() > 1) return; cairo_surface_t* frameSurface = frameAtIndex(0); if (!frameSurface) return; //+EAWebKitChange //5/30/2012 #if ENABLE(IMAGE_COMPRESSION) // Check if this is a compressed surface. const void* pCompressedSurfaceUserData = cairo_surface_get_user_data (frameSurface, (cairo_user_data_key_t*) ImageCompressionGetUserDataKey()); #endif //-EAWebKitChange ASSERT(cairo_surface_get_type(frameSurface) == CAIRO_SURFACE_TYPE_IMAGE); int width = cairo_image_surface_get_width(frameSurface); int height = cairo_image_surface_get_height(frameSurface); if (width != 1 || height != 1) { //+EAWebKitChange //5/30/2012 #if ENABLE(IMAGE_COMPRESSION) if (pCompressedSurfaceUserData) cairo_surface_destroy(frameSurface); #endif //-EAWebKitChange return; } unsigned* pixelColor = reinterpret_cast<unsigned*>(cairo_image_surface_get_data(frameSurface)); m_solidColor = colorFromPremultipliedARGB(*pixelColor); m_isSolidColor = true; //+EAWebKitChange //5/30/2012 #if ENABLE(IMAGE_COMPRESSION) if (pCompressedSurfaceUserData) cairo_surface_destroy(frameSurface); #endif //-EAWebKitChange }
void ImageBuffer::platformTransformColorSpace(const Vector<int>& lookUpTable) { ASSERT(cairo_surface_get_type(m_data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); unsigned char* dataSrc = cairo_image_surface_get_data(m_data.m_surface); int stride = cairo_image_surface_get_stride(m_data.m_surface); for (int y = 0; y < m_size.height(); ++y) { unsigned* row = reinterpret_cast<unsigned*>(dataSrc + stride * y); for (int x = 0; x < m_size.width(); x++) { unsigned* pixel = row + x; Color pixelColor = colorFromPremultipliedARGB(*pixel); pixelColor = Color(lookUpTable[pixelColor.red()], lookUpTable[pixelColor.green()], lookUpTable[pixelColor.blue()], lookUpTable[pixelColor.alpha()]); *pixel = premultipliedARGBFromColor(pixelColor); } } }