| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) Research In Motion Limited 2010-2012. All rights reserved. | 2 * Copyright (C) Research In Motion Limited 2010-2012. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 unsigned position; | 458 unsigned position; |
| 459 FloatRect extent; | 459 FloatRect extent; |
| 460 }; | 460 }; |
| 461 | 461 |
| 462 static inline void calculateGlyphBoundaries(const QueryData* queryData, const SV
GTextFragment& fragment, int startPosition, FloatRect& extent) | 462 static inline void calculateGlyphBoundaries(const QueryData* queryData, const SV
GTextFragment& fragment, int startPosition, FloatRect& extent) |
| 463 { | 463 { |
| 464 float scalingFactor = queryData->textLineLayout.scalingFactor(); | 464 float scalingFactor = queryData->textLineLayout.scalingFactor(); |
| 465 ASSERT(scalingFactor); | 465 ASSERT(scalingFactor); |
| 466 | 466 |
| 467 FloatPoint glyphPosition = calculateGlyphPositionWithoutTransform(queryData,
fragment, startPosition); | 467 FloatPoint glyphPosition = calculateGlyphPositionWithoutTransform(queryData,
fragment, startPosition); |
| 468 glyphPosition.move(0, -queryData->textLineLayout.scaledFont().fontMetrics().
floatAscent() / scalingFactor); | 468 glyphPosition.move(0, -queryData->textLineLayout.scaledFont().getFontMetrics
().floatAscent() / scalingFactor); |
| 469 extent.setLocation(glyphPosition); | 469 extent.setLocation(glyphPosition); |
| 470 | 470 |
| 471 // Use the SVGTextMetrics computed by SVGTextMetricsBuilder (which spends | 471 // Use the SVGTextMetrics computed by SVGTextMetricsBuilder (which spends |
| 472 // time attempting to compute more correct glyph bounds already, handling | 472 // time attempting to compute more correct glyph bounds already, handling |
| 473 // cursive scripts to some degree.) | 473 // cursive scripts to some degree.) |
| 474 const Vector<SVGTextMetrics>& textMetricsValues = queryData->textLineLayout.
layoutAttributes()->textMetricsValues(); | 474 const Vector<SVGTextMetrics>& textMetricsValues = queryData->textLineLayout.
layoutAttributes()->textMetricsValues(); |
| 475 const SVGTextMetrics& metrics = findMetricsForCharacter(textMetricsValues, f
ragment, startPosition); | 475 const SVGTextMetrics& metrics = findMetricsForCharacter(textMetricsValues, f
ragment, startPosition); |
| 476 | 476 |
| 477 // TODO(fs): Negative glyph extents seems kind of weird to have, but | 477 // TODO(fs): Negative glyph extents seems kind of weird to have, but |
| 478 // presently it can occur in some cases (like Arabic.) | 478 // presently it can occur in some cases (like Arabic.) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 490 if (fragment.isTransformed()) { | 490 if (fragment.isTransformed()) { |
| 491 AffineTransform fragmentTransform = fragment.buildFragmentTransform(SVGT
extFragment::TransformIgnoringTextLength); | 491 AffineTransform fragmentTransform = fragment.buildFragmentTransform(SVGT
extFragment::TransformIgnoringTextLength); |
| 492 extent = fragmentTransform.mapRect(extent); | 492 extent = fragmentTransform.mapRect(extent); |
| 493 } | 493 } |
| 494 } | 494 } |
| 495 | 495 |
| 496 static inline FloatRect calculateFragmentBoundaries(LineLayoutSVGInlineText text
LineLayout, const SVGTextFragment& fragment) | 496 static inline FloatRect calculateFragmentBoundaries(LineLayoutSVGInlineText text
LineLayout, const SVGTextFragment& fragment) |
| 497 { | 497 { |
| 498 float scalingFactor = textLineLayout.scalingFactor(); | 498 float scalingFactor = textLineLayout.scalingFactor(); |
| 499 ASSERT(scalingFactor); | 499 ASSERT(scalingFactor); |
| 500 float baseline = textLineLayout.scaledFont().fontMetrics().floatAscent() / s
calingFactor; | 500 float baseline = textLineLayout.scaledFont().getFontMetrics().floatAscent()
/ scalingFactor; |
| 501 return fragment.boundingBox(baseline); | 501 return fragment.boundingBox(baseline); |
| 502 } | 502 } |
| 503 | 503 |
| 504 static bool extentOfCharacterCallback(QueryData* queryData, const SVGTextFragmen
t& fragment) | 504 static bool extentOfCharacterCallback(QueryData* queryData, const SVGTextFragmen
t& fragment) |
| 505 { | 505 { |
| 506 ExtentOfCharacterData* data = static_cast<ExtentOfCharacterData*>(queryData)
; | 506 ExtentOfCharacterData* data = static_cast<ExtentOfCharacterData*>(queryData)
; |
| 507 | 507 |
| 508 int startPosition = data->position; | 508 int startPosition = data->position; |
| 509 int endPosition = startPosition + 1; | 509 int endPosition = startPosition + 1; |
| 510 if (!mapStartEndPositionsIntoFragmentCoordinates(queryData, fragment, startP
osition, endPosition)) | 510 if (!mapStartEndPositionsIntoFragmentCoordinates(queryData, fragment, startP
osition, endPosition)) |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 } | 605 } |
| 606 | 606 |
| 607 int SVGTextQuery::characterNumberAtPosition(const FloatPoint& position) const | 607 int SVGTextQuery::characterNumberAtPosition(const FloatPoint& position) const |
| 608 { | 608 { |
| 609 CharacterNumberAtPositionData data(position); | 609 CharacterNumberAtPositionData data(position); |
| 610 spatialQuery(m_queryRootLayoutObject, &data, characterNumberAtPositionCallba
ck); | 610 spatialQuery(m_queryRootLayoutObject, &data, characterNumberAtPositionCallba
ck); |
| 611 return data.characterNumberWithin(m_queryRootLayoutObject); | 611 return data.characterNumberWithin(m_queryRootLayoutObject); |
| 612 } | 612 } |
| 613 | 613 |
| 614 } // namespace blink | 614 } // namespace blink |
| OLD | NEW |