diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-10 21:17:48 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-10 21:17:48 +0000 |
commit | 7a1f7c6f6c982287b3f6bb2acded619f3824416c (patch) | |
tree | 82ff404c4bcf84520c21ea7f0526ad5a40661641 /webkit/plugins/ppapi/webkit_forwarding_impl.cc | |
parent | bafaee12825a06890f114a282880e135a8b0b1ae (diff) | |
download | chromium_src-7a1f7c6f6c982287b3f6bb2acded619f3824416c.zip chromium_src-7a1f7c6f6c982287b3f6bb2acded619f3824416c.tar.gz chromium_src-7a1f7c6f6c982287b3f6bb2acded619f3824416c.tar.bz2 |
Make the Pepper proxy support in-process font rendering.
This implements a WebKit thread in the PPAPI plugin process so we can do the
font calls without IPC. The existing font support was refactored into
a virtual class (to prevent PPAPI from depending on WebKit and creating a
circular GYP dependency).
This moves the renderer sandbox support into content/common so that it can
be used by the PPAPI process.
Review URL: http://codereview.chromium.org/6981001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84856 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/plugins/ppapi/webkit_forwarding_impl.cc')
-rw-r--r-- | webkit/plugins/ppapi/webkit_forwarding_impl.cc | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/webkit/plugins/ppapi/webkit_forwarding_impl.cc b/webkit/plugins/ppapi/webkit_forwarding_impl.cc new file mode 100644 index 0000000..8c79e77 --- /dev/null +++ b/webkit/plugins/ppapi/webkit_forwarding_impl.cc @@ -0,0 +1,242 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "webkit/plugins/ppapi/webkit_forwarding_impl.h" + +#include "base/scoped_ptr.h" +#include "base/synchronization/waitable_event.h" +#include "base/utf_string_conversions.h" +#include "ppapi/c/dev/ppb_font_dev.h" +#include "ppapi/c/pp_point.h" +#include "ppapi/c/pp_rect.h" +#include "skia/ext/platform_canvas.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebCanvas.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebFont.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebFontDescription.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebFloatPoint.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebFloatRect.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebTextRun.h" +#include "webkit/glue/webkit_glue.h" + +using pp::shared_impl::WebKitForwarding; +using WebKit::WebCanvas; +using WebKit::WebFloatPoint; +using WebKit::WebFloatRect; +using WebKit::WebFont; +using WebKit::WebFontDescription; +using WebKit::WebRect; +using WebKit::WebTextRun; + +namespace webkit { +namespace ppapi { + +namespace { + +// The PP_* version lacks "None", so is just one value shifted from the +// WebFontDescription version. These values are checked in +// PPFontDescToWebFontDesc to make sure the conversion is correct. This is a +// macro so it can also be used in the COMPILE_ASSERTS. +#define PP_FONTFAMILY_TO_WEB_FONTFAMILY(f) \ + static_cast<WebFontDescription::GenericFamily>(f + 1) + +// Assumes the given PP_FontDescription has been validated. +WebFontDescription PPFontDescToWebFontDesc(const PP_FontDescription_Dev& font, + const std::string& face) { + // Verify that the enums match so we can just static cast. + COMPILE_ASSERT(static_cast<int>(WebFontDescription::Weight100) == + static_cast<int>(PP_FONTWEIGHT_100), + FontWeight100); + COMPILE_ASSERT(static_cast<int>(WebFontDescription::Weight900) == + static_cast<int>(PP_FONTWEIGHT_900), + FontWeight900); + COMPILE_ASSERT(WebFontDescription::GenericFamilyStandard == + PP_FONTFAMILY_TO_WEB_FONTFAMILY(PP_FONTFAMILY_DEFAULT), + StandardFamily); + COMPILE_ASSERT(WebFontDescription::GenericFamilySerif == + PP_FONTFAMILY_TO_WEB_FONTFAMILY(PP_FONTFAMILY_SERIF), + SerifFamily); + COMPILE_ASSERT(WebFontDescription::GenericFamilySansSerif == + PP_FONTFAMILY_TO_WEB_FONTFAMILY(PP_FONTFAMILY_SANSSERIF), + SansSerifFamily); + COMPILE_ASSERT(WebFontDescription::GenericFamilyMonospace == + PP_FONTFAMILY_TO_WEB_FONTFAMILY(PP_FONTFAMILY_MONOSPACE), + MonospaceFamily); + + WebFontDescription result; + result.family = UTF8ToUTF16(face); + result.genericFamily = PP_FONTFAMILY_TO_WEB_FONTFAMILY(font.family); + result.size = static_cast<float>(font.size); + result.italic = font.italic != PP_FALSE; + result.smallCaps = font.small_caps != PP_FALSE; + result.weight = static_cast<WebFontDescription::Weight>(font.weight); + result.letterSpacing = static_cast<short>(font.letter_spacing); + result.wordSpacing = static_cast<short>(font.word_spacing); + return result; +} + +WebTextRun TextRunToWebTextRun(const WebKitForwarding::Font::TextRun& run) { + return WebTextRun(UTF8ToUTF16(run.text), + run.rtl != PP_FALSE, + run.override_direction != PP_FALSE); +} + +// FontImpl -------------------------------------------------------------------- + +class FontImpl : public WebKitForwarding::Font { + public: + FontImpl(const PP_FontDescription_Dev& desc, + const std::string& desc_face); + virtual ~FontImpl(); + + virtual void Describe(base::WaitableEvent* event, + PP_FontDescription_Dev* description, + std::string* face, + PP_FontMetrics_Dev* metrics, + PP_Bool* result) OVERRIDE; + virtual void DrawTextAt(base::WaitableEvent* event, + const DrawTextParams& params) OVERRIDE; + virtual void MeasureText(base::WaitableEvent* event, + const TextRun& text, + int32_t* result) OVERRIDE; + virtual void CharacterOffsetForPixel(base::WaitableEvent* event, + const TextRun& text, + int32_t pixel_position, + uint32_t* result) OVERRIDE; + virtual void PixelOffsetForCharacter(base::WaitableEvent* event, + const TextRun& text, + uint32_t char_offset, + int32_t* result) OVERRIDE; + + private: + scoped_ptr<WebFont> font_; + + DISALLOW_COPY_AND_ASSIGN(FontImpl); +}; + +FontImpl::FontImpl(const PP_FontDescription_Dev& desc, + const std::string& desc_face) { + WebFontDescription web_font_desc = PPFontDescToWebFontDesc(desc, desc_face); + font_.reset(WebFont::create(web_font_desc)); +} + +FontImpl::~FontImpl() { +} + +void FontImpl::Describe(base::WaitableEvent* event, + PP_FontDescription_Dev* description, + std::string* face, + PP_FontMetrics_Dev* metrics, + PP_Bool* result) { + if (description->face.type != PP_VARTYPE_UNDEFINED) { + *result = PP_FALSE; + } else { + WebFontDescription web_desc = font_->fontDescription(); + + // While converting the other way in PPFontDescToWebFontDesc we validated + // that the enums can be casted. + description->face = PP_MakeUndefined(); + description->family = + static_cast<PP_FontFamily_Dev>(web_desc.genericFamily); + description->size = static_cast<uint32_t>(web_desc.size); + description->weight = static_cast<PP_FontWeight_Dev>(web_desc.weight); + description->italic = web_desc.italic ? PP_TRUE : PP_FALSE; + description->small_caps = web_desc.smallCaps ? PP_TRUE : PP_FALSE; + + *face = UTF16ToUTF8(web_desc.family); + + metrics->height = font_->height(); + metrics->ascent = font_->ascent(); + metrics->descent = font_->descent(); + metrics->line_spacing = font_->lineSpacing(); + metrics->x_height = static_cast<int32_t>(font_->xHeight()); + + *result = PP_TRUE; + } + if (event) + event->Signal(); +} + +void FontImpl::DrawTextAt(base::WaitableEvent* event, + const DrawTextParams& params) { + WebTextRun run = TextRunToWebTextRun(params.text); + + // Convert position and clip. + WebFloatPoint web_position(static_cast<float>(params.position->x), + static_cast<float>(params.position->y)); + WebRect web_clip; + if (!params.clip) { + // Use entire canvas. SkCanvas doesn't have a size on it, so we just use + // the current clip bounds. + SkRect skclip; + params.destination->getClipBounds(&skclip); + web_clip = WebRect(skclip.fLeft, skclip.fTop, skclip.fRight - skclip.fLeft, + skclip.fBottom - skclip.fTop); + } else { + web_clip = WebRect(params.clip->point.x, params.clip->point.y, + params.clip->size.width, params.clip->size.height); + } + + font_->drawText(webkit_glue::ToWebCanvas(params.destination), run, + web_position, params.color, web_clip, + params.image_data_is_opaque == PP_TRUE); + if (event) + event->Signal(); +} + +void FontImpl::MeasureText(base::WaitableEvent* event, + const TextRun& text, int32_t* result) { + *result = font_->calculateWidth(TextRunToWebTextRun(text)); + if (event) + event->Signal(); +} + +void FontImpl::CharacterOffsetForPixel(base::WaitableEvent* event, + const TextRun& text, + int32_t pixel_position, + uint32_t* result) { + *result = static_cast<uint32_t>(font_->offsetForPosition( + TextRunToWebTextRun(text), static_cast<float>(pixel_position))); + if (event) + event->Signal(); +} + +void FontImpl::PixelOffsetForCharacter(base::WaitableEvent* event, + const TextRun& text, + uint32_t char_offset, + int32_t* result) { + WebTextRun run = TextRunToWebTextRun(text); + if (char_offset >= run.text.length()) { + *result = -1; + } else { + WebFloatRect rect = font_->selectionRectForText( + run, WebFloatPoint(0.0f, 0.0f), font_->height(), 0, char_offset); + *result = static_cast<int>(rect.width); + } + if (event) + event->Signal(); +} + +} // namespace + +// WebKitForwardingImpl -------------------------------------------------------- + +WebKitForwardingImpl::WebKitForwardingImpl() { +} + +WebKitForwardingImpl::~WebKitForwardingImpl() { +} + +void WebKitForwardingImpl::CreateFontForwarding( + base::WaitableEvent* event, + const PP_FontDescription_Dev& desc, + const std::string& desc_face, + Font** result) { + *result = new FontImpl(desc, desc_face); + if (event) + event->Signal(); +} + +} // namespace ppapi +} // namespace webkit |