BRect AGGTextRenderer::RenderString(const char* string, uint32 length, const BPoint* offsets, const BRect& clippingFrame, bool dryRun, BPoint* nextCharPos, FontCacheReference* cacheReference) { //printf("RenderString(\"%s\", length: %ld, dry: %d)\n", string, length, dryRun); Transformable transform(fEmbeddedTransformation); transform *= fViewTransformation; fCurves.approximation_scale(transform.scale()); // use a transformation behind the curves // (only if glyph->data_type == agg::glyph_data_outline) // in the pipeline for the rasterizer FontCacheEntry::TransformedOutline transformedOutline(fCurves, transform); FontCacheEntry::TransformedContourOutline transformedContourOutline(fContour, transform); // for when we bypass the transformation pipeline BPoint transformOffset(0.0, 0.0); transform.Transform(&transformOffset); IntRect clippingIntFrame(clippingFrame); StringRenderer renderer(clippingIntFrame, dryRun, gSubpixelAntialiasing && fAntialias, transformedOutline, transformedContourOutline, transform, transformOffset, nextCharPos, *this); GlyphLayoutEngine::LayoutGlyphs(renderer, fFont, string, length, NULL, fFont.Spacing(), offsets, cacheReference); return transform.TransformBounds(renderer.Bounds()); }
BRect AGGTextRenderer::RenderString(const char* string, uint32 length, const BPoint& baseLine, const BRect& clippingFrame, bool dryRun, BPoint* nextCharPos, const escapement_delta* delta, FontCacheReference* cacheReference) { //printf("RenderString(\"%s\", length: %ld, dry: %d)\n", string, length, dryRun); Transformable transform(fEmbeddedTransformation); transform.TranslateBy(baseLine); fCurves.approximation_scale(transform.scale()); // use a transformation behind the curves // (only if glyph->data_type == agg::glyph_data_outline) // in the pipeline for the rasterizer FontCacheEntry::TransformedOutline transformedOutline(fCurves, transform); FontCacheEntry::TransformedContourOutline transformedContourOutline(fContour, transform); // for when we bypass the transformation pipeline BPoint transformOffset(0.0, 0.0); transform.Transform(&transformOffset); StringRenderer renderer(clippingFrame, dryRun, transformedOutline, transformedContourOutline, transform, transformOffset, nextCharPos, *this); GlyphLayoutEngine::LayoutGlyphs(renderer, fFont, string, length, delta, fKerning, B_BITMAP_SPACING, NULL, cacheReference); return transform.TransformBounds(renderer.Bounds()); }
void PopupContainer::showPopup(FrameView* view) { m_frameView = view; m_listBox->m_focusedElement = m_frameView->frame().document()->focusedElement(); IntSize transformOffset(m_controlPosition.p4().x() - m_controlPosition.p1().x(), m_controlPosition.p4().y() - m_controlPosition.p1().y() - m_controlSize.height()); popupOpened(layoutAndCalculateWidgetRect(m_controlSize.height(), transformOffset, roundedIntPoint(m_controlPosition.p4()))); m_popupOpen = true; if (!m_listBox->parent()) m_listBox->setParent(this); m_listBox->scrollToRevealSelection(); invalidate(); }
static Layer* FindBackgroundLayer(ReadbackLayer* aLayer, nsIntPoint* aOffset) { gfx::Matrix transform; if (!aLayer->GetTransform().Is2D(&transform) || transform.HasNonIntegerTranslation()) return nullptr; nsIntPoint transformOffset(int32_t(transform._31), int32_t(transform._32)); for (Layer* l = aLayer->GetPrevSibling(); l; l = l->GetPrevSibling()) { gfx::Matrix backgroundTransform; if (!l->GetTransform().Is2D(&backgroundTransform) || gfx::ThebesMatrix(backgroundTransform).HasNonIntegerTranslation()) return nullptr; nsIntPoint backgroundOffset(int32_t(backgroundTransform._31), int32_t(backgroundTransform._32)); IntRect rectInBackground(transformOffset - backgroundOffset, aLayer->GetSize()); const nsIntRegion visibleRegion = l->GetEffectiveVisibleRegion().ToUnknownRegion(); if (!visibleRegion.Intersects(rectInBackground)) continue; // Since l is present in the background, from here on we either choose l // or nothing. if (!visibleRegion.Contains(rectInBackground)) return nullptr; if (l->GetEffectiveOpacity() != 1.0 || l->HasMaskLayers() || !(l->GetContentFlags() & Layer::CONTENT_OPAQUE)) { return nullptr; } // cliprects are post-transform const Maybe<ParentLayerIntRect>& clipRect = l->GetEffectiveClipRect(); if (clipRect && !clipRect->Contains(ViewAs<ParentLayerPixel>(IntRect(transformOffset, aLayer->GetSize())))) return nullptr; Layer::LayerType type = l->GetType(); if (type != Layer::TYPE_COLOR && type != Layer::TYPE_PAINTED) return nullptr; *aOffset = backgroundOffset - transformOffset; return l; } return nullptr; }
static Layer* FindBackgroundLayer(ReadbackLayer* aLayer, nsIntPoint* aOffset) { gfxMatrix transform; if (!aLayer->GetTransform().Is2D(&transform) || transform.HasNonIntegerTranslation()) return nullptr; nsIntPoint transformOffset(int32_t(transform.x0), int32_t(transform.y0)); for (Layer* l = aLayer->GetPrevSibling(); l; l = l->GetPrevSibling()) { gfxMatrix backgroundTransform; if (!l->GetTransform().Is2D(&backgroundTransform) || backgroundTransform.HasNonIntegerTranslation()) return nullptr; nsIntPoint backgroundOffset(int32_t(backgroundTransform.x0), int32_t(backgroundTransform.y0)); nsIntRect rectInBackground(transformOffset - backgroundOffset, aLayer->GetSize()); const nsIntRegion& visibleRegion = l->GetEffectiveVisibleRegion(); if (!visibleRegion.Intersects(rectInBackground)) continue; // Since l is present in the background, from here on we either choose l // or nothing. if (!visibleRegion.Contains(rectInBackground)) return nullptr; if (l->GetEffectiveOpacity() != 1.0 || !(l->GetContentFlags() & Layer::CONTENT_OPAQUE)) return nullptr; // cliprects are post-transform const nsIntRect* clipRect = l->GetEffectiveClipRect(); if (clipRect && !clipRect->Contains(nsIntRect(transformOffset, aLayer->GetSize()))) return nullptr; Layer::LayerType type = l->GetType(); if (type != Layer::TYPE_COLOR && type != Layer::TYPE_THEBES) return nullptr; *aOffset = backgroundOffset - transformOffset; return l; } return nullptr; }
void PopupContainer::showPopup(FrameView* view) { m_frameView = view; listBox()->m_focusedElement = m_frameView->frame().document()->focusedElement(); IntSize transformOffset(m_controlPosition.p4().x() - m_controlPosition.p1().x(), m_controlPosition.p4().y() - m_controlPosition.p1().y() - m_controlSize.height()); popupOpened(layoutAndCalculateWidgetRect(m_controlSize.height(), transformOffset, roundedIntPoint(m_controlPosition.p4()))); m_popupOpen = true; if (!m_listBox->parent()) addChild(m_listBox.get()); // Enable scrollbars after the listbox is inserted into the hierarchy, // so it has a proper WidgetClient. m_listBox->setVerticalScrollbarMode(ScrollbarAuto); m_listBox->scrollToRevealSelection(); invalidate(); }