Changeset 73925 in webkit


Ignore:
Timestamp:
Dec 13, 2010 10:13:13 AM (13 years ago)
Author:
mdelaney@apple.com
Message:

2010-12-09 Matthew Delaney <mdelaney@apple.com>

Reviewed by Simon Fraser.

Adopt new CG API for canvas
https://bugs.webkit.org/show_bug.cgi?id=50591

  • WebCoreSupport/WebSystemInterface.mm:

2010-12-09 Matthew Delaney <mdelaney@apple.com>

Reviewed by Simon Fraser.

Adopt new CG API for canvas
https://bugs.webkit.org/show_bug.cgi?id=50591

No new tests. All current layout tests are sufficient.

  • html/HTMLCanvasElement.cpp: Add in accelerateRendering flag for imagebuffer creation.
  • html/canvas/CanvasRenderingContext2D.cpp: (WebCore::CanvasRenderingContext2D::isAccelerated): Always return true if using CA on new platforms. (WebCore::CanvasRenderingContext2D::drawTextInternal): Use accelerateRendering for imagebuffer.
  • platform/graphics/ImageBuffer.h: (WebCore::ImageBuffer::create): Plumb through new flag.
  • platform/graphics/cairo/ImageBufferCairo.cpp: Update method sig.
  • platform/graphics/cg/ImageBufferCG.cpp: Switch off of accelerateRendering flag for new accelerated paths.
  • platform/graphics/cg/ImageBufferData.h: Add in surface ref
  • platform/graphics/haiku/ImageBufferHaiku.cpp: Update method sig.
  • platform/graphics/qt/ImageBufferQt.cpp:
  • platform/graphics/skia/ImageBufferSkia.cpp:
  • platform/graphics/wince/ImageBufferWinCE.cpp:
  • platform/graphics/wx/ImageBufferWx.cpp:
  • platform/mac/WebCoreSystemInterface.h: Add new method sigs
  • platform/mac/WebCoreSystemInterface.mm:
  • rendering/RenderLayerBacking.cpp:
  • rendering/RenderLayerCompositor.cpp: Set acceleratesDrawing for canvas backings.
