diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-09-14 16:20:48 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2016-09-18 08:28:48 +0000 |
commit | 248cdb2955f1e7d6ac30982b756d43d422905169 (patch) | |
tree | 639ac8315431461d3990f87bc2c3a75a46e4b229 /src/core/renderer | |
parent | 0310740f7bbd6f52086cd465c10e1f6b21fa828b (diff) |
Implement Pepper Flash font and glyph draw APIs
Pulls in the Chromium implementations of FlashFontFile and OnDrawGlyps.
To fix asserts and blank space on some flash text rendering.
Task-number: QTBUG-53042
Change-Id: Ie186ec3a0d7e0758d9e41c8d85af24c42275cca5
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'src/core/renderer')
-rw-r--r-- | src/core/renderer/pepper/pepper_flash_renderer_host_qt.cpp | 77 | ||||
-rw-r--r-- | src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp | 40 |
2 files changed, 114 insertions, 3 deletions
diff --git a/src/core/renderer/pepper/pepper_flash_renderer_host_qt.cpp b/src/core/renderer/pepper/pepper_flash_renderer_host_qt.cpp index 37ce4b5f3..a46454407 100644 --- a/src/core/renderer/pepper/pepper_flash_renderer_host_qt.cpp +++ b/src/core/renderer/pepper/pepper_flash_renderer_host_qt.cpp @@ -250,6 +250,83 @@ int32_t PepperFlashRendererHostQt::OnDrawGlyphs( params.glyph_indices.empty()) return PP_ERROR_FAILED; + int style = SkTypeface::kNormal; + if (static_cast<PP_BrowserFont_Trusted_Weight>(params.font_desc.weight) >= PP_BROWSERFONT_TRUSTED_WEIGHT_BOLD) + style |= SkTypeface::kBold; + if (params.font_desc.italic) + style |= SkTypeface::kItalic; + sk_sp<SkTypeface> typeface(SkTypeface::MakeFromName(params.font_desc.face.c_str(), SkFontStyle::FromOldStyle(style))); + if (!typeface) + return PP_ERROR_FAILED; + + EnterResourceNoLock<PPB_ImageData_API> enter(params.image_data.host_resource(), true); + if (enter.failed()) + return PP_ERROR_FAILED; + + PPB_ImageData_API* image = static_cast<PPB_ImageData_API*>(enter.object()); + SkCanvas* canvas = image->GetCanvas(); + bool needs_unmapping = false; + if (!canvas) { + needs_unmapping = true; + image->Map(); + canvas = image->GetCanvas(); + if (!canvas) + return PP_ERROR_FAILED; // Failure mapping. + } + + SkAutoCanvasRestore acr(canvas, true); + + // Clip is applied in pixels before the transform. + SkRect clip_rect = { + SkIntToScalar(params.clip.point.x), SkIntToScalar(params.clip.point.y), + SkIntToScalar(params.clip.point.x + params.clip.size.width), + SkIntToScalar(params.clip.point.y + params.clip.size.height)}; + canvas->clipRect(clip_rect); + + SkMatrix matrix; + matrix.set(SkMatrix::kMScaleX, SkFloatToScalar(params.transformation[0][0])); + matrix.set(SkMatrix::kMSkewX, SkFloatToScalar(params.transformation[0][1])); + matrix.set(SkMatrix::kMTransX, SkFloatToScalar(params.transformation[0][2])); + matrix.set(SkMatrix::kMSkewY, SkFloatToScalar(params.transformation[1][0])); + matrix.set(SkMatrix::kMScaleY, SkFloatToScalar(params.transformation[1][1])); + matrix.set(SkMatrix::kMTransY, SkFloatToScalar(params.transformation[1][2])); + matrix.set(SkMatrix::kMPersp0, SkFloatToScalar(params.transformation[2][0])); + matrix.set(SkMatrix::kMPersp1, SkFloatToScalar(params.transformation[2][1])); + matrix.set(SkMatrix::kMPersp2, SkFloatToScalar(params.transformation[2][2])); + canvas->concat(matrix); + + SkPaint paint; + paint.setColor(params.color); + paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + paint.setAntiAlias(true); + paint.setHinting(SkPaint::kFull_Hinting); + paint.setTextSize(SkIntToScalar(params.font_desc.size)); + paint.setTypeface(std::move(typeface)); + if (params.allow_subpixel_aa) { + paint.setSubpixelText(true); + paint.setLCDRenderText(true); + } + + SkScalar x = SkIntToScalar(params.position.x); + SkScalar y = SkIntToScalar(params.position.y); + + // Build up the skia advances. + size_t glyph_count = params.glyph_indices.size(); + if (glyph_count) { + std::vector<SkPoint> sk_positions(glyph_count); + for (uint32_t i = 0; i < glyph_count; i++) { + sk_positions[i].set(x, y); + x += SkFloatToScalar(params.glyph_advances[i].x); + y += SkFloatToScalar(params.glyph_advances[i].y); + } + + canvas->drawPosText( + ¶ms.glyph_indices[0], glyph_count * 2, &sk_positions[0], paint); + } + + if (needs_unmapping) + image->Unmap(); + return PP_OK; } diff --git a/src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp b/src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp index 89f691cef..febde84f7 100644 --- a/src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp +++ b/src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp @@ -46,6 +46,7 @@ #include "pepper_flash_renderer_host_qt.h" #include "base/memory/ptr_util.h" +#include "chrome/renderer/pepper/pepper_flash_font_file_host.h" #include "content/public/renderer/renderer_ppapi_host.h" #include "ppapi/host/ppapi_host.h" #include "ppapi/host/resource_host.h" @@ -76,10 +77,43 @@ std::unique_ptr<ppapi::host::ResourceHost> PepperRendererHostFactoryQt::CreateRe if (!host_->IsValidInstance(instance)) return nullptr; + if (host_->GetPpapiHost()->permissions().HasPermission(ppapi::PERMISSION_FLASH)) { + switch (message.type()) { + case PpapiHostMsg_Flash_Create::ID: + return base::WrapUnique(new PepperFlashRendererHostQt(host_, instance, resource)); + case PpapiHostMsg_FlashFullscreen_Create::ID: + case PpapiHostMsg_FlashMenu_Create::ID: + // Not implemented + break; + } + } + + // TODO(raymes): PDF also needs access to the FlashFontFileHost currently. + // We should either rename PPB_FlashFont_File to PPB_FontFile_Private or get + // rid of its use in PDF if possible. if (host_->GetPpapiHost()->permissions().HasPermission(ppapi::PERMISSION_FLASH) - && message.type() == PpapiHostMsg_Flash_Create::ID) - return base::WrapUnique( - new PepperFlashRendererHostQt(host_, instance, resource)); + || host_->GetPpapiHost()->permissions().HasPermission(ppapi::PERMISSION_PRIVATE)) { + switch (message.type()) { + case PpapiHostMsg_FlashFontFile_Create::ID: { + ppapi::proxy::SerializedFontDescription description; + PP_PrivateFontCharset charset; + if (ppapi::UnpackMessage<PpapiHostMsg_FlashFontFile_Create>(message, &description, &charset)) + return base::WrapUnique(new PepperFlashFontFileHost(host_, instance, resource, description, charset)); + break; + } + case PpapiHostMsg_FlashDRM_Create::ID: + // Not implemented + break; + } + } + + if (host_->GetPpapiHost()->permissions().HasPermission(ppapi::PERMISSION_PRIVATE)) { + switch (message.type()) { + case PpapiHostMsg_PDF_Create::ID: + // Not implemented + break; + } + } return nullptr; } |