OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. |
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> | 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> |
4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. | 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 m_presentedImage.clear(); | 351 m_presentedImage.clear(); |
352 updateExternallyAllocatedMemory(); | 352 updateExternallyAllocatedMemory(); |
353 } | 353 } |
354 | 354 |
355 void HTMLCanvasElement::setSurfaceSize(const IntSize& size) | 355 void HTMLCanvasElement::setSurfaceSize(const IntSize& size) |
356 { | 356 { |
357 m_size = size; | 357 m_size = size; |
358 m_didFailToCreateImageBuffer = false; | 358 m_didFailToCreateImageBuffer = false; |
359 discardImageBuffer(); | 359 discardImageBuffer(); |
360 clearCopiedImage(); | 360 clearCopiedImage(); |
| 361 if (m_context && m_context->is2d()) { |
| 362 CanvasRenderingContext2D* context2d = toCanvasRenderingContext2D(m_conte
xt.get()); |
| 363 if (context2d->isContextLost()) { |
| 364 context2d->restoreContext(); |
| 365 } |
| 366 } |
361 } | 367 } |
362 | 368 |
363 String HTMLCanvasElement::toEncodingMimeType(const String& mimeType) | 369 String HTMLCanvasElement::toEncodingMimeType(const String& mimeType) |
364 { | 370 { |
365 String lowercaseMimeType = mimeType.lower(); | 371 String lowercaseMimeType = mimeType.lower(); |
366 | 372 |
367 // FIXME: Make isSupportedImageMIMETypeForEncoding threadsafe (to allow this
method to be used on a worker thread). | 373 // FIXME: Make isSupportedImageMIMETypeForEncoding threadsafe (to allow this
method to be used on a worker thread). |
368 if (mimeType.isNull() || !MIMETypeRegistry::isSupportedImageMIMETypeForEncod
ing(lowercaseMimeType)) | 374 if (mimeType.isNull() || !MIMETypeRegistry::isSupportedImageMIMETypeForEncod
ing(lowercaseMimeType)) |
369 lowercaseMimeType = "image/png"; | 375 lowercaseMimeType = "image/png"; |
370 | 376 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 OwnPtr<ImageBufferSurface> surface = adoptPtr(new Canvas2DImageBufferSur
face(size(), opacityMode, *msaaSampleCount)); | 449 OwnPtr<ImageBufferSurface> surface = adoptPtr(new Canvas2DImageBufferSur
face(size(), opacityMode, *msaaSampleCount)); |
444 if (surface->isValid()) | 450 if (surface->isValid()) |
445 return surface.release(); | 451 return surface.release(); |
446 } | 452 } |
447 | 453 |
448 return adoptPtr(new UnacceleratedImageBufferSurface(size(), opacityMode)); | 454 return adoptPtr(new UnacceleratedImageBufferSurface(size(), opacityMode)); |
449 } | 455 } |
450 | 456 |
451 void HTMLCanvasElement::createImageBuffer() | 457 void HTMLCanvasElement::createImageBuffer() |
452 { | 458 { |
| 459 createImageBufferInternal(); |
| 460 if (m_didFailToCreateImageBuffer && m_context && m_context->is2d()) |
| 461 toCanvasRenderingContext2D(m_context.get())->loseContext(); |
| 462 } |
| 463 |
| 464 void HTMLCanvasElement::createImageBufferInternal() |
| 465 { |
453 ASSERT(!m_imageBuffer); | 466 ASSERT(!m_imageBuffer); |
454 ASSERT(!m_contextStateSaver); | 467 ASSERT(!m_contextStateSaver); |
455 | 468 |
456 m_didFailToCreateImageBuffer = true; | 469 m_didFailToCreateImageBuffer = true; |
457 m_didClearImageBuffer = true; | 470 m_didClearImageBuffer = true; |
458 | 471 |
459 IntSize deviceSize = size(); | 472 IntSize deviceSize = size(); |
460 if (deviceSize.width() * deviceSize.height() > MaxCanvasArea) | 473 if (deviceSize.width() * deviceSize.height() > MaxCanvasArea) |
461 return; | 474 return; |
462 | 475 |
463 if (deviceSize.width() > MaxSkiaDim || deviceSize.height() > MaxSkiaDim) | 476 if (deviceSize.width() > MaxSkiaDim || deviceSize.height() > MaxSkiaDim) |
464 return; | 477 return; |
465 | 478 |
466 if (!deviceSize.width() || !deviceSize.height()) | 479 if (!deviceSize.width() || !deviceSize.height()) |
467 return; | 480 return; |
468 | 481 |
469 int msaaSampleCount; | 482 int msaaSampleCount; |
470 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(deviceSize, &m
saaSampleCount); | 483 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(deviceSize, &m
saaSampleCount); |
471 if (!surface->isValid()) | 484 if (!surface->isValid()) |
472 return; | 485 return; |
| 486 |
473 m_imageBuffer = ImageBuffer::create(surface.release()); | 487 m_imageBuffer = ImageBuffer::create(surface.release()); |
| 488 m_imageBuffer->setClient(this); |
474 | 489 |
475 m_didFailToCreateImageBuffer = false; | 490 m_didFailToCreateImageBuffer = false; |
476 | 491 |
477 updateExternallyAllocatedMemory(); | 492 updateExternallyAllocatedMemory(); |
478 | 493 |
479 if (is3D()) { | 494 if (is3D()) { |
480 // Early out for WebGL canvases | 495 // Early out for WebGL canvases |
481 return; | 496 return; |
482 } | 497 } |
483 | 498 |
| 499 m_imageBuffer->setClient(this); |
484 m_imageBuffer->context()->setShouldClampToSourceRect(false); | 500 m_imageBuffer->context()->setShouldClampToSourceRect(false); |
485 m_imageBuffer->context()->setImageInterpolationQuality(CanvasDefaultInterpol
ationQuality); | 501 m_imageBuffer->context()->setImageInterpolationQuality(CanvasDefaultInterpol
ationQuality); |
486 // Enabling MSAA overrides a request to disable antialiasing. This is true r
egardless of whether the | 502 // Enabling MSAA overrides a request to disable antialiasing. This is true r
egardless of whether the |
487 // rendering mode is accelerated or not. For consistency, we don't want to a
pply AA in accelerated | 503 // rendering mode is accelerated or not. For consistency, we don't want to a
pply AA in accelerated |
488 // canvases but not in unaccelerated canvases. | 504 // canvases but not in unaccelerated canvases. |
489 if (!msaaSampleCount && document().settings() && !document().settings()->ant
ialiased2dCanvasEnabled()) | 505 if (!msaaSampleCount && document().settings() && !document().settings()->ant
ialiased2dCanvasEnabled()) |
490 m_imageBuffer->context()->setShouldAntialias(false); | 506 m_imageBuffer->context()->setShouldAntialias(false); |
491 // GraphicsContext's defaults don't always agree with the 2d canvas spec. | 507 // GraphicsContext's defaults don't always agree with the 2d canvas spec. |
492 // See CanvasRenderingContext2D::State::State() for more information. | 508 // See CanvasRenderingContext2D::State::State() for more information. |
493 m_imageBuffer->context()->setMiterLimit(10); | 509 m_imageBuffer->context()->setMiterLimit(10); |
494 m_imageBuffer->context()->setStrokeThickness(1); | 510 m_imageBuffer->context()->setStrokeThickness(1); |
495 m_contextStateSaver = adoptPtr(new GraphicsContextStateSaver(*m_imageBuffer-
>context())); | 511 m_contextStateSaver = adoptPtr(new GraphicsContextStateSaver(*m_imageBuffer-
>context())); |
496 | 512 |
497 // Recalculate compositing requirements if acceleration state changed. | 513 // Recalculate compositing requirements if acceleration state changed. |
498 if (m_context) | 514 if (m_context) |
499 scheduleLayerUpdate(); | 515 scheduleLayerUpdate(); |
| 516 return; |
| 517 } |
| 518 |
| 519 void HTMLCanvasElement::notifySurfaceInvalid() |
| 520 { |
| 521 if (m_context && m_context->is2d()) { |
| 522 CanvasRenderingContext2D* context2d = toCanvasRenderingContext2D(m_conte
xt.get()); |
| 523 context2d->loseContext(); |
| 524 } |
500 } | 525 } |
501 | 526 |
502 void HTMLCanvasElement::updateExternallyAllocatedMemory() const | 527 void HTMLCanvasElement::updateExternallyAllocatedMemory() const |
503 { | 528 { |
504 int bufferCount = 0; | 529 int bufferCount = 0; |
505 if (m_imageBuffer) | 530 if (m_imageBuffer) |
506 bufferCount++; | 531 bufferCount++; |
507 if (is3D()) | 532 if (is3D()) |
508 bufferCount += 2; | 533 bufferCount += 2; |
509 if (m_copiedImage) | 534 if (m_copiedImage) |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 } | 606 } |
582 } | 607 } |
583 | 608 |
584 void HTMLCanvasElement::discardImageBuffer() | 609 void HTMLCanvasElement::discardImageBuffer() |
585 { | 610 { |
586 m_contextStateSaver.clear(); // uses context owned by m_imageBuffer | 611 m_contextStateSaver.clear(); // uses context owned by m_imageBuffer |
587 m_imageBuffer.clear(); | 612 m_imageBuffer.clear(); |
588 updateExternallyAllocatedMemory(); | 613 updateExternallyAllocatedMemory(); |
589 } | 614 } |
590 | 615 |
| 616 bool HTMLCanvasElement::hasValidImageBuffer() const |
| 617 { |
| 618 return m_imageBuffer && m_imageBuffer->isSurfaceValid(); |
| 619 } |
| 620 |
591 void HTMLCanvasElement::clearCopiedImage() | 621 void HTMLCanvasElement::clearCopiedImage() |
592 { | 622 { |
593 m_copiedImage.clear(); | 623 m_copiedImage.clear(); |
594 m_didClearImageBuffer = false; | 624 m_didClearImageBuffer = false; |
595 updateExternallyAllocatedMemory(); | 625 updateExternallyAllocatedMemory(); |
596 } | 626 } |
597 | 627 |
598 AffineTransform HTMLCanvasElement::baseTransform() const | 628 AffineTransform HTMLCanvasElement::baseTransform() const |
599 { | 629 { |
600 ASSERT(hasImageBuffer() && !m_didFailToCreateImageBuffer); | 630 ASSERT(hasImageBuffer() && !m_didFailToCreateImageBuffer); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
653 { | 683 { |
654 return !originClean(); | 684 return !originClean(); |
655 } | 685 } |
656 | 686 |
657 FloatSize HTMLCanvasElement::sourceSize() const | 687 FloatSize HTMLCanvasElement::sourceSize() const |
658 { | 688 { |
659 return FloatSize(width(), height()); | 689 return FloatSize(width(), height()); |
660 } | 690 } |
661 | 691 |
662 } | 692 } |
OLD | NEW |