| Index: core/src/fxge/apple/fx_quartz_device.cpp
|
| diff --git a/core/src/fxge/apple/fx_quartz_device.cpp b/core/src/fxge/apple/fx_quartz_device.cpp
|
| index d1e4f544ba85f3a4da9db18d7a6280b2a5ed0951..34851e0c80bfae977eff82a47fef760662264d07 100644
|
| --- a/core/src/fxge/apple/fx_quartz_device.cpp
|
| +++ b/core/src/fxge/apple/fx_quartz_device.cpp
|
| @@ -11,1118 +11,1046 @@
|
| #include "../dib/dib_int.h"
|
| #include "../ge/text_int.h"
|
|
|
| -#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
|
| +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
|
| #include "apple_int.h"
|
| #include "../../../include/fxge/fx_ge_apple.h"
|
| #ifndef CGFLOAT_IS_DOUBLE
|
| #error Expected CGFLOAT_IS_DOUBLE to be defined by CoreGraphics headers
|
| #endif
|
| -void* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap)
|
| -{
|
| - if (!pBitmap) {
|
| - return NULL;
|
| - }
|
| - CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little;
|
| - switch (pBitmap->GetFormat()) {
|
| - case FXDIB_Rgb32:
|
| - bmpInfo |= kCGImageAlphaNoneSkipFirst;
|
| - break;
|
| - case FXDIB_Argb:
|
| - default:
|
| - return NULL;
|
| - }
|
| - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
| - CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
|
| - pBitmap->GetWidth(),
|
| - pBitmap->GetHeight(),
|
| - 8,
|
| - pBitmap->GetPitch(),
|
| - colorSpace,
|
| - bmpInfo);
|
| - CGColorSpaceRelease(colorSpace);
|
| - return context;
|
| +void* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap) {
|
| + if (!pBitmap) {
|
| + return NULL;
|
| + }
|
| + CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little;
|
| + switch (pBitmap->GetFormat()) {
|
| + case FXDIB_Rgb32:
|
| + bmpInfo |= kCGImageAlphaNoneSkipFirst;
|
| + break;
|
| + case FXDIB_Argb:
|
| + default:
|
| + return NULL;
|
| + }
|
| + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
| + CGContextRef context = CGBitmapContextCreate(
|
| + pBitmap->GetBuffer(), pBitmap->GetWidth(), pBitmap->GetHeight(), 8,
|
| + pBitmap->GetPitch(), colorSpace, bmpInfo);
|
| + CGColorSpaceRelease(colorSpace);
|
| + return context;
|
| }
|
| -void CQuartz2D::destroyGraphics(void* graphics)
|
| -{
|
| - if (graphics) {
|
| - CGContextRelease((CGContextRef) graphics);
|
| - }
|
| +void CQuartz2D::destroyGraphics(void* graphics) {
|
| + if (graphics) {
|
| + CGContextRelease((CGContextRef)graphics);
|
| + }
|
| }
|
| -void* CQuartz2D::CreateFont(const uint8_t* pFontData, FX_DWORD dwFontSize)
|
| -{
|
| - CGDataProviderRef pDataProvider = CGDataProviderCreateWithData(NULL, pFontData, (size_t)dwFontSize, NULL);
|
| - if (NULL == pDataProvider) {
|
| - return NULL;
|
| - }
|
| - CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider);
|
| - CGDataProviderRelease(pDataProvider);
|
| - return pCGFont;
|
| +void* CQuartz2D::CreateFont(const uint8_t* pFontData, FX_DWORD dwFontSize) {
|
| + CGDataProviderRef pDataProvider =
|
| + CGDataProviderCreateWithData(NULL, pFontData, (size_t)dwFontSize, NULL);
|
| + if (NULL == pDataProvider) {
|
| + return NULL;
|
| + }
|
| + CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider);
|
| + CGDataProviderRelease(pDataProvider);
|
| + return pCGFont;
|
| }
|
| -void CQuartz2D::DestroyFont(void* pFont)
|
| -{
|
| - CGFontRelease((CGFontRef)pFont);
|
| +void CQuartz2D::DestroyFont(void* pFont) {
|
| + CGFontRelease((CGFontRef)pFont);
|
| }
|
| -void CQuartz2D::setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix)
|
| -{
|
| - if (!graphics || !matrix) {
|
| - return;
|
| - }
|
| - CGContextRef context = (CGContextRef) graphics;
|
| - CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f;
|
| - CGContextSetTextMatrix(context, CGAffineTransformMake(matrix->a,
|
| - matrix->b,
|
| - matrix->c,
|
| - matrix->d,
|
| - matrix->e,
|
| - ty));
|
| +void CQuartz2D::setGraphicsTextMatrix(void* graphics,
|
| + CFX_AffineMatrix* matrix) {
|
| + if (!graphics || !matrix) {
|
| + return;
|
| + }
|
| + CGContextRef context = (CGContextRef)graphics;
|
| + CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f;
|
| + CGContextSetTextMatrix(
|
| + context, CGAffineTransformMake(matrix->a, matrix->b, matrix->c, matrix->d,
|
| + matrix->e, ty));
|
| }
|
| -FX_BOOL CQuartz2D::drawGraphicsString(void* graphics,
|
| - void* font,
|
| - FX_FLOAT fontSize,
|
| - FX_WORD* glyphIndices,
|
| - CGPoint* glyphPositions,
|
| - int32_t charsCount,
|
| - FX_ARGB argb,
|
| - CFX_AffineMatrix* matrix )
|
| -{
|
| - if (!graphics) {
|
| - return FALSE;
|
| - }
|
| - CGContextRef context = (CGContextRef) graphics;
|
| - CGContextSetFont(context, (CGFontRef)font);
|
| - CGContextSetFontSize(context, fontSize);
|
| - if (matrix) {
|
| - CGAffineTransform m = CGContextGetTextMatrix(context);
|
| - m = CGAffineTransformConcat(m,
|
| - CGAffineTransformMake(matrix->a,
|
| - matrix->b,
|
| - matrix->c,
|
| - matrix->d,
|
| - matrix->e,
|
| - matrix->f));
|
| - CGContextSetTextMatrix(context, m);
|
| - }
|
| - int32_t a, r, g, b;
|
| - ArgbDecode(argb, a, r, g, b);
|
| - CGContextSetRGBFillColor(context,
|
| - r / 255.f,
|
| - g / 255.f,
|
| - b / 255.f,
|
| - a / 255.f);
|
| - CGContextSaveGState(context);
|
| +FX_BOOL CQuartz2D::drawGraphicsString(void* graphics,
|
| + void* font,
|
| + FX_FLOAT fontSize,
|
| + FX_WORD* glyphIndices,
|
| + CGPoint* glyphPositions,
|
| + int32_t charsCount,
|
| + FX_ARGB argb,
|
| + CFX_AffineMatrix* matrix) {
|
| + if (!graphics) {
|
| + return FALSE;
|
| + }
|
| + CGContextRef context = (CGContextRef)graphics;
|
| + CGContextSetFont(context, (CGFontRef)font);
|
| + CGContextSetFontSize(context, fontSize);
|
| + if (matrix) {
|
| + CGAffineTransform m = CGContextGetTextMatrix(context);
|
| + m = CGAffineTransformConcat(
|
| + m, CGAffineTransformMake(matrix->a, matrix->b, matrix->c, matrix->d,
|
| + matrix->e, matrix->f));
|
| + CGContextSetTextMatrix(context, m);
|
| + }
|
| + int32_t a, r, g, b;
|
| + ArgbDecode(argb, a, r, g, b);
|
| + CGContextSetRGBFillColor(context, r / 255.f, g / 255.f, b / 255.f, a / 255.f);
|
| + CGContextSaveGState(context);
|
| #if CGFLOAT_IS_DOUBLE
|
| - CGPoint* glyphPositionsCG = new CGPoint[charsCount];
|
| - if (!glyphPositionsCG) {
|
| - return FALSE;
|
| - }
|
| - for (int index = 0; index < charsCount; ++index) {
|
| - glyphPositionsCG[index].x = glyphPositions[index].x;
|
| - glyphPositionsCG[index].y = glyphPositions[index].y;
|
| - }
|
| + CGPoint* glyphPositionsCG = new CGPoint[charsCount];
|
| + if (!glyphPositionsCG) {
|
| + return FALSE;
|
| + }
|
| + for (int index = 0; index < charsCount; ++index) {
|
| + glyphPositionsCG[index].x = glyphPositions[index].x;
|
| + glyphPositionsCG[index].y = glyphPositions[index].y;
|
| + }
|
| #else
|
| - CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions;
|
| + CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions;
|
| #endif
|
| - CGContextShowGlyphsAtPositions(context,
|
| - (CGGlyph *) glyphIndices,
|
| - glyphPositionsCG,
|
| - charsCount);
|
| + CGContextShowGlyphsAtPositions(context, (CGGlyph*)glyphIndices,
|
| + glyphPositionsCG, charsCount);
|
| #if CGFLOAT_IS_DOUBLE
|
| - delete[] glyphPositionsCG;
|
| + delete[] glyphPositionsCG;
|
| #endif
|
| - CGContextRestoreGState(context);
|
| - return TRUE;
|
| + CGContextRestoreGState(context);
|
| + return TRUE;
|
| }
|
| -void CQuartz2D::saveGraphicsState(void * graphics)
|
| -{
|
| - if (graphics) {
|
| - CGContextSaveGState((CGContextRef) graphics);
|
| - }
|
| +void CQuartz2D::saveGraphicsState(void* graphics) {
|
| + if (graphics) {
|
| + CGContextSaveGState((CGContextRef)graphics);
|
| + }
|
| }
|
| -void CQuartz2D::restoreGraphicsState(void * graphics)
|
| -{
|
| - if (graphics) {
|
| - CGContextRestoreGState((CGContextRef) graphics);
|
| - }
|
| +void CQuartz2D::restoreGraphicsState(void* graphics) {
|
| + if (graphics) {
|
| + CGContextRestoreGState((CGContextRef)graphics);
|
| + }
|
| }
|
| -static CGContextRef createContextWithBitmap(CFX_DIBitmap* pBitmap)
|
| -{
|
| - if (!pBitmap || pBitmap->IsCmykImage() || pBitmap->GetBPP() < 32) {
|
| - return NULL;
|
| - }
|
| - CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;
|
| - if (pBitmap->HasAlpha()) {
|
| - bitmapInfo |= kCGImageAlphaPremultipliedFirst;
|
| - } else {
|
| - bitmapInfo |= kCGImageAlphaNoneSkipFirst;
|
| - }
|
| - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
| - CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
|
| - pBitmap->GetWidth(),
|
| - pBitmap->GetHeight(),
|
| - 8,
|
| - pBitmap->GetPitch(),
|
| - colorSpace,
|
| - bitmapInfo);
|
| - CGColorSpaceRelease(colorSpace);
|
| - return context;
|
| +static CGContextRef createContextWithBitmap(CFX_DIBitmap* pBitmap) {
|
| + if (!pBitmap || pBitmap->IsCmykImage() || pBitmap->GetBPP() < 32) {
|
| + return NULL;
|
| + }
|
| + CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;
|
| + if (pBitmap->HasAlpha()) {
|
| + bitmapInfo |= kCGImageAlphaPremultipliedFirst;
|
| + } else {
|
| + bitmapInfo |= kCGImageAlphaNoneSkipFirst;
|
| + }
|
| + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
| + CGContextRef context = CGBitmapContextCreate(
|
| + pBitmap->GetBuffer(), pBitmap->GetWidth(), pBitmap->GetHeight(), 8,
|
| + pBitmap->GetPitch(), colorSpace, bitmapInfo);
|
| + CGColorSpaceRelease(colorSpace);
|
| + return context;
|
| }
|
| -CFX_QuartzDeviceDriver::CFX_QuartzDeviceDriver(CGContextRef context, int32_t deviceClass)
|
| -{
|
| - m_saveCount = 0;
|
| - _context = context;
|
| - _deviceClass = deviceClass;
|
| - CGContextRetain(_context);
|
| - CGRect r = CGContextGetClipBoundingBox(context);
|
| - _width = FXSYS_round(r.size.width);
|
| - _height = FXSYS_round(r.size.height);
|
| - _renderCaps = FXRC_SOFT_CLIP | FXRC_BLEND_MODE |
|
| - FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |
|
| - FXRC_BIT_MASK | FXRC_ALPHA_MASK;
|
| - if (_deviceClass != FXDC_DISPLAY) {
|
| - } else {
|
| - CGImageRef image = CGBitmapContextCreateImage(_context);
|
| - if (image) {
|
| - _renderCaps |= FXRC_GET_BITS;
|
| - _width = CGImageGetWidth(image);
|
| - _height = CGImageGetHeight(image);
|
| - CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);
|
| - if (kCGImageAlphaPremultipliedFirst == alphaInfo ||
|
| - kCGImageAlphaPremultipliedLast == alphaInfo ||
|
| - kCGImageAlphaOnly == alphaInfo) {
|
| - _renderCaps |= FXRC_ALPHA_OUTPUT;
|
| - }
|
| - }
|
| - CGImageRelease(image);
|
| - }
|
| - CGAffineTransform ctm = CGContextGetCTM(_context);
|
| - CGContextSaveGState(_context);
|
| - m_saveCount++;
|
| - if (ctm.d >= 0) {
|
| - CGFloat offset_x, offset_y;
|
| - offset_x = ctm.tx;
|
| - offset_y = ctm.ty;
|
| - CGContextTranslateCTM(_context, -offset_x, -offset_y);
|
| - CGContextConcatCTM(_context, CGAffineTransformMake(1, 0, 0, -1, offset_x, _height + offset_y));
|
| +CFX_QuartzDeviceDriver::CFX_QuartzDeviceDriver(CGContextRef context,
|
| + int32_t deviceClass) {
|
| + m_saveCount = 0;
|
| + _context = context;
|
| + _deviceClass = deviceClass;
|
| + CGContextRetain(_context);
|
| + CGRect r = CGContextGetClipBoundingBox(context);
|
| + _width = FXSYS_round(r.size.width);
|
| + _height = FXSYS_round(r.size.height);
|
| + _renderCaps = FXRC_SOFT_CLIP | FXRC_BLEND_MODE | FXRC_ALPHA_PATH |
|
| + FXRC_ALPHA_IMAGE | FXRC_BIT_MASK | FXRC_ALPHA_MASK;
|
| + if (_deviceClass != FXDC_DISPLAY) {
|
| + } else {
|
| + CGImageRef image = CGBitmapContextCreateImage(_context);
|
| + if (image) {
|
| + _renderCaps |= FXRC_GET_BITS;
|
| + _width = CGImageGetWidth(image);
|
| + _height = CGImageGetHeight(image);
|
| + CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);
|
| + if (kCGImageAlphaPremultipliedFirst == alphaInfo ||
|
| + kCGImageAlphaPremultipliedLast == alphaInfo ||
|
| + kCGImageAlphaOnly == alphaInfo) {
|
| + _renderCaps |= FXRC_ALPHA_OUTPUT;
|
| + }
|
| }
|
| - _foxitDevice2User = CGAffineTransformIdentity;
|
| - _user2FoxitDevice = CGAffineTransformInvert(_foxitDevice2User);
|
| + CGImageRelease(image);
|
| + }
|
| + CGAffineTransform ctm = CGContextGetCTM(_context);
|
| + CGContextSaveGState(_context);
|
| + m_saveCount++;
|
| + if (ctm.d >= 0) {
|
| + CGFloat offset_x, offset_y;
|
| + offset_x = ctm.tx;
|
| + offset_y = ctm.ty;
|
| + CGContextTranslateCTM(_context, -offset_x, -offset_y);
|
| + CGContextConcatCTM(_context, CGAffineTransformMake(1, 0, 0, -1, offset_x,
|
| + _height + offset_y));
|
| + }
|
| + _foxitDevice2User = CGAffineTransformIdentity;
|
| + _user2FoxitDevice = CGAffineTransformInvert(_foxitDevice2User);
|
| }
|
| -CFX_QuartzDeviceDriver::~CFX_QuartzDeviceDriver()
|
| -{
|
| +CFX_QuartzDeviceDriver::~CFX_QuartzDeviceDriver() {
|
| + CGContextRestoreGState(_context);
|
| + m_saveCount--;
|
| + for (int i = 0; i < m_saveCount; ++i) {
|
| CGContextRestoreGState(_context);
|
| - m_saveCount--;
|
| - for (int i = 0; i < m_saveCount; ++i) {
|
| - CGContextRestoreGState(_context);
|
| + }
|
| + if (_context) {
|
| + CGContextRelease(_context);
|
| + }
|
| +}
|
| +int CFX_QuartzDeviceDriver::GetDeviceCaps(int capsID) {
|
| + switch (capsID) {
|
| + case FXDC_DEVICE_CLASS: {
|
| + return _deviceClass;
|
| }
|
| - if (_context) {
|
| - CGContextRelease(_context);
|
| + case FXDC_PIXEL_WIDTH: {
|
| + return _width;
|
| }
|
| -}
|
| -int CFX_QuartzDeviceDriver::GetDeviceCaps(int capsID)
|
| -{
|
| - switch (capsID) {
|
| - case FXDC_DEVICE_CLASS: {
|
| - return _deviceClass;
|
| - }
|
| - case FXDC_PIXEL_WIDTH: {
|
| - return _width;
|
| - }
|
| - case FXDC_PIXEL_HEIGHT: {
|
| - return _height;
|
| - }
|
| - case FXDC_BITS_PIXEL: {
|
| - return 32;
|
| - }
|
| - case FXDC_RENDER_CAPS: {
|
| - return _renderCaps;
|
| - }
|
| - default: {
|
| - return 0;
|
| - }
|
| + case FXDC_PIXEL_HEIGHT: {
|
| + return _height;
|
| + }
|
| + case FXDC_BITS_PIXEL: {
|
| + return 32;
|
| }
|
| + case FXDC_RENDER_CAPS: {
|
| + return _renderCaps;
|
| + }
|
| + default: { return 0; }
|
| + }
|
| +}
|
| +CFX_Matrix CFX_QuartzDeviceDriver::GetCTM() const {
|
| + CGAffineTransform ctm = CGContextGetCTM(_context);
|
| + return CFX_Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.tx, ctm.ty);
|
| }
|
| -CFX_Matrix CFX_QuartzDeviceDriver::GetCTM() const
|
| -{
|
| - CGAffineTransform ctm = CGContextGetCTM(_context);
|
| - return CFX_Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.tx, ctm.ty);
|
| +void CFX_QuartzDeviceDriver::SaveState() {
|
| + CGContextSaveGState(_context);
|
| + m_saveCount++;
|
| }
|
| -void CFX_QuartzDeviceDriver::SaveState()
|
| -{
|
| +void CFX_QuartzDeviceDriver::RestoreState(FX_BOOL isKeepSaved) {
|
| + CGContextRestoreGState(_context);
|
| + if (isKeepSaved) {
|
| CGContextSaveGState(_context);
|
| - m_saveCount++;
|
| + } else {
|
| + m_saveCount--;
|
| + }
|
| }
|
| -void CFX_QuartzDeviceDriver::RestoreState(FX_BOOL isKeepSaved )
|
| -{
|
| - CGContextRestoreGState(_context);
|
| - if (isKeepSaved) {
|
| - CGContextSaveGState(_context);
|
| - } else {
|
| - m_saveCount--;
|
| - }
|
| +FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathFill(const CFX_PathData* pathData,
|
| + const CFX_AffineMatrix* matrix,
|
| + int fillMode) {
|
| + SaveState();
|
| + CGAffineTransform m = CGAffineTransformIdentity;
|
| + if (matrix) {
|
| + m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(),
|
| + matrix->GetD(), matrix->GetE(), matrix->GetF());
|
| + }
|
| + m = CGAffineTransformConcat(m, _foxitDevice2User);
|
| + CGContextConcatCTM(_context, m);
|
| + setPathToContext(pathData);
|
| + RestoreState(FALSE);
|
| + if ((fillMode & 3) == FXFILL_WINDING) {
|
| + CGContextClip(_context);
|
| + } else {
|
| + CGContextEOClip(_context);
|
| + }
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathFill(const CFX_PathData* pathData,
|
| - const CFX_AffineMatrix* matrix,
|
| - int fillMode )
|
| -{
|
| - SaveState();
|
| - CGAffineTransform m = CGAffineTransformIdentity;
|
| - if (matrix) {
|
| - m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
|
| - }
|
| - m = CGAffineTransformConcat(m, _foxitDevice2User);
|
| - CGContextConcatCTM(_context, m);
|
| - setPathToContext(pathData);
|
| - RestoreState(FALSE);
|
| - if ((fillMode & 3) == FXFILL_WINDING) {
|
| - CGContextClip(_context);
|
| - } else {
|
| - CGContextEOClip(_context);
|
| - }
|
| - return TRUE;
|
| +FX_FLOAT CFX_QuartzDeviceDriver::getLineWidth(
|
| + const CFX_GraphStateData* graphState,
|
| + CGAffineTransform ctm) {
|
| + FX_FLOAT lineWidth = graphState->m_LineWidth;
|
| + if (graphState->m_LineWidth <= 0.f) {
|
| + CGSize size;
|
| + size.width = 1;
|
| + size.height = 1;
|
| + CGSize temp = CGSizeApplyAffineTransform(size, ctm);
|
| + CGFloat x = 1 / temp.width;
|
| + CGFloat y = 1 / temp.height;
|
| + lineWidth = x > y ? x : y;
|
| + }
|
| + return lineWidth;
|
| }
|
| -FX_FLOAT CFX_QuartzDeviceDriver::getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm)
|
| -{
|
| - FX_FLOAT lineWidth = graphState->m_LineWidth;
|
| - if (graphState->m_LineWidth <= 0.f) {
|
| - CGSize size;
|
| - size.width = 1;
|
| - size.height = 1;
|
| - CGSize temp = CGSizeApplyAffineTransform(size, ctm);
|
| - CGFloat x = 1 / temp.width;
|
| - CGFloat y = 1 / temp.height;
|
| - lineWidth = x > y ? x : y;
|
| - }
|
| - return lineWidth;
|
| +FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathStroke(
|
| + const CFX_PathData* pathData,
|
| + const CFX_AffineMatrix* matrix,
|
| + const CFX_GraphStateData* graphState) {
|
| + SaveState();
|
| + CGAffineTransform m = CGAffineTransformIdentity;
|
| + if (matrix) {
|
| + m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(),
|
| + matrix->GetD(), matrix->GetE(), matrix->GetF());
|
| + }
|
| + m = CGAffineTransformConcat(m, _foxitDevice2User);
|
| + CGContextConcatCTM(_context, m);
|
| + FX_FLOAT lineWidth = getLineWidth(graphState, m);
|
| + setStrokeInfo(graphState, 0xFF000000, lineWidth);
|
| + setPathToContext(pathData);
|
| + CGContextReplacePathWithStrokedPath(_context);
|
| + RestoreState(FALSE);
|
| + CGContextClip(_context);
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathStroke(const CFX_PathData* pathData,
|
| - const CFX_AffineMatrix* matrix,
|
| - const CFX_GraphStateData* graphState )
|
| -{
|
| - SaveState();
|
| - CGAffineTransform m = CGAffineTransformIdentity;
|
| - if (matrix) {
|
| - m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
|
| - }
|
| - m = CGAffineTransformConcat(m, _foxitDevice2User);
|
| - CGContextConcatCTM(_context, m);
|
| - FX_FLOAT lineWidth = getLineWidth(graphState, m);
|
| - setStrokeInfo(graphState, 0xFF000000, lineWidth);
|
| - setPathToContext(pathData);
|
| - CGContextReplacePathWithStrokedPath(_context);
|
| - RestoreState(FALSE);
|
| - CGContextClip(_context);
|
| - return TRUE;
|
| +static CGBlendMode GetCGBlendMode(int blend_type) {
|
| + CGBlendMode mode = kCGBlendModeNormal;
|
| + switch (blend_type) {
|
| + case FXDIB_BLEND_NORMAL:
|
| + mode = kCGBlendModeNormal;
|
| + break;
|
| + case FXDIB_BLEND_MULTIPLY:
|
| + mode = kCGBlendModeMultiply;
|
| + break;
|
| + case FXDIB_BLEND_SCREEN:
|
| + mode = kCGBlendModeScreen;
|
| + break;
|
| + case FXDIB_BLEND_OVERLAY:
|
| + mode = kCGBlendModeOverlay;
|
| + break;
|
| + case FXDIB_BLEND_DARKEN:
|
| + mode = kCGBlendModeDarken;
|
| + break;
|
| + case FXDIB_BLEND_LIGHTEN:
|
| + mode = kCGBlendModeLighten;
|
| + break;
|
| + case FXDIB_BLEND_COLORDODGE:
|
| + mode = kCGBlendModeColorDodge;
|
| + break;
|
| + case FXDIB_BLEND_COLORBURN:
|
| + mode = kCGBlendModeColorBurn;
|
| + break;
|
| + case FXDIB_BLEND_HARDLIGHT:
|
| + mode = kCGBlendModeHardLight;
|
| + break;
|
| + case FXDIB_BLEND_SOFTLIGHT:
|
| + mode = kCGBlendModeSoftLight;
|
| + break;
|
| + case FXDIB_BLEND_DIFFERENCE:
|
| + mode = kCGBlendModeDifference;
|
| + break;
|
| + case FXDIB_BLEND_EXCLUSION:
|
| + mode = kCGBlendModeExclusion;
|
| + break;
|
| + case FXDIB_BLEND_HUE:
|
| + mode = kCGBlendModeHue;
|
| + break;
|
| + case FXDIB_BLEND_SATURATION:
|
| + mode = kCGBlendModeSaturation;
|
| + break;
|
| + case FXDIB_BLEND_COLOR:
|
| + mode = kCGBlendModeColor;
|
| + break;
|
| + case FXDIB_BLEND_LUMINOSITY:
|
| + mode = kCGBlendModeLuminosity;
|
| + break;
|
| + default:
|
| + mode = kCGBlendModeNormal;
|
| + break;
|
| + }
|
| + return mode;
|
| }
|
| -static CGBlendMode GetCGBlendMode(int blend_type)
|
| -{
|
| - CGBlendMode mode = kCGBlendModeNormal;
|
| - switch (blend_type) {
|
| - case FXDIB_BLEND_NORMAL:
|
| - mode = kCGBlendModeNormal;
|
| - break;
|
| - case FXDIB_BLEND_MULTIPLY:
|
| - mode = kCGBlendModeMultiply;
|
| - break;
|
| - case FXDIB_BLEND_SCREEN:
|
| - mode = kCGBlendModeScreen;
|
| - break;
|
| - case FXDIB_BLEND_OVERLAY:
|
| - mode = kCGBlendModeOverlay;
|
| - break;
|
| - case FXDIB_BLEND_DARKEN:
|
| - mode = kCGBlendModeDarken;
|
| - break;
|
| - case FXDIB_BLEND_LIGHTEN:
|
| - mode = kCGBlendModeLighten;
|
| - break;
|
| - case FXDIB_BLEND_COLORDODGE:
|
| - mode = kCGBlendModeColorDodge;
|
| - break;
|
| - case FXDIB_BLEND_COLORBURN:
|
| - mode = kCGBlendModeColorBurn;
|
| - break;
|
| - case FXDIB_BLEND_HARDLIGHT:
|
| - mode = kCGBlendModeHardLight;
|
| - break;
|
| - case FXDIB_BLEND_SOFTLIGHT:
|
| - mode = kCGBlendModeSoftLight;
|
| - break;
|
| - case FXDIB_BLEND_DIFFERENCE:
|
| - mode = kCGBlendModeDifference;
|
| - break;
|
| - case FXDIB_BLEND_EXCLUSION:
|
| - mode = kCGBlendModeExclusion;
|
| - break;
|
| - case FXDIB_BLEND_HUE:
|
| - mode = kCGBlendModeHue;
|
| - break;
|
| - case FXDIB_BLEND_SATURATION:
|
| - mode = kCGBlendModeSaturation;
|
| - break;
|
| - case FXDIB_BLEND_COLOR:
|
| - mode = kCGBlendModeColor;
|
| - break;
|
| - case FXDIB_BLEND_LUMINOSITY:
|
| - mode = kCGBlendModeLuminosity;
|
| - break;
|
| - default:
|
| - mode = kCGBlendModeNormal;
|
| - break;
|
| - }
|
| - return mode;
|
| +FX_BOOL CFX_QuartzDeviceDriver::DrawPath(const CFX_PathData* pathData,
|
| + const CFX_AffineMatrix* matrix,
|
| + const CFX_GraphStateData* graphState,
|
| + FX_DWORD fillArgb,
|
| + FX_DWORD strokeArgb,
|
| + int fillMode,
|
| + int alpha_flag,
|
| + void* pIccTransform,
|
| + int blend_type) {
|
| + SaveState();
|
| + CGBlendMode mode = GetCGBlendMode(blend_type);
|
| + if (mode != kCGBlendModeNormal) {
|
| + CGContextSetBlendMode(_context, mode);
|
| + }
|
| + CGAffineTransform m = CGAffineTransformIdentity;
|
| + if (matrix) {
|
| + m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(),
|
| + matrix->GetD(), matrix->GetE(), matrix->GetF());
|
| + }
|
| + m = CGAffineTransformConcat(m, _foxitDevice2User);
|
| + CGContextConcatCTM(_context, m);
|
| + int pathMode = 0;
|
| + if (graphState && strokeArgb) {
|
| + CGContextSetMiterLimit(_context, graphState->m_MiterLimit);
|
| + FX_FLOAT lineWidth = getLineWidth(graphState, m);
|
| + setStrokeInfo(graphState, strokeArgb, lineWidth);
|
| + pathMode |= 4;
|
| + }
|
| + if (fillMode && fillArgb) {
|
| + setFillInfo(fillArgb);
|
| + if ((fillMode & 3) == FXFILL_WINDING) {
|
| + pathMode |= 1;
|
| + } else if ((fillMode & 3) == FXFILL_ALTERNATE) {
|
| + pathMode |= 2;
|
| + }
|
| + }
|
| + setPathToContext(pathData);
|
| + if (fillMode & FXFILL_FULLCOVER) {
|
| + CGContextSetShouldAntialias(_context, false);
|
| + }
|
| + if (pathMode == 4) {
|
| + CGContextStrokePath(_context);
|
| + } else if (pathMode == 1) {
|
| + CGContextFillPath(_context);
|
| + } else if (pathMode == 2) {
|
| + CGContextEOFillPath(_context);
|
| + } else if (pathMode == 5) {
|
| + CGContextDrawPath(_context, kCGPathFillStroke);
|
| + } else if (pathMode == 6) {
|
| + CGContextDrawPath(_context, kCGPathEOFillStroke);
|
| + }
|
| + RestoreState(FALSE);
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDeviceDriver::DrawPath(const CFX_PathData* pathData,
|
| - const CFX_AffineMatrix* matrix,
|
| - const CFX_GraphStateData* graphState,
|
| - FX_DWORD fillArgb,
|
| - FX_DWORD strokeArgb,
|
| - int fillMode,
|
| - int alpha_flag,
|
| - void* pIccTransform,
|
| - int blend_type
|
| - )
|
| -{
|
| - SaveState();
|
| - CGBlendMode mode = GetCGBlendMode(blend_type);
|
| - if (mode != kCGBlendModeNormal) {
|
| - CGContextSetBlendMode(_context, mode);
|
| - }
|
| - CGAffineTransform m = CGAffineTransformIdentity;
|
| - if (matrix) {
|
| - m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
|
| - }
|
| - m = CGAffineTransformConcat(m, _foxitDevice2User);
|
| - CGContextConcatCTM(_context, m);
|
| - int pathMode = 0;
|
| - if (graphState && strokeArgb) {
|
| - CGContextSetMiterLimit(_context, graphState->m_MiterLimit);
|
| - FX_FLOAT lineWidth = getLineWidth(graphState, m);
|
| - setStrokeInfo(graphState, strokeArgb, lineWidth);
|
| - pathMode |= 4;
|
| - }
|
| - if (fillMode && fillArgb) {
|
| - setFillInfo(fillArgb);
|
| - if ((fillMode & 3) == FXFILL_WINDING) {
|
| - pathMode |= 1;
|
| - } else if ((fillMode & 3) == FXFILL_ALTERNATE) {
|
| - pathMode |= 2;
|
| - }
|
| - }
|
| - setPathToContext(pathData);
|
| - if (fillMode & FXFILL_FULLCOVER) {
|
| - CGContextSetShouldAntialias(_context, false);
|
| - }
|
| - if (pathMode == 4) {
|
| - CGContextStrokePath(_context);
|
| - } else if (pathMode == 1) {
|
| - CGContextFillPath(_context);
|
| - } else if (pathMode == 2) {
|
| - CGContextEOFillPath(_context);
|
| - } else if (pathMode == 5) {
|
| - CGContextDrawPath(_context, kCGPathFillStroke);
|
| - } else if (pathMode == 6) {
|
| - CGContextDrawPath(_context, kCGPathEOFillStroke);
|
| - }
|
| - RestoreState(FALSE);
|
| - return TRUE;
|
| +FX_BOOL CFX_QuartzDeviceDriver::FillRect(const FX_RECT* rect,
|
| + FX_ARGB fillArgb,
|
| + int alphaFlag,
|
| + void* iccTransform,
|
| + int blend_type) {
|
| + CGBlendMode mode = GetCGBlendMode(blend_type);
|
| + if (mode != kCGBlendModeNormal) {
|
| + CGContextSetBlendMode(_context, mode);
|
| + }
|
| + CGRect rect_fx =
|
| + CGRectMake(rect->left, rect->top, rect->Width(), rect->Height());
|
| + CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
|
| + int32_t a, r, g, b;
|
| + ArgbDecode(fillArgb, a, r, g, b);
|
| + CGContextSetRGBFillColor(_context, r / 255.f, g / 255.f, b / 255.f,
|
| + a / 255.f);
|
| + CGContextFillRect(_context, rect_usr);
|
| + if (mode != kCGBlendModeNormal) {
|
| + CGContextSetBlendMode(_context, kCGBlendModeNormal);
|
| + }
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDeviceDriver::FillRect(const FX_RECT* rect,
|
| - FX_ARGB fillArgb,
|
| - int alphaFlag ,
|
| - void* iccTransform ,
|
| - int blend_type )
|
| -{
|
| - CGBlendMode mode = GetCGBlendMode(blend_type);
|
| - if (mode != kCGBlendModeNormal) {
|
| - CGContextSetBlendMode(_context, mode);
|
| - }
|
| - CGRect rect_fx = CGRectMake(rect->left, rect->top, rect->Width(), rect->Height());
|
| - CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
|
| - int32_t a, r, g, b;
|
| - ArgbDecode(fillArgb, a, r, g, b);
|
| - CGContextSetRGBFillColor(_context,
|
| - r / 255.f,
|
| - g / 255.f,
|
| - b / 255.f,
|
| +FX_BOOL CFX_QuartzDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
|
| + FX_FLOAT y1,
|
| + FX_FLOAT x2,
|
| + FX_FLOAT y2,
|
| + FX_DWORD argb,
|
| + int alphaFlag,
|
| + void* iccTransform,
|
| + int blend_type) {
|
| + CGBlendMode mode = GetCGBlendMode(blend_type);
|
| + if (mode != kCGBlendModeNormal) {
|
| + CGContextSetBlendMode(_context, mode);
|
| + }
|
| + CGPoint pt =
|
| + CGPointApplyAffineTransform(CGPointMake(x1, y1), _foxitDevice2User);
|
| + x1 = pt.x;
|
| + y1 = pt.y;
|
| + pt = CGPointApplyAffineTransform(CGPointMake(x2, y2), _foxitDevice2User);
|
| + x2 = pt.x;
|
| + y2 = pt.y;
|
| + int32_t a, r, g, b;
|
| + ArgbDecode(argb, a, r, g, b);
|
| + CGContextSetRGBStrokeColor(_context, r / 255.f, g / 255.f, b / 255.f,
|
| a / 255.f);
|
| - CGContextFillRect(_context, rect_usr);
|
| - if (mode != kCGBlendModeNormal) {
|
| - CGContextSetBlendMode(_context, kCGBlendModeNormal);
|
| - }
|
| - return TRUE;
|
| + CGContextMoveToPoint(_context, x1, y1);
|
| + CGContextAddLineToPoint(_context, x2, y2);
|
| + CGContextStrokePath(_context);
|
| + if (mode != kCGBlendModeNormal) {
|
| + CGContextSetBlendMode(_context, kCGBlendModeNormal);
|
| + }
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
|
| - FX_FLOAT y1,
|
| - FX_FLOAT x2,
|
| - FX_FLOAT y2,
|
| - FX_DWORD argb,
|
| - int alphaFlag ,
|
| - void* iccTransform ,
|
| - int blend_type )
|
| -{
|
| - CGBlendMode mode = GetCGBlendMode(blend_type);
|
| - if (mode != kCGBlendModeNormal) {
|
| - CGContextSetBlendMode(_context, mode);
|
| - }
|
| - CGPoint pt = CGPointApplyAffineTransform(CGPointMake(x1, y1), _foxitDevice2User);
|
| - x1 = pt.x;
|
| - y1 = pt.y;
|
| - pt = CGPointApplyAffineTransform(CGPointMake(x2, y2), _foxitDevice2User);
|
| - x2 = pt.x;
|
| - y2 = pt.y;
|
| - int32_t a, r, g, b;
|
| - ArgbDecode(argb, a, r, g, b);
|
| - CGContextSetRGBStrokeColor(_context,
|
| - r / 255.f,
|
| - g / 255.f,
|
| - b / 255.f,
|
| - a / 255.f);
|
| - CGContextMoveToPoint(_context, x1, y1);
|
| - CGContextAddLineToPoint(_context, x2, y2);
|
| - CGContextStrokePath(_context);
|
| - if (mode != kCGBlendModeNormal) {
|
| - CGContextSetBlendMode(_context, kCGBlendModeNormal);
|
| - }
|
| - return TRUE;
|
| -}
|
| -FX_BOOL CFX_QuartzDeviceDriver::GetClipBox(FX_RECT* rect)
|
| -{
|
| - CGRect r = CGContextGetClipBoundingBox(_context);
|
| - r = CGRectApplyAffineTransform(r, _user2FoxitDevice);
|
| - rect->left = FXSYS_floor(r.origin.x);
|
| - rect->top = FXSYS_floor(r.origin.y);
|
| - rect->right = FXSYS_ceil(r.origin.x + r.size.width);
|
| - rect->bottom = FXSYS_ceil(r.origin.y + r.size.height);
|
| - return TRUE;
|
| +FX_BOOL CFX_QuartzDeviceDriver::GetClipBox(FX_RECT* rect) {
|
| + CGRect r = CGContextGetClipBoundingBox(_context);
|
| + r = CGRectApplyAffineTransform(r, _user2FoxitDevice);
|
| + rect->left = FXSYS_floor(r.origin.x);
|
| + rect->top = FXSYS_floor(r.origin.y);
|
| + rect->right = FXSYS_ceil(r.origin.x + r.size.width);
|
| + rect->bottom = FXSYS_ceil(r.origin.y + r.size.height);
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDeviceDriver::GetDIBits(CFX_DIBitmap* bitmap,
|
| - int32_t left,
|
| - int32_t top,
|
| - void* pIccTransform,
|
| - FX_BOOL bDEdge)
|
| -{
|
| - if (FXDC_PRINTER == _deviceClass) {
|
| - return FALSE;
|
| - }
|
| - if (bitmap->GetBPP() < 32) {
|
| - return FALSE;
|
| - }
|
| - if (!(_renderCaps | FXRC_GET_BITS)) {
|
| - return FALSE;
|
| - }
|
| - CGPoint pt = CGPointMake(left, top);
|
| - pt = CGPointApplyAffineTransform(pt, _foxitDevice2User);
|
| - CGAffineTransform ctm = CGContextGetCTM(_context);
|
| - pt.x *= FXSYS_fabs(ctm.a);
|
| - pt.y *= FXSYS_fabs(ctm.d);
|
| - CGImageRef image = CGBitmapContextCreateImage(_context);
|
| - if (NULL == image) {
|
| - return FALSE;
|
| - }
|
| - CGFloat width = (CGFloat) bitmap->GetWidth();
|
| - CGFloat height = (CGFloat) bitmap->GetHeight();
|
| - if (width + pt.x > _width) {
|
| - width -= (width + pt.x - _width);
|
| - }
|
| - if (height + pt.y > _height) {
|
| - height -= (height + pt.y - _height);
|
| - }
|
| - CGImageRef subImage = CGImageCreateWithImageInRect(image,
|
| - CGRectMake(pt.x,
|
| - pt.y,
|
| - width,
|
| - height));
|
| - CGContextRef context = createContextWithBitmap(bitmap);
|
| - CGRect rect = CGContextGetClipBoundingBox(context);
|
| - CGContextClearRect(context, rect);
|
| - CGContextDrawImage(context, rect, subImage);
|
| - CGContextRelease(context);
|
| - CGImageRelease(subImage);
|
| - CGImageRelease(image);
|
| - if (bitmap->HasAlpha()) {
|
| - for (int row = 0; row < bitmap->GetHeight(); row ++) {
|
| - uint8_t* pScanline = (uint8_t*)bitmap->GetScanline(row);
|
| - for (int col = 0; col < bitmap->GetWidth(); col ++) {
|
| - if (pScanline[3] > 0) {
|
| - pScanline[0] = (pScanline[0] * 255.f / pScanline[3] + .5f);
|
| - pScanline[1] = (pScanline[1] * 255.f / pScanline[3] + .5f);
|
| - pScanline[2] = (pScanline[2] * 255.f / pScanline[3] + .5f);
|
| - }
|
| - pScanline += 4;
|
| - }
|
| +FX_BOOL CFX_QuartzDeviceDriver::GetDIBits(CFX_DIBitmap* bitmap,
|
| + int32_t left,
|
| + int32_t top,
|
| + void* pIccTransform,
|
| + FX_BOOL bDEdge) {
|
| + if (FXDC_PRINTER == _deviceClass) {
|
| + return FALSE;
|
| + }
|
| + if (bitmap->GetBPP() < 32) {
|
| + return FALSE;
|
| + }
|
| + if (!(_renderCaps | FXRC_GET_BITS)) {
|
| + return FALSE;
|
| + }
|
| + CGPoint pt = CGPointMake(left, top);
|
| + pt = CGPointApplyAffineTransform(pt, _foxitDevice2User);
|
| + CGAffineTransform ctm = CGContextGetCTM(_context);
|
| + pt.x *= FXSYS_fabs(ctm.a);
|
| + pt.y *= FXSYS_fabs(ctm.d);
|
| + CGImageRef image = CGBitmapContextCreateImage(_context);
|
| + if (NULL == image) {
|
| + return FALSE;
|
| + }
|
| + CGFloat width = (CGFloat)bitmap->GetWidth();
|
| + CGFloat height = (CGFloat)bitmap->GetHeight();
|
| + if (width + pt.x > _width) {
|
| + width -= (width + pt.x - _width);
|
| + }
|
| + if (height + pt.y > _height) {
|
| + height -= (height + pt.y - _height);
|
| + }
|
| + CGImageRef subImage = CGImageCreateWithImageInRect(
|
| + image, CGRectMake(pt.x, pt.y, width, height));
|
| + CGContextRef context = createContextWithBitmap(bitmap);
|
| + CGRect rect = CGContextGetClipBoundingBox(context);
|
| + CGContextClearRect(context, rect);
|
| + CGContextDrawImage(context, rect, subImage);
|
| + CGContextRelease(context);
|
| + CGImageRelease(subImage);
|
| + CGImageRelease(image);
|
| + if (bitmap->HasAlpha()) {
|
| + for (int row = 0; row < bitmap->GetHeight(); row++) {
|
| + uint8_t* pScanline = (uint8_t*)bitmap->GetScanline(row);
|
| + for (int col = 0; col < bitmap->GetWidth(); col++) {
|
| + if (pScanline[3] > 0) {
|
| + pScanline[0] = (pScanline[0] * 255.f / pScanline[3] + .5f);
|
| + pScanline[1] = (pScanline[1] * 255.f / pScanline[3] + .5f);
|
| + pScanline[2] = (pScanline[2] * 255.f / pScanline[3] + .5f);
|
| }
|
| + pScanline += 4;
|
| + }
|
| }
|
| - return TRUE;
|
| + }
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
|
| - FX_ARGB argb,
|
| - const FX_RECT* srcRect,
|
| - int dest_left,
|
| - int dest_top,
|
| - int blendType,
|
| - int alphaFlag ,
|
| - void* iccTransform )
|
| -{
|
| - SaveState();
|
| - CGFloat src_left, src_top, src_width, src_height;
|
| - if (srcRect) {
|
| - src_left = srcRect->left;
|
| - src_top = srcRect->top;
|
| - src_width = srcRect->Width();
|
| - src_height = srcRect->Height();
|
| +FX_BOOL CFX_QuartzDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
|
| + FX_ARGB argb,
|
| + const FX_RECT* srcRect,
|
| + int dest_left,
|
| + int dest_top,
|
| + int blendType,
|
| + int alphaFlag,
|
| + void* iccTransform) {
|
| + SaveState();
|
| + CGFloat src_left, src_top, src_width, src_height;
|
| + if (srcRect) {
|
| + src_left = srcRect->left;
|
| + src_top = srcRect->top;
|
| + src_width = srcRect->Width();
|
| + src_height = srcRect->Height();
|
| + } else {
|
| + src_left = src_top = 0;
|
| + src_width = pBitmap->GetWidth();
|
| + src_height = pBitmap->GetHeight();
|
| + }
|
| + CGAffineTransform ctm = CGContextGetCTM(_context);
|
| + CGFloat scale_x = FXSYS_fabs(ctm.a);
|
| + CGFloat scale_y = FXSYS_fabs(ctm.d);
|
| + src_left /= scale_x;
|
| + src_top /= scale_y;
|
| + src_width /= scale_x;
|
| + src_height /= scale_y;
|
| + CGRect rect_fx = CGRectMake(dest_left, dest_top, src_width, src_height);
|
| + CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
|
| + CGContextBeginPath(_context);
|
| + CGContextAddRect(_context, rect_usr);
|
| + CGContextClip(_context);
|
| + rect_usr.size =
|
| + CGSizeMake(pBitmap->GetWidth() / scale_x, pBitmap->GetHeight() / scale_y);
|
| + rect_usr = CGRectOffset(rect_usr, -src_left, -src_top);
|
| + CG_SetImageTransform(dest_left, dest_top, src_width, src_height, &rect_usr);
|
| + CFX_DIBitmap* pBitmap1 = NULL;
|
| + if (pBitmap->IsAlphaMask()) {
|
| + if (pBitmap->GetBuffer()) {
|
| + pBitmap1 = (CFX_DIBitmap*)pBitmap;
|
| } else {
|
| - src_left = src_top = 0;
|
| - src_width = pBitmap->GetWidth();
|
| - src_height = pBitmap->GetHeight();
|
| - }
|
| - CGAffineTransform ctm = CGContextGetCTM(_context);
|
| - CGFloat scale_x = FXSYS_fabs(ctm.a);
|
| - CGFloat scale_y = FXSYS_fabs(ctm.d);
|
| - src_left /= scale_x;
|
| - src_top /= scale_y;
|
| - src_width /= scale_x;
|
| - src_height /= scale_y;
|
| - CGRect rect_fx = CGRectMake(dest_left, dest_top, src_width, src_height);
|
| - CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
|
| - CGContextBeginPath(_context);
|
| - CGContextAddRect(_context, rect_usr);
|
| - CGContextClip(_context);
|
| - rect_usr.size = CGSizeMake(pBitmap->GetWidth() / scale_x, pBitmap->GetHeight() / scale_y);
|
| - rect_usr = CGRectOffset(rect_usr, -src_left, -src_top);
|
| - CG_SetImageTransform(dest_left, dest_top, src_width, src_height, &rect_usr);
|
| - CFX_DIBitmap* pBitmap1 = NULL;
|
| - if (pBitmap->IsAlphaMask()) {
|
| - if (pBitmap->GetBuffer()) {
|
| - pBitmap1 = (CFX_DIBitmap*)pBitmap;
|
| - } else {
|
| - pBitmap1 = pBitmap->Clone();
|
| - }
|
| - if (NULL == pBitmap1) {
|
| - RestoreState(FALSE);
|
| - return FALSE;
|
| - }
|
| - CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
|
| - pBitmap1->GetBuffer(),
|
| - pBitmap1->GetPitch() * pBitmap1->GetHeight(),
|
| - NULL);
|
| - CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
|
| - CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
|
| - CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
|
| - pBitmap1->GetHeight(),
|
| - pBitmap1->GetBPP(),
|
| - pBitmap1->GetBPP(),
|
| - pBitmap1->GetPitch(),
|
| - pColorSpace,
|
| - bitmapInfo,
|
| - pBitmapProvider, NULL, true,
|
| - kCGRenderingIntentDefault);
|
| - CGContextClipToMask(_context, rect_usr, pImage);
|
| - CGContextSetRGBFillColor(_context,
|
| - FXARGB_R(argb) / 255.f,
|
| - FXARGB_G(argb) / 255.f,
|
| - FXARGB_B(argb) / 255.f,
|
| - FXARGB_A(argb) / 255.f);
|
| - CGContextFillRect(_context, rect_usr);
|
| - CGImageRelease(pImage);
|
| - CGColorSpaceRelease(pColorSpace);
|
| - CGDataProviderRelease(pBitmapProvider);
|
| - if (pBitmap1 != pBitmap) {
|
| - delete pBitmap1;
|
| - }
|
| - RestoreState(FALSE);
|
| - return TRUE;
|
| - }
|
| - if (pBitmap->GetBPP() < 32) {
|
| - pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
|
| - } else {
|
| - if (pBitmap->GetBuffer()) {
|
| - pBitmap1 = (CFX_DIBitmap*)pBitmap;
|
| - } else {
|
| - pBitmap1 = pBitmap->Clone();
|
| - }
|
| + pBitmap1 = pBitmap->Clone();
|
| }
|
| if (NULL == pBitmap1) {
|
| - RestoreState(FALSE);
|
| - return FALSE;
|
| - }
|
| - if (pBitmap1->HasAlpha()) {
|
| - if (pBitmap1 == pBitmap) {
|
| - pBitmap1 = pBitmap->Clone();
|
| - if (!pBitmap1) {
|
| - RestoreState(FALSE);
|
| - return FALSE;
|
| - }
|
| - }
|
| - for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
|
| - uint8_t* pScanline = (uint8_t*)pBitmap1->GetScanline(row);
|
| - for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
|
| - pScanline[0] = (uint8_t)(pScanline[0] * pScanline[3] / 255.f + .5f);
|
| - pScanline[1] = (uint8_t)(pScanline[1] * pScanline[3] / 255.f + .5f);
|
| - pScanline[2] = (uint8_t)(pScanline[2] * pScanline[3] / 255.f + .5f);
|
| - pScanline += 4;
|
| - }
|
| - }
|
| - }
|
| - CGContextRef ctx = createContextWithBitmap(pBitmap1);
|
| - CGImageRef image = CGBitmapContextCreateImage(ctx);
|
| - int blend_mode = blendType;
|
| - if (FXDIB_BLEND_HARDLIGHT == blendType) {
|
| - blend_mode = kCGBlendModeSoftLight;
|
| - } else if (FXDIB_BLEND_SOFTLIGHT == blendType) {
|
| - blend_mode = kCGBlendModeHardLight;
|
| - } else if (blendType >= FXDIB_BLEND_NONSEPARABLE && blendType <= FXDIB_BLEND_LUMINOSITY) {
|
| - blend_mode = blendType - 9;
|
| - } else if (blendType > FXDIB_BLEND_LUMINOSITY || blendType < 0) {
|
| - blend_mode = kCGBlendModeNormal;
|
| - }
|
| - CGContextSetBlendMode(_context, (CGBlendMode)blend_mode);
|
| - CGContextDrawImage(_context, rect_usr, image);
|
| - CGImageRelease(image);
|
| - CGContextRelease(ctx);
|
| + RestoreState(FALSE);
|
| + return FALSE;
|
| + }
|
| + CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(
|
| + NULL, pBitmap1->GetBuffer(),
|
| + pBitmap1->GetPitch() * pBitmap1->GetHeight(), NULL);
|
| + CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
|
| + CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
|
| + CGImageRef pImage = CGImageCreate(
|
| + pBitmap1->GetWidth(), pBitmap1->GetHeight(), pBitmap1->GetBPP(),
|
| + pBitmap1->GetBPP(), pBitmap1->GetPitch(), pColorSpace, bitmapInfo,
|
| + pBitmapProvider, NULL, true, kCGRenderingIntentDefault);
|
| + CGContextClipToMask(_context, rect_usr, pImage);
|
| + CGContextSetRGBFillColor(_context, FXARGB_R(argb) / 255.f,
|
| + FXARGB_G(argb) / 255.f, FXARGB_B(argb) / 255.f,
|
| + FXARGB_A(argb) / 255.f);
|
| + CGContextFillRect(_context, rect_usr);
|
| + CGImageRelease(pImage);
|
| + CGColorSpaceRelease(pColorSpace);
|
| + CGDataProviderRelease(pBitmapProvider);
|
| if (pBitmap1 != pBitmap) {
|
| - delete pBitmap1;
|
| + delete pBitmap1;
|
| }
|
| RestoreState(FALSE);
|
| return TRUE;
|
| -}
|
| -FX_BOOL CFX_QuartzDeviceDriver::StretchDIBits(const CFX_DIBSource* pBitmap,
|
| - FX_ARGB argb,
|
| - int dest_left,
|
| - int dest_top,
|
| - int dest_width,
|
| - int dest_height,
|
| - const FX_RECT* clipRect,
|
| - FX_DWORD flags,
|
| - int alphaFlag ,
|
| - void* iccTransform ,
|
| - int blend_type)
|
| -{
|
| - SaveState();
|
| - if (clipRect) {
|
| - CGContextBeginPath(_context);
|
| - CGRect rect_clip = CGRectMake(clipRect->left, clipRect->top, clipRect->Width(), clipRect->Height());
|
| - rect_clip = CGRectApplyAffineTransform(rect_clip, _foxitDevice2User);
|
| - CGContextAddRect(_context, rect_clip);
|
| - CGContextClip(_context);
|
| - }
|
| - CGRect rect = CGRectMake(dest_left, dest_top, dest_width, dest_height);
|
| - rect = CGRectApplyAffineTransform(rect, _foxitDevice2User);
|
| - if (FXDIB_BICUBIC_INTERPOL == flags) {
|
| - CGContextSetInterpolationQuality(_context, kCGInterpolationHigh);
|
| - } else if (FXDIB_DOWNSAMPLE == flags) {
|
| - CGContextSetInterpolationQuality(_context, kCGInterpolationNone);
|
| + }
|
| + if (pBitmap->GetBPP() < 32) {
|
| + pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
|
| + } else {
|
| + if (pBitmap->GetBuffer()) {
|
| + pBitmap1 = (CFX_DIBitmap*)pBitmap;
|
| } else {
|
| - CGContextSetInterpolationQuality(_context, kCGInterpolationMedium);
|
| + pBitmap1 = pBitmap->Clone();
|
| }
|
| - CG_SetImageTransform(dest_left, dest_top, dest_width, dest_height);
|
| - CFX_DIBitmap* pBitmap1 = NULL;
|
| - if (pBitmap->IsAlphaMask()) {
|
| - if (pBitmap->GetBuffer()) {
|
| - pBitmap1 = (CFX_DIBitmap*)pBitmap;
|
| - } else {
|
| - pBitmap1 = pBitmap->Clone();
|
| - }
|
| - if (NULL == pBitmap1) {
|
| - RestoreState(FALSE);
|
| - return FALSE;
|
| - }
|
| - CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
|
| - pBitmap1->GetBuffer(),
|
| - pBitmap1->GetPitch() * pBitmap1->GetHeight(),
|
| - NULL);
|
| - CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
|
| - CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
|
| - CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
|
| - pBitmap1->GetHeight(),
|
| - pBitmap1->GetBPP(),
|
| - pBitmap1->GetBPP(),
|
| - pBitmap1->GetPitch(),
|
| - pColorSpace,
|
| - bitmapInfo,
|
| - pBitmapProvider, NULL, true,
|
| - kCGRenderingIntentDefault);
|
| - CGContextClipToMask(_context, rect, pImage);
|
| - CGContextSetRGBFillColor(_context,
|
| - FXARGB_R(argb) / 255.f,
|
| - FXARGB_G(argb) / 255.f,
|
| - FXARGB_B(argb) / 255.f,
|
| - FXARGB_A(argb) / 255.f);
|
| - CGContextFillRect(_context, rect);
|
| - CGImageRelease(pImage);
|
| - CGColorSpaceRelease(pColorSpace);
|
| - CGDataProviderRelease(pBitmapProvider);
|
| - if (pBitmap1 != pBitmap) {
|
| - delete pBitmap1;
|
| - }
|
| + }
|
| + if (NULL == pBitmap1) {
|
| + RestoreState(FALSE);
|
| + return FALSE;
|
| + }
|
| + if (pBitmap1->HasAlpha()) {
|
| + if (pBitmap1 == pBitmap) {
|
| + pBitmap1 = pBitmap->Clone();
|
| + if (!pBitmap1) {
|
| RestoreState(FALSE);
|
| - return TRUE;
|
| - }
|
| - if (pBitmap->GetBPP() < 32) {
|
| - pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
|
| + return FALSE;
|
| + }
|
| + }
|
| + for (int row = 0; row < pBitmap1->GetHeight(); row++) {
|
| + uint8_t* pScanline = (uint8_t*)pBitmap1->GetScanline(row);
|
| + for (int col = 0; col < pBitmap1->GetWidth(); col++) {
|
| + pScanline[0] = (uint8_t)(pScanline[0] * pScanline[3] / 255.f + .5f);
|
| + pScanline[1] = (uint8_t)(pScanline[1] * pScanline[3] / 255.f + .5f);
|
| + pScanline[2] = (uint8_t)(pScanline[2] * pScanline[3] / 255.f + .5f);
|
| + pScanline += 4;
|
| + }
|
| + }
|
| + }
|
| + CGContextRef ctx = createContextWithBitmap(pBitmap1);
|
| + CGImageRef image = CGBitmapContextCreateImage(ctx);
|
| + int blend_mode = blendType;
|
| + if (FXDIB_BLEND_HARDLIGHT == blendType) {
|
| + blend_mode = kCGBlendModeSoftLight;
|
| + } else if (FXDIB_BLEND_SOFTLIGHT == blendType) {
|
| + blend_mode = kCGBlendModeHardLight;
|
| + } else if (blendType >= FXDIB_BLEND_NONSEPARABLE &&
|
| + blendType <= FXDIB_BLEND_LUMINOSITY) {
|
| + blend_mode = blendType - 9;
|
| + } else if (blendType > FXDIB_BLEND_LUMINOSITY || blendType < 0) {
|
| + blend_mode = kCGBlendModeNormal;
|
| + }
|
| + CGContextSetBlendMode(_context, (CGBlendMode)blend_mode);
|
| + CGContextDrawImage(_context, rect_usr, image);
|
| + CGImageRelease(image);
|
| + CGContextRelease(ctx);
|
| + if (pBitmap1 != pBitmap) {
|
| + delete pBitmap1;
|
| + }
|
| + RestoreState(FALSE);
|
| + return TRUE;
|
| +}
|
| +FX_BOOL CFX_QuartzDeviceDriver::StretchDIBits(const CFX_DIBSource* pBitmap,
|
| + FX_ARGB argb,
|
| + int dest_left,
|
| + int dest_top,
|
| + int dest_width,
|
| + int dest_height,
|
| + const FX_RECT* clipRect,
|
| + FX_DWORD flags,
|
| + int alphaFlag,
|
| + void* iccTransform,
|
| + int blend_type) {
|
| + SaveState();
|
| + if (clipRect) {
|
| + CGContextBeginPath(_context);
|
| + CGRect rect_clip = CGRectMake(clipRect->left, clipRect->top,
|
| + clipRect->Width(), clipRect->Height());
|
| + rect_clip = CGRectApplyAffineTransform(rect_clip, _foxitDevice2User);
|
| + CGContextAddRect(_context, rect_clip);
|
| + CGContextClip(_context);
|
| + }
|
| + CGRect rect = CGRectMake(dest_left, dest_top, dest_width, dest_height);
|
| + rect = CGRectApplyAffineTransform(rect, _foxitDevice2User);
|
| + if (FXDIB_BICUBIC_INTERPOL == flags) {
|
| + CGContextSetInterpolationQuality(_context, kCGInterpolationHigh);
|
| + } else if (FXDIB_DOWNSAMPLE == flags) {
|
| + CGContextSetInterpolationQuality(_context, kCGInterpolationNone);
|
| + } else {
|
| + CGContextSetInterpolationQuality(_context, kCGInterpolationMedium);
|
| + }
|
| + CG_SetImageTransform(dest_left, dest_top, dest_width, dest_height);
|
| + CFX_DIBitmap* pBitmap1 = NULL;
|
| + if (pBitmap->IsAlphaMask()) {
|
| + if (pBitmap->GetBuffer()) {
|
| + pBitmap1 = (CFX_DIBitmap*)pBitmap;
|
| } else {
|
| - if (pBitmap->GetBuffer()) {
|
| - pBitmap1 = (CFX_DIBitmap*)pBitmap;
|
| - } else {
|
| - pBitmap1 = pBitmap->Clone();
|
| - }
|
| + pBitmap1 = pBitmap->Clone();
|
| }
|
| if (NULL == pBitmap1) {
|
| - RestoreState(FALSE);
|
| - return FALSE;
|
| - }
|
| - if (pBitmap1->HasAlpha()) {
|
| - if (pBitmap1 == pBitmap) {
|
| - pBitmap1 = pBitmap->Clone();
|
| - if (!pBitmap1) {
|
| - RestoreState(FALSE);
|
| - return FALSE;
|
| - }
|
| - }
|
| - for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
|
| - uint8_t* pScanline = (uint8_t*)pBitmap1->GetScanline(row);
|
| - for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
|
| - pScanline[0] = (uint8_t)(pScanline[0] * pScanline[3] / 255.f + .5f);
|
| - pScanline[1] = (uint8_t)(pScanline[1] * pScanline[3] / 255.f + .5f);
|
| - pScanline[2] = (uint8_t)(pScanline[2] * pScanline[3] / 255.f + .5f);
|
| - pScanline += 4;
|
| - }
|
| - }
|
| - }
|
| - CGContextRef ctx = createContextWithBitmap(pBitmap1);
|
| - CGImageRef image = CGBitmapContextCreateImage(ctx);
|
| - CGContextDrawImage(_context, rect, image);
|
| - CGImageRelease(image);
|
| - CGContextRelease(ctx);
|
| + RestoreState(FALSE);
|
| + return FALSE;
|
| + }
|
| + CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(
|
| + NULL, pBitmap1->GetBuffer(),
|
| + pBitmap1->GetPitch() * pBitmap1->GetHeight(), NULL);
|
| + CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
|
| + CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
|
| + CGImageRef pImage = CGImageCreate(
|
| + pBitmap1->GetWidth(), pBitmap1->GetHeight(), pBitmap1->GetBPP(),
|
| + pBitmap1->GetBPP(), pBitmap1->GetPitch(), pColorSpace, bitmapInfo,
|
| + pBitmapProvider, NULL, true, kCGRenderingIntentDefault);
|
| + CGContextClipToMask(_context, rect, pImage);
|
| + CGContextSetRGBFillColor(_context, FXARGB_R(argb) / 255.f,
|
| + FXARGB_G(argb) / 255.f, FXARGB_B(argb) / 255.f,
|
| + FXARGB_A(argb) / 255.f);
|
| + CGContextFillRect(_context, rect);
|
| + CGImageRelease(pImage);
|
| + CGColorSpaceRelease(pColorSpace);
|
| + CGDataProviderRelease(pBitmapProvider);
|
| if (pBitmap1 != pBitmap) {
|
| - delete pBitmap1;
|
| + delete pBitmap1;
|
| }
|
| RestoreState(FALSE);
|
| return TRUE;
|
| -}
|
| -FX_BOOL CFX_QuartzDeviceDriver::CG_DrawGlypRun(int nChars,
|
| - const FXTEXT_CHARPOS* pCharPos,
|
| - CFX_Font* pFont,
|
| - CFX_FontCache* pCache,
|
| - const CFX_AffineMatrix* pGlyphMatrix,
|
| - const CFX_AffineMatrix* pObject2Device,
|
| - FX_FLOAT font_size,
|
| - FX_DWORD argb,
|
| - int alpha_flag,
|
| - void* pIccTransform)
|
| -{
|
| - if (nChars == 0) {
|
| - return TRUE;
|
| - }
|
| - CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
|
| - if (!pFont->m_pPlatformFont) {
|
| - if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
|
| - return FALSE;
|
| - }
|
| - pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
|
| - if (NULL == pFont->m_pPlatformFont) {
|
| - return FALSE;
|
| - }
|
| - }
|
| - CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
|
| - CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
|
| - for (int i = 0; i < nChars; i++ ) {
|
| - glyph_indices[i] = pCharPos[i].m_ExtGID;
|
| - glyph_positions[i].x = pCharPos[i].m_OriginX;
|
| - glyph_positions[i].y = pCharPos[i].m_OriginY;
|
| - }
|
| - CFX_AffineMatrix text_matrix;
|
| - if (pObject2Device) {
|
| - text_matrix.Concat(*pObject2Device);
|
| - }
|
| - CGAffineTransform matrix_cg = CGAffineTransformMake(text_matrix.a,
|
| - text_matrix.b,
|
| - text_matrix.c,
|
| - text_matrix.d,
|
| - text_matrix.e,
|
| - text_matrix.f);
|
| - matrix_cg = CGAffineTransformConcat(matrix_cg, _foxitDevice2User);
|
| - CGContextSetTextMatrix(_context, matrix_cg);
|
| - CGContextSetFont(_context, (CGFontRef)pFont->m_pPlatformFont);
|
| - CGContextSetFontSize(_context, FXSYS_fabs(font_size));
|
| - int32_t a, r, g, b;
|
| - ArgbDecode(argb, a, r, g, b);
|
| - CGContextSetRGBFillColor(_context,
|
| - r / 255.f,
|
| - g / 255.f,
|
| - b / 255.f,
|
| - a / 255.f);
|
| - SaveState();
|
| - if (pGlyphMatrix) {
|
| - CGPoint origin = CGPointMake( glyph_positions[0].x, glyph_positions[0].y);
|
| - origin = CGPointApplyAffineTransform(origin, matrix_cg);
|
| - CGContextTranslateCTM(_context, origin.x, origin.y);
|
| - CGAffineTransform glyph_matrix = CGAffineTransformMake(pGlyphMatrix->a,
|
| - pGlyphMatrix->b,
|
| - pGlyphMatrix->c,
|
| - pGlyphMatrix->d,
|
| - pGlyphMatrix->e,
|
| - pGlyphMatrix->f);
|
| - if (_foxitDevice2User.d < 0) {
|
| - glyph_matrix = CGAffineTransformInvert(glyph_matrix);
|
| - }
|
| - CGContextConcatCTM(_context, glyph_matrix);
|
| - CGContextTranslateCTM(_context, -origin.x, -origin.y);
|
| + }
|
| + if (pBitmap->GetBPP() < 32) {
|
| + pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
|
| + } else {
|
| + if (pBitmap->GetBuffer()) {
|
| + pBitmap1 = (CFX_DIBitmap*)pBitmap;
|
| + } else {
|
| + pBitmap1 = pBitmap->Clone();
|
| }
|
| - CGContextShowGlyphsAtPositions(_context,
|
| - (CGGlyph*)glyph_indices,
|
| - glyph_positions,
|
| - nChars);
|
| + }
|
| + if (NULL == pBitmap1) {
|
| RestoreState(FALSE);
|
| + return FALSE;
|
| + }
|
| + if (pBitmap1->HasAlpha()) {
|
| + if (pBitmap1 == pBitmap) {
|
| + pBitmap1 = pBitmap->Clone();
|
| + if (!pBitmap1) {
|
| + RestoreState(FALSE);
|
| + return FALSE;
|
| + }
|
| + }
|
| + for (int row = 0; row < pBitmap1->GetHeight(); row++) {
|
| + uint8_t* pScanline = (uint8_t*)pBitmap1->GetScanline(row);
|
| + for (int col = 0; col < pBitmap1->GetWidth(); col++) {
|
| + pScanline[0] = (uint8_t)(pScanline[0] * pScanline[3] / 255.f + .5f);
|
| + pScanline[1] = (uint8_t)(pScanline[1] * pScanline[3] / 255.f + .5f);
|
| + pScanline[2] = (uint8_t)(pScanline[2] * pScanline[3] / 255.f + .5f);
|
| + pScanline += 4;
|
| + }
|
| + }
|
| + }
|
| + CGContextRef ctx = createContextWithBitmap(pBitmap1);
|
| + CGImageRef image = CGBitmapContextCreateImage(ctx);
|
| + CGContextDrawImage(_context, rect, image);
|
| + CGImageRelease(image);
|
| + CGContextRelease(ctx);
|
| + if (pBitmap1 != pBitmap) {
|
| + delete pBitmap1;
|
| + }
|
| + RestoreState(FALSE);
|
| + return TRUE;
|
| +}
|
| +FX_BOOL CFX_QuartzDeviceDriver::CG_DrawGlypRun(
|
| + int nChars,
|
| + const FXTEXT_CHARPOS* pCharPos,
|
| + CFX_Font* pFont,
|
| + CFX_FontCache* pCache,
|
| + const CFX_AffineMatrix* pGlyphMatrix,
|
| + const CFX_AffineMatrix* pObject2Device,
|
| + FX_FLOAT font_size,
|
| + FX_DWORD argb,
|
| + int alpha_flag,
|
| + void* pIccTransform) {
|
| + if (nChars == 0) {
|
| return TRUE;
|
| + }
|
| + CQuartz2D& quartz2d =
|
| + ((CApplePlatform*)CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
|
| + if (!pFont->m_pPlatformFont) {
|
| + if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
|
| + return FALSE;
|
| + }
|
| + pFont->m_pPlatformFont =
|
| + quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
|
| + if (NULL == pFont->m_pPlatformFont) {
|
| + return FALSE;
|
| + }
|
| + }
|
| + CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
|
| + CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
|
| + for (int i = 0; i < nChars; i++) {
|
| + glyph_indices[i] = pCharPos[i].m_ExtGID;
|
| + glyph_positions[i].x = pCharPos[i].m_OriginX;
|
| + glyph_positions[i].y = pCharPos[i].m_OriginY;
|
| + }
|
| + CFX_AffineMatrix text_matrix;
|
| + if (pObject2Device) {
|
| + text_matrix.Concat(*pObject2Device);
|
| + }
|
| + CGAffineTransform matrix_cg =
|
| + CGAffineTransformMake(text_matrix.a, text_matrix.b, text_matrix.c,
|
| + text_matrix.d, text_matrix.e, text_matrix.f);
|
| + matrix_cg = CGAffineTransformConcat(matrix_cg, _foxitDevice2User);
|
| + CGContextSetTextMatrix(_context, matrix_cg);
|
| + CGContextSetFont(_context, (CGFontRef)pFont->m_pPlatformFont);
|
| + CGContextSetFontSize(_context, FXSYS_fabs(font_size));
|
| + int32_t a, r, g, b;
|
| + ArgbDecode(argb, a, r, g, b);
|
| + CGContextSetRGBFillColor(_context, r / 255.f, g / 255.f, b / 255.f,
|
| + a / 255.f);
|
| + SaveState();
|
| + if (pGlyphMatrix) {
|
| + CGPoint origin = CGPointMake(glyph_positions[0].x, glyph_positions[0].y);
|
| + origin = CGPointApplyAffineTransform(origin, matrix_cg);
|
| + CGContextTranslateCTM(_context, origin.x, origin.y);
|
| + CGAffineTransform glyph_matrix = CGAffineTransformMake(
|
| + pGlyphMatrix->a, pGlyphMatrix->b, pGlyphMatrix->c, pGlyphMatrix->d,
|
| + pGlyphMatrix->e, pGlyphMatrix->f);
|
| + if (_foxitDevice2User.d < 0) {
|
| + glyph_matrix = CGAffineTransformInvert(glyph_matrix);
|
| + }
|
| + CGContextConcatCTM(_context, glyph_matrix);
|
| + CGContextTranslateCTM(_context, -origin.x, -origin.y);
|
| + }
|
| + CGContextShowGlyphsAtPositions(_context, (CGGlyph*)glyph_indices,
|
| + glyph_positions, nChars);
|
| + RestoreState(FALSE);
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDeviceDriver::DrawDeviceText(int nChars,
|
| - const FXTEXT_CHARPOS* pCharPos,
|
| - CFX_Font* pFont,
|
| - CFX_FontCache* pCache,
|
| - const CFX_AffineMatrix* pObject2Device,
|
| - FX_FLOAT font_size,
|
| - FX_DWORD color,
|
| - int alpha_flag ,
|
| - void* pIccTransform)
|
| -{
|
| - if (NULL == pFont || NULL == _context) {
|
| - return FALSE;
|
| - }
|
| - FX_BOOL bBold = pFont->IsBold();
|
| - if (!bBold && pFont->GetSubstFont() &&
|
| - pFont->GetSubstFont()->m_Weight >= 500 &&
|
| - pFont->GetSubstFont()->m_Weight <= 600) {
|
| - return FALSE;
|
| - }
|
| - SaveState();
|
| - CGContextSetTextDrawingMode(_context, kCGTextFillClip);
|
| - FX_BOOL ret = FALSE;
|
| - int32_t i = 0;
|
| - while (i < nChars) {
|
| - if (pCharPos[i].m_bGlyphAdjust || font_size < 0) {
|
| - if (i > 0) {
|
| - ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
|
| - if (!ret) {
|
| - RestoreState(FALSE);
|
| - return ret;
|
| - }
|
| - }
|
| - const FXTEXT_CHARPOS* char_pos = pCharPos + i;
|
| - CFX_AffineMatrix glphy_matrix;
|
| - if (font_size < 0) {
|
| - glphy_matrix.Concat(-1, 0, 0, -1, 0, 0);
|
| - }
|
| - if (char_pos->m_bGlyphAdjust) {
|
| - glphy_matrix.Concat(char_pos->m_AdjustMatrix[0],
|
| - char_pos->m_AdjustMatrix[1],
|
| - char_pos->m_AdjustMatrix[2],
|
| - char_pos->m_AdjustMatrix[3], 0, 0);
|
| - }
|
| - ret = CG_DrawGlypRun(1, char_pos, pFont, pCache, &glphy_matrix, pObject2Device, font_size, color, alpha_flag, pIccTransform);
|
| - if (!ret) {
|
| - RestoreState(FALSE);
|
| - return ret;
|
| - }
|
| - i ++;
|
| - pCharPos += i;
|
| - nChars -= i;
|
| - i = 0;
|
| - } else {
|
| - i ++;
|
| +FX_BOOL CFX_QuartzDeviceDriver::DrawDeviceText(
|
| + int nChars,
|
| + const FXTEXT_CHARPOS* pCharPos,
|
| + CFX_Font* pFont,
|
| + CFX_FontCache* pCache,
|
| + const CFX_AffineMatrix* pObject2Device,
|
| + FX_FLOAT font_size,
|
| + FX_DWORD color,
|
| + int alpha_flag,
|
| + void* pIccTransform) {
|
| + if (NULL == pFont || NULL == _context) {
|
| + return FALSE;
|
| + }
|
| + FX_BOOL bBold = pFont->IsBold();
|
| + if (!bBold && pFont->GetSubstFont() &&
|
| + pFont->GetSubstFont()->m_Weight >= 500 &&
|
| + pFont->GetSubstFont()->m_Weight <= 600) {
|
| + return FALSE;
|
| + }
|
| + SaveState();
|
| + CGContextSetTextDrawingMode(_context, kCGTextFillClip);
|
| + FX_BOOL ret = FALSE;
|
| + int32_t i = 0;
|
| + while (i < nChars) {
|
| + if (pCharPos[i].m_bGlyphAdjust || font_size < 0) {
|
| + if (i > 0) {
|
| + ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device,
|
| + font_size, color, alpha_flag, pIccTransform);
|
| + if (!ret) {
|
| + RestoreState(FALSE);
|
| + return ret;
|
| }
|
| - }
|
| - if (i > 0) {
|
| - ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
|
| - }
|
| - RestoreState(FALSE);
|
| - return ret;
|
| + }
|
| + const FXTEXT_CHARPOS* char_pos = pCharPos + i;
|
| + CFX_AffineMatrix glphy_matrix;
|
| + if (font_size < 0) {
|
| + glphy_matrix.Concat(-1, 0, 0, -1, 0, 0);
|
| + }
|
| + if (char_pos->m_bGlyphAdjust) {
|
| + glphy_matrix.Concat(
|
| + char_pos->m_AdjustMatrix[0], char_pos->m_AdjustMatrix[1],
|
| + char_pos->m_AdjustMatrix[2], char_pos->m_AdjustMatrix[3], 0, 0);
|
| + }
|
| + ret = CG_DrawGlypRun(1, char_pos, pFont, pCache, &glphy_matrix,
|
| + pObject2Device, font_size, color, alpha_flag,
|
| + pIccTransform);
|
| + if (!ret) {
|
| + RestoreState(FALSE);
|
| + return ret;
|
| + }
|
| + i++;
|
| + pCharPos += i;
|
| + nChars -= i;
|
| + i = 0;
|
| + } else {
|
| + i++;
|
| + }
|
| + }
|
| + if (i > 0) {
|
| + ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device,
|
| + font_size, color, alpha_flag, pIccTransform);
|
| + }
|
| + RestoreState(FALSE);
|
| + return ret;
|
| }
|
| -void CFX_QuartzDeviceDriver::setStrokeInfo(const CFX_GraphStateData* graphState, FX_ARGB argb, FX_FLOAT lineWidth)
|
| -{
|
| - if (NULL == graphState) {
|
| - return;
|
| - }
|
| - CGContextSetLineWidth(_context, lineWidth);
|
| - CGLineCap cap;
|
| - switch (graphState->m_LineCap) {
|
| - case CFX_GraphStateData::LineCapRound: {
|
| - cap = kCGLineCapRound;
|
| - break;
|
| - }
|
| - case CFX_GraphStateData::LineCapSquare: {
|
| - cap = kCGLineCapSquare;
|
| - break;
|
| - }
|
| - case CFX_GraphStateData::LineCapButt:
|
| - default: {
|
| - cap = kCGLineCapButt;
|
| - }
|
| +void CFX_QuartzDeviceDriver::setStrokeInfo(const CFX_GraphStateData* graphState,
|
| + FX_ARGB argb,
|
| + FX_FLOAT lineWidth) {
|
| + if (NULL == graphState) {
|
| + return;
|
| + }
|
| + CGContextSetLineWidth(_context, lineWidth);
|
| + CGLineCap cap;
|
| + switch (graphState->m_LineCap) {
|
| + case CFX_GraphStateData::LineCapRound: {
|
| + cap = kCGLineCapRound;
|
| + break;
|
| + }
|
| + case CFX_GraphStateData::LineCapSquare: {
|
| + cap = kCGLineCapSquare;
|
| + break;
|
| + }
|
| + case CFX_GraphStateData::LineCapButt:
|
| + default: { cap = kCGLineCapButt; }
|
| + }
|
| + CGContextSetLineCap(_context, cap);
|
| + CGLineJoin join;
|
| + switch (graphState->m_LineJoin) {
|
| + case CFX_GraphStateData::LineJoinRound: {
|
| + join = kCGLineJoinRound;
|
| + break;
|
| + }
|
| + case CFX_GraphStateData::LineJoinBevel: {
|
| + join = kCGLineJoinBevel;
|
| + break;
|
| + }
|
| + case CFX_GraphStateData::LineJoinMiter:
|
| + default: { join = kCGLineJoinMiter; }
|
| + }
|
| + CGContextSetLineJoin(_context, join);
|
| + if (graphState->m_DashCount) {
|
| +#if CGFLOAT_IS_DOUBLE
|
| + CGFloat* dashArray = new CGFloat[graphState->m_DashCount];
|
| + if (!dashArray) {
|
| + return;
|
| }
|
| - CGContextSetLineCap(_context, cap);
|
| - CGLineJoin join;
|
| - switch (graphState->m_LineJoin) {
|
| - case CFX_GraphStateData::LineJoinRound: {
|
| - join = kCGLineJoinRound;
|
| - break;
|
| - }
|
| - case CFX_GraphStateData::LineJoinBevel: {
|
| - join = kCGLineJoinBevel;
|
| - break;
|
| - }
|
| - case CFX_GraphStateData::LineJoinMiter:
|
| - default: {
|
| - join = kCGLineJoinMiter;
|
| - }
|
| + for (int index = 0; index < graphState->m_DashCount; ++index) {
|
| + dashArray[index] = graphState->m_DashArray[index];
|
| }
|
| - CGContextSetLineJoin(_context, join);
|
| - if (graphState->m_DashCount) {
|
| -#if CGFLOAT_IS_DOUBLE
|
| - CGFloat* dashArray = new CGFloat[graphState->m_DashCount];
|
| - if (!dashArray) {
|
| - return;
|
| - }
|
| - for (int index = 0; index < graphState->m_DashCount; ++index) {
|
| - dashArray[index] = graphState->m_DashArray[index];
|
| - }
|
| #else
|
| - CGFloat* dashArray = (CGFloat*)graphState->m_DashArray;
|
| + CGFloat* dashArray = (CGFloat*)graphState->m_DashArray;
|
| #endif
|
| - CGContextSetLineDash(_context, graphState->m_DashPhase, dashArray, graphState->m_DashCount);
|
| + CGContextSetLineDash(_context, graphState->m_DashPhase, dashArray,
|
| + graphState->m_DashCount);
|
| #if CGFLOAT_IS_DOUBLE
|
| - delete[] dashArray;
|
| + delete[] dashArray;
|
| #endif
|
| - }
|
| - int32_t a, r, g, b;
|
| - ArgbDecode(argb, a, r, g, b);
|
| - CGContextSetRGBStrokeColor(_context,
|
| - r / 255.f,
|
| - g / 255.f,
|
| - b / 255.f,
|
| - a / 255.f);
|
| -}
|
| -void CFX_QuartzDeviceDriver::setFillInfo(FX_ARGB argb)
|
| -{
|
| - int32_t a, r, g, b;
|
| - ArgbDecode(argb, a, r, g, b);
|
| - CGContextSetRGBFillColor(_context,
|
| - r / 255.f,
|
| - g / 255.f,
|
| - b / 255.f,
|
| + }
|
| + int32_t a, r, g, b;
|
| + ArgbDecode(argb, a, r, g, b);
|
| + CGContextSetRGBStrokeColor(_context, r / 255.f, g / 255.f, b / 255.f,
|
| a / 255.f);
|
| }
|
| -void CFX_QuartzDeviceDriver::setPathToContext(const CFX_PathData* pathData)
|
| -{
|
| - int32_t count = pathData->GetPointCount();
|
| - FX_PATHPOINT* points = pathData->GetPoints();
|
| - CGContextBeginPath(_context);
|
| - for (int32_t i = 0; i < count; i ++) {
|
| - switch (points[i].m_Flag & FXPT_TYPE) {
|
| - case FXPT_MOVETO:
|
| - CGContextMoveToPoint(_context, points[i].m_PointX, points[i].m_PointY);
|
| - break;
|
| - case FXPT_LINETO:
|
| - CGContextAddLineToPoint(_context, points[i].m_PointX, points[i].m_PointY);
|
| - break;
|
| - case FXPT_BEZIERTO: {
|
| - CGContextAddCurveToPoint(_context,
|
| - points[i].m_PointX, points[i].m_PointY,
|
| - points[i + 1].m_PointX, points[i + 1].m_PointY,
|
| - points[i + 2].m_PointX, points[i + 2].m_PointY);
|
| - i += 2;
|
| - }
|
| - }
|
| - if (points[i].m_Flag & FXPT_CLOSEFIGURE) {
|
| - CGContextClosePath(_context);
|
| - }
|
| - }
|
| +void CFX_QuartzDeviceDriver::setFillInfo(FX_ARGB argb) {
|
| + int32_t a, r, g, b;
|
| + ArgbDecode(argb, a, r, g, b);
|
| + CGContextSetRGBFillColor(_context, r / 255.f, g / 255.f, b / 255.f,
|
| + a / 255.f);
|
| }
|
| -void CFX_QuartzDeviceDriver::CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height,
|
| - CGRect* rect )
|
| -{
|
| - int flip_y = _foxitDevice2User.d * dest_height < 0 ? 1 : -1;
|
| - int flip_x = _foxitDevice2User.a * dest_width > 0 ? 1 : -1;
|
| - if (flip_y < 0 || flip_x < 0) {
|
| - if (dest_height < 0) {
|
| - dest_height = -dest_height;
|
| - dest_top -= dest_height;
|
| - }
|
| - CGRect rt = CGRectApplyAffineTransform(CGRectMake(dest_left, dest_top, dest_width, dest_height), _foxitDevice2User);
|
| - CGFloat offset_x = (rt.origin.x) + rt.size.width / 2.f,
|
| - offset_y = (rt.origin.y) + rt.size.height / 2.f;
|
| - CGAffineTransform transform = CGAffineTransformIdentity;
|
| - transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, -offset_x, -offset_y));
|
| - transform = CGAffineTransformConcat(transform, CGAffineTransformMake(flip_x, 0, 0, flip_y, 0, 0));
|
| - transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, offset_x, offset_y));
|
| - CGContextConcatCTM(_context, transform);
|
| - if (rect) {
|
| - *rect = CGRectApplyAffineTransform(*rect, transform);
|
| - }
|
| - }
|
| +void CFX_QuartzDeviceDriver::setPathToContext(const CFX_PathData* pathData) {
|
| + int32_t count = pathData->GetPointCount();
|
| + FX_PATHPOINT* points = pathData->GetPoints();
|
| + CGContextBeginPath(_context);
|
| + for (int32_t i = 0; i < count; i++) {
|
| + switch (points[i].m_Flag & FXPT_TYPE) {
|
| + case FXPT_MOVETO:
|
| + CGContextMoveToPoint(_context, points[i].m_PointX, points[i].m_PointY);
|
| + break;
|
| + case FXPT_LINETO:
|
| + CGContextAddLineToPoint(_context, points[i].m_PointX,
|
| + points[i].m_PointY);
|
| + break;
|
| + case FXPT_BEZIERTO: {
|
| + CGContextAddCurveToPoint(_context, points[i].m_PointX,
|
| + points[i].m_PointY, points[i + 1].m_PointX,
|
| + points[i + 1].m_PointY, points[i + 2].m_PointX,
|
| + points[i + 2].m_PointY);
|
| + i += 2;
|
| + }
|
| + }
|
| + if (points[i].m_Flag & FXPT_CLOSEFIGURE) {
|
| + CGContextClosePath(_context);
|
| + }
|
| + }
|
| }
|
| -void CFX_QuartzDeviceDriver::ClearDriver()
|
| -{
|
| - if (NULL == _context) {
|
| - return;
|
| - }
|
| - for (int i = 0; i < m_saveCount; ++i) {
|
| - CGContextRestoreGState(_context);
|
| - }
|
| - m_saveCount = 0;
|
| - if (_context) {
|
| - CGContextRelease(_context);
|
| - }
|
| +void CFX_QuartzDeviceDriver::CG_SetImageTransform(int dest_left,
|
| + int dest_top,
|
| + int dest_width,
|
| + int dest_height,
|
| + CGRect* rect) {
|
| + int flip_y = _foxitDevice2User.d * dest_height < 0 ? 1 : -1;
|
| + int flip_x = _foxitDevice2User.a * dest_width > 0 ? 1 : -1;
|
| + if (flip_y < 0 || flip_x < 0) {
|
| + if (dest_height < 0) {
|
| + dest_height = -dest_height;
|
| + dest_top -= dest_height;
|
| + }
|
| + CGRect rt = CGRectApplyAffineTransform(
|
| + CGRectMake(dest_left, dest_top, dest_width, dest_height),
|
| + _foxitDevice2User);
|
| + CGFloat offset_x = (rt.origin.x) + rt.size.width / 2.f,
|
| + offset_y = (rt.origin.y) + rt.size.height / 2.f;
|
| + CGAffineTransform transform = CGAffineTransformIdentity;
|
| + transform = CGAffineTransformConcat(
|
| + transform, CGAffineTransformMake(1, 0, 0, 1, -offset_x, -offset_y));
|
| + transform = CGAffineTransformConcat(
|
| + transform, CGAffineTransformMake(flip_x, 0, 0, flip_y, 0, 0));
|
| + transform = CGAffineTransformConcat(
|
| + transform, CGAffineTransformMake(1, 0, 0, 1, offset_x, offset_y));
|
| + CGContextConcatCTM(_context, transform);
|
| + if (rect) {
|
| + *rect = CGRectApplyAffineTransform(*rect, transform);
|
| + }
|
| + }
|
| }
|
| -CFX_QuartzDevice::CFX_QuartzDevice()
|
| -{
|
| - m_bOwnedBitmap = FALSE;
|
| - m_pContext = NULL;
|
| +void CFX_QuartzDeviceDriver::ClearDriver() {
|
| + if (NULL == _context) {
|
| + return;
|
| + }
|
| + for (int i = 0; i < m_saveCount; ++i) {
|
| + CGContextRestoreGState(_context);
|
| + }
|
| + m_saveCount = 0;
|
| + if (_context) {
|
| + CGContextRelease(_context);
|
| + }
|
| }
|
| -CFX_QuartzDevice::~CFX_QuartzDevice()
|
| -{
|
| - if (m_pContext) {
|
| - CGContextRelease(m_pContext);
|
| - }
|
| - if (m_bOwnedBitmap) {
|
| - delete GetBitmap();
|
| - }
|
| +CFX_QuartzDevice::CFX_QuartzDevice() {
|
| + m_bOwnedBitmap = FALSE;
|
| + m_pContext = NULL;
|
| }
|
| -CGContextRef CFX_QuartzDevice::GetContext()
|
| -{
|
| - return m_pContext;
|
| +CFX_QuartzDevice::~CFX_QuartzDevice() {
|
| + if (m_pContext) {
|
| + CGContextRelease(m_pContext);
|
| + }
|
| + if (m_bOwnedBitmap) {
|
| + delete GetBitmap();
|
| + }
|
| }
|
| -FX_BOOL CFX_QuartzDevice::Attach(CGContextRef context, int32_t nDeviceClass)
|
| -{
|
| - if (m_pContext) {
|
| - CGContextRelease(m_pContext);
|
| - }
|
| - m_pContext = context;
|
| - CGContextRetain(m_pContext);
|
| - IFX_RenderDeviceDriver* pDriver = new CFX_QuartzDeviceDriver(m_pContext, nDeviceClass);
|
| - SetDeviceDriver(pDriver);
|
| - return TRUE;
|
| +CGContextRef CFX_QuartzDevice::GetContext() {
|
| + return m_pContext;
|
| }
|
| -FX_BOOL CFX_QuartzDevice::Attach(CFX_DIBitmap* pBitmap)
|
| -{
|
| - SetBitmap(pBitmap);
|
| - m_pContext = createContextWithBitmap(pBitmap);
|
| - if (NULL == m_pContext) {
|
| - return FALSE;
|
| - }
|
| - IFX_RenderDeviceDriver* pDriver = new CFX_QuartzDeviceDriver(m_pContext, FXDC_DISPLAY);
|
| - SetDeviceDriver(pDriver);
|
| - return TRUE;
|
| +FX_BOOL CFX_QuartzDevice::Attach(CGContextRef context, int32_t nDeviceClass) {
|
| + if (m_pContext) {
|
| + CGContextRelease(m_pContext);
|
| + }
|
| + m_pContext = context;
|
| + CGContextRetain(m_pContext);
|
| + IFX_RenderDeviceDriver* pDriver =
|
| + new CFX_QuartzDeviceDriver(m_pContext, nDeviceClass);
|
| + SetDeviceDriver(pDriver);
|
| + return TRUE;
|
| }
|
| -FX_BOOL CFX_QuartzDevice::Create(int32_t width, int32_t height, FXDIB_Format format)
|
| -{
|
| - if ((uint8_t)format < 32) {
|
| - return FALSE;
|
| - }
|
| - CFX_DIBitmap* pBitmap = new CFX_DIBitmap;
|
| - if (!pBitmap->Create(width, height, format)) {
|
| - delete pBitmap;
|
| - return FALSE;
|
| - }
|
| - m_bOwnedBitmap = TRUE;
|
| - return Attach(pBitmap);
|
| +FX_BOOL CFX_QuartzDevice::Attach(CFX_DIBitmap* pBitmap) {
|
| + SetBitmap(pBitmap);
|
| + m_pContext = createContextWithBitmap(pBitmap);
|
| + if (NULL == m_pContext) {
|
| + return FALSE;
|
| + }
|
| + IFX_RenderDeviceDriver* pDriver =
|
| + new CFX_QuartzDeviceDriver(m_pContext, FXDC_DISPLAY);
|
| + SetDeviceDriver(pDriver);
|
| + return TRUE;
|
| +}
|
| +FX_BOOL CFX_QuartzDevice::Create(int32_t width,
|
| + int32_t height,
|
| + FXDIB_Format format) {
|
| + if ((uint8_t)format < 32) {
|
| + return FALSE;
|
| + }
|
| + CFX_DIBitmap* pBitmap = new CFX_DIBitmap;
|
| + if (!pBitmap->Create(width, height, format)) {
|
| + delete pBitmap;
|
| + return FALSE;
|
| + }
|
| + m_bOwnedBitmap = TRUE;
|
| + return Attach(pBitmap);
|
| }
|
| #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
|
|
|