Location:
trunk
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r73923 r73925  
     12010-12-09  Matthew Delaney  <mdelaney@apple.com>
     2
     3        Reviewed by Simon Fraser.
     4
     5        Adopt new CG API for canvas
     6        https://bugs.webkit.org/show_bug.cgi?id=50591
     7
     8        No new tests. All current layout tests are sufficient.
     9
     10        * html/HTMLCanvasElement.cpp: Add in accelerateRendering flag for imagebuffer creation.
     11        * html/canvas/CanvasRenderingContext2D.cpp:
     12        (WebCore::CanvasRenderingContext2D::isAccelerated): Always return true if using CA on new platforms.
     13        (WebCore::CanvasRenderingContext2D::drawTextInternal): Use accelerateRendering for imagebuffer.
     14        * platform/graphics/ImageBuffer.h:
     15        (WebCore::ImageBuffer::create): Plumb through new flag.
     16        * platform/graphics/cairo/ImageBufferCairo.cpp: Update method sig.
     17        * platform/graphics/cg/ImageBufferCG.cpp: Switch off of accelerateRendering flag for new accelerated paths.
     18        * platform/graphics/cg/ImageBufferData.h: Add in surface ref
     19        * platform/graphics/haiku/ImageBufferHaiku.cpp: Update method sig.
     20        * platform/graphics/qt/ImageBufferQt.cpp: ^^
     21        * platform/graphics/skia/ImageBufferSkia.cpp: ^^
     22        * platform/graphics/wince/ImageBufferWinCE.cpp: ^^
     23        * platform/graphics/wx/ImageBufferWx.cpp: ^^
     24        * platform/mac/WebCoreSystemInterface.h: Add new method sigs
     25        * platform/mac/WebCoreSystemInterface.mm: ^^
     26        * rendering/RenderLayerBacking.cpp:
     27        * rendering/RenderLayerCompositor.cpp: Set acceleratesDrawing for canvas backings.
     28
    1292010-12-13  Benjamin Kalman  <kalman@chromium.org>
    230
  • trunk/WebCore/WebCore.exp.in

    r73886 r73925  
    12571257#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
    12581258_wkCreateCTTypesetterWithUniCharProviderAndOptions
     1259_wkIOSurfaceContextCreate
     1260_wkIOSurfaceContextCreateImage
    12591261#endif
    12601262
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r73914 r73925  
    690690                20D629271253690B00081543 /* InspectorInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 20D629251253690B00081543 /* InspectorInstrumentation.h */; };
    691691                228C284510D82500009D0D0E /* ScriptWrappable.h in Headers */ = {isa = PBXBuildFile; fileRef = 228C284410D82500009D0D0E /* ScriptWrappable.h */; settings = {ATTRIBUTES = (Private, ); }; };
     692                2298CCE712AD8BCA00C42E51 /* IOSurface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2298CCE612AD8BCA00C42E51 /* IOSurface.framework */; };
    692693                24F54EAC101FE914000AE741 /* ApplicationCacheHost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 24F54EAA101FE914000AE741 /* ApplicationCacheHost.cpp */; };
    693694                24F54EAD101FE914000AE741 /* ApplicationCacheHost.h in Headers */ = {isa = PBXBuildFile; fileRef = 24F54EAB101FE914000AE741 /* ApplicationCacheHost.h */; settings = {ATTRIBUTES = (); }; };
     
    69736974                20D629251253690B00081543 /* InspectorInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorInstrumentation.h; sourceTree = "<group>"; };
    69746975                228C284410D82500009D0D0E /* ScriptWrappable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptWrappable.h; sourceTree = "<group>"; };
     6976                2298CCE612AD8BCA00C42E51 /* IOSurface.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOSurface.framework; path = /System/Library/Frameworks/IOSurface.framework; sourceTree = "<absolute>"; };
    69756977                2442BBF81194C9D300D49469 /* HashChangeEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashChangeEvent.h; sourceTree = "<group>"; };
    69766978                24F54EAA101FE914000AE741 /* ApplicationCacheHost.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationCacheHost.cpp; sourceTree = "<group>"; };
     
    1223012232                                FD2DBF1412B048A300ED98C6 /* AudioUnit.framework in Frameworks */,
    1223112233                                FD2DBF1512B048A300ED98C6 /* CoreAudio.framework in Frameworks */,
     12234                                2298CCE712AD8BCA00C42E51 /* IOSurface.framework in Frameworks */,
    1223212235                        );
    1223312236                        runOnlyForDeploymentPostprocessing = 0;
     
    1232612329                                F5C2869502846DCD018635CA /* Cocoa.framework */,
    1232712330                                1AB33DA412551E320024457A /* IOKit.framework */,
     12331                                2298CCE612AD8BCA00C42E51 /* IOSurface.framework */,
    1232812332                                F8216299029F4FB501000131 /* JavaScriptCore.framework */,
    1232912333                                93F1D31A0558CC5C00821BC0 /* libicucore.dylib */,
  • trunk/WebCore/html/HTMLCanvasElement.cpp

    r73744 r73925  
    373373        return;
    374374
     375#if defined(USE_IOSURFACE)
     376    m_imageBuffer = ImageBuffer::create(size, ColorSpaceDeviceRGB, Accelerated);
     377#else
    375378    m_imageBuffer = ImageBuffer::create(size);
     379#endif
    376380    // The convertLogicalToDevice MaxCanvasArea check should prevent common cases
    377381    // where ImageBuffer::create() returns 0, however we could still be low on memory.
  • trunk/WebCore/html/canvas/CanvasRenderingContext2D.cpp

    r73284 r73925  
    145145bool CanvasRenderingContext2D::isAccelerated() const
    146146{
    147 #if ENABLE(ACCELERATED_2D_CANVAS)
     147#if PLATFORM(MAC) && PLATFORM(CA) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
     148    return true;
     149#elif ENABLE(ACCELERATED_2D_CANVAS)
    148150    return m_context3D;
    149151#else
     
    18201822        IntRect maskRect = enclosingIntRect(textRect);
    18211823
     1824#if defined(USE_IOSURFACE)
     1825        OwnPtr<ImageBuffer> maskImage = ImageBuffer::create(maskRect.size(), ColorSpaceDeviceRGB, Accelerated);
     1826#else
    18221827        OwnPtr<ImageBuffer> maskImage = ImageBuffer::create(maskRect.size());
     1828#endif
    18231829
    18241830        GraphicsContext* maskImageContext = maskImage->context();
  • trunk/WebCore/platform/graphics/ImageBuffer.h

    r70143 r73925  
    4040#include <wtf/PassRefPtr.h>
    4141
     42#if (PLATFORM(MAC) && PLATFORM(CA) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD))
     43#define USE_IOSURFACE 1
     44#endif
     45
    4246namespace WebCore {
    4347
     
    5256    };
    5357
     58    enum RenderingMode {
     59        Unaccelerated,
     60        Accelerated
     61    };
     62
    5463    class ImageBuffer : public Noncopyable {
    5564    public:
    5665        // Will return a null pointer on allocation failure.
    57         static PassOwnPtr<ImageBuffer> create(const IntSize& size, ColorSpace colorSpace = ColorSpaceDeviceRGB)
     66        static PassOwnPtr<ImageBuffer> create(const IntSize& size, ColorSpace colorSpace = ColorSpaceDeviceRGB, RenderingMode renderingMode = Unaccelerated)
    5867        {
    5968            bool success = false;
    60             OwnPtr<ImageBuffer> buf(new ImageBuffer(size, colorSpace, success));
     69            OwnPtr<ImageBuffer> buf(new ImageBuffer(size, colorSpace, renderingMode == Accelerated, success));
    6170            if (success)
    6271                return buf.release();
     
    105114
    106115        IntSize m_size;
     116        bool m_accelerateRendering;
    107117        OwnPtr<GraphicsContext> m_context;
    108118
     
    114124        // This constructor will place its success into the given out-variable
    115125        // so that create() knows when it should return failure.
    116         ImageBuffer(const IntSize&, ColorSpace colorSpace, bool& success);
     126        ImageBuffer(const IntSize&, ColorSpace colorSpace, bool accelerateRendering, bool& success);
    117127    };
    118128
  • trunk/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp

    r70143 r73925  
    7070}
    7171
    72 ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, bool& success)
     72ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, bool, bool& success)
    7373    : m_data(size)
    7474    , m_size(size)
  • trunk/WebCore/platform/graphics/cg/ImageBufferCG.cpp

    r73853 r73925  
    4343#include <math.h>
    4444
     45#if defined(USE_IOSURFACE)
     46#include <IOSurface/IOSurface.h>
     47#endif
     48
     49#if PLATFORM(MAC) || PLATFORM(CHROMIUM)
     50#include "WebCoreSystemInterface.h"
     51#endif
     52
    4553using namespace std;
    4654
    4755namespace WebCore {
     56
     57#if defined(USE_IOSURFACE)
     58static RetainPtr<IOSurfaceRef> createIOSurface(const IntSize& size)
     59{
     60    unsigned pixelFormat = 'BGRA';
     61    unsigned bytesPerElement = 4;
     62    int width = size.width();
     63    int height = size.height();
     64
     65    unsigned long bytesPerRow = IOSurfaceAlignProperty(kIOSurfaceBytesPerRow, size.width() * bytesPerElement);
     66    if (!bytesPerRow || bytesPerRow != (size.width() * bytesPerElement))
     67        return 0;
     68
     69    unsigned long allocSize = IOSurfaceAlignProperty(kIOSurfaceAllocSize, size.height() * bytesPerRow);
     70    if (!allocSize || allocSize != (size.height() * bytesPerRow))
     71        return 0;
     72
     73    const void *keys[6];
     74    const void *values[6];
     75    keys[0] = kIOSurfaceWidth;
     76    values[0] = CFNumberCreate(0, kCFNumberIntType, &width);
     77    keys[1] = kIOSurfaceHeight;
     78    values[1] = CFNumberCreate(0, kCFNumberIntType, &height);
     79    keys[2] = kIOSurfacePixelFormat;
     80    values[2] = CFNumberCreate(0, kCFNumberIntType, &pixelFormat);
     81    keys[3] = kIOSurfaceBytesPerElement;
     82    values[3] = CFNumberCreate(0, kCFNumberIntType, &bytesPerElement);
     83    keys[4] = kIOSurfaceBytesPerRow;
     84    values[4] = CFNumberCreate(0, kCFNumberLongType, &bytesPerRow);
     85    keys[5] = kIOSurfaceAllocSize;
     86    values[5] = CFNumberCreate(0, kCFNumberLongType, &allocSize);
     87
     88    RetainPtr<CFDictionaryRef> dict(AdoptCF, CFDictionaryCreate(0, keys, values, 6, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
     89    for (unsigned i = 0; i < 6; i++)
     90        CFRelease(values[i]);
     91
     92    return RetainPtr<IOSurfaceRef>(AdoptCF, IOSurfaceCreate(dict.get()));
     93}
     94#endif
    4895
    4996static void releaseImageData(void*, const void* data, size_t)
     
    54101ImageBufferData::ImageBufferData(const IntSize&)
    55102    : m_data(0)
    56 {
    57 }
    58 
    59 ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace imageColorSpace, bool& success)
     103#if defined(USE_IOSURFACE)
     104    , m_surface(0)
     105#endif
     106{
     107}
     108
     109ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace imageColorSpace, bool accelerateRendering, bool& success)
    60110    : m_data(size)
    61111    , m_size(size)
     112    , m_accelerateRendering(accelerateRendering)
    62113{
    63114    success = false;  // Make early return mean failure.
     
    66117
    67118    unsigned bytesPerRow = size.width();
    68 
    69     // Protect against overflow
    70     if (bytesPerRow > 0x3FFFFFFF)
     119    if (bytesPerRow > 0x3FFFFFFF) // Protect against overflow
    71120        return;
    72121    bytesPerRow *= 4;
    73122    m_data.m_bytesPerRow = bytesPerRow;
    74 
    75123    size_t dataSize = size.height() * bytesPerRow;
    76     if (!tryFastCalloc(size.height(), bytesPerRow).getValue(m_data.m_data))
    77         return;
    78 
    79     ASSERT((reinterpret_cast<size_t>(m_data.m_data) & 2) == 0);
    80 
    81     switch(imageColorSpace) {
     124
     125    switch (imageColorSpace) {
    82126    case ColorSpaceDeviceRGB:
    83127        m_data.m_colorSpace = deviceRGBColorSpaceRef();
     
    91135    }
    92136
    93     m_data.m_bitmapInfo = kCGImageAlphaPremultipliedLast;
    94     RetainPtr<CGContextRef> cgContext(AdoptCF, CGBitmapContextCreate(m_data.m_data, size.width(), size.height(), 8, bytesPerRow,
    95                                                                      m_data.m_colorSpace, m_data.m_bitmapInfo));
     137    RetainPtr<CGContextRef> cgContext;
     138    if (!m_accelerateRendering) {
     139        if (!tryFastCalloc(size.height(), bytesPerRow).getValue(m_data.m_data))
     140            return;
     141        ASSERT(!(reinterpret_cast<size_t>(m_data.m_data) & 2));
     142
     143        m_data.m_bitmapInfo = kCGImageAlphaPremultipliedLast;
     144        cgContext.adoptCF(CGBitmapContextCreate(m_data.m_data, size.width(), size.height(), 8, bytesPerRow, m_data.m_colorSpace, m_data.m_bitmapInfo));
     145        // Create a live image that wraps the data.
     146        m_data.m_dataProvider.adoptCF(CGDataProviderCreateWithData(0, m_data.m_data, dataSize, releaseImageData));
     147    } else {
     148#if defined(USE_IOSURFACE)
     149        m_data.m_surface = createIOSurface(size);
     150        cgContext.adoptCF(wkIOSurfaceContextCreate(m_data.m_surface.get(), size.width(), size.height(), m_data.m_colorSpace));
     151#else
     152        m_accelerateRendering = false; // Force to false on older platforms
     153#endif
     154    }
     155
    96156    if (!cgContext)
    97157        return;
     
    101161    m_context->translate(0, -size.height());
    102162    success = true;
    103    
    104     // Create a live image that wraps the data.
    105     m_data.m_dataProvider.adoptCF(CGDataProviderCreateWithData(0, m_data.m_data, dataSize, releaseImageData));
    106163}
    107164
     
    123180{
    124181    // BitmapImage will release the passed in CGImage on destruction
    125     return BitmapImage::create(CGBitmapContextCreateImage(context()->platformContext()));
     182    CGImageRef ctxImage = 0;
     183    if (!m_accelerateRendering)
     184        ctxImage = CGBitmapContextCreateImage(context()->platformContext());
     185#if defined(USE_IOSURFACE)
     186    else
     187        ctxImage = wkIOSurfaceContextCreateImage(context()->platformContext());
     188#endif
     189    return BitmapImage::create(ctxImage);
    126190}
    127191
     
    135199                       CompositeOperator op, bool useLowQualityScale)
    136200{
    137     if (destContext == context()) {
    138         // We're drawing into our own buffer.  In order for this to work, we need to copy the source buffer first.
     201    if (!m_accelerateRendering) {
     202        if (destContext == context()) {
     203            // We're drawing into our own buffer.  In order for this to work, we need to copy the source buffer first.
     204            RefPtr<Image> copy = copyImage();
     205            destContext->drawImage(copy.get(), ColorSpaceDeviceRGB, destRect, srcRect, op, useLowQualityScale);
     206        } else {
     207            RefPtr<Image> imageForRendering = BitmapImage::create(cgImage(m_size, m_data));
     208            destContext->drawImage(imageForRendering.get(), styleColorSpace, destRect, srcRect, op, useLowQualityScale);
     209        }
     210    } else {
    139211        RefPtr<Image> copy = copyImage();
    140         destContext->drawImage(copy.get(), ColorSpaceDeviceRGB, destRect, srcRect, op, useLowQualityScale);
    141     } else {
    142         RefPtr<Image> imageForRendering = BitmapImage::create(cgImage(m_size, m_data));
    143         destContext->drawImage(imageForRendering.get(), styleColorSpace, destRect, srcRect, op, useLowQualityScale);
     212        ColorSpace colorSpace = (destContext == context()) ? ColorSpaceDeviceRGB : styleColorSpace;
     213        destContext->drawImage(copy.get(), colorSpace, destRect, srcRect, op, useLowQualityScale);
    144214    }
    145215}
     
    148218                              const FloatPoint& phase, ColorSpace styleColorSpace, CompositeOperator op, const FloatRect& destRect)
    149219{
    150     if (destContext == context()) {
    151         // We're drawing into our own buffer.  In order for this to work, we need to copy the source buffer first.
     220    if (!m_accelerateRendering) {
     221        if (destContext == context()) {
     222            // We're drawing into our own buffer.  In order for this to work, we need to copy the source buffer first.
     223            RefPtr<Image> copy = copyImage();
     224            copy->drawPattern(destContext, srcRect, patternTransform, phase, styleColorSpace, op, destRect);
     225        } else {
     226            RefPtr<Image> imageForRendering = BitmapImage::create(cgImage(m_size, m_data));
     227            imageForRendering->drawPattern(destContext, srcRect, patternTransform, phase, styleColorSpace, op, destRect);
     228        }
     229    } else {
    152230        RefPtr<Image> copy = copyImage();
    153231        copy->drawPattern(destContext, srcRect, patternTransform, phase, styleColorSpace, op, destRect);
    154     } else {
    155         RefPtr<Image> imageForRendering = BitmapImage::create(cgImage(m_size, m_data));
    156         imageForRendering->drawPattern(destContext, srcRect, patternTransform, phase, styleColorSpace, op, destRect);
    157232    }
    158233}
     
    160235void ImageBuffer::clip(GraphicsContext* context, const FloatRect& rect) const
    161236{
    162     RetainPtr<CGImageRef> image(AdoptCF, cgImage(m_size, m_data));
    163                                                                                          
    164237    CGContextRef platformContext = context->platformContext();
     238    RetainPtr<CGImageRef> image;
     239    if (!m_accelerateRendering)
     240        image.adoptCF(cgImage(m_size, m_data));
     241#if defined(USE_IOSURFACE)
     242    else
     243        image.adoptCF(wkIOSurfaceContextCreateImage(platformContext));
     244#endif
    165245    CGContextTranslateCTM(platformContext, rect.x(), rect.y() + rect.height());
    166246    CGContextScaleCTM(platformContext, 1, -1);
     
    171251
    172252template <Multiply multiplied>
    173 PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& imageData, const IntSize& size)
     253PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& imageData, const IntSize& size, bool accelerateRendering)
    174254{
    175255    PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height());
     
    200280        endy = size.height();
    201281    int numRows = endy - originy;
    202 
    203     unsigned srcBytesPerRow = 4 * size.width();
     282   
    204283    unsigned destBytesPerRow = 4 * rect.width();
    205 
    206     // ::create ensures that all ImageBuffers have valid data, so we don't need to check it here.
    207     unsigned char* srcRows = reinterpret_cast<unsigned char*>(imageData.m_data) + originy * srcBytesPerRow + originx * 4;
    208284    unsigned char* destRows = data + desty * destBytesPerRow + destx * 4;
    209     for (int y = 0; y < numRows; ++y) {
    210         for (int x = 0; x < numColumns; x++) {
    211             int basex = x * 4;
    212             unsigned char alpha = srcRows[basex + 3];
    213             if (multiplied == Unmultiplied && alpha) {
    214                 destRows[basex] = (srcRows[basex] * 255) / alpha;
    215                 destRows[basex + 1] = (srcRows[basex + 1] * 255) / alpha;
    216                 destRows[basex + 2] = (srcRows[basex + 2] * 255) / alpha;
    217                 destRows[basex + 3] = alpha;
    218             } else
    219                 reinterpret_cast<uint32_t*>(destRows + basex)[0] = reinterpret_cast<uint32_t*>(srcRows + basex)[0];
     285
     286    unsigned srcBytesPerRow;
     287    unsigned char* srcRows;
     288
     289    if (!accelerateRendering) {
     290        srcBytesPerRow = 4 * size.width();
     291        srcRows = reinterpret_cast<unsigned char*>(imageData.m_data) + originy * srcBytesPerRow + originx * 4;
     292       
     293        for (int y = 0; y < numRows; ++y) {
     294            for (int x = 0; x < numColumns; x++) {
     295                int basex = x * 4;
     296                unsigned char alpha = srcRows[basex + 3];
     297                if (multiplied == Unmultiplied && alpha) {
     298                    destRows[basex] = (srcRows[basex] * 255) / alpha;
     299                    destRows[basex + 1] = (srcRows[basex + 1] * 255) / alpha;
     300                    destRows[basex + 2] = (srcRows[basex + 2] * 255) / alpha;
     301                    destRows[basex + 3] = alpha;
     302                } else
     303                    reinterpret_cast<uint32_t*>(destRows + basex)[0] = reinterpret_cast<uint32_t*>(srcRows + basex)[0];
     304            }
     305            srcRows += srcBytesPerRow;
     306            destRows += destBytesPerRow;
    220307        }
    221         srcRows += srcBytesPerRow;
    222         destRows += destBytesPerRow;
    223     }
     308    } else {
     309#if defined(USE_IOSURFACE)
     310        IOSurfaceRef surface = imageData.m_surface.get();
     311        IOSurfaceLock(surface, kIOSurfaceLockReadOnly, 0);
     312        srcBytesPerRow = IOSurfaceGetBytesPerRow(surface);
     313        srcRows = (unsigned char*)(IOSurfaceGetBaseAddress(surface)) + originy * srcBytesPerRow + originx * 4;
     314       
     315        for (int y = 0; y < numRows; ++y) {
     316            for (int x = 0; x < numColumns; x++) {
     317                int basex = x * 4;
     318                unsigned char alpha = srcRows[basex + 3];
     319                if (multiplied == Unmultiplied && alpha) {
     320                    destRows[basex] = (srcRows[basex + 2] * 255) / alpha;
     321                    destRows[basex + 1] = (srcRows[basex + 1] * 255) / alpha;
     322                    destRows[basex + 2] = (srcRows[basex] * 255) / alpha;
     323                    destRows[basex + 3] = alpha;
     324                } else {
     325                    destRows[basex] = srcRows[basex + 2];
     326                    destRows[basex + 1] = srcRows[basex + 1];
     327                    destRows[basex + 2] = srcRows[basex];
     328                    destRows[basex + 3] = alpha;
     329                }
     330            }
     331            srcRows += srcBytesPerRow;
     332            destRows += destBytesPerRow;
     333        }
     334        IOSurfaceUnlock(surface, kIOSurfaceLockReadOnly, 0);
     335#else
     336        ASSERT_NOT_REACHED();
     337#endif
     338    }
     339   
    224340    return result;
    225341}
     
    227343PassRefPtr<ImageData> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const
    228344{
    229     return getImageData<Unmultiplied>(rect, m_data, m_size);
     345    if (m_accelerateRendering)
     346        CGContextFlush(context()->platformContext());
     347    return getImageData<Unmultiplied>(rect, m_data, m_size, m_accelerateRendering);
    230348}
    231349
    232350PassRefPtr<ImageData> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const
    233351{
    234     return getImageData<Premultiplied>(rect, m_data, m_size);
     352    if (m_accelerateRendering)
     353        CGContextFlush(context()->platformContext());
     354    return getImageData<Premultiplied>(rect, m_data, m_size, m_accelerateRendering);
    235355}
    236356
    237357template <Multiply multiplied>
    238 void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& destPoint, ImageBufferData& imageData, const IntSize& size)
     358void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& destPoint, ImageBufferData& imageData, const IntSize& size, bool accelerateRendering)
    239359{
    240360    ASSERT(sourceRect.width() > 0);
     
    265385
    266386    unsigned srcBytesPerRow = 4 * source->width();
    267     unsigned destBytesPerRow = 4 * size.width();
    268 
    269387    unsigned char* srcRows = source->data()->data()->data() + originy * srcBytesPerRow + originx * 4;
    270     unsigned char* destRows = reinterpret_cast<unsigned char*>(imageData.m_data) + desty * destBytesPerRow + destx * 4;
    271     for (int y = 0; y < numRows; ++y) {
    272         for (int x = 0; x < numColumns; x++) {
    273             int basex = x * 4;
    274             unsigned char alpha = srcRows[basex + 3];
    275             if (multiplied == Unmultiplied && alpha != 255) {
    276                 destRows[basex] = (srcRows[basex] * alpha + 254) / 255;
    277                 destRows[basex + 1] = (srcRows[basex + 1] * alpha + 254) / 255;
    278                 destRows[basex + 2] = (srcRows[basex + 2] * alpha + 254) / 255;
    279                 destRows[basex + 3] = alpha;
    280             } else
    281                 reinterpret_cast<uint32_t*>(destRows + basex)[0] = reinterpret_cast<uint32_t*>(srcRows + basex)[0];
     388    unsigned destBytesPerRow;
     389    unsigned char* destRows;
     390
     391    if (!accelerateRendering) {
     392        destBytesPerRow = 4 * size.width();
     393        destRows = reinterpret_cast<unsigned char*>(imageData.m_data) + desty * destBytesPerRow + destx * 4;
     394        for (int y = 0; y < numRows; ++y) {
     395            for (int x = 0; x < numColumns; x++) {
     396                int basex = x * 4;
     397                unsigned char alpha = srcRows[basex + 3];
     398                if (multiplied == Unmultiplied && alpha != 255) {
     399                    destRows[basex] = (srcRows[basex] * alpha + 254) / 255;
     400                    destRows[basex + 1] = (srcRows[basex + 1] * alpha + 254) / 255;
     401                    destRows[basex + 2] = (srcRows[basex + 2] * alpha + 254) / 255;
     402                    destRows[basex + 3] = alpha;
     403                } else
     404                    reinterpret_cast<uint32_t*>(destRows + basex)[0] = reinterpret_cast<uint32_t*>(srcRows + basex)[0];
     405            }
     406            destRows += destBytesPerRow;
     407            srcRows += srcBytesPerRow;
    282408        }
    283         destRows += destBytesPerRow;
    284         srcRows += srcBytesPerRow;
     409    } else {
     410#if defined(USE_IOSURFACE)
     411        IOSurfaceRef surface = imageData.m_surface.get();
     412        IOSurfaceLock(surface, 0, 0);
     413        destBytesPerRow = IOSurfaceGetBytesPerRow(surface);
     414        destRows = (unsigned char*)(IOSurfaceGetBaseAddress(surface)) + desty * destBytesPerRow + destx * 4;
     415       
     416        for (int y = 0; y < numRows; ++y) {
     417            for (int x = 0; x < numColumns; x++) {
     418                int basex = x * 4;
     419                unsigned char alpha = srcRows[basex + 3];
     420                if (multiplied == Unmultiplied && alpha != 255) {
     421                    destRows[basex] = (srcRows[basex + 2] * alpha + 254) / 255;
     422                    destRows[basex + 1] = (srcRows[basex + 1] * alpha + 254) / 255;
     423                    destRows[basex + 2] = (srcRows[basex] * alpha + 254) / 255;
     424                    destRows[basex + 3] = alpha;
     425                } else {
     426                    destRows[basex] = srcRows[basex + 2];
     427                    destRows[basex + 1] = srcRows[basex + 1];
     428                    destRows[basex + 2] = srcRows[basex];
     429                    destRows[basex + 3] = alpha;
     430                }
     431            }
     432            destRows += destBytesPerRow;
     433            srcRows += srcBytesPerRow;
     434        }
     435        IOSurfaceUnlock(surface, 0, 0);
     436#else
     437        ASSERT_NOT_REACHED();
     438#endif
    285439    }
    286440}
     
    288442void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint)
    289443{
    290     putImageData<Unmultiplied>(source, sourceRect, destPoint, m_data, m_size);
     444    if (m_accelerateRendering)
     445        CGContextFlush(context()->platformContext());
     446    putImageData<Unmultiplied>(source, sourceRect, destPoint, m_data, m_size, m_accelerateRendering);
    291447}
    292448
    293449void ImageBuffer::putPremultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint)
    294450{
    295     putImageData<Premultiplied>(source, sourceRect, destPoint, m_data, m_size);
     451    if (m_accelerateRendering)
     452        CGContextFlush(context()->platformContext());
     453    putImageData<Premultiplied>(source, sourceRect, destPoint, m_data, m_size, m_accelerateRendering);
    296454}
    297455
     
    333491    ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType));
    334492
    335     RetainPtr<CGImageRef> image(AdoptCF, CGBitmapContextCreateImage(context()->platformContext()));
     493    RetainPtr<CGImageRef> image;
     494    if (!m_accelerateRendering)
     495        image.adoptCF(CGBitmapContextCreateImage(context()->platformContext()));
     496#if defined(USE_IOSURFACE)
     497    else
     498        image.adoptCF(wkIOSurfaceContextCreateImage(context()->platformContext()));
     499#endif
     500
    336501    if (!image)
    337502        return "data:,";
     
    365530    return makeString("data:", mimeType, ";base64,", out);
    366531}
    367 
    368532} // namespace WebCore
  • trunk/WebCore/platform/graphics/cg/ImageBufferData.h

    r70143 r73925  
    3131#include <wtf/RetainPtr.h>
    3232
     33typedef struct __IOSurface *IOSurfaceRef;
    3334typedef struct CGColorSpace *CGColorSpaceRef;
    3435typedef struct CGDataProvider *CGDataProviderRef;
     
    4950    unsigned m_bytesPerRow;
    5051    CGColorSpaceRef m_colorSpace;
     52    RetainPtr<IOSurfaceRef> m_surface;
    5153};
    5254
  • trunk/WebCore/platform/graphics/haiku/ImageBufferHaiku.cpp

    r73853 r73925  
    6767}
    6868
    69 ImageBuffer::ImageBuffer(const IntSize& size, ImageColorSpace imageColorSpace, bool& success)
     69ImageBuffer::ImageBuffer(const IntSize& size, ImageColorSpace imageColorSpace, bool, bool& success)
    7070    : m_data(size)
    7171    , m_size(size)
  • trunk/WebCore/platform/graphics/qt/ImageBufferQt.cpp

    r70424 r73925  
    8181}
    8282
    83 ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, bool& success)
     83ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, bool, bool& success)
    8484    : m_data(size)
    8585    , m_size(size)
  • trunk/WebCore/platform/graphics/skia/ImageBufferSkia.cpp

    r73853 r73925  
    6363}
    6464
    65 ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, bool& success)
     65ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, bool, bool& success)
    6666    : m_data(size)
    6767    , m_size(size)
  • trunk/WebCore/platform/graphics/wince/ImageBufferWinCE.cpp

    r70397 r73925  
    7373}
    7474
    75 ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace colorSpace, bool& success)
     75ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace colorSpace, bool, bool& success)
    7676    : m_data(size)
    7777    , m_size(size)
  • trunk/WebCore/platform/graphics/wx/ImageBufferWx.cpp

    r73051 r73925  
    3838}
    3939
    40 ImageBuffer::ImageBuffer(const IntSize&, ColorSpace imageColorSpace, bool& success) :
     40ImageBuffer::ImageBuffer(const IntSize&, ColorSpace imageColorSpace, bool, bool& success) :
    4141    m_data(IntSize())
    4242{
  • trunk/WebCore/platform/mac/WebCoreSystemInterface.h

    r71590 r73925  
    2929#include <ApplicationServices/ApplicationServices.h>
    3030#include <objc/objc.h>
     31
     32#if PLATFORM(MAC) && PLATFORM(CA) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
     33#include <IOSurface/IOSurface.h>
     34#endif
    3135
    3236typedef struct _NSRange NSRange;
     
    180184#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
    181185extern CTTypesetterRef (*wkCreateCTTypesetterWithUniCharProviderAndOptions)(const UniChar* (*provide)(CFIndex stringIndex, CFIndex* charCount, CFDictionaryRef* attributes, void*), void (*dispose)(const UniChar* chars, void*), void*, CFDictionaryRef options);
     186
     187extern CGContextRef (*wkIOSurfaceContextCreate)(IOSurfaceRef surface, unsigned width, unsigned height, CGColorSpaceRef colorSpace);
     188extern CGImageRef (*wkIOSurfaceContextCreateImage)(CGContextRef context);
    182189#endif
    183190
  • trunk/WebCore/platform/mac/WebCoreSystemInterface.mm

    r71590 r73925  
    123123#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
    124124CTTypesetterRef (*wkCreateCTTypesetterWithUniCharProviderAndOptions)(const UniChar* (*provide)(CFIndex stringIndex, CFIndex* charCount, CFDictionaryRef* attributes, void*), void (*dispose)(const UniChar* chars, void*), void*, CFDictionaryRef options);
     125
     126CGContextRef (*wkIOSurfaceContextCreate)(IOSurfaceRef surface, unsigned width, unsigned height, CGColorSpaceRef colorSpace);
     127CGImageRef (*wkIOSurfaceContextCreateImage)(CGContextRef context);
    125128#endif
  • trunk/WebCore/rendering/RenderLayerBacking.cpp

    r72954 r73925  
    768768        return hasBoxDecorationsOrBackground(renderer());
    769769#endif
    770 #if ENABLE(3D_CANVAS) || ENABLE(ACCELERATED_2D_CANVAS)
     770#if PLATFORM(MAC) && PLATFORM(CA) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
     771#elif ENABLE(3D_CANVAS) || ENABLE(ACCELERATED_2D_CANVAS)
    771772    if (isAcceleratedCanvas(renderer()))
    772773        return hasBoxDecorationsOrBackground(renderer());
  • trunk/WebCore/rendering/RenderLayerCompositor.cpp

    r72954 r73925  
    298298
    299299            layer->ensureBacking();
     300
     301#if PLATFORM(MAC) && PLATFORM(CA)
     302            if (layer->renderer()->isCanvas()) {
     303                HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(layer->renderer()->node());
     304                if (canvas->renderingContext() && canvas->renderingContext()->isAccelerated())
     305                    layer->backing()->graphicsLayer()->setAcceleratesDrawing(true);
     306            }
     307#endif
    300308            layerChanged = true;
    301309        }
  • trunk/WebKit/mac/ChangeLog

    r73886 r73925  
     12010-12-09  Matthew Delaney  <mdelaney@apple.com>
     2
     3        Reviewed by Simon Fraser.
     4
     5        Adopt new CG API for canvas
     6        https://bugs.webkit.org/show_bug.cgi?id=50591
     7
     8        * WebCoreSupport/WebSystemInterface.mm:
     9
    1102010-10-28  MORITA Hajime  <morrita@google.com>
    211
  • trunk/WebKit/mac/WebCoreSupport/WebSystemInterface.mm

    r71590 r73925  
    122122#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
    123123    INIT(CreateCTTypesetterWithUniCharProviderAndOptions);
     124    INIT(IOSurfaceContextCreate);
     125    INIT(IOSurfaceContextCreateImage);
    124126#endif
    125127
Note: See TracChangeset for help on using the changeset viewer.