static UncompressedImage CGImageToUncompressedImage(CGImageRef image) { if (image == nullptr) return UncompressedImage(); size_t width = CGImageGetWidth(image); size_t height = CGImageGetHeight(image); if ((0 == width) || (0 == height)) return UncompressedImage(); size_t bits_per_pixel = CGImageGetBitsPerPixel(image); size_t bits_per_component = CGImageGetBitsPerComponent(image); CGColorSpaceRef colorspace = CGImageGetColorSpace(image); size_t row_size; UncompressedImage::Format format; CGColorSpaceRef bitmap_colorspace; CGBitmapInfo bitmap_info; if ((8 == bits_per_pixel) && (8 == bits_per_component) && (CGColorSpaceGetModel(colorspace) == kCGColorSpaceModelMonochrome)) { row_size = width; format = UncompressedImage::Format::GRAY; static CGColorSpaceRef grey_colorspace = CGColorSpaceCreateDeviceGray(); bitmap_colorspace = grey_colorspace; bitmap_info = 0; } else { static CGColorSpaceRef rgb_colorspace = CGColorSpaceCreateDeviceRGB(); bitmap_colorspace = rgb_colorspace; if ((24 == bits_per_pixel) && (8 == bits_per_component)) { row_size = width * 3; format = UncompressedImage::Format::RGB; bitmap_info = kCGBitmapByteOrder32Big; } else { row_size = width * 4; format = UncompressedImage::Format::RGBA; bitmap_info = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big; } } std::unique_ptr<uint8_t[]> uncompressed(new uint8_t[height * row_size]); CGContextRef bitmap = CGBitmapContextCreate(uncompressed.get(), width, height, 8, row_size, bitmap_colorspace, bitmap_info); if (nullptr == bitmap) { return UncompressedImage(); } AtScopeExit(bitmap) { CFRelease(bitmap); }; CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), image); return UncompressedImage(format, row_size, width, height, std::move(uncompressed)); }
void CGImageLuminanceSource::init (CGImageRef cgimage, int left, int top, int width, int height) { data_ = 0; image_ = cgimage; left_ = left; top_ = top; width_ = width; height_ = height; dataWidth_ = (int)CGImageGetWidth(image_); dataHeight_ = (int)CGImageGetHeight(image_); if (left_ + width_ > dataWidth_ || top_ + height_ > dataHeight_ || top_ < 0 || left_ < 0) { throw IllegalArgumentException("Crop rectangle does not fit within image data."); } CGColorSpaceRef space = CGImageGetColorSpace(image_); CGColorSpaceModel model = CGColorSpaceGetModel(space); if (model != kCGColorSpaceModelMonochrome || CGImageGetBitsPerComponent(image_) != 8 || CGImageGetBitsPerPixel(image_) != 8) { CGColorSpaceRef gray = CGColorSpaceCreateDeviceGray(); CGContextRef ctx = CGBitmapContextCreate(0, width, height, 8, width, gray, kCGImageAlphaNone); CGColorSpaceRelease(gray); if (top || left) { CGContextClipToRect(ctx, CGRectMake(0, 0, width, height)); } CGContextDrawImage(ctx, CGRectMake(-left, -top, width, height), image_); image_ = CGBitmapContextCreateImage(ctx); bytesPerRow_ = width; top_ = 0; left_ = 0; dataWidth_ = width; dataHeight_ = height; CGContextRelease(ctx); } else { CGImageRetain(image_); } CGDataProviderRef provider = CGImageGetDataProvider(image_); data_ = CGDataProviderCopyData(provider); }
static QColor qcolorFromCGColor(CGColorRef cgcolor) { QColor pc; CGColorSpaceModel model = CGColorSpaceGetModel(CGColorGetColorSpace(cgcolor)); const CGFloat *components = CGColorGetComponents(cgcolor); if (model == kCGColorSpaceModelRGB) { pc.setRgbF(components[0], components[1], components[2], components[3]); } else if (model == kCGColorSpaceModelCMYK) { pc.setCmykF(components[0], components[1], components[2], components[3]); } else if (model == kCGColorSpaceModelMonochrome) { pc.setRgbF(components[0], components[0], components[0], components[1]); } else { // Colorspace we can't deal with. qWarning("Qt: qcolorFromCGColor: cannot convert from colorspace model: %d", model); Q_ASSERT(false); } return pc; }
GiColor giFromCGColor(CGColorRef color) { int num = CGColorGetNumberOfComponents(color); CGColorSpaceModel space = CGColorSpaceGetModel(CGColorGetColorSpace(color)); const CGFloat *rgba = CGColorGetComponents(color); if (space == kCGColorSpaceModelMonochrome && num >= 2) { UInt8 c = (UInt8)mgRound(rgba[0] * 255); return GiColor(c, c, c, (UInt8)mgRound(rgba[1] * 255)); } if (num < 3) { return GiColor::Invalid(); } return GiColor((UInt8)mgRound(rgba[0] * 255), (UInt8)mgRound(rgba[1] * 255), (UInt8)mgRound(rgba[2] * 255), (UInt8)mgRound(CGColorGetAlpha(color) * 255)); }
CGFloat *decodeValuesFromImageDictionary(CGPDFDictionaryRef dict, CGColorSpaceRef cgColorSpace, int bitsPerComponent) { CGFloat *decodeValues = NULL; CGPDFArrayRef decodeArray = NULL; if (CGPDFDictionaryGetArray(dict, "Decode", &decodeArray)) { size_t count = CGPDFArrayGetCount(decodeArray); decodeValues = malloc(sizeof(CGFloat) * count); CGPDFReal realValue; int i; for (i = 0; i < count; i++) { CGPDFArrayGetNumber(decodeArray, i, &realValue); decodeValues[i] = realValue; } } else { size_t n; int i; switch (CGColorSpaceGetModel(cgColorSpace)) { case kCGColorSpaceModelMonochrome: decodeValues = malloc(sizeof(CGFloat) * 2); decodeValues[0] = 0.0; decodeValues[1] = 1.0; break; case kCGColorSpaceModelRGB: decodeValues = malloc(sizeof(CGFloat) * 6); for (i = 0; i < 6; i++) { decodeValues[i] = i % 2 == 0 ? 0 : 1; } break; case kCGColorSpaceModelCMYK: decodeValues = malloc(sizeof(CGFloat) * 8); for (i = 0; i < 8; i++) { decodeValues[i] = i % 2 == 0 ? 0.0 : 1.0; } break; case kCGColorSpaceModelLab: // ???? break; case kCGColorSpaceModelDeviceN: n = CGColorSpaceGetNumberOfComponents(cgColorSpace) * 2; decodeValues = malloc(sizeof(CGFloat) * (n * 2)); i = 0; for (; i < n; i++) { decodeValues[i] = i % 2 == 0 ? 0.0 : 1.0; } break; case kCGColorSpaceModelIndexed: decodeValues = malloc(sizeof(CGFloat) * 2); decodeValues[0] = 0.0; decodeValues[1] = pow(2.0,(double)bitsPerComponent) - 1; break; default: break; } } return (CGFloat *)CFMakeCollectable(decodeValues); }