void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) { ASSERT(!isMainThread()); bool success; if (m_mimeType == "image/jpeg") { success = JPEGImageEncoder::encodeWithPreInitializedState(m_jpegEncoderState.release(), m_data->data()); } else { success = ImageDataBuffer(m_size, m_data->data()).encodeImage(m_mimeType, quality, m_encodedImage.get()); } if (!success) { scheduleCreateNullptrAndCallOnMainThread(); return; } scheduleCreateBlobAndCallOnMainThread(); }
String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double* quality, bool isSaving) const { if (m_size.isEmpty() || !buffer()) return String("data:,"); String encodingMimeType = toEncodingMimeType(mimeType); // Try to get ImageData first, as that may avoid lossy conversions. RefPtr<ImageData> imageData = getImageData(); if (imageData) return ImageDataToDataURL(ImageDataBuffer(imageData->size(), imageData->data()), encodingMimeType, quality); if (m_context && m_context->is3d()) { toWebGLRenderingContext(m_context.get())->setSavingImage(isSaving); m_context->paintRenderingResultsToCanvas(); toWebGLRenderingContext(m_context.get())->setSavingImage(false); } return buffer()->toDataURL(encodingMimeType, quality); }