| Index: ppapi/proxy/ppb_font_proxy.cc
|
| ===================================================================
|
| --- ppapi/proxy/ppb_font_proxy.cc (revision 84713)
|
| +++ ppapi/proxy/ppb_font_proxy.cc (working copy)
|
| @@ -4,203 +4,36 @@
|
|
|
| #include "ppapi/proxy/ppb_font_proxy.h"
|
|
|
| +#include "base/bind.h"
|
| #include "ppapi/c/dev/ppb_font_dev.h"
|
| #include "ppapi/proxy/plugin_dispatcher.h"
|
| -#include "ppapi/proxy/plugin_resource.h"
|
| #include "ppapi/proxy/ppapi_messages.h"
|
| +#include "ppapi/proxy/ppb_image_data_proxy.h"
|
| +#include "ppapi/shared_impl/resource_object_base.h"
|
| +#include "ppapi/thunk/ppb_image_data_api.h"
|
| +#include "ppapi/thunk/thunk.h"
|
|
|
| +using ppapi::thunk::PPB_ImageData_API;
|
| +using pp::shared_impl::WebKitForwarding;
|
| +
|
| namespace pp {
|
| namespace proxy {
|
|
|
| -class Font : public PluginResource {
|
| - public:
|
| - Font(const HostResource& resource);
|
| - virtual ~Font();
|
| -
|
| - // PluginResource overrides.
|
| - virtual Font* AsFont() { return this; }
|
| -
|
| - PP_FontDescription_Dev& desc() { return desc_; }
|
| - PP_FontDescription_Dev* desc_ptr() { return &desc_; }
|
| - PP_FontMetrics_Dev& metrics() { return metrics_; }
|
| -
|
| - private:
|
| - PP_FontDescription_Dev desc_;
|
| - PP_FontMetrics_Dev metrics_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Font);
|
| -};
|
| -
|
| -Font::Font(const HostResource& resource) : PluginResource(resource) {
|
| - memset(&desc_, 0, sizeof(PP_FontDescription_Dev));
|
| - desc_.face.type = PP_VARTYPE_UNDEFINED;
|
| - memset(&metrics_, 0, sizeof(PP_FontMetrics_Dev));
|
| -}
|
| -
|
| -Font::~Font() {
|
| - PluginVarTracker::GetInstance()->Release(desc_.face);
|
| -}
|
| -
|
| namespace {
|
|
|
| -PP_Resource Create(PP_Instance instance,
|
| - const PP_FontDescription_Dev* description) {
|
| - PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
|
| - if (!dispatcher)
|
| - return 0;
|
| +bool PPTextRunToTextRun(const PP_TextRun_Dev* run,
|
| + WebKitForwarding::Font::TextRun* output) {
|
| + const std::string* str = PluginVarTracker::GetInstance()->GetExistingString(
|
| + run->text);
|
| + if (!str)
|
| + return false;
|
|
|
| - SerializedFontDescription in_description;
|
| - in_description.SetFromPPFontDescription(dispatcher, *description, true);
|
| -
|
| - HostResource result;
|
| - SerializedFontDescription out_description;
|
| - std::string out_metrics;
|
| - dispatcher->Send(new PpapiHostMsg_PPBFont_Create(
|
| - INTERFACE_ID_PPB_FONT,
|
| - instance, in_description, &result, &out_description, &out_metrics));
|
| -
|
| - if (result.is_null())
|
| - return 0; // Failure creating font.
|
| -
|
| - linked_ptr<Font> object(new Font(result));
|
| - out_description.SetToPPFontDescription(dispatcher, object->desc_ptr(), true);
|
| -
|
| - // Convert the metrics, this is just serialized as a string of bytes.
|
| - if (out_metrics.size() != sizeof(PP_FontMetrics_Dev))
|
| - return 0;
|
| - memcpy(&object->metrics(), out_metrics.data(), sizeof(PP_FontMetrics_Dev));
|
| -
|
| - return PluginResourceTracker::GetInstance()->AddResource(object);
|
| + output->text = *str;
|
| + output->rtl = PPBoolToBool(run->rtl);
|
| + output->override_direction = PPBoolToBool(run->override_direction);
|
| + return true;
|
| }
|
|
|
| -PP_Bool IsFont(PP_Resource resource) {
|
| - Font* object = PluginResource::GetAs<Font>(resource);
|
| - return BoolToPPBool(!!object);
|
| -}
|
| -
|
| -PP_Bool Describe(PP_Resource font_id,
|
| - PP_FontDescription_Dev* description,
|
| - PP_FontMetrics_Dev* metrics) {
|
| - Font* object = PluginResource::GetAs<Font>(font_id);
|
| - if (!object)
|
| - return PP_FALSE;
|
| -
|
| - // Copy the description, the caller expects its face PP_Var to have a ref
|
| - // added to it on its behalf.
|
| - memcpy(description, &object->desc(), sizeof(PP_FontDescription_Dev));
|
| - PluginVarTracker::GetInstance()->AddRef(description->face);
|
| -
|
| - memcpy(metrics, &object->metrics(), sizeof(PP_FontMetrics_Dev));
|
| - return PP_TRUE;
|
| -}
|
| -
|
| -PP_Bool DrawTextAt(PP_Resource font_id,
|
| - PP_Resource image_data,
|
| - const PP_TextRun_Dev* text,
|
| - const PP_Point* position,
|
| - uint32_t color,
|
| - const PP_Rect* clip,
|
| - PP_Bool image_data_is_opaque) {
|
| - Font* font_object = PluginResource::GetAs<Font>(font_id);
|
| - if (!font_object)
|
| - return PP_FALSE;
|
| - PluginResource* image_object = PluginResourceTracker::GetInstance()->
|
| - GetResourceObject(image_data);
|
| - if (!image_object)
|
| - return PP_FALSE;
|
| - if (font_object->instance() != image_object->instance())
|
| - return PP_FALSE;
|
| -
|
| - PPBFont_DrawTextAt_Params params;
|
| - params.font = font_object->host_resource();
|
| - params.image_data = image_object->host_resource();
|
| - params.text_is_rtl = text->rtl;
|
| - params.override_direction = text->override_direction;
|
| - params.position = *position;
|
| - params.color = color;
|
| - if (clip) {
|
| - params.clip = *clip;
|
| - params.clip_is_null = false;
|
| - } else {
|
| - params.clip = PP_MakeRectFromXYWH(0, 0, 0, 0);
|
| - params.clip_is_null = true;
|
| - }
|
| - params.image_data_is_opaque = image_data_is_opaque;
|
| -
|
| - Dispatcher* dispatcher = PluginDispatcher::GetForInstance(
|
| - image_object->instance());
|
| - PP_Bool result = PP_FALSE;
|
| - if (dispatcher) {
|
| - dispatcher->Send(new PpapiHostMsg_PPBFont_DrawTextAt(
|
| - INTERFACE_ID_PPB_FONT,
|
| - SerializedVarSendInput(dispatcher, text->text),
|
| - params, &result));
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -int32_t MeasureText(PP_Resource font_id, const PP_TextRun_Dev* text) {
|
| - Font* object = PluginResource::GetAs<Font>(font_id);
|
| - if (!object)
|
| - return -1;
|
| -
|
| - Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
|
| - int32_t result = 0;
|
| - if (dispatcher) {
|
| - dispatcher->Send(new PpapiHostMsg_PPBFont_MeasureText(
|
| - INTERFACE_ID_PPB_FONT, object->host_resource(),
|
| - SerializedVarSendInput(dispatcher, text->text),
|
| - text->rtl, text->override_direction, &result));
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -uint32_t CharacterOffsetForPixel(PP_Resource font_id,
|
| - const PP_TextRun_Dev* text,
|
| - int32_t pixel_position) {
|
| - Font* object = PluginResource::GetAs<Font>(font_id);
|
| - if (!object)
|
| - return -1;
|
| -
|
| - Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
|
| - uint32_t result = 0;
|
| - if (dispatcher) {
|
| - dispatcher->Send(new PpapiHostMsg_PPBFont_CharacterOffsetForPixel(
|
| - INTERFACE_ID_PPB_FONT, object->host_resource(),
|
| - SerializedVarSendInput(dispatcher, text->text),
|
| - text->rtl, text->override_direction, pixel_position, &result));
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -int32_t PixelOffsetForCharacter(PP_Resource font_id,
|
| - const PP_TextRun_Dev* text,
|
| - uint32_t char_offset) {
|
| - Font* object = PluginResource::GetAs<Font>(font_id);
|
| - if (!object)
|
| - return -1;
|
| -
|
| - Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
|
| - int32_t result = 0;
|
| - if (dispatcher) {
|
| - dispatcher->Send(new PpapiHostMsg_PPBFont_PixelOffsetForCharacter(
|
| - INTERFACE_ID_PPB_FONT, object->host_resource(),
|
| - SerializedVarSendInput(dispatcher, text->text),
|
| - text->rtl, text->override_direction, char_offset, &result));
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -const PPB_Font_Dev font_interface = {
|
| - &Create,
|
| - &IsFont,
|
| - &Describe,
|
| - &DrawTextAt,
|
| - &MeasureText,
|
| - &CharacterOffsetForPixel,
|
| - &PixelOffsetForCharacter
|
| -};
|
| -
|
| InterfaceProxy* CreateFontProxy(Dispatcher* dispatcher,
|
| const void* target_interface) {
|
| return new PPB_Font_Proxy(dispatcher, target_interface);
|
| @@ -219,7 +52,7 @@
|
| // static
|
| const InterfaceProxy::Info* PPB_Font_Proxy::GetInfo() {
|
| static const Info info = {
|
| - &font_interface,
|
| + ::ppapi::thunk::GetPPB_Font_Thunk(),
|
| PPB_FONT_DEV_INTERFACE,
|
| INTERFACE_ID_PPB_FONT,
|
| false,
|
| @@ -229,113 +62,141 @@
|
| }
|
|
|
| bool PPB_Font_Proxy::OnMessageReceived(const IPC::Message& msg) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(PPB_Font_Proxy, msg)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFont_Create,
|
| - OnMsgCreate)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFont_DrawTextAt,
|
| - OnMsgDrawTextAt)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFont_MeasureText,
|
| - OnMsgMeasureText)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFont_CharacterOffsetForPixel,
|
| - OnMsgCharacterOffsetForPixel)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFont_PixelOffsetForCharacter,
|
| - OnMsgPixelOffsetForCharacter)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| - return handled;
|
| + // There aren't any font messages.
|
| + NOTREACHED();
|
| + return false;
|
| }
|
|
|
| -void PPB_Font_Proxy::OnMsgCreate(
|
| - PP_Instance instance,
|
| - const SerializedFontDescription& in_description,
|
| - HostResource* result,
|
| - SerializedFontDescription* out_description,
|
| - std::string* out_metrics) {
|
| - // Convert the face name in the input description.
|
| - PP_FontDescription_Dev in_pp_desc;
|
| - in_description.SetToPPFontDescription(dispatcher(), &in_pp_desc, false);
|
| +Font::Font(const HostResource& resource,
|
| + const PP_FontDescription_Dev& desc)
|
| + : PluginResource(resource),
|
| + webkit_event_(false, false) {
|
| + const std::string* face = PluginVarTracker::GetInstance()->GetExistingString(
|
| + desc.face);
|
|
|
| - // Make sure the output is always defined so we can still serialize it back
|
| - // to the plugin below.
|
| - PP_FontDescription_Dev out_pp_desc;
|
| - memset(&out_pp_desc, 0, sizeof(PP_FontDescription_Dev));
|
| - out_pp_desc.face = PP_MakeUndefined();
|
| + WebKitForwarding* forwarding = GetDispatcher()->GetWebKitForwarding();
|
|
|
| - result->SetHostResource(instance,
|
| - ppb_font_target()->Create(instance, &in_pp_desc));
|
| - if (!result->is_null()) {
|
| - // Get the metrics and resulting description to return to the browser.
|
| - PP_FontMetrics_Dev metrics;
|
| - if (ppb_font_target()->Describe(result->host_resource(), &out_pp_desc,
|
| - &metrics)) {
|
| - out_metrics->assign(reinterpret_cast<const char*>(&metrics),
|
| - sizeof(PP_FontMetrics_Dev));
|
| - }
|
| - }
|
| + WebKitForwarding::Font* result = NULL;
|
| + RunOnWebKitThread(base::Bind(&WebKitForwarding::CreateFontForwarding,
|
| + base::Unretained(forwarding),
|
| + &webkit_event_, desc,
|
| + face ? *face : std::string(), &result));
|
| + font_forwarding_.reset(result);
|
| +}
|
|
|
| - // This must always get called or it will assert when trying to serialize
|
| - // the un-filled-in SerializedFontDescription as the return value.
|
| - out_description->SetFromPPFontDescription(dispatcher(), out_pp_desc, false);
|
| +Font::~Font() {
|
| }
|
|
|
| -void PPB_Font_Proxy::OnMsgDrawTextAt(SerializedVarReceiveInput text,
|
| - const PPBFont_DrawTextAt_Params& params,
|
| - PP_Bool* result) {
|
| - PP_TextRun_Dev run;
|
| - run.text = text.Get(dispatcher());
|
| - run.rtl = params.text_is_rtl;
|
| - run.override_direction = params.override_direction;
|
| +ppapi::thunk::PPB_Font_API* Font::AsFont_API() {
|
| + return this;
|
| +}
|
|
|
| - *result = ppb_font_target()->DrawTextAt(params.font.host_resource(),
|
| - params.image_data.host_resource(), &run, ¶ms.position, params.color,
|
| - params.clip_is_null ? NULL : ¶ms.clip, params.image_data_is_opaque);
|
| +Font* Font::AsFont() {
|
| + return this;
|
| }
|
|
|
| -void PPB_Font_Proxy::OnMsgMeasureText(HostResource font,
|
| - SerializedVarReceiveInput text,
|
| - PP_Bool text_is_rtl,
|
| - PP_Bool override_direction,
|
| - int32_t* result) {
|
| - PP_TextRun_Dev run;
|
| - run.text = text.Get(dispatcher());
|
| - run.rtl = text_is_rtl;
|
| - run.override_direction = override_direction;
|
| +PP_Bool Font::Describe(PP_FontDescription_Dev* description,
|
| + PP_FontMetrics_Dev* metrics) {
|
| + std::string face;
|
| + PP_Bool result = PP_FALSE;
|
| + RunOnWebKitThread(base::Bind(&WebKitForwarding::Font::Describe,
|
| + base::Unretained(font_forwarding_.get()),
|
| + &webkit_event_, description, &face, metrics,
|
| + &result));
|
|
|
| - *result = ppb_font_target()->MeasureText(font.host_resource(), &run);
|
| + if (result == PP_TRUE) {
|
| + description->face.type = PP_VARTYPE_STRING;
|
| + description->face.value.as_id =
|
| + PluginVarTracker::GetInstance()->MakeString(face);
|
| + } else {
|
| + description->face.type = PP_VARTYPE_UNDEFINED;
|
| + }
|
| + return result;
|
| }
|
|
|
| -void PPB_Font_Proxy::OnMsgCharacterOffsetForPixel(
|
| - HostResource font,
|
| - SerializedVarReceiveInput text,
|
| - PP_Bool text_is_rtl,
|
| - PP_Bool override_direction,
|
| - int32_t pixel_pos,
|
| - uint32_t* result) {
|
| - PP_TextRun_Dev run;
|
| - run.text = text.Get(dispatcher());
|
| - run.rtl = text_is_rtl;
|
| - run.override_direction = override_direction;
|
| +PP_Bool Font::DrawTextAt(PP_Resource pp_image_data,
|
| + const PP_TextRun_Dev* text,
|
| + const PP_Point* position,
|
| + uint32_t color,
|
| + const PP_Rect* clip,
|
| + PP_Bool image_data_is_opaque) {
|
| + // Convert to an ImageData object.
|
| + ppapi::shared_impl::ResourceObjectBase* image_base =
|
| + ppapi::shared_impl::TrackerBase::Get()->GetResourceAPI(pp_image_data);
|
| + if (!image_base)
|
| + return PP_FALSE;
|
| + PPB_ImageData_API* image_api = image_base->GetAs<PPB_ImageData_API>();
|
| + if (!image_api)
|
| + return PP_FALSE;
|
| + ImageData* image_data = static_cast<ImageData*>(image_api);
|
|
|
| - *result = ppb_font_target()->CharacterOffsetForPixel(font.host_resource(),
|
| - &run, pixel_pos);
|
| + skia::PlatformCanvas* canvas = image_data->mapped_canvas();
|
| + bool needs_unmapping = false;
|
| + if (!canvas) {
|
| + needs_unmapping = true;
|
| + image_data->Map();
|
| + canvas = image_data->mapped_canvas();
|
| + if (!canvas)
|
| + return PP_FALSE; // Failure mapping.
|
| + }
|
| +
|
| + WebKitForwarding::Font::TextRun run;
|
| + if (!PPTextRunToTextRun(text, &run)) {
|
| + if (needs_unmapping)
|
| + image_data->Unmap();
|
| + return PP_FALSE;
|
| + }
|
| + RunOnWebKitThread(base::Bind(
|
| + &WebKitForwarding::Font::DrawTextAt,
|
| + base::Unretained(font_forwarding_.get()),
|
| + &webkit_event_,
|
| + WebKitForwarding::Font::DrawTextParams(canvas, run, position, color,
|
| + clip, image_data_is_opaque)));
|
| +
|
| + if (needs_unmapping)
|
| + image_data->Unmap();
|
| + return PP_TRUE;
|
| }
|
|
|
| -void PPB_Font_Proxy::OnMsgPixelOffsetForCharacter(
|
| - HostResource font,
|
| - SerializedVarReceiveInput text,
|
| - PP_Bool text_is_rtl,
|
| - PP_Bool override_direction,
|
| - uint32_t char_offset,
|
| - int32_t* result) {
|
| - PP_TextRun_Dev run;
|
| - run.text = text.Get(dispatcher());
|
| - run.rtl = text_is_rtl;
|
| - run.override_direction = override_direction;
|
| +int32_t Font::MeasureText(const PP_TextRun_Dev* text) {
|
| + WebKitForwarding::Font::TextRun run;
|
| + if (!PPTextRunToTextRun(text, &run))
|
| + return -1;
|
| + int32_t result = -1;
|
| + RunOnWebKitThread(base::Bind(&WebKitForwarding::Font::MeasureText,
|
| + base::Unretained(font_forwarding_.get()),
|
| + &webkit_event_, run, &result));
|
| + return result;
|
| +}
|
|
|
| - *result = ppb_font_target()->PixelOffsetForCharacter(font.host_resource(),
|
| - &run, char_offset);
|
| +uint32_t Font::CharacterOffsetForPixel(const PP_TextRun_Dev* text,
|
| + int32_t pixel_position) {
|
| + WebKitForwarding::Font::TextRun run;
|
| + if (!PPTextRunToTextRun(text, &run))
|
| + return -1;
|
| + uint32_t result = -1;
|
| + RunOnWebKitThread(base::Bind(&WebKitForwarding::Font::CharacterOffsetForPixel,
|
| + base::Unretained(font_forwarding_.get()),
|
| + &webkit_event_, run, pixel_position, &result));
|
| + return result;
|
| }
|
|
|
| +int32_t Font::PixelOffsetForCharacter(const PP_TextRun_Dev* text,
|
| + uint32_t char_offset) {
|
| + WebKitForwarding::Font::TextRun run;
|
| + if (!PPTextRunToTextRun(text, &run))
|
| + return -1;
|
| + int32_t result = -1;
|
| + RunOnWebKitThread(base::Bind(&WebKitForwarding::Font::PixelOffsetForCharacter,
|
| + base::Unretained(font_forwarding_.get()),
|
| + &webkit_event_, run, char_offset, &result));
|
| + return result;
|
| +}
|
| +
|
| +void Font::RunOnWebKitThread(const base::Closure& task) {
|
| + GetDispatcher()->PostToWebKitThread(FROM_HERE, task);
|
| + webkit_event_.Wait();
|
| +}
|
| +
|
| } // namespace proxy
|
| } // namespace pp
|
|
|